@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
|
@@ -30,10 +30,13 @@ const KEYWORD_BEFORE_ARGUMENT = -2
|
|
|
30
30
|
|
|
31
31
|
const PROMPT_LINE_SCHEMA = z.object({
|
|
32
32
|
isMeta: z.boolean().nullish(),
|
|
33
|
+
timestamp: z.string().nullish(),
|
|
33
34
|
origin: z.object({ kind: z.string().nullish() }).nullish(),
|
|
34
35
|
message: z.object({ content: z.unknown() }),
|
|
35
36
|
})
|
|
36
37
|
|
|
38
|
+
const TIMED_LINE_SCHEMA = z.object({ timestamp: z.string() })
|
|
39
|
+
|
|
37
40
|
type PromptLine = z.infer<typeof PROMPT_LINE_SCHEMA>
|
|
38
41
|
|
|
39
42
|
function is_person(line: PromptLine): boolean {
|
|
@@ -42,13 +45,20 @@ function is_person(line: PromptLine): boolean {
|
|
|
42
45
|
return line.origin === null || line.origin === undefined || line.origin.kind === HUMAN_ORIGIN
|
|
43
46
|
}
|
|
44
47
|
|
|
45
|
-
// The prompt line
|
|
46
|
-
|
|
48
|
+
// The prompt line as the person wrote it, or `undefined` when the harness wrote it or it does not
|
|
49
|
+
// read as one.
|
|
50
|
+
function person_line(line: string): PromptLine | undefined {
|
|
47
51
|
const parsed = PROMPT_LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line))
|
|
48
52
|
|
|
49
|
-
|
|
53
|
+
return parsed.success && is_person(parsed.data) ? parsed.data : undefined
|
|
54
|
+
}
|
|
50
55
|
|
|
51
|
-
|
|
56
|
+
// The prompt line's text, or `undefined` when the harness wrote it or it does not read as one.
|
|
57
|
+
function person_text(line: string): string | undefined {
|
|
58
|
+
const person = person_line(line)
|
|
59
|
+
if (person === undefined) return undefined
|
|
60
|
+
|
|
61
|
+
return time_reported_failure.result_text(person.message.content)
|
|
52
62
|
}
|
|
53
63
|
|
|
54
64
|
// A keyword opening the prompt is what a person types; a keyword before its one trailing argument is a
|
|
@@ -75,6 +85,41 @@ function prompt_text(tail: string): string {
|
|
|
75
85
|
return text === undefined || is_invocation(text) ? NO_PROMPT : text
|
|
76
86
|
}
|
|
77
87
|
|
|
78
|
-
|
|
88
|
+
// **The prompt that opened this turn, when a person typed it** — '' when the harness opened it (a task
|
|
89
|
+
// notification, a subagent's hand-back), so a question asked turns ago does not answer for a stop the
|
|
90
|
+
// run reached on its own since (`stop-decision.ts` → `is_question`).
|
|
91
|
+
function turn_prompt(tail: string): string {
|
|
92
|
+
const opener = tail.split('\n').findLast((line) => filing_cap.is_prompt_line(line))
|
|
93
|
+
if (opener === undefined) return NO_PROMPT
|
|
94
|
+
|
|
95
|
+
return person_text(opener) ?? NO_PROMPT
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// When the person last prompted on the tail, or `undefined` when no prompt of theirs is on it.
|
|
99
|
+
function prompt_time(tail: string): string | undefined {
|
|
100
|
+
return tail
|
|
101
|
+
.split('\n')
|
|
102
|
+
.filter((line) => filing_cap.is_prompt_line(line))
|
|
103
|
+
.map((line) => person_line(line)?.timestamp ?? undefined)
|
|
104
|
+
.findLast((time) => time !== undefined)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// The first dated line on the tail, or `undefined` when none is.
|
|
108
|
+
function tail_time(tail: string): string | undefined {
|
|
109
|
+
return tail
|
|
110
|
+
.split('\n')
|
|
111
|
+
.map((line) => TIMED_LINE_SCHEMA.safeParse(json_value.parse_or_undefined(line)).data?.timestamp)
|
|
112
|
+
.find((time) => time !== undefined)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// **When the current pause began, as far as the tail shows** — what a recorded notify is compared
|
|
116
|
+
// against. A person's prompt ends the pause it reported, so the last one opens the next; with none on
|
|
117
|
+
// the tail, only a send dated inside the tail is provably after every prompt, and an older send is
|
|
118
|
+
// announced again (joshuafolkken/kit#3961).
|
|
119
|
+
function pause_start(tail: string): string | undefined {
|
|
120
|
+
return prompt_time(tail) ?? tail_time(tail)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const last_prompt = { pause_start, prompt_text, turn_prompt }
|
|
79
124
|
|
|
80
125
|
export { last_prompt }
|
|
@@ -55,6 +55,15 @@ function reason_for(oracle: Oracle, firing_point: FiringPoint): string {
|
|
|
55
55
|
)
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
// One description for every generated row: the rule is the same act whichever oracle it names.
|
|
59
|
+
const ABOUT: DeliveredRule['about'] = {
|
|
60
|
+
title: 'An act its oracle was not asked about',
|
|
61
|
+
topic: '`decision-oracle.ts`',
|
|
62
|
+
fires:
|
|
63
|
+
'a `Bash` governed by an oracle that declared a firing point (`pkg:scout` governs `pnpm add`), issued without that `pnpm josh <command>`. Refused until it ran',
|
|
64
|
+
quiet: 'no governed act, or the oracle already ran',
|
|
65
|
+
}
|
|
66
|
+
|
|
58
67
|
function row_for(oracle: Oracle, firing_point: FiringPoint): DeliveredRule {
|
|
59
68
|
const names = command_names(oracle)
|
|
60
69
|
|
|
@@ -65,6 +74,7 @@ function row_for(oracle: Oracle, firing_point: FiringPoint): DeliveredRule {
|
|
|
65
74
|
already_satisfied: (tail: string, _call: GuardedCall): boolean =>
|
|
66
75
|
tail_commands.prior_bash_commands(tail).some((command) => runs_the_oracle(command, names)),
|
|
67
76
|
keeps: bash_triggers.on_bash_command((command: string) => runs_the_oracle(command, names)),
|
|
77
|
+
about: ABOUT,
|
|
68
78
|
}
|
|
69
79
|
}
|
|
70
80
|
|
|
@@ -12,6 +12,10 @@ import { oracle_firing } from './oracle-firing'
|
|
|
12
12
|
const ARGV_OFFSET = 2
|
|
13
13
|
const INDENT = ' '
|
|
14
14
|
const FIELD_WIDTH = 10
|
|
15
|
+
// The rule-prose guard sends a rule author here first, so the list closes on the placement order a new
|
|
16
|
+
// rule is weighed against before it becomes a guard or a document line.
|
|
17
|
+
const AUTOMATION_ORDER =
|
|
18
|
+
'automate first: a command > a hook that runs it > a refusal guard > a document — a lower rung states why the higher cannot hold (`principles.md` → "automate-first"; a guard\'s `why` is `scripts/rules/guard-remedy.ts`)'
|
|
15
19
|
|
|
16
20
|
function pad_field(label: string): string {
|
|
17
21
|
return label.padEnd(FIELD_WIDTH)
|
|
@@ -51,6 +55,8 @@ function print_list(): void {
|
|
|
51
55
|
for (const oracle of decision_oracle.DECISION_ORACLES) {
|
|
52
56
|
console.info(format_oracle(oracle))
|
|
53
57
|
}
|
|
58
|
+
|
|
59
|
+
console.info(AUTOMATION_ORDER)
|
|
54
60
|
}
|
|
55
61
|
|
|
56
62
|
function run(argv: ReadonlyArray<string>): number {
|
|
@@ -70,6 +76,7 @@ function main(argv: ReadonlyArray<string>): void {
|
|
|
70
76
|
}
|
|
71
77
|
|
|
72
78
|
const oracle_list_cli = {
|
|
79
|
+
AUTOMATION_ORDER,
|
|
73
80
|
print_list,
|
|
74
81
|
}
|
|
75
82
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { destructive_command } from './destructive-command'
|
|
2
2
|
import { direct_pr_create } from './direct-pr-create'
|
|
3
3
|
import { index_guard } from './index-guard'
|
|
4
|
+
import { pr_merge } from './pr-merge'
|
|
4
5
|
import { protected_files } from './protected-files'
|
|
5
6
|
|
|
6
7
|
// The three rows that close the deny-list bypasses, gathered so
|
|
@@ -10,11 +11,13 @@ import { protected_files } from './protected-files'
|
|
|
10
11
|
// other row's — `git restore` is split with `worktree-mutation` by `--staged` alone. The fourth row,
|
|
11
12
|
// `direct-pr-create`, closes the same kind of gap for `gh pr create`, which
|
|
12
13
|
// the deny list never listed: it claims `gh pr create` and a `gh api` write to the pulls collection.
|
|
14
|
+
// The fifth, `pr-merge`, claims a merge in every spelling the `gh pr merge*` glob misses.
|
|
13
15
|
const ROWS = [
|
|
14
16
|
index_guard.ROW,
|
|
15
17
|
destructive_command.ROW,
|
|
16
18
|
protected_files.ROW,
|
|
17
19
|
direct_pr_create.ROW,
|
|
20
|
+
pr_merge.ROW,
|
|
18
21
|
] as const
|
|
19
22
|
|
|
20
23
|
const permission_guards = { ROWS }
|
|
@@ -16,7 +16,7 @@ import { shell_segments } from './shell-segments'
|
|
|
16
16
|
// document, prompt and skill in this repository found exactly one piped verification example, and it
|
|
17
17
|
// was the repository's own explanation of this bug — so there were no examples to rewrite, and the
|
|
18
18
|
// pipe is invented each time rather than copied. The other candidate, a calling convention, had
|
|
19
|
-
// already been rejected in writing by `
|
|
19
|
+
// already been rejected in writing by `tools/time/time-reported-failure.ts`: a convention is obeyed
|
|
20
20
|
// or it is not. `prompts/collaboration-workflow/output-bounds.md` is the single source for the rule.
|
|
21
21
|
//
|
|
22
22
|
// It lives beside the enumeration rather than inside it because `delivered-rules.ts` is the list —
|
|
@@ -124,6 +124,8 @@ function keeps_verdict_intact(command: string): boolean {
|
|
|
124
124
|
// **Only a filter that reads its input to the end qualifies.** One that exits early — `head`, or a
|
|
125
125
|
// `grep` stopping at its first match — closes the pipe on a check still writing, and under `pipefail` the
|
|
126
126
|
// check's SIGPIPE turns a passing run into exit 141; `head` also cuts the verdict line josh prints last.
|
|
127
|
+
// `cut`, `sort`, `uniq` and `wc` read to the end as well, and a `grep … | cut -c1-250` narrowing was the
|
|
128
|
+
// commonest masking still refused after #3875 (joshuafolkken/kit#3920).
|
|
127
129
|
//
|
|
128
130
|
// **Each masked check is wrapped on its own, and the rest of the line runs as typed.** Most of the
|
|
129
131
|
// refusals left after #3570 were a check chained beside other work — `vitest …; pnpm josh lint:related
|
|
@@ -141,7 +143,7 @@ function keeps_verdict_intact(command: string): boolean {
|
|
|
141
143
|
const PIPEFAIL_OPEN = '(set -o pipefail; '
|
|
142
144
|
const PIPEFAIL_CLOSE = ')'
|
|
143
145
|
const COMMENT_START = /(?:^|\s)#/u
|
|
144
|
-
const FULL_READING_FILTER = /^(?:tail|grep)\b/u
|
|
146
|
+
const FULL_READING_FILTER = /^(?:tail|grep|cut|sort|uniq|wc)\b/u
|
|
145
147
|
const EARLY_EXIT_GREP =
|
|
146
148
|
/^grep\b.*\s(?:-[a-zA-Z]*[lLmq]|--(?:quiet|silent|max-count|files-with(?:out)?-match))/u
|
|
147
149
|
|
|
@@ -102,6 +102,13 @@ const ROW = {
|
|
|
102
102
|
is_trigger: bash_triggers.on_bash_command(is_poll_loop),
|
|
103
103
|
reason: POLL_LOOP_REASON,
|
|
104
104
|
decide: (): boolean => true,
|
|
105
|
+
about: {
|
|
106
|
+
title: 'Output poll loop',
|
|
107
|
+
topic: '`.claude/skills/workflow-commands/background-commands.md`',
|
|
108
|
+
fires:
|
|
109
|
+
"a hand-written `while` / `until` wait loop over a command's output, a marker file or a process. Every occurrence",
|
|
110
|
+
quiet: 'the command started with `run_in_background` — its exit ends the wait',
|
|
111
|
+
},
|
|
105
112
|
}
|
|
106
113
|
|
|
107
114
|
const poll_loop = {
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { bash_triggers } from './bash-triggers'
|
|
2
|
+
import { direct_pr_create } from './direct-pr-create'
|
|
3
|
+
import { git_argv } from './git-argv'
|
|
4
|
+
import { shell_segments } from './shell-segments'
|
|
5
|
+
|
|
6
|
+
// The trigger and the delivered text behind the `pr-merge` row of `delivered-rules.ts`: a pull
|
|
7
|
+
// request merged by the agent's own `Bash` call. A merge is Tier C, and the one authorized route is
|
|
8
|
+
// `pnpm josh followup` (and `pnpm josh observations:flush`), which merges inside its own process —
|
|
9
|
+
// the word after the wrapper is `josh`, so neither is claimed here.
|
|
10
|
+
//
|
|
11
|
+
// **The deny list matches globs; this reads the program.** `Bash(gh pr merge*)` and
|
|
12
|
+
// `Bash(gh api *pulls/*/merge*)` miss `curl -X PUT …/pulls/5/merge`, a GraphQL body read from a file
|
|
13
|
+
// (`gh api graphql -F query=@merge.graphql`), and `enablePullRequestAutoMerge`, which merges once
|
|
14
|
+
// the checks pass. A body kept in a file or computed by the shell cannot be read here, so such a
|
|
15
|
+
// GraphQL call is refused whatever it holds — kit's own GitHub calls are REST (`gh-rest.md`).
|
|
16
|
+
//
|
|
17
|
+
// **It fires on every occurrence**, for the reason `git-force.ts` does.
|
|
18
|
+
|
|
19
|
+
const GH_COMMAND = 'gh'
|
|
20
|
+
const CURL_COMMAND = 'curl'
|
|
21
|
+
const PR_GROUP = 'pr'
|
|
22
|
+
const MERGE_ACTION = 'merge'
|
|
23
|
+
const API_SUBCOMMAND = 'api'
|
|
24
|
+
const GRAPHQL_ENDPOINT = 'graphql'
|
|
25
|
+
// The REST merge endpoint, in any spelling of the number (`5`, `$N`, `${PR}`).
|
|
26
|
+
const MERGE_PATH = /pulls\/[^/\s'"]+\/merge(?![\w-])/u
|
|
27
|
+
const MERGE_MUTATIONS = /\b(?:mergePullRequest|enablePullRequestAutoMerge)\b/u
|
|
28
|
+
const GRAPHQL_URL = /\/graphql\b/u
|
|
29
|
+
// A body read from a file or stdin: `@file` / `field=@file` for `gh api -F` and curl's `-d`, a
|
|
30
|
+
// short flag with the value attached (`-d@file`), and the flags that upload a whole file.
|
|
31
|
+
const FILE_BODY_VALUE = /^(?:-[A-Za-z]|[^=\s]*=)?['"]?@/u
|
|
32
|
+
const FILE_BODY_FLAGS: ReadonlySet<string> = new Set(['--input', '-T', '--upload-file'])
|
|
33
|
+
// A body the shell computes (`query="$(cat merge.graphql)"`, backticks) is no more readable here.
|
|
34
|
+
const SUBSTITUTED_BODY = /\$\(|`/u
|
|
35
|
+
|
|
36
|
+
type ApiCall = NonNullable<ReturnType<typeof git_argv.program_of>>
|
|
37
|
+
|
|
38
|
+
// The words that are neither a flag nor a flag's value, with `gh api`'s value-taking flags, so
|
|
39
|
+
// `gh api -X POST graphql` reaches `graphql` as the endpoint.
|
|
40
|
+
function positional_words(args: ReadonlyArray<string>): Array<string> {
|
|
41
|
+
return direct_pr_create.positional_words(args, direct_pr_create.API_VALUE_TAKING_FLAGS)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function is_pr_merge_cli_call(args: ReadonlyArray<string>): boolean {
|
|
45
|
+
const [group, action] = positional_words(args)
|
|
46
|
+
|
|
47
|
+
return group === PR_GROUP && action === MERGE_ACTION
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function is_github_api_call(name: string, args: ReadonlyArray<string>): boolean {
|
|
51
|
+
if (name === CURL_COMMAND) return true
|
|
52
|
+
|
|
53
|
+
return name === GH_COMMAND && positional_words(args)[0] === API_SUBCOMMAND
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// `gh api` reaches GraphQL through its `graphql` endpoint or, like curl, through the `/graphql` path
|
|
57
|
+
// or URL (`gh api /graphql --input body.json`).
|
|
58
|
+
function is_graphql_call(name: string, args: ReadonlyArray<string>): boolean {
|
|
59
|
+
if (args.some((argument) => GRAPHQL_URL.test(argument))) return true
|
|
60
|
+
|
|
61
|
+
return name === GH_COMMAND && positional_words(args)[1] === GRAPHQL_ENDPOINT
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function is_unreadable_body(argument: string): boolean {
|
|
65
|
+
if (FILE_BODY_FLAGS.has(argument)) return true
|
|
66
|
+
|
|
67
|
+
return FILE_BODY_VALUE.test(argument) || SUBSTITUTED_BODY.test(argument)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// The segment cut ignores quotes, so a multi-line `-f query='mutation {⏎ mergePullRequest…'` leaves
|
|
71
|
+
// the mutation name in a later segment: a GraphQL call's mutation is looked for in the whole line.
|
|
72
|
+
function is_graphql_merge(command: string, name: string, args: ReadonlyArray<string>): boolean {
|
|
73
|
+
if (!is_graphql_call(name, args)) return false
|
|
74
|
+
|
|
75
|
+
return MERGE_MUTATIONS.test(command) || args.some((argument) => is_unreadable_body(argument))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function is_api_merge(command: string, segment: string, call: ApiCall): boolean {
|
|
79
|
+
if (MERGE_PATH.test(segment) || MERGE_MUTATIONS.test(segment)) return true
|
|
80
|
+
|
|
81
|
+
return is_graphql_merge(command, call.name, call.args)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function is_pr_merge_segment(command: string, segment: string): boolean {
|
|
85
|
+
const call = git_argv.program_of(segment)
|
|
86
|
+
|
|
87
|
+
if (call === undefined) return false
|
|
88
|
+
if (call.name === GH_COMMAND && is_pr_merge_cli_call(call.args)) return true
|
|
89
|
+
|
|
90
|
+
return is_github_api_call(call.name, call.args) && is_api_merge(command, segment, call)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function is_pr_merge(command: string): boolean {
|
|
94
|
+
return shell_segments
|
|
95
|
+
.commands_of(command)
|
|
96
|
+
.some((segment) => is_pr_merge_segment(command, segment))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const PR_MERGE_REASON =
|
|
100
|
+
'⛔ direct PR merge: `gh pr merge`, a `gh api` / `curl` call to `…/pulls/<N>/merge`, a ' +
|
|
101
|
+
'`mergePullRequest` / `enablePullRequestAutoMerge` mutation, or a GraphQL body read from a file ' +
|
|
102
|
+
'merges outside the verified route, and a merge is Tier C. Merge with `pnpm josh followup` when the ' +
|
|
103
|
+
'run authorizes it; otherwise leave it to the user (`CLAUDE.md` → Git Rules). This rule fires on ' +
|
|
104
|
+
'every occurrence.'
|
|
105
|
+
|
|
106
|
+
const ROW = {
|
|
107
|
+
id: 'pr-merge',
|
|
108
|
+
is_trigger: bash_triggers.on_bash_command(is_pr_merge),
|
|
109
|
+
reason: PR_MERGE_REASON,
|
|
110
|
+
decide: (): boolean => true,
|
|
111
|
+
about: {
|
|
112
|
+
title: 'Direct PR merge',
|
|
113
|
+
topic: '`CLAUDE.md` → Git Rules',
|
|
114
|
+
fires:
|
|
115
|
+
'`gh pr merge`, a `gh api` / `curl` call to `…/pulls/<N>/merge`, a `mergePullRequest` / `enablePullRequestAutoMerge` mutation, or a GraphQL body read from a file. Every occurrence',
|
|
116
|
+
quiet:
|
|
117
|
+
'`pnpm josh followup` and `pnpm josh observations:flush`, which merge in their own process',
|
|
118
|
+
},
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const pr_merge = { PR_MERGE_REASON, ROW, is_pr_merge }
|
|
122
|
+
|
|
123
|
+
export { pr_merge }
|
|
@@ -3,6 +3,7 @@ import { doctor_consumer } from '#scripts/doctor/doctor-consumer'
|
|
|
3
3
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
4
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
5
5
|
import { bash_triggers } from './bash-triggers'
|
|
6
|
+
import { git_argv } from './git-argv'
|
|
6
7
|
import { shell_segments } from './shell-segments'
|
|
7
8
|
|
|
8
9
|
// The trigger and the delivered text behind the `protected-file` row of `delivered-rules.ts`:
|
|
@@ -31,25 +32,44 @@ const SETTINGS_FILE = path.join('.claude', 'settings.json')
|
|
|
31
32
|
const WHITESPACE = /\s+/u
|
|
32
33
|
const TOKEN_QUOTES = /["']/gu
|
|
33
34
|
const INPUT_REDIRECT = '<'
|
|
35
|
+
// Programs that print a named file's bytes, or run them. `cp` and `mv` are deliberately absent: they
|
|
36
|
+
// write rather than print, and `cp .env.example .env` is how a checkout's `.env` is made.
|
|
34
37
|
const SHELL_READERS: ReadonlySet<string> = new Set([
|
|
35
38
|
'.',
|
|
36
39
|
'awk',
|
|
40
|
+
'base64',
|
|
37
41
|
'bat',
|
|
38
42
|
'cat',
|
|
43
|
+
'cmp',
|
|
44
|
+
'column',
|
|
45
|
+
'comm',
|
|
39
46
|
'cut',
|
|
47
|
+
'diff',
|
|
48
|
+
'fold',
|
|
40
49
|
'grep',
|
|
41
50
|
'head',
|
|
51
|
+
'hexdump',
|
|
52
|
+
'jq',
|
|
42
53
|
'less',
|
|
43
54
|
'more',
|
|
44
55
|
'nl',
|
|
45
56
|
'od',
|
|
57
|
+
'paste',
|
|
58
|
+
'perl',
|
|
59
|
+
'python',
|
|
60
|
+
'python3',
|
|
61
|
+
'rev',
|
|
46
62
|
'rg',
|
|
63
|
+
'ruby',
|
|
47
64
|
'sed',
|
|
48
65
|
'sort',
|
|
49
66
|
'source',
|
|
50
67
|
'strings',
|
|
68
|
+
'tac',
|
|
51
69
|
'tail',
|
|
70
|
+
'uniq',
|
|
52
71
|
'xxd',
|
|
72
|
+
'yq',
|
|
53
73
|
])
|
|
54
74
|
|
|
55
75
|
function file_path_of(call: GuardedCall): string {
|
|
@@ -80,15 +100,15 @@ function is_environment_read_segment(segment: string): boolean {
|
|
|
80
100
|
const is_redirected = words.some(
|
|
81
101
|
(word, index) => word === INPUT_REDIRECT && is_environment_path(words[index + 1] ?? ''),
|
|
82
102
|
)
|
|
83
|
-
const
|
|
103
|
+
const call = git_argv.program_of(segment)
|
|
84
104
|
|
|
85
|
-
return
|
|
86
|
-
|
|
87
|
-
)
|
|
105
|
+
if (is_redirected || call === undefined) return is_redirected
|
|
106
|
+
|
|
107
|
+
return SHELL_READERS.has(call.name) && call.args.some((word) => is_environment_path(word))
|
|
88
108
|
}
|
|
89
109
|
|
|
90
110
|
function is_environment_shell_read(command: string): boolean {
|
|
91
|
-
return shell_segments.
|
|
111
|
+
return shell_segments.commands_of(command).some((segment) => is_environment_read_segment(segment))
|
|
92
112
|
}
|
|
93
113
|
|
|
94
114
|
function is_environment_read(call: GuardedCall): boolean {
|
|
@@ -130,6 +150,13 @@ const ROW = {
|
|
|
130
150
|
decide: (): boolean => true,
|
|
131
151
|
// The opening the reason carried before it was cut to the action and the next command.
|
|
132
152
|
former_reasons: ['⛔ protected file: `.env` holds the Telegram bot token'],
|
|
153
|
+
about: {
|
|
154
|
+
title: 'Protected file',
|
|
155
|
+
topic: '`operating-rules.md`',
|
|
156
|
+
fires:
|
|
157
|
+
'a `Read` of `.env`, or an `Edit` / `Write` of `.claude/settings.json` outside kit. Every occurrence',
|
|
158
|
+
quiet: "kit itself, or the user's `~/.claude/settings.json`",
|
|
159
|
+
},
|
|
133
160
|
}
|
|
134
161
|
|
|
135
162
|
const protected_files = { ROW, is_protected_file_call }
|
|
@@ -44,6 +44,12 @@ const ROW = {
|
|
|
44
44
|
is_trigger: bash_triggers.on_bash_command(posts_at_path_literally),
|
|
45
45
|
reason: RAW_FIELD_BODY_REASON,
|
|
46
46
|
decide: (): boolean => true,
|
|
47
|
+
about: {
|
|
48
|
+
title: 'Posting `@path` literally',
|
|
49
|
+
topic: '`shell-body.md`',
|
|
50
|
+
fires: 'a raw field (`-f` / `--raw-field`) passing `body=@<path>`. Every occurrence',
|
|
51
|
+
quiet: '`-F` / `--field body=@`, a body without `@`, or `pnpm josh issue:comment`',
|
|
52
|
+
},
|
|
47
53
|
}
|
|
48
54
|
|
|
49
55
|
const raw_field_body = { RAW_FIELD_BODY_REASON, ROW, posts_at_path_literally }
|
|
@@ -178,6 +178,14 @@ const ROW = {
|
|
|
178
178
|
reason: RULE_BODY_REASON,
|
|
179
179
|
already_satisfied: answered_placement,
|
|
180
180
|
keeps: bash_triggers.on_bash_command(runs_placement_oracle),
|
|
181
|
+
about: {
|
|
182
|
+
title: 'Question 0 and the ordering question before writing a rule into prose',
|
|
183
|
+
topic: '`residency.md`',
|
|
184
|
+
fires:
|
|
185
|
+
'an `Edit` / `Write` to `CLAUDE.md` / `prompts/**/*.md` / `.claude/skills/**/*.md` appending at least the threshold. Refused until both `pnpm josh oracle:list` and `pnpm josh run:step` ran',
|
|
186
|
+
quiet:
|
|
187
|
+
'not a rule document, an append under the threshold (typo, link swap, deletion), or both commands ran',
|
|
188
|
+
},
|
|
181
189
|
}
|
|
182
190
|
|
|
183
191
|
const rule_body_guard = {
|
|
@@ -1,51 +1,35 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { delivered_rules } from './delivered-rules'
|
|
4
|
-
import {
|
|
4
|
+
import { guard_remedy } from './guard-remedy'
|
|
5
|
+
import { stop_rule_rows, type StopRule } from './stop-rule-rows'
|
|
5
6
|
|
|
6
7
|
// `josh rule:list` — the list of trigger-delivered rules, rendered from the guard rows themselves.
|
|
7
8
|
// One item per `MEASURED_RULES` row in delivery order, then the `Stop`
|
|
8
9
|
// hook's rows; each carries its single source, the call it fires on and the turn it stays silent on.
|
|
9
|
-
// The prose is `
|
|
10
|
-
// there is listed without a document edit — and a row with no registry entry is listed as missing.
|
|
10
|
+
// The prose is each row's own `about`, so a row added there is listed without a document edit.
|
|
11
11
|
|
|
12
12
|
const HEADER =
|
|
13
13
|
'# Trigger-delivered rules — rendered by `pnpm josh rule:list` from `scripts/rules/delivered-rules.ts`'
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
function item(id: string, rule: RegisteredRule | undefined): string {
|
|
17
|
-
if (rule === undefined) return `- \`${id}\` ${MISSING}`
|
|
14
|
+
const MISSING_WHY = '(no `why` in `scripts/rules/guard-remedy.ts`)'
|
|
18
15
|
|
|
16
|
+
function item({ id, about }: StopRule): string {
|
|
19
17
|
return [
|
|
20
|
-
`- **${
|
|
21
|
-
` - fires: \`${
|
|
22
|
-
` - silent: ${
|
|
18
|
+
`- **${about.title}** (\`${id}\`, ${about.topic})`,
|
|
19
|
+
` - fires: \`${about.entry ?? delivered_rules.PRETOOL_GUARD}\` — ${about.fires}`,
|
|
20
|
+
` - silent: ${about.quiet}`,
|
|
21
|
+
` - not automated: ${guard_remedy.why_of(id) ?? MISSING_WHY}`,
|
|
23
22
|
].join('\n')
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
function row_ids(): ReadonlyArray<string> {
|
|
27
|
-
return delivered_rules.MEASURED_RULES.map((rule) => rule.id)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
25
|
function render(): string {
|
|
31
|
-
const rows =
|
|
32
|
-
const stops = rule_registry.STOP_ROWS.map((rule) => item(rule.id, rule))
|
|
33
|
-
|
|
34
|
-
return [HEADER, '', ...rows, ...stops].join('\n')
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Registry entries no guard row reaches — a renamed or removed row left its prose behind.
|
|
38
|
-
function orphans(): ReadonlyArray<string> {
|
|
39
|
-
const reached = new Set(row_ids().map((id) => rule_registry.registry_id(id)))
|
|
40
|
-
const stop_ids = new Set(rule_registry.STOP_ROWS.map((rule) => rule.id))
|
|
26
|
+
const rows = [...delivered_rules.MEASURED_RULES, ...stop_rule_rows.ROWS].map((rule) => item(rule))
|
|
41
27
|
|
|
42
|
-
return
|
|
43
|
-
(id) => !reached.has(id) && !stop_ids.has(id),
|
|
44
|
-
)
|
|
28
|
+
return [HEADER, '', ...rows].join('\n')
|
|
45
29
|
}
|
|
46
30
|
|
|
47
31
|
if (process.argv[1] === fileURLToPath(import.meta.url)) process.stdout.write(`${render()}\n`)
|
|
48
32
|
|
|
49
|
-
const rule_list = {
|
|
33
|
+
const rule_list = { MISSING_WHY, render }
|
|
50
34
|
|
|
51
35
|
export { rule_list }
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
+
import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
|
|
4
|
+
import { time_hook_transcript } from '#scripts/time-runtime/time-hook-transcript'
|
|
5
|
+
import { delivered_rules, type DeliveredRule } from './delivered-rules'
|
|
6
|
+
import { guard_remedy } from './guard-remedy'
|
|
7
|
+
|
|
8
|
+
// The call a `PreToolUse` hook runs in place of a mechanically fixable refusal (joshuafolkken/kit#3920).
|
|
9
|
+
// Each row `guard-remedy.ts` classes as a rewrite gets the call in turn, so one line that both pipes a
|
|
10
|
+
// check and reads a body is made right by both rows. The rewrite is the rule guard's delivery, so the
|
|
11
|
+
// rule guard's switch turns it off too.
|
|
12
|
+
|
|
13
|
+
interface RuleRewrite {
|
|
14
|
+
// The payload carrying the rewritten input, which the guards judge in place of the typed one.
|
|
15
|
+
payload: string
|
|
16
|
+
input: Record<string, unknown>
|
|
17
|
+
// The notes of the rows that rewrote, in row order.
|
|
18
|
+
note: string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface Folded {
|
|
22
|
+
input: Record<string, unknown>
|
|
23
|
+
notes: ReadonlyArray<string>
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const REWRITING_RULES: ReadonlyArray<DeliveredRule> = delivered_rules.DELIVERED_RULES.filter(
|
|
27
|
+
(rule) => guard_remedy.is_rewrite(rule.id) && rule.rewrite !== undefined,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
const NOTE_SEPARATOR = '\n\n'
|
|
31
|
+
|
|
32
|
+
// **A tail that cannot be read is an empty one**, as every guard fails open (`hook-decision.ts`): a
|
|
33
|
+
// throw here would end the hook before any guard judged the call.
|
|
34
|
+
function read_payload_tail(raw_payload: string): string {
|
|
35
|
+
try {
|
|
36
|
+
const payload = hook_decision.parse_hook_payload(raw_payload)
|
|
37
|
+
|
|
38
|
+
return payload
|
|
39
|
+
? time_density_hook.read_tail(
|
|
40
|
+
time_hook_transcript.transcript_of(payload.transcript_path, payload.agent_id),
|
|
41
|
+
)
|
|
42
|
+
: ''
|
|
43
|
+
} catch {
|
|
44
|
+
return ''
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function tail_reader(raw_payload: string): () => string {
|
|
49
|
+
const cache: { tail?: string } = {}
|
|
50
|
+
|
|
51
|
+
return function tail(): string {
|
|
52
|
+
cache.tail ??= read_payload_tail(raw_payload)
|
|
53
|
+
|
|
54
|
+
return cache.tail
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function fold(name: string, typed: Record<string, unknown>, tail: () => string): Folded {
|
|
59
|
+
const folded: Folded = { input: typed, notes: [] }
|
|
60
|
+
|
|
61
|
+
for (const rule of REWRITING_RULES) {
|
|
62
|
+
const input = rule.rewrite?.({ name, input: folded.input }, tail)
|
|
63
|
+
|
|
64
|
+
if (input === undefined) {
|
|
65
|
+
continue
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
folded.input = input
|
|
69
|
+
folded.notes = [...folded.notes, rule.rewrite_note ?? '']
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return folded
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// The typed call, beside the whole payload its rewrite is spread back into.
|
|
76
|
+
interface TypedPayload {
|
|
77
|
+
fields: Record<string, unknown>
|
|
78
|
+
name: string
|
|
79
|
+
input: Record<string, unknown>
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function typed_payload(raw_payload: string): TypedPayload | undefined {
|
|
83
|
+
const fields = json_value.parse_or_undefined(raw_payload)
|
|
84
|
+
|
|
85
|
+
if (!json_value.is_record(fields)) return undefined
|
|
86
|
+
|
|
87
|
+
const input = fields['tool_input']
|
|
88
|
+
|
|
89
|
+
return json_value.is_record(input)
|
|
90
|
+
? { fields, name: String(fields['tool_name']), input }
|
|
91
|
+
: undefined
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function rewrite(raw_payload: string): RuleRewrite | undefined {
|
|
95
|
+
const typed = delivered_rules.is_enabled() ? typed_payload(raw_payload) : undefined
|
|
96
|
+
|
|
97
|
+
if (typed === undefined) return undefined
|
|
98
|
+
|
|
99
|
+
const { input, notes } = fold(typed.name, typed.input, tail_reader(raw_payload))
|
|
100
|
+
|
|
101
|
+
if (notes.length === 0) return undefined
|
|
102
|
+
|
|
103
|
+
const note = notes.join(NOTE_SEPARATOR)
|
|
104
|
+
|
|
105
|
+
return { payload: JSON.stringify({ ...typed.fields, tool_input: input }), input, note }
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const rule_rewrite = {
|
|
109
|
+
NOTE_SEPARATOR,
|
|
110
|
+
rewrite,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export type { RuleRewrite }
|
|
114
|
+
export { rule_rewrite }
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process'
|
|
2
|
-
import {
|
|
2
|
+
import { statSync } from 'node:fs'
|
|
3
3
|
import path from 'node:path'
|
|
4
|
+
import { atomic_write } from '#scripts/lib/atomic-write'
|
|
4
5
|
import { file_reader } from '#scripts/lib/read-file'
|
|
6
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
5
7
|
|
|
6
8
|
// The `rule:value` reading at the `backlogrun` loop head, without the loop waiting on it.
|
|
7
9
|
// Measuring re-reads every transcript and takes minutes, and `backlog:offer`
|
|
@@ -16,12 +18,10 @@ const CACHE_DIRECTORY = ['node_modules', '.cache', 'josh']
|
|
|
16
18
|
const CACHE_FILE = 'rule-value.txt'
|
|
17
19
|
// Touched when a refresh starts, so the loop head starts at most one per interval however often it runs.
|
|
18
20
|
const STAMP_FILE = 'rule-value.stamp'
|
|
19
|
-
const MS_PER_MINUTE = 60_000
|
|
20
21
|
const REFRESH_MINUTES = 15
|
|
21
22
|
const REFRESH_MS = REFRESH_MINUTES * MS_PER_MINUTE
|
|
22
23
|
const REFRESH_ARGV = ['josh', 'rule:value', '--refresh']
|
|
23
24
|
const PNPM = 'pnpm'
|
|
24
|
-
const TEMPORARY_SUFFIX = '.tmp'
|
|
25
25
|
|
|
26
26
|
interface CachePorts {
|
|
27
27
|
now: () => number
|
|
@@ -45,12 +45,7 @@ function is_refresh_due(cwd: string, now_ms: number): boolean {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
function write_cache_file(cwd: string, file: string, text: string): void {
|
|
48
|
-
|
|
49
|
-
const temporary = `${target}${TEMPORARY_SUFFIX}`
|
|
50
|
-
|
|
51
|
-
mkdirSync(path.dirname(target), { recursive: true })
|
|
52
|
-
writeFileSync(temporary, text)
|
|
53
|
-
renameSync(temporary, target)
|
|
48
|
+
atomic_write.replace_file(cache_path(cwd, file), text)
|
|
54
49
|
}
|
|
55
50
|
|
|
56
51
|
function ignore_spawn_error(): void {
|