create-einja-app 0.3.1 → 0.3.2

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 (80) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +32 -16
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +1 -1
  5. package/templates/default/.claude/hooks/einja/plan-mode-skill-loader.sh +23 -0
  6. package/templates/default/.claude/settings.json +15 -1
  7. package/templates/default/.env.personal.example +6 -2
  8. package/templates/default/.envrc +5 -0
  9. package/templates/default/.github/workflows/deploy-pr-preview.yml +23 -24
  10. package/templates/default/.github/workflows/deploy-stable-branches.yml +55 -49
  11. package/templates/default/.mcp.json +2 -12
  12. package/templates/default/.serena/project.yml +7 -0
  13. package/templates/default/CLAUDE.md +28 -4
  14. package/templates/default/README.md +2 -2
  15. package/templates/default/apps/admin/package.json +1 -1
  16. package/templates/default/apps/admin/tsconfig.json +2 -1
  17. package/templates/default/apps/web/package.json +1 -1
  18. package/templates/default/apps/web/tsconfig.json +2 -1
  19. package/templates/default/docs/plans/.gitkeep +0 -0
  20. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-a87e67c.md +221 -0
  21. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-ab73a1c.md +107 -0
  22. package/templates/default/docs/plans/ancient-greeting-flamingo.md +120 -0
  23. package/templates/default/docs/plans/bright-stargazing-dawn.md +87 -0
  24. package/templates/default/docs/plans/calm-stirring-bonbon.md +196 -0
  25. package/templates/default/docs/plans/calm-watching-widget.md +111 -0
  26. package/templates/default/docs/plans/cheerful-wiggling-ullman.md +164 -0
  27. package/templates/default/docs/plans/compiled-humming-cherny.md +94 -0
  28. package/templates/default/docs/plans/dapper-launching-lynx.md +81 -0
  29. package/templates/default/docs/plans/effervescent-munching-kite-agent-ac08baf.md +672 -0
  30. package/templates/default/docs/plans/effervescent-munching-kite-agent-aecc373.md +442 -0
  31. package/templates/default/docs/plans/effervescent-munching-kite.md +263 -0
  32. package/templates/default/docs/plans/fix-orphan-cleaner-review.md +25 -0
  33. package/templates/default/docs/plans/fix-sync-template-variables.md +162 -0
  34. package/templates/default/docs/plans/glimmering-giggling-sedgewick.md +126 -0
  35. package/templates/default/docs/plans/glittery-swimming-bachman.md +78 -0
  36. package/templates/default/docs/plans/happy-watching-toast.md +56 -0
  37. package/templates/default/docs/plans/harmonic-strolling-nebula.md +210 -0
  38. package/templates/default/docs/plans/import-alias-refactor.md +75 -0
  39. package/templates/default/docs/plans/lazy-percolating-sloth-agent-abda679.md +346 -0
  40. package/templates/default/docs/plans/lazy-percolating-sloth.md +151 -0
  41. package/templates/default/docs/plans/linked-greeting-llama-agent-a7a6e5b.md +345 -0
  42. package/templates/default/docs/plans/linked-greeting-llama.md +467 -0
  43. package/templates/default/docs/plans/lovely-bubbling-rose.md +80 -0
  44. package/templates/default/docs/plans/optimized-watching-sprout.md +149 -0
  45. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a292da6.md +288 -0
  46. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a819699.md +366 -0
  47. package/templates/default/docs/plans/peaceful-beaming-toast-agent-ac11de2.md +474 -0
  48. package/templates/default/docs/plans/peaceful-beaming-toast.md +345 -0
  49. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6194c.md +300 -0
  50. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6900e.md +444 -0
  51. package/templates/default/docs/plans/purrfect-spinning-hickey.md +361 -0
  52. package/templates/default/docs/plans/recursive-kindling-lemon-agent-a42199e.md +186 -0
  53. package/templates/default/docs/plans/recursive-kindling-lemon.md +36 -0
  54. package/templates/default/docs/plans/seed-migration-tests.md +47 -0
  55. package/templates/default/docs/plans/sprightly-leaping-manatee.md +224 -0
  56. package/templates/default/docs/plans/stateful-wishing-lerdorf.md +161 -0
  57. package/templates/default/docs/plans/streamed-purring-wreath.md +40 -0
  58. package/templates/default/docs/plans/synthetic-percolating-pearl.md +101 -0
  59. package/templates/default/docs/plans/todo-fix-sync-template-variables.md +21 -0
  60. package/templates/default/docs/plans/todo-phase4-marker-update.md +39 -0
  61. package/templates/default/docs/plans/todo-skill-creator-sync.md +23 -0
  62. package/templates/default/docs/plans/typed-snuggling-parnas-agent-a6f6391.md +476 -0
  63. package/templates/default/docs/plans/typed-snuggling-parnas-agent-adb678b.md +144 -0
  64. package/templates/default/docs/plans/typed-snuggling-parnas.md +84 -0
  65. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a30aa4f.md +534 -0
  66. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a57a278.md +508 -0
  67. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a90b809.md +421 -0
  68. package/templates/default/docs/plans/warm-hopping-lighthouse.md +199 -0
  69. package/templates/default/docs/verification-test.md +2 -0
  70. package/templates/default/gitignore +4 -0
  71. package/templates/default/package.json +2 -2
  72. package/templates/default/packages/admin-ui/package.json +1 -1
  73. package/templates/default/packages/server-core/tsconfig.json +6 -1
  74. package/templates/default/pnpm-lock.yaml +276 -57
  75. package/templates/default/scripts/ensure-serena.sh +75 -0
  76. package/templates/default/scripts/lib/worktree-config.ts +64 -0
  77. package/templates/default/scripts/stop-serena.sh +25 -0
  78. package/templates/default/scripts/worktree/dev.ts +2 -2
  79. /package/templates/default/scripts/{cli-template-update.ts → _cli-template-update.ts} +0 -0
  80. /package/templates/default/scripts/{template-update.ts → _template-update.ts} +0 -0
