@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { bash_triggers } from './bash-triggers'
|
|
2
|
+
import { direct_pr_create } from './direct-pr-create'
|
|
3
|
+
import { gh_api } from './gh-api'
|
|
4
|
+
import { git_argv } from './git-argv'
|
|
5
|
+
import { shell_segments } from './shell-segments'
|
|
6
|
+
|
|
7
|
+
// The `direct-issue-comment` row of `delivered-rules.ts`. A run's own comment has to carry
|
|
8
|
+
// `RUN_MARKER`, or `issue-watch-diff.ts` reads it as a person's update: the run's review then reads as
|
|
9
|
+
// briefed before the issue changed, and `josh followup` refuses the merge (joshuafolkken/kit#4221).
|
|
10
|
+
// `pnpm josh issue:comment` is the one path that writes the marker, so a hand-built `gh issue comment`
|
|
11
|
+
// or `gh api` write to `…/issues/<N>/comments` is refused and pointed there. It reads the argv through
|
|
12
|
+
// `direct-pr-create.ts`'s cut, so a quoted mention is not a call and `bash -c '…'` still is.
|
|
13
|
+
//
|
|
14
|
+
// **Only the checkout's own repository**: `issue:comment` posts there and nowhere else, so the row
|
|
15
|
+
// claims the spellings that target it — the `{owner}` placeholder, and `gh issue comment` with no
|
|
16
|
+
// repository selector. A comment to another repository named outright is left to `third-party-write`.
|
|
17
|
+
//
|
|
18
|
+
// **It fires on every occurrence**, for the reason `git-force.ts` does.
|
|
19
|
+
|
|
20
|
+
const ISSUE_GROUP = 'issue'
|
|
21
|
+
const COMMENT_ACTION = 'comment'
|
|
22
|
+
const API_SUBCOMMAND = 'api'
|
|
23
|
+
const REPO_SELECTOR = /^(?:-R|--repo)(?:=|$)/u
|
|
24
|
+
// One issue's (or pull request's — REST serves both as issues) comment collection. Anchored on the
|
|
25
|
+
// whole endpoint argument, so `…/issues/comments/<id>` and a listing elsewhere are not read as it. The
|
|
26
|
+
// number is any one segment, so `issues/$N/comments` is seen as well.
|
|
27
|
+
const SEGMENT = String.raw`[^/\s'"]+`
|
|
28
|
+
const QUOTE = `['"]?`
|
|
29
|
+
const API_ORIGIN = String.raw`(?:https://api\.github\.com)?/?`
|
|
30
|
+
const COMMENTS_PATH = new RegExp(
|
|
31
|
+
`^${QUOTE}${API_ORIGIN}repos/${SEGMENT}/${SEGMENT}/issues/${SEGMENT}/comments/?${QUOTE}$`,
|
|
32
|
+
'u',
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
function is_comment_cli_call(args: ReadonlyArray<string>): boolean {
|
|
36
|
+
if (args.some((argument) => REPO_SELECTOR.test(argument))) return false
|
|
37
|
+
|
|
38
|
+
const [group, action] = direct_pr_create.positional_words(
|
|
39
|
+
args,
|
|
40
|
+
direct_pr_create.VALUE_TAKING_FLAGS,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
return group === ISSUE_GROUP && action === COMMENT_ACTION
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function is_own_comments_endpoint(endpoint: string): boolean {
|
|
47
|
+
const owner = gh_api.repo_target(endpoint)?.owner ?? ''
|
|
48
|
+
|
|
49
|
+
return gh_api.is_owner_placeholder(owner) && COMMENTS_PATH.test(endpoint)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function is_comment_api_call(args: ReadonlyArray<string>): boolean {
|
|
53
|
+
const call = [direct_pr_create.GH_COMMAND, ...args].join(' ')
|
|
54
|
+
|
|
55
|
+
if (!gh_api.is_gh_api(call) || !gh_api.is_write(call)) return false
|
|
56
|
+
|
|
57
|
+
const [subcommand, endpoint = ''] = direct_pr_create.positional_words(
|
|
58
|
+
args,
|
|
59
|
+
direct_pr_create.API_VALUE_TAKING_FLAGS,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
return subcommand === API_SUBCOMMAND && is_own_comments_endpoint(endpoint)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function is_comment_segment(segment: string): boolean {
|
|
66
|
+
const args = git_argv.arguments_of(segment, direct_pr_create.GH_COMMAND)
|
|
67
|
+
|
|
68
|
+
if (args === undefined || direct_pr_create.is_help_call(args)) return false
|
|
69
|
+
|
|
70
|
+
return is_comment_cli_call(args) || is_comment_api_call(args)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function is_direct_issue_comment(command: string): boolean {
|
|
74
|
+
return direct_pr_create.has_run_segment(command, is_comment_segment)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// `pnpm josh issue:comment` — the act that keeps the rule, segment-wise so a spelling quoted inside
|
|
78
|
+
// another command's body is not read as one.
|
|
79
|
+
const COMMENT_NAMES: ReadonlySet<string> = new Set(['issue:comment'])
|
|
80
|
+
|
|
81
|
+
function is_josh_comment(command: string): boolean {
|
|
82
|
+
return shell_segments
|
|
83
|
+
.segments_of(command)
|
|
84
|
+
.some((segment) => shell_segments.is_josh_command(segment, COMMENT_NAMES))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function is_any_comment(command: string): boolean {
|
|
88
|
+
return is_direct_issue_comment(command) || is_josh_comment(command)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const DIRECT_ISSUE_COMMENT_REASON =
|
|
92
|
+
'⛔ direct issue comment: `gh issue comment` (or a `gh api` write to `…/issues/<N>/comments`) posts ' +
|
|
93
|
+
'without the run marker, so the run reads its own comment as a person updating the issue — the ' +
|
|
94
|
+
'review goes stale and `pnpm josh followup` refuses the merge. Post with ' +
|
|
95
|
+
'`pnpm josh issue:comment <N> --body-file <path>` instead (`shell-body.md`). ' +
|
|
96
|
+
'**This rule fires on every occurrence, not once per run.**'
|
|
97
|
+
|
|
98
|
+
const ROW = {
|
|
99
|
+
id: 'direct-issue-comment',
|
|
100
|
+
is_trigger: bash_triggers.on_bash_command(is_direct_issue_comment),
|
|
101
|
+
reason: DIRECT_ISSUE_COMMENT_REASON,
|
|
102
|
+
decide: (): boolean => true,
|
|
103
|
+
keeps: bash_triggers.on_bash_command(is_josh_comment),
|
|
104
|
+
reaches: bash_triggers.on_bash_command(is_any_comment),
|
|
105
|
+
about: {
|
|
106
|
+
title: 'Direct issue comment',
|
|
107
|
+
topic: '`shell-body.md`',
|
|
108
|
+
fires:
|
|
109
|
+
"a comment to the checkout's own repository outside `josh issue:comment` (`gh issue comment` with no `--repo`, or a `gh api` write to `repos/{owner}/<r>/issues/<N>/comments`); it points at `pnpm josh issue:comment`. Every occurrence",
|
|
110
|
+
quiet:
|
|
111
|
+
'`pnpm josh issue:comment`, or reading the comments — the path that writes the run marker',
|
|
112
|
+
},
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const direct_issue_comment = { DIRECT_ISSUE_COMMENT_REASON, ROW, is_direct_issue_comment }
|
|
116
|
+
|
|
117
|
+
export { direct_issue_comment }
|
|
@@ -17,6 +17,7 @@ const PR_GROUP = 'pr'
|
|
|
17
17
|
// `new` is gh's own alias for `pr create`.
|
|
18
18
|
const PR_CREATE_ACTIONS: ReadonlySet<string> = new Set(['create', 'new'])
|
|
19
19
|
const FLAG_PREFIX = '-'
|
|
20
|
+
const HELP_FLAGS: ReadonlySet<string> = new Set(['-h', '--help'])
|
|
20
21
|
// The repository selector gh accepts before `pr` or between `pr` and its action; with no `=` it
|
|
21
22
|
// swallows the next word, so that word is not read as the group or the action.
|
|
22
23
|
const VALUE_TAKING_FLAGS: ReadonlySet<string> = new Set(['-R', '--repo'])
|
|
@@ -80,16 +81,64 @@ function is_pr_create_cli_call(args: ReadonlyArray<string>): boolean {
|
|
|
80
81
|
return group === PR_GROUP && PR_CREATE_ACTIONS.has(action)
|
|
81
82
|
}
|
|
82
83
|
|
|
84
|
+
// A help call prints the usage and creates nothing. A help flag right after another flag may be that
|
|
85
|
+
// flag's value (`--title -h`), so it is not read as one — a boolean flag before it errs toward refusal.
|
|
86
|
+
function is_help_call(args: ReadonlyArray<string>): boolean {
|
|
87
|
+
return args.some(
|
|
88
|
+
(argument, index) =>
|
|
89
|
+
HELP_FLAGS.has(argument) && !(args[index - 1] ?? '').startsWith(FLAG_PREFIX),
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
|
|
83
93
|
function is_pr_create_segment(segment: string): boolean {
|
|
84
94
|
const args = git_argv.arguments_of(segment, GH_COMMAND)
|
|
85
95
|
|
|
86
|
-
if (args === undefined) return false
|
|
96
|
+
if (args === undefined || is_help_call(args)) return false
|
|
87
97
|
|
|
88
98
|
return is_pr_create_cli_call(args) || is_pr_create_api_call(args)
|
|
89
99
|
}
|
|
90
100
|
|
|
101
|
+
// Quoted text the shell still runs: a command substitution, or the string `sh -c` (its `-c` alone or
|
|
102
|
+
// in a cluster such as `-lc`, after any other flags), `ssh` or `eval` executes. `ssh` and `eval` count
|
|
103
|
+
// only as the segment's program, so `grep -E "ssh|gh pr create"` stays one quoted pattern.
|
|
104
|
+
const RUNS_QUOTED_TEXT = /\$\(|`/u
|
|
105
|
+
const QUOTED_TEXT_RUNNERS: ReadonlySet<string> = new Set(['ssh', 'eval'])
|
|
106
|
+
const SHELL_DASH_C = /\b(?:ba|da|k|z)?sh\s+(?:-\S+\s+)*-[A-Za-z]*c\b/u
|
|
107
|
+
// A `#` comment hides its apostrophe from the shell but not from the quote pairing, so a multi-line
|
|
108
|
+
// segment holding one may be lines the pairing joined (`# don't` … `'`) rather than one quoted span.
|
|
109
|
+
const COMMENT_MARKER = /(?:^|\s)#/mu
|
|
110
|
+
const LINE_BREAK = '\n'
|
|
111
|
+
|
|
112
|
+
function is_run_by_shell(segment: string): boolean {
|
|
113
|
+
if (RUNS_QUOTED_TEXT.test(segment) || SHELL_DASH_C.test(segment)) return true
|
|
114
|
+
|
|
115
|
+
return QUOTED_TEXT_RUNNERS.has(git_argv.program_of(segment)?.name ?? '')
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function is_runs_quoted_text(segment: string): boolean {
|
|
119
|
+
if (is_run_by_shell(segment)) return true
|
|
120
|
+
|
|
121
|
+
return segment.includes(LINE_BREAK) && COMMENT_MARKER.test(segment)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// A segment whose quotes still run keeps the plain cut, so `bash -c 'git push && gh pr create --fill'`
|
|
125
|
+
// is refused as it was before the quote-aware cut.
|
|
126
|
+
function judged_segments(segment: string): Array<string> {
|
|
127
|
+
return is_runs_quoted_text(segment) ? shell_segments.commands_of(segment) : [segment]
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// The cut is quote-aware, so `grep -E "a|gh pr create|b"` stays one `grep` call rather than yielding
|
|
131
|
+
// a `gh pr create` segment from inside its pattern (joshuafolkken/kit#4091). Shared with the
|
|
132
|
+
// `direct-issue-comment` row, which judges a `gh` call by the same cut.
|
|
133
|
+
function has_run_segment(command: string, is_match: (segment: string) => boolean): boolean {
|
|
134
|
+
return shell_segments
|
|
135
|
+
.quote_aware_commands_of(command)
|
|
136
|
+
.flatMap((segment) => judged_segments(segment))
|
|
137
|
+
.some((segment) => is_match(segment))
|
|
138
|
+
}
|
|
139
|
+
|
|
91
140
|
function is_direct_pr_create(command: string): boolean {
|
|
92
|
-
return
|
|
141
|
+
return has_run_segment(command, is_pr_create_segment)
|
|
93
142
|
}
|
|
94
143
|
|
|
95
144
|
const DIRECT_PR_CREATE_REASON =
|
|
@@ -103,8 +152,25 @@ const ROW = {
|
|
|
103
152
|
is_trigger: bash_triggers.on_bash_command(is_direct_pr_create),
|
|
104
153
|
reason: DIRECT_PR_CREATE_REASON,
|
|
105
154
|
decide: (): boolean => true,
|
|
155
|
+
about: {
|
|
156
|
+
title: 'Direct PR creation',
|
|
157
|
+
topic: '`CLAUDE.md` → Git Rules',
|
|
158
|
+
fires:
|
|
159
|
+
'`gh pr create`, or a `gh api` write to `repos/<o>/<r>/pulls`; it points at `pnpm josh pr`. Every occurrence',
|
|
160
|
+
quiet: '`pnpm josh pr`, or reading a PR — the path that writes `closes #N`',
|
|
161
|
+
},
|
|
106
162
|
}
|
|
107
163
|
|
|
108
|
-
const direct_pr_create = {
|
|
164
|
+
const direct_pr_create = {
|
|
165
|
+
API_VALUE_TAKING_FLAGS,
|
|
166
|
+
DIRECT_PR_CREATE_REASON,
|
|
167
|
+
GH_COMMAND,
|
|
168
|
+
ROW,
|
|
169
|
+
VALUE_TAKING_FLAGS,
|
|
170
|
+
has_run_segment,
|
|
171
|
+
is_direct_pr_create,
|
|
172
|
+
is_help_call,
|
|
173
|
+
positional_words,
|
|
174
|
+
}
|
|
109
175
|
|
|
110
176
|
export { direct_pr_create }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { hook_decision, type GuardRun } from '#scripts/josh/hook-decision'
|
|
2
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
2
3
|
import { run_progress } from '#scripts/run/progress/run-progress'
|
|
3
4
|
import { run_progress_clock } from '#scripts/run/progress/run-progress-clock'
|
|
4
5
|
import { run_progress_config } from '#scripts/run/progress/run-progress-config'
|
|
@@ -105,7 +106,7 @@ function wait_duration_ms(command: string): number {
|
|
|
105
106
|
NO_SECONDS,
|
|
106
107
|
)
|
|
107
108
|
|
|
108
|
-
return seconds *
|
|
109
|
+
return seconds * MS_PER_SECOND
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
function is_armed(target: string, now_ms: number): boolean {
|
|
@@ -184,6 +184,13 @@ const ROW = {
|
|
|
184
184
|
is_trigger: bash_triggers.on_bash_command((command: string) => carries_a_file_body(command)),
|
|
185
185
|
reason: FILE_BODY_REASON,
|
|
186
186
|
decide: (): boolean => true,
|
|
187
|
+
about: {
|
|
188
|
+
title: 'No file body on the shell',
|
|
189
|
+
topic: '`file-edits.md`',
|
|
190
|
+
fires:
|
|
191
|
+
'a heredoc write to an existing file, a writing `node -e` / interpreter heredoc, or `perl -0pi -e`. Every occurrence',
|
|
192
|
+
quiet: 'a new file, a read-only heredoc, or a short `sed -i`',
|
|
193
|
+
},
|
|
187
194
|
}
|
|
188
195
|
|
|
189
196
|
const file_body = {
|
|
@@ -117,6 +117,13 @@ const ROW = {
|
|
|
117
117
|
is_trigger: bash_triggers.on_bash_command(bash_triggers.is_issue_filing),
|
|
118
118
|
reason: FILING_CAP_REASON,
|
|
119
119
|
decide,
|
|
120
|
+
about: {
|
|
121
|
+
title: 'The 10-Issue filing cap per run',
|
|
122
|
+
topic: '`.claude/skills/workflow-commands/prerequisite.md`, `observation-filing.md`',
|
|
123
|
+
fires:
|
|
124
|
+
'the 11th `pnpm josh issue:file` in a run that already has 10 filings not refused; failed calls do not count. Every occurrence',
|
|
125
|
+
quiet: 'fewer than 10 filings not refused',
|
|
126
|
+
},
|
|
120
127
|
}
|
|
121
128
|
|
|
122
129
|
const filing_cap = {
|
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
|
|
14
14
|
// The wrapper words that may stand in front of `git`, the same ones `run-tail-rule.ts` skips in front of
|
|
15
15
|
// `josh`: environment assignments, the package-manager launchers, `sudo`, `env`, and an opening
|
|
16
|
-
// subshell parenthesis. Left in, `sudo git push --force`,
|
|
17
|
-
// silently not a git command
|
|
16
|
+
// subshell parenthesis — plus `time` with its flags, read here only. Left in, `sudo git push --force`,
|
|
17
|
+
// `env git commit` and `(git push -f)` are silently not a git command, and
|
|
18
|
+
// `/usr/bin/time -p pnpm exec eslint .` is not an `eslint` run (joshuafolkken/kit#4356).
|
|
18
19
|
const ENV_ASSIGNMENT = /^[A-Za-z_]\w*=/u
|
|
19
20
|
const WRAPPER_WORDS: ReadonlySet<string> = new Set([
|
|
20
21
|
'pnpm',
|
|
@@ -24,7 +25,13 @@ const WRAPPER_WORDS: ReadonlySet<string> = new Set([
|
|
|
24
25
|
'sudo',
|
|
25
26
|
'command',
|
|
26
27
|
'env',
|
|
28
|
+
'time',
|
|
27
29
|
])
|
|
30
|
+
// The wrappers whose own flags stand between them and the program (`time -p`), skipped with them.
|
|
31
|
+
const FLAGGED_WRAPPERS: ReadonlySet<string> = new Set(['time'])
|
|
32
|
+
// Their flags that consume a separate following value (`time -o <file>`, `time -f <format>`), so the
|
|
33
|
+
// value is not read as the program.
|
|
34
|
+
const WRAPPER_VALUE_FLAGS: ReadonlySet<string> = new Set(['-o', '-f', '--output', '--format'])
|
|
28
35
|
const SUBSHELL_OPEN = '('
|
|
29
36
|
|
|
30
37
|
// The git global options that consume a **separate** following token as their value, so the parser
|
|
@@ -50,18 +57,50 @@ interface GitCall {
|
|
|
50
57
|
args: ReadonlyArray<string>
|
|
51
58
|
}
|
|
52
59
|
|
|
53
|
-
// Split on whitespace
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
const
|
|
60
|
+
// Split on whitespace outside quotes, keeping each quote in its word. A quoted span is one word, so
|
|
61
|
+
// `c='x; gh pr create'` is one environment assignment rather than an assignment followed by a `gh`
|
|
62
|
+
// call (joshuafolkken/kit#4091); a backslash-escaped character outside quotes opens no span, and a
|
|
63
|
+
// quote left unclosed is read as a plain character.
|
|
64
|
+
const WORD = /(?:\\.|'[^']*'|"(?:\\.|[^"\\])*"|\S)+/gsu
|
|
58
65
|
|
|
59
66
|
function words_of(segment: string): Array<string> {
|
|
60
|
-
return segment.
|
|
67
|
+
return segment.match(WORD) ?? []
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const PATH_SEPARATOR = '/'
|
|
71
|
+
|
|
72
|
+
// The program a word launches, read off the path's last component, so `/usr/bin/git` is `git`.
|
|
73
|
+
function program_name(word: string): string {
|
|
74
|
+
return word.slice(word.lastIndexOf(PATH_SEPARATOR) + NEXT)
|
|
61
75
|
}
|
|
62
76
|
|
|
63
77
|
function is_wrapper_token(word: string): boolean {
|
|
64
|
-
return
|
|
78
|
+
return (
|
|
79
|
+
word === SUBSHELL_OPEN || ENV_ASSIGNMENT.test(word) || WRAPPER_WORDS.has(program_name(word))
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// The words a flagged wrapper's flag spans, its value included; 0 when the word is not a flag.
|
|
84
|
+
function wrapper_flag_width(word = ''): number {
|
|
85
|
+
if (!word.startsWith(FLAG_PREFIX)) return 0
|
|
86
|
+
|
|
87
|
+
return WRAPPER_VALUE_FLAGS.has(word) ? AFTER_VALUE : NEXT
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The index after the wrapper word at `index`, past its own flags when it is a flagged wrapper.
|
|
91
|
+
function after_wrapper_word(words: ReadonlyArray<string>, index: number): number {
|
|
92
|
+
let next = index + NEXT
|
|
93
|
+
|
|
94
|
+
if (!FLAGGED_WRAPPERS.has(program_name(words[index] ?? ''))) return next
|
|
95
|
+
|
|
96
|
+
let width = wrapper_flag_width(words[next])
|
|
97
|
+
|
|
98
|
+
while (width > 0) {
|
|
99
|
+
next += width
|
|
100
|
+
width = wrapper_flag_width(words[next])
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return next
|
|
65
104
|
}
|
|
66
105
|
|
|
67
106
|
// Skip the wrapper: environment assignments, a launcher word, and a leading subshell parenthesis. The
|
|
@@ -69,7 +108,9 @@ function is_wrapper_token(word: string): boolean {
|
|
|
69
108
|
function after_wrapper(words: ReadonlyArray<string>): number {
|
|
70
109
|
let index = 0
|
|
71
110
|
|
|
72
|
-
while (index < words.length && is_wrapper_token(words[index] ?? ''))
|
|
111
|
+
while (index < words.length && is_wrapper_token(words[index] ?? '')) {
|
|
112
|
+
index = after_wrapper_word(words, index)
|
|
113
|
+
}
|
|
73
114
|
|
|
74
115
|
return index
|
|
75
116
|
}
|
|
@@ -94,14 +135,30 @@ function after_globals(words: ReadonlyArray<string>, start: number): number {
|
|
|
94
135
|
return index
|
|
95
136
|
}
|
|
96
137
|
|
|
138
|
+
interface ProgramCall {
|
|
139
|
+
name: string
|
|
140
|
+
args: Array<string>
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// The program the segment launches once the wrapper is skipped, with the words after it, or
|
|
144
|
+
// `undefined` for a segment with no program word.
|
|
145
|
+
function program_of(segment: string): ProgramCall | undefined {
|
|
146
|
+
const words = words_of(segment)
|
|
147
|
+
const command_index = after_wrapper(words)
|
|
148
|
+
const word = words[command_index]
|
|
149
|
+
|
|
150
|
+
if (word === undefined) return undefined
|
|
151
|
+
|
|
152
|
+
return { name: program_name(word), args: words.slice(command_index + NEXT) }
|
|
153
|
+
}
|
|
154
|
+
|
|
97
155
|
// The words after `command` once the wrapper is skipped, or `undefined` when the segment does not
|
|
98
156
|
// invoke it. `gh` and `rm` are judged by the same wrapper cut as `git`, so
|
|
99
157
|
// `env gh pr close` and `sudo rm -rf` are read as the calls they are.
|
|
100
158
|
function arguments_of(segment: string, command: string): Array<string> | undefined {
|
|
101
|
-
const
|
|
102
|
-
const command_index = after_wrapper(words)
|
|
159
|
+
const call = program_of(segment)
|
|
103
160
|
|
|
104
|
-
return
|
|
161
|
+
return call?.name === command ? call.args : undefined
|
|
105
162
|
}
|
|
106
163
|
|
|
107
164
|
// The subcommand and the arguments after it, or `undefined` when the segment is not a git invocation.
|
|
@@ -135,6 +192,7 @@ function short_cluster_has(token: string, letters: string): boolean {
|
|
|
135
192
|
return false
|
|
136
193
|
}
|
|
137
194
|
|
|
138
|
-
const git_argv = { arguments_of, parse, short_cluster_has }
|
|
195
|
+
const git_argv = { arguments_of, parse, program_of, short_cluster_has }
|
|
139
196
|
|
|
140
197
|
export { git_argv }
|
|
198
|
+
export type { ProgramCall }
|
|
@@ -24,6 +24,9 @@ import { shell_segments } from './shell-segments'
|
|
|
24
24
|
// deletes (`:branch`). Both open the refspec with a character the deny list cannot match as a literal.
|
|
25
25
|
const FORCE_LONG_PREFIX = '--force'
|
|
26
26
|
const DELETE_LONG = '--delete'
|
|
27
|
+
// `--mirror` force-updates every remote ref to the local set and deletes the rest; `--prune` deletes
|
|
28
|
+
// every remote branch with no local counterpart. Both are a delete with no refspec to read.
|
|
29
|
+
const DESTRUCTIVE_PUSH_LONG: ReadonlySet<string> = new Set([DELETE_LONG, '--mirror', '--prune'])
|
|
27
30
|
const PUSH_SHORT_LETTERS = 'fd'
|
|
28
31
|
const FORCE_OR_DELETE_REFSPEC = /^[+:]/u
|
|
29
32
|
|
|
@@ -31,7 +34,7 @@ function is_force_or_delete_push(args: ReadonlyArray<string>): boolean {
|
|
|
31
34
|
return args.some(
|
|
32
35
|
(argument) =>
|
|
33
36
|
argument.startsWith(FORCE_LONG_PREFIX) ||
|
|
34
|
-
argument
|
|
37
|
+
DESTRUCTIVE_PUSH_LONG.has(argument) ||
|
|
35
38
|
git_argv.short_cluster_has(argument, PUSH_SHORT_LETTERS) ||
|
|
36
39
|
FORCE_OR_DELETE_REFSPEC.test(argument),
|
|
37
40
|
)
|
|
@@ -66,7 +69,7 @@ function is_destructive_segment(segment: string): boolean {
|
|
|
66
69
|
// quoted inside another command's argument is read as the write it is not, exactly as every other
|
|
67
70
|
// trigger in this directory reads its own.
|
|
68
71
|
function is_force_or_delete(command: string): boolean {
|
|
69
|
-
return shell_segments.
|
|
72
|
+
return shell_segments.commands_of(command).some((segment) => is_destructive_segment(segment))
|
|
70
73
|
}
|
|
71
74
|
|
|
72
75
|
// The instruction in the shape a refusal can carry: what the command does and the one route left. The
|
|
@@ -87,6 +90,13 @@ const ROW = {
|
|
|
87
90
|
is_trigger: bash_triggers.on_bash_command(is_force_or_delete),
|
|
88
91
|
reason: GIT_FORCE_REASON,
|
|
89
92
|
decide: (): boolean => true,
|
|
93
|
+
about: {
|
|
94
|
+
title: 'Force push / branch delete',
|
|
95
|
+
topic: '`operating-rules.md`',
|
|
96
|
+
fires:
|
|
97
|
+
'a `git push` / `git branch` read as force (`--force` / `-f` / `-uf` …) or delete (`--delete` / `-d` / `-D` / `:branch`) in any spelling. Every occurrence',
|
|
98
|
+
quiet: 'a plain `git push` / `git branch`',
|
|
99
|
+
},
|
|
90
100
|
}
|
|
91
101
|
|
|
92
102
|
const git_force = {
|
|
@@ -52,7 +52,9 @@ const GUARD_REMEDIES: Readonly<Record<string, GuardRemedy>> = {
|
|
|
52
52
|
'raw-field-body': judgment('the body moves to a file the call does not name'),
|
|
53
53
|
'rule-body': judgment('a trigger-plus-pointer line is written, not derived'),
|
|
54
54
|
'direct-filing': judgment(ANOTHER_COMMAND),
|
|
55
|
+
'direct-issue-comment': judgment(ANOTHER_COMMAND),
|
|
55
56
|
'direct-pr-create': judgment(ANOTHER_COMMAND),
|
|
57
|
+
'pr-merge': judgment(ANOTHER_COMMAND),
|
|
56
58
|
'josh-git-bare': judgment(ANOTHER_COMMAND),
|
|
57
59
|
'run-tail': judgment(ANOTHER_COMMAND),
|
|
58
60
|
'pre-gate-cut': judgment(ANOTHER_COMMAND),
|
|
@@ -65,6 +67,8 @@ const GUARD_REMEDIES: Readonly<Record<string, GuardRemedy>> = {
|
|
|
65
67
|
'agent-model': judgment("which model fits the unit is the author's call"),
|
|
66
68
|
'lane-carry-conflict': judgment(ANOTHER_COMMAND),
|
|
67
69
|
'lane-switch-main': judgment(ANOTHER_COMMAND),
|
|
70
|
+
'lane-direct-tool': judgment(ANOTHER_COMMAND),
|
|
71
|
+
'timed-rerun': judgment(ANOTHER_COMMAND),
|
|
68
72
|
'oracle-consulted': judgment(ANOTHER_COMMAND),
|
|
69
73
|
'test-declared': judgment(ANOTHER_COMMAND),
|
|
70
74
|
batching: judgment(ANOTHER_COMMAND),
|
|
@@ -11,7 +11,7 @@ import { z } from 'zod'
|
|
|
11
11
|
// threshold crossing rather than once per run, that read can no longer be paid on every edit, so the
|
|
12
12
|
// verdict is cached beside the instant it was read and a burst of edits shares one read.
|
|
13
13
|
//
|
|
14
|
-
// **An in-memory memo cannot span two edits.** `pnpm josh
|
|
14
|
+
// **An in-memory memo cannot span two edits.** `pnpm josh pretool:guard` runs as a fresh process on each
|
|
15
15
|
// `PreToolUse`, so the cache is a per-checkout stamp rather than a module variable — the same handoff
|
|
16
16
|
// shape the refusal stamp itself uses.
|
|
17
17
|
//
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { agent_session_role } from '#scripts/agent/agent-session-role'
|
|
2
2
|
import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
|
|
3
3
|
import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
|
|
4
|
-
import { cost_format } from '#scripts/cost-runtime/cost-format'
|
|
5
4
|
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
6
5
|
import type { GuardRun } from '#scripts/josh/hook-decision'
|
|
7
6
|
import { lane_child_marker, type MarkerSource } from '#scripts/lane/lane-child-marker'
|
|
8
7
|
import { lane_paths } from '#scripts/lane/lane-paths'
|
|
8
|
+
import { figure_format } from '#scripts/lib/figure-format'
|
|
9
9
|
import { run_cut, type RunCut } from '#scripts/run/cut/run-cut'
|
|
10
10
|
import { run_cut_decline } from '#scripts/run/cut/run-cut-decline'
|
|
11
11
|
import { run_cut_handoff } from '#scripts/run/cut/run-cut-handoff'
|
|
@@ -170,8 +170,8 @@ function is_over_threshold_edit(
|
|
|
170
170
|
|
|
171
171
|
// **The threshold in the refusal text is assembled from the constant, never spelled**.
|
|
172
172
|
// A spelled literal is left behind when the shared threshold moves, telling agents the wrong number;
|
|
173
|
-
// building it from `CONTEXT_CUT_THRESHOLD` keeps the two from drifting. `
|
|
174
|
-
const THRESHOLD_TEXT = `${
|
|
173
|
+
// building it from `CONTEXT_CUT_THRESHOLD` keeps the two from drifting. `figure_format.format_tokens` renders it the way every cost report does.
|
|
174
|
+
const THRESHOLD_TEXT = `${figure_format.format_tokens(CONTEXT_CUT_THRESHOLD)}-token`
|
|
175
175
|
|
|
176
176
|
// The instruction in the shape a refusal can carry: the handoff in the format the parser reads, the
|
|
177
177
|
// cut, and the one verdict that ends the turn — `cut` is the only one, so a run told merely to "take
|
|
@@ -224,6 +224,14 @@ const ROW = {
|
|
|
224
224
|
'⛔ implementation-phase cut: this checkout is a lane dispatched',
|
|
225
225
|
"⛔ implementation-phase cut: this run's context crossed the",
|
|
226
226
|
],
|
|
227
|
+
about: {
|
|
228
|
+
title: 'The implementation-phase cut',
|
|
229
|
+
topic:
|
|
230
|
+
'`.claude/skills/workflow-commands/pre-gate-cut.md` → "It is a guard, fired at the edit that crosses the threshold"',
|
|
231
|
+
fires:
|
|
232
|
+
'an `Edit` / `Write` by an uncut lane child whose recent context is over the `pnpm josh cost --cut` threshold; it hands over `pnpm josh run:cut --impl <N> --handoff <path>`. At each threshold crossing',
|
|
233
|
+
quiet: 'not a lane child, a non-editing tool, already cut, or under the threshold',
|
|
234
|
+
},
|
|
227
235
|
}
|
|
228
236
|
|
|
229
237
|
const implementation_cut = {
|
|
@@ -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 }
|
|
@@ -21,7 +21,7 @@ const ISSUE_VIEW_COMMAND = new RegExp(String.raw`^gh\s+${gh_api.GH_FLAGS}issue\s
|
|
|
21
21
|
// (`…/issues`) and every sub-resource under it (`…/issues/1319/comments`) are left alone.
|
|
22
22
|
const ISSUE_BODY_PATH = /repos\/[^\s'"]*\/issues\/\d+(?=$|["'\s])/u
|
|
23
23
|
// **A write to that path is not a read of it**, which is why the body read below asks `gh_api.is_read`:
|
|
24
|
-
// `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
|
|
25
25
|
// normalize a title and to fill a blank body — so without the read check the delivery would be spent
|
|
26
26
|
// refusing a write, and the genuine body read later in the same run would never be guarded.
|
|
27
27
|
// A segment that fetches comments: the flag, a `comments` field in a `--json` projection, or the
|
|
@@ -164,6 +164,14 @@ const ROW = {
|
|
|
164
164
|
rewrite_note: COMMENTS_NOTE,
|
|
165
165
|
// The opening the reason carried before it led with the command.
|
|
166
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
|
+
},
|
|
167
175
|
}
|
|
168
176
|
|
|
169
177
|
const issue_comments = {
|
|
@@ -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 = {
|