@joshuafolkken/kit 1.1514.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 +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- 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 +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- 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-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- 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 +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- 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 +2 -3
- 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 +53 -6
- 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 +30 -7
- 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 +52 -39
- 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 +112 -30
- 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 +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- 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 +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- 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 +19 -66
- 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 +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- 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 +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- 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 +27 -24
- 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-write.ts +67 -29
- 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/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 +2 -2
- package/scripts/git/main-merge.ts +25 -9
- 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 +0 -8
- 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 +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- 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 +1 -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 +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- 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 +2 -10
- 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 +0 -11
- 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/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 +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- 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 +25 -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 +103 -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 +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- 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 +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- 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 +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- 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 +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- 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-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 +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- 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 +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- 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 +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- 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 +11 -2
- 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 +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -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 +2 -6
- 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 +2 -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.ts +1 -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 +81 -15
- 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 +8 -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 +80 -2
- 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 +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -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 +9 -1
- 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/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- 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 +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- 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 -32
- 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 +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- 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 +116 -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 +239 -60
- 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 +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- 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 -48
- 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 +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -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 +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- 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-handoff.ts +2 -2
- 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 +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- 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-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- 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 +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- 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 +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- 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.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 +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- 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 +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- 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 +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- 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-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- 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 +25 -1
- 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 +42 -24
- 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 +61 -149
- 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 +97 -10
- 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 +4 -1
- 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-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- 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/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- 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 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_grep_hits, type Hit } from '#scripts/git/git-grep-hits'
|
|
4
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
5
|
+
import { review_readers_scan, type Edited } from './review-readers-scan'
|
|
6
|
+
|
|
7
|
+
// The readers outside the diff of each exported name the diff edits, listed in the brief
|
|
8
|
+
// (joshuafolkken/kit#4515). A reader the change left on the old meaning was the most common kind of
|
|
9
|
+
// finding that stopped a lane review; the self-check's "Every caller moved with it" asked for the
|
|
10
|
+
// search and left it to the implementer, and this does it mechanically for the reviewer to read.
|
|
11
|
+
//
|
|
12
|
+
// **A reader is a line outside the changed paths that names the edited name as a word** — a
|
|
13
|
+
// re-derivation or an alias is not found, and the list says so. A grep that could not run is printed
|
|
14
|
+
// as such, never as "no readers".
|
|
15
|
+
|
|
16
|
+
const SOURCE_FILE = /\.(?:ts|js)$/u
|
|
17
|
+
const SEARCH_PATHS = ['*.ts', '*.js', '*.svelte', ':(exclude)*.snap']
|
|
18
|
+
const WORD_FLAG = '-w'
|
|
19
|
+
const MAX_HITS = 10
|
|
20
|
+
const MAX_NAMES = 30
|
|
21
|
+
const HEADING = '## Readers outside the diff'
|
|
22
|
+
const ROLE_LINE =
|
|
23
|
+
'Each exported name this change edits, with every line outside the changed paths that names it (`git grep -w`). Check each reader still holds under the new meaning — the self-check\'s "Every caller moved with it" (`prompts/review.md`). A reader left on the old meaning is a finding at the reader\'s `file:line`. A reader reaching the name through an alias or a re-derivation is not listed.'
|
|
24
|
+
const SEARCH_FAILED = ' - git grep failed; not searched'
|
|
25
|
+
const READ_FAILED = 'The readers outside the diff could not be read; search them yourself:'
|
|
26
|
+
const OMITTED_TAIL = 'not searched; search their readers yourself'
|
|
27
|
+
|
|
28
|
+
interface Readers {
|
|
29
|
+
target: string
|
|
30
|
+
origin: string
|
|
31
|
+
hits: ReadonlyArray<Hit>
|
|
32
|
+
has_failed: boolean
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// `omitted` counts the edited names past `MAX_NAMES`, which were never searched.
|
|
36
|
+
interface ReadersRead {
|
|
37
|
+
readers: ReadonlyArray<Readers>
|
|
38
|
+
omitted: number
|
|
39
|
+
has_failed: boolean
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const NO_READ: ReadersRead = { readers: [], omitted: 0, has_failed: false }
|
|
43
|
+
const FAILED_READ: ReadersRead = { readers: [], omitted: 0, has_failed: true }
|
|
44
|
+
|
|
45
|
+
interface ReadRequest {
|
|
46
|
+
root: string
|
|
47
|
+
base: string
|
|
48
|
+
paths: ReadonlyArray<string>
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface FileEdits {
|
|
52
|
+
relative: string
|
|
53
|
+
edits: ReadonlyArray<Edited>
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function file_edits(request: ReadRequest, relative: string): Promise<FileEdits> {
|
|
57
|
+
const { root, base } = request
|
|
58
|
+
const diff = await git_spawn.read(['-C', root, 'diff', '-U0', '--no-color', base, '--', relative])
|
|
59
|
+
|
|
60
|
+
if (diff.length === 0) return { relative, edits: [] }
|
|
61
|
+
|
|
62
|
+
// A path the change deletes has no text; its readers fail the typecheck rather than read stale.
|
|
63
|
+
try {
|
|
64
|
+
const source = readFileSync(path.join(root, relative), 'utf8')
|
|
65
|
+
|
|
66
|
+
return { relative, edits: review_readers_scan.edited(source, diff) }
|
|
67
|
+
} catch {
|
|
68
|
+
return { relative, edits: [] }
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function excluded(paths: ReadonlyArray<string>): Array<string> {
|
|
73
|
+
return paths.map((relative) => `:(exclude,literal)${relative}`)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function readers_of(request: ReadRequest, entry: FileEdits, edit: Edited): Promise<Readers> {
|
|
77
|
+
const pathspecs = [...SEARCH_PATHS, ...excluded(request.paths)]
|
|
78
|
+
const found = await git_grep_hits.search(edit.target, [WORD_FLAG], pathspecs, request.root)
|
|
79
|
+
|
|
80
|
+
return { target: edit.target, origin: `${entry.relative}:${String(edit.line)}`, ...found }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Every edited name, with its readers outside `paths`. Only names that have a reader, or whose search
|
|
84
|
+
// failed, are returned; the names past the cap are counted, never dropped silently.
|
|
85
|
+
async function read(request: ReadRequest): Promise<ReadersRead> {
|
|
86
|
+
const sources = request.paths.filter((relative) => SOURCE_FILE.test(relative))
|
|
87
|
+
const files = await Promise.all(
|
|
88
|
+
sources.map(async (relative) => await file_edits(request, relative)),
|
|
89
|
+
)
|
|
90
|
+
const pairs = files.flatMap((entry) => entry.edits.map((edit) => ({ entry, edit })))
|
|
91
|
+
const capped = pairs.slice(0, MAX_NAMES)
|
|
92
|
+
const all = await Promise.all(
|
|
93
|
+
capped.map(async ({ entry, edit }) => await readers_of(request, entry, edit)),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
const readers = all.filter((entry) => entry.has_failed || entry.hits.length > 0)
|
|
97
|
+
|
|
98
|
+
return { readers, omitted: pairs.length - capped.length, has_failed: false }
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function hit_line(hit: Hit): string {
|
|
102
|
+
return ` - ${hit.path}:${hit.line} ${hit.excerpt}`
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function readers_lines(readers: Readers): Array<string> {
|
|
106
|
+
const head = `- \`${readers.target}\` — ${readers.origin}`
|
|
107
|
+
|
|
108
|
+
if (readers.has_failed) return [head, SEARCH_FAILED]
|
|
109
|
+
|
|
110
|
+
const more = readers.hits.length - MAX_HITS
|
|
111
|
+
const tail = more > 0 ? [` - … and ${String(more)} more`] : []
|
|
112
|
+
|
|
113
|
+
return [head, ...readers.hits.slice(0, MAX_HITS).map((hit) => hit_line(hit)), ...tail]
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function omitted_lines(omitted: number): Array<string> {
|
|
117
|
+
if (omitted === 0) return []
|
|
118
|
+
|
|
119
|
+
return [`- … and ${String(omitted)} more edited names ${OMITTED_TAIL}`]
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// A read that failed as a whole says so, never reads as a change with no reader outside it; absent
|
|
123
|
+
// or empty, no section.
|
|
124
|
+
function brief_block(read_result: ReadersRead = NO_READ): ReadonlyArray<string> {
|
|
125
|
+
const { readers, omitted, has_failed } = read_result
|
|
126
|
+
|
|
127
|
+
if (has_failed) return ['', `${HEADING}\n${READ_FAILED}`]
|
|
128
|
+
if (omitted === 0 && readers.length === 0) return []
|
|
129
|
+
|
|
130
|
+
const listed = readers.flatMap((entry) => readers_lines(entry))
|
|
131
|
+
|
|
132
|
+
return ['', [HEADING, ROLE_LINE, ...listed, ...omitted_lines(omitted)].join('\n')]
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const review_untouched_readers = {
|
|
136
|
+
brief_block,
|
|
137
|
+
FAILED_READ,
|
|
138
|
+
HEADING,
|
|
139
|
+
MAX_NAMES,
|
|
140
|
+
OMITTED_TAIL,
|
|
141
|
+
read,
|
|
142
|
+
READ_FAILED,
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export type { Readers, ReadersRead }
|
|
146
|
+
export { review_untouched_readers }
|
|
@@ -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 }
|
|
@@ -52,6 +52,14 @@ const ROW = {
|
|
|
52
52
|
decide: (): boolean => true,
|
|
53
53
|
keeps: keeps_model,
|
|
54
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
|
+
},
|
|
55
63
|
}
|
|
56
64
|
|
|
57
65
|
const agent_model = { AGENT_MODEL_REASON, ROW, is_unnamed_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
|
{
|
|
@@ -5,6 +5,7 @@ import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-b
|
|
|
5
5
|
import { agent_model } from './agent-model'
|
|
6
6
|
import { bash_triggers } from './bash-triggers'
|
|
7
7
|
import { direct_filing } from './direct-filing'
|
|
8
|
+
import { direct_issue_comment } from './direct-issue-comment'
|
|
8
9
|
import { early_heartbeat } from './early-heartbeat'
|
|
9
10
|
import { file_body } from './file-body'
|
|
10
11
|
import { filing_cap } from './filing-cap'
|
|
@@ -14,6 +15,7 @@ import { issue_comments } from './issue-comments'
|
|
|
14
15
|
import { josh_git_bare } from './josh-git-bare'
|
|
15
16
|
import { lane_background } from './lane-background'
|
|
16
17
|
import { lane_carry_conflict } from './lane-carry-conflict'
|
|
18
|
+
import { lane_direct_tool } from './lane-direct-tool'
|
|
17
19
|
import { lane_interactive_ask } from './lane-interactive-ask'
|
|
18
20
|
import { lane_park } from './lane-park'
|
|
19
21
|
import { lane_split_park } from './lane-split-park'
|
|
@@ -29,6 +31,7 @@ import { run_tail_rule } from './run-tail-rule'
|
|
|
29
31
|
import { shell_body_trigger } from './shell-body-trigger'
|
|
30
32
|
import { test_declared_commit } from './test-declared-commit'
|
|
31
33
|
import { third_party_write } from './third-party-write'
|
|
34
|
+
import { timed_rerun } from './timed-rerun'
|
|
32
35
|
import { worktree_guard } from './worktree-guard'
|
|
33
36
|
|
|
34
37
|
// The rules delivered by a `PreToolUse` refusal at the moment they bind, rather than carried resident
|
|
@@ -50,12 +53,29 @@ type CallTest = (
|
|
|
50
53
|
// The tail is read lazily: most calls no rewrite applies to never need it.
|
|
51
54
|
type CallRewrite = (call: GuardedCall, tail: () => string) => Record<string, unknown> | undefined
|
|
52
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
|
+
|
|
53
72
|
// `id` keys the rule's own refusal record, so one rule firing never spends another's budget.
|
|
54
73
|
interface DeliveredRule {
|
|
55
74
|
id: string
|
|
56
75
|
is_trigger: (call: GuardedCall) => boolean
|
|
57
76
|
// The only text that reaches the model: the instruction and the pointer.
|
|
58
77
|
reason: string
|
|
78
|
+
about: RuleAbout
|
|
59
79
|
// A stand-down when an earlier act on the tail already satisfied the rule; checked first, so a
|
|
60
80
|
// satisfied call spends no record.
|
|
61
81
|
already_satisfied?: (tail: string, call: GuardedCall) => boolean
|
|
@@ -78,7 +98,7 @@ interface DeliveredRule {
|
|
|
78
98
|
former_reasons?: ReadonlyArray<string>
|
|
79
99
|
}
|
|
80
100
|
|
|
81
|
-
// 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`
|
|
82
102
|
// would refuse one violation twice — so `is_trigger` is optional here.
|
|
83
103
|
type MeasuredRule = Omit<DeliveredRule, 'is_trigger'> & {
|
|
84
104
|
is_trigger?: DeliveredRule['is_trigger']
|
|
@@ -98,6 +118,9 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
98
118
|
// The direct call only; `filing-cap` below triggers on `issue:file`. The WIP cap and the fold
|
|
99
119
|
// question are `issue:file`'s own steps, so no row gates them.
|
|
100
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,
|
|
101
124
|
filing_cap.ROW,
|
|
102
125
|
issue_comments.ROW,
|
|
103
126
|
{
|
|
@@ -106,6 +129,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
106
129
|
reason: SHELL_BODY_REASON,
|
|
107
130
|
keeps: on_bash_command(keeps_body_safe),
|
|
108
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
|
+
},
|
|
109
139
|
},
|
|
110
140
|
raw_field_body.ROW,
|
|
111
141
|
{
|
|
@@ -117,6 +147,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
117
147
|
// A masking whose filter reads to the end is rewritten under `pipefail`, never refused.
|
|
118
148
|
rewrite: piped_verification.pipefail_input,
|
|
119
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
|
+
},
|
|
120
157
|
},
|
|
121
158
|
{
|
|
122
159
|
id: 'early-heartbeat',
|
|
@@ -125,6 +162,14 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
125
162
|
decide: early_heartbeat.decide,
|
|
126
163
|
keeps: on_bash_command(early_heartbeat.is_progress_watch),
|
|
127
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
|
+
},
|
|
128
173
|
},
|
|
129
174
|
// Before `run-tail`: whether to commit at all is decided before how to push.
|
|
130
175
|
test_declared_commit.ROW,
|
|
@@ -138,6 +183,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
138
183
|
decide: run_tail_rule.decide,
|
|
139
184
|
keeps: run_tail_rule.is_backgrounded_push_step,
|
|
140
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
|
+
},
|
|
141
193
|
},
|
|
142
194
|
// Reads the lane name and the cut record. Once per run, not `decide`: taking the cut ends the
|
|
143
195
|
// process, and the verdicts that leave a run at the gate all need the reissue through. `reaches`
|
|
@@ -149,6 +201,13 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
149
201
|
reason: pre_gate_cut.PRE_GATE_CUT_REASON,
|
|
150
202
|
keeps: on_bash_command(pre_gate_cut.takes_the_cut),
|
|
151
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
|
+
},
|
|
152
211
|
},
|
|
153
212
|
// A split child's park is refused before `lane-park` sees it.
|
|
154
213
|
lane_split_park.ROW,
|
|
@@ -157,6 +216,10 @@ const DELIVERED_RULES: ReadonlyArray<DeliveredRule> = [
|
|
|
157
216
|
agent_model.ROW,
|
|
158
217
|
lane_carry_conflict.ROW,
|
|
159
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,
|
|
160
223
|
// Disjoint from `run-tail` by the `-y` flag.
|
|
161
224
|
josh_git_bare.ROW,
|
|
162
225
|
// The Bash-string gaps the deny glob cannot express, read by argv; `delivered-rules-bash.test.ts`
|
|
@@ -186,6 +249,13 @@ const BATCHING_RULE: MeasuredRule = {
|
|
|
186
249
|
reason: time_batch_guard.REASON,
|
|
187
250
|
keeps: batches_the_turn,
|
|
188
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
|
+
},
|
|
189
259
|
}
|
|
190
260
|
|
|
191
261
|
// No `is_trigger`, as for batching. No `keeps`: any dispatch would read as compliance, so it is left
|
|
@@ -194,6 +264,13 @@ const INVESTIGATION_RULE: MeasuredRule = {
|
|
|
194
264
|
id: 'investigation',
|
|
195
265
|
reason: investigation_reads.REASON,
|
|
196
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
|
+
},
|
|
197
274
|
}
|
|
198
275
|
|
|
199
276
|
const MEASURED_RULES: ReadonlyArray<MeasuredRule> = [
|
|
@@ -300,6 +377,7 @@ const delivered_rules = {
|
|
|
300
377
|
PIPED_VERIFICATION_REASON: piped_verification.PIPED_VERIFICATION_REASON,
|
|
301
378
|
POLL_LOOP_REASON: poll_loop.POLL_LOOP_REASON,
|
|
302
379
|
PRE_GATE_CUT_REASON: pre_gate_cut.PRE_GATE_CUT_REASON,
|
|
380
|
+
PRETOOL_GUARD,
|
|
303
381
|
RAW_FIELD_BODY_REASON: raw_field_body.RAW_FIELD_BODY_REASON,
|
|
304
382
|
RUN_TAIL_REASON: run_tail_rule.RUN_TAIL_REASON,
|
|
305
383
|
SHELL_BODY_REASON,
|
|
@@ -313,5 +391,5 @@ const delivered_rules = {
|
|
|
313
391
|
is_issue_filing,
|
|
314
392
|
}
|
|
315
393
|
|
|
316
|
-
export type { CallRewrite, DeliveredRule, MeasuredRule }
|
|
394
|
+
export type { CallRewrite, DeliveredRule, MeasuredRule, RuleAbout }
|
|
317
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 }
|