@joshuafolkken/kit 1.1178.0 → 1.1229.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/.claude-plugin/plugin.json +1 -1
- package/.claude/settings.json +2 -2
- package/.claude/skills/dependency-update/SKILL.md +4 -8
- package/.claude/skills/epic-commands/SKILL.md +2 -2
- package/.claude/skills/epic-commands/epic-bundle.md +1 -1
- package/.claude/skills/workflow-commands/SKILL.md +2 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +6 -4
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +6 -2
- package/.claude/skills/workflow-commands/backlogrun-park.md +23 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +7 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +4 -3
- package/.claude/skills/workflow-commands/backlogrun-steps.md +21 -13
- package/.claude/skills/workflow-commands/chain-rule.md +1 -1
- package/.claude/skills/workflow-commands/delegation.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +5 -0
- package/.claude/skills/workflow-commands/fullrun-steps.md +1 -1
- package/.claude/skills/workflow-commands/halfrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +3 -3
- package/.claude/skills/workflow-commands/pre-gate-cut.md +6 -1
- package/.claude/skills/workflow-commands/prerequisite.md +2 -2
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +1 -1
- package/.codex/hooks.json +2 -2
- package/.cursorrules +6 -41
- package/.github/actions/setup-node/action.yml +1 -1
- package/.github/workflows/auto-tag.yml +3 -4
- package/.github/workflows/ci.yml +32 -31
- package/.github/workflows/dependabot-auto-merge.yml +13 -6
- package/.github/workflows/publish.yml +48 -4
- package/.github/workflows/sonar-qube.yml +3 -0
- package/.pnpmfile.mjs +4 -3
- package/.prettierignore +8 -2
- package/CLAUDE.md +18 -20
- package/README.md +26 -19
- package/SECURITY.md +15 -1
- package/dist/CLAUDE.md +18 -20
- package/dist/commands/document-section-cli.js +734 -0
- package/dist/hooks/audit-provision.js +346 -0
- package/dist/hooks/batch-guard.js +5 -4
- package/dist/hooks/{chunk-S6X6WYKR.js → chunk-55HHG5PX.js} +1210 -711
- package/dist/hooks/{chunk-ZAL3NRGL.js → chunk-5VMKCCC4.js} +25 -10
- package/dist/hooks/chunk-5VNDSNG3.js +12 -0
- package/dist/hooks/{chunk-32GQTL4F.js → chunk-6HJJXRBX.js} +4 -2
- package/dist/hooks/chunk-CDY4NFQG.js +15 -0
- package/dist/hooks/chunk-ELCN5LCH.js +135 -0
- package/dist/hooks/{chunk-VESKRQOF.js → chunk-F56MFS4B.js} +3 -3
- package/dist/hooks/{chunk-UAGLLIGZ.js → chunk-FIVDHQGT.js} +7 -6
- package/dist/hooks/{chunk-3V37IID6.js → chunk-JBBMAPC4.js} +23 -14
- package/dist/hooks/{chunk-G6KRCKEC.js → chunk-JUDKDCDP.js} +496 -378
- package/dist/hooks/{chunk-GDS5N2KB.js → chunk-NV2JRZZO.js} +718 -681
- package/dist/hooks/{chunk-VQLLNFNT.js → chunk-RNWHN5BP.js} +3 -3
- package/dist/hooks/{chunk-DO6NWWHU.js → chunk-TQNPDZNH.js} +4 -4
- package/dist/hooks/{chunk-I4XSL4TT.js → chunk-VC3PZPZO.js} +1 -1
- package/dist/hooks/codex-hook-adapter.js +14 -12
- package/dist/hooks/duplicate-read-guard.js +6 -5
- package/dist/hooks/format-edited.js +4 -3
- package/dist/hooks/inputs.json +217 -195
- package/dist/hooks/investigation-guard.js +6 -5
- package/dist/hooks/pretool-guard.js +12 -10
- package/dist/hooks/session-lang.js +2 -4
- package/dist/hooks/stop-guard.js +66 -58
- package/dist/josh.js +868 -74
- package/dist/version/index.d.ts +7 -2
- package/dist/version/index.js +152 -75
- package/eslint/base.js +23 -1
- package/eslint/rules/code-quality.js +3 -0
- package/eslint/rules/early-return-one-liner.js +98 -0
- package/eslint/rules/unicorn.js +16 -1
- package/package.json +7 -6
- package/pnpm-workspace.yaml +9 -4
- package/prettier/basic.d.ts +3 -1
- package/prettier/index.d.ts +3 -1
- package/prettier/static.d.ts +3 -1
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +4 -4
- package/prompts/collaboration-workflow/glossary.md +1 -1
- package/prompts/collaboration-workflow/operating-rules.md +17 -9
- package/prompts/collaboration-workflow/overview.md +2 -2
- package/prompts/collaboration-workflow/principles.md +14 -12
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +6 -6
- package/prompts/collaboration-workflow/shell-body.md +6 -6
- package/prompts/collaboration-workflow/turn-batching.md +1 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +12 -2
- package/prompts/collaboration-workflow/wip-cap.md +10 -10
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +1 -1
- package/scripts/agent/agent-headless.ts +29 -0
- package/scripts/agent/agent-launch-environment.ts +6 -2
- package/scripts/agent/codex-agent-argv.ts +2 -1
- package/scripts/auto-ok/auto-ok-cli.ts +1 -1
- package/scripts/backlog/backlog-arrival.ts +3 -3
- package/scripts/backlog/backlog-budget.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +135 -0
- package/scripts/backlog/backlog-drive-cli.ts +11 -137
- package/scripts/backlog/backlog-drive-launch.ts +39 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +3 -5
- package/scripts/backlog/backlog-drive-named.ts +3 -3
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-owner.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +1 -1
- package/scripts/backlog/backlog-drive.ts +1 -1
- package/scripts/backlog/backlog-next.ts +16 -5
- package/scripts/backlog/backlog-offer-cli.ts +6 -6
- package/scripts/backlog/backlog-offer.ts +1 -1
- package/scripts/backlog/backlog-plan-cli.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +57 -11
- package/scripts/backlog/backlog-ready.ts +1 -1
- package/scripts/backlog/backlog-scope.ts +1 -1
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +3 -1
- package/scripts/build/build-commands.ts +66 -0
- package/scripts/build/build-hooks.ts +2 -1
- package/scripts/build/build-library.ts +12 -3
- package/scripts/build/build.ts +70 -0
- package/scripts/build/local-bin.ts +3 -13
- package/scripts/delegation/investigation-reads.ts +3 -1
- package/scripts/discovery/repo-origin.ts +5 -5
- package/scripts/doctor/doctor-consumer.ts +2 -2
- package/scripts/doctor/doctor-io.ts +2 -3
- package/scripts/document/capped-print-part.ts +30 -0
- package/scripts/document/capped-print.ts +3 -4
- package/scripts/document/document-byte-budget.ts +11 -2
- package/scripts/document/document-scan.ts +117 -0
- package/scripts/document/document-section.ts +143 -16
- package/scripts/document/entry-read-budget.ts +5 -3
- package/scripts/document/entry-read-set.ts +10 -89
- package/scripts/document/read-set-cost.ts +98 -0
- package/scripts/epic/epic-add-body.ts +1 -0
- package/scripts/epic/epic-audit-checks.ts +1 -1
- package/scripts/epic/epic-audit-rationale.ts +4 -3
- package/scripts/epic/epic-bundle-cli.ts +14 -3
- package/scripts/epic/epic-bundle-poll.ts +41 -0
- package/scripts/epic/epic-busy.ts +1 -1
- package/scripts/epic/epic-candidate-confirm.ts +3 -2
- package/scripts/epic/epic-classify.ts +1 -1
- package/scripts/epic/epic-cli-argv.ts +78 -46
- package/scripts/epic/epic-cli-remove.ts +11 -19
- package/scripts/epic/epic-cli.ts +74 -73
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +1 -1
- package/scripts/epic/epic-cross-repo.ts +5 -5
- package/scripts/epic/epic-graph.ts +1 -1
- package/scripts/epic/epic-index.ts +1 -1
- package/scripts/epic/epic-issue.ts +2 -6
- package/scripts/epic/epic-lane-offer.ts +2 -2
- package/scripts/epic/epic-next.ts +29 -42
- package/scripts/epic/epic-solo-stale.ts +1 -1
- package/scripts/epic/epic-triage.ts +8 -4
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/followup/git-followup-finish.ts +2 -2
- package/scripts/followup/git-followup-label.ts +2 -2
- package/scripts/followup/git-followup-merged.ts +2 -2
- package/scripts/followup/git-pr-followup-checks.ts +142 -0
- package/scripts/followup/git-pr-followup.ts +4 -129
- package/scripts/gate/core-budget.ts +69 -1
- package/scripts/gate/gate-plan.ts +47 -7
- package/scripts/gate/gate-skip.ts +38 -7
- package/scripts/gate/hook-gate-reuse.ts +12 -10
- package/scripts/gate/pre-commit-type-check.ts +4 -1
- package/scripts/gate/project-checks.ts +6 -9
- package/scripts/gate/type-check-step.ts +2 -3
- package/scripts/gate/verification-gate.ts +27 -8
- package/scripts/gh/git-gh-api-path.ts +2 -2
- package/scripts/gh/git-gh-issue-rest.ts +3 -3
- package/scripts/gh/git-gh-issue-write.ts +53 -7
- package/scripts/gh/git-gh-pr-read.ts +64 -19
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr.ts +5 -1
- package/scripts/gh/git-pr-ai-review.ts +1 -1
- package/scripts/gh/git-pr-checks-eval.ts +1 -3
- package/scripts/gh/git-pr-checks-parse.ts +1 -1
- package/scripts/gh/git-pr-checks-watch.ts +6 -5
- package/scripts/gh/git-pr-checks.ts +7 -5
- package/scripts/gh/git-pr-coderabbit.ts +1 -1
- package/scripts/gh/git-pr-error.ts +1 -3
- package/scripts/gh/git-pr.ts +9 -13
- package/scripts/gh/github-issue-url.ts +2 -2
- package/scripts/git/constants.ts +2 -6
- package/scripts/git/git-command.ts +20 -218
- package/scripts/git/git-diff-reads.ts +225 -0
- package/scripts/git/git-error.ts +4 -12
- package/scripts/git/git-pre-push-hook.ts +139 -0
- package/scripts/git/git-prompt.ts +2 -6
- package/scripts/git/git-spawn-sync.ts +3 -1
- package/scripts/git/git-spawn.ts +1 -1
- package/scripts/git/git-staging.ts +4 -6
- package/scripts/git/git-status.ts +3 -9
- package/scripts/hooks/codex-hook-adapter.ts +1 -1
- package/scripts/hooks/edited-cspell.ts +2 -4
- package/scripts/hooks/format-edited-file.ts +3 -12
- package/scripts/hooks/pre-push-unit.ts +31 -9
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/run-hook.sh +5 -4
- package/scripts/hooks/stop-guard.ts +5 -3
- package/scripts/init/init-actions.ts +0 -5
- package/scripts/init/init-ai-copy.ts +13 -2
- package/scripts/init/init-logic-json-merge.ts +19 -0
- package/scripts/init/init-logic-secretlint.ts +7 -7
- package/scripts/init/init-logic-workspace.ts +41 -2
- package/scripts/init/init-logic.ts +16 -26
- package/scripts/init/init.ts +5 -15
- package/scripts/init/initial-commit.ts +4 -4
- package/scripts/init/kit-development-versions.ts +40 -0
- package/scripts/init/kit-setup-state.ts +2 -2
- package/scripts/init/start-exec.ts +68 -19
- package/scripts/init/start-setup-pr.ts +9 -9
- package/scripts/init/start-steps.ts +6 -10
- package/scripts/issue/defect-rate-cli.ts +1 -1
- package/scripts/issue/git-next-issues.ts +1 -1
- package/scripts/issue/issue-auto-ok.ts +1 -1
- package/scripts/issue/issue-backlinks-cli.ts +2 -2
- package/scripts/issue/issue-backlinks.ts +9 -9
- package/scripts/issue/issue-comment-cli.ts +19 -13
- package/scripts/issue/issue-file-cli.ts +45 -18
- package/scripts/issue/issue-file.ts +24 -1
- package/scripts/issue/issue-scout-closed.ts +1 -1
- package/scripts/issue/issue-state-cli.ts +30 -74
- package/scripts/josh/josh-command-map.ts +2 -0
- package/scripts/josh/josh-command-types.ts +11 -0
- package/scripts/josh/josh-commands-ai.ts +4 -4
- package/scripts/josh/josh-commands-backlog.ts +4 -1
- package/scripts/josh/josh-commands-development.ts +10 -0
- package/scripts/josh/josh-commands-document.ts +1 -0
- package/scripts/josh/josh-commands-lane.ts +22 -0
- package/scripts/josh/josh-commands-maintenance.ts +4 -4
- package/scripts/josh/josh-commands-run.ts +12 -7
- package/scripts/josh/josh-in-process.ts +28 -9
- package/scripts/josh/josh-logic.ts +33 -15
- package/scripts/josh/process-identity.ts +1 -3
- package/scripts/josh/session-language-cli.ts +3 -4
- package/scripts/lane/lane-await.ts +5 -1
- package/scripts/lane/lane-child-invocation.ts +2 -2
- package/scripts/lane/lane-cli.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +14 -10
- package/scripts/lane/lane-environment.ts +5 -1
- package/scripts/lane/lane-handoff.ts +1 -1
- package/scripts/lane/lane-install.ts +2 -13
- package/scripts/lane/lane-launch-cli.ts +15 -1
- package/scripts/lane/lane-ledger.ts +145 -0
- package/scripts/lane/lane-leftover.ts +1 -1
- package/scripts/lane/lane-load.ts +108 -0
- package/scripts/lane/lane-measure-cli.ts +149 -0
- package/scripts/lane/lane-occupancy.ts +3 -0
- package/scripts/lane/lane-reap.ts +1 -3
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-stats.ts +224 -0
- package/scripts/lane/lane-vacant.ts +36 -0
- package/scripts/lane/openai-lane-ship.ts +2 -2
- package/scripts/lane/openai-lane-supervisor-owner.ts +180 -0
- package/scripts/lane/openai-lane-supervisor.ts +7 -165
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +35 -0
- package/scripts/lib/animation-helpers.ts +2 -2
- package/scripts/lib/buffered-process.ts +3 -7
- package/scripts/lib/cli-flags.ts +71 -1
- package/scripts/lib/spawn-exit.ts +2 -2
- package/scripts/lib/timeouts.ts +35 -2
- package/scripts/lines/line-budget.ts +4 -6
- package/scripts/notify/telegram-test.ts +6 -0
- package/scripts/observations/observation-ledger-line.ts +6 -6
- package/scripts/observations/observation-ledger-migrate.ts +55 -4
- package/scripts/observations/observation-ledger.ts +26 -7
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/propagate/propagate-git.ts +1 -1
- package/scripts/propagate/propagate-publish.ts +2 -2
- package/scripts/propagate/propagate-steps.ts +20 -15
- package/scripts/propagate/propagate.ts +36 -27
- package/scripts/refactor/import-graph.ts +18 -1
- package/scripts/refactor/refactor-lint.ts +4 -4
- package/scripts/repo/repository-labels.ts +2 -2
- package/scripts/repo/required-checks-logic.ts +1 -3
- package/scripts/review/live-evidence.ts +2 -4
- package/scripts/review/review-brief-cli.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +1 -1
- package/scripts/review/review-findings-cli.ts +1 -3
- package/scripts/rules/decision-oracle-batch.ts +128 -0
- package/scripts/rules/decision-oracle-tokens.ts +21 -0
- package/scripts/rules/decision-oracle.ts +8 -120
- package/scripts/rules/delivered-rules.ts +26 -182
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/early-heartbeat.ts +3 -3
- package/scripts/rules/git-argv.ts +1 -1
- package/scripts/rules/git-force.ts +1 -1
- package/scripts/rules/implementation-cut.ts +2 -2
- package/scripts/rules/index-guard.ts +1 -1
- package/scripts/rules/issue-comments.ts +118 -0
- package/scripts/rules/{issue-fold.ts → issue-fold-rule.ts} +2 -2
- package/scripts/rules/lane-background.ts +2 -2
- package/scripts/rules/lane-park.ts +18 -0
- package/scripts/rules/lane-split-park.ts +128 -0
- package/scripts/rules/oracle-firing.ts +1 -1
- package/scripts/rules/poll-loop.ts +1 -1
- package/scripts/rules/pre-gate-cut.ts +1 -1
- package/scripts/rules/protected-files.ts +59 -4
- package/scripts/rules/{run-tail.ts → run-tail-rule.ts} +2 -2
- package/scripts/rules/shell-body-trigger.ts +1 -1
- package/scripts/rules/stop-rules.ts +18 -7
- package/scripts/rules/test-declared-commit.ts +4 -4
- package/scripts/rules/wip-cap.ts +63 -0
- package/scripts/run/{run-carry-args.ts → carry/run-carry-args.ts} +37 -13
- package/scripts/run/{run-carry-change.ts → carry/run-carry-change.ts} +29 -7
- package/scripts/run/{run-carry-cli.ts → carry/run-carry-cli.ts} +4 -6
- package/scripts/run/{run-carry.ts → carry/run-carry.ts} +1 -1
- package/scripts/run/{run-cut-args.ts → cut/run-cut-args.ts} +1 -1
- package/scripts/run/{run-cut-cli.ts → cut/run-cut-cli.ts} +2 -2
- package/scripts/run/{run-cut.ts → cut/run-cut.ts} +1 -1
- package/scripts/run/{run-entry-cli.ts → entry/run-entry-cli.ts} +11 -11
- package/scripts/run/{run-entry.ts → entry/run-entry.ts} +2 -2
- package/scripts/run/{run-event-scope.ts → event/run-event-scope.ts} +1 -1
- package/scripts/run/{run-event-stream-emit.ts → event/run-event-stream-emit.ts} +1 -1
- package/scripts/run/{run-event-stream.ts → event/run-event-stream.ts} +16 -2
- package/scripts/run/{run-hold-cli.ts → hold/run-hold-cli.ts} +5 -5
- package/scripts/run/{run-merge-cli.ts → merge/run-merge-cli.ts} +10 -5
- package/scripts/run/{run-merge-steps.ts → merge/run-merge-steps.ts} +53 -5
- package/scripts/run/{run-merge.ts → merge/run-merge.ts} +1 -1
- package/scripts/run/{run-progress-cli.ts → progress/run-progress-cli.ts} +1 -1
- package/scripts/run/{run-progress-config.ts → progress/run-progress-config.ts} +2 -17
- package/scripts/run/{run-progress-read.ts → progress/run-progress-read.ts} +5 -5
- package/scripts/run/{run-progress.ts → progress/run-progress.ts} +1 -1
- package/scripts/run/{run-review-steps.ts → review/run-review-steps.ts} +2 -3
- package/scripts/run/run-ending.ts +2 -2
- package/scripts/run/run-halfrun-resume.ts +6 -1
- package/scripts/run/run-headless.ts +1 -1
- package/scripts/run/run-invocation.ts +85 -84
- package/scripts/run/run-liveness.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +1 -1
- package/scripts/run/run-preflight.ts +6 -6
- package/scripts/run/run-prep-cli.ts +1 -1
- package/scripts/run/run-prrun-resume.ts +1 -1
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +2 -2
- package/scripts/run/run-status-cli.ts +1 -1
- package/scripts/run/run-step-cli.ts +3 -3
- package/scripts/run/run-step.ts +2 -2
- package/scripts/run/run-stop-notify.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +2 -2
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +5 -3
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/run/{run-ship-cli.ts → ship/run-ship-cli.ts} +2 -2
- package/scripts/run/{run-ship-detach.ts → ship/run-ship-detach.ts} +3 -3
- package/scripts/run/ship/run-ship-lock.ts +50 -0
- package/scripts/run/{run-ship-preflight.ts → ship/run-ship-preflight.ts} +6 -2
- package/scripts/run/{run-ship-probe.ts → ship/run-ship-probe.ts} +2 -2
- package/scripts/run/{run-ship-return.ts → ship/run-ship-return.ts} +4 -3
- package/scripts/run/{run-ship-review-steps.ts → ship/run-ship-review-steps.ts} +3 -3
- package/scripts/run/{run-ship-scoped.ts → ship/run-ship-scoped.ts} +10 -1
- package/scripts/run/{run-ship-steps.ts → ship/run-ship-steps.ts} +11 -12
- package/scripts/run/ship/run-ship-stop-text.ts +13 -0
- package/scripts/run/{run-ship-sync.ts → ship/run-ship-sync.ts} +25 -11
- package/scripts/run/{run-tidy-lanes.ts → tidy/run-tidy-lanes.ts} +1 -1
- package/scripts/run/{run-wake-cli.ts → wake/run-wake-cli.ts} +23 -8
- package/scripts/run/{run-wake-describe.ts → wake/run-wake-describe.ts} +3 -3
- package/scripts/run/{run-wake-driver.ts → wake/run-wake-driver.ts} +59 -8
- package/scripts/run/{run-wake-handoff.ts → wake/run-wake-handoff.ts} +1 -1
- package/scripts/run/{run-wake-loop.ts → wake/run-wake-loop.ts} +8 -2
- package/scripts/run/wake/run-wake-restart.ts +58 -0
- package/scripts/run/{run-wake-session.ts → wake/run-wake-session.ts} +3 -3
- package/scripts/run/{run-wake.ts → wake/run-wake.ts} +1 -1
- package/scripts/safe-chain/preinstall-command.ts +20 -21
- package/scripts/safe-chain/project-config.ts +19 -15
- package/scripts/sync/sync-ai-files.ts +1 -1
- package/scripts/sync/sync-configs.ts +2 -1
- package/scripts/sync/sync.ts +15 -2
- package/scripts/test/unit-worker-share.ts +1 -0
- package/scripts/time-runtime/time-background.ts +5 -1
- package/scripts/time-runtime/time-instant.ts +3 -1
- package/scripts/time-runtime/time-spans.ts +6 -139
- package/scripts/time-runtime/time-tool-call.ts +160 -0
- package/scripts/version/effective-upstream.ts +2 -20
- package/scripts/version/latest-corepack.ts +17 -17
- package/scripts/version/latest-regression.ts +1 -1
- package/scripts/version/latest-update.ts +4 -4
- package/scripts/version/npm-registry.ts +20 -5
- package/scripts/version/publishable-range-check.ts +2 -2
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +48 -38
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +40 -0
- package/scripts/version/upgrade-shell-command.ts +48 -8
- package/scripts/version/version-check-logic.ts +23 -14
- package/scripts/version/version-commands.ts +23 -11
- package/scripts/version/version-remote.ts +28 -13
- package/templates/pnpm-workspace.basic.yaml +4 -0
- package/templates/workflows/dependabot-auto-merge.yml +5 -5
- package/templates/workflows/github-release.yml +2 -0
- package/scripts/build/build-config-merge.ts +0 -27
- package/scripts/build/build-managed-marker.ts +0 -27
- package/scripts/build/build-self-sync-guard.ts +0 -27
- package/scripts/build/build-version.ts +0 -26
- package/scripts/version/preinstall-version-update.ts +0 -86
- /package/scripts/git/{schemas.ts → git-schemas.ts} +0 -0
- /package/scripts/overrides/{schemas.ts → overrides-schemas.ts} +0 -0
- /package/scripts/run/{run-carry-conversation.ts → carry/run-carry-conversation.ts} +0 -0
- /package/scripts/run/{run-carry-reclaim.ts → carry/run-carry-reclaim.ts} +0 -0
- /package/scripts/run/{run-carry-stash.ts → carry/run-carry-stash.ts} +0 -0
- /package/scripts/run/{run-carry-streak.ts → carry/run-carry-streak.ts} +0 -0
- /package/scripts/run/{run-cut-handoff.ts → cut/run-cut-handoff.ts} +0 -0
- /package/scripts/run/{run-cut-report.ts → cut/run-cut-report.ts} +0 -0
- /package/scripts/run/{run-entry-stop.ts → entry/run-entry-stop.ts} +0 -0
- /package/scripts/run/{run-event-cli.ts → event/run-event-cli.ts} +0 -0
- /package/scripts/run/{run-event-follow.ts → event/run-event-follow.ts} +0 -0
- /package/scripts/run/{run-event-render.ts → event/run-event-render.ts} +0 -0
- /package/scripts/run/{run-event-watch.ts → event/run-event-watch.ts} +0 -0
- /package/scripts/run/{run-hold.ts → hold/run-hold.ts} +0 -0
- /package/scripts/run/{run-progress-args.ts → progress/run-progress-args.ts} +0 -0
- /package/scripts/run/{run-progress-clock.ts → progress/run-progress-clock.ts} +0 -0
- /package/scripts/run/{run-review-cli.ts → review/run-review-cli.ts} +0 -0
- /package/scripts/run/{run-review.ts → review/run-review.ts} +0 -0
- /package/scripts/run/{run-ship-next.ts → ship/run-ship-next.ts} +0 -0
- /package/scripts/run/{run-ship-pre-detach.ts → ship/run-ship-pre-detach.ts} +0 -0
- /package/scripts/run/{run-ship-review.ts → ship/run-ship-review.ts} +0 -0
- /package/scripts/run/{run-ship-stage.ts → ship/run-ship-stage.ts} +0 -0
- /package/scripts/run/{run-ship.ts → ship/run-ship.ts} +0 -0
- /package/scripts/run/{run-tidy-cli.ts → tidy/run-tidy-cli.ts} +0 -0
- /package/scripts/run/{run-tidy-stashes.ts → tidy/run-tidy-stashes.ts} +0 -0
- /package/scripts/run/{run-tidy.ts → tidy/run-tidy.ts} +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// early-return-one-liner: 単一の短い early return を one-liner `if (x) return y` に強制するルール
|
|
2
|
+
// (joshuafolkken/kit#3294)。CLAUDE.md の Quality limits は「single short early return → one-liner」と
|
|
3
|
+
// 書くが、`curly` は `['error', 'multi-line']` で one-liner 形を許すだけで要求はしない。そのため
|
|
4
|
+
// review-rubric の手作業チェックに残っていた。散文の指示はドリフトするので lint で強制する。
|
|
5
|
+
//
|
|
6
|
+
// 対象は else の無い `if` で、ブロックの中身が `return` 1 文だけのもの。ブロック内にコメントがあれば
|
|
7
|
+
// 対象外(one-liner にするとコメントの置き場が無くなる)。「短い」の判定は、one-liner にしたときに
|
|
8
|
+
// 行頭のインデントを含めて Prettier の printWidth(100)に収まるかどうか。収まらないものを
|
|
9
|
+
// one-liner にしても Prettier が折り返すだけなので、要求しない。条件式や戻り値が複数行にわたる
|
|
10
|
+
// ものも同じ理由で対象外。
|
|
11
|
+
//
|
|
12
|
+
// 自動修正はブロックを `return` 文そのものに置き換える。既存コードの移行を `--fix` 一発で済ませる
|
|
13
|
+
// ためで、置き換え後の形は `curly: multi-line` も Prettier もそのまま受け入れる。
|
|
14
|
+
|
|
15
|
+
const RULE_MESSAGE =
|
|
16
|
+
'Write a single short early return as a one-liner: `if (x) return y`. See CLAUDE.md → Quality limits.'
|
|
17
|
+
|
|
18
|
+
// Prettier の printWidth(prettier/basic.js)と max-len の code に揃える。
|
|
19
|
+
const PRINT_WIDTH = 100
|
|
20
|
+
// Prettier の useTabs で 1 タブが占める幅(tabWidth の既定値)。max-len の tabWidth と同じ。
|
|
21
|
+
const TAB_WIDTH = 2
|
|
22
|
+
|
|
23
|
+
const BLOCK_STATEMENT = 'BlockStatement'
|
|
24
|
+
const RETURN_STATEMENT = 'ReturnStatement'
|
|
25
|
+
|
|
26
|
+
// ブロックの中身が return 1 文だけなら、その return。それ以外は undefined。
|
|
27
|
+
function sole_return(block) {
|
|
28
|
+
const statements = block.type === BLOCK_STATEMENT ? block.body : []
|
|
29
|
+
const [statement] = statements
|
|
30
|
+
|
|
31
|
+
return statements.length === 1 && statement.type === RETURN_STATEMENT ? statement : undefined
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// 行頭からノードの開始位置までの幅。タブは TAB_WIDTH として数える。`} else if` のように `if` が
|
|
35
|
+
// 行の途中から始まるときは、手前の `} else ` も 1 行に並ぶので幅に含める。
|
|
36
|
+
function leading_width(source_code, node) {
|
|
37
|
+
const line = source_code.lines[node.loc.start.line - 1] ?? ''
|
|
38
|
+
const prefix = line.slice(0, node.loc.start.column)
|
|
39
|
+
|
|
40
|
+
return [...prefix].reduce((width, char) => width + (char === '\t' ? TAB_WIDTH : 1), 0)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// one-liner にしたときの `if (...) return ...` の文字列。
|
|
44
|
+
function one_liner_text(source_code, node, return_statement) {
|
|
45
|
+
const test_text = source_code.getText(node.test)
|
|
46
|
+
const return_text = source_code.getText(return_statement).replace(/;$/u, '')
|
|
47
|
+
|
|
48
|
+
return `if (${test_text}) ${return_text}`
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function fits_on_one_line(source_code, node, text) {
|
|
52
|
+
return !text.includes('\n') && leading_width(source_code, node) + text.length <= PRINT_WIDTH
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function has_comments(source_code, block) {
|
|
56
|
+
return source_code.getCommentsInside(block).length > 0
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// return 1 文だけの `if` が one-liner に書き直せるか。else もコメントも無く、1 行に収まるもの。
|
|
60
|
+
function is_one_liner_candidate(source_code, node, return_statement) {
|
|
61
|
+
if (node.alternate || has_comments(source_code, node.consequent)) return false
|
|
62
|
+
|
|
63
|
+
return fits_on_one_line(source_code, node, one_liner_text(source_code, node, return_statement))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function check_if_statement(context, node) {
|
|
67
|
+
const { sourceCode: source_code } = context
|
|
68
|
+
const return_statement = sole_return(node.consequent)
|
|
69
|
+
|
|
70
|
+
if (!return_statement || !is_one_liner_candidate(source_code, node, return_statement)) return
|
|
71
|
+
|
|
72
|
+
context.report({
|
|
73
|
+
node,
|
|
74
|
+
message: RULE_MESSAGE,
|
|
75
|
+
fix: (fixer) => fixer.replaceText(node.consequent, source_code.getText(return_statement)),
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function create(context) {
|
|
80
|
+
return {
|
|
81
|
+
IfStatement(node) {
|
|
82
|
+
check_if_statement(context, node)
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** @type {import('eslint').Rule.RuleModule} */
|
|
88
|
+
const early_return_one_liner_rule = {
|
|
89
|
+
meta: {
|
|
90
|
+
type: 'layout',
|
|
91
|
+
docs: { description: 'Require a single short early return to be written as a one-liner' },
|
|
92
|
+
fixable: 'code',
|
|
93
|
+
schema: [],
|
|
94
|
+
},
|
|
95
|
+
create,
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export { RULE_MESSAGE, early_return_one_liner_rule }
|
package/eslint/rules/unicorn.js
CHANGED
|
@@ -20,6 +20,14 @@ export const NAME_REPLACEMENTS_ALLOW_LIST = {
|
|
|
20
20
|
repository: true, // unicorn 68 は repository→repo を勧めるが、明確さを優先し完全名を維持する
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
// unicorn 77 は逆に repo→repository を要求する(joshuafolkken/kit#3273)。repo は GitHub の
|
|
24
|
+
// owner/repo・gh repo・josh repo:party と同じ定着した語で、展開しても明確さは増えない。
|
|
25
|
+
// allowList は大文字小文字を区別した単語一致なので RepoIdentity の `Repo` を拾えない。
|
|
26
|
+
// 置き換えそのものを外すと repo / Repo のどちらも対象外になる。
|
|
27
|
+
export const NAME_REPLACEMENTS_DISABLED = {
|
|
28
|
+
repo: false,
|
|
29
|
+
}
|
|
30
|
+
|
|
23
31
|
// unicorn 68→69 のベースライン方針(Issue #610 / Problem 3):
|
|
24
32
|
// `unicorn.configs.recommended` で 65→68 にかけて新たに有効化されたルール
|
|
25
33
|
// (prefer-url-href / consistent-class-member-order / prefer-number-coercion /
|
|
@@ -40,7 +48,10 @@ export const unicorn_rules = {
|
|
|
40
48
|
'unicorn/no-array-reduce': 'error',
|
|
41
49
|
// abbreviation を禁止(明確な命名を強制、idiomatic な短縮名は許可)
|
|
42
50
|
// unicorn 68 で prevent-abbreviations から name-replacements にリネーム
|
|
43
|
-
'unicorn/name-replacements': [
|
|
51
|
+
'unicorn/name-replacements': [
|
|
52
|
+
'error',
|
|
53
|
+
{ allowList: NAME_REPLACEMENTS_ALLOW_LIST, replacements: NAME_REPLACEMENTS_DISABLED },
|
|
54
|
+
],
|
|
44
55
|
// より良いエラーメッセージ
|
|
45
56
|
'unicorn/error-message': 'error',
|
|
46
57
|
// ファイル名のケース統一(unicorn 65 で既定 true になった checkDirectories を無効化し、
|
|
@@ -189,4 +200,8 @@ export const unicorn_rules = {
|
|
|
189
200
|
// 差分ノイズだけを生む。無効化ではなく 'single-line' 側で一貫性を強制する
|
|
190
201
|
// (内容が複数行のコメントはこのルールの対象外なので、長い解説コメントは影響を受けない)。
|
|
191
202
|
'unicorn/single-line-block-comment-style': ['error', 'single-line'],
|
|
203
|
+
// unicorn 77 で新設。JSDoc の各行から ` * ` を外させるが、行頭の `*` は JSDoc の標準形で、
|
|
204
|
+
// エディタは `/**` の中で改行するたびに自動で挿入する。有効のままだと新しい doc コメントの
|
|
205
|
+
// たびにエディタと衝突し、可読性の利得なく差分ノイズだけを生むため無効化する(joshuafolkken/kit#3273)。
|
|
206
|
+
'unicorn/no-asterisk-prefix-in-documentation-comments': 'off',
|
|
192
207
|
}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
2
|
+
"version": "1.1229.0",
|
|
3
3
|
"name": "@joshuafolkken/kit",
|
|
4
4
|
"description": "Development toolkit for AI-assisted projects: formatting, AI assistant rules and a Git/GitHub Issue workflow for any repository, plus lint, type check, tests and hooks for Node projects",
|
|
5
5
|
"keywords": [
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"url": "git+https://github.com/joshuafolkken/kit.git"
|
|
21
21
|
},
|
|
22
22
|
"engines": {
|
|
23
|
-
"node": "
|
|
23
|
+
"node": "^22.19.0 || ^24.0.0 || >=26.0.0"
|
|
24
24
|
},
|
|
25
25
|
"josh": {
|
|
26
26
|
"progress_interval_minutes": 15
|
|
@@ -85,10 +85,10 @@
|
|
|
85
85
|
"!scripts/test/test-telegram-guard.ts",
|
|
86
86
|
"!scripts/test/unit-guard-environment.ts",
|
|
87
87
|
"!scripts/test/unit-projects.ts",
|
|
88
|
+
"!scripts/test/untested-sources.ts",
|
|
88
89
|
"!scripts/test/vitest-include-globs.ts",
|
|
89
90
|
"!scripts/build/shim-shell.ts",
|
|
90
91
|
"!scripts/claude/skill-meta.ts",
|
|
91
|
-
"!scripts/document/document-scan.ts",
|
|
92
92
|
"!scripts/exports/member-usage.ts",
|
|
93
93
|
"!scripts/exports/namespace-escape.ts",
|
|
94
94
|
"!scripts/exports/namespace-members.ts",
|
|
@@ -101,6 +101,7 @@
|
|
|
101
101
|
"!scripts/hooks/hook-bundle-ready.ts",
|
|
102
102
|
"!scripts/hooks/prompt-hooks.ts",
|
|
103
103
|
"!scripts/josh/josh-script-reader.ts",
|
|
104
|
+
"!scripts/package/engine-range.ts",
|
|
104
105
|
"!scripts/package/production-dependency-graph.ts",
|
|
105
106
|
"!scripts/rules/delivered-rules-harness.ts",
|
|
106
107
|
"!scripts/rules/top-level-scripts-guard.ts"
|
|
@@ -174,7 +175,7 @@
|
|
|
174
175
|
"eslint-plugin-import-x": "^4.17.1",
|
|
175
176
|
"eslint-plugin-promise": "^7.3.0",
|
|
176
177
|
"eslint-plugin-sonarjs": "^4.2.1",
|
|
177
|
-
"eslint-plugin-unicorn": "^
|
|
178
|
+
"eslint-plugin-unicorn": "^77.0.0",
|
|
178
179
|
"globals": "^17.12.0",
|
|
179
180
|
"prettier": "^3.9.9",
|
|
180
181
|
"prettier-plugin-svelte": "^4.1.1",
|
|
@@ -256,7 +257,7 @@
|
|
|
256
257
|
"eslint-plugin-import-x": "^4.17.1",
|
|
257
258
|
"eslint-plugin-promise": "^7.3.0",
|
|
258
259
|
"eslint-plugin-sonarjs": "^4.2.2",
|
|
259
|
-
"eslint-plugin-unicorn": "^
|
|
260
|
+
"eslint-plugin-unicorn": "^77.0.0",
|
|
260
261
|
"eslint_d": "^15.0.3",
|
|
261
262
|
"globals": "^17.13.0",
|
|
262
263
|
"lefthook": "^2.1.16",
|
|
@@ -287,7 +288,7 @@
|
|
|
287
288
|
}
|
|
288
289
|
},
|
|
289
290
|
"scripts": {
|
|
290
|
-
"build": "tsx scripts/build/build
|
|
291
|
+
"build": "tsx scripts/build/build.ts",
|
|
291
292
|
"josh": "tsx scripts/josh/josh.ts"
|
|
292
293
|
}
|
|
293
294
|
}
|
package/pnpm-workspace.yaml
CHANGED
|
@@ -7,16 +7,21 @@ allowBuilds:
|
|
|
7
7
|
workerd: true
|
|
8
8
|
'@joshuafolkken/kit': false # project postinstall handles lefthook install
|
|
9
9
|
|
|
10
|
+
# pnpm 12 reads these settings from this file only; the same lines in .npmrc are ignored (kit #3267).
|
|
11
|
+
# A release must be a day old before pnpm resolves it, and an unsatisfied `engines` fails the install.
|
|
12
|
+
minimumReleaseAge: 1440
|
|
13
|
+
engineStrict: true
|
|
14
|
+
|
|
10
15
|
# Skip the install-time supply-chain re-verification of the already-committed, reviewed lockfile.
|
|
11
|
-
# Since pnpm 11.5, `
|
|
16
|
+
# Since pnpm 11.5, `minimumReleaseAge` can trigger a pre-install metadata re-fetch; on clean CI boxes
|
|
12
17
|
# (e.g. Cloudflare Workers Builds) it can't authenticate private @joshuafolkken/* GitHub Packages,
|
|
13
|
-
# producing a false ERR_PNPM_TARBALL_URL_MISMATCH.
|
|
18
|
+
# producing a false ERR_PNPM_TARBALL_URL_MISMATCH. minimumReleaseAge still applies at resolution
|
|
14
19
|
# time, so age protection is preserved — only the per-install re-check of a trusted lockfile is skipped.
|
|
15
20
|
trustLockfile: true
|
|
16
21
|
|
|
17
|
-
# Security fixes often require same-day vite releases;
|
|
22
|
+
# Security fixes often require same-day vite releases; minimumReleaseAge would block them.
|
|
18
23
|
# `@types/node` and `tsx` are also excluded so routine Dependabot-style bumps are not
|
|
19
|
-
# delayed by the
|
|
24
|
+
# delayed by the minimumReleaseAge window.
|
|
20
25
|
#
|
|
21
26
|
# `josh init` / `josh sync` mirror this list to Safe Chain's .aikido project config (kit #2618).
|
|
22
27
|
# Older Safe Chain shims ignore .aikido and can still hide an excluded release. `josh ranges`
|
package/prettier/basic.d.ts
CHANGED
package/prettier/index.d.ts
CHANGED
package/prettier/static.d.ts
CHANGED
|
@@ -26,7 +26,7 @@ lint・型検査の実行手順は `CLAUDE.md` → "Code Change Rules" の検証
|
|
|
26
26
|
- **過度な抽象化を避ける**: 現在の要件で必要な抽象化のみを行う。将来の拡張性を考慮した抽象化は不要
|
|
27
27
|
- **パターンの強制は避ける**: デザインパターンやアーキテクチャパターンを無理に適用しない
|
|
28
28
|
- **コードの重複は撲滅**: コードクローン(重複)は完全に撲滅する。重複が見つかった場合は関数やモジュールに抽出して共通化する
|
|
29
|
-
- **仕組みを足す前に原因を問う**: これは**書かれたコードの可読性**の規則。仕組み(フック・ガード・ルール)を足すか・どこへ置くかという**設計時の判断**は `prompts/collaboration-workflow/principles.md` → "
|
|
29
|
+
- **仕組みを足す前に原因を問う**: これは**書かれたコードの可読性**の規則。仕組み(フック・ガード・ルール)を足すか・どこへ置くかという**設計時の判断**は `prompts/collaboration-workflow/principles.md` → "elegant-design" の担当なので、本文を写さずそちらを参照する
|
|
30
30
|
|
|
31
31
|
### エラーハンドリング
|
|
32
32
|
|
|
@@ -42,7 +42,7 @@ PY
|
|
|
42
42
|
|
|
43
43
|
**レビュー指摘の修正がこの規則の主戦場である。** 「この行の条件が逆」「この定数を切り出す」といった局所的な指摘ほど、部分編集は小さくなる。一方で全文書き直しのコストはファイルの大きさで決まり、指摘の小ささでは下がらない。**指摘が局所的であるほど、全文書き直しとの差は開く。**
|
|
44
44
|
|
|
45
|
-
実測では 1 ランで約 2 分 45 秒が、すでに存在する行を打ち直すことに使われていた(joshuafolkken/kit#1260)。内訳は `docs/maintainers/file-edits-rationale.md` → "
|
|
45
|
+
実測では 1 ランで約 2 分 45 秒が、すでに存在する行を打ち直すことに使われていた(joshuafolkken/kit#1260)。内訳は `docs/maintainers/file-edits-rationale.md` → "Measured cost of whole-file rewrites"。
|
|
46
46
|
|
|
47
47
|
### `sed -i` を使う前に満たす 4 条件
|
|
48
48
|
|
|
@@ -67,12 +67,12 @@ PY
|
|
|
67
67
|
|
|
68
68
|
### なぜコストが二重になるか
|
|
69
69
|
|
|
70
|
-
インタプリタで書き戻す形は、編集後の本文が**コマンド本文とファイルの両方**に載る。さらに悪いのは持続性である。**コマンド本文は、書いた時点以降のすべてのリクエストで読み直される。** ランの序盤に書いた編集スクリプトほど、そのランの残り全リクエストぶん課金され続ける。ファイル側は次に読んだときだけ載るのに対し、コマンド側は消えない。実測の内訳は `docs/maintainers/file-edits-rationale.md` → "
|
|
70
|
+
インタプリタで書き戻す形は、編集後の本文が**コマンド本文とファイルの両方**に載る。さらに悪いのは持続性である。**コマンド本文は、書いた時点以降のすべてのリクエストで読み直される。** ランの序盤に書いた編集スクリプトほど、そのランの残り全リクエストぶん課金され続ける。ファイル側は次に読んだときだけ載るのに対し、コマンド側は消えない。実測の内訳は `docs/maintainers/file-edits-rationale.md` → "Measured breakdown of command text"。
|
|
71
71
|
|
|
72
72
|
### なぜ resident に置くか
|
|
73
73
|
|
|
74
|
-
根拠は `docs/maintainers/file-edits-rationale.md` → "
|
|
74
|
+
根拠は `docs/maintainers/file-edits-rationale.md` → "Why it is resident"。
|
|
75
75
|
|
|
76
76
|
### マーカーテスト
|
|
77
77
|
|
|
78
|
-
固定している内容は `docs/maintainers/file-edits-rationale.md` → "
|
|
78
|
+
固定している内容は `docs/maintainers/file-edits-rationale.md` → "Marker tests"。
|
|
@@ -12,6 +12,6 @@
|
|
|
12
12
|
- **entry read** — コマンド起動時に読む文書の集合。`pnpm josh read:set` がその集合と費用を答える。→ `.claude/skills/workflow-commands/SKILL.md` → "Which file to read"
|
|
13
13
|
- **oracle** — 機械的に読める入力だけから規則の答えを計算するコマンド。一覧は `pnpm josh oracle:list`。→ `prompts/collaboration-workflow/residency.md` → "第 0 問"
|
|
14
14
|
- **interrupt** — WIP 上限を超えても起票できる、3 条件で決まる発見。別パッケージ起因の上流起票(割り込み Issue)とは別の区分。→ `prompts/collaboration-workflow/wip-cap.md` → "割り込み起票"、`prompts/collaboration-workflow/upstream-interrupt.md` → "別パッケージ起因の問題は割り込み Issue で対応する"
|
|
15
|
-
- **Tier** — 判断点の 3 区分。A は可逆で自分で決める、B は拮抗していて人に聞く、C は不可逆・共有状態で明示指示が要る。→ `CLAUDE.md` → "Decision autonomy"、`prompts/collaboration-workflow/operating-rules.md` → "
|
|
15
|
+
- **Tier** — 判断点の 3 区分。A は可逆で自分で決める、B は拮抗していて人に聞く、C は不可逆・共有状態で明示指示が要る。→ `CLAUDE.md` → "Decision autonomy"、`prompts/collaboration-workflow/operating-rules.md` → "decision-autonomy"
|
|
16
16
|
- **carry** — `backlogrun` の 1 回の起動の予算と進捗を、セッション cut をまたいで引き継ぐ記録(`pnpm josh run:carry`)。→ `.claude/skills/workflow-commands/backlogrun-steps.md` → "The session cut is inside the invocation"
|
|
17
17
|
- **wave** — エピックの子をまとめて並行実行する組。仕組みではなく、依存宣言で表す形。→ `.claude/skills/epic-commands/execution-waves.md` → "Execution waves — parallel, then one alone, then the rest"
|
|
@@ -25,16 +25,16 @@
|
|
|
25
25
|
|
|
26
26
|
### 指示されていない行動は取らない
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
規則そのもの — 共有状態に影響する操作はその場で明示指示されたものだけ実行し、マージを認可するのはどのコマンドの起動か — は `CLAUDE.md` → "Git Rules" に常駐している。ここに書くのは、その規則を実行するときの細則である。対象には共有ブランチへの push・外部通知の追加送信・リポジトリ設定の変更も含まれる。
|
|
29
29
|
|
|
30
|
-
-
|
|
30
|
+
- auto-merge の本文は [`followup.md`](../../.claude/skills/workflow-commands/followup.md)、`backlogrun` の子への継承は [`backlogrun-child.md`](../../.claude/skills/workflow-commands/backlogrun-child.md)
|
|
31
31
|
- `kickoff` / `pnpm josh followup` 単独実行は文書化されたスコープで終了する。PR が OPEN のまま完了したら状態を報告して停止する
|
|
32
32
|
- 「チェックが全部 green だから次のステップに進む」は承認ではない
|
|
33
|
-
- **deny と配送ガードは実装であって規則ではない。** `gh pr merge`・force push・ブランチ削除の直接実行は `.claude/settings.json` の `permissions.deny` と `pnpm josh rule:guard` が拒否する(一覧は各ファイルと [`rule-delivery.md`](./rule-delivery.md)
|
|
33
|
+
- **deny と配送ガードは実装であって規則ではない。** `gh pr merge`・force push・ブランチ削除の直接実行は `.claude/settings.json` の `permissions.deny` と `pnpm josh rule:guard` が拒否する(一覧は各ファイルと [`rule-delivery.md`](./rule-delivery.md) →「配送されている規則」)が、それらは規則より狭い — 取りこぼす綴りを禁じ、ツールが通したことを許可と読ませないのは `CLAUDE.md` → "Git Rules" である。`fullrun` の auto-merge は `pnpm josh followup` の内部から gh を起動するため影響を受けない
|
|
34
34
|
- **共有状態に影響する操作(このセクションの対象=Tier C)は迷ったら確認する。** 確認のコストは低いが、意図しない操作の巻き戻しは高コスト
|
|
35
35
|
- ただしこの「迷ったら確認」は Tier C に限る。**可逆な実装・設計判断(Tier A)は別ルール**(下記「意思決定の自律ポリシー」)に従う
|
|
36
36
|
|
|
37
|
-
### git index を勝手に変更しない(自律 staging の禁止)
|
|
37
|
+
### no-self-staging — git index を勝手に変更しない(自律 staging の禁止)
|
|
38
38
|
|
|
39
39
|
規則そのもの — index はユーザーのスナップショットであり、自分の判断でステージ・コミットしない — は `CLAUDE.md` → "Git Rules" に常駐している。ここに書くのは、その規則を実行するときの細則である。index には履歴がなく、上書きされた直前のステージ状態は復元できない(経緯は `docs/maintainers/operating-rules-rationale.md` → "Why the index is the user's")。
|
|
40
40
|
|
|
@@ -49,17 +49,25 @@ PR マージ・ブランチ削除・force push・共有ブランチへの push
|
|
|
49
49
|
- 上記以外で staging が必要だと考えたときは、**実行せずに先に確認する**
|
|
50
50
|
- **レーンの中で競合を解決したあとの「解決済み」の記録は、ケース 2 に含まれる(Tier A)。** レーンは run 専用の作業ツリーで、守るべき利用者の staging はない。利用者に `git add` の許可を求めず、`pnpm josh git -y` で記録する。手順は `.claude/skills/workflow-commands/chain-rule.md` →「origin/main is merged in before the gate」の 1 か所にだけ書く(joshuafolkken/kit#2445)
|
|
51
51
|
- 同じ理由で、`git reset` / `git checkout -- <path>` / `git restore <path>` など index や作業ツリーを破壊的に書き換える操作も、自分の判断で実行しない
|
|
52
|
-
- **`git stash`
|
|
52
|
+
- **`git stash` は例外的に、次の明文化されたフローの中でのみ自動実行してよい**:
|
|
53
|
+
1. `fullrun new` / `halfrun new` の手順 5(作業ツリーに変更がある状態で `josh latest` を回す前の退避)
|
|
54
|
+
2. `backlogrun` のラン開始時の `josh latest`
|
|
55
|
+
3. 「別パッケージ起因の問題は割り込み Issue で対応する」
|
|
56
|
+
4. `backlogrun` が epic の子を始める前の preflight(`pnpm josh run:hold <N>` が `reclaim` と答えたときの回収 — joshuafolkken/kit#926, joshuafolkken/kit#1965)
|
|
57
|
+
|
|
58
|
+
**4 番目だけが復元を伴わない。1〜3 はいずれも直後に `pnpm josh stash:pop "<メッセージ>"` で復元することが手順に含まれている**(stash はリポジトリ単位の 1 本のスタックを全 work tree が共有するため、位置指定や引数なしの `git stash pop` は別のレーンが最後に積んだ stash を取り込む — メッセージで対象を特定する。joshuafolkken/kit#2050)。 回収するのは異常終了したランの置き土産であって、いま実行中のランの作業ではないから、pop して戻す先がない。**代わりに stash を子の Issue にコメントで記録する** — 前提 Issue で中断するときの stash(`prerequisite.md`)と同じく、**その記録だけが後で pop させられる唯一の手がかり**であり、記録し忘れた stash は誰にも拾われない。これら以外の場面で退避したくなったときは、実行せずに先に確認する
|
|
59
|
+
|
|
53
60
|
- **staging・index の書き換え・`git commit` の直接実行は deny されており、deny には「そのターンでユーザーが明示指示した」という例外がない。** だから上記ケース 1 は AI 側では実行できず、ユーザー自身の端末で実行してもらう。ユーザーが明示的にコミットを指示した場合も、承認済みのコミットは `pnpm josh git` を通す(理由は `docs/maintainers/operating-rules-rationale.md` → "Why the index is the user's")
|
|
54
|
-
-
|
|
61
|
+
- index を守る deny と `pnpm josh rule:guard`(`worktree-mutation`・`index-mutation`・`destructive-command`・`protected-file` 行)も事故防止の実装である — 上記「指示されていない行動は取らない」→「deny と配送ガードは実装であって規則ではない」
|
|
55
62
|
|
|
56
|
-
### 意思決定の自律ポリシー(確認停止を減らす)
|
|
63
|
+
### decision-autonomy — 意思決定の自律ポリシー(確認停止を減らす)
|
|
57
64
|
|
|
58
|
-
3 層の定義(Tier A / B / C)、起票した Issue の epic 所属と自己修正が Tier A であること、自動判断の記録先は `CLAUDE.md` → "Decision autonomy
|
|
65
|
+
3 層の定義(Tier A / B / C)、起票した Issue の epic 所属と自己修正が Tier A であること、自動判断の記録先は `CLAUDE.md` → "Decision autonomy" に常駐している。ここに書くのは、その境界の細則である。
|
|
59
66
|
|
|
60
67
|
- **A と B の判定基準**: 確認するのは「差が僅差 **かつ** 後戻りしにくい/アーキテクチャに長く影響する」ときだけ。「迷っている」だけでは停止理由にならない — 明確に優位な選択肢は多少の不確実性が残っても自動で選び、僅差でも安価に巻き戻せる選択は自動で決めて記録して進む
|
|
61
68
|
- **起票した Issue の所属先は、候補が複数の epic に散っていても Tier B ではない**(joshuafolkken/kit#1339)。`epic --add` 1 回で移せるので推奨する 1 つを選び、採用・却下・理由・決定日を Issue と epic の両方に記録して進む。止まるのは 2 つの epic が本当に甲乙つけがたいときだけである
|
|
62
69
|
- **自己修正**は設計判断ではなく後始末である — 自分が公開した成果物の事実誤り(誤った帰属を含む)の訂正と、同じセッションで自分が特定した自分の作業の抜けの穴埋め(例: 欠けていると自分で指摘した相互リンクの追加)。どちらも可逆で、望ましい結果が 1 つしかなく、問題を迂回せず既に行った作業を修復するだけなので、回避策のリスクはない
|
|
63
|
-
- **「相談と実行を区別する」との境界**: ここでの Tier A は **すでに承認され実行された作業を完了・修復する**ことに限られる。目標の表明(「〜したい」)や進め方への問い(「どうすべき?」)に対して勝手に動いてよい、という意味ではない(→ `principles.md` → "
|
|
70
|
+
- **「相談と実行を区別する」との境界**: ここでの Tier A は **すでに承認され実行された作業を完了・修復する**ことに限られる。目標の表明(「〜したい」)や進め方への問い(「どうすべき?」)に対して勝手に動いてよい、という意味ではない(→ `principles.md` → "consult-vs-execute")
|
|
64
71
|
- **Tier C との境界**: 自分のコメントの訂正は Tier A。マージ・ブランチ削除・force push・スコープ外の変更は、**その問題を招いたのが自分自身であっても** Tier C のまま。確認を外しても監査証跡は外さない
|
|
72
|
+
- **major のバージョン bump は Tier C**: `pnpm josh bump major` は自分の判断で実行せず、提案もしない。破壊的な変更に見えても既定は minor / patch で、major はユーザーがそのターンで明示したときだけ(0.x の major は 1.0.0 になり、戻せない公開を伴う)
|
|
65
73
|
- **自動判断の記録の書き方**: Issue 駆動ワークフロー内では `pnpm josh issue:comment <N> --body-file <path>` で、採用案・不採用の代替案・なぜ採用案が明確に優位かを記載する
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
2. **コード内コメント、テストタイトル(`describe` / `it` / `expect`)、コミットメッセージ**。
|
|
27
27
|
3. **スクリプトが出力する固定文字列**: Telegram のヘッダーラベル(`Planning` / `Completion` など)、`Issue:` / `PR:` の URL ラベル、`--notify-message` 省略時の既定メッセージ。
|
|
28
28
|
|
|
29
|
-
`JOSH_SESSION_LANG` は **開発者個人の設定**であり、`.env`(gitignore 済み・非コミット)に置く。**解決値は毎ターン、`UserPromptSubmit` フック(`
|
|
29
|
+
`JOSH_SESSION_LANG` は **開発者個人の設定**であり、`.env`(gitignore 済み・非コミット)に置く。**解決値は毎ターン、`UserPromptSubmit` フック(`scripts/hooks/run-hook.sh session-lang`)がコンテキストへ差し込む。** Codex も `.codex/hooks.json` で同じフックを実行する。フックが走らないハーネス(Gemini / Cursor)は `.env` を読んで解決する。各既定の理由は `docs/maintainers/overview-rationale.md` → "Why the session language defaults the way it does" にある。
|
|
30
30
|
|
|
31
31
|
### 配布ドキュメントの層ごとの言語(joshuafolkken/kit#2997)
|
|
32
32
|
|
|
@@ -38,4 +38,4 @@
|
|
|
38
38
|
| `prompts/` のトピックファイル(次の行の 3 文書を除く) | 日本語 |
|
|
39
39
|
| `prompts/review.md`、`prompts/review-rubric.md`、`prompts/sonar-hotspot-handling.md` | 英語 |
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
英語の層から日本語のトピックファイルの節を指すポインターは、見出しの先頭に置いた**英語 ID** を引く(例: 見出し `## no-clones — クローン禁止・…` を `principles.md` → "no-clones" で指す)。`pnpm josh doc:section` は見出しの前方一致で節を引くので、ID だけで解決し、`JOSH_SESSION_LANG=en` の利用者や日本語を読まないエージェントにも参照先が読める。ID の無い日本語見出しは原文のまま引く。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**このファイルは、`CLAUDE.md` の Communication 節が指す 7 つの原則の単一ソースである。** 各節は `CLAUDE.md` から `prompts/collaboration-workflow/principles.md` → "見出し" の形で引かれ、`pnpm josh doc:section` で解決する。経緯と適用例は各節が指す [`docs/maintainers/principles-rationale.md`](../../docs/maintainers/principles-rationale.md) の節にあり、実行中には読まない。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## no-clones — クローン禁止・単一ソース化
|
|
6
6
|
|
|
7
7
|
既存の非自明なロジックを「ソースを変えずに済ませる」ために**コピー・移植・再実装することは既定で禁止**する。すでにどこか(別ファイル・別モジュール・別**パッケージ=上流依存を含む**)に存在するロジックを複製しようとした瞬間が、**単一ソース化**(全消費者が import する共有モジュール/export/パッケージ)のシグナルである。コピーではなく単一ソース化する。
|
|
8
8
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
**計測は `pnpm josh clone:scan`。** 同一リポジトリ内および `JOSH_REPO_PATHS` の他リポジトリを跨いだ複製を検出し、**件数**と各複製の `file:line`(`[same-file|cross-file|cross-repo]` 分類つき、複製なしは `clean`)を印字する。`pnpm josh oracle:list` に載る決定オラクルでもある(導入の経緯は `docs/maintainers/principles-rationale.md` → "Why clone:scan exists")。
|
|
15
15
|
|
|
16
|
-
## 設計はエレガント・シンプルを第一目標にする
|
|
16
|
+
## elegant-design — 設計はエレガント・シンプルを第一目標にする
|
|
17
17
|
|
|
18
18
|
新しい仕組み(フック・ガード・ルール・抽象化)を足す前に、**原因側を直せばその仕組みが要らなくならないか**を先に問う。要らなくなるなら、足さない。症状を叱る仕組みを重ねるのではなく、症状を生んでいる材料を断つ。
|
|
19
19
|
|
|
@@ -22,18 +22,20 @@
|
|
|
22
22
|
|
|
23
23
|
**書かれたコードの可読性**(意図が伝わる命名、過度な抽象化を避ける、など)は `prompts/coding-standards.md` の担当で、こちらは**設計時にどの仕組みを足すか・どこへ置くかを決める**規則。両者は別レイヤーなので、片方の本文をもう片方へ写さず、互いを指すだけにする。
|
|
24
24
|
|
|
25
|
-
##
|
|
25
|
+
## consult-vs-execute — 相談と実行を区別する
|
|
26
26
|
|
|
27
27
|
ユーザーが「どう進めるべきか」「何をすべきか」「なぜそうなったか」を尋ねたり、目標・願望を述べたりした(「どうすべき?」「how should we…」「なぜ」「理由を知りたい」「〜したい」「〜の方が良い?」)ときは、**分析と推奨のみ**で応答する。ファイル編集・Issue 作成・その他の具体的アクションは取らない。
|
|
28
28
|
|
|
29
|
-
- 具体的アクションを取ってよいのは、明示的な命令(「do it」「書き換えて」「作成して」「implement」)またはワークフローキーワード(`kickoff` / `halfrun` / `fullrun` / `backlogrun`)があるときだけ
|
|
30
|
-
-
|
|
29
|
+
- 具体的アクションを取ってよいのは、明示的な命令(「do it」「書き換えて」「作成して」「implement」)またはワークフローキーワード(`kickoff` / `halfrun` / `prrun` / `fullrun` / `backlogrun`)があるときだけ
|
|
30
|
+
- 発言が相談か実行の指示か判別できないときは、相談として扱う — 分析と推奨を返し、実行の指示を待つ。実行が指示されたあとの判断点で確認するかどうかは、この規則ではなく `CLAUDE.md` → "Decision autonomy" の Tier で決まる
|
|
31
31
|
- **目標の表明は「計画の依頼」であって「実行の承認」ではない**
|
|
32
32
|
|
|
33
|
-
## 最新優先・fix-forward(pin-back は最終手段)
|
|
33
|
+
## latest-first — 最新優先・fix-forward(pin-back は最終手段)
|
|
34
34
|
|
|
35
35
|
依存パッケージ・ツールチェーンは**既定で最新版を採用する**。バンプが lint クラッシュ・新規有効化ルール・型エラーなどの破壊を引き起こしても、古いバージョンへ留まる/戻すことを既定の「安全策」にしてはならない。破壊は**前向きに(fix-forward)速やかに**解消する。
|
|
36
36
|
|
|
37
|
+
この節が単一ソースで、`dependency-update` skill → "4. When the bump breaks something — fix forward" はここを指す。
|
|
38
|
+
|
|
37
39
|
1. **最新優先(latest-first)**: 依存・ツールチェーンは新しいバージョンを既定で採用する。適応の手間を避けるためだけに古いバージョンに留まったり戻したりしない
|
|
38
40
|
2. **破壊は fix-forward**: バンプで lint クラッシュ・新規ルール・型エラー等が出たら、前向きに解消する:
|
|
39
41
|
- 新ルール/エラーが正当なら **消費者コードを直す**
|
|
@@ -43,7 +45,7 @@
|
|
|
43
45
|
4. **既存の保護を尊重する**: fix-forward は保護された pin を黙って書き換える許可ではない。overrides と `devEngines` の承認ゲートの単一ソースは `CLAUDE.md` → "Dependency overrides" と `dependency-update` skill である
|
|
44
46
|
5. **タイムリーに**: バンプ起因の破壊は、可能な限り同じ作業セッション内で速やかに対処し、pin の裏に先送りしない
|
|
45
47
|
|
|
46
|
-
## 恒久ルールは MEMORY ではなくプロンプト/ドキュメントに書く
|
|
48
|
+
## durable-rules — 恒久ルールは MEMORY ではなくプロンプト/ドキュメントに書く
|
|
47
49
|
|
|
48
50
|
今後のセッションでも守るべき恒久的な振る舞いのルールに気付いたときは、**kit が配布するプロンプト/ドキュメント**(`CLAUDE.md` / `prompts/*`)への変更として記述する。プロジェクト単位の自動 MEMORY(例: `~/.claude/projects/<repo-slug>/memory/`)への保存で済ませてはならない。
|
|
49
51
|
|
|
@@ -57,18 +59,18 @@
|
|
|
57
59
|
3. 消費者リポジトリで気付いた場合は、ローカル編集ではなく kit 側へ Issue/PR として上流化する
|
|
58
60
|
4. 既に MEMORY にあるルールが実は共有すべきものだと分かったときは、プロンプト/ドキュメントへ移し、MEMORY 側の重複エントリは削除する
|
|
59
61
|
|
|
60
|
-
## 配布ドキュメント・設定の変更は kit に上流化する
|
|
62
|
+
## upstream-to-kit — 配布ドキュメント・設定の変更は kit に上流化する
|
|
61
63
|
|
|
62
64
|
`CLAUDE.md` および kit が配布する他のドキュメント/設定は、kit から単一ソースで配布される。
|
|
63
65
|
|
|
64
66
|
- **消費者リポジトリ(app-kit / game-kit)ではこれらをローカル編集しない**: `josh sync` が編集を上書きするうえ、変更は本来上流(kit)に属する。ドキュメント/設定を編集する前に、それが配布物かどうかを確認し、配布物なら kit 側に変更を提案(Issue/PR)する
|
|
65
67
|
- **kit リポジトリ自身ではあなたが配布元**なので、ここでは編集してよい。編集先は `CLAUDE.md` 1 本である(次節)
|
|
66
68
|
|
|
67
|
-
## エージェント規則の単一ソースは `CLAUDE.md`(`AGENTS.md` / `GEMINI.md` は導線)
|
|
69
|
+
## エージェント規則の単一ソースは `CLAUDE.md`(`AGENTS.md` / `GEMINI.md` / `.cursorrules` は導線)
|
|
68
70
|
|
|
69
|
-
**規則の本体は `CLAUDE.md` にしか無い。** `AGENTS.md
|
|
71
|
+
**規則の本体は `CLAUDE.md` にしか無い。** `AGENTS.md`・`GEMINI.md`・`.cursorrules` は「規則は `CLAUDE.md` にある。作業前に全文を読むこと」と「規則を書き戻さない」だけを書いた短い導線文書であり、規則を 1 行も持たない(`.cursorrules` は Svelte MCP の使い方の案内だけを足す)。
|
|
70
72
|
|
|
71
|
-
- **規則の追加・仕様変更・文言修正・節の追加は `CLAUDE.md` に 1 回だけ書く。**
|
|
73
|
+
- **規則の追加・仕様変更・文言修正・節の追加は `CLAUDE.md` に 1 回だけ書く。** 導線文書には触れない
|
|
72
74
|
- **導線文書に規則を書き戻さない。** そこに書かれた規則は、次の改訂で更新し忘れる 4 つ目の置き場になる
|
|
73
75
|
- 経緯と機械的な検査は `docs/maintainers/principles-rationale.md` → "Why AGENTS and GEMINI are pointers"、`@CLAUDE.md` 行と他ツールでの未検証は `docs/maintainers/principles-rationale.md` → "The include line, and what has not been verified"
|
|
74
76
|
|
|
@@ -78,5 +80,5 @@
|
|
|
78
80
|
|
|
79
81
|
- **フック**: フックが走らない、または出力が見えないツールでは、フックが届ける規則を自分で適用する。その一覧は手書きせず、[`rule-delivery.md`](./rule-delivery.md) →「配送されている規則」の一覧を正とする — 一覧の各項目が、そのツールでは自分で守る規則である。一覧の外でフックが担う 3 つも同じく自分で行う — 最初の実行時コード編集の前に Step 0 の作業サマリを提示する、編集ごとの整形フックに頼らず編集後に `pnpm josh lint:related` と `pnpm josh cspell:dot` を走らせる、`JOSH_SESSION_LANG` は注入を待たずに `.env` から解決する。フックの全体は `.claude/settings.json` の `hooks` が正である
|
|
80
82
|
- **Skill・`/verify-ui`・`/code-review`**: `CLAUDE.md` が skill のロードやサブエージェントでの実行を指示する箇所では、その skill の `SKILL.md` を読み、自分のセッションで従う
|
|
81
|
-
- **`.claude/settings.json` の deny list**
|
|
83
|
+
- **`.claude/settings.json` の deny list** は効かない。それが裏付ける `CLAUDE.md` → "Git Rules" はそのまま拘束する
|
|
82
84
|
- **`AskUserQuestion`** は、ユーザーに平文で尋ねることを指す
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
|
|
69
69
|
### 変更対象はまとめて読んでから編集する(joshuafolkken/kit#2202)
|
|
70
70
|
|
|
71
|
-
**「変更とテスト」が変更対象ファイルを列挙した直後、それらを 1 回の `pnpm josh read:files <path> [<path> ...]` で読み、続く独立した編集は 1 回の `pnpm josh edit:files -` で送る**(形式は `docs/josh-commands-
|
|
71
|
+
**「変更とテスト」が変更対象ファイルを列挙した直後、それらを 1 回の `pnpm josh read:files <path> [<path> ...]` で読み、続く独立した編集は 1 回の `pnpm josh edit:files -` で送る**(形式は `docs/josh-commands-run.md` →「`josh edit:files`」)。**個別の `Edit` に戻すのは**、前の編集結果に依存する編集(`dependent` で拒否される)、編集が 1 件だけのとき、ファイル全体を書くとき(`Write`)の 3 つ。根拠は [`turn-batching.md`](turn-batching.md) →「実装中の独立編集に効く合成コマンド」。
|
|
72
72
|
|
|
73
73
|
### 完了報告(セッション向け)
|
|
74
74
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## 常駐ドキュメントと skill の分担(何を常駐に残すか)
|
|
2
2
|
|
|
3
|
-
**規則をどこに書くか、常駐にどこまで残すかの判定は、このファイルが単一ソースである**(joshuafolkken/kit#2891
|
|
3
|
+
**規則をどこに書くか、常駐にどこまで残すかの判定は、このファイルが単一ソースである**(joshuafolkken/kit#2891)。`CLAUDE.md` はすべてのエージェント規則の入口で、`AGENTS.md` / `GEMINI.md` / `.cursorrules` はそこへの導線である。規則のトリガは `CLAUDE.md` に **1 度だけ**、手順と数値は導線の先に **1 度だけ**書く。`CLAUDE.md` の経緯は `docs/maintainers/claude-md-history.md` にある。**規則を散文で書く前に**、下の問いで置き場所を決める — 計算できる答えは `pnpm josh oracle:list` のコマンドへ、順序は `pnpm josh run:step` へ。**読むのは規則を置く・移す・引退させるターンだけ**である。`CLAUDE.md` は毎ターン全文が読み込まれ、上限は `scripts/document/resident-budget.ts` の `RESIDENT_CEILING_BYTES`(残りは `pnpm josh bytes CLAUDE.md`)。**置き場所は書き手の重要度判断ではなく、下の 4 つの問いを順に当てて決める。** 経緯・一覧・作例は `docs/maintainers/residency-rationale.md` にある。
|
|
4
4
|
|
|
5
5
|
### 第 0 問(先に問う)
|
|
6
6
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## なぜ配送が要るのか
|
|
6
6
|
|
|
7
|
-
常駐の経路は実効上限で詰まっており、配送は該当する瞬間だけのコストで届き、拒否は読み飛ばせず、発火を単体テストで固定できる。経緯: `docs/maintainers/rule-delivery-rationale.md`
|
|
7
|
+
常駐の経路は実効上限で詰まっており、配送は該当する瞬間だけのコストで届き、拒否は読み飛ばせず、発火を単体テストで固定できる。経緯: `docs/maintainers/rule-delivery-rationale.md` → "Why delivery is needed"。
|
|
8
8
|
|
|
9
9
|
## 判定基準 — 引き金を特定できるか
|
|
10
10
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
## 機構 — 1 本だけ、新規に作らない
|
|
14
14
|
|
|
15
|
-
配送はすべて 1 つの土台に載り、入口はイベントごとに 2 つある。`PreToolUse` の入口が `pnpm josh pretool:guard`(バッチング / 調査 / 規則の 3 ガードを 1 プロセスで合成)、Stop フックの入口が `pnpm josh stop:guard` である。**2 本目の配送経路を作るのは `CLAUDE.md` →「No clones」が禁じるクローン**である。配線・停止スイッチ・拒否の優先順位: `docs/maintainers/rule-delivery-rationale.md`
|
|
15
|
+
配送はすべて 1 つの土台に載り、入口はイベントごとに 2 つある。`PreToolUse` の入口が `pnpm josh pretool:guard`(バッチング / 調査 / 規則の 3 ガードを 1 プロセスで合成)、Stop フックの入口が `pnpm josh stop:guard` である。**2 本目の配送経路を作るのは `CLAUDE.md` →「No clones」が禁じるクローン**である。配線・停止スイッチ・拒否の優先順位: `docs/maintainers/rule-delivery-rationale.md` → "The mechanism"。
|
|
16
16
|
|
|
17
17
|
## 配送されている規則
|
|
18
18
|
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
- **バックログ WIP 上限**(`wip-cap.md`)
|
|
28
28
|
- 発火点: `pnpm josh rule:guard` — Issue を起票する `Bash`(`pnpm josh issue:file`)
|
|
29
29
|
- 発火しないとき: Issue が起票されていない = 上限に触れる行為が無い
|
|
30
|
-
- **直接起票の禁止**(`docs/josh-commands-
|
|
30
|
+
- **直接起票の禁止**(`docs/josh-commands-backlog.md` → `josh issue:file`、joshuafolkken/kit#2808)
|
|
31
31
|
- 発火点: `pnpm josh rule:guard` — `josh issue:file` を通さずに Issue を作成する `Bash`(`gh issue create`、または `…/issues` への `title` 付き POST)。拒否文は `pnpm josh issue:file` の書式を渡す。**毎回発火する**
|
|
32
32
|
- 発火しないとき: `pnpm josh issue:file` で起票している = 重複探し・本文の検査・`epic:bundle` までの全段がそろっている
|
|
33
33
|
- **1 ラン 10 件の起票上限**(`.claude/skills/workflow-commands/prerequisite.md`、`observation-filing.md`)
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
- 発火しないとき: Issue を読んでいない、または最初から `--comments` / `--json comments` / `…/comments` で読んでいる
|
|
39
39
|
- **本文をシェルに載せない**(`shell-body.md`)
|
|
40
40
|
- 発火点: `pnpm josh rule:guard` — 二重引用符の本文値(`-f body="…"` / `-f "body=…"` / `--body "…"` / `--notify-message "…"`)にバッククォートか `$` を含む `Bash`
|
|
41
|
-
- 発火しないとき: 本文がシェルに評価されない = 規則は既に守られている(経緯: `docs/maintainers/rule-delivery-rationale.md`
|
|
41
|
+
- 発火しないとき: 本文がシェルに評価されない = 規則は既に守られている(経緯: `docs/maintainers/rule-delivery-rationale.md` → "Shell evaluation of a body is one more row of the same mechanism")
|
|
42
42
|
- **@path をリテラル投稿する誤射**(`shell-body.md`、joshuafolkken/kit#2304)
|
|
43
43
|
- 発火点: `pnpm josh rule:guard` — 生フィールド(`-f` / `--raw-field`)で `body=@<path>` を渡した `Bash`。**毎回発火する**
|
|
44
44
|
- 発火しないとき: `-F` / `--field body=@`・`@` を含まない本文・`pnpm josh issue:comment` = リテラルの `@path` が送出されない
|
|
@@ -112,8 +112,8 @@
|
|
|
112
112
|
|
|
113
113
|
## 配送は 1 ラン 1 回
|
|
114
114
|
|
|
115
|
-
配送文は**ラン 1 回につき 1 度**しか出ない — 2 度目も拒否すれば、規則に従った直後の呼び出しを止めてしまう。だから**配送文には「同じ呼び出しをもう一度出せ」と明記する**。例外は 2 つで、繰り返す行為を止める項目は毎回発火し(joshuafolkken/kit#1570)、前提の行為を求める項目は前提が末尾に現れるまで毎回拒否する(joshuafolkken/kit#2807)。これとは別に、バッチングと調査の 2 ガードは同じ呼び出しを二度拒否しないまま、違反が間隔分続けば再び発火する(joshuafolkken/kit#2164)— 1 回きりの注意ではない。先の 2 つの例外の配送文には「同じ呼び出しをもう一度出せ」ではなく、それぞれ「これは毎回発火する」「前提が末尾に現れるまで拒否する」と明記する — 1 回きりと読まれると、再発行すれば通ると誤解される。前提の証拠を読めないときは拒否を基本とする。経緯と意図した通過例外: `docs/maintainers/rule-delivery-rationale.md`
|
|
115
|
+
配送文は**ラン 1 回につき 1 度**しか出ない — 2 度目も拒否すれば、規則に従った直後の呼び出しを止めてしまう。だから**配送文には「同じ呼び出しをもう一度出せ」と明記する**。例外は 2 つで、繰り返す行為を止める項目は毎回発火し(joshuafolkken/kit#1570)、前提の行為を求める項目は前提が末尾に現れるまで毎回拒否する(joshuafolkken/kit#2807)。これとは別に、バッチングと調査の 2 ガードは同じ呼び出しを二度拒否しないまま、違反が間隔分続けば再び発火する(joshuafolkken/kit#2164)— 1 回きりの注意ではない。先の 2 つの例外の配送文には「同じ呼び出しをもう一度出せ」ではなく、それぞれ「これは毎回発火する」「前提が末尾に現れるまで拒否する」と明記する — 1 回きりと読まれると、再発行すれば通ると誤解される。前提の証拠を読めないときは拒否を基本とする。経緯と意図した通過例外: `docs/maintainers/rule-delivery-rationale.md` → "One delivery per run"。
|
|
116
116
|
|
|
117
117
|
## マーカーテスト
|
|
118
118
|
|
|
119
|
-
各項目を固定するスイートの一覧: `docs/maintainers/rule-delivery-rationale.md`
|
|
119
|
+
各項目を固定するスイートの一覧: `docs/maintainers/rule-delivery-rationale.md` → "Marker tests"。
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
gh api repos/{owner}/{repo}/issues/1535/comments -f body="… `pnpm josh ms` は …"
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
zsh は `pnpm josh ms` を実行し、その標準出力を本文に埋め込む。`pnpm josh followup --notify-message "…"` の本文も同じ根で壊れる。事故の経緯は `docs/maintainers/shell-body-rationale.md`
|
|
13
|
+
zsh は `pnpm josh ms` を実行し、その標準出力を本文に埋め込む。`pnpm josh followup --notify-message "…"` の本文も同じ根で壊れる。事故の経緯は `docs/maintainers/shell-body-rationale.md` → "The incidents — two kinds of damage, one cause"。
|
|
14
14
|
|
|
15
15
|
- **通知経路**: 置換結果が本文に混ざる。壊れ方が静かで、`followup` は正常終了する
|
|
16
16
|
- **`gh` 経路**: 置換された結果が捨てられるのではなく、**コマンドとして実行される**
|
|
@@ -26,7 +26,7 @@ zsh は `pnpm josh ms` を実行し、その標準出力を本文に埋め込む
|
|
|
26
26
|
| `!` | 発火しない(履歴展開は非対話では無効) |
|
|
27
27
|
| `\$` / `` \` `` | 発火しない(直前のバックスラッシュがリテラル化する) |
|
|
28
28
|
|
|
29
|
-
`!` は引き金に入れていない。理由は `docs/maintainers/shell-body-rationale.md`
|
|
29
|
+
`!` は引き金に入れていない。理由は `docs/maintainers/shell-body-rationale.md` → "Why `!` is not a trigger"。
|
|
30
30
|
|
|
31
31
|
### 安全な書き方
|
|
32
32
|
|
|
@@ -39,7 +39,7 @@ pnpm josh followup "<title> #<N>" --notify-message-file <path>
|
|
|
39
39
|
pnpm josh notify --task-type confirmation --issue-url "<url>" --body-file <path>
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
**PR コメントも同じ経路である** — REST では pull request のコメントは issue のコメントであり、`pnpm josh issue:comment <N> --body-file <path>` がそのまま使える。`gh issue comment` / `gh pr comment` は使わない(GraphQL 経由。理由は `docs/maintainers/shell-body-rationale.md`
|
|
42
|
+
**PR コメントも同じ経路である** — REST では pull request のコメントは issue のコメントであり、`pnpm josh issue:comment <N> --body-file <path>` がそのまま使える。`gh issue comment` / `gh pr comment` は使わない(GraphQL 経由。理由は `docs/maintainers/shell-body-rationale.md` → "Why no `gh` subcommand is written in an executable block")。
|
|
43
43
|
|
|
44
44
|
### コメント投稿は `pnpm josh issue:comment` の 1 綴りだけ(joshuafolkken/kit#2304)
|
|
45
45
|
|
|
@@ -48,17 +48,17 @@ pnpm josh notify --task-type confirmation --issue-url "<url>" --body-file <path>
|
|
|
48
48
|
- `gh api ... -F body=@<path>` / `--field body=@<path>` — `@` で始まる値を**ファイルとして読む**。正しい
|
|
49
49
|
- `gh api ... -f body=@<path>` / `--raw-field body=@<path>` — 値を**そのまま送る**。`@<path>` というリテラル文字列がコメントとして投稿される
|
|
50
50
|
|
|
51
|
-
`-f` と `-F` は 1 文字違いで、どちらでも `gh` は終了コード 0 でコメント URL を返す。**壊れたことが分かるのは後で人が Issue を見たときだけ**である(`docs/maintainers/shell-body-rationale.md`
|
|
51
|
+
`-f` と `-F` は 1 文字違いで、どちらでも `gh` は終了コード 0 でコメント URL を返す。**壊れたことが分かるのは後で人が Issue を見たときだけ**である(`docs/maintainers/shell-body-rationale.md` → "The comments lost to `-f body=@`")。
|
|
52
52
|
|
|
53
53
|
だから **Issue/PR コメントの投稿は `pnpm josh issue:comment <N> --body-file <path>` ただ 1 綴りに寄せる** — 間違ったフラグを選ぶ余地が無く、本文は `cli-body.ts` を通ってパスで渡るためシェルも評価しない。`-f body=@…` の綴りは実行前に `pnpm josh rule:guard` が拒否する(列挙表の `raw-field-body` 行、`scripts/rules/raw-field-body.ts`)。上の Issue body 書き換え(`-X PATCH ... --field body=@<path>`)は `-F` 側で安全なので綴りを変えない。
|
|
54
54
|
|
|
55
|
-
`--body-file` / `--notify-message-file` はいずれも `-` で標準入力を読む(`gh issue create --body-file -` と同じ約束)。読み取りは `scripts/josh/cli-body.ts` の 1 本だけで、`josh notify` / `josh followup` / `epic --rationale-file` / `epic --decision-file` の 4 つがそれを共有する。**`--body` と `--body-file` の同時指定は拒否する**(`docs/maintainers/shell-body-rationale.md`
|
|
55
|
+
`--body-file` / `--notify-message-file` はいずれも `-` で標準入力を読む(`gh issue create --body-file -` と同じ約束)。読み取りは `scripts/josh/cli-body.ts` の 1 本だけで、`josh notify` / `josh followup` / `epic --rationale-file` / `epic --decision-file` の 4 つがそれを共有する。**`--body` と `--body-file` の同時指定は拒否する**(`docs/maintainers/shell-body-rationale.md` → "Why `--body` and `--body-file` together are refused")。
|
|
56
56
|
|
|
57
57
|
**`$'…'` も安全である。** ANSI-C クォートの中ではコマンド置換も変数展開も起きない。`CLAUDE.md` が Telegram の本文に `--body=$'…'` を指定しているのはそのためであり、この規則はそれを置き換えるものではない。ただし本文が長くなるほどファイルの方が扱いやすい。
|
|
58
58
|
|
|
59
59
|
### 引き金つき配送
|
|
60
60
|
|
|
61
|
-
`pnpm josh rule:guard` が、二重引用符の本文値にバッククォートか `$` が実際に含まれる `Bash` 呼び出しを拒否して本文を突きつける。拒否されたら本文をファイルに移して出し直す。配線は `docs/maintainers/shell-body-rationale.md`
|
|
61
|
+
`pnpm josh rule:guard` が、二重引用符の本文値にバッククォートか `$` が実際に含まれる `Bash` 呼び出しを拒否して本文を突きつける。拒否されたら本文をファイルに移して出し直す。配線は `docs/maintainers/shell-body-rationale.md` → "Why it is a triggered delivery"、引き金の設計は `docs/maintainers/shell-body-rationale.md` → "Why the trigger reads the body, not the flag"、固定しているテストは `docs/maintainers/shell-body-rationale.md` → "Marker tests"にある。
|
|
62
62
|
|
|
63
63
|
### 引き金が見えないもの
|
|
64
64
|
|