@joshuafolkken/kit 1.1471.0 → 1.1784.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 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type ts from 'typescript'
|
|
2
|
+
import type { TypeScriptApi } from './comment-ranges'
|
|
3
|
+
|
|
4
|
+
// The tests a test file declares, each as its full name — the titles of the `describe` blocks around it
|
|
5
|
+
// joined to its own `it` / `test` title — so two tests with the same title under different blocks
|
|
6
|
+
// stay apart.
|
|
7
|
+
//
|
|
8
|
+
// **Read from the TypeScript parser, never from a pattern**: a title holding a quote or a bracket, or
|
|
9
|
+
// a call split over lines, is exactly what a hand-written scanner misreads. `it.skip(…)`,
|
|
10
|
+
// `test.each([…])(…)` and `describe.concurrent(…)` are the same test with a modifier, so a call
|
|
11
|
+
// counts by the names its callee chain is built from: Playwright's `test.describe(…)` is a block and
|
|
12
|
+
// its `test.step(…)` is part of the test around it, never a test. A template title with substitutions is kept
|
|
13
|
+
// as its source text; a title held in a variable has no text to compare and is not listed.
|
|
14
|
+
//
|
|
15
|
+
// **A `describe` is a name, never a test**: renaming one moves the tests under it, and removing it
|
|
16
|
+
// removes them, so only the `it` / `test` calls are listed.
|
|
17
|
+
|
|
18
|
+
const BLOCK_FUNCTION = 'describe'
|
|
19
|
+
const STEP_FUNCTION = 'step'
|
|
20
|
+
const TEST_FUNCTIONS: ReadonlySet<string> = new Set(['it', 'test'])
|
|
21
|
+
const TITLE_SEPARATOR = ' > '
|
|
22
|
+
const VIRTUAL_FILE_NAME = 'test-titles.ts'
|
|
23
|
+
|
|
24
|
+
type Prefix = ReadonlyArray<string>
|
|
25
|
+
|
|
26
|
+
interface NamedCall {
|
|
27
|
+
chain: ReadonlyArray<string>
|
|
28
|
+
title: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface Walk {
|
|
32
|
+
api: TypeScriptApi
|
|
33
|
+
source: ts.SourceFile
|
|
34
|
+
into: Array<string>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function member_name(api: TypeScriptApi, expression: ts.Expression): ReadonlyArray<string> {
|
|
38
|
+
return api.isPropertyAccessExpression(expression) ? [expression.name.text] : []
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// The names a callee chain is built from, root first: `test.describe.parallel` is
|
|
42
|
+
// `['test', 'describe', 'parallel']`, and `it.each([…])` is `['it', 'each']`.
|
|
43
|
+
function callee_chain(
|
|
44
|
+
api: TypeScriptApi,
|
|
45
|
+
expression: ts.Expression,
|
|
46
|
+
): ReadonlyArray<string> | undefined {
|
|
47
|
+
if (api.isIdentifier(expression)) return [expression.text]
|
|
48
|
+
const is_chained = api.isPropertyAccessExpression(expression) || api.isCallExpression(expression)
|
|
49
|
+
const chain = is_chained ? callee_chain(api, expression.expression) : undefined
|
|
50
|
+
|
|
51
|
+
return chain === undefined ? undefined : [...chain, ...member_name(api, expression)]
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function is_block(chain: ReadonlyArray<string>): boolean {
|
|
55
|
+
return chain.includes(BLOCK_FUNCTION)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function is_test(chain: ReadonlyArray<string>): boolean {
|
|
59
|
+
const [root = ''] = chain
|
|
60
|
+
|
|
61
|
+
return TEST_FUNCTIONS.has(root) && !is_block(chain) && !chain.includes(STEP_FUNCTION)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Only a string or a template can be a title: the array `it.each([…])` is first called with is the
|
|
65
|
+
// table of cases, not a name.
|
|
66
|
+
function title_of(walk: Walk, call: ts.CallExpression): string | undefined {
|
|
67
|
+
const [first] = call.arguments
|
|
68
|
+
|
|
69
|
+
if (first === undefined) return undefined
|
|
70
|
+
if (walk.api.isStringLiteralLike(first)) return first.text
|
|
71
|
+
|
|
72
|
+
return walk.api.isTemplateExpression(first) ? first.getText(walk.source) : undefined
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function named_call(walk: Walk, node: ts.Node): NamedCall | undefined {
|
|
76
|
+
if (!walk.api.isCallExpression(node)) return undefined
|
|
77
|
+
const chain = callee_chain(walk.api, node.expression)
|
|
78
|
+
const title = chain === undefined ? undefined : title_of(walk, node)
|
|
79
|
+
|
|
80
|
+
return chain === undefined || title === undefined ? undefined : { chain, title }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// The block titles a call adds to the name of everything inside it: a `describe` adds its own, a
|
|
84
|
+
// test is listed and adds nothing further down, and any other node passes its prefix through.
|
|
85
|
+
function entered(walk: Walk, call: NamedCall | undefined, prefix: Prefix): Prefix {
|
|
86
|
+
if (call === undefined) return prefix
|
|
87
|
+
const named = [...prefix, call.title]
|
|
88
|
+
|
|
89
|
+
if (is_test(call.chain)) walk.into.push(named.join(TITLE_SEPARATOR))
|
|
90
|
+
|
|
91
|
+
return is_block(call.chain) ? named : prefix
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function visit(walk: Walk, node: ts.Node, prefix: Prefix): void {
|
|
95
|
+
const inner = entered(walk, named_call(walk, node), prefix)
|
|
96
|
+
|
|
97
|
+
walk.api.forEachChild(node, (child) => {
|
|
98
|
+
visit(walk, child, inner)
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function titles_of(api: TypeScriptApi, text: string): ReadonlyArray<string> {
|
|
103
|
+
const source = api.createSourceFile(VIRTUAL_FILE_NAME, text, api.ScriptTarget.Latest, true)
|
|
104
|
+
const into: Array<string> = []
|
|
105
|
+
|
|
106
|
+
visit({ api, source, into }, source, [])
|
|
107
|
+
|
|
108
|
+
return into
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// The title a test carries itself, without the blocks around it.
|
|
112
|
+
function leaf_of(full_name: string): string {
|
|
113
|
+
return full_name.split(TITLE_SEPARATOR).at(-1) ?? full_name
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const test_titles = { leaf_of, titles_of }
|
|
117
|
+
|
|
118
|
+
export { test_titles }
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
3
|
+
|
|
4
|
+
// A `general-purpose` subagent dispatched without a `model` is refused until it names one
|
|
5
|
+
// (joshuafolkken/kit#3927).
|
|
6
|
+
//
|
|
7
|
+
// **The omission is the cost, not the dispatch.** A subagent with no `model` inherits the parent's,
|
|
8
|
+
// so a routine unit runs on the main line's model — measured at 94 such dispatches on Opus. A named
|
|
9
|
+
// agent type carries its own `model` in its definition, so only the catch-all type is in scope; an
|
|
10
|
+
// absent `subagent_type` is that type, the harness's default.
|
|
11
|
+
//
|
|
12
|
+
// **It fires on every occurrence**: the remedy is one field on the same call, so a refusal costs one
|
|
13
|
+
// round trip and never wedges the run.
|
|
14
|
+
|
|
15
|
+
// Both spellings of the subagent tool are in use: `Task` (published) and `Agent` (this harness).
|
|
16
|
+
const SUBAGENT_TOOLS: ReadonlySet<string> = new Set(['Agent', 'Task'])
|
|
17
|
+
const GENERAL_PURPOSE = 'general-purpose'
|
|
18
|
+
|
|
19
|
+
// A dispatch of the catch-all type — the one whose model is otherwise inherited.
|
|
20
|
+
function is_general_purpose(call: GuardedCall): boolean {
|
|
21
|
+
if (!SUBAGENT_TOOLS.has(call.name) || !json_value.is_record(call.input)) return false
|
|
22
|
+
|
|
23
|
+
const type = call.input['subagent_type']
|
|
24
|
+
|
|
25
|
+
return type === undefined || type === GENERAL_PURPOSE
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function names_model(call: GuardedCall): boolean {
|
|
29
|
+
const model = json_value.is_record(call.input) ? call.input['model'] : undefined
|
|
30
|
+
|
|
31
|
+
return typeof model === 'string' && model.length > 0
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function is_unnamed_model(call: GuardedCall): boolean {
|
|
35
|
+
return is_general_purpose(call) && !names_model(call)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function keeps_model(call: GuardedCall): boolean {
|
|
39
|
+
return is_general_purpose(call) && names_model(call)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const AGENT_MODEL_REASON =
|
|
43
|
+
'⛔ agent model: a `general-purpose` subagent with no `model` inherits the parent model. ' +
|
|
44
|
+
'Reissue the call with `model` set — `sonnet` for routine work, `opus` for judgment such as a review. ' +
|
|
45
|
+
'It fires on every occurrence (`.claude/skills/workflow-commands/delegation.md`).'
|
|
46
|
+
|
|
47
|
+
// `reaches` is every catch-all dispatch, so `rule-value.ts` scores the named-model ones against it.
|
|
48
|
+
const ROW = {
|
|
49
|
+
id: 'agent-model',
|
|
50
|
+
is_trigger: is_unnamed_model,
|
|
51
|
+
reason: AGENT_MODEL_REASON,
|
|
52
|
+
decide: (): boolean => true,
|
|
53
|
+
keeps: keeps_model,
|
|
54
|
+
reaches: is_general_purpose,
|
|
55
|
+
about: {
|
|
56
|
+
title: 'Subagent model named',
|
|
57
|
+
topic:
|
|
58
|
+
'`.claude/skills/workflow-commands/delegation.md` → "A `general-purpose` subagent names its model"',
|
|
59
|
+
fires:
|
|
60
|
+
'an `Agent` / `Task` call of the `general-purpose` type with no `model`. Every occurrence',
|
|
61
|
+
quiet: 'a named agent type, or a `model` set',
|
|
62
|
+
},
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const agent_model = { AGENT_MODEL_REASON, ROW, is_unnamed_model }
|
|
66
|
+
|
|
67
|
+
export { agent_model }
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
2
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
3
3
|
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
4
|
+
import { git_argv } from './git-argv'
|
|
4
5
|
import { shell_segments } from './shell-segments'
|
|
5
6
|
|
|
6
7
|
// The trigger helpers the enumeration in `delivered-rules.ts` is built from, held here so a rule
|
|
@@ -35,10 +36,52 @@ const TITLE_FIELD = /(?:-f|-F|--field|--raw-field)\s*'?title=/u
|
|
|
35
36
|
|
|
36
37
|
// A filing made by hand rather than through `josh issue:file` — the call the `direct-filing` row
|
|
37
38
|
// refuses on every occurrence.
|
|
39
|
+
//
|
|
40
|
+
// **Read outside quotes, but not outside a heredoc** (joshuafolkken/kit#4525). `echo "… gh issue create
|
|
41
|
+
// …"` files nothing, so the `gh` call is matched on the unquoted line — which keeps a `"$(gh issue
|
|
42
|
+
// create …)"` that runs. A heredoc body is matched as written: `bash <<EOF` runs it, and the body cannot
|
|
43
|
+
// be told apart from prose, so the rule errs on the refusing side. The endpoint and the title field are
|
|
44
|
+
// still read from the line as written, where a quoted path or field keeps them.
|
|
45
|
+
//
|
|
46
|
+
// **A quoted script handed to a shell runs, so it is read as written too**: `bash -c "gh issue create
|
|
47
|
+
// …"`, `sh -c '…'` and `eval "…"` file the Issue the quotes would otherwise hide.
|
|
48
|
+
const GH_API_COMMAND = /\bgh\s+api\b/u
|
|
49
|
+
const SHELL_SCRIPT_RUNNER = /\b(?:(?:ba|z|da|k)?sh\s+(?:-\w+\s+)*-\w*c\b|eval\b)/u
|
|
50
|
+
|
|
51
|
+
function spoken_line(command: string): string {
|
|
52
|
+
if (time_shell.has_heredoc(command)) return command
|
|
53
|
+
|
|
54
|
+
const plain = time_shell.unquoted(command)
|
|
55
|
+
|
|
56
|
+
return SHELL_SCRIPT_RUNNER.test(plain) ? command : plain
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const LEADING_SHELL_SCRIPT_RUNNER = new RegExp(`^${SHELL_SCRIPT_RUNNER.source}`, 'u')
|
|
60
|
+
const QUOTE_MARK = /["']/gu
|
|
61
|
+
|
|
62
|
+
// The quoted script a segment's shell runs, as a line of its own: `sh -c 'pnpm exec eslint .'` reads
|
|
63
|
+
// as `pnpm exec eslint .`, so a caller cutting it into commands reads the programs the script
|
|
64
|
+
// launches. Only when the segment's program is the runner — `echo sh -c x` hands no script to a shell.
|
|
65
|
+
// `undefined` when the segment runs no shell script.
|
|
66
|
+
function shell_script_of(segment: string): string | undefined {
|
|
67
|
+
const call = git_argv.program_of(segment)
|
|
68
|
+
|
|
69
|
+
if (call === undefined) return undefined
|
|
70
|
+
|
|
71
|
+
const spoken = [call.name, ...call.args].join(' ')
|
|
72
|
+
const runner = LEADING_SHELL_SCRIPT_RUNNER.exec(spoken)
|
|
73
|
+
|
|
74
|
+
if (runner === null) return undefined
|
|
75
|
+
|
|
76
|
+
return spoken.slice(runner[0].length).replaceAll(QUOTE_MARK, '').trim()
|
|
77
|
+
}
|
|
78
|
+
|
|
38
79
|
function is_direct_filing(command: string): boolean {
|
|
39
|
-
|
|
80
|
+
const spoken = spoken_line(command)
|
|
81
|
+
|
|
82
|
+
if (ISSUE_CREATE_COMMAND.test(spoken)) return true
|
|
40
83
|
|
|
41
|
-
return ISSUES_ENDPOINT.test(command) && TITLE_FIELD.test(command)
|
|
84
|
+
return GH_API_COMMAND.test(spoken) && ISSUES_ENDPOINT.test(command) && TITLE_FIELD.test(command)
|
|
42
85
|
}
|
|
43
86
|
|
|
44
87
|
// `pnpm josh issue:file`, in either spelling — **the** filing act once a direct one is refused, so the
|
|
@@ -52,6 +95,6 @@ function is_issue_filing(command: string): boolean {
|
|
|
52
95
|
.some((segment) => shell_segments.is_josh_command(segment, FILING_NAMES))
|
|
53
96
|
}
|
|
54
97
|
|
|
55
|
-
const bash_triggers = { is_direct_filing, is_issue_filing, on_bash_command }
|
|
98
|
+
const bash_triggers = { is_direct_filing, is_issue_filing, on_bash_command, shell_script_of }
|
|
56
99
|
|
|
57
100
|
export { bash_triggers }
|
|
@@ -33,6 +33,7 @@ const EPIC_NEXT_REFERENCE = 'docs/josh-commands-backlog.md → `josh epic:next`'
|
|
|
33
33
|
const BACKLOG_BUDGET_REFERENCE = 'docs/josh-commands-backlog.md → `josh backlog:budget`'
|
|
34
34
|
const RUN_LIVENESS_REFERENCE = 'docs/josh-commands-run.md → `josh run:liveness`'
|
|
35
35
|
const AUTO_OK_NEXT_REFERENCE = 'docs/josh-commands-backlog.md → `josh auto-ok:next`'
|
|
36
|
+
const STASH_PUSH_REFERENCE = 'docs/josh-commands-backlog.md → `josh stash:push`'
|
|
36
37
|
|
|
37
38
|
// Command used by two separate oracle entries (run:cut:resume and run:cut:gate).
|
|
38
39
|
const RUN_CUT_CMD = 'run:cut'
|
|
@@ -65,9 +66,16 @@ const BATCH_ORACLES: ReadonlyArray<DecisionOracle> = [
|
|
|
65
66
|
name: 'run:liveness',
|
|
66
67
|
decision: 'Whether a delegated unit is still working or has stopped without reporting',
|
|
67
68
|
args: `${ISSUE_N_ARG} --output <path>`,
|
|
68
|
-
vocabulary: ['alive', 'stopped', 'settled', 'undetermined'],
|
|
69
|
+
vocabulary: ['alive', 'paused', 'stopped', 'settled', 'undetermined'],
|
|
69
70
|
single_source: RUN_LIVENESS_REFERENCE,
|
|
70
71
|
},
|
|
72
|
+
{
|
|
73
|
+
name: 'stash:push',
|
|
74
|
+
decision: 'Whether the working tree had anything outside the observation ledger to set aside',
|
|
75
|
+
args: '<message>',
|
|
76
|
+
vocabulary: ['stashed', 'clean'],
|
|
77
|
+
single_source: STASH_PUSH_REFERENCE,
|
|
78
|
+
},
|
|
71
79
|
{
|
|
72
80
|
name: 'stash:pop',
|
|
73
81
|
decision: 'Whether a named stash entry exists and can be applied',
|
|
@@ -152,9 +152,9 @@ const DECISION_ORACLES: ReadonlyArray<DecisionOracle> = [
|
|
|
152
152
|
{
|
|
153
153
|
name: 'cases',
|
|
154
154
|
decision:
|
|
155
|
-
'Each boundary a change crosses (network, process, fs, time) and the abnormal cases it owes',
|
|
155
|
+
'Each boundary a change crosses (network, process, fs, time, shared state, environment) and the abnormal cases it owes',
|
|
156
156
|
args: '<path...>',
|
|
157
|
-
vocabulary: ['network', 'process', 'fs', 'time', NONE],
|
|
157
|
+
vocabulary: ['network', 'process', 'fs', 'time', 'state', 'env', NONE],
|
|
158
158
|
single_source: 'prompts/collaboration-workflow/report-format.md → 変更とテスト',
|
|
159
159
|
},
|
|
160
160
|
{
|
|
@@ -2,8 +2,10 @@ import { investigation_reads } from '#scripts/delegation/investigation-reads'
|
|
|
2
2
|
import { hook_decision, type GuardRun, type TranscriptGuardSpec } from '#scripts/josh/hook-decision'
|
|
3
3
|
import { lane_guard_policy } from '#scripts/lane/lane-guard-policy'
|
|
4
4
|
import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
5
|
+
import { agent_model } from './agent-model'
|
|
5
6
|
import { bash_triggers } from './bash-triggers'
|
|
6
7
|
import { direct_filing } from './direct-filing'
|
|
8
|
+
import { direct_issue_comment } from './direct-issue-comment'
|
|
7
9
|
import { early_heartbeat } from './early-heartbeat'
|
|
8
10
|
import { file_body } from './file-body'
|
|
9
11
|
import { filing_cap } from './filing-cap'
|
|
@@ -13,6 +15,7 @@ import { issue_comments } from './issue-comments'
|
|
|
13
15
|
import { josh_git_bare } from './josh-git-bare'
|
|
14
16
|
import { lane_background } from './lane-background'
|
|
15
17
|
import { lane_carry_conflict } from './lane-carry-conflict'
|
|
18
|
+
import { lane_direct_tool } from './lane-direct-tool'
|
|
16
19
|
import { lane_interactive_ask } from './lane-interactive-ask'
|
|
17
20
|
import { lane_park } from './lane-park'
|
|
18
21
|
import { lane_split_park } from './lane-split-park'
|
|
@@ -28,6 +31,7 @@ import { run_tail_rule } from './run-tail-rule'
|
|
|
28
31
|
import { shell_body_trigger } from './shell-body-trigger'
|
|
29
32
|
import { test_declared_commit } from './test-declared-commit'
|
|
30
33
|
import { third_party_write } from './third-party-write'
|
|
34
|
+
import { timed_rerun } from './timed-rerun'
|
|
31
35
|
import { worktree_guard } from './worktree-guard'
|
|
32
36
|
|
|
33
37
|
// The rules delivered by a `PreToolUse` refusal at the moment they bind, rather than carried resident
|
|
@@ -46,12 +50,32 @@ type CallTest = (
|
|
|
46
50
|
run: ReadonlyArray<GuardedCall>,
|
|
47
51
|
) => boolean
|
|
48
52
|
|
|
53
|
+
// The tail is read lazily: most calls no rewrite applies to never need it.
|
|
54
|
+
type CallRewrite = (call: GuardedCall, tail: () => string) => Record<string, unknown> | undefined
|
|
55
|
+
|
|
56
|
+
// The human-readable side `pnpm josh rule:list` renders, carried on the row so a rule is one entry.
|
|
57
|
+
interface RuleAbout {
|
|
58
|
+
title: string
|
|
59
|
+
// The single source of the rule's procedure.
|
|
60
|
+
topic: string
|
|
61
|
+
fires: string
|
|
62
|
+
// The silent turn — it matches the state in which the rule is already kept.
|
|
63
|
+
quiet: string
|
|
64
|
+
// The hook command that delivers it; absent reads as `PRETOOL_GUARD`.
|
|
65
|
+
entry?: string
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Every row here — batching and investigation included — is delivered by the one `PreToolUse`
|
|
69
|
+
// process (`scripts/hooks/pretool-guard.ts`).
|
|
70
|
+
const PRETOOL_GUARD = 'pnpm josh pretool:guard'
|
|
71
|
+
|
|
49
72
|
// `id` keys the rule's own refusal record, so one rule firing never spends another's budget.
|
|
50
73
|
interface DeliveredRule {
|
|
51
74
|
id: string
|
|
52
75
|
is_trigger: (call: GuardedCall) => boolean
|
|
53
76
|
// The only text that reaches the model: the instruction and the pointer.
|
|
54
77
|
reason: string
|
|
78
|
+
about: RuleAbout
|
|
55
79
|
// A stand-down when an earlier act on the tail already satisfied the rule; checked first, so a
|
|
56
80
|
// satisfied call spends no record.
|
|
57
81
|
already_satisfied?: (tail: string, call: GuardedCall) => boolean
|
|
@@ -63,6 +87,9 @@ interface DeliveredRule {
|
|
|
63
87
|
// The occasion the rule governs, for a row whose trigger is the violation itself (else `is_trigger`
|
|
64
88
|
// would only count runs that broke it).
|
|
65
89
|
reaches?: CallTest
|
|
90
|
+
// The call made right, for a row `guard-remedy.ts` classes as a rewrite: `rule-rewrite.ts` runs it
|
|
91
|
+
// in place of the refusal. `undefined` where this call has no mechanical fix, so it is refused.
|
|
92
|
+
rewrite?: CallRewrite
|
|
66
93
|
// The note a hook attaches where it rewrites a violating call instead of refusing it, so
|
|
67
94
|
// `rule-value.ts` counts the rewrite as this row's delivery.
|
|
68
95
|
rewrite_note?: string
|
|
@@ -71,7 +98,7 @@ interface DeliveredRule {
|
|
|
71
98
|
former_reasons?: ReadonlyArray<string>
|
|
72
99
|
}
|
|
73
100
|
|
|
74
|
-
// Scored but possibly delivered by its own
|
|
101
|
+
// Scored but possibly delivered by its own guard inside `pretool-guard.ts` (batching, investigation) — joining `DELIVERED_RULES`
|
|
75
102
|
// would refuse one violation twice — so `is_trigger` is optional here.
|
|
76
103
|
type MeasuredRule = Omit<DeliveredRule, 'is_trigger'> & {
|
|
77
104
|
is_trigger?: DeliveredRule['is_trigger']
|
|
@@ -91,6 +118,9 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
91
118
|
// The direct call only; `filing-cap` below triggers on `issue:file`. The WIP cap and the fold
|
|
92
119
|
// question are `issue:file`'s own steps, so no row gates them.
|
|
93
120
|
direct_filing.ROW,
|
|
121
|
+
// Before the body rows: a comment posted by hand is refused whatever its body, and the command it
|
|
122
|
+
// points at takes the body by path, so the body rows have nothing left to say.
|
|
123
|
+
direct_issue_comment.ROW,
|
|
94
124
|
filing_cap.ROW,
|
|
95
125
|
issue_comments.ROW,
|
|
96
126
|
{
|
|
@@ -99,6 +129,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
99
129
|
reason: SHELL_BODY_REASON,
|
|
100
130
|
keeps: on_bash_command(keeps_body_safe),
|
|
101
131
|
reaches: on_bash_command(carries_a_body),
|
|
132
|
+
about: {
|
|
133
|
+
title: 'No body on the shell',
|
|
134
|
+
topic: '`shell-body.md`',
|
|
135
|
+
fires:
|
|
136
|
+
'a double-quoted body value (`-f body="…"` / `-f "body=…"` / `--body "…"` / `--notify-message "…"`) carrying a backtick or `$`',
|
|
137
|
+
quiet: 'the shell does not evaluate the body',
|
|
138
|
+
},
|
|
102
139
|
},
|
|
103
140
|
raw_field_body.ROW,
|
|
104
141
|
{
|
|
@@ -107,8 +144,16 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
107
144
|
reason: piped_verification.PIPED_VERIFICATION_REASON,
|
|
108
145
|
keeps: on_bash_command(piped_verification.keeps_verdict_intact),
|
|
109
146
|
reaches: on_bash_command(piped_verification.runs_verification),
|
|
110
|
-
// A
|
|
147
|
+
// A masking whose filter reads to the end is rewritten under `pipefail`, never refused.
|
|
148
|
+
rewrite: piped_verification.pipefail_input,
|
|
111
149
|
rewrite_note: piped_verification.PIPEFAIL_NOTE,
|
|
150
|
+
about: {
|
|
151
|
+
title: 'Piped verification',
|
|
152
|
+
topic: '`output-bounds.md`',
|
|
153
|
+
fires:
|
|
154
|
+
'a pass/fail josh check (`gate` / `check` / `lint*` / `cspell*` / `test*` / `eval` / `overrides` / `ranges`) in front of a pipe — rewritten under `set -o pipefail` when every filter is `tail` or a full-reading `grep`, refused otherwise',
|
|
155
|
+
quiet: 'the exit code reaches the caller — a failure reads as a failure',
|
|
156
|
+
},
|
|
112
157
|
},
|
|
113
158
|
{
|
|
114
159
|
id: 'early-heartbeat',
|
|
@@ -117,6 +162,14 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
117
162
|
decide: early_heartbeat.decide,
|
|
118
163
|
keeps: on_bash_command(early_heartbeat.is_progress_watch),
|
|
119
164
|
reaches: on_bash_command(early_heartbeat.waits_for_progress),
|
|
165
|
+
about: {
|
|
166
|
+
title: 'Early progress report',
|
|
167
|
+
topic:
|
|
168
|
+
'`.claude/skills/workflow-commands/progress-watcher.md` → "Progress while the run is quiet"',
|
|
169
|
+
fires:
|
|
170
|
+
'a `Bash` whose only purpose is waiting (`sleep` alone, or `echo` / `:` / `date`) while a timer is live or before the interval. Every occurrence',
|
|
171
|
+
quiet: 'no hand-made wait timer — `run:progress` holds the one clock',
|
|
172
|
+
},
|
|
120
173
|
},
|
|
121
174
|
// Before `run-tail`: whether to commit at all is decided before how to push.
|
|
122
175
|
test_declared_commit.ROW,
|
|
@@ -130,6 +183,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
130
183
|
decide: run_tail_rule.decide,
|
|
131
184
|
keeps: run_tail_rule.is_backgrounded_push_step,
|
|
132
185
|
reaches: run_tail_rule.is_push_step_call,
|
|
186
|
+
about: {
|
|
187
|
+
title: 'Idle run tail',
|
|
188
|
+
topic: '`.claude/skills/workflow-commands/background-commands.md`',
|
|
189
|
+
fires:
|
|
190
|
+
'`pnpm josh git -y` (`josh g`, `--yes` alike) issued in the **foreground**. Every occurrence',
|
|
191
|
+
quiet: 'issued in the background — its completion resumes the run',
|
|
192
|
+
},
|
|
133
193
|
},
|
|
134
194
|
// Reads the lane name and the cut record. Once per run, not `decide`: taking the cut ends the
|
|
135
195
|
// process, and the verdicts that leave a run at the gate all need the reissue through. `reaches`
|
|
@@ -141,13 +201,25 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
141
201
|
reason: pre_gate_cut.PRE_GATE_CUT_REASON,
|
|
142
202
|
keeps: on_bash_command(pre_gate_cut.takes_the_cut),
|
|
143
203
|
reaches: pre_gate_cut.reaches_the_pre_gate_boundary,
|
|
204
|
+
about: {
|
|
205
|
+
title: 'The cut before the gate',
|
|
206
|
+
topic: '`.claude/skills/workflow-commands/pre-gate-cut.md`',
|
|
207
|
+
fires:
|
|
208
|
+
'`pnpm josh gate` (`josh ga`) in a lane work tree whose `JOSH_LANE_CHILD` names the Issue and has no cut record',
|
|
209
|
+
quiet: 'outside a lane, no marker (a person in the lane), or already cut',
|
|
210
|
+
},
|
|
144
211
|
},
|
|
145
212
|
// A split child's park is refused before `lane-park` sees it.
|
|
146
213
|
lane_split_park.ROW,
|
|
147
214
|
lane_park.ROW,
|
|
148
215
|
lane_interactive_ask.ROW,
|
|
216
|
+
agent_model.ROW,
|
|
149
217
|
lane_carry_conflict.ROW,
|
|
150
218
|
lane_switch_main.ROW,
|
|
219
|
+
// Before `lane-direct-tool`, its one overlap (a timed tool in a lane): the record is the right first
|
|
220
|
+
// act, and `lane-direct-tool` delivers on the reissue of a `time`-prefixed tool.
|
|
221
|
+
timed_rerun.ROW,
|
|
222
|
+
lane_direct_tool.ROW,
|
|
151
223
|
// Disjoint from `run-tail` by the `-y` flag.
|
|
152
224
|
josh_git_bare.ROW,
|
|
153
225
|
// The Bash-string gaps the deny glob cannot express, read by argv; `delivered-rules-bash.test.ts`
|
|
@@ -177,6 +249,13 @@ const BATCHING_RULE: MeasuredRule = {
|
|
|
177
249
|
reason: time_batch_guard.REASON,
|
|
178
250
|
keeps: batches_the_turn,
|
|
179
251
|
reaches: time_batch_guard.is_guarded_call,
|
|
252
|
+
about: {
|
|
253
|
+
title: 'Turn batching',
|
|
254
|
+
topic: '`turn-batching.md`',
|
|
255
|
+
fires:
|
|
256
|
+
'the `Bash` / `Edit` / `Read` after three single-call turns in a row; fires **again** every three more such turns',
|
|
257
|
+
quiet: 'calls per round trip above the floor',
|
|
258
|
+
},
|
|
180
259
|
}
|
|
181
260
|
|
|
182
261
|
// No `is_trigger`, as for batching. No `keeps`: any dispatch would read as compliance, so it is left
|
|
@@ -185,6 +264,13 @@ const INVESTIGATION_RULE: MeasuredRule = {
|
|
|
185
264
|
id: 'investigation',
|
|
186
265
|
reason: investigation_reads.REASON,
|
|
187
266
|
reaches: investigation_reads.is_refusable_call,
|
|
267
|
+
about: {
|
|
268
|
+
title: 'Investigation delegation threshold',
|
|
269
|
+
topic: '`delegation.md`',
|
|
270
|
+
fires:
|
|
271
|
+
'the `Read` / `Bash` that makes the third read of a file the run will not edit; fires **again** once reads pile up to the threshold again',
|
|
272
|
+
quiet: 'reads under the threshold — nothing to delegate yet',
|
|
273
|
+
},
|
|
188
274
|
}
|
|
189
275
|
|
|
190
276
|
const MEASURED_RULES: ReadonlyArray<MeasuredRule> = [
|
|
@@ -291,6 +377,7 @@ const delivered_rules = {
|
|
|
291
377
|
PIPED_VERIFICATION_REASON: piped_verification.PIPED_VERIFICATION_REASON,
|
|
292
378
|
POLL_LOOP_REASON: poll_loop.POLL_LOOP_REASON,
|
|
293
379
|
PRE_GATE_CUT_REASON: pre_gate_cut.PRE_GATE_CUT_REASON,
|
|
380
|
+
PRETOOL_GUARD,
|
|
294
381
|
RAW_FIELD_BODY_REASON: raw_field_body.RAW_FIELD_BODY_REASON,
|
|
295
382
|
RUN_TAIL_REASON: run_tail_rule.RUN_TAIL_REASON,
|
|
296
383
|
SHELL_BODY_REASON,
|
|
@@ -304,5 +391,5 @@ const delivered_rules = {
|
|
|
304
391
|
is_issue_filing,
|
|
305
392
|
}
|
|
306
393
|
|
|
307
|
-
export type { DeliveredRule, MeasuredRule }
|
|
394
|
+
export type { CallRewrite, DeliveredRule, MeasuredRule, RuleAbout }
|
|
308
395
|
export { delivered_rules }
|
|
@@ -93,7 +93,7 @@ function is_destructive_segment(segment: string): boolean {
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
function is_destructive_command(command: string): boolean {
|
|
96
|
-
return shell_segments.
|
|
96
|
+
return shell_segments.commands_of(command).some((segment) => is_destructive_segment(segment))
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
const DESTRUCTIVE_COMMAND_REASON =
|
|
@@ -109,6 +109,13 @@ const ROW = {
|
|
|
109
109
|
decide: (): boolean => true,
|
|
110
110
|
// The opening the reason carried before it was cut to the action and the next command.
|
|
111
111
|
former_reasons: ['⛔ destructive command: a recursive forced `rm` (`rm -rf`'],
|
|
112
|
+
about: {
|
|
113
|
+
title: 'Destructive command',
|
|
114
|
+
topic: '`operating-rules.md`',
|
|
115
|
+
fires:
|
|
116
|
+
'`rm -rf` (any spelling), `gh repo delete` / `archive`, `gh pr close`, `gh api -X DELETE`. Every occurrence',
|
|
117
|
+
quiet: "`gh issue close` or removing an Issue label — the workflow's own steps",
|
|
118
|
+
},
|
|
112
119
|
}
|
|
113
120
|
|
|
114
121
|
const destructive_command = { DESTRUCTIVE_COMMAND_REASON, ROW, is_destructive_command }
|
|
@@ -8,8 +8,8 @@ import { bash_triggers } from './bash-triggers'
|
|
|
8
8
|
// pointed there.
|
|
9
9
|
|
|
10
10
|
const DIRECT_FILING_REASON =
|
|
11
|
-
'⛔ direct filing: an Issue is filed with `pnpm josh issue:file "<title>" --body-file <path
|
|
12
|
-
'
|
|
11
|
+
'⛔ direct filing: an Issue is filed with `pnpm josh issue:file "<title>" --body-file <path>`, ' +
|
|
12
|
+
'never with `gh api …/issues` or `gh issue create` — it runs the scout, the lint, ' +
|
|
13
13
|
'the labels and `epic:bundle` itself. It fires on every occurrence (`docs/josh-commands-backlog.md` ' +
|
|
14
14
|
'→ "`josh issue:file`").'
|
|
15
15
|
|
|
@@ -27,6 +27,14 @@ const ROW = {
|
|
|
27
27
|
decide: (): boolean => true,
|
|
28
28
|
keeps: bash_triggers.on_bash_command(bash_triggers.is_issue_filing),
|
|
29
29
|
reaches: bash_triggers.on_bash_command(is_any_filing),
|
|
30
|
+
about: {
|
|
31
|
+
title: 'Direct filing',
|
|
32
|
+
topic: '`docs/josh-commands-backlog.md` → `josh issue:file`',
|
|
33
|
+
fires:
|
|
34
|
+
'a `Bash` that creates an Issue outside `josh issue:file` (`gh issue create`, or a POST with `title` to `…/issues`); the refusal hands over the `pnpm josh issue:file` form. Every occurrence',
|
|
35
|
+
quiet:
|
|
36
|
+
'filing through `pnpm josh issue:file` — the duplicate scan, the body check and `epic:bundle` all run',
|
|
37
|
+
},
|
|
30
38
|
}
|
|
31
39
|
|
|
32
40
|
const direct_filing = { DIRECT_FILING_REASON, ROW }
|