@einja/dev-cli 0.1.23 → 0.1.25

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 (30) hide show
  1. package/README.md +54 -30
  2. package/dist/cli.js +3 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +10 -46
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/sync.d.ts.map +1 -1
  8. package/dist/commands/sync.js +21 -0
  9. package/dist/commands/sync.js.map +1 -1
  10. package/dist/lib/dependency-checker.d.ts +31 -0
  11. package/dist/lib/dependency-checker.d.ts.map +1 -0
  12. package/dist/lib/dependency-checker.js +259 -0
  13. package/dist/lib/dependency-checker.js.map +1 -0
  14. package/dist/lib/package-manager.d.ts +15 -0
  15. package/dist/lib/package-manager.d.ts.map +1 -0
  16. package/dist/lib/package-manager.js +71 -0
  17. package/dist/lib/package-manager.js.map +1 -0
  18. package/dist/types/index.d.ts +20 -0
  19. package/dist/types/index.d.ts.map +1 -1
  20. package/package.json +1 -1
  21. package/presets/default/.claude/agents/einja/design-engineer.md +252 -434
  22. package/presets/default/.claude/agents/einja/frontend-architect.md +11 -11
  23. package/presets/default/.claude/agents/einja/frontend-coder.md +33 -21
  24. package/presets/default/.claude/skills/einja-coding-standards/SKILL.md +27 -16
  25. package/presets/default/.claude/skills/einja-component-design/SKILL.md +4 -4
  26. package/presets/default/.claude/skills/einja-component-design/reference/styling-guide.md +53 -131
  27. package/presets/default/preset.yaml +27 -0
  28. package/scaffolds/cli/preset.yaml +27 -0
  29. package/scaffolds/instructions/deployment-setup.md +40 -41
  30. package/scaffolds/steering/infrastructure/deployment.md +459 -66
@@ -15,10 +15,11 @@
15
15
 
