@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
|
@@ -26,7 +26,7 @@ import { run_tail_rule } from './run-tail-rule'
|
|
|
26
26
|
// killed at the turn's end before any supervisor exists. Issued in the foreground it returns at
|
|
27
27
|
// `launched` within the tool timeout, and the supervisor carries the rest. A backgrounded `ship` alone
|
|
28
28
|
// is not refused but rewritten into that foreground call (`foreground_input`); one chained after
|
|
29
|
-
// another long command is refused.
|
|
29
|
+
// another long command is refused. A foreground `ship` without the cap is given it the same way.
|
|
30
30
|
//
|
|
31
31
|
// **Its stop-time half reads the same fact from the other side.** A backgrounded task the transcript
|
|
32
32
|
// launched but never saw finish is still running, and in a child the stop about to happen kills it —
|
|
@@ -43,9 +43,10 @@ const LONG_RUNNING_COMMANDS: ReadonlySet<string> = new Set([
|
|
|
43
43
|
|
|
44
44
|
const BACKGROUND_KEY = 'run_in_background'
|
|
45
45
|
const TIMEOUT_KEY = 'timeout'
|
|
46
|
-
// The longest a foreground Bash call may run. A
|
|
47
|
-
// does may exceed the foreground cap, so the rewrite sets it: left at the two-minute default, a
|
|
48
|
-
// whose scoped pair outruns it is cut before `launched
|
|
46
|
+
// The longest a foreground Bash call may run. A `ship` rarely carries a `timeout`, and a backgrounded one
|
|
47
|
+
// that does may exceed the foreground cap, so the rewrite sets it: left at the two-minute default, a
|
|
48
|
+
// preflight whose scoped pair outruns it is cut before `launched` (#3027) or moved to the background and
|
|
49
|
+
// killed with the turn (#4101).
|
|
49
50
|
const FOREGROUND_TIMEOUT_MS = 600_000
|
|
50
51
|
|
|
51
52
|
function is_backgrounded(input: unknown): boolean {
|
|
@@ -101,38 +102,72 @@ function is_background_long_run(
|
|
|
101
102
|
return is_candidate(call) && is_lane_child()
|
|
102
103
|
}
|
|
103
104
|
|
|
104
|
-
//
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
// The input of a Bash call whose long-running work is `ship` alone, or `undefined` for any other call.
|
|
106
|
+
function ship_alone_input(call: GuardedCall): Record<string, unknown> | undefined {
|
|
107
|
+
if (call.name !== cost_blocks.BASH_TOOL || !json_value.is_record(call.input)) return undefined
|
|
108
|
+
|
|
109
|
+
return ships_alone(time_shell.bash_command(call.input)) ? call.input : undefined
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// A foreground call that already carries the foreground cap, which the harness never moves aside.
|
|
113
|
+
function is_capped_foreground(input: Record<string, unknown>): boolean {
|
|
114
|
+
const timeout = input[TIMEOUT_KEY]
|
|
115
|
+
|
|
116
|
+
return !is_backgrounded(input) && typeof timeout === 'number' && timeout >= FOREGROUND_TIMEOUT_MS
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// **A `ship` in a child is run in the foreground at the cap, not refused**. The refusal of a
|
|
120
|
+
// backgrounded one asked for nothing but the same call in the foreground — 14 of 41 lane `ship`
|
|
121
|
+
// refusals in one measured backlogrun were that round trip, paid at the run's largest context.
|
|
122
|
+
//
|
|
123
|
+
// A foreground one at the two-minute default is moved aside once its preflight outruns it, and dies
|
|
124
|
+
// the same way (joshuafolkken/kit#4101). The input with the flag cleared and the cap set, or
|
|
125
|
+
// `undefined` for every call this does not apply to.
|
|
108
126
|
function foreground_input(
|
|
109
127
|
call: GuardedCall,
|
|
110
128
|
is_lane_child: () => boolean = () => lane_child_marker.is_child_of(process.cwd()),
|
|
111
129
|
): Record<string, unknown> | undefined {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
130
|
+
const input = ship_alone_input(call)
|
|
131
|
+
|
|
132
|
+
if (input === undefined || is_capped_foreground(input) || !is_lane_child()) return undefined
|
|
115
133
|
|
|
116
|
-
return { ...
|
|
134
|
+
return { ...input, [BACKGROUND_KEY]: false, [TIMEOUT_KEY]: FOREGROUND_TIMEOUT_MS }
|
|
117
135
|
}
|
|
118
136
|
|
|
119
137
|
const FOREGROUND_NOTE =
|
|
120
|
-
|
|
121
|
-
'before its supervisor exists — so it was run in the
|
|
122
|
-
'after the preflight. End the turn on
|
|
138
|
+
"lane background: a lane child's `josh ship` backgrounded, by its flag or by outrunning the Bash " +
|
|
139
|
+
'timeout, dies with the headless turn before its supervisor exists — so it was run in the ' +
|
|
140
|
+
'foreground at the 600000 ms cap, where it detaches itself after the preflight. End the turn on ' +
|
|
141
|
+
'`launched` / `busy`.'
|
|
142
|
+
|
|
143
|
+
type LaunchedIds = (block: TranscriptBlock) => ReadonlyArray<string>
|
|
144
|
+
|
|
145
|
+
// One line's word on each id: a launch opens it, a finish notice closes it.
|
|
146
|
+
function apply_line(open: Set<string>, line: string, launched_ids: LaunchedIds): void {
|
|
147
|
+
const parsed = time_transcript_line.parse_line(line)
|
|
148
|
+
|
|
149
|
+
if (parsed === undefined) return
|
|
150
|
+
|
|
151
|
+
const launched = parsed.blocks.flatMap((block) => launched_ids(block))
|
|
152
|
+
|
|
153
|
+
for (const id of launched) open.add(id)
|
|
154
|
+
open.delete(parsed.finished_background)
|
|
155
|
+
}
|
|
123
156
|
|
|
124
157
|
// The launches `launched_ids` reads off the transcript tail that never saw their finish. A launch is
|
|
125
|
-
// read off its own tool result and a finish off the harness notice, both by
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
158
|
+
// read off its own tool result and a finish off the harness notice or a `TaskStop` result, both by
|
|
159
|
+
// `time_transcript_line`.
|
|
160
|
+
//
|
|
161
|
+
// **Read in order, so the later word on an id wins.** A subagent resumed by `SendMessage` runs again
|
|
162
|
+
// under the id its first run's notice already named; a set of every finish ever seen would read the
|
|
163
|
+
// resumed run as finished (joshuafolkken/kit#4347).
|
|
164
|
+
function unfinished_ids(tail: string, launched_ids: LaunchedIds): ReadonlyArray<string> {
|
|
165
|
+
const open = new Set<string>()
|
|
166
|
+
|
|
167
|
+
for (const line of tail.split('\n')) apply_line(open, line, launched_ids)
|
|
168
|
+
open.delete('')
|
|
134
169
|
|
|
135
|
-
return
|
|
170
|
+
return [...open]
|
|
136
171
|
}
|
|
137
172
|
|
|
138
173
|
// The background tasks the tail launched and never saw finish — commands and subagents alike,
|
|
@@ -167,6 +202,13 @@ const ROW = {
|
|
|
167
202
|
is_trigger: (call: GuardedCall): boolean => is_background_long_run(call),
|
|
168
203
|
reason: LANE_BACKGROUND_REASON,
|
|
169
204
|
decide: (): boolean => true,
|
|
205
|
+
about: {
|
|
206
|
+
title: 'Lane child background push',
|
|
207
|
+
topic: '`.claude/skills/workflow-commands/background-commands.md`',
|
|
208
|
+
fires:
|
|
209
|
+
'a dispatched lane child backgrounding `josh gate` / `git` / `followup` / `ship`; it hands over `pnpm josh ship --detach`. Every occurrence',
|
|
210
|
+
quiet: 'not a lane child, or the foreground `ship --detach`',
|
|
211
|
+
},
|
|
170
212
|
}
|
|
171
213
|
|
|
172
214
|
const lane_background = {
|
|
@@ -109,6 +109,12 @@ const ROW = {
|
|
|
109
109
|
is_trigger: bash_triggers.on_bash_command(is_carry_conflict),
|
|
110
110
|
reason: LANE_CARRY_CONFLICT_REASON,
|
|
111
111
|
decide: (): boolean => true,
|
|
112
|
+
about: {
|
|
113
|
+
title: 'Lane child carry commands',
|
|
114
|
+
topic: '`.claude/skills/workflow-commands/backlogrun-lanes.md`',
|
|
115
|
+
fires: 'a dispatched lane child running `pnpm josh run:merge` / `run:carry`. Every occurrence',
|
|
116
|
+
quiet: 'not a lane child — the parent owns the run budget',
|
|
117
|
+
},
|
|
112
118
|
}
|
|
113
119
|
|
|
114
120
|
const lane_carry_conflict = {
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { command_memory } from '#scripts/gate/command-memory'
|
|
2
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
3
|
+
import { bash_triggers } from './bash-triggers'
|
|
4
|
+
|
|
5
|
+
// A dispatched lane child is stopped from running a heavy tool directly. The core budget
|
|
6
|
+
// (`scripts/gate/core-budget.ts`) counts only what a `josh` command reserves, so an `eslint`, `vitest`,
|
|
7
|
+
// `cspell` or `tsc` a lane agent launches itself is neither refused nor counted: it overlaps the other
|
|
8
|
+
// lanes' gates and shows up only as unexplained load to whatever is admitted next.
|
|
9
|
+
//
|
|
10
|
+
// **Every spelling collapses to the tool's name.** `command_memory.tool_calls_of` skips the wrapper
|
|
11
|
+
// words (`pnpm`, `npx`, `exec`, env assignments) and reads a shell's quoted script (`sh -c '…'`,
|
|
12
|
+
// `bash -c "…"`, `eval`) as the commands it runs, so `pnpm exec eslint`, `npx vitest`, `pnpm tsc`, a
|
|
13
|
+
// bare `cspell` and any of them inside `sh -c` are all read as the program they launch. A
|
|
14
|
+
// `pnpm josh …` reads as `josh` and passes — that is the budgeted path, and the command
|
|
15
|
+
// `pnpm josh reserved-run <weight> -- <command>` wraps is read as reserved.
|
|
16
|
+
//
|
|
17
|
+
// **A multi-worker eslint is refused even when reserved** (joshuafolkken/kit#4582): typed eslint holds a
|
|
18
|
+
// TypeScript program per worker, so `--concurrency 4` or `auto` held 12 GB in one lane and swapped the
|
|
19
|
+
// machine. `--concurrency off`, `1` and no flag pass.
|
|
20
|
+
//
|
|
21
|
+
// **Lane children only.** An interactive session outside a lane keeps its direct runs; the overlap this
|
|
22
|
+
// prevents is between concurrently dispatched lanes.
|
|
23
|
+
|
|
24
|
+
const HEAVY_TOOLS: ReadonlySet<string> = new Set(['eslint', 'vitest', 'cspell', 'tsc'])
|
|
25
|
+
|
|
26
|
+
// True when any command on the shell line launches one of the heavy tools outside a `reserved-run`.
|
|
27
|
+
// The cut is quote-aware, so a tool name inside a quoted argument (`git commit -m "run eslint"`) is
|
|
28
|
+
// never read as a command; a quoted script handed to a shell is.
|
|
29
|
+
function runs_heavy_tool(command: string): boolean {
|
|
30
|
+
return command_memory
|
|
31
|
+
.tool_calls_of(command)
|
|
32
|
+
.some((call) => !call.is_reserved && HEAVY_TOOLS.has(call.name))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// True when this session is a dispatched lane child launching a heavy tool directly, or eslint with
|
|
36
|
+
// more than one worker by any path.
|
|
37
|
+
function is_lane_direct_tool(
|
|
38
|
+
command: string,
|
|
39
|
+
is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
|
|
40
|
+
): boolean {
|
|
41
|
+
if (!is_lane_child) return false
|
|
42
|
+
|
|
43
|
+
return runs_heavy_tool(command) || command_memory.runs_multi_worker_eslint(command)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const LANE_DIRECT_TOOL_REASON =
|
|
47
|
+
'⛔ lane child running `eslint` / `vitest` / `cspell` / `tsc` directly, or multi-worker eslint: ' +
|
|
48
|
+
'it overlaps the other lanes. Run `pnpm josh lint:related`, `pnpm josh test:related`, ' +
|
|
49
|
+
'`pnpm josh cspell:dot` or `pnpm josh reserved-run <weight> -- <command>`, eslint at ' +
|
|
50
|
+
'`--concurrency off`; measure concurrency outside a lane. Refused on every occurrence.'
|
|
51
|
+
|
|
52
|
+
// The row itself, so `delivered-rules.ts` spreads one entry; the shape is `lane-switch-main.ts`'s.
|
|
53
|
+
const ROW = {
|
|
54
|
+
id: 'lane-direct-tool',
|
|
55
|
+
is_trigger: bash_triggers.on_bash_command(is_lane_direct_tool),
|
|
56
|
+
reason: LANE_DIRECT_TOOL_REASON,
|
|
57
|
+
decide: (): boolean => true,
|
|
58
|
+
about: {
|
|
59
|
+
title: 'Lane child running a heavy tool directly',
|
|
60
|
+
topic: '`docs/josh-commands-automation.md` → `josh reserved-run`',
|
|
61
|
+
fires:
|
|
62
|
+
'a dispatched lane child launching `eslint` / `vitest` / `cspell` / `tsc` (bare, `pnpm exec`, `npx`, inside `sh -c`), or eslint with `--concurrency` other than `off` / `1` by any path, `reserved-run` included. Every occurrence',
|
|
63
|
+
quiet: 'not a lane child, or the run goes through `pnpm josh` with single-worker eslint',
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const lane_direct_tool = {
|
|
68
|
+
LANE_DIRECT_TOOL_REASON,
|
|
69
|
+
ROW,
|
|
70
|
+
is_lane_direct_tool,
|
|
71
|
+
runs_heavy_tool,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { lane_direct_tool }
|
|
@@ -43,8 +43,7 @@ function is_interactive_ask(
|
|
|
43
43
|
const LANE_INTERACTIVE_ASK_REASON =
|
|
44
44
|
'⛔ lane child interactive ask: this session is a dispatched lane child and cannot ask a ' +
|
|
45
45
|
'person, so park instead: ' +
|
|
46
|
-
|
|
47
|
-
'`pnpm josh issue:comment <N> --body-file <path>`, ' +
|
|
46
|
+
'`pnpm josh run:park <N> --body-file <path>` (it applies `needs-decision`), ' +
|
|
48
47
|
'the `confirmation` Telegram, stop. It fires on every occurrence ' +
|
|
49
48
|
'(`.claude/skills/workflow-commands/pre-gate-cut.md`, `backlogrun-park.md`).'
|
|
50
49
|
|
|
@@ -56,6 +55,14 @@ const ROW = {
|
|
|
56
55
|
is_trigger: is_interactive_ask,
|
|
57
56
|
reason: LANE_INTERACTIVE_ASK_REASON,
|
|
58
57
|
decide: (): boolean => true,
|
|
58
|
+
about: {
|
|
59
|
+
title: 'Lane child interactive ask',
|
|
60
|
+
topic:
|
|
61
|
+
'`.claude/skills/workflow-commands/pre-gate-cut.md` → "The interactive ask is refused one call earlier"',
|
|
62
|
+
fires:
|
|
63
|
+
"a dispatched lane child's `AskUserQuestion`; it hands over the park procedure. Every occurrence",
|
|
64
|
+
quiet: 'not a lane child, or not an interactive tool',
|
|
65
|
+
},
|
|
59
66
|
}
|
|
60
67
|
|
|
61
68
|
const lane_interactive_ask = { LANE_INTERACTIVE_ASK_REASON, ROW, is_interactive_ask }
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
|
|
2
2
|
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
3
3
|
import { lane_handoff } from '#scripts/lane/lane-handoff'
|
|
4
|
+
import { run_park } from '#scripts/run/park/run-park'
|
|
4
5
|
import { bash_triggers } from './bash-triggers'
|
|
5
6
|
import { shell_segments } from './shell-segments'
|
|
6
7
|
|
|
@@ -19,15 +20,12 @@ import { shell_segments } from './shell-segments'
|
|
|
19
20
|
// confirmation` is the call every lane-child stop passes through. The agent that obeys this is always
|
|
20
21
|
// a `claude -p` child, so the rule leaves residency entirely (`prompts/collaboration-workflow/rule-delivery.md`).
|
|
21
22
|
//
|
|
22
|
-
// **
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
// reappearing inside its own check. So the row carries no `already_satisfied`: it fires once per run on
|
|
29
|
-
// the stop, the reason is a checklist rather than an accusation, and a child that already parked simply
|
|
30
|
-
// reissues. One wasted round trip on the compliant path is the safe direction; a missed park is not.
|
|
23
|
+
// **A parked child is silent, read off the local park record.** The park is a label on GitHub, which a
|
|
24
|
+
// `PreToolUse` guard cannot read (it answers synchronously, network calls are out), and scanning the
|
|
25
|
+
// transcript tail for the label is unsafe: a child that merely *read* `backlogrun-park.md` would look
|
|
26
|
+
// compliant. So `pnpm josh run:park` writes a local record once the comment and the label are both on
|
|
27
|
+
// the issue, and the guard reads it synchronously, the way the pre-gate cut guard reads the cut record
|
|
28
|
+
// (joshuafolkken/kit#4132). A child with no record still gets the once-per-run checklist.
|
|
31
29
|
|
|
32
30
|
// `josh notify`, named canonically — `shell_segments.is_josh_command` expands an alias before the match.
|
|
33
31
|
const NOTIFY_COMMANDS: ReadonlySet<string> = new Set(['notify'])
|
|
@@ -85,22 +83,42 @@ function is_parking_child(directory: string = process.cwd()): boolean {
|
|
|
85
83
|
return lane_child_marker.is_child_of(directory) && !lane_handoff.is_handed_off(directory)
|
|
86
84
|
}
|
|
87
85
|
|
|
88
|
-
|
|
86
|
+
// A parking child that has not parked yet: `run:park` left no record for its issue in this repository.
|
|
87
|
+
// Kept apart from `is_parking_child`, which `run:entry` reads to leave a lane child's stop to this row
|
|
88
|
+
// whether or not it has parked.
|
|
89
|
+
function is_unparked_child(directory: string = process.cwd()): boolean {
|
|
90
|
+
if (!is_parking_child(directory)) return false
|
|
91
|
+
|
|
92
|
+
const issue = lane_child_marker.marked_issue()
|
|
93
|
+
|
|
94
|
+
return issue === undefined || !run_park.is_parked_sync(issue, directory)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function is_unparked_stop(command: string, is_child: () => boolean = is_unparked_child): boolean {
|
|
89
98
|
if (!is_confirmation_notify(command)) return false
|
|
90
99
|
|
|
91
100
|
return is_child()
|
|
92
101
|
}
|
|
93
102
|
|
|
94
103
|
// **Keeping this rule is applying `needs-decision`**, the one act the park asks for before the stop.
|
|
95
|
-
// It reads an actual `Bash` command — a label application by REST or by
|
|
96
|
-
// transcript tail, so a doc read that quotes the command is not mistaken
|
|
104
|
+
// It reads an actual `Bash` command — `josh run:park`, or a label application by REST or by
|
|
105
|
+
// `gh issue edit` — never the transcript tail, so a doc read that quotes the command is not mistaken
|
|
106
|
+
// for the run making it. `run:park --clear` takes the park off, so it is not one.
|
|
97
107
|
const APPLIES_NEEDS_DECISION = new RegExp(
|
|
98
108
|
String.raw`(?:labels\[\]=|--add-label[= ]'?)${NEEDS_DECISION_LABEL}\b`,
|
|
99
109
|
'u',
|
|
100
110
|
)
|
|
111
|
+
const PARK_COMMANDS: ReadonlySet<string> = new Set(['run:park'])
|
|
112
|
+
const CLEAR_FLAG = /(?:^|\s)--clear\b/u
|
|
113
|
+
|
|
114
|
+
function is_park_command(segment: string): boolean {
|
|
115
|
+
return shell_segments.is_josh_command(segment, PARK_COMMANDS) && !CLEAR_FLAG.test(segment)
|
|
116
|
+
}
|
|
101
117
|
|
|
102
118
|
function records_the_park(command: string): boolean {
|
|
103
|
-
|
|
119
|
+
if (APPLIES_NEEDS_DECISION.test(command)) return true
|
|
120
|
+
|
|
121
|
+
return shell_segments.segments_of(command).some((segment) => is_park_command(segment))
|
|
104
122
|
}
|
|
105
123
|
|
|
106
124
|
// The instruction in the shape a refusal can carry: what the stop must leave behind, how to record it,
|
|
@@ -109,24 +127,27 @@ function records_the_park(command: string): boolean {
|
|
|
109
127
|
// clone `CLAUDE.md` prohibits.
|
|
110
128
|
const LANE_PARK_REASON =
|
|
111
129
|
'⛔ lane child park: this session is a dispatched lane child, so a stop for a person parks first: ' +
|
|
112
|
-
|
|
113
|
-
'`
|
|
130
|
+
'`pnpm josh run:park <N> --body-file <path>` (question, options, stash — it applies ' +
|
|
131
|
+
'`needs-decision`); a ' +
|
|
114
132
|
'`needs-human-review` / `already-done` stop already is. Reissue this notify, once per run ' +
|
|
115
133
|
'(`.claude/skills/workflow-commands/pre-gate-cut.md`).'
|
|
116
134
|
|
|
117
|
-
// The row itself, so `delivered-rules.ts` spreads one entry. **Once per run rather than `decide
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
// label-application `Bash` command, never the tail, so it is not fooled the same way; `reaches` stays
|
|
123
|
-
// `is_trigger`, since a compliant run issues the same confirmation notify and belongs in the
|
|
124
|
-
// denominator.
|
|
135
|
+
// The row itself, so `delivered-rules.ts` spreads one entry. **Once per run rather than `decide`.** The
|
|
136
|
+
// stop ends the turn, so it is not the recurring act `decide` is for. A parked child is excluded in the
|
|
137
|
+
// trigger itself (`is_unparked_child`), so the park record is the satisfaction and no
|
|
138
|
+
// `already_satisfied` reads the tail. `keeps` reads an actual park `Bash` command, never the tail, so a
|
|
139
|
+
// doc read that quotes one is not mistaken for it.
|
|
125
140
|
const ROW = {
|
|
126
141
|
id: 'lane-park',
|
|
127
142
|
is_trigger: bash_triggers.on_bash_command(is_unparked_stop),
|
|
128
143
|
reason: LANE_PARK_REASON,
|
|
129
144
|
keeps: bash_triggers.on_bash_command(records_the_park),
|
|
145
|
+
about: {
|
|
146
|
+
title: 'Lane child park',
|
|
147
|
+
topic: '`.claude/skills/workflow-commands/pre-gate-cut.md`',
|
|
148
|
+
fires: 'a dispatched lane child issuing `pnpm josh notify --task-type confirmation`',
|
|
149
|
+
quiet: 'not a lane child, or not a stop notification',
|
|
150
|
+
},
|
|
130
151
|
}
|
|
131
152
|
|
|
132
153
|
const lane_park = {
|
|
@@ -135,6 +156,7 @@ const lane_park = {
|
|
|
135
156
|
ROW,
|
|
136
157
|
is_confirmation_notify,
|
|
137
158
|
is_parking_child,
|
|
159
|
+
is_unparked_child,
|
|
138
160
|
is_unparked_stop,
|
|
139
161
|
mentions_confirmation_notify,
|
|
140
162
|
records_the_park,
|
|
@@ -24,11 +24,12 @@ import { tail_commands } from './tail-commands'
|
|
|
24
24
|
// `josh epic`, named canonically — `shell_segments.is_josh_command` expands an alias before the match.
|
|
25
25
|
const EPIC_COMMANDS: ReadonlySet<string> = new Set(['epic'])
|
|
26
26
|
const PROMOTED_ISSUE = /--promote[=\s]+["']?(?<issue>\d+)\b/u
|
|
27
|
-
// The issue a label write targets, in the
|
|
28
|
-
// path `…/issues/<N>/labels
|
|
27
|
+
// The issue a label write targets, in the spellings `lane_park.records_the_park` accepts: the REST
|
|
28
|
+
// path `…/issues/<N>/labels`, `gh issue edit <N>` and `josh run:park <N>`.
|
|
29
29
|
const LABEL_TARGETS: ReadonlyArray<RegExp> = [
|
|
30
30
|
/\/issues\/(?<issue>\d+)\/labels\b/u,
|
|
31
31
|
/\bissue\s+edit\s+["']?(?<issue>\d+)\b/u,
|
|
32
|
+
/\brun:park\s+["']?(?<issue>\d+)\b/u,
|
|
32
33
|
]
|
|
33
34
|
// The issue a confirmation notify is about, read off its `--issue-url` the way `stop-rules.ts` spells it.
|
|
34
35
|
const ISSUE_URL = /--issue-url[=\s]+["']?([^\s"']+)/u
|
|
@@ -111,6 +112,13 @@ const ROW = {
|
|
|
111
112
|
is_trigger: bash_triggers.on_bash_command(is_candidate),
|
|
112
113
|
reason: LANE_SPLIT_PARK_REASON,
|
|
113
114
|
decide,
|
|
115
|
+
about: {
|
|
116
|
+
title: 'A split is not a park',
|
|
117
|
+
topic: '`.claude/skills/workflow-commands/backlogrun-park.md` → "Splitting a child mid-run"',
|
|
118
|
+
fires:
|
|
119
|
+
'a lane child that promoted its Issue to an epic this run parking it (`needs-decision`, `confirmation` notify). Every occurrence',
|
|
120
|
+
quiet: 'no promotion this run',
|
|
121
|
+
},
|
|
114
122
|
}
|
|
115
123
|
|
|
116
124
|
const lane_split_park = {
|
|
@@ -120,6 +120,13 @@ const ROW = {
|
|
|
120
120
|
is_trigger: bash_triggers.on_bash_command(is_switch_away_from_lane),
|
|
121
121
|
reason: LANE_SWITCH_MAIN_REASON,
|
|
122
122
|
decide: (): boolean => true,
|
|
123
|
+
about: {
|
|
124
|
+
title: 'Lane child on `git switch main`',
|
|
125
|
+
topic: '`.claude/skills/workflow-commands/backlogrun-lanes.md`',
|
|
126
|
+
fires:
|
|
127
|
+
'a dispatched lane child switching to the default branch or running `josh main:sync`. Every occurrence',
|
|
128
|
+
quiet: 'not a lane child — `pnpm josh main:merge` brings the default in at the gate',
|
|
129
|
+
},
|
|
123
130
|
}
|
|
124
131
|
|
|
125
132
|
const lane_switch_main = {
|
|
@@ -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
|
|
|
@@ -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 —
|
|
@@ -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 }
|