@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
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
3
|
-
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
4
|
-
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
1
|
+
import type { JoshResult } from '#scripts/josh/josh-run'
|
|
5
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
3
|
+
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
4
|
+
import { review_interaction } from '#scripts/review/review-interaction'
|
|
8
5
|
import { review_record } from '#scripts/review/review-record'
|
|
9
|
-
import {
|
|
6
|
+
import { review_round2 } from '#scripts/review/review-round2'
|
|
10
7
|
import { run_ship_review, type RoundOutcome, type ScoredVerdict } from './run-ship-review'
|
|
11
|
-
import {
|
|
8
|
+
import { run_ship_reviewer, type Round } from './run-ship-reviewer'
|
|
9
|
+
import { run_ship_scoped } from './run-ship-scoped'
|
|
10
|
+
import { run_ship_stop_cause } from './run-ship-stop-cause'
|
|
12
11
|
import type { StepResult } from './run-ship-sync'
|
|
13
12
|
|
|
14
13
|
// The side effects of `josh ship --review`: the round-1 review — open, launch, join, attest and
|
|
@@ -17,7 +16,8 @@ import type { StepResult } from './run-ship-sync'
|
|
|
17
16
|
//
|
|
18
17
|
// 1. `run:review` starts the gate detached and mints the brief — the nonce `review:attest` checks.
|
|
19
18
|
// 2. the reviewer is launched the way `run:wake` launches a session — `agent_argv` under the reviewer
|
|
20
|
-
// profile, `detached_launch.launch_attached` to wait for its exit — handed the brief by path
|
|
19
|
+
// profile, `detached_launch.launch_attached` to wait for its exit — handed the brief by path
|
|
20
|
+
// (`run-ship-reviewer.ts`).
|
|
21
21
|
// 3. `run:review --join` blocks a verdict over a red gate; `review:attest --check` refuses a review
|
|
22
22
|
// that read another checkout; `review:record` writes the round the merge gate reads.
|
|
23
23
|
//
|
|
@@ -36,19 +36,15 @@ import type { StepResult } from './run-ship-sync'
|
|
|
36
36
|
// unreadable findings file, a High or an unfixed Medium in round 1, and anything but a clean round 2 —
|
|
37
37
|
// recorded first, because the round was attested, then routed back.
|
|
38
38
|
|
|
39
|
-
const SUCCESS_EXIT_CODE = 0
|
|
40
|
-
const FAILURE_EXIT_CODE = 1
|
|
41
|
-
const should_forward_stderr = true
|
|
42
39
|
const RUN_REVIEW = 'run:review'
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const ROUND_TWO_BRIEF = [
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
const
|
|
40
|
+
const ROUND_TWO_DECISION = ['review:round2', '--round-1-closed', '--json']
|
|
41
|
+
const REVIEW_BRIEF = 'review:brief'
|
|
42
|
+
const ROUND_TWO_BRIEF = [REVIEW_BRIEF, '--round', '2']
|
|
43
|
+
const INTERACTION_FLAG = '--interaction'
|
|
44
|
+
const INTERACTION_BRIEF = [REVIEW_BRIEF, INTERACTION_FLAG]
|
|
45
|
+
const UNREADABLE_DECISION_NOTE = 'review:round2 printed no decision josh ship can read:'
|
|
49
46
|
const COMMENT_FLAG = '--comment'
|
|
50
47
|
|
|
51
|
-
type Round = typeof ROUND_ONE | typeof ROUND_TWO
|
|
52
48
|
const FIXED_JOIN_NOTE =
|
|
53
49
|
'the round-1 gate read the tree before the review fixes — drained, not judged; the gate re-runs once the tree is fixed.'
|
|
54
50
|
const ROUND_TWO_SKIPPED_NOTE = 'round 2 not due — nothing left to verify; shipping on.'
|
|
@@ -58,97 +54,21 @@ const ROUND_ONE_RECORDED_NOTE =
|
|
|
58
54
|
// The scoped pair's precondition, met by the supervisor itself rather than stopped on,
|
|
59
55
|
// single-sourced with the preflight and gate stages.
|
|
60
56
|
const { run_phases, scoped_pair } = run_ship_scoped
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
function note(text: string): void {
|
|
77
|
-
process.stderr.write(`${text}\n`)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Under the reviewer profile — the same model and effort (`JOSH_REVIEWER_*` included) the chain's
|
|
81
|
-
// subagent is given — and waited on, so the join below runs only once the review has finished. Each
|
|
82
|
-
// call is its own process, so round 2 is a fresh session by construction.
|
|
83
|
-
async function run_direct_session(
|
|
84
|
-
argv: AgentArgv,
|
|
85
|
-
profile: AgentProfile,
|
|
86
|
-
log_path: string,
|
|
87
|
-
): Promise<JoshResult> {
|
|
88
|
-
const request = { argv, cwd: PROJECT_ROOT, log_path, profile }
|
|
89
|
-
const result = await detached_launch.launch_attached(request, note)
|
|
90
|
-
|
|
91
|
-
if (result.kind === 'failed') return failure(`reviewer could not start: ${result.note}`)
|
|
92
|
-
if (result.exit_code !== SUCCESS_EXIT_CODE) return failure(`reviewer failed — log: ${log_path}`)
|
|
93
|
-
|
|
94
|
-
return { code: SUCCESS_EXIT_CODE, out: '' }
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// A lane child's reviewer is started by the lane's broker: an OpenAI lane's always, since a nested Codex
|
|
98
|
-
// cannot write outside its sandbox, and a Claude lane's whenever the `run:wake` supervisor serves it, since this
|
|
99
|
-
// ship was started from the child's Bash tool and so never received a token-only credential
|
|
100
|
-
// (joshuafolkken/kit#3817). A Claude lane nobody serves starts the reviewer itself, as before.
|
|
101
|
-
function is_brokered(profile: AgentProfile, issue: string): boolean {
|
|
102
|
-
if (!lane_child_marker.is_child_of(PROJECT_ROOT)) return false
|
|
103
|
-
|
|
104
|
-
return profile.provider === 'openai' || lane_session_broker.is_serving(PROJECT_ROOT, issue)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
async function run_session(
|
|
108
|
-
prompt: string,
|
|
109
|
-
log_path: string,
|
|
110
|
-
issue: string,
|
|
111
|
-
round: Round,
|
|
112
|
-
): Promise<JoshResult> {
|
|
113
|
-
const built = agent_argv.resolve_in(prompt, agent_role_profile.REVIEWER, PROJECT_ROOT)
|
|
114
|
-
if (built.kind === 'rejected') return failure(`reviewer profile rejected: ${built.note}`)
|
|
115
|
-
|
|
116
|
-
if (!is_brokered(built.profile, issue)) {
|
|
117
|
-
return await run_direct_session(built.argv, built.profile, log_path)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const is_success = await lane_session_broker.request(PROJECT_ROOT, issue, {
|
|
121
|
-
kind: 'review',
|
|
122
|
-
round,
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
return is_success ? { code: SUCCESS_EXIT_CODE, out: '' } : failure('isolated reviewer failed')
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// The brief goes to a file and the previous round's findings are removed, so a reviewer that writes
|
|
129
|
-
// nothing reads as unfinished rather than as the last round's verdict.
|
|
130
|
-
async function launch_reviewer(
|
|
131
|
-
brief: string,
|
|
132
|
-
prompt_of: PromptOf,
|
|
133
|
-
issue: string,
|
|
134
|
-
round: Round,
|
|
135
|
-
): Promise<JoshResult> {
|
|
136
|
-
const target = paths()
|
|
137
|
-
|
|
138
|
-
stamp_file.write_text_stamp(target.brief, brief)
|
|
139
|
-
stamp_file.remove_stamp(target.findings)
|
|
140
|
-
|
|
141
|
-
return await run_session(
|
|
142
|
-
prompt_of(target.brief, target.findings, issue),
|
|
143
|
-
target.log,
|
|
144
|
-
issue,
|
|
145
|
-
round,
|
|
146
|
-
)
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function current_verdict(): ReturnType<typeof run_ship_review.read_verdict> {
|
|
150
|
-
return run_ship_review.read_verdict(stamp_file.read_stamp_text(paths().findings))
|
|
151
|
-
}
|
|
57
|
+
const { CAUSE } = run_ship_stop_cause
|
|
58
|
+
const {
|
|
59
|
+
attest_phase,
|
|
60
|
+
current_verdict,
|
|
61
|
+
failure,
|
|
62
|
+
josh,
|
|
63
|
+
note,
|
|
64
|
+
paths,
|
|
65
|
+
reviewed,
|
|
66
|
+
ROUND_ONE,
|
|
67
|
+
ROUND_TWO,
|
|
68
|
+
SUCCESS_EXIT_CODE,
|
|
69
|
+
tagged,
|
|
70
|
+
tagged_phase,
|
|
71
|
+
} = run_ship_reviewer
|
|
152
72
|
|
|
153
73
|
// A red join blocks unless the reviewer fixed findings in place: the background gate then read the
|
|
154
74
|
// tree before the fixes, so its verdict describes a tree that no longer exists. The join still ran to
|
|
@@ -178,57 +98,42 @@ function record_flags(round: Round, outcome: RoundOutcome): ReadonlyArray<string
|
|
|
178
98
|
return round === ROUND_TWO && outcome.is_passing ? [COMMENT_FLAG] : []
|
|
179
99
|
}
|
|
180
100
|
|
|
101
|
+
// `kind` is the record's own flags — `--interaction` for the interaction review's `- ri:` line.
|
|
181
102
|
async function record_and_route(
|
|
182
103
|
issue: string,
|
|
183
104
|
round: Round,
|
|
184
105
|
outcome_of: (verdict: ScoredVerdict) => RoundOutcome,
|
|
106
|
+
kind: ReadonlyArray<string> = [],
|
|
185
107
|
): Promise<JoshResult> {
|
|
186
108
|
const verdict = current_verdict()
|
|
187
109
|
|
|
188
|
-
if (verdict.kind === run_ship_review.VERDICT.INVALID) return failure(verdict.note)
|
|
110
|
+
if (verdict.kind === run_ship_review.VERDICT.INVALID) return failure(verdict.note, CAUSE.INFRA)
|
|
189
111
|
|
|
190
112
|
const outcome = outcome_of(verdict)
|
|
191
|
-
const flags = record_flags(round, outcome)
|
|
113
|
+
const flags = [...kind, ...record_flags(round, outcome)]
|
|
192
114
|
const recorded = await josh(['review:record', '--issue', issue, ...flags, ...verdict.specs])
|
|
193
115
|
|
|
194
|
-
if (recorded.code !== SUCCESS_EXIT_CODE) return recorded
|
|
116
|
+
if (recorded.code !== SUCCESS_EXIT_CODE) return tagged(CAUSE.CHECK, recorded)
|
|
195
117
|
|
|
196
118
|
const out = [...verdict.report, outcome.note].join('\n')
|
|
197
119
|
|
|
198
|
-
return outcome.is_passing ? { code: SUCCESS_EXIT_CODE, out } : failure(out)
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// A brief-minting command, then a reviewer handed what it printed.
|
|
202
|
-
function reviewed(
|
|
203
|
-
open: ReadonlyArray<string>,
|
|
204
|
-
prompt_of: PromptOf,
|
|
205
|
-
issue: string,
|
|
206
|
-
round: Round,
|
|
207
|
-
): ReadonlyArray<Phase> {
|
|
208
|
-
const opened = { brief: '' }
|
|
209
|
-
|
|
210
|
-
return [
|
|
211
|
-
async () => {
|
|
212
|
-
const result = await josh(open)
|
|
213
|
-
|
|
214
|
-
opened.brief = result.out
|
|
215
|
-
|
|
216
|
-
return result
|
|
217
|
-
},
|
|
218
|
-
async () => await launch_reviewer(opened.brief, prompt_of, issue, round),
|
|
219
|
-
]
|
|
120
|
+
return outcome.is_passing ? { code: SUCCESS_EXIT_CODE, out } : failure(out, CAUSE.FINDING)
|
|
220
121
|
}
|
|
221
122
|
|
|
222
123
|
// Fixes made in place are counted only once the scoped pair is green on the fixed tree. The reviewer is
|
|
223
124
|
// asked to leave it green; this is the check that it did, and a fix it could not get green is routed as
|
|
224
125
|
// the finding it still is — recorded, then stopped before the gate and the commit take it in.
|
|
225
|
-
async function round_one_record(issue: string): Promise<JoshResult> {
|
|
126
|
+
async function round_one_record(issue: string, kind?: ReadonlyArray<string>): Promise<JoshResult> {
|
|
226
127
|
const is_fixed = current_verdict().kind === run_ship_review.VERDICT.FIXED
|
|
227
128
|
const checked = is_fixed ? await scoped_pair() : undefined
|
|
228
129
|
const is_verified = checked === undefined || checked.code === SUCCESS_EXIT_CODE
|
|
229
130
|
|
|
230
|
-
return await record_and_route(
|
|
231
|
-
|
|
131
|
+
return await record_and_route(
|
|
132
|
+
issue,
|
|
133
|
+
ROUND_ONE,
|
|
134
|
+
(verdict) =>
|
|
135
|
+
is_verified ? run_ship_review.round_one_outcome(verdict) : run_ship_review.UNVERIFIED_OUTCOME,
|
|
136
|
+
kind,
|
|
232
137
|
)
|
|
233
138
|
}
|
|
234
139
|
|
|
@@ -243,35 +148,86 @@ function skipped(out: string): StepResult {
|
|
|
243
148
|
// **A recorded round 1 is not run again**. A ship relaunched with `--review`
|
|
244
149
|
// after a round-1 stop would otherwise review the whole change a second time as round 1 — a new Medium
|
|
245
150
|
// there stops it again, and round 2 after the commit makes a third. The fix delta is round 2's to
|
|
246
|
-
// verify, and `round_two_stage` asks whether it is due after the commit
|
|
247
|
-
|
|
151
|
+
// verify, and `round_two_stage` asks whether it is due after the commit — unless the issue changed after
|
|
152
|
+
// that round's brief: the recorded round then never read it, and `josh followup` refuses the merge on it
|
|
153
|
+
// (joshuafolkken/kit#4221).
|
|
154
|
+
async function round_one_stage(issue: string, is_stale: boolean): Promise<StepResult> {
|
|
248
155
|
const recorded = await review_record.check(Number(issue))
|
|
249
156
|
|
|
250
|
-
if (recorded.status === 'ok') return skipped(ROUND_ONE_RECORDED_NOTE)
|
|
157
|
+
if (!is_stale && recorded.status === 'ok') return skipped(ROUND_ONE_RECORDED_NOTE)
|
|
251
158
|
|
|
252
159
|
return await run_phases([
|
|
253
|
-
scoped_pair,
|
|
160
|
+
tagged_phase(CAUSE.CHECK, scoped_pair),
|
|
254
161
|
...reviewed([RUN_REVIEW], run_ship_review.reviewer_prompt, issue, ROUND_ONE),
|
|
255
|
-
join_gate,
|
|
256
|
-
|
|
162
|
+
tagged_phase(CAUSE.CHECK, join_gate),
|
|
163
|
+
attest_phase,
|
|
257
164
|
async () => await round_one_record(issue),
|
|
258
165
|
])
|
|
259
166
|
}
|
|
260
167
|
|
|
168
|
+
// The interaction review (joshuafolkken/kit#4276): after round 1, over a change to the run tooling,
|
|
169
|
+
// scoped pair → `review:brief --interaction` → reviewer → attest → `review:record --interaction`. Its
|
|
170
|
+
// fixes are verified as round 1's are; no join, since round 1 already drained the gate.
|
|
171
|
+
async function interaction_stage(issue: string): Promise<StepResult> {
|
|
172
|
+
return await run_phases([
|
|
173
|
+
tagged_phase(CAUSE.CHECK, scoped_pair),
|
|
174
|
+
...reviewed(INTERACTION_BRIEF, run_ship_review.reviewer_prompt, issue, ROUND_ONE),
|
|
175
|
+
attest_phase,
|
|
176
|
+
async () => await round_one_record(issue, [INTERACTION_FLAG]),
|
|
177
|
+
])
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Round 1, then the interaction review where it is due and not yet recorded — so a relaunched ship
|
|
181
|
+
// whose round 1 is recorded still owes it. The first stop is returned as it is.
|
|
182
|
+
async function review_stage(issue: string, is_stale = false): Promise<StepResult> {
|
|
183
|
+
const first = await round_one_stage(issue, is_stale)
|
|
184
|
+
|
|
185
|
+
if (
|
|
186
|
+
first.code !== SUCCESS_EXIT_CODE ||
|
|
187
|
+
(await review_interaction.status(Number(issue))) !== 'missing'
|
|
188
|
+
) {
|
|
189
|
+
return first
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const second = await interaction_stage(issue)
|
|
193
|
+
|
|
194
|
+
if (second.code !== SUCCESS_EXIT_CODE) return second
|
|
195
|
+
|
|
196
|
+
return { code: SUCCESS_EXIT_CODE, out: [first.out, second.out].join('\n') }
|
|
197
|
+
}
|
|
198
|
+
|
|
261
199
|
// The round-2 verification pass, after the commit so it runs beside CI: due only when the round-1 fix
|
|
262
200
|
// delta says so, then scoped pair → brief → fresh reviewer → attest → record.
|
|
201
|
+
//
|
|
202
|
+
// **The decision is read as JSON and recorded in the lane ledger before it is acted on**, so
|
|
203
|
+
// `josh lane:stats` can count the period's round-2 runs and skips by their reason code
|
|
204
|
+
// (joshuafolkken/kit#4064). Output it cannot parse stops the ship rather than guessing a verdict.
|
|
263
205
|
async function round_two_stage(issue: string): Promise<StepResult> {
|
|
264
206
|
const decision = await josh(ROUND_TWO_DECISION)
|
|
265
|
-
const answer = decision.out.trim()
|
|
266
207
|
|
|
267
|
-
if (decision.code !== SUCCESS_EXIT_CODE) return decision
|
|
208
|
+
if (decision.code !== SUCCESS_EXIT_CODE) return tagged(CAUSE.CHECK, decision)
|
|
209
|
+
|
|
210
|
+
const answer = review_round2.parse_json(decision.out)
|
|
211
|
+
|
|
212
|
+
if (answer === undefined) {
|
|
213
|
+
return failure(`${UNREADABLE_DECISION_NOTE}\n${decision.out}`, CAUSE.CHECK)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
note(answer.reason)
|
|
217
|
+
await lane_ledger.record_round_two({
|
|
218
|
+
issue: Number(issue),
|
|
219
|
+
verdict: answer.verdict,
|
|
220
|
+
code: answer.code,
|
|
221
|
+
})
|
|
268
222
|
|
|
269
|
-
if (answer !==
|
|
223
|
+
if (answer.verdict !== review_round2.REQUIRED_VERDICT) {
|
|
224
|
+
return skipped(`${answer.verdict}\n${ROUND_TWO_SKIPPED_NOTE}`)
|
|
225
|
+
}
|
|
270
226
|
|
|
271
227
|
return await run_phases([
|
|
272
|
-
scoped_pair,
|
|
228
|
+
tagged_phase(CAUSE.CHECK, scoped_pair),
|
|
273
229
|
...reviewed(ROUND_TWO_BRIEF, run_ship_review.verification_prompt, issue, ROUND_TWO),
|
|
274
|
-
|
|
230
|
+
attest_phase,
|
|
275
231
|
async () => await record_and_route(issue, ROUND_TWO, run_ship_review.round_two_outcome),
|
|
276
232
|
])
|
|
277
233
|
}
|
|
@@ -23,12 +23,18 @@ const LINE_SEPARATOR = /\r?\n/u
|
|
|
23
23
|
const HIGH = 'high'
|
|
24
24
|
const MEDIUM = 'medium'
|
|
25
25
|
const FIXED_PREFIX = 'fixed '
|
|
26
|
+
const KIND_FIELDS = 2
|
|
26
27
|
// What a finding line carries after its spec: one sentence saying what is wrong, so a stopped ship's
|
|
27
28
|
// log tells the resumed lane child the defect rather than only its location.
|
|
28
29
|
const DESCRIPTION_SEPARATOR = ' — '
|
|
29
30
|
// Where the spec ends on read: a reviewer that types the dash as `-`, `--` or `–` still ends it there,
|
|
30
31
|
// so its sentence never lands in the ledger's file field.
|
|
31
32
|
const DESCRIPTION_BOUNDARY = / [—–-]{1,2} /u
|
|
33
|
+
// Where a description's first sentence ends, and the cap that keeps a run-on one a line. Japanese
|
|
34
|
+
// sets no space after `。`, so it ends a sentence on its own.
|
|
35
|
+
const SENTENCE_END = /(?<=[.!?])\s|(?<=。)/u
|
|
36
|
+
const SENTENCE_LIMIT = 200
|
|
37
|
+
const ELLIPSIS = '…'
|
|
32
38
|
|
|
33
39
|
const VERDICT = {
|
|
34
40
|
CLEAN: 'clean',
|
|
@@ -57,6 +63,15 @@ interface Finding {
|
|
|
57
63
|
spec: string
|
|
58
64
|
is_fixed: boolean
|
|
59
65
|
line: string
|
|
66
|
+
description: string
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// One finding that decided a stopped review, as the durable stop log keeps it: its kind, the
|
|
70
|
+
// `<file>[:<line>]` it cites and the first sentence of what it said (joshuafolkken/kit#4519).
|
|
71
|
+
interface StopFinding {
|
|
72
|
+
kind: string
|
|
73
|
+
location: string
|
|
74
|
+
sentence: string
|
|
60
75
|
}
|
|
61
76
|
|
|
62
77
|
const MISSING_NOTE = 'the reviewer wrote no findings file — the review did not complete'
|
|
@@ -120,17 +135,30 @@ function verification_prompt(brief_path: string, findings_path: string, issue: s
|
|
|
120
135
|
].join(' ')
|
|
121
136
|
}
|
|
122
137
|
|
|
123
|
-
// The spec is what `review:record` reads; the description after it travels
|
|
124
|
-
|
|
125
|
-
|
|
138
|
+
// The spec is what `review:record` reads; the description after it travels in the stage output and,
|
|
139
|
+
// for a finding that stopped the ship, its first sentence in the durable stop log.
|
|
140
|
+
function split_description(unmarked: string): { spec: string; description: string } {
|
|
141
|
+
const boundary = DESCRIPTION_BOUNDARY.exec(unmarked)
|
|
142
|
+
|
|
143
|
+
if (boundary === null) return { spec: unmarked.trim(), description: '' }
|
|
126
144
|
|
|
127
|
-
|
|
145
|
+
const rest = unmarked.slice(boundary.index + boundary[0].length)
|
|
146
|
+
|
|
147
|
+
return { spec: unmarked.slice(0, boundary.index).trim(), description: rest.trim() }
|
|
128
148
|
}
|
|
129
149
|
|
|
130
150
|
function finding_of(line: string): Finding {
|
|
131
151
|
const is_fixed = line.startsWith(FIXED_PREFIX)
|
|
132
152
|
|
|
133
|
-
return {
|
|
153
|
+
return { ...split_description(is_fixed ? line.slice(FIXED_PREFIX.length) : line), is_fixed, line }
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function first_sentence(description: string): string {
|
|
157
|
+
const [sentence = ''] = description.split(SENTENCE_END, 1)
|
|
158
|
+
|
|
159
|
+
if (sentence.length <= SENTENCE_LIMIT) return sentence
|
|
160
|
+
|
|
161
|
+
return `${sentence.slice(0, SENTENCE_LIMIT - ELLIPSIS.length)}${ELLIPSIS}`
|
|
134
162
|
}
|
|
135
163
|
|
|
136
164
|
function spec_findings(text: string): ReadonlyArray<Finding> {
|
|
@@ -153,6 +181,43 @@ function is_blocking(finding: Finding): boolean {
|
|
|
153
181
|
return severity === HIGH || (severity === MEDIUM && !finding.is_fixed)
|
|
154
182
|
}
|
|
155
183
|
|
|
184
|
+
function kind_of(finding: Finding): string {
|
|
185
|
+
return finding.spec.split(':', KIND_FIELDS).join(':')
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function kinds_of(findings: ReadonlyArray<Finding>): ReadonlyArray<string> {
|
|
189
|
+
return [...new Set(findings.map((finding) => kind_of(finding)))]
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function stop_finding_of(finding: Finding): StopFinding {
|
|
193
|
+
const location = review_record_cli.parse_finding(finding.spec)?.file ?? ''
|
|
194
|
+
|
|
195
|
+
return { kind: kind_of(finding), location, sentence: first_sentence(finding.description) }
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// `bug-risks:medium` — each kind of finding that decided a stopped stage, once per kind (the stop
|
|
199
|
+
// counts once under each in `lane:stats`), so the lane ledger records which kinds of finding stop a
|
|
200
|
+
// lane rather than only that one did (joshuafolkken/kit#4426). The blocking findings decide it where
|
|
201
|
+
// there are any; otherwise the stop was decided by the fixes — round-1 fixes red on the scoped pair, or
|
|
202
|
+
// a round 2 that edited the tree — so the fixed findings do. A line outside the grammar is the stage's
|
|
203
|
+
// own prose and never counts.
|
|
204
|
+
function deciding_findings(text: string): ReadonlyArray<Finding> {
|
|
205
|
+
const findings = spec_findings(text).filter((finding) => is_recordable(finding))
|
|
206
|
+
const blocking = findings.filter((finding) => is_blocking(finding))
|
|
207
|
+
|
|
208
|
+
return blocking.length > 0 ? blocking : findings.filter((finding) => finding.is_fixed)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function blocking_kinds(text: string): ReadonlyArray<string> {
|
|
212
|
+
return kinds_of(deciding_findings(text))
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// The same findings `blocking_kinds` counts, each one whole — every finding, not once per kind — so a
|
|
216
|
+
// stop can be classified by what was found where, not only by its kind (joshuafolkken/kit#4519).
|
|
217
|
+
function blocking_details(text: string): ReadonlyArray<StopFinding> {
|
|
218
|
+
return deciding_findings(text).map((finding) => stop_finding_of(finding))
|
|
219
|
+
}
|
|
220
|
+
|
|
156
221
|
function scored_kind(findings: ReadonlyArray<Finding>): ScoredVerdict['kind'] {
|
|
157
222
|
if (findings.some((finding) => is_blocking(finding))) return VERDICT.BLOCKING
|
|
158
223
|
|
|
@@ -216,6 +281,8 @@ const run_ship_review = {
|
|
|
216
281
|
FIXED_PREFIX,
|
|
217
282
|
UNVERIFIED_OUTCOME,
|
|
218
283
|
VERDICT,
|
|
284
|
+
blocking_details,
|
|
285
|
+
blocking_kinds,
|
|
219
286
|
has_fixes,
|
|
220
287
|
is_clean_round_one,
|
|
221
288
|
read_verdict,
|
|
@@ -225,5 +292,5 @@ const run_ship_review = {
|
|
|
225
292
|
verification_prompt,
|
|
226
293
|
}
|
|
227
294
|
|
|
228
|
-
export type { ReviewVerdict, RoundOutcome, ScoredVerdict }
|
|
295
|
+
export type { ReviewVerdict, RoundOutcome, ScoredVerdict, StopFinding }
|
|
229
296
|
export { run_ship_review }
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { agent_argv, type AgentArgv } from '#scripts/agent/agent-argv'
|
|
2
|
+
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
3
|
+
import { api_auth } from '#scripts/agent/api-auth'
|
|
4
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
5
|
+
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
6
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
8
|
+
import { lane_session_broker } from '#scripts/lane/lane-session-broker'
|
|
9
|
+
import { detached_launch } from '#scripts/run/detached-launch'
|
|
10
|
+
import { run_ship_review } from './run-ship-review'
|
|
11
|
+
import type { Phase } from './run-ship-scoped'
|
|
12
|
+
import { run_ship_stop_cause, type Cause } from './run-ship-stop-cause'
|
|
13
|
+
import type { StepResult } from './run-ship-sync'
|
|
14
|
+
|
|
15
|
+
// The reviewer half of `josh ship --review` (`run-ship-review-steps.ts`): a brief-minting command, a
|
|
16
|
+
// reviewer session handed what it printed, and the attestation that the session read this checkout.
|
|
17
|
+
// Every review round the ship runs — round 1, the interaction review, round 2 — launches through here.
|
|
18
|
+
|
|
19
|
+
const SUCCESS_EXIT_CODE = 0
|
|
20
|
+
const FAILURE_EXIT_CODE = 1
|
|
21
|
+
const should_forward_stderr = true
|
|
22
|
+
const ATTEST_CHECK = ['review:attest', '--check']
|
|
23
|
+
const KEPT_REVIEW_NOTE =
|
|
24
|
+
'the reviewer wrote its findings before it failed — its review is kept; attest and record judge it.'
|
|
25
|
+
type Round = '1' | '2'
|
|
26
|
+
|
|
27
|
+
const ROUND_ONE: Round = '1'
|
|
28
|
+
const ROUND_TWO: Round = '2'
|
|
29
|
+
type PromptOf = (brief_path: string, findings_path: string, issue: string) => string
|
|
30
|
+
|
|
31
|
+
const { CAUSE } = run_ship_stop_cause
|
|
32
|
+
|
|
33
|
+
// **Every stop is tagged with the step's own cause**, so a round that stopped on a red join, a reviewer
|
|
34
|
+
// that did not finish or a refused attestation is not booked as a finding (joshuafolkken/kit#4431).
|
|
35
|
+
function failure(out: string, cause: Cause): StepResult {
|
|
36
|
+
return { code: FAILURE_EXIT_CODE, out, cause }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function tagged(cause: Cause, result: JoshResult): StepResult {
|
|
40
|
+
return result.code === SUCCESS_EXIT_CODE ? result : { ...result, cause }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function tagged_phase(cause: Cause, phase: Phase): Phase {
|
|
44
|
+
return async () => tagged(cause, await phase())
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function paths(): { brief: string; findings: string; log: string } {
|
|
48
|
+
return lane_session_broker.review_paths(PROJECT_ROOT)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
|
|
52
|
+
return await josh_command.josh_run(argv, should_forward_stderr)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function note(text: string): void {
|
|
56
|
+
process.stderr.write(`${text}\n`)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A reviewer that could not authenticate is named as such (`api-auth.ts`), so the stop is not booked as
|
|
60
|
+
// a review finding (joshuafolkken/kit#4216).
|
|
61
|
+
function exited_note(log_path: string): string {
|
|
62
|
+
const exited = `reviewer failed — log: ${log_path}`
|
|
63
|
+
|
|
64
|
+
if (!api_auth.is_auth_failed_transcript(stamp_file.read_stamp_text(log_path))) return exited
|
|
65
|
+
|
|
66
|
+
return `${api_auth.AUTH_FAILURE_NOTE}: ${exited}`
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function current_verdict(): ReturnType<typeof run_ship_review.read_verdict> {
|
|
70
|
+
return run_ship_review.read_verdict(stamp_file.read_stamp_text(paths().findings))
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// **A session that ran and then failed keeps the review it wrote** (joshuafolkken/kit#4562). The
|
|
74
|
+
// findings file is removed before the launch and written as the reviewer's last step, so a readable one
|
|
75
|
+
// is this session's finished review — a late auth failure or a lost broker reply then costs nothing,
|
|
76
|
+
// where a relaunch would review the whole change again. The attest and record phases still judge it.
|
|
77
|
+
function ended_session(failed_note: string): JoshResult {
|
|
78
|
+
if (current_verdict().kind === run_ship_review.VERDICT.INVALID) {
|
|
79
|
+
return failure(failed_note, CAUSE.INFRA)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
note(`${failed_note}\n${KEPT_REVIEW_NOTE}`)
|
|
83
|
+
|
|
84
|
+
return { code: SUCCESS_EXIT_CODE, out: '' }
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Under the round's reviewer profile — the same model and effort (`JOSH_REVIEWER_*` included) the
|
|
88
|
+
// chain's subagent is given — and waited on, so the join below runs only once the review has finished.
|
|
89
|
+
// Each call is its own process, so round 2 is a fresh session by construction.
|
|
90
|
+
async function run_direct_session(
|
|
91
|
+
argv: AgentArgv,
|
|
92
|
+
profile: AgentProfile,
|
|
93
|
+
log_path: string,
|
|
94
|
+
round: Round,
|
|
95
|
+
): Promise<JoshResult> {
|
|
96
|
+
const request = { argv, cwd: PROJECT_ROOT, log_path, profile }
|
|
97
|
+
|
|
98
|
+
note(agent_role_profile.describe_review(Number(round), profile))
|
|
99
|
+
const result = await detached_launch.launch_attached(request, note)
|
|
100
|
+
|
|
101
|
+
if (result.kind === 'failed') {
|
|
102
|
+
return failure(`reviewer could not start: ${result.note}`, CAUSE.INFRA)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (result.exit_code !== SUCCESS_EXIT_CODE) return ended_session(exited_note(log_path))
|
|
106
|
+
|
|
107
|
+
return { code: SUCCESS_EXIT_CODE, out: '' }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// A lane child's reviewer is started by the lane's broker: an OpenAI lane's always, since a nested Codex
|
|
111
|
+
// cannot write outside its sandbox, and a Claude lane's whenever the `run:wake` supervisor serves it, since this
|
|
112
|
+
// ship was started from the child's Bash tool and so never received a token-only credential
|
|
113
|
+
// (joshuafolkken/kit#3817). A Claude lane nobody serves starts the reviewer itself, as before.
|
|
114
|
+
function is_brokered(profile: AgentProfile, issue: string): boolean {
|
|
115
|
+
if (!lane_child_marker.is_child_of(PROJECT_ROOT)) return false
|
|
116
|
+
|
|
117
|
+
return profile.provider === 'openai' || lane_session_broker.is_serving(PROJECT_ROOT, issue)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async function run_session(
|
|
121
|
+
prompt: string,
|
|
122
|
+
log_path: string,
|
|
123
|
+
issue: string,
|
|
124
|
+
round: Round,
|
|
125
|
+
): Promise<JoshResult> {
|
|
126
|
+
const built = agent_argv.review_in(prompt, Number(round), PROJECT_ROOT)
|
|
127
|
+
|
|
128
|
+
if (built.kind === 'rejected') {
|
|
129
|
+
return failure(`reviewer profile rejected: ${built.note}`, CAUSE.INFRA)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (!is_brokered(built.profile, issue)) {
|
|
133
|
+
return await run_direct_session(built.argv, built.profile, log_path, round)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const answer = await lane_session_broker.request(PROJECT_ROOT, issue, { kind: 'review', round })
|
|
137
|
+
|
|
138
|
+
return answer.is_success
|
|
139
|
+
? { code: SUCCESS_EXIT_CODE, out: '' }
|
|
140
|
+
: ended_session(`isolated reviewer failed: ${answer.reason}`)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// The brief goes to a file and the previous round's findings are removed, so a reviewer that writes
|
|
144
|
+
// nothing reads as unfinished rather than as the last round's verdict.
|
|
145
|
+
async function launch_reviewer(
|
|
146
|
+
brief: string,
|
|
147
|
+
prompt_of: PromptOf,
|
|
148
|
+
issue: string,
|
|
149
|
+
round: Round,
|
|
150
|
+
): Promise<JoshResult> {
|
|
151
|
+
const target = paths()
|
|
152
|
+
|
|
153
|
+
stamp_file.write_text_stamp(target.brief, brief)
|
|
154
|
+
stamp_file.remove_stamp(target.findings)
|
|
155
|
+
|
|
156
|
+
return await run_session(
|
|
157
|
+
prompt_of(target.brief, target.findings, issue),
|
|
158
|
+
target.log,
|
|
159
|
+
issue,
|
|
160
|
+
round,
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// A refused attestation — the issue changed after the brief, an update left unread, no attestation —
|
|
165
|
+
// is no finding: the round read what it was briefed on.
|
|
166
|
+
async function attest_phase(): Promise<StepResult> {
|
|
167
|
+
return tagged(CAUSE.ATTEST, await josh(ATTEST_CHECK))
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// A brief-minting command, then a reviewer handed what it printed.
|
|
171
|
+
function reviewed(
|
|
172
|
+
open: ReadonlyArray<string>,
|
|
173
|
+
prompt_of: PromptOf,
|
|
174
|
+
issue: string,
|
|
175
|
+
round: Round,
|
|
176
|
+
): ReadonlyArray<Phase> {
|
|
177
|
+
const opened = { brief: '' }
|
|
178
|
+
|
|
179
|
+
return [
|
|
180
|
+
async () => {
|
|
181
|
+
const result = await josh(open)
|
|
182
|
+
|
|
183
|
+
opened.brief = result.out
|
|
184
|
+
|
|
185
|
+
return tagged(CAUSE.CHECK, result)
|
|
186
|
+
},
|
|
187
|
+
async () => await launch_reviewer(opened.brief, prompt_of, issue, round),
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const run_ship_reviewer = {
|
|
192
|
+
attest_phase,
|
|
193
|
+
current_verdict,
|
|
194
|
+
failure,
|
|
195
|
+
josh,
|
|
196
|
+
note,
|
|
197
|
+
paths,
|
|
198
|
+
reviewed,
|
|
199
|
+
ROUND_ONE,
|
|
200
|
+
ROUND_TWO,
|
|
201
|
+
SUCCESS_EXIT_CODE,
|
|
202
|
+
tagged,
|
|
203
|
+
tagged_phase,
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export type { Round }
|
|
207
|
+
export { run_ship_reviewer }
|