@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -2,16 +2,14 @@
|
|
|
2
2
|
import { parseArgs } from 'node:util'
|
|
3
3
|
import { git_branch } from '#scripts/git/git-branch'
|
|
4
4
|
import { git_error } from '#scripts/git/git-error'
|
|
5
|
-
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
6
|
-
import { issue_watch_gate } from '#scripts/issue/issue-watch-gate'
|
|
7
5
|
import { cli_body } from '#scripts/josh/cli-body'
|
|
8
6
|
import { josh_environment_file } from '#scripts/josh/josh-environment-file'
|
|
9
7
|
import { git_notify, type GitNotifyConfig } from '#scripts/notify/git-notify'
|
|
10
8
|
import { acceptance_map_check } from '#scripts/review/acceptance-map-check'
|
|
11
9
|
import { live_evidence } from '#scripts/review/live-evidence'
|
|
12
|
-
import {
|
|
13
|
-
import { review_record } from '#scripts/review/review-record'
|
|
10
|
+
import { removed_tests_check } from '#scripts/review/removed-tests-check'
|
|
14
11
|
import { parse_issue_number_from_text } from './followup-issue-number'
|
|
12
|
+
import { followup_review_gates } from './followup-review-gates'
|
|
15
13
|
import { git_followup_finish } from './git-followup-finish'
|
|
16
14
|
import { git_followup_flush } from './git-followup-flush'
|
|
17
15
|
import { git_followup_merged, type MergePlan } from './git-followup-merged'
|
|
@@ -121,66 +119,7 @@ function is_merge_resolved(values: CliArguments['values']): boolean {
|
|
|
121
119
|
return values['no-merge'] !== true
|
|
122
120
|
}
|
|
123
121
|
|
|
124
|
-
|
|
125
|
-
// implementing in a lane can be reviewed against a different tree entirely — one holding the
|
|
126
|
-
// previous child's already-merged code. That review finds nothing wrong and says so, and the run
|
|
127
|
-
// would read the silence as a clean round. **This is the seam where that is caught**: a merge is
|
|
128
|
-
// refused unless the review attested the checkout it was briefed on.
|
|
129
|
-
//
|
|
130
|
-
// **Absence is a refusal, not a pass.** The defect produces *no* signal, so a check that only
|
|
131
|
-
// compared two present records would answer `ok` in exactly the state it exists to catch.
|
|
132
|
-
//
|
|
133
|
-
// **Scoped to a checkout that actually briefed a review.** `review_attest.check` answers
|
|
134
|
-
// `not-required` where no `josh review:brief` was run here inside a run's lifetime, so a project or
|
|
135
|
-
// a flow that does not use the brief merges exactly as it did before.
|
|
136
|
-
//
|
|
137
|
-
// The direction is deliberate: a wrongly-refused merge costs one re-run of the review, and a wrongly
|
|
138
|
-
// allowed one ships a diff nobody read. Thrown rather than reported, so no `completion` Telegram is
|
|
139
|
-
// sent and nothing merges — `git_pr_followup.run` is never reached.
|
|
140
|
-
// `ok` means the guard was satisfied and `not-required` means it never applied to this checkout —
|
|
141
|
-
// both let the merge proceed, so the two gates below read the verdict through one predicate rather
|
|
142
|
-
// than repeating the pair of statuses.
|
|
143
|
-
function is_merge_permitted(status: string): boolean {
|
|
144
|
-
return status === 'ok' || status === 'not-required'
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
function is_valid_issue(issue_number: string | undefined): issue_number is string {
|
|
148
|
-
return issue_number !== undefined && issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue_number)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
async function assert_review_attested(should_merge: boolean): Promise<void> {
|
|
152
|
-
if (!should_merge) return
|
|
153
|
-
|
|
154
|
-
const verdict = await review_attest.check_here()
|
|
155
|
-
|
|
156
|
-
if (!is_merge_permitted(verdict.status)) throw new Error(review_attest.refusal_message(verdict))
|
|
157
|
-
|
|
158
|
-
const refusal = await issue_watch_gate.review_refusal_here()
|
|
159
|
-
|
|
160
|
-
if (refusal !== undefined) throw new Error(refusal)
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Recording a review round as a prose request leaves the recurrence ledger blind whenever it is
|
|
164
|
-
// skipped. **This is the seam where it is a gate instead**: a merge is refused unless the round left
|
|
165
|
-
// a `- rf:` line for its issue, a zero-finding `none` line included.
|
|
166
|
-
//
|
|
167
|
-
// **Absence is a refusal, `missing` exactly as `assert_review_attested`'s is** — the defect this
|
|
168
|
-
// exists for produces *no* line, so silence must not read as success. A checkout that keeps no ledger
|
|
169
|
-
// answers `not-required` and merges as before, and a run whose issue the followup cannot identify has
|
|
170
|
-
// no key to check, so it carries on rather than blocking on missing information.
|
|
171
|
-
async function assert_review_recorded(
|
|
172
|
-
should_merge: boolean,
|
|
173
|
-
issue_number: string | undefined,
|
|
174
|
-
): Promise<void> {
|
|
175
|
-
if (!should_merge || !is_valid_issue(issue_number)) return
|
|
176
|
-
|
|
177
|
-
const issue = Number(issue_number)
|
|
178
|
-
const verdict = await review_record.check(issue)
|
|
179
|
-
|
|
180
|
-
if (is_merge_permitted(verdict.status)) return
|
|
181
|
-
|
|
182
|
-
throw new Error(review_record.refusal_message(issue))
|
|
183
|
-
}
|
|
122
|
+
const { assert_review_attested, assert_review_recorded, is_valid_issue } = followup_review_gates
|
|
184
123
|
|
|
185
124
|
// A runtime change merges only with its acceptance criteria run for real and
|
|
186
125
|
// recorded in the pull request body — `live_evidence` carries the why. `exempt` (no runtime path
|
|
@@ -210,6 +149,20 @@ async function assert_acceptance_mapped(
|
|
|
210
149
|
if (refusal !== undefined) throw new Error(refusal)
|
|
211
150
|
}
|
|
212
151
|
|
|
152
|
+
// Every test the change removes is disposed of in the pull request body — `removed_tests` carries the
|
|
153
|
+
// why. It reads this checkout's diff, which `assert_live_evidence` has already refused to read for a
|
|
154
|
+
// branch other than the one checked out.
|
|
155
|
+
async function assert_removed_tests_disposed(
|
|
156
|
+
should_merge: boolean,
|
|
157
|
+
branch_name: string,
|
|
158
|
+
): Promise<void> {
|
|
159
|
+
if (!should_merge) return
|
|
160
|
+
|
|
161
|
+
const refusal = await removed_tests_check.refusal(branch_name)
|
|
162
|
+
|
|
163
|
+
if (refusal !== undefined) throw new Error(refusal)
|
|
164
|
+
}
|
|
165
|
+
|
|
213
166
|
// Every pre-merge refusal, in order — each one throws, so nothing merges past the first that fails.
|
|
214
167
|
async function assert_merge_gates(
|
|
215
168
|
should_merge: boolean,
|
|
@@ -220,6 +173,7 @@ async function assert_merge_gates(
|
|
|
220
173
|
await assert_review_recorded(should_merge, issue_number)
|
|
221
174
|
await assert_live_evidence(should_merge, branch_name)
|
|
222
175
|
await assert_acceptance_mapped(should_merge, issue_number, branch_name)
|
|
176
|
+
await assert_removed_tests_disposed(should_merge, branch_name)
|
|
223
177
|
}
|
|
224
178
|
|
|
225
179
|
// After the gates, before the CI wait: a line appended since the run's commit rides the pull request
|
|
@@ -280,8 +234,7 @@ try {
|
|
|
280
234
|
const git_followup_workflow = {
|
|
281
235
|
assert_acceptance_mapped,
|
|
282
236
|
assert_live_evidence,
|
|
283
|
-
|
|
284
|
-
assert_review_recorded,
|
|
237
|
+
assert_removed_tests_disposed,
|
|
285
238
|
parse_issue_number_from_text,
|
|
286
239
|
prepare_merge,
|
|
287
240
|
resolve_branch_name,
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { epic_close } from '#scripts/epic/epic-close'
|
|
2
2
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
|
+
import type { PrStateSnapshot } from '#scripts/gh/git-pr-checks'
|
|
4
|
+
import { git_pr_merge_checked, type WaitForGreen } from '#scripts/gh/git-pr-merge-checked'
|
|
5
|
+
import { issue_body_or_comment } from '#scripts/issue/issue-body-or-comment'
|
|
3
6
|
import { issue_watch_gate } from '#scripts/issue/issue-watch-gate'
|
|
4
7
|
import { git_notify, type GitNotifyConfig } from '#scripts/notify/git-notify'
|
|
5
8
|
import { git_followup_cleanup } from './git-followup-cleanup'
|
|
@@ -40,6 +43,10 @@ interface WrapupInput {
|
|
|
40
43
|
// already on the issue does not post it twice (`git-followup-merged.ts`).
|
|
41
44
|
is_merged?: boolean | undefined
|
|
42
45
|
is_completion_recorded?: boolean | undefined
|
|
46
|
+
// The snapshot the merge gate passed, whose head the merge names, and the wait to go back to when
|
|
47
|
+
// that head moved before the merge (`git-pr-merge-checked.ts`, #4036).
|
|
48
|
+
checked?: PrStateSnapshot | undefined
|
|
49
|
+
wait_for_green: WaitForGreen
|
|
43
50
|
}
|
|
44
51
|
|
|
45
52
|
function build_notify_body(input: {
|
|
@@ -57,12 +64,6 @@ function build_notify_body(input: {
|
|
|
57
64
|
})
|
|
58
65
|
}
|
|
59
66
|
|
|
60
|
-
function is_blank_issue_body(body: string | undefined): boolean {
|
|
61
|
-
if (body === undefined) return true
|
|
62
|
-
|
|
63
|
-
return body.trim().length === 0
|
|
64
|
-
}
|
|
65
|
-
|
|
66
67
|
async function post_notify_issue(input: {
|
|
67
68
|
issue_number: string | undefined
|
|
68
69
|
body: string
|
|
@@ -71,12 +72,7 @@ async function post_notify_issue(input: {
|
|
|
71
72
|
throw new Error('Issue number is required for issue notification.')
|
|
72
73
|
}
|
|
73
74
|
|
|
74
|
-
|
|
75
|
-
const should_edit_body = current_body !== undefined && is_blank_issue_body(current_body)
|
|
76
|
-
|
|
77
|
-
await (should_edit_body
|
|
78
|
-
? git_gh_command.issue_edit_body(input.issue_number, input.body)
|
|
79
|
-
: git_gh_command.issue_comment(input.issue_number, input.body))
|
|
75
|
+
await issue_body_or_comment.post(input.issue_number, input.body)
|
|
80
76
|
}
|
|
81
77
|
|
|
82
78
|
function should_notify_pr(target: GitNotifyConfig['target']): boolean {
|
|
@@ -239,7 +235,7 @@ async function run_tail_steps(input: WrapupInput): Promise<void> {
|
|
|
239
235
|
async function run_wrapup(input: WrapupInput, log: StageLog): Promise<void> {
|
|
240
236
|
if (input.should_merge && input.is_merged !== true) {
|
|
241
237
|
await issue_watch_gate.assert_read_here()
|
|
242
|
-
await
|
|
238
|
+
await git_pr_merge_checked.merge_checked(input)
|
|
243
239
|
lap(log, STAGE.merge)
|
|
244
240
|
}
|
|
245
241
|
|
|
@@ -256,7 +252,6 @@ export {
|
|
|
256
252
|
git_pr_followup_wrapup,
|
|
257
253
|
post_notify_issue,
|
|
258
254
|
post_completion_notification,
|
|
259
|
-
is_blank_issue_body,
|
|
260
255
|
build_notify_body,
|
|
261
256
|
}
|
|
262
257
|
export type { WrapupInput }
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { git_pr_ai_review, type TelegramContext } from '#scripts/gh/git-pr-ai-review'
|
|
3
|
+
import type { PrStateSnapshot } from '#scripts/gh/git-pr-checks'
|
|
3
4
|
import { git_pr_coderabbit } from '#scripts/gh/git-pr-coderabbit'
|
|
4
5
|
import { git_pr_managed_config } from '#scripts/gh/git-pr-managed-config'
|
|
6
|
+
import type { WaitForGreen } from '#scripts/gh/git-pr-merge-checked'
|
|
5
7
|
import { github_issue_url } from '#scripts/gh/github-issue-url'
|
|
6
8
|
import { git_closes_keyword } from '#scripts/git/git-closes-keyword'
|
|
7
9
|
import type { GitNotifyConfig } from '#scripts/notify/git-notify'
|
|
@@ -11,6 +13,7 @@ import {
|
|
|
11
13
|
type TelegramTaskType,
|
|
12
14
|
} from '#scripts/notify/telegram-notify'
|
|
13
15
|
import { followup_checks_event } from './followup-checks-event'
|
|
16
|
+
import { followup_coderabbit_wait } from './followup-coderabbit-wait'
|
|
14
17
|
import { git_followup_merged } from './git-followup-merged'
|
|
15
18
|
import { git_followup_pending } from './git-followup-pending'
|
|
16
19
|
import { git_followup_stages, type StageLog } from './git-followup-stages'
|
|
@@ -226,22 +229,45 @@ async function run_comment_scans(
|
|
|
226
229
|
// different destinations: every note reaches the completion notification, and this one alone also
|
|
227
230
|
// reaches the completion report posted to the Issue. Returning it twice is
|
|
228
231
|
// what lets `run_stages` hand each destination what belongs to it without re-deriving the answer.
|
|
232
|
+
//
|
|
233
|
+
// **The snapshot travels on to the merge**, which names its head, and the same wait is what the merge
|
|
234
|
+
// goes back to when that head moved before it (#4036).
|
|
235
|
+
interface ReviewChecks {
|
|
236
|
+
notes: Array<string>
|
|
237
|
+
managed: Array<string>
|
|
238
|
+
snapshot?: PrStateSnapshot
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function wait_for_green_of(
|
|
242
|
+
input: FollowupInput,
|
|
243
|
+
context: TelegramContext,
|
|
244
|
+
issue_number: string | undefined,
|
|
245
|
+
log: StageLog,
|
|
246
|
+
): WaitForGreen {
|
|
247
|
+
return async function wait_for_green(): Promise<PrStateSnapshot> {
|
|
248
|
+
return await run_checks({
|
|
249
|
+
branch_name: input.branch_name,
|
|
250
|
+
is_skip_watch: input.is_skip_watch,
|
|
251
|
+
observe: followup_coderabbit_wait.both(
|
|
252
|
+
followup_checks_event.observer_of(issue_number, context.pr_url),
|
|
253
|
+
followup_coderabbit_wait.observer_of(log.coderabbit),
|
|
254
|
+
),
|
|
255
|
+
})
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
229
259
|
async function run_review_checks(
|
|
230
260
|
input: FollowupInput,
|
|
231
261
|
context: TelegramContext,
|
|
232
262
|
log: StageLog,
|
|
233
263
|
issue_number: string | undefined,
|
|
234
|
-
): Promise<
|
|
264
|
+
): Promise<ReviewChecks> {
|
|
235
265
|
if (input.is_merged === true) return { notes: [], managed: [] }
|
|
236
266
|
|
|
237
267
|
const managed = await git_pr_managed_config.handle_managed_config_changes({
|
|
238
268
|
should_merge: input.should_merge,
|
|
239
269
|
})
|
|
240
|
-
const snapshot = await
|
|
241
|
-
branch_name: input.branch_name,
|
|
242
|
-
is_skip_watch: input.is_skip_watch,
|
|
243
|
-
observe: followup_checks_event.observer_of(issue_number, context.pr_url),
|
|
244
|
-
})
|
|
270
|
+
const snapshot = await wait_for_green_of(input, context, issue_number, log)()
|
|
245
271
|
|
|
246
272
|
lap(log, STAGE.checks_wait)
|
|
247
273
|
const check_notes = read_coderabbit_skip_notes(snapshot)
|
|
@@ -249,7 +275,7 @@ async function run_review_checks(
|
|
|
249
275
|
log_skip_notes(check_notes)
|
|
250
276
|
const scan_notes = await run_comment_scans(input, context, log)
|
|
251
277
|
|
|
252
|
-
return { notes: [...managed, ...check_notes, ...scan_notes], managed }
|
|
278
|
+
return { notes: [...managed, ...check_notes, ...scan_notes], managed, snapshot }
|
|
253
279
|
}
|
|
254
280
|
|
|
255
281
|
// **A tail re-run after a merge does not report twice**: where the issue
|
|
@@ -296,6 +322,8 @@ async function run_stages(input: FollowupInput, log: StageLog): Promise<string |
|
|
|
296
322
|
managed_notes: checks.managed,
|
|
297
323
|
is_merged: input.is_merged,
|
|
298
324
|
is_completion_recorded,
|
|
325
|
+
checked: checks.snapshot,
|
|
326
|
+
wait_for_green: wait_for_green_of(input, context, issue_number, log),
|
|
299
327
|
},
|
|
300
328
|
log,
|
|
301
329
|
)
|
|
@@ -319,7 +347,7 @@ async function run(input: FollowupInput): Promise<string | undefined> {
|
|
|
319
347
|
throw error
|
|
320
348
|
} finally {
|
|
321
349
|
git_followup_stages.print_stages(log)
|
|
322
|
-
await git_followup_stages.
|
|
350
|
+
await git_followup_stages.record_waits(log)
|
|
323
351
|
}
|
|
324
352
|
}
|
|
325
353
|
|
|
@@ -24,7 +24,7 @@ const USAGE =
|
|
|
24
24
|
'Usage: josh fresh:run <pattern> | --spec <file.json> [--package-version <version>] [--log-dir <dir>] [--rebuild] | --list'
|
|
25
25
|
// The scratch directory kit's distributed `.gitignore` already ignores, so a log is never committed
|
|
26
26
|
// from kit or from a consumer toolkit.
|
|
27
|
-
const DEFAULT_LOG_DIRECTORY = '.
|
|
27
|
+
const DEFAULT_LOG_DIRECTORY = '.josh/tmp/fresh-machine'
|
|
28
28
|
const NO_GITHUB_TOKEN =
|
|
29
29
|
'This scenario uses GitHub and `gh auth token` printed no token. Run `gh auth login` on this machine first.'
|
|
30
30
|
const NO_CLAUDE_TOKEN = `This scenario uses Claude Code and neither the macOS keychain nor ${claude_token.VARIABLE} holds a token. ${claude_token.SETUP_HINT}`
|
|
@@ -4,13 +4,14 @@ import {
|
|
|
4
4
|
mkdirSync,
|
|
5
5
|
mkdtempSync,
|
|
6
6
|
readdirSync,
|
|
7
|
-
readFileSync,
|
|
8
7
|
rmSync,
|
|
9
8
|
writeFileSync,
|
|
10
9
|
} from 'node:fs'
|
|
11
10
|
import os from 'node:os'
|
|
12
11
|
import path from 'node:path'
|
|
13
12
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
13
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
14
|
+
import { npm_registry } from '#scripts/version/npm-registry'
|
|
14
15
|
import { execa, type Options } from 'execa'
|
|
15
16
|
import { z } from 'zod'
|
|
16
17
|
import { fresh_machine_docker, type ContainerRun } from './fresh-machine-docker'
|
|
@@ -133,19 +134,18 @@ async function pack(pack_directory: string, write: Write): Promise<string> {
|
|
|
133
134
|
}
|
|
134
135
|
|
|
135
136
|
function package_name(): string {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
return MANIFEST_SCHEMA.parse(JSON.parse(manifest)).name
|
|
137
|
+
return package_manifest.read_manifest(PROJECT_ROOT, MANIFEST_SCHEMA).name
|
|
139
138
|
}
|
|
140
139
|
|
|
141
140
|
// The published version is always written out in the log and the install command, so a run can be
|
|
142
141
|
// repeated against the same release; without `--package-version` it is the registry's latest.
|
|
143
|
-
|
|
142
|
+
function published_version(requested: string | undefined): string {
|
|
144
143
|
if (requested !== undefined) return requested
|
|
145
144
|
|
|
146
|
-
const
|
|
145
|
+
const answer = npm_registry.view(package_name(), 'version')
|
|
146
|
+
if (answer.exit_code !== 0) throw new Error('the registry did not answer the latest version')
|
|
147
147
|
|
|
148
|
-
return stdout.trim()
|
|
148
|
+
return answer.stdout.trim()
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
async function container_run(
|
|
@@ -163,7 +163,7 @@ async function container_run(
|
|
|
163
163
|
seed_directory: staged.seed_directory,
|
|
164
164
|
pack_directory: staged.pack_directory,
|
|
165
165
|
tarball: is_tarball ? await pack(staged.pack_directory, write) : undefined,
|
|
166
|
-
package_version: is_tarball ? undefined :
|
|
166
|
+
package_version: is_tarball ? undefined : published_version(request.package_version),
|
|
167
167
|
secret_names: Object.keys(request.secrets),
|
|
168
168
|
}
|
|
169
169
|
}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"printf '{ \"private\": true }\\n' > package.json",
|
|
13
13
|
"cp \"$PACKAGE_TARBALL\" . && pnpm add -D --allow-build=esbuild --allow-build=unrs-resolver \"./$(basename \"$PACKAGE_TARBALL\")\"",
|
|
14
14
|
"pnpm exec josh start --yes --github",
|
|
15
|
-
"gh label list --limit 100 --json name --jq '.[].name' > \"$HOME/labels.txt\"; grep -xE 'auto-ok|needs-decision|needs-human-review|already-done|
|
|
15
|
+
"gh label list --limit 100 --json name --jq '.[].name' > \"$HOME/labels.txt\"; grep -xE 'auto-ok|needs-decision|needs-human-review|already-done|bug' \"$HOME/labels.txt\"; test \"$(grep -cxE 'auto-ok|needs-decision|needs-human-review|already-done|bug' \"$HOME/labels.txt\")\" -eq 5",
|
|
16
16
|
"curl -fsSL https://claude.ai/install.sh | bash && export PATH=\"$HOME/.local/bin:$PATH\" && claude --version",
|
|
17
17
|
"gh issue create --title 'Add a heading to index.html' --body 'Add an h2 under the h1.' --label auto-ok --label run:lane",
|
|
18
18
|
"timeout 60 pnpm josh backlogrun > \"$HOME/backlogrun.out\" 2>&1; cat \"$HOME/backlogrun.out\"; grep -q '^backlogrun: started' \"$HOME/backlogrun.out\"",
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { MachineReading } from './machine-capacity'
|
|
2
|
+
|
|
3
|
+
// **The busy cores a waiting claim admits against are the mean of its last few seconds of readings**
|
|
4
|
+
// (joshuafolkken/kit#4238). One reading covers a 250 ms window, and a CPU near saturation swings across
|
|
5
|
+
// the threshold from one window to the next, so a claim judged on each reading alone would be admitted
|
|
6
|
+
// on a dip into load that is still there. A claim's readings are its own: each poll of one wait adds
|
|
7
|
+
// one, and its first poll judges on the one it has.
|
|
8
|
+
//
|
|
9
|
+
// **What is averaged is the load outside the ledger, each sample against the ledger of its own
|
|
10
|
+
// moment.** Averaging the raw busy cores and subtracting the ledger of now would count a claim released
|
|
11
|
+
// inside the window as external load: its cores would linger in the mean after leaving the ledger.
|
|
12
|
+
|
|
13
|
+
// Long enough to hold about ten polls of a waiting claim, short enough that a CPU freed a moment ago is
|
|
14
|
+
// admitted against within seconds.
|
|
15
|
+
const AVERAGE_WINDOW_MS = 3000
|
|
16
|
+
|
|
17
|
+
interface BusySample {
|
|
18
|
+
at: number
|
|
19
|
+
external_cores: number
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// The samples still inside the window once `reading` taken at `now`, against a ledger holding
|
|
23
|
+
// `ledger_cores`, is added. An unread reading adds nothing: where the machine cannot be read, nothing
|
|
24
|
+
// is averaged.
|
|
25
|
+
function with_reading(
|
|
26
|
+
samples: ReadonlyArray<BusySample>,
|
|
27
|
+
reading: MachineReading,
|
|
28
|
+
ledger_cores: number,
|
|
29
|
+
now: number,
|
|
30
|
+
): Array<BusySample> {
|
|
31
|
+
const kept = samples.filter((sample) => now - sample.at < AVERAGE_WINDOW_MS)
|
|
32
|
+
const { busy_cores } = reading
|
|
33
|
+
|
|
34
|
+
if (busy_cores === undefined) return kept
|
|
35
|
+
|
|
36
|
+
return [...kept, { at: now, external_cores: Math.max(0, busy_cores - ledger_cores) }]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// `reading` with its busy cores replaced by the mean load outside the ledger on top of the ledger's
|
|
40
|
+
// `ledger_cores` now, or unchanged when none were read.
|
|
41
|
+
function averaged(
|
|
42
|
+
reading: MachineReading,
|
|
43
|
+
samples: ReadonlyArray<BusySample>,
|
|
44
|
+
ledger_cores: number,
|
|
45
|
+
): MachineReading {
|
|
46
|
+
if (reading.busy_cores === undefined || samples.length === 0) return reading
|
|
47
|
+
|
|
48
|
+
let total = 0
|
|
49
|
+
|
|
50
|
+
for (const sample of samples) total += sample.external_cores
|
|
51
|
+
|
|
52
|
+
return { ...reading, busy_cores: ledger_cores + total / samples.length }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const busy_average = { AVERAGE_WINDOW_MS, averaged, with_reading }
|
|
56
|
+
|
|
57
|
+
export type { BusySample }
|
|
58
|
+
export { busy_average }
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import {
|
|
2
|
+
run_board_usage_rusage,
|
|
3
|
+
type RusageReader,
|
|
4
|
+
} from '#scripts/run/board/run-board-usage-rusage'
|
|
5
|
+
|
|
6
|
+
// **The CPU a check's process tree spent, read off the gate's own reaped-children time**
|
|
7
|
+
// (joshuafolkken/kit#4362). Each check is a `pnpm josh <target>` child that waits for its tool before it
|
|
8
|
+
// exits, so once the gate has reaped it the whole tree's CPU sits in the gate's `proc_pid_rusage`
|
|
9
|
+
// child times (`run-board-usage-rusage.ts`, shared rather than read twice). The reader folds the
|
|
10
|
+
// gate's own time in, so `process.cpuUsage()` takes it back out, and each finished check takes the
|
|
11
|
+
// growth since the previous one finished.
|
|
12
|
+
//
|
|
13
|
+
// **A reading is an attribution, not an isolation**: any other child the gate reaped in between — a
|
|
14
|
+
// `ps` sample, a git call — lands on the next check that finishes, and two checks reaped in one tick
|
|
15
|
+
// split their CPU unevenly. Both are small beside a check's tools. Off macOS, or without `node:ffi`,
|
|
16
|
+
// there is no reader and every check records none.
|
|
17
|
+
|
|
18
|
+
const US_PER_MS = 1000
|
|
19
|
+
|
|
20
|
+
// The CPU milliseconds spent by the children reaped since the previous call, `undefined` where the
|
|
21
|
+
// gate's own usage cannot be read.
|
|
22
|
+
type CheckCpu = () => number | undefined
|
|
23
|
+
|
|
24
|
+
function own_cpu_ms(): number {
|
|
25
|
+
const usage = process.cpuUsage()
|
|
26
|
+
|
|
27
|
+
return (usage.user + usage.system) / US_PER_MS
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function reaped_cpu_ms(read: RusageReader | undefined, pid: number): number | undefined {
|
|
31
|
+
const reading = read?.(pid)
|
|
32
|
+
|
|
33
|
+
return reading === undefined ? undefined : reading.cpu_ms - own_cpu_ms()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// One gate's reader, its baseline taken now — before any check is reaped.
|
|
37
|
+
function check_cpu_reader(
|
|
38
|
+
read: RusageReader | undefined = run_board_usage_rusage.rusage_reader(
|
|
39
|
+
process.platform,
|
|
40
|
+
run_board_usage_rusage.load_builtin,
|
|
41
|
+
),
|
|
42
|
+
pid: number = process.pid,
|
|
43
|
+
): CheckCpu {
|
|
44
|
+
const previous = { reaped_ms: reaped_cpu_ms(read, pid) }
|
|
45
|
+
|
|
46
|
+
return function since_previous(): number | undefined {
|
|
47
|
+
const reaped_ms = reaped_cpu_ms(read, pid)
|
|
48
|
+
const before = previous.reaped_ms
|
|
49
|
+
|
|
50
|
+
previous.reaped_ms = reaped_ms
|
|
51
|
+
if (reaped_ms === undefined || before === undefined) return undefined
|
|
52
|
+
|
|
53
|
+
return Math.max(0, reaped_ms - before)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const check_cpu = { check_cpu_reader }
|
|
58
|
+
|
|
59
|
+
export type { CheckCpu }
|
|
60
|
+
export { check_cpu }
|
|
@@ -1,85 +1,24 @@
|
|
|
1
1
|
import path from 'node:path'
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// prettier's own ignore files leave out (`.claude/**/*.md`). Prettier answers that itself through
|
|
15
|
-
// `getFileInfo`, so the two ignore files stay the single source.
|
|
2
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
3
|
+
import { test_related } from '#scripts/test/test-related'
|
|
4
|
+
import {
|
|
5
|
+
verification_inputs,
|
|
6
|
+
type InputDeclaration,
|
|
7
|
+
type PrettierIgnored,
|
|
8
|
+
} from './verification-inputs'
|
|
9
|
+
|
|
10
|
+
// The file-level answer of a check's declaration (`verification-inputs.ts`): whether any of the paths
|
|
11
|
+
// that moved is one the check reads, so a gate re-run reuses a check none of whose inputs moved
|
|
12
|
+
// (`check-reuse.ts`). It lives apart from the declarations because following imports reads the
|
|
13
|
+
// test-read map (`test-related.ts`), whose own since-green narrowing reads the declarations.
|
|
16
14
|
//
|
|
17
|
-
// **
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
'.ts',
|
|
22
|
-
'.tsx',
|
|
23
|
-
'.mts',
|
|
24
|
-
'.cts',
|
|
25
|
-
'.js',
|
|
26
|
-
'.jsx',
|
|
27
|
-
'.mjs',
|
|
28
|
-
'.cjs',
|
|
29
|
-
'.svelte',
|
|
30
|
-
'.vue',
|
|
31
|
-
'.json',
|
|
32
|
-
'.jsonc',
|
|
33
|
-
])
|
|
34
|
-
|
|
35
|
-
const GIT_IGNORE = '.gitignore'
|
|
36
|
-
const PRETTIER_IGNORE = '.prettierignore'
|
|
37
|
-
const PRETTIER_IGNORE_FILES = [GIT_IGNORE, PRETTIER_IGNORE] as const
|
|
38
|
-
|
|
39
|
-
const CONFIG_FILES: ReadonlySet<string> = new Set([
|
|
40
|
-
'package.json',
|
|
41
|
-
'pnpm-lock.yaml',
|
|
42
|
-
'pnpm-workspace.yaml',
|
|
43
|
-
'package-lock.json',
|
|
44
|
-
'yarn.lock',
|
|
45
|
-
'bun.lock',
|
|
46
|
-
'bun.lockb',
|
|
47
|
-
'.npmrc',
|
|
48
|
-
'.editorconfig',
|
|
49
|
-
...PRETTIER_IGNORE_FILES,
|
|
50
|
-
])
|
|
51
|
-
|
|
52
|
-
const PRETTIER_CONFIG_PREFIX = '.prettierrc'
|
|
53
|
-
|
|
54
|
-
// Whether prettier would leave `relative` out; `false` when prettier cannot be asked, which keeps the
|
|
55
|
-
// path an input.
|
|
56
|
-
type PrettierIgnored = (relative: string) => Promise<boolean>
|
|
57
|
-
|
|
58
|
-
type InputTest = (relative: string, is_ignored: PrettierIgnored) => Promise<boolean>
|
|
59
|
-
|
|
60
|
-
function is_config(relative: string): boolean {
|
|
61
|
-
const name = path.basename(relative)
|
|
62
|
-
|
|
63
|
-
return CONFIG_FILES.has(name) || name.startsWith(PRETTIER_CONFIG_PREFIX)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function is_source(relative: string): boolean {
|
|
67
|
-
return SOURCE_EXTENSIONS.has(path.extname(relative))
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
async function is_lint_input(relative: string, is_ignored: PrettierIgnored): Promise<boolean> {
|
|
71
|
-
if (is_source(relative)) return true
|
|
72
|
-
if (!lint_related_scope.is_lintable(relative)) return false
|
|
73
|
-
|
|
74
|
-
return !(await is_ignored(relative))
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async function is_source_input(relative: string): Promise<boolean> {
|
|
78
|
-
return is_source(relative)
|
|
79
|
-
}
|
|
15
|
+
// **The unit step's inputs are the test-read map's, not a guess** (joshuafolkken/kit#4314): it is
|
|
16
|
+
// reusable only when `josh test:related` would run no test for what moved — every moved file one no
|
|
17
|
+
// recorded test reads. No map, or one recorded on a tree git can no longer diff against, reaches every
|
|
18
|
+
// test, so the step runs.
|
|
80
19
|
|
|
81
20
|
function prettier_ignored(root: string): PrettierIgnored {
|
|
82
|
-
const ignore_path = PRETTIER_IGNORE_FILES.map((name) => path.join(root, name))
|
|
21
|
+
const ignore_path = verification_inputs.PRETTIER_IGNORE_FILES.map((name) => path.join(root, name))
|
|
83
22
|
|
|
84
23
|
return async function is_ignored(relative: string): Promise<boolean> {
|
|
85
24
|
try {
|
|
@@ -95,35 +34,40 @@ function prettier_ignored(root: string): PrettierIgnored {
|
|
|
95
34
|
}
|
|
96
35
|
}
|
|
97
36
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
37
|
+
async function reads_any(
|
|
38
|
+
declaration: InputDeclaration,
|
|
39
|
+
paths: ReadonlyArray<string>,
|
|
40
|
+
is_ignored: PrettierIgnored,
|
|
41
|
+
root: string,
|
|
42
|
+
): Promise<boolean> {
|
|
43
|
+
if (declaration.reads === 'recorded') return await test_related.reaches_tests(root, paths)
|
|
44
|
+
|
|
45
|
+
const { is_input } = declaration
|
|
103
46
|
|
|
104
|
-
|
|
105
|
-
|
|
47
|
+
if (is_input === undefined) return true
|
|
48
|
+
|
|
49
|
+
const answers = await Promise.all(
|
|
50
|
+
paths.map(async (relative) => await is_input(relative, is_ignored)),
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
return answers.includes(true)
|
|
106
54
|
}
|
|
107
55
|
|
|
108
|
-
// Whether any of `paths` (repository-root relative) is an input of the check `label`. An
|
|
56
|
+
// Whether any of `paths` (repository-root relative) is an input of the check `label`. An undeclared
|
|
109
57
|
// check answers `true` for every set of paths, so the only way to reuse it is never.
|
|
110
58
|
async function touches_inputs(
|
|
111
59
|
label: string,
|
|
112
60
|
paths: ReadonlyArray<string>,
|
|
113
61
|
is_ignored: PrettierIgnored,
|
|
62
|
+
root: string = PROJECT_ROOT,
|
|
114
63
|
): Promise<boolean> {
|
|
115
|
-
const
|
|
64
|
+
const declaration = verification_inputs.declaration_of(label)
|
|
116
65
|
|
|
117
|
-
if (
|
|
66
|
+
if (declaration === undefined || verification_inputs.configures(label, paths)) return true
|
|
118
67
|
|
|
119
|
-
|
|
120
|
-
paths.map(async (relative) => await scope(relative, is_ignored)),
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
return answers.includes(true)
|
|
68
|
+
return await reads_any(declaration, paths, is_ignored, root)
|
|
124
69
|
}
|
|
125
70
|
|
|
126
|
-
const check_inputs = {
|
|
71
|
+
const check_inputs = { prettier_ignored, touches_inputs }
|
|
127
72
|
|
|
128
|
-
export type { PrettierIgnored }
|
|
129
73
|
export { check_inputs }
|