@joshuafolkken/kit 1.1784.0 → 1.2114.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/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/workflow-commands/SKILL.md +6 -6
- package/.claude/skills/workflow-commands/background-commands.md +8 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +41 -32
- package/.claude/skills/workflow-commands/delegation.md +6 -6
- package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +7 -5
- package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +9 -4
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/kickoff.md +2 -2
- package/.claude/skills/workflow-commands/observation-filing.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
- package/.claude/skills/workflow-commands/prerequisite.md +3 -2
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +7 -5
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-pnpm/action.yml +9 -16
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +155 -15
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +59 -45
- package/.vscode/settings.json +19 -0
- package/CLAUDE.md +5 -12
- package/SECURITY.md +2 -2
- package/dist/CLAUDE.md +5 -12
- package/dist/commands/document-read-cli.js +2 -1
- package/dist/commands/document-section-main.js +2 -1
- package/dist/commands/read-set-cli.js +194 -134
- package/dist/commands/run-prep-main.js +9694 -10173
- package/dist/commands/run-step-cli.js +22138 -18285
- package/dist/hooks/audit-provision.js +23 -5
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
- package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
- package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
- package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +8 -8
- package/dist/hooks/format-edited.js +4 -5
- package/dist/hooks/inputs.json +415 -389
- package/dist/hooks/pretool-guard.js +7 -6
- package/dist/hooks/session-lang.js +101 -258
- package/dist/hooks/stop-guard.js +1744 -2576
- package/dist/josh.js +7133 -6368
- package/dist/version/index.js +161 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/package.json +15 -8
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +14 -11
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +40 -21
- package/prompts/collaboration-workflow/lane-instructions.md +3 -1
- package/prompts/collaboration-workflow/measurement.md +8 -1
- package/prompts/collaboration-workflow/operating-rules.md +11 -2
- package/prompts/collaboration-workflow/output-bounds.md +6 -2
- package/prompts/collaboration-workflow/plan-comment.md +1 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +3 -1
- package/prompts/review-rubric.md +8 -0
- package/prompts/review.md +31 -22
- package/prompts/testing-guide.md +1 -0
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +20 -9
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +6 -1
- package/scripts/backlog/backlog-drive-hold.ts +3 -3
- package/scripts/backlog/backlog-drive-idle.ts +10 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
- package/scripts/backlog/backlog-drive-named.ts +28 -7
- package/scripts/backlog/backlog-drive-paused.ts +5 -4
- package/scripts/backlog/backlog-drive-restore.ts +11 -3
- package/scripts/backlog/backlog-drive.ts +21 -60
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next.ts +39 -49
- package/scripts/backlog/backlog-occupied.ts +2 -2
- package/scripts/backlog/backlog-overlap.ts +42 -8
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +19 -6
- package/scripts/backlog/backlog-pool.ts +50 -12
- package/scripts/backlog/backlog-rank.ts +60 -13
- package/scripts/backlog/backlog-stalled-detect.ts +2 -1
- package/scripts/backlog/backlog-waves.ts +17 -2
- package/scripts/backlog/backlogrun-launch.ts +7 -4
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-cli.ts +37 -16
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +2 -2
- package/scripts/delegation/duplicate-read-guard.ts +1 -0
- package/scripts/delegation/investigation-guard.ts +14 -2
- package/scripts/delegation/investigation-reads.ts +45 -23
- package/scripts/dependabot/dependabot-cooldown.ts +3 -2
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +17 -7
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-cli-argv.ts +2 -2
- package/scripts/epic/epic-fetch.ts +4 -2
- package/scripts/epic/epic-graph.ts +7 -2
- package/scripts/epic/epic-issue.ts +3 -1
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +13 -10
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +41 -11
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
- package/scripts/followup/git-pr-followup.ts +62 -27
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
- package/scripts/gate/busy-average.ts +34 -2
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/command-memory.ts +1 -1
- package/scripts/gate/core-admission.ts +24 -6
- package/scripts/gate/core-budget-timing.ts +20 -6
- package/scripts/gate/core-budget.ts +40 -11
- package/scripts/gate/core-wait-record.ts +3 -2
- package/scripts/gate/core-wait.ts +25 -2
- package/scripts/gate/core-weights.ts +15 -7
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +14 -6
- package/scripts/gate/gate-plan.ts +103 -58
- package/scripts/gate/gate-report.ts +9 -7
- package/scripts/gate/gate-run-steps.ts +26 -3
- package/scripts/gate/gate-skip.ts +45 -6
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +2 -1
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/scoped-green.ts +68 -15
- package/scripts/gate/since-green.ts +14 -6
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/verification-gate.ts +51 -16
- package/scripts/gate/verification-inputs.ts +21 -6
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +23 -2
- package/scripts/gh/git-ai-review-scan.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +12 -3
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +4 -2
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +8 -2
- package/scripts/gh/git-gh-issue.ts +12 -5
- package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +3 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +21 -7
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +3 -0
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/git/base-tree.ts +30 -0
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +16 -1
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +66 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-schemas.ts +13 -0
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +53 -5
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +11 -2
- package/scripts/git/stash/stash-push-cli.ts +10 -0
- package/scripts/hooks/batch-guard.ts +40 -21
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +22 -2
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +14 -1
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +76 -10
- package/scripts/hooks/pretool-guard.ts +2 -0
- package/scripts/hooks/reserved-run.ts +14 -1
- package/scripts/hooks/run-hook.sh +23 -8
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +3 -15
- package/scripts/hooks/stop-guard.ts +7 -6
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +5 -1
- package/scripts/init/hook-launch.ts +4 -2
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-line.ts +19 -1
- package/scripts/issue/defect-rate-cli.ts +5 -102
- package/scripts/issue/defect-report.ts +4 -4
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +64 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-body-or-comment.ts +38 -4
- package/scripts/issue/issue-cite-cli.ts +1 -3
- package/scripts/issue/issue-classification.ts +1 -0
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-evidence-exit.ts +4 -2
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +111 -38
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +43 -6
- package/scripts/issue/issue-labels.ts +19 -2
- package/scripts/issue/issue-lint-cli.ts +27 -2
- package/scripts/issue/issue-measured-cli.ts +13 -35
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-not-before-label.ts +2 -2
- package/scripts/issue/issue-not-before.ts +4 -1
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +174 -43
- package/scripts/issue/issue-rank.ts +21 -4
- package/scripts/issue/issue-read-cli.ts +32 -6
- package/scripts/issue/issue-read.ts +37 -12
- package/scripts/issue/issue-sample-gate.ts +95 -74
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +12 -11
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +31 -1
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -12
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -70
- package/scripts/issue/plan-consumers-section.ts +22 -1
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/command-usage.ts +3 -2
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -82
- package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
- package/scripts/josh/josh-commands-ai.ts +5 -5
- package/scripts/josh/josh-commands-development.ts +59 -58
- package/scripts/josh/josh-commands-issue-write.ts +23 -4
- package/scripts/josh/josh-commands-issue.ts +32 -0
- package/scripts/josh/josh-commands-lane.ts +87 -4
- package/scripts/josh/josh-commands-lint.ts +16 -3
- package/scripts/josh/josh-commands-maintenance.ts +15 -0
- package/scripts/josh/josh-commands-review.ts +41 -6
- package/scripts/josh/josh-commands-ship.ts +56 -8
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +5 -3
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/stamp-file.ts +11 -2
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +5 -8
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-check-stats.ts +29 -8
- package/scripts/lane/lane-child-invocation.ts +9 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-close.ts +8 -3
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +2 -2
- package/scripts/lane/lane-gap-stats.ts +7 -6
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +119 -36
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +31 -177
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +176 -59
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +16 -7
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +4 -1
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-registry.ts +14 -1
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-sampler.ts +23 -4
- package/scripts/lane/lane-session-action.ts +93 -18
- package/scripts/lane/lane-session-broker.ts +49 -21
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-spent.ts +1 -1
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +13 -1
- package/scripts/lane/lane-state.ts +41 -9
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +21 -5
- package/scripts/lane/lane-stop-stats.ts +51 -19
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-transcript-calls.ts +67 -10
- package/scripts/lane/lane-transcript-stats.ts +44 -12
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +108 -31
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +45 -6
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/import-graph.ts +141 -11
- package/scripts/lint/lint-gate-scope.ts +2 -2
- package/scripts/lint/lint-parallel.ts +54 -6
- package/scripts/lint/lint-related.ts +154 -33
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/telegram-notify.ts +12 -3
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush.ts +32 -9
- package/scripts/overrides/overrides-check.ts +9 -1
- package/scripts/release/release-approval-prune.ts +7 -1
- package/scripts/repo/required-checks-logic.ts +4 -1
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +15 -1
- package/scripts/report/report-labels.ts +12 -1
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +26 -7
- package/scripts/report/report-lint.ts +2 -20
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +68 -19
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +14 -7
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +85 -22
- package/scripts/review/review-finding-ledger.ts +109 -7
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +11 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +4 -2
- package/scripts/review/review-record-cli.ts +177 -54
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +91 -29
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +24 -8
- package/scripts/review/review-stamps.ts +7 -3
- package/scripts/review/review-stop-log.ts +20 -6
- package/scripts/review/review-stops-cli.ts +2 -1
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/rules/agent-model.ts +1 -1
- package/scripts/rules/bash-triggers.ts +3 -3
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle.ts +1 -1
- package/scripts/rules/delivered-rules.ts +36 -17
- package/scripts/rules/destructive-command.ts +3 -11
- package/scripts/rules/direct-issue-comment.ts +34 -12
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +4 -24
- package/scripts/rules/early-heartbeat.ts +2 -0
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/guard-remedy.ts +14 -5
- package/scripts/rules/implementation-cut.ts +61 -28
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +9 -4
- package/scripts/rules/josh-git-bare.ts +1 -1
- package/scripts/rules/lane-background.ts +41 -13
- package/scripts/rules/lane-direct-tool.ts +107 -9
- package/scripts/rules/lane-interactive-ask.ts +4 -1
- package/scripts/rules/lane-park.ts +4 -2
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +1 -1
- package/scripts/rules/lane-switch-main.ts +4 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/permission-guards.ts +5 -1
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +67 -17
- package/scripts/rules/poll-loop.ts +72 -9
- package/scripts/rules/pr-merge.ts +5 -5
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +88 -24
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +5 -15
- package/scripts/rules/rule-value-cache.ts +53 -5
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +59 -11
- package/scripts/rules/rule-value.ts +17 -4
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +10 -2
- package/scripts/rules/stop-rule-rows.ts +1 -13
- package/scripts/rules/stop-rules.ts +33 -58
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +110 -23
- package/scripts/rules/timed-rerun.ts +1 -1
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +22 -7
- package/scripts/run/board/run-board-ending-reason.ts +6 -2
- package/scripts/run/board/run-board-fit.ts +24 -1
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-header.ts +8 -0
- package/scripts/run/board/run-board-labels.ts +11 -1
- package/scripts/run/board/run-board-lane-time.ts +1 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-notes.ts +7 -1
- package/scripts/run/board/run-board-operation.ts +4 -2
- package/scripts/run/board/run-board-phase.ts +2 -5
- package/scripts/run/board/run-board-plan.ts +1 -1
- package/scripts/run/board/run-board-read.ts +46 -1
- package/scripts/run/board/run-board-reason.ts +20 -8
- package/scripts/run/board/run-board-render-checks.ts +3 -2
- package/scripts/run/board/run-board-render-drawn.ts +11 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-lead.ts +9 -0
- package/scripts/run/board/run-board-render-legend.ts +19 -0
- package/scripts/run/board/run-board-render-tail.ts +1 -1
- package/scripts/run/board/run-board-render.ts +82 -18
- package/scripts/run/board/run-board-spin.ts +1 -3
- package/scripts/run/board/run-board-status.ts +2 -0
- package/scripts/run/board/run-board-tick.ts +39 -10
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +3 -2
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +52 -8
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-filed.ts +9 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +4 -0
- package/scripts/run/event/run-event-stream.ts +25 -3
- package/scripts/run/hold/run-stop-notify.ts +3 -8
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +66 -23
- package/scripts/run/merge/run-merge-outcome.ts +2 -0
- package/scripts/run/merge/run-merge-ship.ts +13 -3
- package/scripts/run/merge/run-merge-signals.ts +40 -23
- package/scripts/run/merge/run-merge-steps.ts +56 -36
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +41 -14
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +26 -6
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-prep.ts +1 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +5 -2
- package/scripts/run/ship/run-ship-args.ts +19 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +131 -39
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +10 -4
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +27 -26
- package/scripts/run/ship/run-ship-overlap.ts +8 -3
- package/scripts/run/ship/run-ship-place.ts +9 -2
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
- package/scripts/run/ship/run-ship-preflight.ts +16 -4
- package/scripts/run/ship/run-ship-probe.ts +23 -9
- package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-return.ts +103 -29
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +230 -59
- package/scripts/run/ship/run-ship-review.ts +171 -51
- package/scripts/run/ship/run-ship-reviewer.ts +138 -42
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +49 -13
- package/scripts/run/ship/run-ship-steps.ts +24 -4
- package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-sync.ts +171 -30
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +16 -2
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +6 -113
- package/scripts/run/wake/run-wake-code.ts +53 -11
- package/scripts/run/wake/run-wake-driver.ts +5 -3
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +5 -3
- package/scripts/run/wake/run-wake-ports.ts +11 -3
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake.ts +3 -2
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/project-config.ts +3 -2
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-provision-main.ts +9 -1
- package/scripts/security/security-audit-provision.ts +1 -1
- package/scripts/security/security-audit.ts +21 -1
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/split/split-assess.ts +12 -3
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +20 -2
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +208 -20
- package/scripts/test/test-pinned-main.ts +84 -18
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +258 -47
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +35 -11
- package/scripts/test/test-read-recording.ts +17 -5
- package/scripts/test/test-read-trace.ts +26 -8
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red.ts +34 -14
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +4 -1
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +43 -23
- package/scripts/test/test-related-scope.ts +99 -34
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +167 -83
- package/scripts/test/test-unit-guard.ts +28 -5
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-worker-share.ts +5 -4
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +12 -1
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +36 -5
- package/scripts/time-runtime/time-markers.ts +2 -2
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +17 -5
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/latest-corepack.ts +2 -0
- package/templates/gitignore +2 -0
- package/templates/workflows/ci.yml +41 -0
- package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
- package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
- package/dist/hooks/chunk-TUIFS5E7.js +0 -72
- package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/rules/filing-cap.ts +0 -139
|
@@ -11,9 +11,18 @@
|
|
|
11
11
|
- 修正できたら修正内容を、できなかったら失敗チェック名・原因・未解決である旨を `--notify-message` に書く。**完了コメントに失敗を隠してはならない**
|
|
12
12
|
- ユーザーへの報告でも失敗を「成功」として扱わない
|
|
13
13
|
|
|
14
|
+
### git-rules — コミット・共有状態・index・PR
|
|
15
|
+
|
|
16
|
+
`CLAUDE.md` → "Git Rules" の本文。フックが拒否・書き換えする(`pnpm josh rule:list` の `josh-git-bare`・`direct-pr-create`・`pr-merge` 行と `.claude/settings.json` の deny)。
|
|
17
|
+
|
|
18
|
+
- **コミットは指示されたときだけ。** マージ・ブランチ削除・force push などの共有状態の変更は、そのターンで指示されたときだけ。例外は `fullrun` / `backlogrun` の起動で、`pnpm josh followup` 経由のマージを認める(`prrun` は認めない)。deny は規則より狭い — ツールが通したことを許可と読まない
|
|
19
|
+
- **git index は自分の判断で変えない** — 明示の指示か `pnpm josh git` 経由だけ(下記 "no-self-staging")
|
|
20
|
+
- **コミットは `pnpm josh git`、PR は `pnpm josh pr`** — `gh pr create` の直接実行は `direct-pr-create` 行が拒否する。GitHub 操作は `gh api`(REST) — [`gh-rest.md`](./gh-rest.md)
|
|
21
|
+
- **作業ツリーの前提で動く前に `git status`(と `git stash list`)をその場で実行する**
|
|
22
|
+
|
|
14
23
|
### 指示されていない行動は取らない
|
|
15
24
|
|
|
16
|
-
|
|
25
|
+
上記 "git-rules" の細則。対象には共有ブランチへの push・外部通知の追加送信・リポジトリ設定の変更も含む。
|
|
17
26
|
|
|
18
27
|
- auto-merge の本文は [`followup.md`](../../.claude/skills/workflow-commands/followup.md)、`backlogrun` の子への継承は [`backlogrun-child.md`](../../.claude/skills/workflow-commands/backlogrun-child.md)
|
|
19
28
|
- `kickoff` / `pnpm josh followup` 単独実行は文書化されたスコープで終了する。PR が OPEN のまま完了したら状態を報告して停止する
|
|
@@ -23,7 +32,7 @@
|
|
|
23
32
|
|
|
24
33
|
### no-self-staging — git index を勝手に変更しない(自律 staging の禁止)
|
|
25
34
|
|
|
26
|
-
|
|
35
|
+
上記 "git-rules" の細則。index には履歴がなく、上書きされたステージ状態は復元できない。
|
|
27
36
|
|
|
28
37
|
- **調査目的の staging はしない。** 読み取り専用コマンドを使う: `git status --short`、`git diff` / `git diff --stat` / `git diff HEAD`、`git diff --staged`、未追跡ファイルは `git diff --no-index /dev/null <new-file>` か直接読む
|
|
29
38
|
- staging してよいのは次の 2 ケースだけ。それ以外は実行せずに確認する:
|
|
@@ -17,19 +17,23 @@
|
|
|
17
17
|
- ファイルは範囲を指定する(`sed -n '120,180p' <file>`、または `Read` の `offset` / `limit`)
|
|
18
18
|
- 一覧は件数を絞る(`--limit`、`| head -30`)、JSON は必要な項目だけ取り出す(`gh api … --jq '…'`)
|
|
19
19
|
- 全量が要るときは、ファイルへ落として(`> <file>`)から範囲を読む
|
|
20
|
+
- 退避された `tool-results/<id>.txt` → `grep -n` / `sed -n` で読む(`lane-spilled-read` 行、`pnpm josh rule:list`)
|
|
20
21
|
|
|
21
22
|
## 切り詰められた出力を、完全な出力として読まない
|
|
22
23
|
|
|
23
24
|
**検証ゲートと差分は、切り詰められた結果で判断しない。**
|
|
24
25
|
|
|
25
|
-
- `
|
|
26
|
+
- 検証コマンド(`gate` / `check:related` / `lint:related` / `test:related`)の末尾を読む → 失敗と次のコマンド、`full output: <path>`(`lint:related` には無い)、最終行の合否の順(`scripts/gate/verification-tail.ts`)。内訳が切れたら `full output:` のファイルを読む(joshuafolkken/kit#1227)
|
|
27
|
+
- `pnpm josh test:related` / `test:unit` が失敗した → 最後の `failed tests:` 一覧と `full output: <path>` を読む。読むための再実行はしない。直したら、まず要約の `rerun failed:` 行で失敗したファイルだけを回し、関連集合の全体は最後の `check:related` で 1 回だけ回す(`scripts/test/vitest-failure-summary.ts`)
|
|
26
28
|
- 差分には判定行が無い。差分はファイルへ落としてから範囲で読む(`git diff main...HEAD > /tmp/diff.patch && wc -l /tmp/diff.patch`)
|
|
27
29
|
|
|
28
30
|
## 検証コマンドをパイプに繋がない(joshuafolkken/kit#1556)
|
|
29
31
|
|
|
30
32
|
**パイプラインの終了コードは最後のコマンドのものである。** `pnpm josh gate 2>&1 | tail -40` は赤いゲートを成功として返す。**これは `josh gate` の欠陥ではない。** **既定はパイプなしで実行する。** 避けられないなら `set -o pipefail` を前置する。どの形でも、印字された判定行を読む。`piped-verification` 行(`rule-delivery.md`)が強制する。
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
境界は判定が残るかどうか: 入力を最後まで読むフィルタ(`tail` / `grep` / `cut` / `sort` / `uniq` / `wc` / `tee`、`exit` も外部コマンドも `<`・`>`・`&`(比較を含む)も使わない `awk`、`p`・`d`・`s///` だけの `sed`)だけのパイプは `;` 鎖の中でも `pipefail` 付きに書き換えて通り、`head`・先頭一致で止まる `grep`・`2>/dev/null` などのリダイレクトを伴う形は拒否される(`scripts/rules/piped-verification.ts`)。
|
|
35
|
+
|
|
36
|
+
対象は結果が合否を意味するコマンドだけ — `gate` / `check*` / `lint*` / `cspell*` / `test*` / `eval`。**`git log | head` や `gh issue list | head` は対象外であり、意図的にそうしている。** `latest:scope` / `review:brief` も、判定ではなく答えを印字するので `$(...)` で受けてよい。
|
|
33
37
|
|
|
34
38
|
## 検査
|
|
35
39
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
## Step 3: 計画コメントを記録して通知する
|
|
2
2
|
|
|
3
3
|
1. 提案を人間が判断する
|
|
4
|
-
2. 採用した計画をファイルに書き、`pnpm josh issue:plan <N> --body-file <path>` で Issue
|
|
4
|
+
2. 採用した計画をファイルに書き、`pnpm josh issue:plan <N> --body-file <path>` で Issue に記録する。書き込み権限のある作成者の body が空なら本文に、それ以外はコメントになる(本文はパスで渡す — `shell-body.md`)
|
|
5
5
|
- 計画が stash の復元を含むときの書き方: `operating-rules.md` → "no-self-staging"
|
|
6
6
|
- 計画には `### 影響を受ける既存の利用者` が必須(`pnpm josh plan:consumers <識別子...>` が下書きを出す。書き方: `kickoff.md` の手順 4)
|
|
7
7
|
3. Telegram で計画開始を通知する:
|
|
@@ -61,6 +61,15 @@ docs・prompts・skills・拒否文・Issue・PR の文章に適用する。
|
|
|
61
61
|
- 同じ内容を言い換えて繰り返さない
|
|
62
62
|
- ファイルや節が自分自身を説明する文(「このファイルは〜である」)を書かない
|
|
63
63
|
|
|
64
|
+
## concise-reply — 対話の回答は結論・要点・次の一手
|
|
65
|
+
|
|
66
|
+
ユーザーへの回答に適用する。
|
|
67
|
+
|
|
68
|
+
- 順序: 結論(1〜2 文)→ 表か箇条書き 1 つ → 次の一手
|
|
69
|
+
- 散文(コードブロック・表・箇条書きの外)の上限は `scripts/rules/concise-reply.ts` の `PROSE_LIMIT`。超えた回答は Stop フックの `pnpm josh stop:guard` が書き直させる
|
|
70
|
+
- 仕組みの説明や同じ内容の言い換えを並べない。詳細はファイルや Issue に書く
|
|
71
|
+
- 対象外: 直前の発話に「詳しく」「具体的に」「詳細」がある回答、`pnpm josh run:board --chat` のような固定出力をコードブロックで返す回答、ファイルや Issue に書く成果物
|
|
72
|
+
|
|
64
73
|
## consult-vs-execute — 相談と実行を区別する
|
|
65
74
|
|
|
66
75
|
ユーザーが進め方・理由を尋ねたり目標を述べたりした(「どうすべき?」「how should we…」「なぜ」「〜したい」「〜の方が良い?」)ときは、**分析と推奨のみ**を返し、ファイル編集・Issue 作成などのアクションは取らない。目標の表明は計画の依頼であって、実行の承認ではない。
|
|
@@ -35,7 +35,8 @@
|
|
|
35
35
|
### 残すときの書き方と予算
|
|
36
36
|
|
|
37
37
|
- **常駐規則は、トリガと導線の 2 つで書く。** **判定は、導線を一度も開かないターンでも常駐の記述だけで正しく振る舞えるかである。**
|
|
38
|
-
- **削ることは移すことであり、削除は理由を示して初めて許される例外である。**
|
|
39
|
-
-
|
|
38
|
+
- **削ることは移すことであり、削除は理由を示して初めて許される例外である。** 先に導線の先へ移し、マーカーテストも付け替える。写しを移さず引退させてよいのは 3 条件がすべて揃うときだけ — 同じ文書に単一ソースが宣言された文の写しである・単一ソースと突き合わせてほかにない文を含まない・マーカーテストが固定していない。揃わなければ候補と証拠を記録して規則は残す
|
|
39
|
+
- 写しのほかに、`pnpm josh rule:value --fresh` の `candidates:` 節も引退(`retire`)・導線 1 行への縮約(`condense`)の根拠になる。判定は `scripts/rules/rule-value-candidates.ts`。候補ごとに Issue を分け、残すなら理由を記録する
|
|
40
|
+
- 経緯(Issue 番号・なぜ・計測・却下案)は `docs/maintainers/<topic>-rationale.md` に置き、その冒頭で説明する手順文書を名指しする。**参照の向きは根拠 → 手順だけ** — AI が読む文書から根拠文書は指さない(`scripts/document/rationale-documents.test.ts` が検出する)。Issue 番号引用の件数は `scripts/document/issue-citation-budget.ts` のラチェットに従う — 減らしたら記録も下げる
|
|
40
41
|
- 引用は本文があるファイルを直接指す
|
|
41
42
|
- 予算が詰まったら回収で解く。**引き上げは Tier C として扱う** — `RESIDENT_CEILING_BYTES`・`RESIDENT_HEADROOM_BYTES`・`RE_INLINE_GUARD_HEADROOM_BYTES` の緩和は、3 条件(回収の余地が尽きたことを計測で示す・需要が 1 規則ではなく常駐すべき規則数の増加から来る・増やす量は需要と回収可能量の差だけで丸めない)を示し、ユーザーの明示指示を得てから行う。条件が揃うこと自体は指示ではない
|
|
@@ -14,10 +14,22 @@
|
|
|
14
14
|
|
|
15
15
|
一覧は `pnpm josh rule:list` が `scripts/rules/delivered-rules.ts` から生成する(joshuafolkken/kit#3399)。各項目は規則の単一ソース・発火点・発火しないときを持ち、フックが走らないエージェントはその出力を自己適用のチェックリストにする(`principles.md`)。
|
|
16
16
|
|
|
17
|
-
**引き金はシェルのコマンド文字列しか見えない**(node 内の REST
|
|
17
|
+
**引き金はシェルのコマンド文字列しか見えない**(node 内の REST は掛からず、`gh api --input <file>` のファイルの中身を読むのは `credential-body` だけ)ので、常駐側にトリガ 1 行を残す。
|
|
18
18
|
|
|
19
19
|
引き金が発火しないターンでは何も起きないのが仕様で、各項目の発火しない状態は「規則が守られている状態」と一致させる。一致が取れない規則は常駐に残す。
|
|
20
20
|
|
|
21
|
+
## stop-notify — 途中停止の通知(`confirmation`)
|
|
22
|
+
|
|
23
|
+
`CLAUDE.md` → "Mid-workflow stop notification" の本文(`pnpm josh rule:list` の `stop-notify` 行)。保持中のランが判断待ちで止まるとき、Stop フックの `pnpm josh stop:guard` が `confirmation` を送る — 理由を先頭に、末尾は `Recommended: <choice>`。フックが停止を拒否したときだけ自分で送る:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
pnpm josh notify --task-type confirmation --issue-url "<url>" --body=$'<reason>' --recommended "<choice>" --alternative "<other>"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## concise-reply — 回答の長さ
|
|
30
|
+
|
|
31
|
+
`principles.md` → "concise-reply"(`pnpm josh rule:list` の `concise-reply` 行)。散文が上限を超えた回答の Stop で、`pnpm josh stop:guard` が節の本文付きで 1 度だけ書き直させる。
|
|
32
|
+
|
|
21
33
|
## 配送は 1 ラン 1 回
|
|
22
34
|
|
|
23
35
|
配送文はラン 1 回につき 1 度しか出ないので、**「同じ呼び出しをもう一度出せ」と明記する**。例外: 繰り返す行為を止める項目は毎回発火し(joshuafolkken/kit#1570)、前提の行為を求める項目は前提が末尾に現れるまで毎回拒否する(joshuafolkken/kit#2807)— その配送文にはそれぞれ「これは毎回発火する」「前提が末尾に現れるまで拒否する」と明記する。バッチングと調査の 2 ガードは違反が間隔分続けば再び発火する(joshuafolkken/kit#2164)。前提の証拠を読めないときは拒否する。
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
**実行中のリポジトリ自身はこの手順の対象外である。** kit の中で kit のラン機構(`backlog:drive`、`run:wake`、`run:carry`、レーン、分類、カウンタ、ガードなど)の不具合を見つけたら、上流 Issue で停止する代わりに、このリポジトリの割り込みとして次を行う。
|
|
16
16
|
|
|
17
|
-
1. **起票する** — `pnpm josh issue:file "<title>" --body-file <path> --route interrupt --label priority:high`。上限は効かない(`wip-cap.md` →「割り込み起票 — 上限が効かない側」の条件 2)
|
|
17
|
+
1. **起票する** — `pnpm josh issue:file "<title>" --body-file <path> --route interrupt --label priority:high --blocks-finder`。上限は効かない(`wip-cap.md` →「割り込み起票 — 上限が効かない側」の条件 2)
|
|
18
18
|
2. **止まらずに直す** — 壊れた機構を迂回せず、検証ゲートも緩めない。`backlogrun` の中では割り込みを次の子にし、着地後に塞がれていた子へ戻る(プールでは `priority:high` が先頭、epic の下では `wip-cap.md` の手順 3 で挿入、名前指定のランでは `pnpm josh lane:launch <N>` で自分で dispatch)。バッチの外では `wip-cap.md` の手順 4 どおり、打つべき `fullrun #<N>` を報告して止まる
|
|
19
19
|
3. **再開できるなら自分で再開し、動くことを確かめる** — 修正のマージ後、手渡し済み・所有者が死んだ記録・監督プロセスの停止(`warning` Telegram)には `pnpm josh run:wake --start`、`run:carry` の `standing` には `pnpm josh run:carry --resume "<invocation>" --owner "$PPID"` を打つ。`pnpm josh run:wake --list` が監督プロセスを示し、ログに次の子の dispatch が現れることを確かめて報告する
|
|
20
20
|
4. **人に打ち直しを求めるのは再開の手段が無いときだけ** — `mismatch`(別の起動の記録)、別の生きた所有者の `busy`。新しい承認を宣言するのは人だけ
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
1. **現在の作業を退避する**: `pnpm josh stash:push "upstream-interrupt: paused #<N>"`(WIP コミットでも可)
|
|
26
26
|
2. **進行中の Issue に状況を書く**: `pnpm josh issue:comment <N> --body-file <path>` で、stash したこと、中断理由(どの別パッケージのどんな問題か)、新 Issue へのリンク(`## Upstream issues` 見出しの下に `owner/repo#N` 形式、→「起票元へのバックリンク」)
|
|
27
27
|
3. **対象パッケージのリポジトリに Issue を作成する(確認なし)**: `pnpm josh issue:file "<root-cause title>" --body-file <body-file> --route tier-a --repo <owner>/<repo>`(joshuafolkken/kit#1083)。検査・分類ラベル・重複探し・`epic:bundle` はコマンドが行う(`docs/josh-commands-backlog.md` → `josh issue:file`)。根本原因・再現・期待結果を `prompts/collaboration-workflow/issue-template.md` の Step 1 のテンプレで書き、`## Origin` 節に起票元 Issue を `owner/repo#N` 形式で書く
|
|
28
|
-
4. **`confirmation` Telegram を送って停止する**: 上流 Issue の URL と何が止まっているかを書く(→ `
|
|
28
|
+
4. **`confirmation` Telegram を送って停止する**: 上流 Issue の URL と何が止まっているかを書く(→ `rule-delivery.md` → "stop-notify")
|
|
29
29
|
5. **元の作業を再開する**: 上流の修正がマージされた、またはユーザーが先送りを明示判断した後に `pnpm josh stash:pop "upstream-interrupt: paused #<N>"` で復元する(`operating-rules.md` → "no-self-staging")。上流 Issue を割り込みで実装するかもユーザーが決める
|
|
30
30
|
|
|
31
31
|
### first-party の Issue・PR への書き込みは確認不要
|
|
@@ -58,8 +58,10 @@
|
|
|
58
58
|
pnpm josh issue:file "<title>" --body-file <body-file> --route interrupt
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
+
`--blocks-finder` は付けない。発見したランを塞がない割り込みに起票元の `blocked-by` を書くと、偽の依存関係になる。
|
|
62
|
+
|
|
61
63
|
2. 超過している事実と当たった条件の番号を、両方とも本文に 1 行書く(例:「オープン 37 件で起票。3 条件のうち 2(文書化された手順が完了できない)に該当」)。
|
|
62
|
-
3. 次に実行されるものとして挿入する。epic の下なら `pnpm josh epic --add <E> <N>` で**位置を指定せずに**追加する(`<E>` が epic、`<N>` が割り込み)。**`--before` / `--after` を使ってはならない。** それらは `blocked-by` を書き込み、**偽の依存関係**になる。**順序は実行側が持つ** — 先に提示させたいときは行だけを動かす `--order-before <M>` を使う。**epic の下に無いなら挿入先そのものが無い**ので、4
|
|
64
|
+
3. 次に実行されるものとして挿入する。epic の下なら `pnpm josh epic --add <E> <N>` で**位置を指定せずに**追加する(`<E>` が epic、`<N>` が割り込み)。**`--before` / `--after` を使ってはならない。** それらは `blocked-by` を書き込み、**偽の依存関係**になる。**順序は実行側が持つ** — 先に提示させたいときは行だけを動かす `--order-before <M>` を使う。**epic の下に無いなら挿入先そのものが無い**ので、4 だけを行う。`--blocks-finder` の割り込みを追加したら → `pnpm josh epic --reconcile <E>`(`docs/josh-commands-backlog.md` → `josh issue:file` の `--blocks-finder`)。
|
|
63
65
|
4. 着手は既にある承認の内側でのみ、指示を待たずに行う。`backlogrun` の中なら次の子として着手してよい。バッチの外では `CLAUDE.md` →「Explicit invocation required」が効き、起票と挿入まで済ませて打つべきコマンド(`fullrun #<N>`)を報告して止まる。**割り込みは上限の例外であって、明示起動規則の例外ではない。**
|
|
64
66
|
|
|
65
67
|
起票と、実行されるようにするところまでが 1 つのまとまりである — epic の下で追加しなければ `epic:next` は候補に出さない。**epic の外にある割り込みでは、まとまりの後半は 4 の報告そのもの**である。
|
package/prompts/review-rubric.md
CHANGED
|
@@ -88,6 +88,8 @@ For each finding:
|
|
|
88
88
|
- Cite `file_path:line_number`
|
|
89
89
|
- State severity (`high` / `medium` / `low`) by the two tests in "Severity"
|
|
90
90
|
- Explain the concrete problem and the minimal fix
|
|
91
|
+
- On a `high` or `medium`, cite every other site of the same pattern in the change's files and their
|
|
92
|
+
callers as `file_path:line_number`, so one fix pass closes them all
|
|
91
93
|
- On a test-1 finding rated `low`, write `no failure scenario — <what you tried>`
|
|
92
94
|
|
|
93
95
|
A category with no findings needs a proof statement, e.g. `No issues — checked null returns on X,
|
|
@@ -139,6 +141,9 @@ Actively try to break the changed code.
|
|
|
139
141
|
- Impact outside the diff: open the callers of every changed export or signature and verify they still
|
|
140
142
|
hold; flag duplication the change introduces
|
|
141
143
|
- Regressions in existing behavior covered elsewhere
|
|
144
|
+
- Commands the changed prose tells a reader to run, run from a cwd other than the root with absolute,
|
|
145
|
+
relative and empty inputs, in a scratch copy when they write: `prompts/review.md` → "Before round 1
|
|
146
|
+
— the implementer's self-check", question 10
|
|
142
147
|
|
|
143
148
|
**`No issues` requires at least one explicit trace statement.**
|
|
144
149
|
|
|
@@ -204,6 +209,9 @@ concerns"; if nothing is uncertain, trace the logic path that gives that confide
|
|
|
204
209
|
not describe.
|
|
205
210
|
- High findings → must fix before committing
|
|
206
211
|
- Medium findings → must fix before opening the PR
|
|
212
|
+
- A finding wholly covered by an open follow-up this Issue filed (a `先送り: #M <title>` comment on
|
|
213
|
+
it, which `issue:file --found-during <N>` posts) → record it as `low` citing `#M`, never `medium`
|
|
214
|
+
or `high`, so it does not stop the ship
|
|
207
215
|
- Low findings → document in the PR body if skipped
|
|
208
216
|
|
|
209
217
|
If the diff is empty or trivial (e.g. whitespace only), state that and skip the review.
|
package/prompts/review.md
CHANGED
|
@@ -12,9 +12,9 @@ Review policy: the level, the round count, and what happens to a finding after t
|
|
|
12
12
|
## When to run
|
|
13
13
|
|
|
14
14
|
When: `CLAUDE.md` → "Pre-commit Self-Review"; inside a workflow, round 1 runs before the commit and
|
|
15
|
-
round 2 beside CI (`.claude/skills/workflow-commands/chain-rule.md`).
|
|
16
|
-
`reviewer`
|
|
17
|
-
|
|
15
|
+
round 2 beside CI (`.claude/skills/workflow-commands/chain-rule.md`). Launch the `reviewer` agent
|
|
16
|
+
type (round 2: `reviewer-verification`), never nested, with the model `pnpm josh review:brief` prints.
|
|
17
|
+
Before the reviewer returns its findings → `pnpm josh review:lint` (`.claude/agents/reviewer.md`).
|
|
18
18
|
|
|
19
19
|
Re-run after fixes until **no high or medium findings remain or the round cap below is reached** (the
|
|
20
20
|
first review counts), whichever comes first. Round 2 is a verification pass over the fixes
|
|
@@ -24,17 +24,19 @@ 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
|
|
27
|
+
Answer these ten over your own diff before the scoped pair that precedes round 1 — question 1 once
|
|
28
|
+
`pnpm josh run:review --join` prints its lines after the review, or, under `--join --fixing` or a
|
|
29
|
+
check `--join` restarted on a moved tree, the ship's pre-detach — and fix what an
|
|
28
30
|
answer turns up (about four in five of 100 sampled High/Medium findings that stopped lane reviews
|
|
29
31
|
fell under one; `pnpm josh lane:stats` counts the kinds that still stop). The review, its severity
|
|
30
32
|
tests and the round cap are unchanged.
|
|
31
33
|
|
|
32
|
-
1. **Tests pin the change** —
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
1. **Tests pin the change** — read the `unpinned` and `unchecked` lines `pnpm josh run:review --join`
|
|
35
|
+
prints from `pnpm josh test:pinned` (each unchecked place is listed in its `full output:` log) (`docs/josh-commands.md` → "`josh test:pinned`"), and check a pinning test's fixture reaches its branch (no assert on a string the code
|
|
36
|
+
never draws, no comparison against a literal copy).
|
|
35
37
|
2. **Prose matches the code** — grep docs, prompts and comments for the old wording of every behavior,
|
|
36
|
-
constant, command and heading you changed, moved or removed
|
|
37
|
-
sentences included.
|
|
38
|
+
constant, command and heading you changed, moved or removed (`pnpm josh prose:stale` finds the
|
|
39
|
+
removed ones), `"the table above"` and rewritten sentences included.
|
|
38
40
|
3. **Failure is not a negative answer** — every timeout, non-zero exit or `gh` failure on a touched
|
|
39
41
|
path returns something a caller can tell apart from `false`, `undefined` or "nothing found".
|
|
40
42
|
4. **Every caller moved with it** — grep every reference to a changed function, list or command, and
|
|
@@ -54,6 +56,10 @@ tests and the round cap are unchanged.
|
|
|
54
56
|
comment makes about another component's behavior (what a stage does, who enforces a limit, which
|
|
55
57
|
repository it runs in), open that component's code and confirm it; then name each context the
|
|
56
58
|
change runs in — kit and a consumer, and a predecessor that died midway leaving its record behind.
|
|
59
|
+
10. **Commands your prose tells a reader to run are run** — for every command a refusal, hint or
|
|
60
|
+
document you added or changed tells a reader to run, run it as written from a cwd other than the
|
|
61
|
+
root, with an absolute path, a relative path and an empty input, and check each result — in a
|
|
62
|
+
scratch copy (`mktemp -d`) when it writes, deletes, files or pushes, never on the lane's files.
|
|
57
63
|
|
|
58
64
|
The brief lists `Removed tests` → each needs a `## 消えたテストの処置` row in the PR body, or the
|
|
59
65
|
merge is refused: `prompts/collaboration-workflow/report-format.md` → "PR 本文の消えたテストの処置".
|
|
@@ -78,12 +84,12 @@ pnpm josh review:brief --level-only --staged # the staged diff
|
|
|
78
84
|
|
|
79
85
|
## Interaction review
|
|
80
86
|
|
|
81
|
-
|
|
82
|
-
|
|
87
|
+
`pnpm josh run:review` writes its brief to a file beside round 1's where it is due, printing both paths; one still owed after round 1
|
|
88
|
+
takes `pnpm josh review:brief --interaction`. Hand it to a reviewer subagent, dispose of the findings
|
|
83
89
|
by the three-way disposition below, and record the pass with
|
|
84
90
|
`pnpm josh review:record --interaction --issue <N> [<category>:<severity>:<file> ...]`.
|
|
85
91
|
|
|
86
|
-
`pnpm josh followup` refuses a due change with none recorded; `pnpm josh ship --review` runs it itself.
|
|
92
|
+
`pnpm josh followup` refuses a due change with none recorded; `pnpm josh ship --review` runs it itself, beside round 1, and stops once on the findings of both.
|
|
87
93
|
|
|
88
94
|
## Review round cap (2 rounds)
|
|
89
95
|
|
|
@@ -103,27 +109,28 @@ the child rather than buying a further round.
|
|
|
103
109
|
### When round 2 is skipped entirely, and when it is not
|
|
104
110
|
|
|
105
111
|
```bash
|
|
106
|
-
pnpm josh review:round2 --
|
|
112
|
+
pnpm josh review:round2 --record <N> # → required | skip ; the reason on stderr
|
|
107
113
|
```
|
|
108
114
|
|
|
109
|
-
Ask once round 1's fixes are in
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
`required`.
|
|
115
|
+
Ask once round 1's fixes are in and the round is recorded with each finding's disposition
|
|
116
|
+
(`pnpm josh review:record`'s usage), before the commit. Round 1 is closed only when the ledger shows
|
|
117
|
+
every round-1 High/Medium as `fixed` or `false-positive`. Anything else, including a missing round-1
|
|
118
|
+
snapshot, answers `required`.
|
|
113
119
|
|
|
114
120
|
`skip` has exactly two arms, and the reason line names which fired:
|
|
115
121
|
|
|
116
122
|
- **A** — the fix delta is empty.
|
|
117
123
|
- **B** — every path in the fix delta is inert by the review-level classification above:
|
|
118
|
-
`docs/**/*.md`, the root `README.md`, under `prompts/`,
|
|
124
|
+
`docs/**/*.md`, the root `README.md`, under `prompts/`, a metrics approval under
|
|
125
|
+
`.josh/metrics-accepted/`, or a `.ts` / `.js` / `.svelte` file outside
|
|
119
126
|
`.claude/` changed only in comments (a lint, type-check, coverage or bundler directive comment counts
|
|
120
127
|
as code).
|
|
121
128
|
|
|
122
129
|
One path outside that set makes it `required` — `.claude/**`, `CLAUDE.md`, a test, configuration, a
|
|
123
130
|
code line, or a source file whose comment-free text cannot be read.
|
|
124
131
|
|
|
125
|
-
|
|
126
|
-
and quoting the
|
|
132
|
+
`--record <N>` records a skipped round on the Issue itself: a comment under `## Round 2 skipped`
|
|
133
|
+
naming which arm fired and quoting the reason line verbatim, written once however often it is asked.
|
|
127
134
|
|
|
128
135
|
### Three-way disposition after the cap
|
|
129
136
|
|
|
@@ -161,9 +168,11 @@ Branch 2 only:
|
|
|
161
168
|
a `fold`; the first filing asks nothing.
|
|
162
169
|
|
|
163
170
|
1. Before the current Issue closes, file it tagged `route:review-cap`:
|
|
164
|
-
`pnpm josh issue:file "<title>" --body-file <body-file> --route review-cap
|
|
171
|
+
`pnpm josh issue:file "<title>" --body-file <body-file> --route review-cap --found-during <N>`
|
|
172
|
+
(`--found-during` leaves the deferral note on the current Issue the ship reviewer reads). It lints
|
|
165
173
|
the body, applies the declared labels, runs the duplicate scan and `epic:bundle`
|
|
166
|
-
(`docs/josh-commands-backlog.md` → `josh issue:file`).
|
|
174
|
+
(`docs/josh-commands-backlog.md` → `josh issue:file`). A security finding declares its
|
|
175
|
+
`- セキュリティ:` line (`issue-template.md` → H). `epic:bundle` reads open issues only, so
|
|
167
176
|
after the parent closes it answers `none` permanently.
|
|
168
177
|
2. Act on the printed `epic:bundle` answer with `pnpm josh epic:bundle <new> --apply` — never a
|
|
169
178
|
hand edit of the epic body, which leaves the task list and `blocked-by` relations disagreeing
|
package/prompts/testing-guide.md
CHANGED
|
@@ -10,6 +10,7 @@ Every requirement gets a test (`CLAUDE.md` → "Code Change Rules" Step 0); the
|
|
|
10
10
|
- Logic/utility change (pure functions, filters, transforms) → a unit test. Bug fix → a regression test; refactor → tests pinning the existing behavior BEFORE the change (`prompts/refactoring.md`).
|
|
11
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.
|
|
12
12
|
- **basic で kit がテストできない言語だけの変更:** `package.json` に `josh.profile: basic`(改名前の `static` も同じ)があり、変更が HTML/CSS や Lua などのソースだけなら自動テストは不要。HTML/CSS はブラウザーで対象ページを開き、想定する画面幅でレイアウト・リンク・HTML 内の操作を確認する。そのほかのソースは変更した処理を実際に動かす。どちらも結果を記録する。JavaScript または TypeScript のファイルを含む変更は自動テストを行う。
|
|
13
|
+
- **A runtime change with no test is refused at the commit** — `pnpm josh git -y` refuses it while `pnpm josh test:declared` answers `required` (the `test-declared` row of `pnpm josh rule:list`).
|
|
13
14
|
- 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`).
|
|
14
15
|
|
|
15
16
|
### Verification checklist (add to the completion gate)
|
|
@@ -95,30 +95,28 @@ function resolve(
|
|
|
95
95
|
return resolved.kind === 'rejected' ? resolved : with_profile(invocation, resolved.profile)
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
function profiled_in(invocation: string, resolved: ProfileResult, cwd: string): AgentArgvResult {
|
|
99
|
+
return resolved.kind === 'rejected'
|
|
100
|
+
? resolved
|
|
101
|
+
: with_profile_in(invocation, resolved.profile, cwd)
|
|
102
|
+
}
|
|
103
|
+
|
|
98
104
|
// **A cut relaunch's profile, resolved for the phase the resumed child is entering**.
|
|
99
|
-
// A stored lane profile keeps its model and takes
|
|
100
|
-
// lane without one resolves the worker for the phase. An env override wins over the phase in
|
|
105
|
+
// A stored lane profile keeps its model unless the phase's own model key is set, and takes the phase's
|
|
106
|
+
// effort; a lane without one resolves the worker for the phase. An env override wins over the phase in
|
|
107
|
+
// either path.
|
|
101
108
|
function resume_argv(
|
|
102
109
|
invocation: string,
|
|
103
110
|
profile: AgentProfile | undefined,
|
|
104
111
|
phase: string,
|
|
105
112
|
cwd: string,
|
|
106
113
|
): AgentArgvResult {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const resolved = agent_role_profile.resolve(agent_role_profile.WORKER, process.env, phase)
|
|
112
|
-
|
|
113
|
-
return resolved.kind === 'rejected'
|
|
114
|
-
? resolved
|
|
115
|
-
: with_profile_in(invocation, resolved.profile, cwd)
|
|
116
|
-
}
|
|
114
|
+
const resolved =
|
|
115
|
+
profile === undefined
|
|
116
|
+
? agent_role_profile.resolve(agent_role_profile.WORKER, process.env, phase)
|
|
117
|
+
: agent_role_profile.with_phase(profile, phase)
|
|
117
118
|
|
|
118
|
-
|
|
119
|
-
return resolved.kind === 'rejected'
|
|
120
|
-
? resolved
|
|
121
|
-
: with_profile_in(invocation, resolved.profile, cwd)
|
|
119
|
+
return profiled_in(invocation, resolved, cwd)
|
|
122
120
|
}
|
|
123
121
|
|
|
124
122
|
function resolve_in(
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { agent_session_environment } from '#scripts/josh/agent-session-environment'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
// Which provider an agent session runs on, read from the session's own keys or the mark a detached
|
|
5
|
+
// launch hands its child. `agent-role-profile.ts` resolves a role's profile on top of it.
|
|
6
|
+
|
|
7
|
+
const EMPTY_LENGTH = 0
|
|
8
|
+
|
|
9
|
+
const PROVIDER_SCHEMA = z.enum(['anthropic', 'openai'])
|
|
10
|
+
|
|
11
|
+
type AgentProvider = z.infer<typeof PROVIDER_SCHEMA>
|
|
12
|
+
type AgentEnvironment = Readonly<Record<string, string | undefined>>
|
|
13
|
+
|
|
14
|
+
interface Rejected {
|
|
15
|
+
kind: 'rejected'
|
|
16
|
+
note: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type ProviderResult = Rejected | { kind: 'provider'; provider: AgentProvider; is_default?: true }
|
|
20
|
+
|
|
21
|
+
const ANTHROPIC_PROVIDER: AgentProvider = 'anthropic'
|
|
22
|
+
const OPENAI_PROVIDER: AgentProvider = 'openai'
|
|
23
|
+
const CODEX_SESSION_KEY = 'CODEX_THREAD_ID'
|
|
24
|
+
|
|
25
|
+
function trimmed(value: string | undefined): string | undefined {
|
|
26
|
+
const result = value?.trim()
|
|
27
|
+
|
|
28
|
+
return result === undefined || result.length === EMPTY_LENGTH ? undefined : result
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function rejection(key: string, value: string, expected: string): Rejected {
|
|
32
|
+
return { kind: 'rejected', note: `${key}=${value} ${expected}, so the agent was not started` }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function has_session(environment: AgentEnvironment, keys: ReadonlyArray<string>): boolean {
|
|
36
|
+
return keys.some((key) => trimmed(environment[key]) !== undefined)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const CONFLICTING_SESSIONS: Rejected = {
|
|
40
|
+
kind: 'rejected',
|
|
41
|
+
note: 'both Codex and Claude Code sessions were detected',
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// The provider a detached launcher hands a process that is not itself an agent session.
|
|
45
|
+
// `detached_launch` strips the parent-session keys — the very keys the
|
|
46
|
+
// detection below reads — so a `josh ship --detach --review` supervisor could never resolve its reviewer.
|
|
47
|
+
// **It is a fallback, read only when no session is detected**: the mark is inherited by everything the
|
|
48
|
+
// supervisor starts, and a real session's own keys must keep deciding for that session.
|
|
49
|
+
const HANDED_PROVIDER_KEY = 'JOSH_AGENT_PROVIDER'
|
|
50
|
+
|
|
51
|
+
// **Nothing named a provider, so Claude Code is the default** — a person typing `josh lane:launch` in a
|
|
52
|
+
// plain terminal has no session and no mark. Only silence defaults: two detected sessions and a mark
|
|
53
|
+
// naming no allowed provider still refuse. `is_default` lets a launch say so, and lets `josh cost` keep
|
|
54
|
+
// reading "no session of its own" rather than pricing another session's transcript.
|
|
55
|
+
const DEFAULT_PROVIDER: ProviderResult = {
|
|
56
|
+
kind: 'provider',
|
|
57
|
+
provider: ANTHROPIC_PROVIDER,
|
|
58
|
+
is_default: true,
|
|
59
|
+
}
|
|
60
|
+
const DEFAULT_NOTICE = ` No agent session or ${HANDED_PROVIDER_KEY} was found, so the provider defaulted to ${ANTHROPIC_PROVIDER} (Claude Code).`
|
|
61
|
+
|
|
62
|
+
function handed_provider(environment: AgentEnvironment): ProviderResult {
|
|
63
|
+
const value = trimmed(environment[HANDED_PROVIDER_KEY])
|
|
64
|
+
if (value === undefined) return DEFAULT_PROVIDER
|
|
65
|
+
const parsed = PROVIDER_SCHEMA.safeParse(value)
|
|
66
|
+
|
|
67
|
+
return parsed.success
|
|
68
|
+
? { kind: 'provider', provider: parsed.data }
|
|
69
|
+
: rejection(HANDED_PROVIDER_KEY, value, 'is not an allowed provider')
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// The session this process runs in, read from its own keys: `undefined` when none is detected.
|
|
73
|
+
function detected_provider(environment: AgentEnvironment): ProviderResult | undefined {
|
|
74
|
+
const has_codex = has_session(environment, [CODEX_SESSION_KEY])
|
|
75
|
+
const has_claude = has_session(environment, agent_session_environment.PARENT_SESSION_KEYS)
|
|
76
|
+
|
|
77
|
+
if (has_codex === has_claude) return has_codex ? CONFLICTING_SESSIONS : undefined
|
|
78
|
+
|
|
79
|
+
return { kind: 'provider', provider: has_codex ? OPENAI_PROVIDER : ANTHROPIC_PROVIDER }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function resolve_provider(environment: AgentEnvironment = process.env): ProviderResult {
|
|
83
|
+
return detected_provider(environment) ?? handed_provider(environment)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The sentence a launch appends when it ran on the default, so falling back is never silent; empty when
|
|
87
|
+
// a session or a mark decided.
|
|
88
|
+
function default_notice(environment: AgentEnvironment = process.env): string {
|
|
89
|
+
const selected = resolve_provider(environment)
|
|
90
|
+
|
|
91
|
+
return selected.kind === 'provider' && selected.is_default === true ? DEFAULT_NOTICE : ''
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// The same sentence on stderr, for a launcher whose own line is a verdict or a brief another process
|
|
95
|
+
// reads: `run:wake --start`, `review:brief` and `ship --detach` default exactly as a dispatch does.
|
|
96
|
+
function warn_of_default(environment: AgentEnvironment = process.env): void {
|
|
97
|
+
const notice = default_notice(environment).trim()
|
|
98
|
+
|
|
99
|
+
if (notice !== '') console.error(notice)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Whether this session is woken when a background command it started completes.
|
|
103
|
+
// Claude Code re-invokes the session at the completion; a Codex session is not
|
|
104
|
+
// re-invoked, so a parent there can only wait by polling, each poll a model call over its whole context.
|
|
105
|
+
// Only a resolved Codex session answers no — a defaulted or conflicting one keeps the callback.
|
|
106
|
+
function has_completion_callback(environment: AgentEnvironment = process.env): boolean {
|
|
107
|
+
const selected = resolve_provider(environment)
|
|
108
|
+
|
|
109
|
+
return selected.kind !== 'provider' || selected.provider !== OPENAI_PROVIDER
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// The mark a detached launch sets on its child: the provider this session resolved, the default
|
|
113
|
+
// included, or nothing when it was refused — the child then fails the same way this session would have.
|
|
114
|
+
function handoff_environment(
|
|
115
|
+
environment: AgentEnvironment = process.env,
|
|
116
|
+
): Readonly<Record<string, string>> {
|
|
117
|
+
const selected = resolve_provider(environment)
|
|
118
|
+
|
|
119
|
+
return selected.kind === 'provider' ? { [HANDED_PROVIDER_KEY]: selected.provider } : {}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const agent_provider = {
|
|
123
|
+
ANTHROPIC_PROVIDER,
|
|
124
|
+
CODEX_SESSION_KEY,
|
|
125
|
+
HANDED_PROVIDER_KEY,
|
|
126
|
+
OPENAI_PROVIDER,
|
|
127
|
+
PROVIDER_SCHEMA,
|
|
128
|
+
default_notice,
|
|
129
|
+
handoff_environment,
|
|
130
|
+
has_completion_callback,
|
|
131
|
+
rejection,
|
|
132
|
+
resolve_provider,
|
|
133
|
+
trimmed,
|
|
134
|
+
warn_of_default,
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export type { AgentEnvironment, AgentProvider, ProviderResult, Rejected }
|
|
138
|
+
export { agent_provider }
|