@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
|
@@ -3,11 +3,12 @@ import { linkSync, statSync, unlinkSync } from 'node:fs'
|
|
|
3
3
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
4
4
|
import { process_owner_schema } from '#scripts/josh/process-owner'
|
|
5
5
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
6
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
6
7
|
import { z } from 'zod'
|
|
7
8
|
import { openai_lane_supervisor_decision } from './openai-lane-supervisor-decision'
|
|
8
9
|
|
|
9
10
|
// The supervisor's owner and state stamps — who holds a lane, and which child it last launched —
|
|
10
|
-
// split out of `openai-lane-supervisor.ts` when it reached its line limit
|
|
11
|
+
// split out of `openai-lane-supervisor.ts` when it reached its line limit.
|
|
11
12
|
// `openai_lane_supervisor` re-exports each public one under the name it always had, so the move
|
|
12
13
|
// changed no call site and no suite that spies on `openai_lane_supervisor`.
|
|
13
14
|
|
|
@@ -41,14 +42,7 @@ function state_path(lane_directory: string): string {
|
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
function parsed_stamp<T>(target: string, schema: z.ZodType<T>): T | undefined {
|
|
44
|
-
|
|
45
|
-
const value: unknown = JSON.parse(stamp_file.read_stamp_text(target) ?? '')
|
|
46
|
-
const parsed = schema.safeParse(value)
|
|
47
|
-
|
|
48
|
-
return parsed.success ? parsed.data : undefined
|
|
49
|
-
} catch {
|
|
50
|
-
return undefined
|
|
51
|
-
}
|
|
45
|
+
return json_value.parse_with(stamp_file.read_stamp_text(target) ?? '', schema)
|
|
52
46
|
}
|
|
53
47
|
|
|
54
48
|
function read(lane_directory: string): SupervisorOwner | undefined {
|
|
@@ -7,6 +7,7 @@ import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
|
7
7
|
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
8
8
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
9
9
|
import { error_text } from '#scripts/lib/error-message'
|
|
10
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
10
11
|
import { detached_launch } from '#scripts/run/detached-launch'
|
|
11
12
|
import { run_ship_review } from '#scripts/run/ship/run-ship-review'
|
|
12
13
|
import { z } from 'zod'
|
|
@@ -60,10 +61,7 @@ function response_path(directory: string, issue: string): string | undefined {
|
|
|
60
61
|
|
|
61
62
|
function read_record<T>(target: string, schema: z.ZodType<T>): T | undefined {
|
|
62
63
|
try {
|
|
63
|
-
|
|
64
|
-
const parsed = schema.safeParse(content)
|
|
65
|
-
|
|
66
|
-
return parsed.success ? parsed.data : undefined
|
|
64
|
+
return json_value.parse_with(readFileSync(target, 'utf8'), schema)
|
|
67
65
|
} catch {
|
|
68
66
|
return undefined
|
|
69
67
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from 'node:path'
|
|
2
2
|
|
|
3
|
-
// One parent-directory walk, in one place
|
|
3
|
+
// One parent-directory walk, in one place. Five modules had each written
|
|
4
4
|
// their own — the josh package-root lookup, the gate's project root, the effective-upstream version
|
|
5
5
|
// read, the local-bin shim search and the progress-interval read — and they had drifted to three
|
|
6
6
|
// different stop conditions. The walk stops at the filesystem root (where `dirname` answers itself)
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// and `epic-bundle-referenced.ts` each read one issue per reference and must not turn a rate limit
|
|
6
6
|
// into a wrong answer. The reads were written as waves — slice, `Promise.all`, next slice — which
|
|
7
7
|
// idles the whole batch behind its slowest member, so the three were neither the same code nor the
|
|
8
|
-
// same behavior
|
|
8
|
+
// same behavior.
|
|
9
9
|
//
|
|
10
10
|
// A worker pool instead: `limit` consumers pull from one queue, so a slot is refilled the moment its
|
|
11
11
|
// task ends rather than when its neighbors do.
|
|
@@ -32,7 +32,7 @@ interface Pool<Item, Result> {
|
|
|
32
32
|
// so the clamp passes it straight through and `Array.from({ length: NaN })` builds no consumer at all
|
|
33
33
|
// — an empty result for a non-empty input, which is precisely what the paragraph above promises
|
|
34
34
|
// cannot happen. A caller reading that promise is entitled not to validate first, so it is closed
|
|
35
|
-
// here
|
|
35
|
+
// here. A fractional limit is floored for the same reason: `Array.from`
|
|
36
36
|
// truncates it silently, and a width that is not the number asked for should be a decision rather
|
|
37
37
|
// than a side effect.
|
|
38
38
|
function pool_width(limit: number, total: number): number {
|
|
@@ -7,8 +7,7 @@ import { SUITE_TIMEOUT_MS } from './timeouts'
|
|
|
7
7
|
// need the same three things: the output buffered until the child finishes (concurrent writers
|
|
8
8
|
// otherwise interleave into an unreadable transcript), a non-zero exit reported rather than thrown
|
|
9
9
|
// (so one failing check does not abort its siblings), and a bound on how long a child may hang.
|
|
10
|
-
// They had the same code twice, which is how a fix to one of them missed the other
|
|
11
|
-
// (joshuafolkken/kit#914).
|
|
10
|
+
// They had the same code twice, which is how a fix to one of them missed the other.
|
|
12
11
|
|
|
13
12
|
const PNPM = 'pnpm'
|
|
14
13
|
const FORCE_COLOR = '1'
|
|
@@ -21,13 +20,12 @@ interface BufferedProcessResult {
|
|
|
21
20
|
exit_code: number | undefined
|
|
22
21
|
// How long the child ran, in milliseconds. Measured here rather than at each call site because
|
|
23
22
|
// this function owns the child's lifetime — a caller timing it from outside would have to repeat
|
|
24
|
-
// the same two readings, and every fan-out caller would repeat them once per branch
|
|
25
|
-
// (joshuafolkken/kit#1248).
|
|
23
|
+
// the same two readings, and every fan-out caller would repeat them once per branch.
|
|
26
24
|
elapsed_ms: number
|
|
27
25
|
}
|
|
28
26
|
|
|
29
|
-
// The two things a caller outside the fan-out needs to vary, and the only two
|
|
30
|
-
//
|
|
27
|
+
// The two things a caller outside the fan-out needs to vary, and the only two.
|
|
28
|
+
// `lane:open` runs its install in the work tree it just created rather
|
|
31
29
|
// than in the directory `josh` was typed in, and bounds it well under the fan-out's half hour
|
|
32
30
|
// because an install that never answers has to end the command rather than hold a parallel run
|
|
33
31
|
// open. Everything else — the buffering, the non-throwing exit, and the color policy that respects
|
|
File without changes
|
package/scripts/lib/cli-flags.ts
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
import { parseArgs, type ParseArgsConfig, type ParseArgsOptionsConfig } from 'node:util'
|
|
2
2
|
|
|
3
3
|
// Argument reading for the commands under `scripts/`.
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
const HELP_FLAGS: ReadonlySet<string> = new Set(['--help', '-h'])
|
|
6
|
+
|
|
7
|
+
// The usage line `refuse_unknown_flags` ends with, for a command that prints it on its own help
|
|
8
|
+
// request (`josh release --help`).
|
|
9
|
+
function usage_line(known_flags: ReadonlyArray<string>, command: string): string {
|
|
10
|
+
if (known_flags.length === 0) return `Usage: josh ${command}`
|
|
11
|
+
|
|
12
|
+
return `Usage: josh ${command} [${known_flags.join('] [')}]`
|
|
13
|
+
}
|
|
14
|
+
|
|
5
15
|
// Reject anything not on the list rather than ignoring it: a misspelled `--dryrun` that fell through
|
|
6
|
-
// would run the real write path. `josh propagate` and `josh
|
|
16
|
+
// would run the real write path. `josh propagate`, `josh adopt` and `josh release` all write, so
|
|
7
17
|
// the refusal is single-sourced here rather than described once per command (`CLAUDE.md` → "No
|
|
8
18
|
// clones").
|
|
9
19
|
function refuse_unknown_flags(
|
|
@@ -13,15 +23,36 @@ function refuse_unknown_flags(
|
|
|
13
23
|
): string | undefined {
|
|
14
24
|
const unknown = argv.filter((argument) => !known_flags.includes(argument))
|
|
15
25
|
if (unknown.length === 0) return undefined
|
|
16
|
-
const usage = `Usage: josh ${command} [${known_flags.join('] [')}]`
|
|
17
26
|
|
|
18
|
-
return `Unknown argument(s): ${unknown.join(' ')}\n${
|
|
27
|
+
return `Unknown argument(s): ${unknown.join(' ')}\n${usage_line(known_flags, command)}`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The argument gate of a command that publishes (`josh release`, `josh release:github`): a help
|
|
31
|
+
// request prints the usage and exits 0, an unknown argument is refused with exit 1, both before any side effect. `undefined` means the
|
|
32
|
+
// arguments are all known and the command may run.
|
|
33
|
+
function answer_help_or_unknown(
|
|
34
|
+
argv: ReadonlyArray<string>,
|
|
35
|
+
known_flags: ReadonlyArray<string>,
|
|
36
|
+
command: string,
|
|
37
|
+
): number | undefined {
|
|
38
|
+
if (argv.some((argument) => HELP_FLAGS.has(argument))) {
|
|
39
|
+
console.info(usage_line(known_flags, command))
|
|
40
|
+
|
|
41
|
+
return 0
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const refusal = refuse_unknown_flags(argv, known_flags, command)
|
|
45
|
+
if (refusal === undefined) return undefined
|
|
46
|
+
|
|
47
|
+
console.error(refusal)
|
|
48
|
+
|
|
49
|
+
return 1
|
|
19
50
|
}
|
|
20
51
|
|
|
21
52
|
// `parseArgs`, answering `undefined` where it would throw — an unknown flag, a missing option value,
|
|
22
53
|
// or a positional the config does not allow. Each caller turns that into its usage line and a failure
|
|
23
54
|
// exit rather than a stack trace, on commands whose output a workflow reads; eleven of them had begun
|
|
24
|
-
// to carry a copy of the same try/catch each
|
|
55
|
+
// to carry a copy of the same try/catch each, and this is the one copy.
|
|
25
56
|
function parse_or_undefined<T extends ParseArgsConfig>(
|
|
26
57
|
config: T,
|
|
27
58
|
): ReturnType<typeof parseArgs<T>> | undefined {
|
|
@@ -34,7 +65,7 @@ function parse_or_undefined<T extends ParseArgsConfig>(
|
|
|
34
65
|
|
|
35
66
|
// The two shapes every command reads `argv` in: flags alone, or flags beside positionals. Both are
|
|
36
67
|
// strict, so an unknown flag is `undefined` rather than a silently ignored typo; the commands had each
|
|
37
|
-
// carried a one-line wrapper spelling these out
|
|
68
|
+
// carried a one-line wrapper spelling these out.
|
|
38
69
|
type FlagsOnly<T extends ParseArgsOptionsConfig> = ReturnType<
|
|
39
70
|
typeof parseArgs<{ args: Array<string>; options: T }>
|
|
40
71
|
>
|
|
@@ -123,7 +154,9 @@ function attach_values(
|
|
|
123
154
|
|
|
124
155
|
const cli_flags = {
|
|
125
156
|
attach_values,
|
|
157
|
+
usage_line,
|
|
126
158
|
refuse_unknown_flags,
|
|
159
|
+
answer_help_or_unknown,
|
|
127
160
|
parse_or_undefined,
|
|
128
161
|
values_of,
|
|
129
162
|
arguments_of,
|
|
@@ -7,7 +7,7 @@ function message_of(error: unknown): string {
|
|
|
7
7
|
const DEBUG_ENV_KEY = 'JOSH_DEBUG'
|
|
8
8
|
|
|
9
9
|
// A catch that folds a failure into a state verdict — "dirty", "not merged", "not written" — leaves no
|
|
10
|
-
// trace of why by default, so a wrong verdict cannot be followed back to its cause
|
|
10
|
+
// trace of why by default, so a wrong verdict cannot be followed back to its cause.
|
|
11
11
|
// `JOSH_DEBUG` set to any non-blank value writes the swallowed reason to stderr; unset, nothing changes.
|
|
12
12
|
function trace_swallowed(where: string, error: unknown): void {
|
|
13
13
|
if ((process.env[DEBUG_ENV_KEY] ?? '').trim() === '') return
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import type { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
// Reading JSON that may not be JSON.
|
|
2
4
|
//
|
|
3
5
|
// Readers under `scripts/` parse text that a defect, a truncated write or an older format can make
|
|
4
6
|
// unparseable — a transcript line, a settings file, an MCP declaration, a lock record, CLI output —
|
|
5
7
|
// and every one of them answers "could not read this" rather than throwing, because a single bad line
|
|
6
8
|
// must not fail a whole report. They had begun to carry a copy of the same try/catch each; this is the
|
|
7
|
-
// one copy, and `is_record` beside it is the one object test
|
|
9
|
+
// one copy, and `is_record` beside it is the one object test.
|
|
8
10
|
|
|
9
11
|
function parse_or_undefined(text: string): unknown {
|
|
10
12
|
try {
|
|
@@ -14,12 +16,24 @@ function parse_or_undefined(text: string): unknown {
|
|
|
14
16
|
}
|
|
15
17
|
}
|
|
16
18
|
|
|
19
|
+
// The same read with a shape asked of it: text that is not JSON and JSON the schema rejects both
|
|
20
|
+
// answer `undefined`, which is what a best-effort reader of a record, a payload or CLI output wants.
|
|
21
|
+
// A reader that must tell the two apart, or keep a shape change visible, is `parse-json-array.ts`.
|
|
22
|
+
function parse_with<T>(text: string, schema: z.ZodType<T>): T | undefined {
|
|
23
|
+
const value = parse_or_undefined(text)
|
|
24
|
+
if (value === undefined) return undefined
|
|
25
|
+
|
|
26
|
+
const parsed = schema.safeParse(value)
|
|
27
|
+
|
|
28
|
+
return parsed.success ? parsed.data : undefined
|
|
29
|
+
}
|
|
30
|
+
|
|
17
31
|
// A plain object, as opposed to an array or a primitive. `typeof null` is `'object'`, and an array
|
|
18
32
|
// answers `'object'` too, so both have to be excluded by hand before a key lookup means anything.
|
|
19
33
|
function is_record(value: unknown): value is Record<string, unknown> {
|
|
20
34
|
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
21
35
|
}
|
|
22
36
|
|
|
23
|
-
const json_value = { parse_or_undefined, is_record }
|
|
37
|
+
const json_value = { parse_or_undefined, parse_with, is_record }
|
|
24
38
|
|
|
25
39
|
export { json_value }
|
package/scripts/lib/poll.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
//
|
|
3
3
|
// **Three modules had already written the same three-line `sleep`** — `gh/git-pr-checks.ts`,
|
|
4
4
|
// `eval/eval-run.ts` and `propagate/propagate-publish.ts` — and the release command's tag watch
|
|
5
|
-
//
|
|
5
|
+
// would have been the fourth. `CLAUDE.md` → "No clones — single-source"
|
|
6
6
|
// reads an existing duplication as the signal to single-source it rather than as a license to add to
|
|
7
7
|
// it, so the definition moved here and those three import it.
|
|
8
8
|
//
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// The icons josh prints in front of a result line
|
|
1
|
+
// The icons josh prints in front of a result line.
|
|
2
2
|
//
|
|
3
3
|
// They were one character each, declared beside whichever command printed them — the verification
|
|
4
4
|
// gate, the health check, the propagation run — and that was harmless while nothing ever *read*
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
// the health check use `✔`, and unifying those would change what a command prints in order to tidy a
|
|
12
12
|
// constant — a decision about output, not about single-sourcing.
|
|
13
13
|
//
|
|
14
|
-
// **The success icon is read too
|
|
14
|
+
// **The success icon is read too.** `josh-verdict.ts` reads the gate's
|
|
15
15
|
// `✔ verification gate passed` line to tell a green gate from the third-party warning bodies it
|
|
16
|
-
// forwards, so the pass icon is
|
|
16
|
+
// forwards, so the pass icon is under the same rule as the failure icon: declared
|
|
17
17
|
// once, imported by the printer and the reader alike.
|
|
18
18
|
|
|
19
19
|
const FAIL_ICON = '✗'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FETCH_TIMEOUT_MS } from './timeouts'
|
|
2
2
|
|
|
3
|
-
// **The one place in `scripts/` that calls the global `fetch
|
|
3
|
+
// **The one place in `scripts/` that calls the global `fetch`**. Every request
|
|
4
4
|
// carries a time limit, so a stalled connection rejects instead of holding an unattended run forever;
|
|
5
5
|
// `timed-fetch-usage.test.ts` refuses a direct `fetch` call anywhere else. The signal also bounds the
|
|
6
6
|
// body read, because the response stream aborts with it.
|
package/scripts/lib/timeouts.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Shared time limits for the calls that leave the process — a network request or a spawned command.
|
|
2
2
|
// An unattended run (a lane, `followup`, a backlog drain) that waits on a request or a command with no
|
|
3
|
-
// limit stays stuck where it stopped and never comes back
|
|
3
|
+
// limit stays stuck where it stopped and never comes back, so every such
|
|
4
4
|
// call takes one of these, and a value used in more than one place is named once here.
|
|
5
5
|
|
|
6
6
|
// A probe that only asks the local machine (`ps`, `lsof`, `git config`) on a path something else is
|
|
@@ -9,7 +9,7 @@ import { resident_budget } from '#scripts/document/resident-budget'
|
|
|
9
9
|
// The package root, resolved from this file rather than the caller's working directory.
|
|
10
10
|
const REPO_ROOT = fileURLToPath(new URL('../../', import.meta.url))
|
|
11
11
|
|
|
12
|
-
// `josh bytes` — the byte counterpart of `josh lines
|
|
12
|
+
// `josh bytes` — the byte counterpart of `josh lines`. A mandated
|
|
13
13
|
// documentation update that grows an agent-read document past its byte ceiling is invisible until
|
|
14
14
|
// `pnpm josh gate` reports it 80–90 seconds in, and the raise that follows is rework. This answers
|
|
15
15
|
// the same question before that: how many bytes each budgeted document already has, its ceiling, and
|
|
@@ -81,8 +81,7 @@ function remaining_phrase(remaining: number): string {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
// The resident document is held by a fixed limit rather than a block ratchet, and loosening it is
|
|
84
|
-
// Tier C, so its row names the headroom or the overage but never a value to raise it to
|
|
85
|
-
// (joshuafolkken/kit#3171).
|
|
84
|
+
// Tier C, so its row names the headroom or the overage but never a value to raise it to.
|
|
86
85
|
function resident_row(status: DocumentStatus): string {
|
|
87
86
|
const counts = `${status.current.toString()}/${status.recorded.toString()} bytes`
|
|
88
87
|
|
|
@@ -147,7 +146,7 @@ function entry_status_of(entry: string, recorded: number): EntryStatus {
|
|
|
147
146
|
|
|
148
147
|
// The primary budget, one row per entry: the total each workflow entry reads against its recorded
|
|
149
148
|
// ceiling and the headroom left — printed on every scan, so the main budget is no longer a number the
|
|
150
|
-
// gate reveals only when it fails
|
|
149
|
+
// gate reveals only when it fails.
|
|
151
150
|
function entry_row(status: EntryStatus): string {
|
|
152
151
|
const counts = `${status.current.toString()}/${status.recorded.toString()} bytes`
|
|
153
152
|
|
|
@@ -3,21 +3,18 @@ import path from 'node:path'
|
|
|
3
3
|
import { pathToFileURL } from 'node:url'
|
|
4
4
|
import { z } from 'zod'
|
|
5
5
|
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// `create_base_config`, the report and the gate described different limits — and the report was the one
|
|
10
|
-
// that was wrong, while `line-budget.ts` opens by declaring that agreeing with the gate is the whole of
|
|
11
|
-
// its purpose.
|
|
6
|
+
// Resolves the `max-lines` entry the project's own eslint applies, so `pnpm josh lines` explains its
|
|
7
|
+
// count against the limit the gate enforces — in a consumer whose `eslint.config.js` overrides the
|
|
8
|
+
// rule after `create_base_config`, kit's own entry would describe a different limit.
|
|
12
9
|
//
|
|
13
|
-
// **The limit is
|
|
10
|
+
// **The limit is asked of the configuration the gate actually applies, per file.** A flat
|
|
14
11
|
// config block can key an override on a `files` pattern, so "the project's limit" is not one number: a
|
|
15
12
|
// consumer that raises `max-lines` for generated code and leaves it alone elsewhere enforces two, and a
|
|
16
13
|
// report that picked either would be wrong about the other set.
|
|
17
14
|
//
|
|
18
15
|
// **The counting options travel with it, and that is not a widening of the subject.** `skipBlankLines`
|
|
19
16
|
// and `skipComments` decide what a code line *is*, and taking them from kit while taking the count from
|
|
20
|
-
// the consumer's eslint
|
|
17
|
+
// the consumer's eslint would mismatch the two the same way. Both come from the same
|
|
21
18
|
// resolved entry, so there is one source rather than two that can disagree.
|
|
22
19
|
//
|
|
23
20
|
// **This is the resolution `eslint --print-config` performs, not a second linter.** `line-budget.ts`
|
|
@@ -43,7 +40,11 @@ interface ConfigResolver {
|
|
|
43
40
|
calculateConfigForFile: (file_path: string) => Promise<unknown>
|
|
44
41
|
}
|
|
45
42
|
|
|
46
|
-
|
|
43
|
+
// eslint's own camelCase name for the option, kept apart from the object that spells it.
|
|
44
|
+
const CONFIG_FILE_OPTION = 'overrideConfigFile'
|
|
45
|
+
|
|
46
|
+
type ResolverOptions = { cwd: string } & Partial<Record<typeof CONFIG_FILE_OPTION, string>>
|
|
47
|
+
type ResolverConstructor = new (options: ResolverOptions) => ConfigResolver
|
|
47
48
|
|
|
48
49
|
// The module is imported from a path computed at runtime, so its shape is checked rather than assumed:
|
|
49
50
|
// a build that no longer exports `ESLint` must answer "no limit" instead of throwing past the caller.
|
|
@@ -100,13 +101,19 @@ function options_in(config: unknown): LineRuleOptions | undefined {
|
|
|
100
101
|
// the consumer's own eslint. Every failure — no eslint there, a build without the export, a config that
|
|
101
102
|
// throws while loading — is the same answer, and it is "no limit" rather than kit's number: falling
|
|
102
103
|
// back to kit's is precisely the defect this file exists to remove, and it would be silent.
|
|
103
|
-
async function resolver_for(
|
|
104
|
+
async function resolver_for(
|
|
105
|
+
project_root: string,
|
|
106
|
+
config_file: string | undefined,
|
|
107
|
+
): Promise<ConfigResolver | undefined> {
|
|
104
108
|
try {
|
|
105
109
|
const require_from = createRequire(path.join(project_root, PACKAGE_JSON))
|
|
106
110
|
const loaded: unknown = await import(pathToFileURL(require_from.resolve(ESLINT_MODULE)).href)
|
|
107
111
|
const eslint_module = module_schema.parse(loaded)
|
|
108
112
|
|
|
109
|
-
return new eslint_module.ESLint({
|
|
113
|
+
return new eslint_module.ESLint({
|
|
114
|
+
cwd: project_root,
|
|
115
|
+
...(config_file !== undefined && { [CONFIG_FILE_OPTION]: config_file }),
|
|
116
|
+
})
|
|
110
117
|
} catch {
|
|
111
118
|
return undefined
|
|
112
119
|
}
|
|
@@ -128,12 +135,18 @@ async function entry_for(
|
|
|
128
135
|
// One resolver for the whole call: the configuration is loaded and cached once, and every path after
|
|
129
136
|
// the first is a lookup rather than a load. That is what makes a per-file limit affordable at all.
|
|
130
137
|
// Keyed by the absolute path, so the caller's spelling of a path does not have to match.
|
|
138
|
+
//
|
|
139
|
+
// `config_file` names the configuration to ask instead of the one `project_root` holds, with
|
|
140
|
+
// `project_root` still the directory its `files` patterns are matched from — what `josh metrics` needs
|
|
141
|
+
// to hold another commit's tree to this checkout's limits (`metrics-code-lines.ts`).
|
|
131
142
|
async function options_for(
|
|
132
143
|
file_paths: ReadonlyArray<string>,
|
|
133
144
|
project_root: string,
|
|
145
|
+
config_file?: string,
|
|
134
146
|
): Promise<ReadonlyMap<string, LineRuleOptions>> {
|
|
135
147
|
const found = new Map<string, LineRuleOptions>()
|
|
136
|
-
const resolver =
|
|
148
|
+
const resolver =
|
|
149
|
+
file_paths.length === 0 ? undefined : await resolver_for(project_root, config_file)
|
|
137
150
|
|
|
138
151
|
if (resolver === undefined) return found
|
|
139
152
|
|
|
@@ -3,17 +3,14 @@ import { statSync } from 'node:fs'
|
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { find_local_bin_upwards } from '#scripts/build/local-bin'
|
|
5
5
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
6
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
6
7
|
import { LINT_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
7
8
|
import { execa } from 'execa'
|
|
8
9
|
import { z } from 'zod'
|
|
9
10
|
import { effective_limit, type LineRuleOptions } from './effective-limit'
|
|
10
11
|
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// 543 seconds — went on reacting to `max-lines` once the implementation was already finished:
|
|
14
|
-
// `pnpm josh gate` five times and `pnpm josh lint` four, of which 115 seconds was tool execution and
|
|
15
|
-
// the remaining 353 was model time in between. The splitting itself was correct work; what was wrong
|
|
16
|
-
// is that it was decided after the fact rather than at design time.
|
|
12
|
+
// Reports each file's line headroom before the writing starts, so a split is decided at design time
|
|
13
|
+
// rather than after the gate reports `max-lines`.
|
|
17
14
|
//
|
|
18
15
|
// **The limit is not changed here, and nothing in this file counts lines its own way.** That is the
|
|
19
16
|
// trap a headroom report walks into: a second counting method becomes a way to satisfy the limit by
|
|
@@ -22,21 +19,16 @@ import { effective_limit, type LineRuleOptions } from './effective-limit'
|
|
|
22
19
|
// invocation `pnpm josh lint` reaches, with `max-lines` lowered to 0 so the rule reports
|
|
23
20
|
// unconditionally and its message carries the count it would have compared against the real limit.
|
|
24
21
|
//
|
|
25
|
-
// **
|
|
26
|
-
// `new ESLint().lintFiles(...)` both answer **one line lower than the
|
|
27
|
-
//
|
|
28
|
-
// CLI against `300` from either API for the same file. Every `scripts/*.ts` entry point has a
|
|
29
|
-
// hashbang, so an in-process count would have been quietly wrong for most of this package while the
|
|
30
|
-
// gate went on failing at a number the report never showed. Spawning costs a process; agreeing with
|
|
22
|
+
// **The count comes from the `eslint` CLI, not the in-process API.** `new Linter().verify(...)` and
|
|
23
|
+
// `new ESLint().lintFiles(...)` both answer **one line lower than the CLI on any file that starts with
|
|
24
|
+
// `#!`**, and every `scripts/*.ts` entry point has a hashbang. Spawning costs a process; agreeing with
|
|
31
25
|
// the gate is the whole point of the report.
|
|
32
26
|
//
|
|
33
|
-
// **
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
// can be resolved there is no budget, and the count is reported without one: falling back to kit's
|
|
39
|
-
// number would restore the defect and do it silently.
|
|
27
|
+
// **The limit and the counting options come from the same place the count does.**
|
|
28
|
+
// `effective-limit.ts` resolves the `max-lines` entry the project's own eslint applies **to each
|
|
29
|
+
// file**, so a consumer that overrides `max-lines` after `create_base_config` is held to its own rule.
|
|
30
|
+
// Where no entry can be resolved there is no budget, and the count is reported without one: falling
|
|
31
|
+
// back to kit's number would report a limit the project does not enforce.
|
|
40
32
|
|
|
41
33
|
const MAX_LINES_RULE = 'max-lines'
|
|
42
34
|
// The rule reports when the count is **greater than** `max`, and 0 is the lowest value its own schema
|
|
@@ -60,13 +52,9 @@ const NO_CODE_LINES = 0
|
|
|
60
52
|
const COUNT_PATTERN = /\((\d+)\)/u
|
|
61
53
|
const COUNT_GROUP = 1
|
|
62
54
|
|
|
63
|
-
// **Why 85
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
// "at the limit" into a warning while there is still room to write the fix. Matching the resident
|
|
67
|
-
// reserve's fraction instead (2,000 of 60,000 bytes, 3.3%) would leave 10 lines of margin, less than
|
|
68
|
-
// one function is allowed to be, which is a warning arriving with nowhere left to go. 45 lines is a
|
|
69
|
-
// little under two functions at the 25-line function limit — enough to write the split into.
|
|
55
|
+
// **Why 85%.** The margin turns "at the limit" into a warning while there is still room to write the
|
|
56
|
+
// fix: 45 lines of a 300-line limit is a little under two functions at the 25-line function limit —
|
|
57
|
+
// enough to write the split into.
|
|
70
58
|
const NEAR_LIMIT_FRACTION = 0.85
|
|
71
59
|
const PERCENT = 100
|
|
72
60
|
|
|
@@ -81,15 +69,14 @@ const PNPM_EXEC = 'exec'
|
|
|
81
69
|
const FORMAT_FLAGS: ReadonlyArray<string> = ['--format', 'json', '--no-inline-config']
|
|
82
70
|
const RULE_FLAG = '--rule'
|
|
83
71
|
// **No `--cache`, and a `--cache-location` all the same.** An eslint run started *without* `--cache`
|
|
84
|
-
// deletes whatever `--cache-location` names, which
|
|
85
|
-
// (joshuafolkken/kit#1332) — so the flag has to be here, pointed somewhere harmless, even though this
|
|
72
|
+
// deletes whatever `--cache-location` names, which would wipe the gate's cache — so the flag has to be here, pointed somewhere harmless, even though this
|
|
86
73
|
// probe keeps no cache. It keeps none because the only key available is the checkout, and two
|
|
87
74
|
// `josh lines` calls at once in one repository — routine with parallel agents here — would then be two
|
|
88
|
-
// unsynchronized writers of one file. A cold run is a couple of seconds
|
|
89
|
-
//
|
|
75
|
+
// unsynchronized writers of one file. A cold run is a couple of seconds, so the cache is not worth a
|
|
76
|
+
// shared-state hazard.
|
|
90
77
|
//
|
|
91
|
-
// **The path is per probe, not per call
|
|
92
|
-
//
|
|
78
|
+
// **The path is per probe, not per call.** Since the counting method decides how many probes one call
|
|
79
|
+
// starts, two of them can run concurrently — and each deletes whatever
|
|
93
80
|
// `--cache-location` names as it starts, so one shared path would have them racing to unlink the file
|
|
94
81
|
// the other just made. The option set's own key is folded into the name, which makes the paths
|
|
95
82
|
// distinct exactly when the probes are.
|
|
@@ -100,9 +87,14 @@ const CACHE_KEY_LENGTH = 8
|
|
|
100
87
|
// Only the two fields this reads. `ruleId` is nullable on a parse error or an ignore warning, and
|
|
101
88
|
// both of those are answers — "no count for this path" — rather than failures.
|
|
102
89
|
const message_schema = z.object({ ruleId: z.string().nullish(), message: z.string() })
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
90
|
+
const result_schema = z.object({ filePath: z.string(), messages: z.array(message_schema) })
|
|
91
|
+
const results_schema = z.array(result_schema)
|
|
92
|
+
|
|
93
|
+
type LintResult = z.infer<typeof result_schema>
|
|
94
|
+
|
|
95
|
+
// The rule entry the probe hands eslint — as `--rule` JSON to the CLI, as `overrideConfig` rules to
|
|
96
|
+
// the Node API.
|
|
97
|
+
type ProbeRules = Record<string, [typeof PROBE_SEVERITY, LineRuleOptions & { max: number }]>
|
|
106
98
|
|
|
107
99
|
interface LineBudget {
|
|
108
100
|
code_lines: number
|
|
@@ -113,7 +105,7 @@ interface LineBudget {
|
|
|
113
105
|
|
|
114
106
|
// `limit` is carried beside the budget, and it is not the same thing as `budget.limit`: a path this
|
|
115
107
|
// project enforces no `max-lines` on has no limit at all, and the caller has to be able to say that
|
|
116
|
-
// rather than say the count failed
|
|
108
|
+
// rather than say the count failed.
|
|
117
109
|
interface FileBudget {
|
|
118
110
|
file_path: string
|
|
119
111
|
limit: number | undefined
|
|
@@ -150,10 +142,12 @@ function budget_of(code_lines: number, limit: number): LineBudget {
|
|
|
150
142
|
|
|
151
143
|
// The counting options are the project's own, so a consumer that turns `skipComments` off is counted
|
|
152
144
|
// its way. Lowering `max` is the only change the probe makes.
|
|
145
|
+
function probe_rules(options: LineRuleOptions): ProbeRules {
|
|
146
|
+
return { [MAX_LINES_RULE]: [PROBE_SEVERITY, { ...options, max: PROBE_MAX }] }
|
|
147
|
+
}
|
|
148
|
+
|
|
153
149
|
function probe_rule(options: LineRuleOptions): string {
|
|
154
|
-
return JSON.stringify(
|
|
155
|
-
[MAX_LINES_RULE]: [PROBE_SEVERITY, { ...options, max: PROBE_MAX }],
|
|
156
|
-
})
|
|
150
|
+
return JSON.stringify(probe_rules(options))
|
|
157
151
|
}
|
|
158
152
|
|
|
159
153
|
function cache_prefix(key: string): string {
|
|
@@ -176,8 +170,7 @@ function probe_arguments(group: ProbeGroup, project_root: string): Array<string>
|
|
|
176
170
|
// The project's own eslint, through its own shim when there is one and `pnpm exec` when there is not
|
|
177
171
|
// — the same two routes every other command in this package reaches a local binary by. The lookup
|
|
178
172
|
// **walks up** from the given directory, because pnpm does: resolving only the directory the command
|
|
179
|
-
// was invoked in would disagree with the very binary it spawns
|
|
180
|
-
// reason `local-bin.ts` ships this variant.
|
|
173
|
+
// was invoked in would disagree with the very binary it spawns.
|
|
181
174
|
function probe_command(project_root: string, probe_args: ReadonlyArray<string>): Array<string> {
|
|
182
175
|
const shim = find_local_bin_upwards(project_root, ESLINT_BIN)
|
|
183
176
|
|
|
@@ -237,13 +230,12 @@ function count_or_zero(
|
|
|
237
230
|
|
|
238
231
|
// Keyed by the absolute path eslint reports, so the caller's spelling of a path does not have to
|
|
239
232
|
// match it. A path eslint refused is simply absent, and the caller reports that rather than a number.
|
|
240
|
-
|
|
233
|
+
// The results are eslint's own objects whether they arrived as the CLI's JSON or from the Node API,
|
|
234
|
+
// so `josh metrics` reads its in-process run through this same reading.
|
|
235
|
+
function counts_from(results: ReadonlyArray<LintResult>): ReadonlyMap<string, number> {
|
|
241
236
|
const counts = new Map<string, number>()
|
|
242
|
-
const parsed = results_schema.safeParse(JSON.parse(raw_output))
|
|
243
237
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
for (const result of parsed.data) {
|
|
238
|
+
for (const result of results) {
|
|
247
239
|
const code_lines = count_or_zero(result.messages)
|
|
248
240
|
|
|
249
241
|
if (code_lines !== undefined) counts.set(path.resolve(result.filePath), code_lines)
|
|
@@ -252,14 +244,11 @@ function counts_in(raw_output: string | undefined = 'null'): ReadonlyMap<string,
|
|
|
252
244
|
return counts
|
|
253
245
|
}
|
|
254
246
|
|
|
255
|
-
//
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
} catch {
|
|
261
|
-
return new Map<string, number>()
|
|
262
|
-
}
|
|
247
|
+
// eslint's output can be empty or truncated, and neither is JSON — both read as no counts at all.
|
|
248
|
+
function parse_counts(raw_output: string | undefined = 'null'): ReadonlyMap<string, number> {
|
|
249
|
+
const results = json_value.parse_with(raw_output, results_schema)
|
|
250
|
+
|
|
251
|
+
return results === undefined ? new Map<string, number>() : counts_from(results)
|
|
263
252
|
}
|
|
264
253
|
|
|
265
254
|
// **Only regular files are passed to eslint, and this is not tidiness.** One argument eslint cannot
|
|
@@ -284,7 +273,7 @@ function lintable_paths(file_paths: ReadonlyArray<string>): ReadonlyArray<string
|
|
|
284
273
|
// One eslint run per *distinct counting method*, rather than one per path. The cost of this report is
|
|
285
274
|
// a process start, so the number of paths is the one thing that must not multiply it — and the number
|
|
286
275
|
// of distinct `max-lines` option sets in one project is one, in every configuration that does not
|
|
287
|
-
// deliberately count two groups of files differently
|
|
276
|
+
// deliberately count two groups of files differently.
|
|
288
277
|
// The keys are sorted before they are written out, so two config blocks that state the same options in
|
|
289
278
|
// a different order are one group rather than two. Unsorted, a purely cosmetic difference would split
|
|
290
279
|
// the probe in two and cost a second eslint process for nothing.
|
|
@@ -387,7 +376,9 @@ const line_budget = {
|
|
|
387
376
|
advice,
|
|
388
377
|
budget_of,
|
|
389
378
|
budgets_for,
|
|
379
|
+
counts_from,
|
|
390
380
|
describe,
|
|
381
|
+
grouped,
|
|
391
382
|
is_lintable_path,
|
|
392
383
|
near_limit_percent,
|
|
393
384
|
near_limit_threshold,
|
|
@@ -395,6 +386,7 @@ const line_budget = {
|
|
|
395
386
|
probe_arguments,
|
|
396
387
|
probe_command,
|
|
397
388
|
probe_rule,
|
|
389
|
+
probe_rules,
|
|
398
390
|
NEAR_LIMIT_FRACTION,
|
|
399
391
|
}
|
|
400
392
|
|