@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
package/prompts/review.md
CHANGED
|
@@ -24,9 +24,10 @@ first review counts), whichever comes first. Round 2 is a verification pass over
|
|
|
24
24
|
|
|
25
25
|
## Before round 1 — the implementer's self-check
|
|
26
26
|
|
|
27
|
-
Answer these
|
|
28
|
-
answer turns up (about
|
|
29
|
-
|
|
27
|
+
Answer these nine over your own diff before the scoped pair that precedes round 1, and fix what an
|
|
28
|
+
answer turns up (about four in five of 100 sampled High/Medium findings that stopped lane reviews
|
|
29
|
+
fell under one; `pnpm josh lane:stats` counts the kinds that still stop). The review, its severity
|
|
30
|
+
tests and the round cap are unchanged.
|
|
30
31
|
|
|
31
32
|
1. **Tests pin the change** — for each condition, branch or call added or changed, name the test that
|
|
32
33
|
turns red when it is deleted or inverted, and check its fixture reaches that branch (no assert on a
|
|
@@ -38,8 +39,24 @@ review, its severity tests and the round cap are unchanged.
|
|
|
38
39
|
path returns something a caller can tell apart from `false`, `undefined` or "nothing found".
|
|
39
40
|
4. **Every caller moved with it** — grep every reference to a changed function, list or command, and
|
|
40
41
|
update each sibling path (the other CLI, the registry, the consumer side) in the same change.
|
|
42
|
+
The readers outside the diff: `pnpm josh review:brief` → `## Readers outside the diff`.
|
|
41
43
|
5. **The Issue is met on HEAD** — the premises you relied on hold on the current tree, and each
|
|
42
44
|
acceptance criterion is checked against the diff.
|
|
45
|
+
6. **State is read fresh** — for every record, stamp, snapshot, memo or ledger a decision reads, name
|
|
46
|
+
its writer and check it cannot be older than the decision (a past `success`, a tick's shared
|
|
47
|
+
snapshot, a sync before the commit) or written by another run in between.
|
|
48
|
+
7. **The rule covers its whole input space** — list every kind of input a scan, pattern, matcher or
|
|
49
|
+
lookup must accept or reject (the sibling file type, the consumer's config beside the root, quoted
|
|
50
|
+
text, a subshell, a pipe, a heredoc) and pin one test row per kind.
|
|
51
|
+
8. **Edge inputs and environments** — say what the change does when its input is empty, absent or
|
|
52
|
+
new, and outside a TTY, a lane or the default agent runtime.
|
|
53
|
+
9. **Claims about other components are checked in their code** — for every claim your code or a
|
|
54
|
+
comment makes about another component's behavior (what a stage does, who enforces a limit, which
|
|
55
|
+
repository it runs in), open that component's code and confirm it; then name each context the
|
|
56
|
+
change runs in — kit and a consumer, and a predecessor that died midway leaving its record behind.
|
|
57
|
+
|
|
58
|
+
The brief lists `Removed tests` → each needs a `## 消えたテストの処置` row in the PR body, or the
|
|
59
|
+
merge is refused: `prompts/collaboration-workflow/report-format.md` → "PR 本文の消えたテストの処置".
|
|
43
60
|
|
|
44
61
|
---
|
|
45
62
|
|
|
@@ -48,8 +65,7 @@ review, its severity tests and the round cap are unchanged.
|
|
|
48
65
|
Run `pnpm josh review:brief --level-only` and use what it prints — `low` or `medium`, from the changed
|
|
49
66
|
paths only, never "this one is small". `--staged` classifies the staged diff, `--json` adds the reason;
|
|
50
67
|
inside a workflow `pnpm josh review:brief` prints the level on its first line. `low` gets 1 round,
|
|
51
|
-
`medium` up to 2.
|
|
52
|
-
`docs/maintainers/review-history.md` → "The level is decided from the changed paths".
|
|
68
|
+
`medium` up to 2. A diff that touches documentation is not inert: it stays at `medium`.
|
|
53
69
|
|
|
54
70
|
```bash
|
|
55
71
|
pnpm josh review:brief --level-only # the branch diff
|
|
@@ -60,10 +76,20 @@ pnpm josh review:brief --level-only --staged # the staged diff
|
|
|
60
76
|
|
|
61
77
|
---
|
|
62
78
|
|
|
79
|
+
## Interaction review
|
|
80
|
+
|
|
81
|
+
After round 1 and its record, `pnpm josh review:brief --interaction` answers whether the change takes
|
|
82
|
+
the interaction review and prints its brief; hand it to a reviewer subagent, dispose of the findings
|
|
83
|
+
by the three-way disposition below, and record the pass with
|
|
84
|
+
`pnpm josh review:record --interaction --issue <N> [<category>:<severity>:<file> ...]`.
|
|
85
|
+
|
|
86
|
+
`pnpm josh followup` refuses a due change with none recorded; `pnpm josh ship --review` runs it itself.
|
|
87
|
+
|
|
63
88
|
## Review round cap (2 rounds)
|
|
64
89
|
|
|
65
90
|
Two rounds is the ceiling, not the schedule: every fix creates new surface a further round would find
|
|
66
|
-
something in. Whether round 2 is due is `pnpm josh review:round2`'s answer (below).
|
|
91
|
+
something in. Whether round 2 is due is `pnpm josh review:round2`'s answer (below). The interaction
|
|
92
|
+
review is not one of the two.
|
|
67
93
|
|
|
68
94
|
### A merge-conflict resolution review is not one of the two
|
|
69
95
|
|
|
@@ -94,16 +120,10 @@ deferred. Without the flag, and on any uncertainty (a missing round-1 snapshot i
|
|
|
94
120
|
as code).
|
|
95
121
|
|
|
96
122
|
One path outside that set makes it `required` — `.claude/**`, `CLAUDE.md`, a test, configuration, a
|
|
97
|
-
code line, or a source file whose comment-free text cannot be read.
|
|
98
|
-
→ "The two skip arms".
|
|
99
|
-
|
|
100
|
-
Record a skipped round on the Issue:
|
|
123
|
+
code line, or a source file whose comment-free text cannot be read.
|
|
101
124
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
then `gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=review-round2-skipped'`.
|
|
105
|
-
2. Comment under `## Round 2 skipped`, naming which arm fired and quoting the command's reason line
|
|
106
|
-
verbatim.
|
|
125
|
+
Record a skipped round on the Issue with a comment under `## Round 2 skipped`, naming which arm fired
|
|
126
|
+
and quoting the command's reason line verbatim.
|
|
107
127
|
|
|
108
128
|
### Three-way disposition after the cap
|
|
109
129
|
|
|
@@ -129,7 +149,8 @@ Findings that reduce to one root judgement are filed as one Issue with a section
|
|
|
129
149
|
|
|
130
150
|
Branch 2 only:
|
|
131
151
|
|
|
132
|
-
- File a follow-up Issue
|
|
152
|
+
- File a follow-up Issue whose `parent: #N` line names the current one — a mention in its background
|
|
153
|
+
is not read by `epic:bundle`; the current Issue completes.
|
|
133
154
|
- An Issue in no epic is never offered by `epic:next`, so filing continues to the epic. Run these steps
|
|
134
155
|
inside the CI wait: in `fullrun` / `backlogrun` after `pnpm josh git -y` and before
|
|
135
156
|
`pnpm josh followup`; in `halfrun` or a standalone pre-commit self-review as soon as the disposition
|
|
@@ -140,19 +161,17 @@ Branch 2 only:
|
|
|
140
161
|
a `fold`; the first filing asks nothing.
|
|
141
162
|
|
|
142
163
|
1. Before the current Issue closes, file it tagged `route:review-cap`:
|
|
143
|
-
`pnpm josh issue:file "<title>" --body-file <body-file> --
|
|
164
|
+
`pnpm josh issue:file "<title>" --body-file <body-file> --route review-cap`. It lints
|
|
144
165
|
the body, applies the declared labels, runs the duplicate scan and `epic:bundle`
|
|
145
166
|
(`docs/josh-commands-backlog.md` → `josh issue:file`). `epic:bundle` reads open issues only, so
|
|
146
167
|
after the parent closes it answers `none` permanently.
|
|
147
|
-
2. Act on the printed `epic:bundle` answer
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
- `add_to_epic`
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
what was taken, what was rejected and why on the new Issue and that epic's `## Decisions`. Stop
|
|
155
|
-
only where the two epics are genuinely too close to separate.
|
|
168
|
+
2. Act on the printed `epic:bundle` answer with `pnpm josh epic:bundle <new> --apply` — never a
|
|
169
|
+
hand edit of the epic body, which leaves the task list and `blocked-by` relations disagreeing
|
|
170
|
+
(`epic:next` returns `error`). Tier A, no confirmation:
|
|
171
|
+
- `add_to_epic` / `create_epic` → `--apply` writes it, with any recorded order.
|
|
172
|
+
- `ask` (candidates across two or more epics) → `--apply` writes nothing; place it in the
|
|
173
|
+
recommended epic with `pnpm josh epic --add <E> <new> --decision-file <path>`
|
|
174
|
+
(`.claude/skills/epic-commands/epic-bundle.md`).
|
|
156
175
|
- `none` → nothing.
|
|
157
176
|
- Non-zero exit, or any ⚠ warning above `Nothing to bundle.` → stop and report what it said; a
|
|
158
177
|
`none` after such a warning is not "nothing to bundle".
|
package/prompts/testing-guide.md
CHANGED
|
@@ -2,20 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## 0. Per-Requirement Test Coverage (MANDATORY)
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
### Planning template
|
|
8
|
-
|
|
9
|
-
```text
|
|
10
|
-
Req 1: "Label chip shown immediately"
|
|
11
|
-
→ E2E: open editor, type new label, press Enter → chip visible without blurring
|
|
12
|
-
|
|
13
|
-
Req 2: "Down arrow moves to next row"
|
|
14
|
-
→ E2E: open editor on row 1, press ↓ → row 2 enters edit mode
|
|
15
|
-
|
|
16
|
-
Req N: ...
|
|
17
|
-
→ Unit/E2E: ...
|
|
18
|
-
```
|
|
5
|
+
Every requirement gets a test (`CLAUDE.md` → "Code Change Rules" Step 0); the declaration's form is `prompts/collaboration-workflow/report-format.md` → "作業前サマリはいつ・どう出すか". This section decides which test.
|
|
19
6
|
|
|
20
7
|
### Rules
|
|
21
8
|
|
|
@@ -24,7 +11,6 @@ Req N: ...
|
|
|
24
11
|
- **Non-runtime updates (pre-approved manual-only exception):** a change touching no executable runtime code path — docs, non-executable config, editor/IDE files, cosmetic asset swaps with no selector/path change — may be verified by hand; declare it in Step 0 with the reason. The mechanically exempt (`*.md`, `.editorconfig`, `.idea/**`, `.vscode/**`, `prompts/**`) need no declaration. A runtime change whose test is infeasible needs the reason and user approval.
|
|
25
12
|
- **basic で kit がテストできない言語だけの変更:** `package.json` に `josh.profile: basic`(改名前の `static` も同じ)があり、変更が HTML/CSS や Lua などのソースだけなら自動テストは不要。HTML/CSS はブラウザーで対象ページを開き、想定する画面幅でレイアウト・リンク・HTML 内の操作を確認する。そのほかのソースは変更した処理を実際に動かす。どちらも結果を記録する。JavaScript または TypeScript のファイルを含む変更は自動テストを行う。
|
|
26
13
|
- Test infeasible (e.g., a native OS date-picker Playwright cannot drive) → comment why in the test file and test the closest observable behavior (e.g., the editor stays open after `change`).
|
|
27
|
-
- A requirement without its test is not done.
|
|
28
14
|
|
|
29
15
|
### Verification checklist (add to the completion gate)
|
|
30
16
|
|
|
@@ -50,7 +36,7 @@ Req N: ...
|
|
|
50
36
|
| Component / browser | `*.svelte.test.ts` | browser/component vitest project |
|
|
51
37
|
| E2E | `src/routes/**/*.e2e.ts` | Playwright |
|
|
52
38
|
|
|
53
|
-
- **Never `*.spec.ts`** — lint-enforced by `eslint/rules/test-filename.js` (wired into `eslint/base.js`) for every JS/TS extension
|
|
39
|
+
- **Never `*.spec.ts`** — lint-enforced by `eslint/rules/test-filename.js` (wired into `eslint/base.js`) for every JS/TS extension.
|
|
54
40
|
- **Keep the `.svelte.` infix** on component/browser tests: `*.svelte.test.ts` matches the browser project (`include: src/**/*.svelte.{test,spec}.{js,ts}`), plain `*.test.ts` the node project (`include: src/**/*.{test,spec}.{js,ts}`); dropping it silently moves the file to the wrong project.
|
|
55
41
|
- **Colocate** each test beside its code (`foo.test.ts` next to `foo.ts`); no top-level `tests/` (lint-enforced by the same rule). E2E specs go under `src/routes/**` — enforced by review only, since `playwright.config.ts` `testMatch: '**/*.e2e.{ts,js}'` runs them anywhere.
|
|
56
42
|
|
|
@@ -58,10 +44,7 @@ Req N: ...
|
|
|
58
44
|
|
|
59
45
|
## 2. Test Guidelines
|
|
60
46
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
- Variables/functions: `snake_case` | Constants: `UPPER_SNAKE_CASE`
|
|
64
|
-
- Boolean prefix: `is_`, `has_`, `should_`, `can_`, `will_`, `did_`
|
|
47
|
+
Naming, imports, `any`, `@ts-ignore`, magic numbers, template `String()` and the 10-statement limit are lint-enforced (`eslint/base.js`); this section holds only what lint cannot see.
|
|
65
48
|
|
|
66
49
|
### Test Functions
|
|
67
50
|
|
|
@@ -73,15 +56,6 @@ Req N: ...
|
|
|
73
56
|
- Playwright: `for` loop; Vitest: `test.each` / `it.each`
|
|
74
57
|
- Cases: a `cases` or `*_cases` array at file top, outside test functions
|
|
75
58
|
|
|
76
|
-
### Constants
|
|
77
|
-
|
|
78
|
-
- Magic numbers/strings except `0`, `1`, `-1` → `UPPER_SNAKE_CASE` constants after the imports
|
|
79
|
-
|
|
80
|
-
### Imports
|
|
81
|
-
|
|
82
|
-
- Always the `.js` extension: `import { foo } from './bar.js'`
|
|
83
|
-
- Type imports: `import { type Foo } from '...'`
|
|
84
|
-
|
|
85
59
|
### Playwright
|
|
86
60
|
|
|
87
61
|
- Select with `page.getByTestId('id')`; add `data-testid` to the implementation
|
|
@@ -102,17 +76,6 @@ When tests leave persistent state behind:
|
|
|
102
76
|
### Error Messages
|
|
103
77
|
|
|
104
78
|
- State expected and actual values
|
|
105
|
-
- Wrap `number` in template literals with `String()`
|
|
106
|
-
- No `?? ''` unless the value can be `undefined`
|
|
107
|
-
|
|
108
|
-
### Type Safety
|
|
109
|
-
|
|
110
|
-
- No `any`; use every loop variable
|
|
111
|
-
- `@ts-expect-error`, not `@ts-ignore`
|
|
112
|
-
|
|
113
|
-
### Statement Limit
|
|
114
|
-
|
|
115
|
-
- Max 10 statements per test function; split beyond that
|
|
116
79
|
|
|
117
80
|
### No live network
|
|
118
81
|
|
|
@@ -122,15 +85,15 @@ When tests leave persistent state behind:
|
|
|
122
85
|
|
|
123
86
|
### A josh command that writes state runs through the integration harness (kit only)
|
|
124
87
|
|
|
125
|
-
- A new or changed state-writing josh command needs a test in all three environments of `
|
|
88
|
+
- A new or changed state-writing josh command needs a test in all three environments of `tools/test/josh-harness.ts` — kit, a consumer without `docs/`, a lane worktree (joshuafolkken/kit#2402). Packed suite: `vitest.harness.config.ts`
|
|
126
89
|
|
|
127
90
|
---
|
|
128
91
|
|
|
129
92
|
## 3. Checklist
|
|
130
93
|
|
|
131
|
-
- [ ] `pnpm josh gate`, then E2E per § 6
|
|
132
|
-
- [ ] `
|
|
133
|
-
- [ ] § 2 holds:
|
|
94
|
+
- [ ] `pnpm josh gate`, then the E2E gate per § 6
|
|
95
|
+
- [ ] `pnpm josh lint:related`: 0 errors on touched files; Playwright: no failures and no flaky runs
|
|
96
|
+
- [ ] § 2 holds: `data-testid` selectors, `async` Playwright tests, expected/actual in error messages
|
|
134
97
|
|
|
135
98
|
---
|
|
136
99
|
|
|
@@ -148,7 +111,7 @@ Reset module state at the start of each test (`reset_praise_audio_index()` in `s
|
|
|
148
111
|
|
|
149
112
|
## 6. Closing the E2E gate without a human run
|
|
150
113
|
|
|
151
|
-
No human E2E run closes the gate, and nothing a red local run stopped is let through
|
|
114
|
+
No human E2E run closes the gate, and nothing a red local run stopped is let through.
|
|
152
115
|
|
|
153
116
|
### Which result closes the gate
|
|
154
117
|
|
|
@@ -161,6 +124,8 @@ Decided by whether a pull request is open:
|
|
|
161
124
|
|
|
162
125
|
**Never ask the user to run it**, in either row, and never report completion on an unread E2E result — unread is not a pass.
|
|
163
126
|
|
|
127
|
+
Second row: run with `CI` unset (DEV: `pnpm run dev` on the port `playwright.config.ts` derives from `PORT_SEED`); no `pnpm build` or `CI=true` unless asked. Playwright cannot run here → report the E2E result missing and the gate not closed.
|
|
128
|
+
|
|
164
129
|
Second row: prefer an integrated gate when the installed toolkit's printed command list has one (not by toolkit or version) — `@joshuafolkken/app-kit`'s `pnpm josh-app verify` builds and boots once for E2E and the DAST scan, delegating E2E to `josh test:e2e` (so the skip below applies).
|
|
165
130
|
|
|
166
131
|
### A project with no E2E suite
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type AgentEnvironment,
|
|
5
5
|
type AgentProfile,
|
|
6
6
|
type AgentRole,
|
|
7
|
+
type ProfileResult,
|
|
7
8
|
} from './agent-role-profile'
|
|
8
9
|
import { claude_agent_argv } from './claude-agent-argv'
|
|
9
10
|
import { codex_agent_argv } from './codex-agent-argv'
|
|
@@ -11,6 +12,8 @@ import { codex_agent_argv } from './codex-agent-argv'
|
|
|
11
12
|
interface AgentArgv {
|
|
12
13
|
command: string
|
|
13
14
|
args: ReadonlyArray<string>
|
|
15
|
+
// The invocation is the last element, so `detached-launch.ts` lets that one break lines.
|
|
16
|
+
ends_with_prompt: true
|
|
14
17
|
}
|
|
15
18
|
|
|
16
19
|
type AgentArgvResult =
|
|
@@ -112,22 +115,35 @@ function resume_argv(
|
|
|
112
115
|
: with_profile_in(invocation, resolved.profile, cwd)
|
|
113
116
|
}
|
|
114
117
|
|
|
118
|
+
function profiled_in(invocation: string, resolved: ProfileResult, cwd: string): AgentArgvResult {
|
|
119
|
+
return resolved.kind === 'rejected'
|
|
120
|
+
? resolved
|
|
121
|
+
: with_profile_in(invocation, resolved.profile, cwd)
|
|
122
|
+
}
|
|
123
|
+
|
|
115
124
|
function resolve_in(
|
|
116
125
|
invocation: string,
|
|
117
126
|
role: AgentRole,
|
|
118
127
|
cwd: string,
|
|
119
128
|
environment: AgentEnvironment = process.env,
|
|
120
129
|
): AgentArgvResult {
|
|
121
|
-
|
|
130
|
+
return profiled_in(invocation, agent_role_profile.resolve(role, environment), cwd)
|
|
131
|
+
}
|
|
122
132
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
133
|
+
// The reviewer for one review round, so a verification pass runs on its own profile.
|
|
134
|
+
function review_in(
|
|
135
|
+
invocation: string,
|
|
136
|
+
round: number,
|
|
137
|
+
cwd: string,
|
|
138
|
+
environment: AgentEnvironment = process.env,
|
|
139
|
+
): AgentArgvResult {
|
|
140
|
+
return profiled_in(invocation, agent_role_profile.resolve_review(round, environment), cwd)
|
|
126
141
|
}
|
|
127
142
|
|
|
128
143
|
const agent_argv = {
|
|
129
144
|
resolve,
|
|
130
145
|
resolve_in,
|
|
146
|
+
review_in,
|
|
131
147
|
resume_argv,
|
|
132
148
|
with_profile,
|
|
133
149
|
with_profile_in,
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import { transcript_record, type TranscriptRecord } from '#scripts/lib/transcript-record'
|
|
2
3
|
import { z } from 'zod'
|
|
3
4
|
import type { AgentProvider } from './agent-role-profile'
|
|
4
5
|
import { claude_result_event } from './claude-result-event'
|
|
5
6
|
|
|
6
|
-
const
|
|
7
|
-
const CLAUDE_MESSAGE_SCHEMA = z.looseObject({ content: z.array(z.unknown()).optional() })
|
|
7
|
+
const ASSISTANT_TYPE = 'assistant'
|
|
8
8
|
const CLAUDE_INIT_SCHEMA = z.looseObject({ type: z.literal('system'), subtype: z.literal('init') })
|
|
9
|
-
const CLAUDE_ASSISTANT_SCHEMA = z.looseObject({
|
|
10
|
-
type: z.literal('assistant'),
|
|
11
|
-
message: CLAUDE_MESSAGE_SCHEMA,
|
|
12
|
-
})
|
|
13
9
|
const USAGE_SCHEMA = z.looseObject({
|
|
14
10
|
input_tokens: z.number().optional(),
|
|
15
11
|
cached_input_tokens: z.number().optional(),
|
|
@@ -58,12 +54,16 @@ function usable_text(value: unknown): string | undefined {
|
|
|
58
54
|
return typeof value === 'string' && value.trim() !== '' ? value : undefined
|
|
59
55
|
}
|
|
60
56
|
|
|
61
|
-
function claude_progress(
|
|
62
|
-
return
|
|
63
|
-
.
|
|
64
|
-
.filter((
|
|
65
|
-
.map((
|
|
66
|
-
.findLast((text) => text
|
|
57
|
+
function claude_progress(record: TranscriptRecord): string | undefined {
|
|
58
|
+
return transcript_record
|
|
59
|
+
.blocks_of(record)
|
|
60
|
+
.filter((block) => block.type === transcript_record.TEXT_TYPE)
|
|
61
|
+
.map((block) => usable_text(block.text))
|
|
62
|
+
.findLast((text) => text !== undefined)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function is_claude_assistant(record: TranscriptRecord | undefined): record is TranscriptRecord {
|
|
66
|
+
return record?.type === ASSISTANT_TYPE && record.message !== undefined && record.message !== null
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
function claude_result(value: unknown, state: AgentEventState): AgentEventState | undefined {
|
|
@@ -80,9 +80,9 @@ function claude_result(value: unknown, state: AgentEventState): AgentEventState
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
function claude_assistant(value: unknown, state: AgentEventState): AgentEventState | undefined {
|
|
83
|
-
const
|
|
84
|
-
if (!
|
|
85
|
-
const progress = claude_progress(
|
|
83
|
+
const record = transcript_record.read(value)
|
|
84
|
+
if (!is_claude_assistant(record)) return undefined
|
|
85
|
+
const progress = claude_progress(record) ?? state.progress
|
|
86
86
|
|
|
87
87
|
return { ...state, provider: 'anthropic', progress }
|
|
88
88
|
}
|
|
@@ -42,6 +42,18 @@ function is_mid_turn(transcript: string): boolean {
|
|
|
42
42
|
return TURN_TYPES.has(last)
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
// Whether the transcript's last line is its exit record. A log appended across launches keeps an
|
|
46
|
+
// earlier session's record, so a later session that died before finishing — inside a turn, or on a
|
|
47
|
+
// start-up error that is not JSON — leaves something else last and its own ending unread.
|
|
48
|
+
function ends_on_exit_record(transcript: string): boolean {
|
|
49
|
+
const last = transcript.split('\n').findLast((line) => line.trim() !== '')
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
last !== undefined &&
|
|
53
|
+
claude_result_event.decode(json_value.parse_or_undefined(last)) !== undefined
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const agent_exit_record = { ends_on_exit_record, is_mid_turn, read_exit_record }
|
|
46
58
|
|
|
47
59
|
export { agent_exit_record }
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { agent_session_environment } from '#scripts/josh/agent-session-environment'
|
|
2
2
|
import { z } from 'zod'
|
|
3
|
+
import { agent_safe_text } from './agent-safe-text'
|
|
3
4
|
|
|
4
|
-
const FIRST_PRINTABLE_CODE = 0x20
|
|
5
|
-
const DELETE_CODE = 0x7f
|
|
6
|
-
const FIRST_CODE_POINT = 0
|
|
7
5
|
const EMPTY_LENGTH = 0
|
|
8
|
-
const MAX_VALUE_LENGTH = 4096
|
|
9
6
|
|
|
10
7
|
const ROLE_SCHEMA = z.enum(['scheduler', 'worker', 'reviewer'])
|
|
11
8
|
const PROVIDER_SCHEMA = z.enum(['anthropic', 'openai'])
|
|
@@ -32,6 +29,18 @@ type ProfileResult = { kind: 'profile'; profile: AgentProfile } | { kind: 'rejec
|
|
|
32
29
|
type Rejected = Extract<ProfileResult, { kind: 'rejected' }>
|
|
33
30
|
type EffortResult = Rejected | { kind: 'effort'; effort: AgentEffort }
|
|
34
31
|
type ProviderResult = Rejected | { kind: 'provider'; provider: AgentProvider; is_default?: true }
|
|
32
|
+
type OverrideField = 'model' | 'effort'
|
|
33
|
+
|
|
34
|
+
interface Override {
|
|
35
|
+
key: string
|
|
36
|
+
value: string | undefined
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// What a resolution is keyed on beyond the role: the run phase (effort) and the review round (profile).
|
|
40
|
+
interface AgentStage {
|
|
41
|
+
phase?: string | undefined
|
|
42
|
+
round?: number
|
|
43
|
+
}
|
|
35
44
|
|
|
36
45
|
const SCHEDULER: AgentRole = 'scheduler'
|
|
37
46
|
const WORKER: AgentRole = 'worker'
|
|
@@ -72,6 +81,22 @@ const OPENAI_PROFILES: Readonly<Record<AgentRole, AgentProfile>> = {
|
|
|
72
81
|
|
|
73
82
|
const PROVIDER_PROFILES = { anthropic: DEFAULT_PROFILES, openai: OPENAI_PROFILES }
|
|
74
83
|
|
|
84
|
+
// **The verification pass resolves a profile of its own** (joshuafolkken/kit#3926). A round after the
|
|
85
|
+
// first only checks that the first round's findings were fixed, so its model and effort are set apart:
|
|
86
|
+
// its own keys win, then the reviewer's, then its own default.
|
|
87
|
+
const FIRST_REVIEW_ROUND = 1
|
|
88
|
+
// Sonnet holds the verification pass by the eval criterion: on every `verification-fix-*` scenario its
|
|
89
|
+
// pass/fail equals Opus's (100% agreement), and Opus passes all 4.
|
|
90
|
+
const VERIFICATION_MODEL = 'claude-sonnet-5-5'
|
|
91
|
+
const VERIFICATION_PROFILES: Readonly<Record<AgentProvider, AgentProfile>> = {
|
|
92
|
+
anthropic: { ...DEFAULT_PROFILES.reviewer, model: VERIFICATION_MODEL },
|
|
93
|
+
openai: OPENAI_PROFILES.reviewer,
|
|
94
|
+
}
|
|
95
|
+
const VERIFICATION_KEYS = {
|
|
96
|
+
model: 'JOSH_REVIEWER_VERIFICATION_MODEL',
|
|
97
|
+
effort: 'JOSH_REVIEWER_VERIFICATION_EFFORT',
|
|
98
|
+
}
|
|
99
|
+
|
|
75
100
|
// **Effort as a function of the run phase, not the role alone**. For the first
|
|
76
101
|
// merge only the mechanical ship/bookkeeping region is lowered: the pre-gate resume drives the gate,
|
|
77
102
|
// commit, PR and merge, applying fixes the gate has already named — work delegation.md calls the opposite
|
|
@@ -93,19 +118,7 @@ const ENV_KEYS: Readonly<Record<AgentRole, { model: string; effort: string }>> =
|
|
|
93
118
|
|
|
94
119
|
const LEGACY_WORKER_KEYS = { model: 'JOSH_LANE_MODEL', effort: 'JOSH_LANE_EFFORT' }
|
|
95
120
|
|
|
96
|
-
|
|
97
|
-
const code = character.codePointAt(FIRST_CODE_POINT) ?? FIRST_PRINTABLE_CODE
|
|
98
|
-
|
|
99
|
-
return code < FIRST_PRINTABLE_CODE || code === DELETE_CODE
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function is_safe_value(value: string): boolean {
|
|
103
|
-
if (value.length === EMPTY_LENGTH || value.length > MAX_VALUE_LENGTH) return false
|
|
104
|
-
|
|
105
|
-
for (const character of value) if (is_control_character(character)) return false
|
|
106
|
-
|
|
107
|
-
return true
|
|
108
|
-
}
|
|
121
|
+
const { MAX_VALUE_LENGTH, is_safe_prompt, is_safe_value, printable } = agent_safe_text
|
|
109
122
|
|
|
110
123
|
function trimmed(value: string | undefined): string | undefined {
|
|
111
124
|
const result = value?.trim()
|
|
@@ -113,44 +126,53 @@ function trimmed(value: string | undefined): string | undefined {
|
|
|
113
126
|
return result === undefined || result.length === EMPTY_LENGTH ? undefined : result
|
|
114
127
|
}
|
|
115
128
|
|
|
116
|
-
function
|
|
129
|
+
function is_verification(role: AgentRole, round: number | undefined): boolean {
|
|
130
|
+
return role === REVIEWER && round !== undefined && round > FIRST_REVIEW_ROUND
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// The keys an override is read from, first match wins: a worker falls back to its legacy lane keys, and
|
|
134
|
+
// a verification round reads its own keys ahead of the reviewer's.
|
|
135
|
+
function override_keys(
|
|
117
136
|
role: AgentRole,
|
|
118
|
-
field:
|
|
119
|
-
|
|
120
|
-
):
|
|
137
|
+
field: OverrideField,
|
|
138
|
+
round: number | undefined,
|
|
139
|
+
): readonly [string, ...Array<string>] {
|
|
121
140
|
const key = ENV_KEYS[role][field]
|
|
122
|
-
|
|
123
|
-
if (value !== undefined) return { key, value }
|
|
124
|
-
if (role !== WORKER) return { key, value: undefined }
|
|
141
|
+
if (role === WORKER) return [key, LEGACY_WORKER_KEYS[field]]
|
|
125
142
|
|
|
126
|
-
|
|
127
|
-
|
|
143
|
+
return is_verification(role, round) ? [VERIFICATION_KEYS[field], key] : [key]
|
|
144
|
+
}
|
|
128
145
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
146
|
+
function override_value(
|
|
147
|
+
role: AgentRole,
|
|
148
|
+
field: OverrideField,
|
|
149
|
+
environment: AgentEnvironment,
|
|
150
|
+
round?: number,
|
|
151
|
+
): Override {
|
|
152
|
+
const keys = override_keys(role, field, round)
|
|
153
|
+
const key = keys.find((candidate) => trimmed(environment[candidate]) !== undefined)
|
|
154
|
+
|
|
155
|
+
return key === undefined
|
|
156
|
+
? { key: keys[0], value: undefined }
|
|
157
|
+
: { key, value: trimmed(environment[key]) }
|
|
132
158
|
}
|
|
133
159
|
|
|
134
160
|
function model_override(
|
|
135
161
|
role: AgentRole,
|
|
136
162
|
environment: AgentEnvironment,
|
|
137
163
|
provider: AgentProvider,
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
164
|
+
round: number | undefined,
|
|
165
|
+
): Override {
|
|
141
166
|
return provider === OPENAI_PROVIDER
|
|
142
|
-
? { key, value: undefined }
|
|
143
|
-
: override_value(role, 'model', environment)
|
|
167
|
+
? { key: ENV_KEYS[role].model, value: undefined }
|
|
168
|
+
: override_value(role, 'model', environment, round)
|
|
144
169
|
}
|
|
145
170
|
|
|
146
171
|
function rejection(key: string, value: string, expected: string): Rejected {
|
|
147
172
|
return { kind: 'rejected', note: `${key}=${value} ${expected}, so the agent was not started` }
|
|
148
173
|
}
|
|
149
174
|
|
|
150
|
-
function resolved_effort(
|
|
151
|
-
override: { key: string; value: string | undefined },
|
|
152
|
-
fallback: AgentEffort,
|
|
153
|
-
): EffortResult {
|
|
175
|
+
function resolved_effort(override: Override, fallback: AgentEffort): EffortResult {
|
|
154
176
|
const parsed = EFFORT_SCHEMA.safeParse(override.value ?? fallback)
|
|
155
177
|
|
|
156
178
|
return parsed.success
|
|
@@ -290,17 +312,27 @@ function with_phase_effort(
|
|
|
290
312
|
return { ...profile, effort: overridden_effort(profile, phase, environment) }
|
|
291
313
|
}
|
|
292
314
|
|
|
293
|
-
function
|
|
315
|
+
function stage_defaults(
|
|
316
|
+
provider: AgentProvider,
|
|
294
317
|
role: AgentRole,
|
|
295
|
-
|
|
296
|
-
|
|
318
|
+
round: number | undefined,
|
|
319
|
+
): AgentProfile {
|
|
320
|
+
return is_verification(role, round)
|
|
321
|
+
? VERIFICATION_PROFILES[provider]
|
|
322
|
+
: PROVIDER_PROFILES[provider][role]
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function resolve_stage(
|
|
326
|
+
role: AgentRole,
|
|
327
|
+
environment: AgentEnvironment,
|
|
328
|
+
stage: AgentStage,
|
|
297
329
|
): ProfileResult {
|
|
298
330
|
const selected = resolve_provider(environment)
|
|
299
331
|
if (selected.kind === 'rejected') return selected
|
|
300
|
-
const defaults =
|
|
301
|
-
const model = model_override(role, environment, selected.provider)
|
|
302
|
-
const effort = override_value(role, 'effort', environment)
|
|
303
|
-
const resolved = resolved_effort(effort, phase_effort(role, phase, defaults.effort))
|
|
332
|
+
const defaults = stage_defaults(selected.provider, role, stage.round)
|
|
333
|
+
const model = model_override(role, environment, selected.provider, stage.round)
|
|
334
|
+
const effort = override_value(role, 'effort', environment, stage.round)
|
|
335
|
+
const resolved = resolved_effort(effort, phase_effort(role, stage.phase, defaults.effort))
|
|
304
336
|
|
|
305
337
|
if (resolved.kind === 'rejected') return resolved
|
|
306
338
|
|
|
@@ -314,10 +346,29 @@ function resolve(
|
|
|
314
346
|
return validate(profile, model.key)
|
|
315
347
|
}
|
|
316
348
|
|
|
349
|
+
function resolve(
|
|
350
|
+
role: AgentRole,
|
|
351
|
+
environment: AgentEnvironment = process.env,
|
|
352
|
+
phase?: string,
|
|
353
|
+
): ProfileResult {
|
|
354
|
+
return resolve_stage(role, environment, { phase })
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// The reviewer for one review round: round 1 as `resolve(REVIEWER)` does, any later round the
|
|
358
|
+
// verification pass's own profile.
|
|
359
|
+
function resolve_review(round: number, environment: AgentEnvironment = process.env): ProfileResult {
|
|
360
|
+
return resolve_stage(REVIEWER, environment, { round })
|
|
361
|
+
}
|
|
362
|
+
|
|
317
363
|
function describe(profile: AgentProfile): string {
|
|
318
364
|
return `provider=${profile.provider} role=${profile.role} model=${profile.model} effort=${profile.effort}`
|
|
319
365
|
}
|
|
320
366
|
|
|
367
|
+
// The run-log line a review launch writes, so each round's model is on record beside its round.
|
|
368
|
+
function describe_review(round: number, profile: AgentProfile): string {
|
|
369
|
+
return `review round ${String(round)} · ${describe(profile)}`
|
|
370
|
+
}
|
|
371
|
+
|
|
321
372
|
function parse(value: unknown): AgentProfile | undefined {
|
|
322
373
|
const parsed = PROFILE_SCHEMA.safeParse(value)
|
|
323
374
|
|
|
@@ -335,15 +386,20 @@ const agent_role_profile = {
|
|
|
335
386
|
PROFILE_SCHEMA,
|
|
336
387
|
REVIEWER,
|
|
337
388
|
SCHEDULER,
|
|
389
|
+
VERIFICATION_PROFILES,
|
|
338
390
|
WORKER,
|
|
339
391
|
default_notice,
|
|
340
392
|
describe,
|
|
393
|
+
describe_review,
|
|
341
394
|
handoff_environment,
|
|
342
395
|
has_completion_callback,
|
|
396
|
+
is_safe_prompt,
|
|
343
397
|
is_safe_value,
|
|
344
398
|
parse,
|
|
399
|
+
printable,
|
|
345
400
|
resolve,
|
|
346
401
|
resolve_provider,
|
|
402
|
+
resolve_review,
|
|
347
403
|
warn_of_default,
|
|
348
404
|
with_phase_effort,
|
|
349
405
|
}
|