create-einja-app 0.3.1 → 0.3.3

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.
Files changed (120) hide show
  1. package/README.md +34 -1
  2. package/dist/cli.js +92 -80
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +1 -1
  5. package/templates/default/.changeset/config.json +11 -0
  6. package/templates/default/.claude/hooks/einja/plan-mode-skill-loader.sh +27 -0
  7. package/templates/default/.claude/settings.json +29 -1
  8. package/templates/default/.claude/skills/cli-package-specs/SKILL.md +247 -0
  9. package/templates/default/.einja-sync.json +1 -1
  10. package/templates/default/.env.personal.example +6 -2
  11. package/templates/default/.envrc +5 -0
  12. package/templates/default/.github/release.yml +10 -0
  13. package/templates/default/.github/workflows/changeset-status.yml +60 -0
  14. package/templates/default/.github/workflows/deploy-pr-preview.yml +23 -24
  15. package/templates/default/.github/workflows/deploy-stable-branches.yml +336 -100
  16. package/templates/default/.mcp.json +2 -12
  17. package/templates/default/.serena/project.yml +7 -0
  18. package/templates/default/CLAUDE.md +61 -10
  19. package/templates/default/README.md +22 -10
  20. package/templates/default/apps/admin/package.json +1 -1
  21. package/templates/default/apps/admin/tsconfig.json +2 -1
  22. package/templates/default/apps/web/package.json +1 -1
  23. package/templates/default/apps/web/tsconfig.json +2 -1
  24. package/templates/default/docs/plans/.gitkeep +0 -0
  25. package/templates/default/docs/plans/agile-munching-knuth.md +161 -0
  26. package/templates/default/docs/plans/agile-riding-nova.md +158 -0
  27. package/templates/default/docs/plans/agile-wibbling-dusk.md +91 -0
  28. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-a87e67c.md +221 -0
  29. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-ab73a1c.md +107 -0
  30. package/templates/default/docs/plans/ancient-greeting-flamingo.md +120 -0
  31. package/templates/default/docs/plans/ancient-watching-otter.md +152 -0
  32. package/templates/default/docs/plans/bright-sauteeing-bumblebee.md +30 -0
  33. package/templates/default/docs/plans/bright-stargazing-dawn.md +87 -0
  34. package/templates/default/docs/plans/calm-stirring-bonbon.md +196 -0
  35. package/templates/default/docs/plans/calm-watching-widget.md +111 -0
  36. package/templates/default/docs/plans/cheerful-wiggling-ullman.md +164 -0
  37. package/templates/default/docs/plans/compiled-humming-cherny.md +94 -0
  38. package/templates/default/docs/plans/composed-doodling-mountain.md +362 -0
  39. package/templates/default/docs/plans/dapper-launching-lynx.md +81 -0
  40. package/templates/default/docs/plans/dazzling-foraging-cascade.md +32 -0
  41. package/templates/default/docs/plans/effervescent-munching-kite-agent-ac08baf.md +672 -0
  42. package/templates/default/docs/plans/effervescent-munching-kite-agent-aecc373.md +442 -0
  43. package/templates/default/docs/plans/effervescent-munching-kite.md +263 -0
  44. package/templates/default/docs/plans/enchanted-wiggling-ember-agent-a5befd57d0ca4c7c7.md +177 -0
  45. package/templates/default/docs/plans/enchanted-wiggling-ember.md +170 -0
  46. package/templates/default/docs/plans/federated-questing-kahan.md +47 -0
  47. package/templates/default/docs/plans/fix-orphan-cleaner-review.md +25 -0
  48. package/templates/default/docs/plans/fix-sync-template-variables.md +162 -0
  49. package/templates/default/docs/plans/flickering-pondering-hearth.md +26 -0
  50. package/templates/default/docs/plans/fluttering-snuggling-sprout.md +172 -0
  51. package/templates/default/docs/plans/generic-sleeping-snowglobe-agent-a41d8da.md +179 -0
  52. package/templates/default/docs/plans/generic-sleeping-snowglobe.md +108 -0
  53. package/templates/default/docs/plans/generic-snuggling-pudding.md +57 -0
  54. package/templates/default/docs/plans/glimmering-giggling-sedgewick.md +126 -0
  55. package/templates/default/docs/plans/glittery-swimming-bachman.md +78 -0
  56. package/templates/default/docs/plans/happy-watching-toast.md +56 -0
  57. package/templates/default/docs/plans/harmonic-strolling-nebula.md +210 -0
  58. package/templates/default/docs/plans/idempotent-wiggling-cherny.md +122 -0
  59. package/templates/default/docs/plans/import-alias-refactor.md +75 -0
  60. package/templates/default/docs/plans/lazy-percolating-sloth-agent-abda679.md +346 -0
  61. package/templates/default/docs/plans/lazy-percolating-sloth.md +151 -0
  62. package/templates/default/docs/plans/linked-greeting-llama-agent-a7a6e5b.md +345 -0
  63. package/templates/default/docs/plans/linked-greeting-llama.md +467 -0
  64. package/templates/default/docs/plans/lovely-bubbling-rose.md +80 -0
  65. package/templates/default/docs/plans/optimized-watching-sprout.md +149 -0
  66. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a292da6.md +288 -0
  67. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a819699.md +366 -0
  68. package/templates/default/docs/plans/peaceful-beaming-toast-agent-ac11de2.md +474 -0
  69. package/templates/default/docs/plans/peaceful-beaming-toast.md +345 -0
  70. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6194c.md +300 -0
  71. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6900e.md +444 -0
  72. package/templates/default/docs/plans/purrfect-spinning-hickey.md +361 -0
  73. package/templates/default/docs/plans/recursive-fluttering-mitten.md +176 -0
  74. package/templates/default/docs/plans/recursive-kindling-lemon-agent-a42199e.md +186 -0
  75. package/templates/default/docs/plans/recursive-kindling-lemon.md +36 -0
  76. package/templates/default/docs/plans/seed-migration-tests.md +47 -0
  77. package/templates/default/docs/plans/sprightly-leaping-manatee.md +224 -0
  78. package/templates/default/docs/plans/stateful-wishing-lerdorf.md +161 -0
  79. package/templates/default/docs/plans/streamed-purring-wreath.md +40 -0
  80. package/templates/default/docs/plans/synthetic-percolating-pearl.md +101 -0
  81. package/templates/default/docs/plans/todo-create-einja-app-ux-fix.md +16 -0
  82. package/templates/default/docs/plans/todo-direnv-hang-fix.md +12 -0
  83. package/templates/default/docs/plans/todo-fix-sync-template-variables.md +21 -0
  84. package/templates/default/docs/plans/todo-github-actions-release-workflow.md +34 -0
  85. package/templates/default/docs/plans/todo-issue-spec-rename.md +24 -0
  86. package/templates/default/docs/plans/todo-phase4-marker-update.md +39 -0
  87. package/templates/default/docs/plans/todo-skill-creator-sync.md +23 -0
  88. package/templates/default/docs/plans/todo-skill-creator-upgrade.md +18 -0
  89. package/templates/default/docs/plans/typed-snuggling-parnas-agent-a6f6391.md +476 -0
  90. package/templates/default/docs/plans/typed-snuggling-parnas-agent-adb678b.md +144 -0
  91. package/templates/default/docs/plans/typed-snuggling-parnas.md +84 -0
  92. package/templates/default/docs/plans/velvety-chasing-spark.md +28 -0
  93. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a30aa4f.md +534 -0
  94. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a57a278.md +508 -0
  95. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a90b809.md +421 -0
  96. package/templates/default/docs/plans/warm-hopping-lighthouse.md +199 -0
  97. package/templates/default/docs/plans/wondrous-strolling-crystal-agent-a0615fc.md +215 -0
  98. package/templates/default/docs/plans/wondrous-strolling-crystal.md +182 -0
  99. package/templates/default/docs/plans/zesty-roaming-steele.md +74 -0
  100. package/templates/default/docs/verification-test.md +2 -0
  101. package/templates/default/gitignore +9 -1
  102. package/templates/default/package.json +6 -2
  103. package/templates/default/packages/admin-ui/package.json +1 -1
  104. package/templates/default/packages/server-core/tsconfig.json +6 -1
  105. package/templates/default/pnpm-lock.yaml +823 -57
  106. package/templates/default/scripts/ensure-serena.sh +75 -0
  107. package/templates/default/scripts/env-rotate-secrets.ts +66 -6
  108. package/templates/default/scripts/init-github.ts +363 -0
  109. package/templates/default/scripts/init.sh +11 -5
  110. package/templates/default/scripts/lib/worktree-config.ts +64 -0
  111. package/templates/default/scripts/setup-dev.ts +16 -1
  112. package/templates/default/scripts/stop-serena.sh +25 -0
  113. package/templates/default/scripts/worktree/dev.ts +2 -2
  114. package/templates/default/.claude/skills/create-einja-app-release/SKILL.md +0 -186
  115. package/templates/default/.claude/skills/dev-cli-release/SKILL.md +0 -173
  116. package/templates/default/.cursor/commands/spec-create.md +0 -227
  117. package/templates/default/.cursor/commands/task-exec.md +0 -287
  118. package/templates/default/.cursor/commands/update-docs-by-task-specs.md +0 -448
  119. /package/templates/default/scripts/{cli-template-update.ts → _cli-template-update.ts} +0 -0
  120. /package/templates/default/scripts/{template-update.ts → _template-update.ts} +0 -0
