@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
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
|
+
import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
|
|
3
|
+
import { run_label } from '#scripts/run/run-label'
|
|
4
|
+
import { run_hold } from './run-hold'
|
|
5
|
+
|
|
6
|
+
// `josh run:hold --adopt <N>` — a `new` run's hand-over once its Issue is filed (joshuafolkken/kit#4156).
|
|
7
|
+
// The unnumbered record is re-keyed in place to `<N>`, so every later stop of the run releases with
|
|
8
|
+
// `run:release <N>` and that release takes `in-progress` back off; the adopt applies the label the
|
|
9
|
+
// numbered entry would have. **In place, not released and re-claimed**: a release would free the tree
|
|
10
|
+
// for a moment another session could claim it in, and the record's owner and stop marks stay as written.
|
|
11
|
+
|
|
12
|
+
const ADOPTED = 'adopted'
|
|
13
|
+
// The tree holds no record, so there is nothing to hand over.
|
|
14
|
+
const NO_RECORD = 'none'
|
|
15
|
+
const FOREIGN = 'foreign'
|
|
16
|
+
const UNREADABLE = 'unreadable'
|
|
17
|
+
|
|
18
|
+
type AdoptResult = typeof ADOPTED | typeof FOREIGN | typeof NO_RECORD | typeof UNREADABLE
|
|
19
|
+
|
|
20
|
+
// The record re-keyed: the unnumbered run's own, or one already naming `<N>` — a repeated adopt is
|
|
21
|
+
// the same hand-over, so it answers alike. Another issue's record is never touched.
|
|
22
|
+
function rekey(target: string, issue: string): AdoptResult {
|
|
23
|
+
const read = run_hold.read_hold(target)
|
|
24
|
+
|
|
25
|
+
if (read.kind === 'unreadable') return UNREADABLE
|
|
26
|
+
|
|
27
|
+
const hold = run_halfrun_resume.hold_of(read)
|
|
28
|
+
|
|
29
|
+
if (hold === undefined) return NO_RECORD
|
|
30
|
+
|
|
31
|
+
if (hold.issue !== run_hold.UNNUMBERED_ISSUE && hold.issue !== issue) return FOREIGN
|
|
32
|
+
|
|
33
|
+
stamp_file.write_stamp(target, { ...hold, issue })
|
|
34
|
+
|
|
35
|
+
return ADOPTED
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function no_record_message(issue: string): string {
|
|
39
|
+
return `run:hold --adopt: this tree holds no record to adopt — claim it with \`pnpm josh run:hold ${issue}\`.`
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Not the claim race's message: that one advises `--force`, which here would free another run's tree.
|
|
43
|
+
function foreign_message(issue: string): string {
|
|
44
|
+
return `run:hold --adopt: this tree is held for another issue, so it is not handed to issue ${issue}; \`--adopt\` only re-keys a \`new\` run's unnumbered record.`
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function adopt(target: string, issue: string): Promise<AdoptResult> {
|
|
48
|
+
const result = rekey(target, issue)
|
|
49
|
+
|
|
50
|
+
if (result === ADOPTED) await run_label.mark(issue)
|
|
51
|
+
|
|
52
|
+
return result
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const run_hold_adopt = {
|
|
56
|
+
ADOPTED,
|
|
57
|
+
NO_RECORD,
|
|
58
|
+
UNREADABLE,
|
|
59
|
+
adopt,
|
|
60
|
+
foreign_message,
|
|
61
|
+
no_record_message,
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export type { AdoptResult }
|
|
65
|
+
export { run_hold_adopt }
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
2
|
import { run_cli_fault } from '#scripts/run/run-cli-fault'
|
|
5
3
|
import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
|
|
@@ -7,7 +5,10 @@ import { run_label } from '#scripts/run/run-label'
|
|
|
7
5
|
import { run_preflight, type PreflightDecision } from '#scripts/run/run-preflight'
|
|
8
6
|
import { run_prrun_resume } from '#scripts/run/run-prrun-resume'
|
|
9
7
|
import { run_tidy_cli } from '#scripts/run/tidy/run-tidy-cli'
|
|
8
|
+
import { test_e2e_stamp } from '#scripts/test/test-e2e-stamp'
|
|
10
9
|
import { run_hold, type HoldRead, type RunHold } from './run-hold'
|
|
10
|
+
import { run_hold_adopt } from './run-hold-adopt'
|
|
11
|
+
import { run_stop_notify } from './run-stop-notify'
|
|
11
12
|
|
|
12
13
|
// `josh run:hold [<N>]` and `josh run:release [<N> | --force]` — the working-tree guard the typed
|
|
13
14
|
// entry points ask before they start.
|
|
@@ -37,7 +38,6 @@ import { run_hold, type HoldRead, type RunHold } from './run-hold'
|
|
|
37
38
|
|
|
38
39
|
const SUCCESS_EXIT_CODE = 0
|
|
39
40
|
const FAILURE_EXIT_CODE = 1
|
|
40
|
-
const ARGV_OFFSET = 2
|
|
41
41
|
const RELEASE_FLAG = '--release'
|
|
42
42
|
// What removes a record this run did not write. **Deliberate friction**: every release names the run
|
|
43
43
|
// it belongs to, and the one act that cannot — clearing a record somebody else left behind — is
|
|
@@ -49,10 +49,14 @@ const FULLRUN_FLAG = '--fullrun'
|
|
|
49
49
|
const HALFRUN_STOP_FLAG = '--halfrun-stop'
|
|
50
50
|
// A `prrun`'s stop before merge: its record keeps the commit it stopped on.
|
|
51
51
|
const PRRUN_STOP_FLAG = '--prrun-stop'
|
|
52
|
+
// A `needs-human-review` stop: marked as a `halfrun` stop is, with its own confirmation.
|
|
53
|
+
const HUMAN_REVIEW_STOP_FLAG = '--human-review-stop'
|
|
54
|
+
// A `new` run's hand-over of its unnumbered record to the Issue it filed (`run-hold-adopt.ts`).
|
|
55
|
+
const ADOPT_FLAG = '--adopt'
|
|
52
56
|
// The most a claim reads: the issue number and the one flag after it.
|
|
53
57
|
const MAX_CLAIM_ARGUMENTS = 2
|
|
54
58
|
const USAGE =
|
|
55
|
-
'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --prrun-stop]] | josh run:release [<issue-number> | --force]'
|
|
59
|
+
'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --human-review-stop | --prrun-stop]] | josh run:hold --adopt <issue-number> | josh run:release [<issue-number> | --force]'
|
|
56
60
|
|
|
57
61
|
const COMMAND = 'run:hold'
|
|
58
62
|
|
|
@@ -64,10 +68,16 @@ const NONE_VERDICT = 'none'
|
|
|
64
68
|
// The record is another run's, so nothing was removed. **It is not `none`**: a release that did not
|
|
65
69
|
// happen must never read to a script as a tree it has just freed.
|
|
66
70
|
const HELD_VERDICT = 'held'
|
|
71
|
+
// A stop before commit asked on a tree `josh test:e2e` has not answered green on: nothing was marked.
|
|
72
|
+
const E2E_OWED_VERDICT = 'e2e-owed'
|
|
67
73
|
|
|
68
74
|
const FORCE_RELEASE_KIND = 'force-release'
|
|
69
75
|
const HALFRUN_STOP_KIND = 'halfrun-stop'
|
|
76
|
+
const HUMAN_REVIEW_STOP_KIND = 'human-review-stop'
|
|
70
77
|
const PRRUN_STOP_KIND = 'prrun-stop'
|
|
78
|
+
const ADOPT_KIND = 'adopt'
|
|
79
|
+
|
|
80
|
+
type StopKind = typeof HALFRUN_STOP_KIND | typeof HUMAN_REVIEW_STOP_KIND | typeof PRRUN_STOP_KIND
|
|
71
81
|
|
|
72
82
|
interface ClaimRequest {
|
|
73
83
|
kind: 'claim'
|
|
@@ -76,18 +86,25 @@ interface ClaimRequest {
|
|
|
76
86
|
}
|
|
77
87
|
|
|
78
88
|
interface StopRequest {
|
|
79
|
-
kind:
|
|
89
|
+
kind: StopKind
|
|
80
90
|
issue: string
|
|
81
91
|
}
|
|
82
92
|
|
|
83
93
|
type HoldRequest =
|
|
84
94
|
| ClaimRequest
|
|
85
95
|
| StopRequest
|
|
96
|
+
| { kind: typeof ADOPT_KIND; issue: string }
|
|
86
97
|
| { kind: 'release'; claimant: string }
|
|
87
98
|
| { kind: typeof FORCE_RELEASE_KIND }
|
|
88
99
|
|
|
100
|
+
const STOP_KINDS: ReadonlySet<string> = new Set([
|
|
101
|
+
HALFRUN_STOP_KIND,
|
|
102
|
+
HUMAN_REVIEW_STOP_KIND,
|
|
103
|
+
PRRUN_STOP_KIND,
|
|
104
|
+
])
|
|
105
|
+
|
|
89
106
|
function is_stop_request(request: HoldRequest): request is StopRequest {
|
|
90
|
-
return
|
|
107
|
+
return STOP_KINDS.has(request.kind)
|
|
91
108
|
}
|
|
92
109
|
|
|
93
110
|
const FORCE_RELEASE_REQUEST: HoldRequest = { kind: FORCE_RELEASE_KIND }
|
|
@@ -96,14 +113,14 @@ function release_request(claimant: string): HoldRequest {
|
|
|
96
113
|
return { kind: 'release', claimant }
|
|
97
114
|
}
|
|
98
115
|
|
|
99
|
-
const STOP_KIND_BY_FLAG: ReadonlyMap<string,
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
116
|
+
const STOP_KIND_BY_FLAG: ReadonlyMap<string, StopKind> = new Map([
|
|
117
|
+
[HALFRUN_STOP_FLAG, HALFRUN_STOP_KIND],
|
|
118
|
+
[HUMAN_REVIEW_STOP_FLAG, HUMAN_REVIEW_STOP_KIND],
|
|
119
|
+
[PRRUN_STOP_FLAG, PRRUN_STOP_KIND],
|
|
120
|
+
])
|
|
104
121
|
|
|
105
|
-
// The flag after a numbered claim: absent, `--fullrun`, `--halfrun-stop
|
|
106
|
-
// else is a usage error.
|
|
122
|
+
// The flag after a numbered claim: absent, `--fullrun`, `--halfrun-stop`, `--human-review-stop` or
|
|
123
|
+
// `--prrun-stop`. Anything else is a usage error.
|
|
107
124
|
function numbered_claim(issue: string, flag: string | undefined): HoldRequest | undefined {
|
|
108
125
|
if (flag === undefined) return { kind: 'claim', issue }
|
|
109
126
|
|
|
@@ -142,9 +159,21 @@ function parse_release(argv: ReadonlyArray<string>): HoldRequest | undefined {
|
|
|
142
159
|
return argv.length > 1 ? undefined : parse_release_argument(first)
|
|
143
160
|
}
|
|
144
161
|
|
|
162
|
+
function parse_adopt(argv: ReadonlyArray<string>): HoldRequest | undefined {
|
|
163
|
+
const [issue] = argv
|
|
164
|
+
|
|
165
|
+
if (issue === undefined || argv.length > 1) return undefined
|
|
166
|
+
|
|
167
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue)
|
|
168
|
+
? { kind: ADOPT_KIND, issue }
|
|
169
|
+
: undefined
|
|
170
|
+
}
|
|
171
|
+
|
|
145
172
|
function parse_request(argv: ReadonlyArray<string>): HoldRequest | undefined {
|
|
146
173
|
if (argv[0] === RELEASE_FLAG) return parse_release(argv.slice(1))
|
|
147
174
|
|
|
175
|
+
if (argv[0] === ADOPT_FLAG) return parse_adopt(argv.slice(1))
|
|
176
|
+
|
|
148
177
|
return parse_claim(argv)
|
|
149
178
|
}
|
|
150
179
|
|
|
@@ -339,25 +368,73 @@ function report_usage(): number {
|
|
|
339
368
|
return FAILURE_EXIT_CODE
|
|
340
369
|
}
|
|
341
370
|
|
|
371
|
+
const SEND_BY_KIND: Readonly<Record<StopKind, (target: string, issue: string) => Promise<void>>> = {
|
|
372
|
+
[HALFRUN_STOP_KIND]: run_stop_notify.send_halfrun,
|
|
373
|
+
[HUMAN_REVIEW_STOP_KIND]: run_stop_notify.send_human_review,
|
|
374
|
+
[PRRUN_STOP_KIND]: run_stop_notify.send_prrun,
|
|
375
|
+
}
|
|
376
|
+
|
|
342
377
|
// **A `halfrun` stop marks its own record** — the positive "this run has ended over its verified diff"
|
|
343
|
-
// that `run:entry` adopts on `fullrun #N`. Another run's record is left alone. A `
|
|
344
|
-
//
|
|
378
|
+
// that `run:entry` adopts on `fullrun #N`. Another run's record is left alone. A `needs-human-review`
|
|
379
|
+
// stop is the same mark, since its resume is `halfrun`'s. A `prrun` stop marks its record the same
|
|
380
|
+
// way, with the commit it stopped on. **A marked stop then sends its own `confirmation`**
|
|
381
|
+
// (`run-stop-notify.ts`), after the mark, since the mark rewrites the record its send is stamped on.
|
|
382
|
+
async function marked_stop(target: string, request: StopRequest): Promise<number> {
|
|
383
|
+
await SEND_BY_KIND[request.kind](target, request.issue)
|
|
384
|
+
|
|
385
|
+
return report_hold()
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// **A stop before commit has no CI E2E job behind it**, so it is refused until `josh test:e2e` has
|
|
389
|
+
// answered green on this exact tree (`test-e2e-stamp.ts`). A `prrun` stop has a pull request, and CI's.
|
|
390
|
+
async function e2e_refusal(request: StopRequest): Promise<number | undefined> {
|
|
391
|
+
if (request.kind === PRRUN_STOP_KIND || (await test_e2e_stamp.is_current_tree())) return undefined
|
|
392
|
+
|
|
393
|
+
return report(
|
|
394
|
+
'run:hold: `pnpm josh test:e2e` has not answered green on this tree — run it, then mark the stop again.',
|
|
395
|
+
E2E_OWED_VERDICT,
|
|
396
|
+
FAILURE_EXIT_CODE,
|
|
397
|
+
)
|
|
398
|
+
}
|
|
399
|
+
|
|
345
400
|
async function mark_stop(target: string, request: StopRequest): Promise<number> {
|
|
401
|
+
const refusal = await e2e_refusal(request)
|
|
402
|
+
|
|
403
|
+
if (refusal !== undefined) return refusal
|
|
404
|
+
|
|
346
405
|
const mark =
|
|
347
406
|
request.kind === PRRUN_STOP_KIND
|
|
348
407
|
? await run_prrun_resume.mark_stop_at(target, request.issue)
|
|
349
408
|
: run_halfrun_resume.mark_stop_at(target, request.issue)
|
|
350
409
|
|
|
351
|
-
if (mark === run_halfrun_resume.MARKED) return
|
|
410
|
+
if (mark === run_halfrun_resume.MARKED) return await marked_stop(target, request)
|
|
352
411
|
|
|
353
412
|
if (mark === run_halfrun_resume.UNREADABLE) return report_unreadable_record()
|
|
354
413
|
|
|
355
414
|
return report_busy(run_hold.race_message(run_hold.read_hold(target), target))
|
|
356
415
|
}
|
|
357
416
|
|
|
417
|
+
// The re-keyed record answers `hold`; no record answers `none` and another issue's `busy`, each a
|
|
418
|
+
// failure, since the run asking holds nothing it can stop on.
|
|
419
|
+
async function adopt(target: string, issue: string): Promise<number> {
|
|
420
|
+
const result = await run_hold_adopt.adopt(target, issue)
|
|
421
|
+
|
|
422
|
+
if (result === run_hold_adopt.ADOPTED) return report_hold()
|
|
423
|
+
|
|
424
|
+
if (result === run_hold_adopt.UNREADABLE) return report_unreadable_record()
|
|
425
|
+
|
|
426
|
+
if (result === run_hold_adopt.NO_RECORD) {
|
|
427
|
+
return report(run_hold_adopt.no_record_message(issue), NONE_VERDICT, FAILURE_EXIT_CODE)
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
return report(run_hold_adopt.foreign_message(issue), BUSY_VERDICT, FAILURE_EXIT_CODE)
|
|
431
|
+
}
|
|
432
|
+
|
|
358
433
|
async function dispatch(request: HoldRequest, target: string, is_linked: boolean): Promise<number> {
|
|
359
434
|
if (request.kind === 'claim') return await claim(target, request, is_linked)
|
|
360
435
|
|
|
436
|
+
if (request.kind === ADOPT_KIND) return await adopt(target, request.issue)
|
|
437
|
+
|
|
361
438
|
if (is_stop_request(request)) return await mark_stop(target, request)
|
|
362
439
|
|
|
363
440
|
if (request.kind === FORCE_RELEASE_KIND) return force_release(target)
|
|
@@ -392,10 +469,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
392
469
|
}
|
|
393
470
|
}
|
|
394
471
|
|
|
395
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
396
|
-
process.exitCode = await run(argv)
|
|
397
|
-
}
|
|
398
|
-
|
|
399
472
|
const run_hold_cli = {
|
|
400
473
|
BUSY_VERDICT,
|
|
401
474
|
HELD_VERDICT,
|
|
@@ -408,6 +481,4 @@ const run_hold_cli = {
|
|
|
408
481
|
run,
|
|
409
482
|
}
|
|
410
483
|
|
|
411
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
412
|
-
|
|
413
484
|
export { run_hold_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_hold_cli } from './run-hold-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh run:hold` and `josh run:release` entry, kept apart from `run-hold-cli.ts` because other
|
|
6
|
+
// modules import that one: a bundle is one file, so a main guard there would fire for every command
|
|
7
|
+
// that carries it (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await run_hold_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
2
|
+
import { run_hold, type RunHold, type SessionOwner } from './run-hold'
|
|
3
|
+
import { run_hold_session } from './run-hold-session'
|
|
4
|
+
|
|
5
|
+
// Whether this session is one of a run's own (joshuafolkken/kit#4099): a lane child, or the session
|
|
6
|
+
// holding the run's hold on this working tree. The run's event stream is the repository's, so a
|
|
7
|
+
// session outside the run — a question answered beside a `backlogrun` — writes to it too, and what it
|
|
8
|
+
// files is not the run's.
|
|
9
|
+
//
|
|
10
|
+
// **Unknown is outside.** Unlike the `Stop` hook's question (`run-hold-session.ts`), a hold or a session
|
|
11
|
+
// with no owner recorded is not this session's: counting another session's filing as the run's is the
|
|
12
|
+
// failure this answers.
|
|
13
|
+
|
|
14
|
+
function is_owned(hold: RunHold, owner: SessionOwner): boolean {
|
|
15
|
+
if (hold.owner_pid === undefined || owner.owner_pid === undefined) return false
|
|
16
|
+
|
|
17
|
+
return run_hold_session.is_session_hold(hold, owner)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async function is_hold_owner(owner: SessionOwner): Promise<boolean> {
|
|
21
|
+
const directory = await run_hold.worktree_directory()
|
|
22
|
+
if (directory === undefined) return false
|
|
23
|
+
|
|
24
|
+
const read = run_hold.read_hold(run_hold.hold_path(directory))
|
|
25
|
+
|
|
26
|
+
return read.kind === 'held' && is_owned(read.hold, owner)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function is_run_member(owner: SessionOwner = run_hold.session_owner()): Promise<boolean> {
|
|
30
|
+
if (lane_child_marker.marked_issue() !== undefined) return true
|
|
31
|
+
|
|
32
|
+
return await is_hold_owner(owner)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const run_hold_member = { is_run_member }
|
|
36
|
+
|
|
37
|
+
export { run_hold_member }
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
|
+
import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
|
|
3
|
+
import { run_hold, type RunHold, type SessionOwner } from './run-hold'
|
|
4
|
+
|
|
5
|
+
// What the `Stop` hook asks of a hold beyond "is one in place" (joshuafolkken/kit#3961): whether it is
|
|
6
|
+
// this session's own run's, and whether its pause was already announced.
|
|
7
|
+
//
|
|
8
|
+
// **Another run's hold is not this session's pause.** A `kickoff`, or a question answered while a
|
|
9
|
+
// `backlogrun` parent holds the same tree, stops in a session that holds nothing — announcing that stop
|
|
10
|
+
// as the held run's "confirmation required" reports a decision nobody is waiting on.
|
|
11
|
+
//
|
|
12
|
+
// **Unknown is this session's own.** A record written outside an agent session, or a hook that cannot
|
|
13
|
+
// read its own session, keeps the behavior the hold had before ownership was recorded: a missed notify
|
|
14
|
+
// costs a person a silent pause, a wrong one only a needless Telegram.
|
|
15
|
+
|
|
16
|
+
function is_same_start(recorded: string | undefined, own: string | undefined): boolean {
|
|
17
|
+
return recorded === undefined || own === undefined || recorded === own
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function is_session_hold(hold: RunHold, owner: SessionOwner = run_hold.session_owner()): boolean {
|
|
21
|
+
if (hold.owner_pid === undefined || owner.owner_pid === undefined) return true
|
|
22
|
+
|
|
23
|
+
return hold.owner_pid === owner.owner_pid && is_same_start(hold.owner_start, owner.owner_start)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// **A pause is announced once, and a person's prompt ends it.** The hook's own send is recorded on the
|
|
27
|
+
// hold, so a later stop of the same pause — a background notice that woke the session — finds it; a send before `pause_start` belongs to an earlier pause. An unknown start
|
|
28
|
+
// announces again: a needless Telegram costs less than a silent wait.
|
|
29
|
+
function is_notified_since(hold: RunHold, pause_start: string | undefined): boolean {
|
|
30
|
+
if (pause_start === undefined || hold.notified_at === undefined) return false
|
|
31
|
+
|
|
32
|
+
return Date.parse(hold.notified_at) >= Date.parse(pause_start)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Stamps the send on the record in place; a tree no longer held has nothing to stamp. A stale record is
|
|
36
|
+
// stamped too: the hook reads it as the hold (`hold_of`), so a run past the expiry age still finds its send.
|
|
37
|
+
function mark_notified(target: string, now: Date = new Date()): void {
|
|
38
|
+
const hold = run_halfrun_resume.hold_of(run_hold.read_hold(target, now))
|
|
39
|
+
if (hold === undefined) return
|
|
40
|
+
|
|
41
|
+
stamp_file.write_stamp(target, { ...hold, notified_at: now.toISOString() })
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const run_hold_session = { is_notified_since, is_session_hold, mark_notified }
|
|
45
|
+
|
|
46
|
+
export { run_hold_session }
|
|
@@ -65,6 +65,10 @@ interface RunHold {
|
|
|
65
65
|
// fields, or by a claim made outside an agent session.
|
|
66
66
|
owner_pid?: number | undefined
|
|
67
67
|
owner_start?: string | undefined
|
|
68
|
+
// When the `Stop` hook last sent this run's `confirmation` Telegram — its own send leaves no command
|
|
69
|
+
// on the transcript, so the record is what keeps one pause from being announced twice
|
|
70
|
+
// (`run-hold-session.ts`).
|
|
71
|
+
notified_at?: string | undefined
|
|
68
72
|
}
|
|
69
73
|
|
|
70
74
|
type HoldRead =
|
|
@@ -107,6 +111,7 @@ const run_hold_schema = z.object({
|
|
|
107
111
|
prrun_stop_head: z.string().optional(),
|
|
108
112
|
owner_pid: z.number().optional(),
|
|
109
113
|
owner_start: z.string().optional(),
|
|
114
|
+
notified_at: z.string().optional(),
|
|
110
115
|
})
|
|
111
116
|
|
|
112
117
|
// `undefined` for anything that is not a well-formed record, so the caller decides what a broken one
|
|
@@ -342,6 +347,7 @@ const run_hold = {
|
|
|
342
347
|
race_message,
|
|
343
348
|
read_hold,
|
|
344
349
|
release_hold,
|
|
350
|
+
session_owner,
|
|
345
351
|
stale_message,
|
|
346
352
|
uncommitted_message,
|
|
347
353
|
unknown_message,
|
|
@@ -350,5 +356,5 @@ const run_hold = {
|
|
|
350
356
|
write_hold,
|
|
351
357
|
}
|
|
352
358
|
|
|
353
|
-
export type { HoldRead, RunHold, StopMarkFields }
|
|
359
|
+
export type { HoldRead, RunHold, SessionOwner, StopMarkFields }
|
|
354
360
|
export { run_hold }
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
2
|
+
import { git_gh_pr_read } from '#scripts/gh/git-gh-pr-read'
|
|
3
|
+
import { git_gh_repo } from '#scripts/gh/git-gh-repo'
|
|
4
|
+
import { git_command } from '#scripts/git/git-command'
|
|
5
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
6
|
+
import { stdout_on_stderr } from '#scripts/lib/stdout-on-stderr'
|
|
7
|
+
import { telegram_test } from '#scripts/notify/telegram-test'
|
|
8
|
+
import type { CliValues } from '#scripts/notify/telegram-test-logic'
|
|
9
|
+
import { run_stage } from '#scripts/run/run-stage'
|
|
10
|
+
import { run_hold_session } from './run-hold-session'
|
|
11
|
+
|
|
12
|
+
// The `confirmation` a `halfrun`, `needs-human-review` or `prrun` stop sends from `josh run:hold
|
|
13
|
+
// --halfrun-stop` / `--human-review-stop` / `--prrun-stop` (joshuafolkken/kit#4135, #4156): every line is fixed once the Issue, its title and the pull
|
|
14
|
+
// request are known, so it is composed here rather than copied from prose. The send goes through
|
|
15
|
+
// `josh notify`'s own call and is stamped on the hold, so the `Stop` hook's own confirmation
|
|
16
|
+
// (`stop-actions.ts`) finds the pause announced and does not send it again.
|
|
17
|
+
//
|
|
18
|
+
// **A failed send does not fail the stop**: the mark is written, and an unstamped hold is exactly what
|
|
19
|
+
// lets the `Stop` hook send the confirmation in its place.
|
|
20
|
+
|
|
21
|
+
const TITLE_PLACEHOLDER = '<title>'
|
|
22
|
+
const PR_PLACEHOLDER = '<pr-url>'
|
|
23
|
+
const HALFRUN = 'halfrun'
|
|
24
|
+
const PRRUN = 'prrun'
|
|
25
|
+
// Single quotes expand nothing, so a title stays one argument whatever it carries; its own `'` closes
|
|
26
|
+
// the quote, emits an escaped one and reopens.
|
|
27
|
+
const QUOTE = "'"
|
|
28
|
+
|
|
29
|
+
interface StopFacts {
|
|
30
|
+
issue: string
|
|
31
|
+
title: string | undefined
|
|
32
|
+
issue_url: string | undefined
|
|
33
|
+
pr_url?: string | undefined
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface Composed {
|
|
37
|
+
values: CliValues
|
|
38
|
+
title: string | undefined
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function single_quoted(text: string): string {
|
|
42
|
+
return QUOTE + text.replaceAll(QUOTE, String.raw`'\''`) + QUOTE
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Plain, not linked: every line is a command a person copies out of the Telegram.
|
|
46
|
+
function reference_of(facts: StopFacts): string {
|
|
47
|
+
return issue_cite.plain(facts.issue)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function commit_title(facts: StopFacts): string {
|
|
51
|
+
return single_quoted(`${facts.title ?? TITLE_PLACEHOLDER} ${reference_of(facts)}`)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function with_urls(values: CliValues, facts: StopFacts): CliValues {
|
|
55
|
+
const with_issue =
|
|
56
|
+
facts.issue_url === undefined ? values : { ...values, 'issue-url': facts.issue_url }
|
|
57
|
+
|
|
58
|
+
return facts.pr_url === undefined ? with_issue : { ...with_issue, 'pr-url': facts.pr_url }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function halfrun_values(facts: StopFacts): CliValues {
|
|
62
|
+
const title = commit_title(facts)
|
|
63
|
+
const body = [
|
|
64
|
+
'halfrun ready for manual verification',
|
|
65
|
+
run_stage.next_line(HALFRUN, facts.issue),
|
|
66
|
+
`Without an agent: pnpm josh git -y ${title} && pnpm josh followup ${title}`,
|
|
67
|
+
].join('\n')
|
|
68
|
+
const values: CliValues = {
|
|
69
|
+
'task-type': 'confirmation',
|
|
70
|
+
body,
|
|
71
|
+
recommended: `Verify by hand, then prrun ${reference_of(facts)}`,
|
|
72
|
+
alternative: [`fullrun ${reference_of(facts)}`],
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return with_urls(values, facts)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// A `needs-human-review` stop resumes as `halfrun`'s does, so its next line is `halfrun`'s; the lane
|
|
79
|
+
// directory is named because the uncommitted work a person must look at lives only there.
|
|
80
|
+
function human_review_values(facts: StopFacts, directory: string): CliValues {
|
|
81
|
+
const body = [
|
|
82
|
+
'needs-human-review: implemented and gated, stopped before the commit',
|
|
83
|
+
run_stage.next_line(HALFRUN, facts.issue),
|
|
84
|
+
`Working tree: ${directory}`,
|
|
85
|
+
].join('\n')
|
|
86
|
+
const values: CliValues = {
|
|
87
|
+
'task-type': 'confirmation',
|
|
88
|
+
body,
|
|
89
|
+
recommended: `Review the working tree, then prrun ${reference_of(facts)}`,
|
|
90
|
+
alternative: [`fullrun ${reference_of(facts)}`],
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return with_urls(values, facts)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function prrun_values(facts: StopFacts): CliValues {
|
|
97
|
+
const body = [
|
|
98
|
+
`prrun ready to merge: ${facts.pr_url ?? PR_PLACEHOLDER}`,
|
|
99
|
+
run_stage.next_line(PRRUN, facts.issue),
|
|
100
|
+
`After a manual merge, without an agent: pnpm josh followup ${commit_title(facts)}`,
|
|
101
|
+
].join('\n')
|
|
102
|
+
const values: CliValues = {
|
|
103
|
+
'task-type': 'confirmation',
|
|
104
|
+
body,
|
|
105
|
+
recommended: `fullrun ${reference_of(facts)}`,
|
|
106
|
+
alternative: ['Merge by hand, then pnpm josh followup'],
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return with_urls(values, facts)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function issue_facts(issue: string): Promise<StopFacts> {
|
|
113
|
+
const slug = await git_gh_repo.repo_get_name_with_owner()
|
|
114
|
+
const title = await git_gh_issue_read.issue_get_title(issue)
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
issue,
|
|
118
|
+
title,
|
|
119
|
+
issue_url: slug === undefined ? undefined : issue_cite.issue_url(slug, issue),
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function prrun_facts(issue: string): Promise<StopFacts> {
|
|
124
|
+
const pr_url = await git_gh_pr_read.pr_get_url(await git_command.branch())
|
|
125
|
+
|
|
126
|
+
return { ...(await issue_facts(issue)), pr_url }
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// The title is passed with the values, so the send does not read it a second time.
|
|
130
|
+
async function send_composed(target: string, compose: () => Promise<Composed>): Promise<void> {
|
|
131
|
+
const { values, title } = await compose()
|
|
132
|
+
const titled = title === undefined ? values : { ...values, 'issue-title': title }
|
|
133
|
+
|
|
134
|
+
await stdout_on_stderr.run(async () => {
|
|
135
|
+
await telegram_test.send_values(titled)
|
|
136
|
+
})
|
|
137
|
+
run_hold_session.mark_notified(target)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// A `gh` read that fails is a send that did not happen, never a failed stop: the mark is already written.
|
|
141
|
+
async function send(target: string, compose: () => Promise<Composed>): Promise<void> {
|
|
142
|
+
try {
|
|
143
|
+
await send_composed(target, compose)
|
|
144
|
+
} catch (error) {
|
|
145
|
+
console.error(`⚠️ run:hold could not send the stop confirmation: ${String(error)}`)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async function send_halfrun(target: string, issue: string): Promise<void> {
|
|
150
|
+
await send(target, async () => {
|
|
151
|
+
const facts = await issue_facts(issue)
|
|
152
|
+
|
|
153
|
+
return { values: halfrun_values(facts), title: facts.title }
|
|
154
|
+
})
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async function send_prrun(target: string, issue: string): Promise<void> {
|
|
158
|
+
await send(target, async () => {
|
|
159
|
+
const facts = await prrun_facts(issue)
|
|
160
|
+
|
|
161
|
+
return { values: prrun_values(facts), title: facts.title }
|
|
162
|
+
})
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function send_human_review(target: string, issue: string): Promise<void> {
|
|
166
|
+
await send(target, async () => {
|
|
167
|
+
const facts = await issue_facts(issue)
|
|
168
|
+
const directory = await git_command.repository_root()
|
|
169
|
+
|
|
170
|
+
return { values: human_review_values(facts, directory), title: facts.title }
|
|
171
|
+
})
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const run_stop_notify = {
|
|
175
|
+
halfrun_values,
|
|
176
|
+
human_review_values,
|
|
177
|
+
prrun_values,
|
|
178
|
+
send_halfrun,
|
|
179
|
+
send_human_review,
|
|
180
|
+
send_prrun,
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export { run_stop_notify }
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { setPriority } from 'node:os'
|
|
2
|
+
|
|
3
|
+
// **A launched session runs below the interactive one, so a saturated machine still answers the
|
|
4
|
+
// user.** Every headless session and everything it starts — gates, tests, builds — used to share the
|
|
5
|
+
// interactive session's priority, and at a load of ~30 the lanes took the terminal's responsiveness
|
|
6
|
+
// with them (#3947). The niceness is set on the child right after `spawn` returns: a process inherits
|
|
7
|
+
// its parent's niceness at fork, and an agent CLI boots for far longer than this takes before it forks
|
|
8
|
+
// anything, so every descendant inherits it. Efficiency-core confinement (`taskpolicy -b`) is not
|
|
9
|
+
// used — it throttles a lane far beyond yielding to the user.
|
|
10
|
+
const LANE_NICENESS = 10
|
|
11
|
+
|
|
12
|
+
type SetPriority = (pid: number, priority: number) => void
|
|
13
|
+
|
|
14
|
+
// **A priority that cannot be lowered starts the session as before.** A platform without the call, or
|
|
15
|
+
// a child that already runs at a lower priority than this, is not a reason to fail the launch.
|
|
16
|
+
function lower(pid: number | undefined, set_priority: SetPriority = setPriority): void {
|
|
17
|
+
if (pid === undefined) return
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
set_priority(pid, LANE_NICENESS)
|
|
21
|
+
} catch {
|
|
22
|
+
// the session keeps the priority it was started with
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const launch_priority = {
|
|
27
|
+
LANE_NICENESS,
|
|
28
|
+
lower,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type { SetPriority }
|
|
32
|
+
export { launch_priority }
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
3
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
4
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
5
|
+
|
|
6
|
+
// A returned child whose session could not authenticate (joshuafolkken/kit#4216). Nothing is counted
|
|
7
|
+
// and no label is touched — the child keeps `in-progress`, so it resumes once a person runs `/login` —
|
|
8
|
+
// and the run stops, since every child dispatched before that fails the same way. The stop is pushed
|
|
9
|
+
// as a `confirmation`: `/login` is a person's to run, and the driver's own stop notice names no cause.
|
|
10
|
+
// Script-emitted, so English.
|
|
11
|
+
|
|
12
|
+
const RECOVERY =
|
|
13
|
+
'If this did not arrive, `pnpm josh run:wake --list` relays the last progress line.'
|
|
14
|
+
|
|
15
|
+
async function stop(child: string): Promise<void> {
|
|
16
|
+
const cite = issue_cite.plain(child)
|
|
17
|
+
const text = `${cite} could not authenticate — run /login, then resume it`
|
|
18
|
+
|
|
19
|
+
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.OUTAGE, text)
|
|
20
|
+
await telegram_notify.confirm({
|
|
21
|
+
issue_title: 'backlogrun stopped: Claude authentication failed',
|
|
22
|
+
body: `${text}. The child stays in-progress and was neither parked nor counted as a failure.`,
|
|
23
|
+
recovery: RECOVERY,
|
|
24
|
+
recommended: `Run /login, then run backlogrun again to resume ${cite}`,
|
|
25
|
+
alternatives: ['Leave the backlog stopped until a later session'],
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const run_merge_auth = { stop }
|
|
30
|
+
|
|
31
|
+
export { run_merge_auth }
|