@@ -0,0 +1,75 @@
1
+ # インポートエイリアス書き換え: packages/server-core
2
+
3
+ ## 実施日
4
+ 2026-02-26
5
+
6
+ ## 目的
7
+ packages/server-core の相対パスインポートを `@/` エイリアスに統一し、コードの可読性と保守性を向上させる。
8
+
9
+ ## 変更ファイル一覧
10
+
11
+ ### 1. tsconfig.json 修正
12
+
13
+ #### `packages/server-core/tsconfig.json`
14
+ - `paths` エイリアスを追加: `@/*` → `./src/*`
15
+
16
+ ### 2. インポートパス書き換え (8ファイル)
17
+
18
+ | ファイル | 変更内容 |
19
+ |---------|---------|
20
+ | `src/domain/entities/User.test.ts` | `../../testing` → `@/testing` |
21
+ | `src/domain/repository-interfaces/IUserRepository.ts` | `../../core/result`, `../entities/User` → `@/` 形式 |
22
+ | `src/infrastructure/database/mappers/UserMapper.ts` | `../../../domain/entities/User` → `@/domain/entities/User` |
23
+ | `src/infrastructure/database/repositories/UserRepository.ts` | 5箇所の相対パス → `@/` 形式 |
24
+ | `src/infrastructure/database/mappers/UserMapper.test.ts` | `../../../` 形式 → `@/` 形式 |
25
+ | `src/infrastructure/database/repositories/UserRepository.test.ts` | `../../../` 形式、`../client` → `@/` 形式 |
26
+ | `src/testing/factories/index.ts` | `../../__generated__/fabbrica` → `@/__generated__/fabbrica` |
27
+ | `src/testing/factories/user.factory.ts` | 4箇所の相対パス → `@/` 形式 |
28
+
29
+ ### 3. モノレポ対応 (2ファイル)
30
+
31
+ #### `apps/web/tsconfig.json`
32
+ - `paths` に `@/*` のマッピングを拡張: `["./src/*", "../../packages/server-core/src/*"]`
33
+ - server-core の `@/` エイリアスを解決できるよう設定
34
+
35
+ #### `apps/admin/tsconfig.json`
36
+ - 同上
37
+
38
+ ## 検証結果
39
+
40
+ ### TypeScript 型チェック
41
+ ```bash
42
+ pnpm prepush:typecheck
43
+ ```
44
+ ✅ 成功 - モジュール解決エラーなし
45
+
46
+ ### Vitest テスト
47
+ ```bash
48
+ pnpm --filter @repo/server-core test
49
+ ```
50
+ ✅ 全59テスト成功
51
+
52
+ ### 影響範囲
53
+ - **破壊的変更**: なし(内部的なインポートパスの変更のみ)
54
+ - **外部API**: 変更なし
55
+ - **ビルド**: 正常
56
+
57
+ ## 技術メモ
58
+
59
+ ### モノレポでのエイリアス解決
60
+ - `@/` エイリアスは **パッケージ内部の相対パス解決** のためのもの
61
+ - 他パッケージから参照する場合、参照元の tsconfig にもエイリアスマッピングが必要
62
+ - 解決方法:
63
+ 1. TypeScript Project References を使用
64
+ 2. 参照元の `paths` に参照先のエイリアスを追加(今回採用)
65
+
66
+ ### vitest.config.ts
67
+ - 既に `alias: { "@": path.resolve(__dirname, "./src") }` が設定済み
68
+ - 変更不要
69
+
70
+ ## 残存課題
71
+ なし
72
+
73
+ ## 次のステップ
74
+ - 他パッケージでも同様に `@/` エイリアス導入を検討
75
+ - `@repo/front-core` などでも統一
@@ -0,0 +1,346 @@
1
+ # Plan Review: `/sync` コマンド
2
+
3
+ ## ✅ 総合評価: **実装可能(重要な修正が必要)**
4
+
5
+ 提案されたPlanは基本的に実行可能ですが、**カテゴリ重複問題**という重大な見落としがあります。
6
+
7
+ ---
8
+
9
+ ## 1. 実現可能性: ⚠️ 一部修正が必要
10
+
11
+ ### 1.1 CLI検出ロジック: ✅ 問題なし
12
+
13
+ ```bash
14
+ npx @einja/dev-cli --version 2>/dev/null
15
+ npx create-einja-app --version 2>/dev/null
16
+ ```
17
+
18
+ この方法で両CLIの存在を確認できます。
19
+
20
+ ### 1.2 dry-runの実行: ✅ オプション構文は正しい
21
+
22
+ | CLI | dry-run | yes | json | categories |
23
+ |-----|---------|-----|------|-----------|
24
+ | dev-cli | `-d, --dry-run` ✅ | `-y, --yes` ✅ | `-j, --json` ✅ | `-o, --only <categories>` ✅ |
25
+ | create-einja-app | `--dry-run` ✅ | なし ⚠️ | なし ⚠️ | `--categories <categories>` ✅ |
26
+
27
+ **注意**: create-einja-appには `--yes` オプションがないため、dry-run後の実行確認プロンプトは表示されない(`--categories`指定時は対話なしで即実行される)
28
+
29
+ ### 1.3 カテゴリ指定時の対話プロンプトスキップ: ✅ 正しい
30
+
31
+ create-einja-appの実装(sync.ts:168-184行目):
32
+
33
+ ```typescript
34
+ if (options.categories) {
35
+ // --categories指定時: 対話なし
36
+ categories = options.categories as SyncCategory[];
37
+ logger.info(`指定されたカテゴリ: ${categories.join(", ")}`);
38
+ }
39
+ ```
40
+
41
+ **結論**: ✅ `--categories` 指定時は対話プロンプトがスキップされる(Planの想定どおり)
42
+
43
+ ---
44
+
45
+ ## 2. ユーザー体験: ✅ 概ね良好
46
+
47
+ ### 2.1 フロー全体
48
+
49
+ ```
50
+ CLI検出 → カテゴリ選択 → dry-run → 実行確認 → sync → コンフリクト解消 → 完了
51
+ ```
52
+
53
+ このフローは直感的で使いやすい。
54
+
55
+ ### 2.2 改善提案: カテゴリ選択UIの強化
56
+
57
+ **現状のPlan**:
58
+ > multiSelect=true で複数選択
59
+
60
+ **推奨する具体的なUI(2段階選択)**:
61
+
62
+ **第1段階: 簡易/詳細選択**
63
+
64
+ ```yaml
65
+ AskUserQuestion:
66
+ question: "同期方法を選択してください"
67
+ header: "テンプレート同期"
68
+ options:
69
+ - label: "📦 推奨セット(両CLIのデフォルト)"
70
+ description: "dev-cli全カテゴリ + create-einja-app推奨カテゴリ"
71
+ - label: "⚙️ カスタム選択"
72
+ description: "個別にカテゴリを選択する"
73
+ ```
74
+
75
+ **第2段階(カスタム選択時のみ)**:
76
+
77
+ ```yaml
78
+ AskUserQuestion:
79
+ question: "同期するカテゴリを選択してください(複数選択可)"
80
+ header: "カテゴリ選択"
81
+ multiSelect: true
82
+ options:
83
+ # dev-cli カテゴリ
84
+ - label: "📝 commands (dev-cli)"
85
+ description: "Claude Codeコマンド (.claude/commands/)"
86
+ default: true
87
+ - label: "🤖 agents (dev-cli)"
88
+ description: "Claude Codeエージェント (.claude/agents/)"
89
+ default: true
90
+ - label: "🎯 skills (dev-cli)"
91
+ description: "Claude Codeスキル (.claude/skills/)"
92
+ default: true
93
+ - label: "🪝 hooks (dev-cli)"
94
+ description: "Claude Codeフック (.claude/hooks/)"
95
+ default: true
96
+ - label: "📄 docs - Claude関連 (dev-cli)"
97
+ description: "docs/einja/ 配下のドキュメント"
98
+ default: true
99
+ - label: "🔧 env (dev-cli)"
100
+ description: ".envrc ファイル"
101
+ default: true
102
+ - label: "⚙️ tools (dev-cli)"
103
+ description: ".vscode/settings.json ファイル"
104
+ default: true
105
+
106
+ # create-einja-app カテゴリ
107
+ - label: "🌍 env (create-einja-app)"
108
+ description: ".env.example, .node-version, .volta/ 等"
109
+ default: true
110
+ - label: "🛠️ tools (create-einja-app)"
111
+ description: "biome.json, .prettierrc, .editorconfig, .vscode/ 等"
112
+ default: true
113
+ - label: "📄 docs - プロジェクト全体 (create-einja-app)"
114
+ description: "README.md, docs/ 全体"
115
+ default: true
116
+ - label: "🔐 git (create-einja-app)"
117
+ description: ".gitignore, .gitattributes"
118
+ default: true
119
+ - label: "🪝 git-hooks (create-einja-app)"
120
+ description: ".husky/ フック"
121
+ default: true
122
+ - label: "🐙 github (create-einja-app)"
123
+ description: ".github/workflows/, .github/actions/"
124
+ default: true
125
+ - label: "🐳 docker (create-einja-app)"
126
+ description: "Dockerfile*, docker-compose.yml"
127
+ default: true
128
+ - label: "📦 monorepo (create-einja-app)"
129
+ description: "turbo.json, pnpm-workspace.yaml"
130
+ default: true
131
+ - label: "📋 root-config (create-einja-app)"
132
+ description: "package.json, tsconfig.json"
133
+ default: true
134
+ - label: "📜 scripts (create-einja-app)"
135
+ description: "scripts/**"
136
+ default: true
137
+ - label: "🚫 apps (create-einja-app)"
138
+ description: "apps/** (通常は非推奨)"
139
+ default: false
140
+ - label: "🚫 packages (create-einja-app)"
141
+ description: "packages/** (通常は非推奨)"
142
+ default: false
143
+ ```
144
+
145
+ ---
146
+
147
+ ## 3. エッジケース: 🔴 重大な見落としあり
148
+
149
+ ### 3.1 片方のCLIのみインストール済みの場合: ✅ OK
150
+
151
+ Planの記述どおり、検出されたCLIのみ使用すればよい。
152
+
153
+ ### 3.2 カテゴリ重複問題: 🔴 **重大な問題**
154
+
155
+ **実装調査結果**:
156
+
157
+ | カテゴリ | dev-cli | create-einja-app | 管理対象ファイル | 重複 |
158
+ |---------|---------|------------------|-----------------|------|
159
+ | commands | ✅ | ❌ | `.claude/commands/` | ❌ |
160
+ | agents | ✅ | ❌ | `.claude/agents/` | ❌ |
161
+ | skills | ✅ | ❌ | `.claude/skills/` | ❌ |
162
+ | hooks | ✅ | ❌ | `.claude/hooks/` | ❌ |
163
+ | **env** | ✅ `.envrc` | ✅ `.env*`, `.node-version`, `.volta/` | **異なるファイル** | ✅ |
164
+ | **tools** | ✅ `.vscode/settings.json` | ✅ `biome.json`, `.prettierrc`, `.editorconfig`, `.vscode/` | **部分的に重複** | ⚠️ |
165
+ | **docs** | ✅ `docs/einja/` | ✅ `README.md`, `docs/` | **異なる範囲** | ✅ |
166
+
167
+ **重複カテゴリの詳細**:
168
+
169
+ #### a) env: ファイルが異なる → 問題なし
170
+
171
+ - dev-cli: `.envrc` のみ
172
+ - create-einja-app: `.env.example`, `.env.local.example`, `.node-version`, `.nvmrc`, `.volta/`
173
+
174
+ **結論**: ファイル重複なし。両方実行しても問題ない。
175
+
176
+ #### b) tools: .vscode/settings.json が重複 → 🔴 **コンフリクトの可能性**
177
+
178
+ - dev-cli: `.vscode/settings.json`
179
+ - create-einja-app: `biome.json`, `.prettierrc`, `.editorconfig`, `.vscode/`(settings.jsonを含む)
180
+
181
+ **問題**: 両方実行すると `.vscode/settings.json` が2回同期され、後者が上書きする可能性がある。
182
+
183
+ **対策**:
184
+ 1. ユーザーにツールチップで警告表示
185
+ 2. 両方選択された場合、dev-cliのtools実行後にcreate-einja-appのtoolsをスキップ(または統合マージ)
186
+
187
+ #### c) docs: 範囲が異なる → 問題なし
188
+
189
+ - dev-cli: `docs/einja/` 配下のみ
190
+ - create-einja-app: `README.md`, `docs/` 全体
191
+
192
+ **結論**: 範囲が異なるため、両方実行しても問題ない(create-einja-appが上位集合)。
193
+
194
+ ---
195
+
196
+ ### 3.3 コンフリクト発生時のフロー: ⚠️ 詳細化が必要
197
+
198
+ **Planの記述**:
199
+ > コンフリクトがあれば `einja-conflict-resolver` Skill の手順に従って解消
200
+
201
+ **問題点**:
202
+
203
+ 1. **conflict-resolver Skillは1ファイルずつユーザー確認を行う**(SKILL.md Step 2参照)
204
+ 2. sync操作でのコンフリクトは**gitコンフリクトではない**(マージマーカーが挿入されたファイル)
205
+ 3. conflict-resolverはgitコンフリクト専用(rebase/merge/cherry-pick)
206
+
207
+ **推奨フロー**:
208
+
209
+ ```markdown
210
+ ### Step 5-A: コンフリクト検出
211
+
212
+ 1. dev-cliのJSON出力をパース:
213
+ ```json
214
+ {
215
+ "status": "partial_success",
216
+ "summary": { "conflicts": 3 }
217
+ }
218
+ ```
219
+
220
+ 2. create-einja-appの出力から検出:
221
+ ```
222
+ ⚠️ コンフリクト: 3ファイル
223
+ ```
224
+
225
+ ### Step 5-B: コンフリクト解消(簡易版)
226
+
227
+ **オプション1: 自動マージ再試行**
228
+
229
+ コンフリクトファイルを読み取り、マージマーカー(`<<<<<<<`, `=======`, `>>>>>>>`)を検出。
230
+ 各セクションの内容をユーザーに提示し、AskUserQuestionで解消方針を確認。
231
+
232
+ **オプション2: conflict-resolverへ委譲(非推奨)**
233
+
234
+ gitにコミット後、`git reset --soft HEAD^`で擬似的にコンフリクト状態を作り、
235
+ conflict-resolverで解消。ただし、これは不自然なフローのため非推奨。
236
+
237
+ **推奨**: オプション1の簡易版を実装
238
+ ```
239
+
240
+ ---
241
+
242
+ ## 4. create-einja-app syncの非対話実行: ✅ 確認済み
243
+
244
+ **仕様確認結果**(commands/sync.ts:168-184行目):
245
+
246
+ ```typescript
247
+ if (options.categories) {
248
+ // --categories指定時: 対話なし
249
+ categories = options.categories as SyncCategory[];
250
+ logger.info(`指定されたカテゴリ: ${categories.join(", ")}`);
251
+ }
252
+ ```
253
+
254
+ **結論**: ✅ `--categories` 指定時は対話プロンプトをスキップする(Planの想定どおり)
255
+
256
+ ---
257
+
258
+ ## 5. 見落とし・追加検討事項
259
+
260
+ ### 5.1 エラーハンドリング: ⚠️ 不足
261
+
262
+ **追加すべき項目**:
263
+
264
+ - npxコマンド失敗時の処理(タイムアウト、権限エラー等)
265
+ - 両CLIのバージョン不一致警告(古いバージョンの場合)
266
+ - バックアップファイルの管理(両CLIが別々にバックアップを作成するため、復元時の競合)
267
+
268
+ ### 5.2 実行順序: ⚠️ 明示が必要
269
+
270
+ **推奨順序**:
271
+
272
+ 1. dev-cli sync(Claude Code関連ファイル)
273
+ 2. create-einja-app sync(プロジェクト全体)
274
+
275
+ **理由**: dev-cliが先にClaude Code環境を整備し、create-einja-appがプロジェクト全体を同期する方が自然な流れ。
276
+
277
+ ### 5.3 結果サマリーの統合: ⚠️ 不足
278
+
279
+ **Planには結果サマリー表示があるが、詳細が不足**:
280
+
281
+ ```markdown
282
+ ### Step 6: 結果サマリー表示
283
+
284
+ | CLI | カテゴリ | 成功 | スキップ | コンフリクト | 合計 |
285
+ |-----|---------|------|---------|-------------|------|
286
+ | dev-cli | commands, agents, skills | 15 | 2 | 0 | 17 |
287
+ | create-einja-app | env, tools, git | 8 | 1 | 1 | 10 |
288
+ | **合計** | | **23** | **3** | **1** | **27** |
289
+
290
+ **コンフリクトファイル**:
291
+ - `.vscode/settings.json` (tools重複)
292
+
293
+ **次のステップ**:
294
+ コンフリクトを解消してください: [解消手順へのリンク]
295
+ ```
296
+
297
+ ### 5.4 ビルド時のコピー: ✅ 確認済み
298
+
299
+ Planに記載のとおり、`.claude/commands/einja/sync.md` は既存の `copy-presets.mjs` で自動的に `presets/default/.claude/commands/einja/sync.md` へコピーされる。
300
+
301
+ **確認方法**:
302
+
303
+ ```bash
304
+ # ビルド実行
305
+ pnpm build
306
+
307
+ # コピー確認
308
+ ls presets/default/.claude/commands/einja/sync.md
309
+ ```
310
+
311
+ ---
312
+
313
+ ## 最終推奨事項
314
+
315
+ ### 必須修正
316
+
317
+ 1. **カテゴリ選択UIの詳細化**: dev-cli/create-einja-app でカテゴリ名が重複する場合、UI上で明示的に区別する
318
+ 2. **tools重複警告の実装**: 両方のtoolsカテゴリが選択された場合、`.vscode/settings.json` 重複を警告
319
+ 3. **コンフリクト解消フローの詳細化**: sync専用の簡易的なコンフリクト解消ロジックを記述(conflict-resolver Skillは不適切)
320
+
321
+ ### 推奨改善
322
+
323
+ 1. 実行順序の明示(dev-cli → create-einja-app)
324
+ 2. エラーハンドリングの追加
325
+ 3. 結果サマリーの統合表示
326
+
327
+ ### オプション
328
+
329
+ 1. 両CLIのバージョンチェック
330
+ 2. バックアップ管理の統合
331
+
332
+ ---
333
+
334
+ ## Plan修正案のサマリー
335
+
336
+ | 項目 | 現状 | 推奨 |
337
+ |-----|------|------|
338
+ | カテゴリ選択UI | 簡易版 | 2段階選択(簡易/詳細) |
339
+ | カテゴリ重複対応 | 未対応 | UI上で区別 + 警告表示 |
340
+ | コンフリクト解消 | conflict-resolver委譲 | sync専用の簡易ロジック |
341
+ | 実行順序 | 未定義 | dev-cli → create-einja-app |
342
+ | 結果サマリー | 基本版 | 統合表示 + コンフリクト詳細 |
343
+
344
+ ---
345
+
346
+ **最終結論**: このPlanは**実装可能**ですが、カテゴリ重複問題への対応とコンフリクト解消フローの詳細化が必須です。
@@ -0,0 +1,151 @@
1
+ # Plan: `/sync` コマンドの作成
2
+
3
+ ## Context
4
+
5
+ 利用者が別リポジトリでテンプレート更新を取り込む際、`npx @einja/dev-cli sync` と `npx create-einja-app sync` を手動実行する必要がある。これを Claude Code コマンド一発で選択式に実行できるようにする。
6
+
7
+ ## 作成ファイル
8
+
9
+ **`.claude/commands/einja/sync.md`** — 1ファイルのみ
10
+
11
+ ## コマンド仕様
12
+
13
+ ### フロントマター
14
+
15
+ ```yaml
16
+ ---
17
+ description: "テンプレート同期を実行。dev-cli/create-einja-appのsyncをカテゴリ選択式で実行し、コンフリクトも自動解消します"
18
+ allowed-tools: Bash, AskUserQuestion, Read, Grep, Glob
19
+ ---
20
+ ```
21
+
22
+ ### 処理フロー
23
+
24
+ #### Step 1: CLI検出
25
+
26
+ ```bash
27
+ npx @einja/dev-cli --version 2>/dev/null
28
+ npx create-einja-app --version 2>/dev/null
29
+ ```
30
+
31
+ - 両方なし → エラー終了
32
+ - 片方のみ → そちらだけ使用
33
+ - 両方あり → 両方利用可能として進む
34
+
35
+ #### Step 2: カテゴリ選択(AskUserQuestion)
36
+
37
+ 利用可能なCLIに応じて、**2段階**で選択肢を提示。
38
+
39
+ **質問1: 同期ソースの選択**(両方利用可能な場合のみ)
40
+ - dev-cli のみ(Claude Code関連ファイル)
41
+ - create-einja-app のみ(プロジェクトテンプレート)
42
+ - 両方
43
+
44
+ **質問2: カテゴリ選択**(multiSelect=true)
45
+
46
+ dev-cli と create-einja-app のカテゴリは**明確に区別して表示**する。
47
+
48
+ | 表示名 | CLI | 対象 | デフォルト |
49
+ |--------|-----|------|-----------|
50
+ | [dev-cli] commands | dev-cli | `.claude/commands/` | ON |
51
+ | [dev-cli] agents | dev-cli | `.claude/agents/` | ON |
52
+ | [dev-cli] skills | dev-cli | `.claude/skills/` | ON |
53
+ | [dev-cli] hooks | dev-cli | `.claude/hooks/` | ON |
54
+ | [dev-cli] docs | dev-cli | `docs/einja/` | ON |
55
+ | [dev-cli] env | dev-cli | `.envrc` | ON |
56
+ | [dev-cli] tools | dev-cli | `.vscode/settings.json` | ON |
57
+ | [create-app] env | create-app | `.env*`, `.node-version` | ON |
58
+ | [create-app] tools | create-app | `biome.json`, `.prettierrc`, `.editorconfig` | ON |
59
+ | [create-app] git | create-app | `.gitignore`, `.gitattributes` | ON |
60
+ | [create-app] git-hooks | create-app | `.husky/` | ON |
61
+ | [create-app] github | create-app | `.github/workflows/`, `.github/actions/` | ON |
62
+ | [create-app] docker | create-app | `Dockerfile*`, `docker-compose*.yml` | ON |
63
+ | [create-app] monorepo | create-app | `turbo.json`, `pnpm-workspace.yaml` | ON |
64
+ | [create-app] root-config | create-app | `package.json`, `tsconfig.json` | ON |
65
+ | [create-app] scripts | create-app | `scripts/` | ON |
66
+ | [create-app] docs | create-app | `README.md`, `docs/` | ON |
67
+ | [create-app] apps | create-app | `apps/**` | **OFF** |
68
+ | [create-app] packages | create-app | `packages/**` | **OFF** |
69
+
70
+ > **重複に関する注意**: dev-cli の `tools` は `.vscode/settings.json` のみ、create-app の `tools` は `biome.json` 等。`.vscode/` 配下は dev-cli 側が管理するため、create-app 側の tools から `.vscode/` を除外する旨を説明に含める。
71
+
72
+ #### Step 3: dry-run で差分プレビュー
73
+
74
+ 選択されたカテゴリで dry-run を実行し、差分をユーザーに表示。
75
+
76
+ ```bash
77
+ # dev-cli
78
+ npx @einja/dev-cli sync --only <categories> --dry-run --yes
79
+
80
+ # create-einja-app
81
+ npx create-einja-app sync --categories <categories> --dry-run
82
+ ```
83
+
84
+ #### Step 4: 実行確認 → sync実行
85
+
86
+ 差分プレビューを見せた上で、ユーザーに実行可否を確認。
87
+
88
+ **実行順序: dev-cli → create-einja-app**(dev-cliがClaude Code設定を先に更新)
89
+
90
+ ```bash
91
+ # dev-cli
92
+ npx @einja/dev-cli sync --only <categories> --yes --json
93
+
94
+ # create-einja-app
95
+ npx create-einja-app sync --categories <categories>
96
+ ```
97
+
98
+ dev-cli は `--json` で構造化出力を取得しパース。
99
+
100
+ #### Step 5: コンフリクト検出 → 手動解消サポート
101
+
102
+ - dev-cli: JSON出力の `status: "partial_success"` + `conflicts > 0` で検出
103
+ - create-einja-app: 出力の「コンフリクト」文字列で検出
104
+
105
+ **コンフリクト時の対応**(sync固有のコンフリクトはgitコンフリクトとは異なる):
106
+ 1. コンフリクトファイルの一覧を表示
107
+ 2. 各ファイルの差分内容を `Read` で確認
108
+ 3. ユーザーに解決方針を確認(テンプレート優先 / ローカル優先 / 手動マージ)
109
+ 4. 方針に従って `Edit` で解消
110
+
111
+ #### Step 6: 結果サマリー表示
112
+
113
+ | 項目 | dev-cli | create-einja-app |
114
+ |------|---------|------------------|
115
+ | 成功 | N件 | N件 |
116
+ | スキップ | N件 | N件 |
117
+ | コンフリクト | N件 | N件 |
118
+
119
+ #### Step 7: 結果詳細表示
120
+
121
+ サマリーの後に、各ファイルの詳細結果を表示。
122
+
123
+ ```markdown
124
+ ### dev-cli sync 詳細
125
+ ✓ .claude/commands/einja/task-exec.md (更新)
126
+ ✓ .claude/skills/einja-coding-standards/SKILL.md (更新)
127
+ ⏭ .claude/agents/einja/task-executer.md (変更なし)
128
+ ⚠ .claude/hooks/einja/pre-commit.sh (コンフリクト → 解消済み)
129
+
130
+ ### create-einja-app sync 詳細
131
+ ✨ .github/workflows/ci.yml (新規)
132
+ ✓ biome.json (更新)
133
+ ⏭ .gitignore (変更なし)
134
+ ```
135
+
136
+ - dev-cli: `--json` 出力の `files` 配列をパースして表示
137
+ - create-einja-app: 標準出力から `✓` / `⚠️` / `スキップ` 行を抽出して表示
138
+
139
+ ## 実装の注意点
140
+
141
+ - コマンドはマークダウンプロンプト(Claude Codeへの指示書)として書く
142
+ - 実際のロジックはClaude Codeが解釈して実行する
143
+ - `npx` 経由で実行(利用者側にインストール不要)
144
+ - create-einja-app sync には `--yes` がないが、`--categories` 指定時は対話プロンプトをスキップする
145
+ - `.vscode/` の重複管理: dev-cli 側で管理。create-app の tools を選択してもClaude Codeが `.vscode/` 以外のファイルのみ対象とする旨を指示
146
+
147
+ ## 検証方法
148
+
149
+ 1. `.claude/commands/einja/sync.md` が正しいフロントマター形式であること
150
+ 2. このリポジトリで `/sync` を実行し、フローが正常に動作すること(CLI検出 → カテゴリ選択 → dry-run → 実行)
151
+ 3. ビルド時に `presets/default/.claude/commands/einja/sync.md` へ自動コピーされること(既存のcopy-presets.mjsで対応済み)