@@ -0,0 +1,177 @@
1
+ # レビューレポート: enchanted-wiggling-ember.md
2
+
3
+ レビュー実施日: 2026-03-05
4
+
5
+ ---
6
+
7
+ ## 前回指摘事項の反映確認
8
+
9
+ | 指摘番号 | 内容 | 反映状況 |
10
+ |---------|------|---------|
11
+ | 1 | 命名の一貫性: `issue-spec-requirements-generator` → 短縮名 | 反映済み(requirements-generator.md 等) |
12
+ | 2 | sync-cursor-commands の更新が必要 | TG-2.3 に追加済み |
13
+ | 3 | エージェント名の長さ: ディレクトリ名でスコープ担保 | 反映済み(issue-specs/ + 短縮ファイル名) |
14
+ | 4 | task-exec リネーム不要 | そのまま維持(妥当) |
15
+
16
+ 前回指摘 4 点はすべて反映されている。
17
+
18
+ ---
19
+
20
+ ## 新たに発見された問題
21
+
22
+ ### 重大(見落とすと壊れる)
23
+
24
+ #### [CRITICAL-1] copy-presets.mjs の Skill 固定列挙に新Skillが含まれていない
25
+
26
+ **実態**: `packages/cli/scripts/copy-presets.mjs` の Skill コピーは固定列挙(ハードコード)。
27
+ 現在の列挙に含まれているのは以下のみ:
28
+ - einja-conflict-resolver
29
+ - einja-general-context-loader
30
+ - einja-output-format
31
+ - einja-spec-context-loader
32
+ - einja-project-overview
33
+ - einja-skill-creator
34
+ - einja-task-commit
35
+ - einja-task-qa
36
+
37
+ **問題**: 新規作成される以下の Skill が列挙に入っていないため、ビルド(`pnpm build`)しても `presets/default/` にコピーされない:
38
+ - `einja-issue-spec-create`(新規)
39
+ - `einja-task-exec`(新規)
40
+ - `einja-issue-spec-generator`(リネーム後)
41
+ - `einja-issue-spec-validator`(リネーム後)
42
+
43
+ また、`einja-task-spec-generator` と `einja-task-spec-validator` の **削除エントリ** も必要。
44
+
45
+ **対処**: Phase 2 の TG として「`copy-presets.mjs` への新 Skill 追加 + 旧 Skill 削除」を追加する必要がある。
46
+
47
+ #### [CRITICAL-2] issue-exec.md の更新箇所が「2箇所」では足りない
48
+
49
+ **実態**: `issue-exec.md` の `/einja:task-exec` 参照は **少なくとも3箇所**:
50
+ - 103行目: 代替手段の説明
51
+ - 206行目: Worker 起動手順の説明
52
+ - 394行目: tmux send-keys の実際のコマンド文字列
53
+
54
+ 計画書には「2箇所」と記載されているが、394行目のコマンド文字列が漏れると Worker 起動が壊れる。
55
+
56
+ **対処**: TG-2.3 の issue-exec.md 更新対象を「全件」に修正すること。
57
+
58
+ #### [CRITICAL-3] grep 検証パターンに複数の見逃しがある
59
+
60
+ 現在の TG-3.1 grep パターンの欠落:
61
+
62
+ | 欠落しているチェック | 実際に残存する箇所 |
63
+ |--------------------|------------------|
64
+ | `agents/specs/`(einja/ なしの短縮形) | sync-cursor-commands.md:54 |
65
+ | `.cursor/commands/` 内の旧ファイル残存 | .cursor/commands/update-docs-by-task-specs.md |
66
+ | `README.md` 内の旧コマンド参照 | README.md:60 |
67
+
68
+ また、誤検知ノイズになる箇所(除外が必要):
69
+ - `docs/specs/issues/**/qa-tests/` — 履歴エビデンスなので除外推奨
70
+ - `docs/plans/` — 過去計画ファイルなので除外推奨
71
+ - `modifications/` — 作業記録なので除外推奨
72
+
73
+ **対処**: TG-3.1 の grep コマンドを修正し、除外パターンに `docs/specs/` `docs/plans/` `modifications/` `packages/create-einja-app/templates/default/docs/plans/` を追加する。また、`agents/specs/` と `.cursor/commands/` のチェックを追加する。
74
+
75
+ ---
76
+
77
+ ### 中リスク(計画漏れ)
78
+
79
+ #### [MEDIUM-1] README.md の更新が計画に含まれていない
80
+
81
+ **実態**: `README.md` 60行目に以下の記述がある:
82
+ ```
83
+ `.claude/commands/` - `/einja:spec-create`, `/einja:task-exec` などのスラッシュコマンド
84
+ ```
85
+
86
+ TG-2.5 は CLAUDE.md のみで、README.md が含まれていない。
87
+
88
+ **対処**: TG-2.5 に README.md を追加する(Skill/コマンドテーブルの記述を更新)。
89
+
90
+ #### [MEDIUM-2] sync-cursor-commands.md のパス例示が現実と不一致
91
+
92
+ **実態**: `sync-cursor-commands.md` 54行目:
93
+ ```
94
+ spec-requirements-generator → .claude/agents/specs/spec-requirements-generator.md
95
+ ```
96
+ 実際のパスは `.claude/agents/einja/specs/` だが、例示では `agents/specs/` と短縮されている。
97
+ リネーム後は `.claude/agents/einja/issue-specs/requirements-generator.md` になる。
98
+
99
+ TG-2.3 で「エージェントパス agents/specs/ → agents/issue-specs/」と記載されているが、
100
+ このパターンで置換すると `agents/einja/specs/` を持つパスには一致しない可能性がある。
101
+
102
+ **対処**: TG-2.3 の sync-cursor-commands.md 更新で、具体的にどの文字列を何に置換するかを明示すること。
103
+
104
+ #### [MEDIUM-3] .cursor/commands/update-docs-by-task-specs.md の旧ファイル削除が計画されていない
105
+
106
+ **実態**: `.cursor/commands/update-docs-by-task-specs.md` が存在する。
107
+ `sync-cursor-commands` コマンド再実行で `update-docs-by-issue-specs/RULE.md` が生成されるはずだが、
108
+ 旧ファイルの **削除** は自動では行われない(スクリプトが削除しない設計の可能性がある)。
109
+
110
+ **対処**: TG-3.2(ビルド・テスト)の手順に「`.cursor/commands/` 内の旧ファイル手動削除確認」を追加する。
111
+
112
+ #### [MEDIUM-4] einja-task-spec-generator/SKILL.md と einja-task-spec-validator/SKILL.md のリンクパス変更が2段階になっている
113
+
114
+ **実態**:
115
+ - `einja-task-spec-generator/SKILL.md`:101行目 → `../../agents/einja/specs/spec-tasks-generator.md`
116
+ - `einja-task-spec-validator/SKILL.md`:126行目 → `../../agents/einja/specs/spec-tasks-validator.md`
117
+
118
+ リネーム後(einja-issue-spec-generator/SKILL.md)ではリンクパスを:
119
+ 1. ディレクトリ: `specs/` → `issue-specs/`
120
+ 2. ファイル名: `spec-tasks-generator.md` → `tasks-generator.md`
121
+
122
+ の **両方** を変更する必要がある。TG-2.2 の記述では「エージェント名更新」とのみ書かれており、
123
+ パスの `specs/` → `issue-specs/` の変更が明記されていない。
124
+
125
+ **対処**: TG-2.2 の更新内容に「相対パス内の `specs/` → `issue-specs/` 変更」を明記する。
126
+
127
+ ---
128
+
129
+ ### 更新不要と判断できるもの
130
+
131
+ | 対象 | 判断 | 理由 |
132
+ |-----|------|------|
133
+ | `docs/specs/issues/**/qa-tests/` 内の旧語 | 更新不要 | 履歴エビデンスなので変更すると証跡が変わる |
134
+ | `docs/plans/` 内の過去計画書の旧語 | 更新不要 | 作業記録。ただし grep 検証からは除外すること |
135
+ | `modifications/` 内の旧語 | 更新不要 | 作業記録 |
136
+ | テストファイル内の旧パス(テストデータ文字列) | 更新不要 | 単なるサンプルデータとして使用。実ファイルパスを参照していない |
137
+ | `packages/cli/presets/default/` 配下 | ビルド後に自動反映 | copy-presets.mjs で上書きされる(ただし Skill の固定列挙更新は必要) |
138
+
139
+ ---
140
+
141
+ ## TG-2.2 の行数確認(Skill ファイル数の計算)
142
+
143
+ 計画書で「TG-2.2: スキル内部参照更新(8ファイル)」とあるが、実際にリストされているのは9行:
144
+
145
+ 1. einja-issue-spec-generator/SKILL.md
146
+ 2. einja-issue-spec-validator/SKILL.md
147
+ 3. einja-task-qa/SKILL.md
148
+ 4. einja-task-qa/references/troubleshooting.md
149
+ 5. einja-task-qa/references/usage-patterns.md
150
+ 6. einja-task-commit/SKILL.md
151
+ 7. einja-general-context-loader/SKILL.md
152
+ 8. einja-spec-context-loader/SKILL.md
153
+ 9. einja-skill-first/SKILL.md
154
+
155
+ ヘッダーは「8ファイル」だが実際は9ファイル。minor な誤りだが修正推奨。
156
+
157
+ ---
158
+
159
+ ## 総合評価
160
+
161
+ ### 反映状況
162
+ 前回指摘 4 点: 全反映済み。
163
+
164
+ ### 新たなリスク
165
+ - **重大**: 3件(CRITICAL-1〜3)
166
+ - **中リスク**: 4件(MEDIUM-1〜4)
167
+
168
+ ### 最小修正が必要な計画変更
169
+
170
+ 1. **新規 TG を追加**: `copy-presets.mjs` の Skill 固定列挙更新(CRITICAL-1)
171
+ 2. **TG-2.3 修正**: issue-exec.md の更新箇所を「全件(少なくとも3箇所)」に修正(CRITICAL-2)
172
+ 3. **TG-3.1 修正**: grep パターンに `agents/specs/` チェック追加、`.cursor/commands/` チェック追加、除外パターンに `docs/specs/` `docs/plans/` `modifications/` を追加(CRITICAL-3)
173
+ 4. **TG-2.5 修正**: README.md を追加(MEDIUM-1)
174
+ 5. **TG-2.3 修正**: sync-cursor-commands.md の置換文字列を具体的に明示(MEDIUM-2)
175
+ 6. **TG-3.2 修正**: .cursor/commands/ 旧ファイル削除確認を追加(MEDIUM-3)
176
+ 7. **TG-2.2 修正**: 相対パス内の `specs/` → `issue-specs/` 変更を明記(MEDIUM-4)
177
+ 8. **ヘッダー修正**: TG-2.2 の「8ファイル」→「9ファイル」(minor)
@@ -0,0 +1,170 @@
1
+ # task-spec → issue-spec リネーム + コマンド→Skill移行
2
+
3
+ ## Context
4
+
5
+ 現在の仕様書関連の命名(`spec-create`, `task-spec-*`, `agents/specs/`)はIssue単位で仕様書を作成するという実態と乖離している。`issue-spec` に統一することで意味的な明確さを向上させる。同時に、`spec-create` と `task-exec` をコマンドからSkillへ移行し、呼び出し方法を統一する。
6
+
7
+ ## リネーム対応表
8
+
9
+ ### ファイル移動・リネーム
10
+
11
+ | Before | After |
12
+ |--------|-------|
13
+ | `.claude/commands/einja/spec-create.md` | `.claude/skills/einja-issue-spec-create/SKILL.md` |
14
+ | `.claude/commands/einja/task-exec.md` | `.claude/skills/einja-task-exec/SKILL.md` |
15
+ | `.claude/commands/einja/update-docs-by-task-specs.md` | `.claude/commands/einja/update-docs-by-issue-specs.md` |
16
+ | `.claude/skills/einja-task-spec-generator/` | `.claude/skills/einja-issue-spec-generator/` |
17
+ | `.claude/skills/einja-task-spec-validator/` | `.claude/skills/einja-issue-spec-validator/` |
18
+ | `.claude/agents/einja/specs/` | `.claude/agents/einja/issue-specs/` |
19
+
20
+ ### エージェントファイルリネーム(`issue-specs/` 内)
21
+
22
+ ディレクトリ名 `issue-specs/` でスコープを担保し、ファイル名は短縮。
23
+
24
+ | Before | After |
25
+ |--------|-------|
26
+ | `spec-requirements-generator.md` | `requirements-generator.md` |
27
+ | `spec-design-generator.md` | `design-generator.md` |
28
+ | `spec-qa-generator.md` | `qa-generator.md` |
29
+ | `spec-tasks-generator.md` | `tasks-generator.md` |
30
+ | `spec-tasks-validator.md` | `tasks-validator.md` |
31
+
32
+ ### 呼び出し方法の変更
33
+
34
+ | Before | After |
35
+ |--------|-------|
36
+ | `/einja:spec-create <args>` | Skill tool `einja-issue-spec-create` |
37
+ | `/einja:task-exec <args>` | Skill tool `einja-task-exec` |
38
+ | `/einja:update-docs-by-task-specs <args>` | `/einja:update-docs-by-issue-specs <args>` |
39
+
40
+ ## 実装計画
41
+
42
+ ### Phase 1: ファイル移動・作成(並列実行可能)
43
+
44
+ **TG-1.1: エージェントディレクトリ移動+ファイルリネーム**
45
+ - `git mv .claude/agents/einja/specs/ .claude/agents/einja/issue-specs/`
46
+ - 各ファイルを `git mv` で短縮名にリネーム(`spec-X-generator` → `X-generator`)
47
+ - 対象: 5ファイル
48
+
49
+ **TG-1.2: スキルディレクトリリネーム**
50
+ - `git mv .claude/skills/einja-task-spec-generator/ .claude/skills/einja-issue-spec-generator/`
51
+ - `git mv .claude/skills/einja-task-spec-validator/ .claude/skills/einja-issue-spec-validator/`
52
+ - 対象: 4ファイル(SKILL.md × 2 + references/ × 2)
53
+
54
+ **TG-1.3: spec-create → einja-issue-spec-create Skill移行**
55
+ - `.claude/skills/einja-issue-spec-create/SKILL.md` を新規作成(spec-create.mdの内容を移行)
56
+ - 旧 `.claude/commands/einja/spec-create.md` を削除
57
+ - 内部のエージェントパス参照を `../../agents/einja/issue-specs/{短縮名}` に更新
58
+
59
+ **TG-1.4: task-exec → einja-task-exec Skill移行**
60
+ - `.claude/skills/einja-task-exec/SKILL.md` を新規作成(task-exec.mdの内容を移行)
61
+ - 旧 `.claude/commands/einja/task-exec.md` を削除
62
+
63
+ **TG-1.5: update-docs-by-task-specs リネーム**
64
+ - `git mv` でファイルリネーム → `update-docs-by-issue-specs.md`
65
+ - 内部テキストの `task-specs` → `issue-specs` 更新
66
+
67
+ ### Phase 2: 参照更新(Phase 1完了後、並列実行可能)
68
+
69
+ **TG-2.1: エージェント内部参照更新**(10ファイル)
70
+
71
+ | ファイル | 更新内容 |
72
+ |---------|---------|
73
+ | `.claude/agents/einja/issue-specs/tasks-generator.md` | Skillリンク `../../skills/einja-task-spec-generator/` → `../../skills/einja-issue-spec-generator/`、`spec-create` → `einja-issue-spec-create` |
74
+ | `.claude/agents/einja/issue-specs/tasks-validator.md` | Skillリンク `../../skills/einja-task-spec-validator/` → `../../skills/einja-issue-spec-validator/`、`spec-create` → `einja-issue-spec-create` |
75
+ | `.claude/agents/einja/issue-specs/requirements-generator.md` | `name:` フィールド更新、内部テキストの旧名参照 |
76
+ | `.claude/agents/einja/issue-specs/design-generator.md` | 同上 |
77
+ | `.claude/agents/einja/issue-specs/qa-generator.md` | 同上 |
78
+ | `.claude/agents/einja/task/task-executer.md` | `/einja:spec-create` → `einja-issue-spec-create`、task-exec コマンド→Skill 文言更新 |
79
+ | `.claude/agents/einja/task/task-reviewer.md` | `task-exec` コマンド参照更新 |
80
+ | `.claude/agents/einja/task/task-modification-analyzer.md` | `task-exec` コマンド参照更新 |
81
+ | `.claude/agents/einja/task/task-qa.md` | `task-exec` 参照更新 |
82
+ | `.claude/agents/einja/docs/docs-updater.md` | `update-docs-by-task-specs` → `update-docs-by-issue-specs` |
83
+
84
+ **TG-2.2: スキル内部参照更新**(8ファイル)
85
+
86
+ | ファイル | 更新内容 |
87
+ |---------|---------|
88
+ | `.claude/skills/einja-issue-spec-generator/SKILL.md` | タイトル・内部テキスト: `task-spec-generator` → `issue-spec-generator`、エージェント名更新、相対パス `specs/` → `issue-specs/` 更新 |
89
+ | `.claude/skills/einja-issue-spec-validator/SKILL.md` | タイトル・内部テキスト: `task-spec-validator` → `issue-spec-validator`、エージェント名更新、相対パス `specs/` → `issue-specs/` 更新 |
90
+ | `.claude/skills/einja-task-qa/SKILL.md` | `spec-qa-generator` → `qa-generator`、`task-exec` コマンド→Skill文言 |
91
+ | `.claude/skills/einja-task-qa/references/troubleshooting.md` | `spec-requirements-generator` → `requirements-generator` |
92
+ | `.claude/skills/einja-task-qa/references/usage-patterns.md` | `task-exec` 使用例テキスト更新 |
93
+ | `.claude/skills/einja-task-commit/SKILL.md` | `task-exec` コマンド→Skill文言更新 |
94
+ | `.claude/skills/einja-general-context-loader/SKILL.md` | `/einja:spec-create` → `einja-issue-spec-create` |
95
+ | `.claude/skills/einja-spec-context-loader/SKILL.md` | `/einja:spec-create` → `einja-issue-spec-create`(4箇所) |
96
+ | `.claude/skills/einja-skill-first/SKILL.md` | `spec-create` → `einja-issue-spec-create`(3箇所) |
97
+
98
+ **TG-2.3: コマンド/設定ファイル参照更新**(4ファイル)
99
+
100
+ | ファイル | 更新内容 |
101
+ |---------|---------|
102
+ | `.claude/commands/einja/issue-exec.md` | `/einja:task-exec` → `einja-task-exec` Skill(3箇所: 行103, 206, 394) |
103
+ | `.claude/commands/einja/sync-cursor-commands.md` | 変換元パスを Skill パスに更新、エージェントパス `agents/specs/` → `agents/issue-specs/`、エージェント名短縮 |
104
+ | `.claude/commands/einja/update-docs-by-issue-specs.md` | 内部テキスト更新 |
105
+ | `.einja-sync.json` | `update-docs-by-task-specs.md` → `update-docs-by-issue-specs.md`(※他のリネーム対象は未登録のため変更不要) |
106
+
107
+ **TG-2.4: docs/einja/ 参照更新**(5-6ファイル)
108
+
109
+ | ファイル | 更新内容 |
110
+ |---------|---------|
111
+ | `docs/einja/steering/development-workflow.md` | `/einja:spec-create` → `einja-issue-spec-create`、`/einja:task-exec` → `einja-task-exec`(多数) |
112
+ | `docs/einja/steering/task-management.md` | spec-create、task-exec、update-docs-by-task-specs 参照更新 |
113
+ | `docs/einja/steering/acceptance-criteria-and-qa-guide.md` | spec-create 参照更新 |
114
+ | `docs/einja/instructions/task-execute.md` | spec-create、task-exec、エージェント名参照(多数) |
115
+ | `docs/einja/instructions/issue-exec-workflow.md` | spec-create、task-exec 参照更新 |
116
+
117
+ **TG-2.5: CLAUDE.md + README.md 更新**
118
+
119
+ | ファイル | 更新箇所 | Before → After |
120
+ |---------|---------|---------------|
121
+ | `CLAUDE.md` | Skill/コマンドテーブル | `einja:spec-create` → `einja-issue-spec-create` |
122
+ | `CLAUDE.md` | Skill/コマンドテーブル | `einja:task-exec` → `einja-task-exec` |
123
+ | `CLAUDE.md` | Skill/コマンドテーブル | `einja:update-docs-by-task-specs` → `einja:update-docs-by-issue-specs` |
124
+ | `CLAUDE.md` | サブエージェント一覧 | `spec-requirements-generator` → `requirements-generator` 等(短縮名) |
125
+ | `README.md` | 行60 | `/einja:spec-create` → `einja-issue-spec-create`、`/einja:task-exec` → `einja-task-exec` |
126
+
127
+ ### Phase 3: 検証
128
+
129
+ **TG-3.1: 参照整合性チェック**
130
+
131
+ 除外対象: `.bak/`, `.cursor/`, `.einja-sync-backups/`, `docs/specs/issues/`(履歴エビデンス), `docs/plans/`(作業記録)
132
+
133
+ ```bash
134
+ # 旧パス残存チェック
135
+ grep -r "agents/einja/specs/" --include='*.md' --include='*.json' | grep -v '.bak/' | grep -v '.cursor/' | grep -v '.einja-sync-backups/' | grep -v 'docs/specs/' | grep -v 'docs/plans/'
136
+ grep -r "agents/specs/" --include='*.md' --include='*.json' | grep -v '.bak/' | grep -v '.cursor/' | grep -v '.einja-sync-backups/' | grep -v 'docs/specs/' | grep -v 'docs/plans/'
137
+
138
+ # 旧Skill名残存チェック
139
+ grep -r "task-spec-generator\|task-spec-validator" --include='*.md' --include='*.json' | grep -v '.bak/' | grep -v 'docs/plans/'
140
+
141
+ # 旧コマンド呼び出し残存チェック
142
+ grep -r "/einja:spec-create\|/einja:task-exec" --include='*.md' | grep -v '.bak/' | grep -v '.cursor/' | grep -v 'docs/plans/'
143
+
144
+ # 旧コマンド名残存チェック
145
+ grep -r "update-docs-by-task-specs" --include='*.md' --include='*.json' | grep -v '.bak/' | grep -v 'docs/plans/'
146
+
147
+ # 旧エージェント名残存チェック
148
+ grep -r "spec-requirements-generator\|spec-design-generator\|spec-qa-generator\|spec-tasks-generator\|spec-tasks-validator" --include='*.md' --include='*.json' | grep -v '.bak/' | grep -v '.cursor/' | grep -v 'issue-specs/' | grep -v 'docs/specs/' | grep -v 'docs/plans/'
149
+ ```
150
+
151
+ **TG-3.2: ビルド・テスト・クリーンアップ**
152
+ - `pnpm prepush` 通過確認
153
+ - `git diff --stat` で変更ファイル一覧確認
154
+ - `.cursor/commands/` 配下の旧ファイル(`spec-create.md`, `task-exec.md`, `update-docs-by-task-specs.md`)を手動削除
155
+ - `sync-cursor-commands` を実行してCursorルール再生成確認
156
+
157
+ ## リスク・注意事項
158
+
159
+ 1. **task-exec vs task-executer の混同**: `task-exec` は移行対象だが `task-executer` はエージェント名でリネーム対象外。置換時に `/einja:task-exec` や `task-exec コマンド` のみ対象とし、`task-executer` は除外する正規表現が必須
160
+ 2. **参照箇所の膨大さ**: 約50-55ファイル。Phase 3 の grep 検証でゼロ残存を確認してからコミット
161
+ 3. **`.einja-sync.json`**: `update-docs-by-task-specs.md` のみ登録あり(他のリネーム対象は未登録なので変更は1エントリのみ)
162
+ 4. **settings.json に customAgents セクションなし**: エージェント名はファイル名ベースで自動解決されるため、ファイルリネームのみで有効
163
+ 5. **エージェント name: フィールド**: 各エージェント定義の frontmatter `name:` を短縮名に更新必要
164
+ 6. **Cursor互換**: `sync-cursor-commands.md` の変換元パスを更新し、移行後に再生成を実行
165
+
166
+ ## 対象ファイル総数(確定)
167
+
168
+ - 移動/リネーム: 約15ファイル
169
+ - 参照更新: 約35-40ファイル
170
+ - 合計: 約50-55ファイル
@@ -0,0 +1,47 @@
1
+ # Plan: README.md 古い情報の修正
2
+
3
+ ## Context
4
+
5
+ README.md の徹底調査により、プロジェクトの実態と乖離した記述が **14件** 発見された。開発者向けセクションだけでなく、パッケージ利用者向けセクション(create-einja-app / @einja/dev-cli の使い方)にも複数の古い情報がある。
6
+
7
+ ## 修正対象ファイル
8
+
9
+ - `README.md`
10
+
11
+ ## 修正一覧
12
+
13
+ ### A. パッケージ利用者向けセクション(行7-98)
14
+
15
+ | # | 行 | 深刻度 | 問題 | 修正内容 |
16
+ |---|-----|--------|------|---------|
17
+ | A1 | 59-63 | 高 | `.claude/skills/` の説明が「コーディング規約、コンポーネント設計ガイド」 | 「ATDDワークフロー用スキル(タスク実行、QAテスト、コミット管理、コンフリクト解消等)」に修正 |
18
+ | A2 | 63 | 高 | `.claude/hooks/` を「Git Hooks」と記載 | 「Claude Code Hooks(コード品質チェック、型検証、機密情報検出等)」に修正 |
19
+ | A3 | 63 | 中 | `.claude/settings.json` を「MCPサーバー設定」と記載 | initで実際に作成されるのは `.mcp.json`。settings.jsonの記述を修正 |
20
+ | A4 | 64-68 | 中 | `docs/einja/` の説明が不完全 | `instructions/`(操作手順書)と `example/`(サンプル仕様書)も追加 |
21
+ | A5 | 68 | 低 | 「`package.json` にスクリプトが追加される」の記述が不完全 | `lint`, `format`, `typecheck`, `prepush` も追加されることを記載 |
22
+ | A6 | 20 | 低 | 「Turborepo + Next.js 15 + Prisma のモノレポ構成」のみ | テンプレートには `apps/admin/` も含まれることを補足 |
23
+ | A7 | 37 | 低 | create-einja-app のオプション `--yes` 記載 | CLIの `.option()` に `--yes` が未登録(バグ)。README側は現状維持し、CLI修正を別Issueで対応 |
24
+
25
+ ### B. パッケージ開発者向けセクション(行102-)
26
+
27
+ | # | 行 | 深刻度 | 問題 | 修正内容 |
28
+ |---|-----|--------|------|---------|
29
+ | B1 | 110-142 | 高 | プロジェクト構成図に `apps/admin/` が未記載 | `apps/admin/` を追加 |
30
+ | B2 | 110-142 | 高 | プロジェクト構成図に `packages/admin-ui/` が未記載 | `packages/admin-ui/` を追加 |
31
+ | B3 | 277 | 高 | `PostgreSQL 15` と記載 | `PostgreSQL 16` に修正 |
32
+ | B4 | 289 | 中 | Docker接続コマンドの DB名 `-d einja_management` | `-d main` に修正(POSTGRES_DB の実際の値) |
33
+ | B5 | 133-137 | 軽微 | `server-core/src/` に `utils/` があると記載 | `core/`・`testing/` に修正 |
34
+ | B6 | 314-319 | 軽微 | packagesセクションに `@repo/admin-ui` の説明なし | admin専用UIコンポーネントとして追加 |
35
+ | B7 | 269 | 軽微 | ワークスペース固有コマンドの filter 例 `@repo/web` のみ | `@repo/admin` の例も追加 |
36
+
37
+ ## 実装手順
38
+
39
+ 1. サブエージェントに README.md の全修正を委託(1エージェント、全修正を一括)
40
+ 2. `git diff` で意図しない変更がないか確認
41
+ 3. `--yes` バグは別途対応(本タスクのスコープ外)
42
+
43
+ ## 検証
44
+
45
+ - 修正後の README.md を `Read` で確認
46
+ - 変更されたリンク先がすべて実在することを確認(調査済み)
47
+ - `git diff --stat` で変更ファイルが README.md のみであることを確認
@@ -0,0 +1,25 @@
1
+ # Codexレビュー指摘修正: orphan-cleaner
2
+
3
+ ## 修正対象: High 2件
4
+
5
+ ### Fix 1: パストラバーサル脆弱性
6
+ **箇所**: `packages/cli/src/commands/sync.ts` 孤児削除処理部分
7
+ **修正**: 孤児ファイル削除前にパス検証関数を追加
8
+ - `path.normalize` で正規化
9
+ - `..` を含むパスを拒否
10
+ - 絶対パスを拒否
11
+ - 解決後パスがプロジェクトルート配下か検証
12
+ - OrphanCleaner.detectOrphans() 内でも検証(検出段階でフィルタ)
13
+
14
+ ### Fix 2: 変更ファイル0件時に孤児削除に到達しない
15
+ **箇所**: `packages/cli/src/commands/sync.ts:161-163`
16
+ **修正**: 早期return条件に `orphanReport.hasOrphans` を追加
17
+ - 孤児検出を早期returnの前に移動
18
+ - `filesToProcess.length === 0 && !orphanReport.hasOrphans` の場合のみreturn
19
+ - 変更なし+孤児ありの場合はレポート表示/削除処理へ進む
20
+
21
+ ## 実装ステップ
22
+ 1. orphan-cleaner.ts にパス検証を追加(detectOrphans内)
23
+ 2. sync.ts の早期return修正 + 削除処理にもパス検証ガード追加
24
+ 3. orphan-cleaner.test.ts にパストラバーサルテスト追加
25
+ 4. typecheck + test 実行
@@ -0,0 +1,162 @@
1
+ # 修正計画: create-einja-app sync コマンドの設計ギャップ修正
2
+
3
+ ## 問題一覧
4
+
5
+ ### 致命的 (Critical)
6
+
7
+ | # | 問題 | 影響 |
8
+ |---|------|------|
9
+ | C-1 | sync にテンプレート変数置換がない | `@repo/`, `{{packageName}}` が未置換のままコピーされる |
10
+ | C-2 | 環境ファイルの暗号化キー上書き | `.env.keys` 以外の `.env.*` が上書きされ秘密鍵が破壊 |
11
+ | C-3 | Prismaスキーマの無条件上書き | apps/packages sync時にユーザーのDBモデルが消失 |
12
+
13
+ ### 重大 (High)
14
+
15
+ | # | 問題 | 影響 |
16
+ |---|------|------|
17
+ | H-1 | package.json の scripts 完全上書き | ユーザーカスタムスクリプトが消失 |
18
+ | H-2 | tsconfig.json の extends/paths 上書き | TypeScriptビルド設定が破壊 |
19
+ | H-3 | dry-run がファイルリスト表示のみ | マージ結果や変数置換結果が確認不可 |
20
+ | H-4 | バックアップが既存ファイルのみ | 新規追加ファイルがロールバックで残る |
21
+ | H-5 | GitHub Actions YAML の無条件同期 | カスタマイズしたCIパイプラインが破壊 |
22
+
23
+ ### 中程度 (Medium)
24
+
25
+ | # | 問題 | 影響 |
26
+ |---|------|------|
27
+ | M-1 | dev-cli / create-einja-app の管轄重複 | ユーザーが混乱 |
28
+ | M-2 | マーカーの入れ子エラー処理不足 | マーカー破損時に警告なし |
29
+ | M-3 | 冪等性の未保証 | sync 2回実行で結果が変わる可能性 |
30
+ | M-4 | 個別ファイル保護の仕組みがない | conflictStrategy でしか保護できない |
31
+ | M-5 | `.env.personal` の定義に `.env.keys` があるが実装で片方のみチェック | 保護漏れ |
32
+
33
+ ## 修正方針
34
+
35
+ ### Phase 1: 致命的問題の修正 (C-1, C-2, C-3)
36
+
37
+ #### 1-1. ユーザーリポジトリから packageScope/projectName を検出
38
+
39
+ sync は既存リポジトリに対して実行されるため、ユーザーの設定を自動検出する必要がある。
40
+
41
+ **取得元の優先順位**:
42
+ 1. `.einja.json` (または `.einja-sync.json`) にメタデータとして保存されている場合
43
+ 2. ルート `package.json` の `name` フィールド(projectName)
44
+ 3. `apps/` or `packages/` 配下の `package.json` から `name` のスコープ部分を抽出
45
+ 4. 上記で取得できない場合は対話式プロンプトで入力
46
+
47
+ **新規ファイル**: `src/utils/project-detector.ts`
48
+
49
+ #### 1-2. sync プロセスにテンプレート変数置換を統合
50
+
51
+ **方式**: テンプレートファイル読み込み後、マージ処理の**前**に `replacePlaceholders()` を適用
52
+
53
+ - `template.ts` の `replacePlaceholders()` を export して共用化
54
+ - `merger.ts` の `mergeAndWriteFile()` に templateVariables オプションを追加
55
+ - `sync.ts` で検出した変数情報を `mergeAndWriteFile` に渡す
56
+
57
+ **重要**: 置換はマージ前に行う。マージ後に行うと既存ファイルのユーザーカスタマイズまで誤って置換してしまう。
58
+
59
+ #### 1-3. 置換漏れ検証
60
+
61
+ sync 完了後に `@repo/` や `{{packageName}}` がターゲットファイルに残っていないか検証。
62
+
63
+ **新規ファイル**: `src/utils/placeholder-validator.ts`
64
+
65
+ #### 1-4. 環境ファイルの保護強化
66
+
67
+ `ENV_FILE_PROTECTION` を拡張。dotenvx 暗号化済み値を含むファイルを保護対象に追加。
68
+
69
+ ```typescript
70
+ const ENV_FILE_PROTECTION = {
71
+ protected: [
72
+ ".env.keys", // 既存
73
+ ".env.personal", // 既存
74
+ ".env.develop", // 追加
75
+ ".env.local", // 追加
76
+ ".env.production", // 追加
77
+ ".env.staging", // 追加
78
+ ".env.preview", // 追加
79
+ ],
80
+ allowed: [ // 同期許可
81
+ ".env.example",
82
+ ".env.personal.example",
83
+ ".envrc",
84
+ ],
85
+ };
86
+ ```
87
+
88
+ #### 1-5. Prismaスキーマ等の保護
89
+
90
+ sync 対象から除外すべきファイルパターンを追加:
91
+ - `**/prisma/schema.prisma` — DBモデルはユーザー固有
92
+ - `**/prisma/migrations/**` — マイグレーション履歴
93
+ - `pnpm-lock.yaml` — lockfile は sync すべきでない
94
+
95
+ ### Phase 2: 重大問題の修正 (H-1 ~ H-5)
96
+
97
+ #### 2-1. package.json scripts の安全なマージ (H-1)
98
+
99
+ 現状: `{...existing, ...template}` でテンプレートが後勝ち。
100
+
101
+ **方式**: scripts マージ時に、ユーザーが追加したキー(テンプレートに存在しないキー)を保持。テンプレート既存キーの上書き時は既にカスタマイズされている場合は警告。
102
+
103
+ #### 2-2. `--all` 時のデフォルトスコープ制限 (H-1)
104
+
105
+ `--all` 使用時も `packageJsonSections` のデフォルトを `["scripts", "engines"]` に限定。dependency 系は明示フラグ必要。
106
+
107
+ #### 2-3. dry-run の改善 (H-3)
108
+
109
+ dry-run 時にもマージ処理をシミュレーション実行し、実際のdiff(変更前後)を表示する。
110
+
111
+ #### 2-4. バックアップの完全性 (H-4)
112
+
113
+ sync 完了時に「追加されたファイル」のリストも記録し、ロールバック時に削除する。
114
+
115
+ #### 2-5. GitHub Actions のマーカーベース保護 (H-5)
116
+
117
+ `.github/workflows/*.yml` にマーカーベースマージを適用。managed セクション外のユーザーカスタマイズを保持。
118
+
119
+ ### Phase 3: テスト
120
+
121
+ | テストファイル | 内容 |
122
+ |---|---|
123
+ | `tests/unit/utils/project-detector.test.ts` | **新規**: packageScope 自動検出 |
124
+ | `tests/unit/utils/placeholder-validator.test.ts` | **新規**: 置換漏れ検出 |
125
+ | `tests/unit/utils/merger.test.ts` | **追加**: templateVariables 付きマージ |
126
+ | `tests/integration/sync-variables.test.ts` | **新規**: sync E2E(変数置換検証) |
127
+
128
+ ## 実装順序
129
+
130
+ ```
131
+ Phase 1-1: project-detector 作成
132
+
133
+ Phase 1-2: replacePlaceholders 共用化 + merger 統合
134
+
135
+ Phase 1-3: placeholder-validator 作成
136
+ ↓ (並行可)
137
+ Phase 1-4: env 保護強化 | Phase 1-5: Prisma/lockfile 除外
138
+
139
+ Phase 2 (並行可): scripts安全マージ | dry-run改善 | バックアップ完全性
140
+
141
+ Phase 3: テスト作成
142
+ ```
143
+
144
+ ## 変更ファイルサマリ
145
+
146
+ | ファイル | 操作 | 内容 |
147
+ |---|---|---|
148
+ | `src/utils/project-detector.ts` | **新規** | packageScope/projectName 検出 |
149
+ | `src/utils/placeholder-validator.ts` | **新規** | 置換漏れ検出 |
150
+ | `src/generators/template.ts` | 変更 | `replacePlaceholders()` を export |
151
+ | `src/utils/merger.ts` | 変更 | templateVariables オプション追加 |
152
+ | `src/commands/sync.ts` | 変更 | 変数検出・置換・検証ステップ追加 |
153
+ | `src/generators/sync.ts` | 変更 | env保護リスト拡張、Prisma除外パターン追加 |
154
+ | `src/types/index.ts` | 変更 | SyncMetadata に packageScope/projectName 追加 |
155
+
156
+ ## リスク
157
+
158
+ | リスク | 軽減策 |
159
+ |---|---|
160
+ | `pnpm-lock.yaml` 内の `@repo/` 置換で lockfile 破壊 | sync 対象から除外 |
161
+ | マージ前置換でマージ精度低下 | マーカーベースマージはテキスト比較なので影響なし |
162
+ | 既存ユーザーの設定ファイルに packageScope がない | 自動検出 + 対話確認でフォールバック |
@@ -0,0 +1,26 @@
1
+ # Plan: task-exec.mdから冗長な「受け入れ条件の参照方法」セクションを削除
2
+
3
+ ## Context
4
+
5
+ task-exec.md の「受け入れ条件の参照方法」セクション(247〜313行目)は以下の理由で冗長:
6
+ - サブエージェント(task-executer/reviewer/qa)はtask-exec.mdを読まない
7
+ - 同ファイル内のStep 2〜6で同じ内容が定義済み
8
+ - Step 4のハイブリッド方式と矛盾する記述がある
9
+ - 他ファイルからの参照は0件(Codexレビュー済み)
10
+
11
+ ## 変更内容
12
+
13
+ ### 対象ファイル
14
+ - `.claude/commands/einja/task-exec.md`
15
+
16
+ ### 作業
17
+ 1. 246行目の `---` から 315行目の `---` の間にある「受け入れ条件の参照方法」セクション全体を削除
18
+ - 246行目: セパレータ `---`
19
+ - 247〜313行目: セクション本体
20
+ - 314行目: 空行
21
+ - 315行目: セパレータ `---`(「失敗時のリカバリーフロー」の前)
22
+ - ※ 「失敗時のリカバリーフロー」セクション前の `---` セパレータは維持
23
+
24
+ ## 検証
25
+ - 削除後、前後のセクション(Phase 99フローと失敗時リカバリーフロー)が正しく繋がっていることを確認
26
+ - `pnpm prepush` で lint/typecheck が通ることを確認