@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -46,7 +46,7 @@ function is_index_segment(segment: string): boolean {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
function is_index_mutation(command: string): boolean {
|
|
49
|
-
return shell_segments.
|
|
49
|
+
return shell_segments.commands_of(command).some((segment) => is_index_segment(segment))
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
const INDEX_MUTATION_REASON =
|
|
@@ -61,6 +61,13 @@ const ROW = {
|
|
|
61
61
|
is_trigger: bash_triggers.on_bash_command(is_index_mutation),
|
|
62
62
|
reason: INDEX_MUTATION_REASON,
|
|
63
63
|
decide: (): boolean => true,
|
|
64
|
+
about: {
|
|
65
|
+
title: 'Index mutation',
|
|
66
|
+
topic: '`operating-rules.md`',
|
|
67
|
+
fires:
|
|
68
|
+
'`git add` / `commit` / `reset` / `rm` / `mv` / `restore --staged` in any spelling. Every occurrence',
|
|
69
|
+
quiet: '`pnpm josh git` — the approved commit flow',
|
|
70
|
+
},
|
|
64
71
|
}
|
|
65
72
|
|
|
66
73
|
const index_guard = { INDEX_MUTATION_REASON, ROW, is_index_mutation }
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
4
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
1
5
|
import { bash_triggers } from './bash-triggers'
|
|
2
6
|
import { gh_api } from './gh-api'
|
|
3
7
|
import { prior_comment_read } from './prior-comment-read'
|
|
@@ -17,7 +21,7 @@ const ISSUE_VIEW_COMMAND = new RegExp(String.raw`^gh\s+${gh_api.GH_FLAGS}issue\s
|
|
|
17
21
|
// (`…/issues`) and every sub-resource under it (`…/issues/1319/comments`) are left alone.
|
|
18
22
|
const ISSUE_BODY_PATH = /repos\/[^\s'"]*\/issues\/\d+(?=$|["'\s])/u
|
|
19
23
|
// **A write to that path is not a read of it**, which is why the body read below asks `gh_api.is_read`:
|
|
20
|
-
// `gh api` sends POST as soon as any field flag appears, and
|
|
24
|
+
// `gh api` sends POST as soon as any field flag appears, and a run PATCHes `…/issues/<N>` to
|
|
21
25
|
// normalize a title and to fill a blank body — so without the read check the delivery would be spent
|
|
22
26
|
// refusing a write, and the genuine body read later in the same run would never be guarded.
|
|
23
27
|
// A segment that fetches comments: the flag, a `comments` field in a `--json` projection, or the
|
|
@@ -77,6 +81,9 @@ function reads_issue_comments(command: string): boolean {
|
|
|
77
81
|
return shell_segments.segments_of(command).some((segment) => fetches_issue_comments(segment))
|
|
78
82
|
}
|
|
79
83
|
|
|
84
|
+
const RULE_DOC = '`.claude/skills/workflow-commands/issue-comments.md`'
|
|
85
|
+
const COMMENTS_FALLBACK = 'gh api repos/{owner}/{repo}/issues/<N>/comments'
|
|
86
|
+
|
|
80
87
|
// **The refusal hands over the command that fixes it**, because reading is not the same as
|
|
81
88
|
// obeying: a sentence saying "also read the comments" is prose that moves nothing, while a refused
|
|
82
89
|
// body read leaves the run holding the reissue that makes the comments *present*. The conflict rule
|
|
@@ -88,12 +95,62 @@ function reads_issue_comments(command: string): boolean {
|
|
|
88
95
|
// being the Issue the refused call named — so a run that reads only the opening still leaves holding
|
|
89
96
|
// the fix. The label keeps `time_transcript_line.guard_from_refusal` naming this guard, not the command.
|
|
90
97
|
const ISSUE_COMMENTS_REASON =
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
98
|
+
`⛔ issue comments: pnpm josh issue:read <N>\n` +
|
|
99
|
+
`Run that in place of this read — an Issue's comments are part of it, and a later comment ` +
|
|
100
|
+
`supersedes the body it contradicts; refused until that command is on the transcript. Without ` +
|
|
101
|
+
`josh, read \`${COMMENTS_FALLBACK}\` beside the body (${RULE_DOC}).`
|
|
102
|
+
|
|
103
|
+
// **A `gh api` body read is rewritten rather than refused** (joshuafolkken/kit#3920): the fix is the
|
|
104
|
+
// same Issue's comments endpoint, read on the same line, and the path the call already names is all
|
|
105
|
+
// it needs. Prepended on lines of their own, so a trailing comment or a `&&` chain on the typed line
|
|
106
|
+
// cannot swallow or skip them, and the typed line stays last — its exit status is still the call's.
|
|
107
|
+
// A `gh issue view` read is left to the refusal — its global flags (`--repo`) and its `--json`
|
|
108
|
+
// projection have no one comments spelling to add.
|
|
109
|
+
const COMMENTS_JQ = String.raw`'.[] | "— \(.user.login) \(.created_at)\n\(.body)\n"'`
|
|
110
|
+
|
|
111
|
+
const COMMENTS_NOTE =
|
|
112
|
+
"↻ issue comments: this read returned only the Issue's body, so the Issue's comments were fetched " +
|
|
113
|
+
`on the same line — a later comment supersedes the body it contradicts (${RULE_DOC}).`
|
|
114
|
+
|
|
115
|
+
// **Only a line that opens with the body read is rewritten.** Prepended ahead of a `cd` or a
|
|
116
|
+
// subshell, the comments read would resolve `{owner}/{repo}` in another directory and print another
|
|
117
|
+
// repository's comments; and the line is cut on its quote-blanked reading, so a body-read spelling
|
|
118
|
+
// quoted in a string or a heredoc body is never prepended as a real call. Every other line keeps the
|
|
119
|
+
// refusal.
|
|
120
|
+
function rewritable_path(command: string): string | undefined {
|
|
121
|
+
const read = shell_segments.first_of(command)
|
|
122
|
+
|
|
123
|
+
if (read === undefined || ISSUE_VIEW_COMMAND.test(read)) return undefined
|
|
124
|
+
|
|
125
|
+
return is_body_read_segment(read) ? ISSUE_BODY_PATH.exec(read)?.[0] : undefined
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function comments_command(command: string): string | undefined {
|
|
129
|
+
if (!is_body_only_issue_read(command)) return undefined
|
|
130
|
+
|
|
131
|
+
const path = rewritable_path(command)
|
|
132
|
+
|
|
133
|
+
if (path === undefined) return undefined
|
|
134
|
+
|
|
135
|
+
return `gh api --paginate ${path}/comments --jq ${COMMENTS_JQ}\n${command}`
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// The call's input with the comments read prepended, or `undefined` where the comments are already on
|
|
139
|
+
// the tail or the read has no rewritable spelling.
|
|
140
|
+
function comments_input(
|
|
141
|
+
call: GuardedCall,
|
|
142
|
+
tail: () => string,
|
|
143
|
+
): Record<string, unknown> | undefined {
|
|
144
|
+
if (call.name !== cost_blocks.BASH_TOOL || !json_value.is_record(call.input)) return undefined
|
|
145
|
+
|
|
146
|
+
const command = comments_command(time_shell.bash_command(call.input))
|
|
147
|
+
|
|
148
|
+
if (command === undefined || prior_comment_read.already_read_for_call(tail(), call)) {
|
|
149
|
+
return undefined
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return { ...call.input, command }
|
|
153
|
+
}
|
|
97
154
|
|
|
98
155
|
// The enumeration row itself, so `delivered-rules.ts` spreads one entry. `already_satisfied` stands it
|
|
99
156
|
// down once the comments are on the transcript tail, and until then it refuses every body-only read.
|
|
@@ -103,13 +160,25 @@ const ROW = {
|
|
|
103
160
|
reason: ISSUE_COMMENTS_REASON,
|
|
104
161
|
already_satisfied: prior_comment_read.already_read_for_call,
|
|
105
162
|
keeps: bash_triggers.on_bash_command(reads_issue_comments),
|
|
163
|
+
rewrite: comments_input,
|
|
164
|
+
rewrite_note: COMMENTS_NOTE,
|
|
106
165
|
// The opening the reason carried before it led with the command.
|
|
107
166
|
former_reasons: ["⛔ an Issue's comments are part of the Issue: read them before implementing"],
|
|
167
|
+
about: {
|
|
168
|
+
title: 'Reading Issue comments',
|
|
169
|
+
topic: '`issue-comments.md`',
|
|
170
|
+
fires:
|
|
171
|
+
'a `Bash` that reads only the Issue body (`gh issue view <N>`, or a GET ending in `…/issues/<N>`). Refused until it is re-read with the comments',
|
|
172
|
+
quiet:
|
|
173
|
+
'no Issue read, or a read with `--comments` / `--json comments` / `…/comments` from the start',
|
|
174
|
+
},
|
|
108
175
|
}
|
|
109
176
|
|
|
110
177
|
const issue_comments = {
|
|
178
|
+
COMMENTS_NOTE,
|
|
111
179
|
ISSUE_COMMENTS_REASON,
|
|
112
180
|
ROW,
|
|
181
|
+
comments_input,
|
|
113
182
|
is_body_only_issue_read,
|
|
114
183
|
}
|
|
115
184
|
|
|
@@ -66,6 +66,13 @@ const ROW = {
|
|
|
66
66
|
is_trigger: bash_triggers.on_bash_command(is_bare_josh_git),
|
|
67
67
|
reason: JOSH_GIT_BARE_REASON,
|
|
68
68
|
decide: (): boolean => true,
|
|
69
|
+
about: {
|
|
70
|
+
title: 'Bare `pnpm josh git`',
|
|
71
|
+
topic: '`CLAUDE.md` → Git Rules',
|
|
72
|
+
fires:
|
|
73
|
+
'`pnpm josh git` without `-y`, whose staging prompt cancels with no TTY. Every occurrence',
|
|
74
|
+
quiet: '`pnpm josh git -y`',
|
|
75
|
+
},
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
const josh_git_bare = {
|
|
@@ -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 = {
|