16
16
  1. [デプロイメントアーキテクチャ](#1-デプロイメントアーキテクチャ)
17
17
  2. [プラットフォーム選定理由](#2-プラットフォーム選定理由)
18
- 3. [CI/CDパイプライン設計](#3-cicdパイプライン設計)
19
- 4. [キャッシュ戦略](#4-キャッシュ戦略)
20
- 5. [Worktree対応設計](#5-worktree対応設計)
21
- 6. [ロールバック戦略](#6-ロールバック戦略)
18
+ 3. [GitHub Actionsワークフロー](#3-github-actionsワークフロー)
19
+ 4. [ブランチ別デプロイフロー](#4-ブランチ別デプロイフロー)
20
+ 5. [キャッシュ戦略](#5-キャッシュ戦略)
21
+ 6. [Worktree対応設計](#6-worktree対応設計)
22
+ 7. [ロールバック戦略](#7-ロールバック戦略)
22
23
 
23
24
  ---
24
25
 
@@ -30,12 +31,22 @@
30
31
  graph TB
31
32
  subgraph "GitHub Repository"
32
33
  Main[main branch]
34
+ Develop[develop branch]
35
+ Staging[staging branch]
33
36
  Feature[feature branches]
34
37
  end
35
38
 
39
+ subgraph "GitHub Actions"
40
+ DeployStable[Deploy Stable Branches<br/>CI → Deploy]
41
+ DeployPR[Deploy PR Preview<br/>CI → Neon → Deploy]
42
+ Cleanup[Cleanup DB<br/>毎日00:00 UTC]
43
+ end
44
+
36
45
  subgraph "Vercel Platform"
37
46
  WebProd[web - Production]
38
- WebPreview[web - Preview]
47
+ WebDev[web - Develop]
48
+ WebStg[web - Staging]
49
+ WebPreview[web - PR Preview]
39
50
  end
40
51
 
41
52
  subgraph "Railway Platform"
@@ -43,17 +54,28 @@ graph TB
43
54
  end
44
55
 
45
56
  subgraph "Neon Database"
46
- DBProd[(Production DB)]
47
- DBPreview[(Preview DB - 動的生成)]
57
+ DBProd[(Production DB<br/>定常ブランチ)]
58
+ DBPreview[(Preview DB<br/>動的生成)]
48
59
  end
49
60
 
50
- Main -->|Auto Deploy| WebProd
51
- Main -->|Auto Deploy| CronProd
61
+ Main -->|push| DeployStable
62
+ Develop -->|push| DeployStable
63
+ Staging -->|push| DeployStable
64
+ Feature -->|PR| DeployPR
65
+
66
+ DeployStable -->|main| WebProd
67
+ DeployStable -->|develop| WebDev
68
+ DeployStable -->|staging| WebStg
69
+ DeployPR --> WebPreview
70
+
71
+ Main -->|push| CronProd
52
72
 
53
- Feature -->|PR Deploy| WebPreview
54
- Feature -->|Create Branch| DBPreview
73
+ DeployPR -->|Create Branch| DBPreview
74
+ Cleanup -->|Delete orphaned| DBPreview
55
75
 
56
76
  WebProd --> DBProd
77
+ WebDev --> DBProd
78
+ WebStg --> DBProd
57
79
  WebPreview --> DBPreview
58
80
  CronProd --> DBProd
59
81
  ```
@@ -62,9 +84,9 @@ graph TB
62
84
 
63
85
  | アプリケーション | プラットフォーム | デプロイトリガー | 環境 |
64
86
  |----------------|--------------|--------------|------|
65
- | web | Vercel | main push, PR作成 | Production, Preview |
87
+ | web | Vercel | main/develop/staging push, PR作成 | Production, Preview |
66
88
  | cron-worker | Railway | main push | Production |
67
- | Database | Neon | main push, PR作成 | Production, Preview(動的生成) |
89
+ | Database | Neon | PR作成時のみ動的生成 | Production, Preview(動的生成) |
68
90
 
69
91
  ---
70
92
 
@@ -98,77 +120,447 @@ graph TB
98
120
 
99
121
  ---
100
122
 
101
- ## 3. CI/CDパイプライン設計
123
+ ## 3. GitHub Actionsワークフロー
124
+
125
+ ### ワークフロー一覧
126
+
127
+ ```mermaid
128
+ graph LR
129
+ subgraph "ワークフロー構成"
130
+ DeployStable[deploy-stable-branches.yml]
131
+ DeployPR[deploy-pr-preview.yml]
132
+ CleanupClose[cleanup-pr-preview-on-close.yml]
133
+ Cleanup[cleanup-pr-preview-db.yml]
134
+ ReleaseCLI[release-cli.yml]
135
+ ReleaseApp[release-create-einja-app.yml]
136
+ Claude[claude.yml]
137
+ end
138
+
139
+ subgraph "Composite Actions"
140
+ SetupAction[.github/actions/setup/action.yml]
141
+ CIAction[.github/actions/ci/action.yml]
142
+ MigrateAction[.github/actions/migrate/action.yml]
143
+ NeonExportEnv[.github/actions/neon-export-env/action.yml]
144
+ end
145
+
146
+ DeployStable --> CIAction
147
+ DeployStable --> MigrateAction
148
+ DeployPR --> CIAction
149
+ DeployPR --> NeonExportEnv
150
+ CleanupClose --> NeonExportEnv
151
+ CIAction --> SetupAction
152
+ MigrateAction --> SetupAction
153
+ Cleanup --> SetupAction
154
+ ```
155
+
156
+ | ワークフロー | ファイル | トリガー | 用途 |
157
+ |------------|---------|---------|------|
158
+ | **Deploy Stable** | `deploy-stable-branches.yml` | push to main/develop/staging | CI → 本番・開発・ステージング環境デプロイ |
159
+ | **PR Preview** | `deploy-pr-preview.yml` | PR opened/sync/closed | CI → Neonブランチ作成 → プレビューデプロイ |
160
+ | **PR Close Cleanup** | `cleanup-pr-preview-on-close.yml` | PR closed | Neonブランチの即座削除(PR close時) |
161
+ | **Cleanup DB** | `cleanup-pr-preview-db.yml` | 毎日00:00 UTC / 手動 | 孤立したNeonブランチ削除 |
162
+ | **Release CLI** | `release-cli.yml` | tag `cli-v*` / 手動 | @einja/dev-cli をNPM公開 |
163
+ | **Release App** | `release-create-einja-app.yml` | tag `create-einja-app-v*` / 手動 | create-einja-app をNPM公開 |
164
+ | **Claude** | `claude.yml` | @claude メンション | Claude Code実行 |
165
+
166
+ ### Composite Actions(2層構造)
167
+
168
+ バージョン番号を1箇所に集約し、DRY原則に従った構成:
169
+
170
+ ```mermaid
171
+ flowchart TB
172
+ subgraph "setup/action.yml"
173
+ S1[pnpm setup<br/>v10.14.0] --> S2[Node.js setup<br/>v22.16.0]
174
+ S2 --> S3[pnpm install]
175
+ end
176
+
177
+ subgraph "ci/action.yml"
178
+ C1[setup action 呼び出し] --> C2[pnpm generate]
179
+ C2 --> C3[pnpm typecheck]
180
+ C3 --> C4[pnpm lint]
181
+ C4 --> C5[pnpm test]
182
+ end
183
+
184
+ subgraph "migrate/action.yml"
185
+ M1[setup action 呼び出し] --> M2[pnpm generate]
186
+ M2 --> M3[db:migrate:deploy]
187
+ M3 --> M4{run-seed?}
188
+ M4 -->|true| M5[db:seed]
189
+ M4 -->|false| M6[完了]
190
+ M5 --> M6
191
+ end
192
+
193
+ C1 -.-> S1
194
+ M1 -.-> S1
195
+ ```
196
+
197
+ | Action | ファイル | 内容 | 呼び出し元 |
198
+ |--------|---------|------|-----------|
199
+ | **Setup** | `actions/setup/action.yml` | pnpm + Node.js + install | ci action, migrate action, cleanup |
200
+ | **CI** | `actions/ci/action.yml` | setup → generate → typecheck → lint → test | deploy-stable-branches, deploy-pr-preview |
201
+ | **Migrate** | `actions/migrate/action.yml` | setup → generate → migrate → seed (optional) | deploy-stable-branches |
202
+ | **Neon Export Env** | `actions/neon-export-env/action.yml` | .env.previewからNeon環境変数をエクスポート | deploy-pr-preview, cleanup-pr-preview-on-close |
203
+
204
+ ### 実行マトリクス
205
+
206
+ | トリガー | Deploy Stable | PR Preview | 備考 |
207
+ |---------|:-------------:|:----------:|------|
208
+ | feature/* push | ❌ | - | CIなし(PR時に実行) |
209
+ | main push | ✅ | - | CI → 本番デプロイ |
210
+ | develop push | ✅ | - | CI → 開発環境デプロイ |
211
+ | staging push | ✅ | - | CI → ステージングデプロイ |
212
+ | PR → main/develop 作成 | ❌ | ✅ | CI → Neon作成 → プレビュー |
213
+ | PR → main/develop 更新 | ❌ | ✅ | CI → プレビュー更新 |
214
+ | PR クローズ | ❌ | ✅ | Neonブランチ削除 |
215
+ | フォークPR | ❌ | ❌ | Secret制限のため |
216
+
217
+ ### ワークフロー シーケンス図
102
218
 
103
- ### パイプラインフロー
219
+ #### deploy-pr-preview.yml(PR → CI + プレビューデプロイ)
104
220
 
105
221
  ```mermaid
106
222
  sequenceDiagram
107
223
  participant Dev as 開発者
108
224
  participant GH as GitHub
109
- participant CI as GitHub Actions
110
- participant Turbo as Turborepo
111
- participant Cache as Vercel Cache
225
+ participant Actions as GitHub Actions
226
+ participant CI as CI Action
112
227
  participant Neon as Neon Database
113
228
  participant Vercel as Vercel
114
- participant Railway as Railway
115
-
116
- Dev->>GH: git push
117
- GH->>CI: Workflow トリガー
118
- CI->>CI: 環境セットアップ
119
- CI->>Turbo: turbo login
120
- Turbo->>Cache: キャッシュ認証
121
-
122
- alt PR作成時
123
- CI->>Neon: Create branch from main
124
- Neon-->>CI: Preview DB URL
125
- CI->>CI: Set DATABASE_URL
229
+
230
+ Dev->>GH: PR作成/更新
231
+ GH->>Actions: deploy-pr-preview トリガー
232
+
233
+ rect rgb(240, 248, 255)
234
+ Note over Actions,CI: CI Checks
235
+ Actions->>CI: ci action 呼び出し
236
+ CI->>CI: setup (pnpm + Node.js)
237
+ CI->>CI: pnpm generate
238
+ CI->>CI: pnpm typecheck
239
+ CI->>CI: pnpm lint
240
+ CI->>CI: pnpm test
241
+ CI-->>Actions: CI完了
242
+ end
243
+
244
+ rect rgb(255, 248, 240)
245
+ Note over Actions,Neon: Neon Branch 作成
246
+ Actions->>Actions: dotenvx で NEON_API_KEY 取得
247
+ Actions->>Actions: pnpm generate (Prisma Client生成)
248
+ Actions->>Neon: preview/pr-{番号} ブランチ作成
249
+ Neon-->>Actions: DB URL (direct + pooled)
250
+ Actions->>Neon: pnpm db:push (スキーマ同期)
251
+ Actions->>Neon: pnpm db:seed (データ投入)
126
252
  end
127
253
 
128
- CI->>Turbo: turbo run lint
129
- Turbo->>Cache: キャッシュチェック
130
- Cache-->>Turbo: キャッシュヒット/ミス
131
- Turbo-->>CI: Lint完了
132
-
133
- CI->>Turbo: turbo run build
134
- Turbo->>Cache: キャッシュチェック
135
- Turbo->>Turbo: ビルド実行
136
- Turbo->>Cache: 結果アップロード
137
- Turbo-->>CI: ビルド完了
138
-
139
- CI->>Turbo: turbo run test
140
- Turbo-->>CI: テスト完了
141
-
142
- alt main ブランチ
143
- CI->>Vercel: web デプロイ(Production DB使用)
144
- CI->>Railway: cron-worker デプロイ
145
- else PR作成時
146
- CI->>Vercel: web preview デプロイ(Preview DB使用)
254
+ rect rgb(240, 255, 240)
255
+ Note over Actions,Vercel: Vercel デプロイ
256
+ Actions->>Vercel: vercel pull
257
+ Actions->>Vercel: 環境変数同期 (ブラックリスト除外)
258
+ Actions->>Vercel: vercel build (DATABASE_URL=pooled)
259
+ Actions->>Vercel: vercel deploy --prebuilt
260
+ Vercel-->>Actions: Preview URL
147
261
  end
148
262
 
149
- CI-->>Dev: ステータス通知
263
+ Actions->>GH: PRにコメント (Preview URL + Neon情報)
264
+ GH-->>Dev: 通知
150
265
  ```
151
266
 
152
- ### ステージ構成
267
+ #### deploy-stable-branches.yml(stable push → CI + 本番デプロイ)
268
+
269
+ ```mermaid
270
+ sequenceDiagram
271
+ participant Dev as 開発者
272
+ participant GH as GitHub
273
+ participant Actions as GitHub Actions
274
+ participant CI as CI Action
275
+ participant Neon as Neon DB (定常)
276
+ participant Vercel as Vercel
277
+
278
+ Dev->>GH: main/develop/staging push
279
+ GH->>Actions: deploy-stable-branches トリガー
280
+
281
+ rect rgb(240, 248, 255)
282
+ Note over Actions,CI: CI Checks
283
+ Actions->>CI: ci action 呼び出し
284
+ CI->>CI: setup (pnpm + Node.js)
285
+ CI->>CI: pnpm generate
286
+ CI->>CI: pnpm typecheck
287
+ CI->>CI: pnpm lint
288
+ CI->>CI: pnpm test
289
+ CI-->>Actions: CI完了
290
+ end
153
291
 
154
- | ステージ | タスク | 並列実行 | キャッシュ |
155
- |---------|-------|---------|----------|
156
- | Setup | pnpm install, turbo login | - | ✅ |
157
- | Lint | turbo run lint | ✅ | ✅ |
158
- | Type Check | turbo run typecheck | ✅ | ✅ |
159
- | Test | turbo run test | ✅ | ✅ |
160
- | Build | turbo run build | ✅ | ✅ |
161
- | Deploy | Vercel, Railway | ✅ | ❌ |
292
+ Actions->>Actions: ブランチ判定 (環境変数セット)
162
293
 
163
- ### 設計方針
294
+ rect rgb(255, 248, 240)
295
+ Note over Actions,Neon: DB マイグレーション (main/stagingのみ)
296
+ Actions->>Neon: pnpm db:migrate:deploy
297
+ end
298
+
299
+ alt develop ブランチのみ
300
+ Actions->>Neon: pnpm db:seed
301
+ end
302
+
303
+ rect rgb(240, 255, 240)
304
+ Note over Actions,Vercel: Vercel デプロイ
305
+ Actions->>Vercel: vercel pull
306
+ Actions->>Vercel: 環境変数同期 (ブラックリスト除外)
307
+ Actions->>Vercel: vercel pull (Re-pull: 同期後の最新化)
308
+ Actions->>Vercel: vercel build [--prod]
309
+ Actions->>Vercel: vercel deploy --prebuilt [--prod]
310
+ Vercel-->>Actions: Deploy URL
311
+ end
312
+
313
+ alt develop/staging ブランチ
314
+ Actions->>Vercel: vercel alias (カスタムドメイン)
315
+ end
316
+
317
+ Actions-->>Dev: デプロイ完了
318
+ ```
319
+
320
+ #### cleanup-pr-preview-db.yml(cron → setup + Neon cleanup)
321
+
322
+ ```mermaid
323
+ sequenceDiagram
324
+ participant Cron as Cron (毎日00:00 UTC)
325
+ participant Actions as GitHub Actions
326
+ participant Setup as Setup Action
327
+ participant Neon as Neon Database
328
+ participant GHAPI as GitHub API
329
+
330
+ Cron->>Actions: cleanup-pr-preview-db トリガー
331
+
332
+ rect rgb(240, 248, 255)
333
+ Note over Actions,Setup: Setup
334
+ Actions->>Setup: setup action 呼び出し
335
+ Setup->>Setup: pnpm + Node.js
336
+ Setup->>Setup: pnpm install
337
+ Setup-->>Actions: Setup完了
338
+ end
339
+
340
+ Actions->>Actions: dotenvx で NEON_API_KEY 取得
341
+
342
+ rect rgb(255, 248, 240)
343
+ Note over Actions,GHAPI: Cleanup処理
344
+ Actions->>Neon: 全 preview/pr-* ブランチ取得
345
+ Neon-->>Actions: ブランチ一覧
346
+
347
+ loop 各ブランチ
348
+ Actions->>GHAPI: PR #{番号} の状態確認
349
+ GHAPI-->>Actions: PR状態
350
+
351
+ alt PR closed or 404
352
+ Actions->>Neon: ブランチ削除
353
+ else PR open or APIエラー
354
+ Actions->>Actions: スキップ (誤削除防止)
355
+ end
356
+ end
357
+ end
358
+
359
+ Actions->>Actions: Cleanup完了ログ
360
+ ```
361
+
362
+ > **設計意図**: ci.ymlはpull_requestのみをトリガーとし、feature/* pushでの二重CI実行を防止
363
+
364
+ ### 並行実行制御(Concurrency)
365
+
366
+ | ワークフロー | concurrencyグループ | cancel-in-progress | 説明 |
367
+ |------------|-------------------|:-----------------:|------|
368
+ | deploy-pr-preview | `pr-preview-{PR番号}` | true | 最新コミットのみデプロイ |
369
+ | cleanup-pr-preview-on-close | `pr-preview-{PR番号}` | true | 同グループでPRデプロイと排他制御 |
370
+ | deploy-stable-branches | `deploy-{ブランチ名}` | false | 全コミットを順次デプロイ |
371
+
372
+ ---
373
+
374
+ ## 4. ブランチ別デプロイフロー
375
+
376
+ ### mainブランチ(本番環境)
377
+
378
+ ```mermaid
379
+ flowchart TD
380
+ A[git push main] --> B[deploy-stable-branches.yml]
381
+ B --> C[CI Checks]
382
+ C --> D{成功?}
383
+ D -->|Yes| E[dotenvx復号化]
384
+ D -->|No| X[失敗通知]
385
+ E --> F[Vercel Pull]
386
+ F --> G[環境変数同期]
387
+ G --> H[DB Migrate]
388
+ H --> I[Vercel Build]
389
+ I --> J[Vercel Deploy --prod]
390
+ J --> K[完了]
391
+
392
+ style A fill:#4CAF50
393
+ style K fill:#4CAF50
394
+ ```
395
+
396
+ **設定**:
397
+ - Vercel環境: `production`
398
+ - 暗号化ファイル: `.env.production`
399
+ - 復号鍵: `DOTENV_PRIVATE_KEY_PRODUCTION`
400
+ - DBマイグレーション: ✅
401
+ - DBシード: ❌(テストデータのため本番非対応)
402
+ - Alias設定: ❌
403
+
404
+ ---
405
+
406
+ ### developブランチ(開発環境)
407
+
408
+ ```mermaid
409
+ flowchart TD
410
+ A[git push develop] --> B[deploy-stable-branches.yml]
411
+ B --> C[CI Checks]
412
+ C --> D{成功?}
413
+ D -->|Yes| E[dotenvx復号化]
414
+ D -->|No| X[失敗通知]
415
+ E --> F[Vercel Pull]
416
+ F --> G[環境変数同期]
417
+ G --> H[Vercel Build]
418
+ H --> I[Vercel Deploy]
419
+ I --> J[Alias設定]
420
+ J --> K[完了]
421
+
422
+ style A fill:#2196F3
423
+ style K fill:#2196F3
424
+ ```
425
+
426
+ **設定**:
427
+ - Vercel環境: `preview`
428
+ - 暗号化ファイル: `.env.develop`
429
+ - 復号鍵: `DOTENV_PRIVATE_KEY_DEVELOP`
430
+ - DBマイグレーション: ❌(PR PreviewのNeonブランチで自動同期)
431
+ - DBシード: ❌
432
+ - Alias: `secrets.VERCEL_DEV_DOMAIN`
433
+
434
+ ---
435
+
436
+ ### stagingブランチ(ステージング環境)
437
+
438
+ ```mermaid
439
+ flowchart TD
440
+ A[git push staging] --> B[deploy-stable-branches.yml]
441
+ B --> C[CI Checks]
442
+ C --> D{成功?}
443
+ D -->|Yes| E[dotenvx復号化]
444
+ D -->|No| X[失敗通知]
445
+ E --> F[Vercel Pull]
446
+ F --> G[環境変数同期]
447
+ G --> H[DB Migrate]
448
+ H --> I[Vercel Build]
449
+ I --> J[Vercel Deploy]
450
+ J --> K[Alias設定]
451
+ K --> L[完了]
452
+
453
+ style A fill:#FF9800
454
+ style L fill:#FF9800
455
+ ```
456
+
457
+ **設定**:
458
+ - Vercel環境: `preview`
459
+ - 暗号化ファイル: `.env.staging`
460
+ - 復号鍵: `DOTENV_PRIVATE_KEY_STAGING`
461
+ - DBマイグレーション: ✅
462
+ - DBシード: ❌(既存データ保持)
463
+ - Alias: `secrets.VERCEL_STG_DOMAIN`
464
+
465
+ ---
466
+
467
+ ### Pull Request(プレビュー環境)
468
+
469
+ ```mermaid
470
+ flowchart TD
471
+ A[PR opened/sync] --> B[deploy-pr-preview.yml]
472
+ B --> C[pnpm/Node setup]
473
+ C --> D[Neon環境変数取得]
474
+ D --> E[親ブランチ決定]
475
+ E --> F[Neon Branch作成]
476
+ F --> G[DB Push]
477
+ G --> H[DB Seed]
478
+ H --> I[Vercel Build]
479
+ I --> J[Vercel Deploy]
480
+ J --> K[PRコメント]
481
+ K --> L[完了]
482
+
483
+ M[PR closed] --> N[cleanup-pr-preview-on-close.yml]
484
+ N --> O[Neon Branch即座削除]
485
+ O --> P[完了]
486
+
487
+ style A fill:#9C27B0
488
+ style L fill:#9C27B0
489
+ style M fill:#F44336
490
+ style P fill:#F44336
491
+ ```
492
+
493
+ **設定**:
494
+ - Vercel環境: `preview`
495
+ - 暗号化ファイル: `.env.preview`
496
+ - 復号鍵: `DOTENV_PRIVATE_KEY_PREVIEW`
497
+ - Neonブランチ: `preview/pr-{PR番号}`
498
+ - 親ブランチ: PRのベースブランチ(main/develop等)
499
+ - Auto-suspend: 1日間アクセスなし
500
+ - PRコメント: Preview URL + Neon Branch情報
501
+
502
+ > **⚠️ 同時PR運用時の注意**
503
+ >
504
+ > テンプレートでは`vercel deploy --env DATABASE_URL=...`でデプロイ単位で
505
+ > DATABASE_URLを注入しています。これにより、同時に複数のPRがプレビュー
506
+ > デプロイされても、それぞれのPRが固有のNeonブランチDBを参照します。
507
+ >
508
+ > もし`vercel env add DATABASE_URL`方式を使用すると、Vercel Projectの
509
+ > preview環境変数が上書きされ、同時PRで競合するリスクがあります。
510
+
511
+ ---
512
+
513
+ ### 環境別設定一覧
514
+
515
+ | 環境 | ブランチ | Vercel環境 | DBマイグ | シード | Alias | 暗号化ファイル | 復号鍵 |
516
+ |------|---------|-----------|:-------:|:-----:|:-----:|--------------|--------|
517
+ | Production | main | production | ✅ | ❌ | ❌ | `.env.production` | `DOTENV_PRIVATE_KEY_PRODUCTION` |
518
+ | Develop | develop | preview | ❌ | ❌ | ✅ | `.env.develop` | `DOTENV_PRIVATE_KEY_DEVELOP` |
519
+ | Staging | staging | preview | ✅ | ❌ | ✅ | `.env.staging` | `DOTENV_PRIVATE_KEY_STAGING` |
520
+ | PR Preview | feature/* | preview | ✅ | ✅ | ❌ | `.env.preview` | `DOTENV_PRIVATE_KEY_PREVIEW` |
521
+
522
+ ### Vercel環境変数の自動同期
523
+
524
+ ワークフローは `ENV_VAR_EXCLUDE` ブラックリスト正規表現で**同期対象外**を制御:
525
+
526
+ | ワークフロー | 除外フィルタ | 説明 |
527
+ |------------|-----------|------|
528
+ | PR Preview | `^(DOTENV_\|NEON_\|NODE_ENV$\|VERCEL_)` | DOTENV/Neon/Vercel内部変数を除外。DATABASE_URLはNeonブランチURLを`--env`で注入するため別途除外 |
529
+ | Stable Branches | `^(DOTENV_\|NODE_ENV$\|VERCEL_)` | DOTENV/Vercel内部変数を除外。DATABASE_URL含む全アプリ変数を同期 |
530
+
531
+ **設計意図**: ホワイトリスト方式だと新しい環境変数追加時にフィルタ更新漏れが発生するため、ブラックリスト方式を採用。
532
+
533
+ ---
534
+
535
+ ### Neonプレビューブランチのクリーンアップ
536
+
537
+ ```mermaid
538
+ flowchart TD
539
+ A[毎日 00:00 UTC] --> B[cleanup-pr-preview-db.yml]
540
+ B --> C[Neon API: 全preview/*取得]
541
+ C --> D{各ブランチ}
542
+ D --> E[GitHub API: PR状態確認]
543
+ E --> F{PR状態}
544
+ F -->|closed| G[ブランチ削除]
545
+ F -->|404| G
546
+ F -->|open| H[スキップ]
547
+ F -->|APIエラー| H
548
+ G --> D
549
+ H --> D
550
+ ```
551
+
552
+ **設計意図**:
553
+ - 孤立したNeonブランチの自動削除
554
+ - APIエラー時はスキップ(誤削除防止)
555
+ - コスト最適化
164
556
 
165
- 1. **高速フィードバック**: Lint・Type Checkを並列実行し、早期エラー検出
166
- 2. **キャッシュ最大活用**: Turborepo Remote Cacheで86%の時間削減
167
- 3. **環境分離**: dotenvxによる暗号化環境変数でセキュアなCI/CD
557
+ **2種類のクリーンアップ:**
558
+ 1. **即時削除** (`cleanup-pr-preview-on-close.yml`): PR close時に即座にNeonブランチ削除
559
+ 2. **定期クリーンアップ** (`cleanup-pr-preview-db.yml`): 毎日00:00 UTC、孤立ブランチ(手動削除漏れ等)をAPI経由で検知・削除
168
560
 
169
561
  ---
170
562
 
171
- ## 4. キャッシュ戦略
563
+ ## 5. キャッシュ戦略
172
564
 
173
565
  ### Turborepo Remote Cache
174
566
 
@@ -200,7 +592,7 @@ sequenceDiagram
200
592
 
201
593
  ---
202
594
 
203
- ## 5. Worktree対応設計
595
+ ## 6. Worktree対応設計
204
596
 
205
597
  ### 課題
206
598
 
@@ -249,7 +641,7 @@ sequenceDiagram
249
641
 
250
642
  ---
251
643
 
252
- ## 6. ロールバック戦略
644
+ ## 7. ロールバック戦略
253
645
 
254
646
  ### 設計方針
255
647
 
@@ -287,6 +679,7 @@ sequenceDiagram
287
679
  - [環境変数設計方針](./environment-variables.md)
288
680
  - [デプロイセットアップ手順](../../instructions/deployment-setup.md)
289
681
  - [環境変数セットアップ手順](../../instructions/environment-setup.md)
682
+ - [Vercel CLI/APIリファレンス](../../instructions/vercel-cli-reference.md)
290
683
  <!-- @einja:managed:end -->
291
684
 
292
685
  ---