@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,232 @@
|
|
|
1
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
2
|
+
import { git_diff_reads } from '#scripts/git/git-diff-reads'
|
|
3
|
+
import { git_merge_conflicts } from '#scripts/git/git-merge-conflicts'
|
|
4
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
5
|
+
import { main_merge_regenerate } from '#scripts/git/main-merge-regenerate'
|
|
6
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
7
|
+
import { lane_handoff } from '#scripts/lane/lane-handoff'
|
|
8
|
+
import { lane_ledger, type OverlapRecord } from '#scripts/lane/lane-ledger'
|
|
9
|
+
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
10
|
+
import { poll } from '#scripts/lib/poll'
|
|
11
|
+
|
|
12
|
+
// The wait in front of `josh ship`'s sync (joshuafolkken/kit#3901). `backlog-overlap.ts` keeps lanes
|
|
13
|
+
// apart only on the paths their issue bodies declare, so two lanes that both edit an undeclared file
|
|
14
|
+
// were found out only when the later pull request turned `DIRTY` — after its gate and its CI wait,
|
|
15
|
+
// often as a `conflict` stop its child no longer had the context for.
|
|
16
|
+
//
|
|
17
|
+
// **The later ship waits for the earlier one rather than anything being pushed into a lane.** A lane
|
|
18
|
+
// whose actual change conflicts with this one's and whose pull request is already open (its branch pushed,
|
|
19
|
+
// its detached ship still running) is waited on until that ship ends, merged or stopped; the sync that
|
|
20
|
+
// follows then merges a default branch that already holds it, so a conflict surfaces before this
|
|
21
|
+
// lane's gate rather than after its CI. Merging into the other lane's tree instead could not work: a
|
|
22
|
+
// lane mid-gate would have its record moved under it, and a lane still implementing holds the
|
|
23
|
+
// overlapping paths uncommitted, which `main:merge`'s guard refuses.
|
|
24
|
+
//
|
|
25
|
+
// **Only a ship launched before this one is waited on**, so two ships never wait on each other — a
|
|
26
|
+
// re-ship after a stop already has a pushed branch, so "pushed" alone could not order two re-ships in
|
|
27
|
+
// their sync. A ship run in an agent's own turn has no launch record and counts as the latest; equal
|
|
28
|
+
// launch times fall to the lower issue number. The wait is bounded — a ship that hangs never holds
|
|
29
|
+
// another past `MAX_WAIT_ATTEMPTS`, after which the sync goes ahead as it always did.
|
|
30
|
+
|
|
31
|
+
const WAIT_INTERVAL_MS = 30_000
|
|
32
|
+
const MAX_WAIT_ATTEMPTS = 60
|
|
33
|
+
// Unquoted like `read_changed_paths`, so a non-ASCII path compares equal on both sides.
|
|
34
|
+
const NAME_ONLY_ARGUMENTS = [
|
|
35
|
+
'-c',
|
|
36
|
+
'core.quotePath=false',
|
|
37
|
+
'diff',
|
|
38
|
+
'--name-only',
|
|
39
|
+
'--no-relative',
|
|
40
|
+
'--no-renames',
|
|
41
|
+
]
|
|
42
|
+
const REGENERATED_PATHS: ReadonlySet<string> = new Set(
|
|
43
|
+
main_merge_regenerate.REGENERATED_FILES.map((entry) => entry.path),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
interface OverlapOptions {
|
|
47
|
+
sleeper?: (duration_ms: number) => Promise<void>
|
|
48
|
+
ledger?: string
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface Overlap {
|
|
52
|
+
lanes: ReadonlyArray<LaneInfo>
|
|
53
|
+
paths: ReadonlyArray<string>
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function to_paths(raw: string): Array<string> {
|
|
57
|
+
return changed_paths.to_paths(raw)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function has_upstream(directory: string): Promise<boolean> {
|
|
61
|
+
try {
|
|
62
|
+
await git_spawn.read(['-C', directory, 'rev-parse', '--verify', '--quiet', '@{upstream}'])
|
|
63
|
+
|
|
64
|
+
return true
|
|
65
|
+
} catch {
|
|
66
|
+
return false
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// A lane's change as its pushed branch carries it: everything its commits changed since it left the
|
|
71
|
+
// default branch. Read in its own tree, so the other lane's uncommitted edits — not yet on its pull
|
|
72
|
+
// request — are not counted.
|
|
73
|
+
async function lane_paths(directory: string): Promise<ReadonlyArray<string>> {
|
|
74
|
+
const base = await git_diff_reads.default_branch_reference()
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
return to_paths(
|
|
78
|
+
await git_spawn.read(['-C', directory, ...NAME_ONLY_ARGUMENTS, `${base}...HEAD`, '--']),
|
|
79
|
+
)
|
|
80
|
+
} catch {
|
|
81
|
+
return []
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
interface Launch {
|
|
86
|
+
issue: string
|
|
87
|
+
since: number
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function own_launch(issue: string): Launch {
|
|
91
|
+
const since = lane_handoff.ship_running_since(issue, process.cwd())
|
|
92
|
+
|
|
93
|
+
return { issue, since: since ?? Infinity }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function is_launched_before(lane: LaneInfo, own: Launch): boolean {
|
|
97
|
+
const since = lane_handoff.ship_running_since(lane.issue, lane.directory)
|
|
98
|
+
|
|
99
|
+
if (since === undefined) return false
|
|
100
|
+
|
|
101
|
+
return since < own.since || (since === own.since && Number(lane.issue) < Number(own.issue))
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function is_open_ship(lane: LaneInfo, own: Launch): Promise<boolean> {
|
|
105
|
+
if (!is_launched_before(lane, own)) return false
|
|
106
|
+
|
|
107
|
+
return await has_upstream(lane.directory)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async function lane_head(directory: string): Promise<string | undefined> {
|
|
111
|
+
try {
|
|
112
|
+
return await git_spawn.read(['-C', directory, 'rev-parse', 'HEAD'])
|
|
113
|
+
} catch {
|
|
114
|
+
return undefined
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Of the paths both lanes change, the ones merging the other lane's head into this lane's working
|
|
119
|
+
// tree would actually stop on (joshuafolkken/kit#4348) — the working tree, since this lane's change is
|
|
120
|
+
// not committed until after the sync: an identical addition merges cleanly, so only a real conflict
|
|
121
|
+
// is waited on. Only a shared path is tried: a lane forked from an older default branch also
|
|
122
|
+
// conflicts on files the default branch changed since, which this lane's sync takes from the default
|
|
123
|
+
// branch, not from that lane. A file `main:merge` regenerates is resolved by the sync either way, so
|
|
124
|
+
// it never counts. A merge that could not be tried falls back to every shared path, as the wait was
|
|
125
|
+
// decided before.
|
|
126
|
+
async function conflicting_paths(
|
|
127
|
+
lane: LaneInfo,
|
|
128
|
+
shared: ReadonlyArray<string>,
|
|
129
|
+
): Promise<Array<string>> {
|
|
130
|
+
const theirs = await lane_head(lane.directory)
|
|
131
|
+
const conflicted =
|
|
132
|
+
theirs === undefined
|
|
133
|
+
? undefined
|
|
134
|
+
: git_merge_conflicts.working_tree_conflicts(theirs, shared, process.cwd())
|
|
135
|
+
|
|
136
|
+
return (conflicted ?? shared).filter((file_path) => !REGENERATED_PATHS.has(file_path))
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function shared_paths(
|
|
140
|
+
lane: LaneInfo,
|
|
141
|
+
launch: Launch,
|
|
142
|
+
own: ReadonlySet<string>,
|
|
143
|
+
): Promise<Array<string>> {
|
|
144
|
+
if (!(await is_open_ship(lane, launch))) return []
|
|
145
|
+
|
|
146
|
+
const paths = await lane_paths(lane.directory)
|
|
147
|
+
const shared = paths.filter((file_path) => own.has(file_path))
|
|
148
|
+
|
|
149
|
+
if (shared.length === 0) return []
|
|
150
|
+
|
|
151
|
+
return await conflicting_paths(lane, shared)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function other_lanes(issue: string): Promise<ReadonlyArray<LaneInfo>> {
|
|
155
|
+
const lanes = await lane_registry.list_lanes()
|
|
156
|
+
|
|
157
|
+
return lanes.filter((lane) => lane.issue !== issue && !lane.is_stranded)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Every other lane whose open pull request, shipped before this one, conflicts with this lane's change,
|
|
161
|
+
// with the conflicting paths.
|
|
162
|
+
async function find_overlap(issue: string): Promise<Overlap> {
|
|
163
|
+
const own = new Set(await changed_paths.read_changed_paths(false))
|
|
164
|
+
const launch = own_launch(issue)
|
|
165
|
+
const others = await other_lanes(issue)
|
|
166
|
+
const shared = await Promise.all(
|
|
167
|
+
others.map(async (lane) => await shared_paths(lane, launch, own)),
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
lanes: others.filter((_lane, index) => (shared[index] ?? []).length > 0),
|
|
172
|
+
paths: [...new Set(shared.flat())].toSorted((left, right) => left.localeCompare(right)),
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
async function read_overlap(issue: string): Promise<Overlap> {
|
|
177
|
+
try {
|
|
178
|
+
return await find_overlap(issue)
|
|
179
|
+
} catch {
|
|
180
|
+
return { lanes: [], paths: [] }
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function is_settled(lanes: ReadonlyArray<LaneInfo>): boolean {
|
|
185
|
+
return lanes.every((lane) => !lane_handoff.is_ship_running(lane.issue, lane.directory))
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function wait_for(lanes: ReadonlyArray<LaneInfo>, options: OverlapOptions): Promise<boolean> {
|
|
189
|
+
return await poll.poll_until(async () => is_settled(lanes), {
|
|
190
|
+
attempts: MAX_WAIT_ATTEMPTS,
|
|
191
|
+
interval_ms: WAIT_INTERVAL_MS,
|
|
192
|
+
sleeper: options.sleeper ?? poll.sleep,
|
|
193
|
+
})
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Waits out every overlapping open ship and records the decision, returning what was recorded; a lane
|
|
197
|
+
// that overlaps nothing returns `undefined` at once and writes nothing. Best-effort: an overlap that
|
|
198
|
+
// could not be read is no overlap, so the sync is never blocked by the check that only exists to make
|
|
199
|
+
// it land cleaner.
|
|
200
|
+
async function await_overlap(
|
|
201
|
+
issue: string,
|
|
202
|
+
options: OverlapOptions = {},
|
|
203
|
+
): Promise<OverlapRecord | undefined> {
|
|
204
|
+
const overlap = await read_overlap(issue)
|
|
205
|
+
|
|
206
|
+
if (overlap.lanes.length === 0) return undefined
|
|
207
|
+
|
|
208
|
+
const started = Date.now()
|
|
209
|
+
const is_cleared = await wait_for(overlap.lanes, options)
|
|
210
|
+
const lanes = overlap.lanes.map((lane) => Number(lane.issue))
|
|
211
|
+
const waited_ms = Date.now() - started
|
|
212
|
+
const record = { issue: Number(issue), lanes, paths: [...overlap.paths], waited_ms, is_cleared }
|
|
213
|
+
|
|
214
|
+
await lane_ledger.record_overlap(record, options.ledger)
|
|
215
|
+
|
|
216
|
+
return record
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// The line the sync stage prints for a recorded wait, or `''` where nothing overlapped.
|
|
220
|
+
function note(record: OverlapRecord | undefined): string {
|
|
221
|
+
if (record === undefined) return ''
|
|
222
|
+
|
|
223
|
+
const lanes = record.lanes.map((lane) => session_cite.issue(lane)).join(', ')
|
|
224
|
+
const outcome = record.is_cleared ? 'waited for' : 'gave up waiting for'
|
|
225
|
+
|
|
226
|
+
return `${outcome} ${lanes}, whose open pull requests conflict on: ${record.paths.join(', ')}`
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const run_ship_overlap = { MAX_WAIT_ATTEMPTS, await_overlap, note }
|
|
230
|
+
|
|
231
|
+
export type { OverlapOptions }
|
|
232
|
+
export { run_ship_overlap }
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { setTimeout as sleep } from 'node:timers/promises'
|
|
2
|
+
import { backlog_ready } from '#scripts/backlog/backlog-ready'
|
|
3
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
4
|
+
import { lane_capacity } from '#scripts/lane/lane-capacity'
|
|
5
|
+
import { lane_handoff } from '#scripts/lane/lane-handoff'
|
|
6
|
+
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
7
|
+
import { run_ship_stage, type Stage } from './run-ship-stage'
|
|
8
|
+
|
|
9
|
+
// **A followup stop past the lane limit waits for a place, then relaunches**: its lane held no place
|
|
10
|
+
// while it waited (`backlog-occupied.ts`), so the next launch may have taken it, and a child started at
|
|
11
|
+
// once would run past the limit (joshuafolkken/kit#4466). The stopped lane counts again while this
|
|
12
|
+
// supervisor waits, so the driver launches nothing into the place it waits for. An unreadable limit or
|
|
13
|
+
// lane count relaunches at once, and so does a place that does not free within the wait.
|
|
14
|
+
//
|
|
15
|
+
// **Waiters queue in issue order rather than block each other**: every waiter counts in the lane use,
|
|
16
|
+
// so three of them past a limit of two would each see the lanes full and wait out the hour together. A
|
|
17
|
+
// waiter leaves out the waiters behind it, so the first ones that fit relaunch and the rest wait on them.
|
|
18
|
+
// The mark is the ship stage record's (`run_ship_stage.mark_place_waiting`), read only while the ship
|
|
19
|
+
// runs, so a dead supervisor's mark queues nobody.
|
|
20
|
+
|
|
21
|
+
// An hour of lane counts, half a minute apart: about two lanes' median run (`lane:stats`).
|
|
22
|
+
const PLACE_POLL_MS = 30_000
|
|
23
|
+
const PLACE_POLLS = 120
|
|
24
|
+
|
|
25
|
+
function is_behind(lane: LaneInfo, issue: string): boolean {
|
|
26
|
+
return lane.issue.localeCompare(issue, undefined, { numeric: true }) > 0
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function waiters_behind(issue: string): Promise<number> {
|
|
30
|
+
const lanes = await lane_registry.list_lanes()
|
|
31
|
+
|
|
32
|
+
return lanes.filter(
|
|
33
|
+
(lane) => is_behind(lane, issue) && lane_handoff.is_place_waiting(lane.issue, lane.directory),
|
|
34
|
+
).length
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function is_over_limit(issue: string): Promise<boolean> {
|
|
38
|
+
const limit = await lane_capacity.lane_limit()
|
|
39
|
+
|
|
40
|
+
if (limit.kind !== 'limit') return false
|
|
41
|
+
|
|
42
|
+
const use = await backlog_ready.lane_use()
|
|
43
|
+
const behind = await waiters_behind(issue)
|
|
44
|
+
|
|
45
|
+
return use.occupied - behind > lane_capacity.seated_limit(limit.limit)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function is_place_taken(issue: string): Promise<boolean> {
|
|
49
|
+
try {
|
|
50
|
+
return await is_over_limit(issue)
|
|
51
|
+
} catch {
|
|
52
|
+
return false
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Best-effort: a mark that could not be written leaves this waiter counted by the others, as before.
|
|
57
|
+
function mark(lane: LaneInfo, is_waiting: boolean): void {
|
|
58
|
+
const repository = git_common_directory.repository(lane.directory)
|
|
59
|
+
|
|
60
|
+
if (repository === undefined) return
|
|
61
|
+
|
|
62
|
+
try {
|
|
63
|
+
run_ship_stage.mark_place_waiting(
|
|
64
|
+
run_ship_stage.record_path(repository, lane.issue),
|
|
65
|
+
is_waiting,
|
|
66
|
+
)
|
|
67
|
+
} catch {
|
|
68
|
+
// The queue only orders waiters; an unmarked one still waits on the lane count.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function poll(issue: string): Promise<void> {
|
|
73
|
+
for (let polled = 0; polled < PLACE_POLLS; polled += 1) {
|
|
74
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each check waits on a lane the previous one saw busy
|
|
75
|
+
if (!(await is_place_taken(issue))) return
|
|
76
|
+
|
|
77
|
+
// eslint-disable-next-line no-await-in-loop -- polling: the wait between two lane counts
|
|
78
|
+
await sleep(PLACE_POLL_MS)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function await_place(lane: LaneInfo, stage: Stage): Promise<void> {
|
|
83
|
+
if (stage !== run_ship_stage.STAGE.FOLLOWUP) return
|
|
84
|
+
|
|
85
|
+
mark(lane, true)
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
await poll(lane.issue)
|
|
89
|
+
} finally {
|
|
90
|
+
mark(lane, false)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const run_ship_place = { await_place }
|
|
95
|
+
|
|
96
|
+
export { run_ship_place }
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { JoshResult } from '#scripts/josh/josh-run'
|
|
2
|
+
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
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
|
+
import { run_ship_pre_detach } from './run-ship-pre-detach'
|
|
6
|
+
import { run_ship_stage, type Phase } from './run-ship-stage'
|
|
7
|
+
|
|
8
|
+
// The pre-detach checks, timed into the lane ledger and marked on the event stream as a ship stage
|
|
9
|
+
// is, so their minutes are no longer folded into the lane's implementation time
|
|
10
|
+
// (joshuafolkken/kit#4382). They are not a `Stage`: nothing resumes past them, and `run:board` draws no
|
|
11
|
+
// phase from a word it does not know.
|
|
12
|
+
|
|
13
|
+
const SUCCESS_EXIT_CODE = 0
|
|
14
|
+
const { PHASE } = run_ship_stage
|
|
15
|
+
|
|
16
|
+
async function emit_phase(issue: string, phase: Phase): Promise<void> {
|
|
17
|
+
const text = run_ship_stage.event_text(issue, lane_ledger.PRE_DETACH_STAGE, phase)
|
|
18
|
+
|
|
19
|
+
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.SHIP_STAGE, text)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function checks(
|
|
23
|
+
issue: string,
|
|
24
|
+
run: () => Promise<JoshResult> = run_ship_pre_detach.checks,
|
|
25
|
+
): Promise<JoshResult> {
|
|
26
|
+
await emit_phase(issue, PHASE.START)
|
|
27
|
+
const started_ms = performance.now()
|
|
28
|
+
const result = await run()
|
|
29
|
+
const elapsed_ms = performance.now() - started_ms
|
|
30
|
+
|
|
31
|
+
await lane_ledger.record_stage({
|
|
32
|
+
stage: lane_ledger.PRE_DETACH_STAGE,
|
|
33
|
+
elapsed_ms,
|
|
34
|
+
issue: Number(issue),
|
|
35
|
+
})
|
|
36
|
+
await emit_phase(issue, result.code === SUCCESS_EXIT_CODE ? PHASE.DONE : PHASE.FAILED)
|
|
37
|
+
|
|
38
|
+
return result
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const run_ship_pre_detach_timed = { checks }
|
|
42
|
+
|
|
43
|
+
export { run_ship_pre_detach_timed }
|
|
@@ -1,72 +1,126 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
+
import { check_reuse, type CheckRecords } from '#scripts/gate/check-reuse'
|
|
4
|
+
import { gate_plan } from '#scripts/gate/gate-plan'
|
|
5
|
+
import type { GateStepResult } from '#scripts/gate/gate-report'
|
|
6
|
+
import { gate_tree } from '#scripts/gate/gate-tree'
|
|
3
7
|
import { project_checks } from '#scripts/gate/project-checks'
|
|
4
8
|
import { type_check_step } from '#scripts/gate/type-check-step'
|
|
5
9
|
import type { JoshResult } from '#scripts/josh/josh-run'
|
|
6
10
|
import { buffered_process, type BufferedProcessResult } from '#scripts/lib/buffered-process'
|
|
7
11
|
|
|
8
|
-
// The fast checks a detached `josh ship` runs in the agent's own turn, after the preflight
|
|
9
|
-
// the hand-off:
|
|
10
|
-
// SKILL.md pointer, a byte budget, the command list
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
12
|
+
// The fast checks a detached `josh ship` runs in the agent's own turn, after the preflight (whatever it
|
|
13
|
+
// answered) and before the hand-off:a type error in a file the related-only checks never touched, an export nothing reads,
|
|
14
|
+
// an unknown word, or a guard test (a SKILL.md pointer, a byte budget, the command list, a source with
|
|
15
|
+
// no colocated test, a bare issue citation) that only the full suite runs, would otherwise first
|
|
16
|
+
// surface after the detach and cost a relaunched session. They answer in seconds, so the same session
|
|
17
|
+
// fixes what they find and ships again.
|
|
14
18
|
//
|
|
15
|
-
//
|
|
16
|
-
// the
|
|
19
|
+
// **Nothing moves out of the gate, and the gate reuses what these already answered**: a check that is
|
|
20
|
+
// the gate's own check passed silently here is recorded with the gate's per-check record
|
|
21
|
+
// (`check-reuse.ts`), so the supervised gate stage reuses it while its declared inputs have not moved
|
|
22
|
+
// and runs it again when they have. The record, its judgment and its inputs are the gate's; only the
|
|
23
|
+
// type check (`check`) and `exports:unused` (`exports`) carry a gate label. The rest stay unrecorded:
|
|
24
|
+
// `cspell:dot` declares no inputs and runs every gate (`verification-inputs.ts`), the guard tests are a
|
|
25
|
+
// slice of the unit suite and do not answer for the gate's `test:unit`, and the metrics totals leave
|
|
26
|
+
// out the durations the gate's `metrics` holds.
|
|
27
|
+
//
|
|
28
|
+
// joshuafolkken/kit#3924: nine of ten ship gate stops were `exports:unused`, `cspell:dot` or a
|
|
29
|
+
// repository-wide guard test failing on the child's own code — none a check `test:related` selects,
|
|
30
|
+
// since a guard test imports no changed file.
|
|
31
|
+
//
|
|
32
|
+
// The test targets are where such failures land. A consumer has none of them, so only the ones
|
|
33
|
+
// present run, and a consumer meets the static checks alone.
|
|
17
34
|
//
|
|
18
35
|
// In kit the metrics ratchet's totals join them: a feature grows a total almost every time, and here
|
|
19
36
|
// the session that grew the total writes the reason itself rather than a relaunched one. The
|
|
20
37
|
// durations are left out: they read the gate ledger, stale before the detach, so they stay with the
|
|
21
38
|
// supervised gate.
|
|
22
39
|
|
|
40
|
+
interface PreDetachCheck {
|
|
41
|
+
list: ReadonlyArray<string>
|
|
42
|
+
// The gate check this one answers for, absent where it answers for none.
|
|
43
|
+
label?: string | undefined
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface PreDetachRun {
|
|
47
|
+
check: PreDetachCheck
|
|
48
|
+
result: BufferedProcessResult
|
|
49
|
+
elapsed_ms: number
|
|
50
|
+
}
|
|
51
|
+
|
|
23
52
|
const SUCCESS_EXIT_CODE = 0
|
|
24
53
|
const FAILURE_EXIT_CODE = 1
|
|
25
54
|
const SECTION_SEPARATOR = '\n\n'
|
|
26
55
|
const PASSED = 'pre-detach checks passed'
|
|
27
56
|
const METRICS_TOTALS_COMMAND: ReadonlyArray<string> = ['josh', 'metrics', '--totals-only']
|
|
28
|
-
const
|
|
57
|
+
const STATIC_CHECKS: ReadonlyArray<PreDetachCheck> = [
|
|
58
|
+
{ list: ['josh', 'exports:unused'], label: gate_plan.EXPORTS_LABEL },
|
|
59
|
+
{ list: ['josh', 'cspell:dot'] },
|
|
60
|
+
]
|
|
61
|
+
const GUARD_TEST_TARGETS: ReadonlyArray<string> = [
|
|
29
62
|
'scripts/document',
|
|
30
63
|
'scripts/claude',
|
|
31
64
|
'scripts/rules',
|
|
32
65
|
'scripts/josh/josh-command-map.test.ts',
|
|
66
|
+
'scripts/issue/session-cite-scan.test.ts',
|
|
67
|
+
'tools/test/untested-sources.test.ts',
|
|
68
|
+
'tools/test/pure-files.test.ts',
|
|
33
69
|
]
|
|
34
70
|
// A present directory need not hold a test the project's Vitest includes — a consumer's own
|
|
35
71
|
// `scripts/claude` of shell helpers, say — and a filter that matches nothing would stop every ship.
|
|
36
|
-
const
|
|
72
|
+
const GUARD_TEST_COMMAND: ReadonlyArray<string> = ['josh', 'test:unit', '--passWithNoTests']
|
|
37
73
|
|
|
38
74
|
function present_targets(directory: string): ReadonlyArray<string> {
|
|
39
|
-
return
|
|
75
|
+
return GUARD_TEST_TARGETS.filter((target) => existsSync(path.join(directory, target)))
|
|
40
76
|
}
|
|
41
77
|
|
|
42
|
-
function
|
|
78
|
+
function guard_tests(directory: string): Array<PreDetachCheck> {
|
|
43
79
|
const targets = present_targets(directory)
|
|
44
80
|
|
|
45
|
-
return targets.length === 0 ? [] : [[...
|
|
81
|
+
return targets.length === 0 ? [] : [{ list: [...GUARD_TEST_COMMAND, ...targets] }]
|
|
46
82
|
}
|
|
47
83
|
|
|
48
84
|
// The same kit-only rule as the gate's `is_kit_only` step: a consumer's kit has no `josh metrics`.
|
|
49
|
-
function kit_only(directory: string): Array<
|
|
50
|
-
return project_checks.is_kit_repository(directory) ? [METRICS_TOTALS_COMMAND] : []
|
|
85
|
+
function kit_only(directory: string): Array<PreDetachCheck> {
|
|
86
|
+
return project_checks.is_kit_repository(directory) ? [{ list: METRICS_TOTALS_COMMAND }] : []
|
|
51
87
|
}
|
|
52
88
|
|
|
53
|
-
async function command_lists(directory: string): Promise<Array<
|
|
89
|
+
async function command_lists(directory: string): Promise<Array<PreDetachCheck>> {
|
|
54
90
|
const type_check = await type_check_step.resolve_type_check_args(directory)
|
|
55
91
|
|
|
56
|
-
return [
|
|
92
|
+
return [
|
|
93
|
+
{ list: type_check, label: gate_plan.TYPE_CHECK_LABEL },
|
|
94
|
+
...STATIC_CHECKS,
|
|
95
|
+
...guard_tests(directory),
|
|
96
|
+
...kit_only(directory),
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function run_in(directory: string, check: PreDetachCheck): Promise<PreDetachRun> {
|
|
101
|
+
const started = performance.now()
|
|
102
|
+
const result = await buffered_process.run_buffered_process(check.list, { cwd: directory })
|
|
103
|
+
|
|
104
|
+
return { check, result, elapsed_ms: performance.now() - started }
|
|
57
105
|
}
|
|
58
106
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
list: ReadonlyArray<string>,
|
|
62
|
-
): Promise<BufferedProcessResult> {
|
|
63
|
-
return await buffered_process.run_buffered_process(list, { cwd: directory })
|
|
107
|
+
interface GateRun extends PreDetachRun {
|
|
108
|
+
check: { list: ReadonlyArray<string>; label: string }
|
|
64
109
|
}
|
|
65
110
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
111
|
+
function is_gate_run(run: PreDetachRun): run is GateRun {
|
|
112
|
+
return run.check.label !== undefined
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function gate_results(runs: ReadonlyArray<PreDetachRun>): Array<GateStepResult> {
|
|
116
|
+
return runs
|
|
117
|
+
.filter((run) => is_gate_run(run))
|
|
118
|
+
.map(({ check, result, elapsed_ms }) => {
|
|
119
|
+
return { ...result, label: check.label, command: check.list.join(' '), elapsed_ms }
|
|
120
|
+
})
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function verdict(results: ReadonlyArray<BufferedProcessResult>): JoshResult {
|
|
70
124
|
const failed = results.filter((result) => buffered_process.is_process_failed(result))
|
|
71
125
|
|
|
72
126
|
if (failed.length === 0) return { code: SUCCESS_EXIT_CODE, out: PASSED }
|
|
@@ -77,6 +131,27 @@ async function checks(directory: string = process.cwd()): Promise<JoshResult> {
|
|
|
77
131
|
}
|
|
78
132
|
}
|
|
79
133
|
|
|
80
|
-
|
|
134
|
+
// All run at once, buffered, and every failure is reported, so one ship shows all there is to fix.
|
|
135
|
+
// The tree is read before they start, so a record is written only for the tree they read.
|
|
136
|
+
async function checks(
|
|
137
|
+
directory: string = process.cwd(),
|
|
138
|
+
records: CheckRecords = check_reuse.DEFAULT_RECORDS,
|
|
139
|
+
): Promise<JoshResult> {
|
|
140
|
+
const [lists, tree] = await Promise.all([command_lists(directory), gate_tree.read_gate_tree()])
|
|
141
|
+
const runs = await Promise.all(lists.map(async (check) => await run_in(directory, check)))
|
|
142
|
+
|
|
143
|
+
await check_reuse.record_green_checks(gate_results(runs), tree, records)
|
|
144
|
+
|
|
145
|
+
return verdict(runs.map(({ result }) => result))
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const run_ship_pre_detach = {
|
|
149
|
+
GUARD_TEST_TARGETS,
|
|
150
|
+
METRICS_TOTALS_COMMAND,
|
|
151
|
+
PASSED,
|
|
152
|
+
STATIC_CHECKS,
|
|
153
|
+
checks,
|
|
154
|
+
}
|
|
81
155
|
|
|
156
|
+
export type { PreDetachCheck }
|
|
82
157
|
export { run_ship_pre_detach }
|