@einja/dev-cli 0.1.38 → 0.1.40

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 (106) hide show
  1. package/README.md +1 -0
  2. package/dist/lib/file-system.d.ts +1 -5
  3. package/dist/lib/file-system.d.ts.map +1 -1
  4. package/dist/lib/file-system.js +2 -8
  5. package/dist/lib/file-system.js.map +1 -1
  6. package/dist/lib/mcp-config.js +3 -3
  7. package/dist/lib/mcp-config.js.map +1 -1
  8. package/dist/lib/mcp-config.test.js +2 -2
  9. package/dist/lib/mcp-config.test.js.map +1 -1
  10. package/dist/lib/merger.d.ts.map +1 -1
  11. package/dist/lib/merger.js +5 -5
  12. package/dist/lib/merger.js.map +1 -1
  13. package/dist/lib/preset-update/file-copier.d.ts.map +1 -1
  14. package/dist/lib/preset-update/file-copier.js +5 -0
  15. package/dist/lib/preset-update/file-copier.js.map +1 -1
  16. package/dist/lib/preset-update/file-copier.test.js +26 -0
  17. package/dist/lib/preset-update/file-copier.test.js.map +1 -1
  18. package/dist/lib/sync/category-validator.d.ts +5 -1
  19. package/dist/lib/sync/category-validator.d.ts.map +1 -1
  20. package/dist/lib/sync/category-validator.js +16 -2
  21. package/dist/lib/sync/category-validator.js.map +1 -1
  22. package/dist/lib/sync/category-validator.test.js +14 -4
  23. package/dist/lib/sync/category-validator.test.js.map +1 -1
  24. package/dist/lib/sync/file-filter.d.ts.map +1 -1
  25. package/dist/lib/sync/file-filter.js +24 -0
  26. package/dist/lib/sync/file-filter.js.map +1 -1
  27. package/dist/lib/sync/file-filter.test.js +37 -0
  28. package/dist/lib/sync/file-filter.test.js.map +1 -1
  29. package/package.json +1 -1
  30. package/presets/default/.claude/agents/einja/specs/spec-qa-generator.md +40 -43
  31. package/presets/default/.claude/agents/einja/specs/spec-tasks-generator.md +16 -6
  32. package/presets/default/.claude/agents/einja/task/task-executer.md +13 -11
  33. package/presets/default/.claude/commands/einja/einja-sync.md +238 -0
  34. package/presets/default/.claude/commands/einja/spec-create.md +7 -3
  35. package/presets/default/.claude/commands/einja/task-exec.md +6 -6
  36. package/presets/default/.claude/settings.json +1 -0
  37. package/presets/default/.claude/skills/einja-coding-standards/SKILL.md +4 -3
  38. package/presets/default/.claude/skills/einja-coding-standards/references/import-conventions.md +69 -0
  39. package/presets/default/.claude/skills/einja-component-design/SKILL.md +3 -3
  40. package/presets/default/.claude/skills/einja-project-overview/SKILL.md +35 -0
  41. package/presets/default/.claude/skills/einja-skill-creator/SKILL.md +421 -0
  42. package/presets/default/.claude/skills/einja-skill-creator/scripts/init_skill.py +333 -0
  43. package/presets/default/.claude/skills/einja-skill-creator/scripts/package_skill.py +110 -0
  44. package/presets/default/.claude/skills/einja-skill-creator/scripts/quick_validate.py +117 -0
  45. package/presets/default/.claude/skills/einja-spec-context-loader/SKILL.md +6 -6
  46. package/presets/default/.claude/skills/einja-task-qa/SKILL.md +24 -22
  47. package/presets/default/.claude/skills/einja-task-qa/{reference → references}/troubleshooting.md +1 -1
  48. package/presets/default/.claude/skills/einja-task-qa/{reference → references}/usage-patterns.md +2 -2
  49. package/presets/default/.claude/skills/einja-task-qa/templates/qa-test-template.md +13 -13
  50. package/{scaffolds → presets/default}/.mcp.json +27 -6
  51. package/presets/default/.vscode/settings.json +18 -0
  52. package/presets/default/CLAUDE.md.template +192 -0
  53. package/{scaffolds → presets/default/docs/einja}/example/README.md +1 -1
  54. package/{scaffolds → presets/default/docs/einja}/example/specs/issues/issue999-example-task/qa-tests/README.md +20 -23
  55. package/presets/default/docs/einja/example/specs/issues/issue999-example-task/qa-tests/evidence/story3/.gitkeep +0 -0
  56. package/{scaffolds → presets/default/docs/einja}/example/specs/issues/issue999-example-task/qa-tests/scenarios.md +12 -16
  57. package/presets/default/docs/einja/example/specs/issues/issue999-example-task/qa-tests/story1.md +101 -0
  58. package/presets/default/docs/einja/example/specs/issues/issue999-example-task/qa-tests/story2.md +70 -0
  59. package/presets/default/docs/einja/example/specs/issues/issue999-example-task/qa-tests/story3.md +69 -0
  60. package/{scaffolds → presets/default/docs/einja}/instructions/deployment-setup.md +93 -9
  61. package/{scaffolds → presets/default/docs/einja}/instructions/environment-setup.md +152 -4
  62. package/{scaffolds → presets/default/docs/einja}/instructions/local-server-environment-and-worktree.md +99 -0
  63. package/presets/default/docs/einja/instructions/neon-cli-reference.md +605 -0
  64. package/{scaffolds → presets/default/docs/einja}/instructions/vercel-cli-reference.md +80 -0
  65. package/{scaffolds → presets/default/docs/einja}/steering/acceptance-criteria-and-qa-guide.md +3 -4
  66. package/{scaffolds → presets/default/docs/einja}/steering/development/database-guidelines.md +52 -3
  67. package/{scaffolds → presets/default/docs/einja}/steering/infrastructure/environment-variables.md +4 -4
  68. package/{scaffolds → presets/default/docs/einja}/templates/README.md +1 -1
  69. package/{scaffolds → presets/default/docs/einja}/templates/qa-test.md.template +29 -26
  70. package/presets/default/symlinks.json +0 -45
  71. package/scaffolds/cli/preset.yaml +0 -137
  72. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-1.md +0 -268
  73. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-2.md +0 -179
  74. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-3.md +0 -392
  75. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/2-1.md +0 -459
  76. /package/presets/default/.claude/skills/einja-coding-standards/{reference → references}/naming-conventions.md +0 -0
  77. /package/presets/default/.claude/skills/einja-coding-standards/{reference → references}/prohibited-patterns.md +0 -0
  78. /package/presets/default/.claude/skills/einja-coding-standards/{reference → references}/typescript-rules.md +0 -0
  79. /package/presets/default/.claude/skills/einja-component-design/{reference → references}/directory-structure.md +0 -0
  80. /package/presets/default/.claude/skills/einja-component-design/{reference → references}/props-patterns.md +0 -0
  81. /package/presets/default/.claude/skills/einja-component-design/{reference → references}/styling-guide.md +0 -0
  82. /package/presets/default/.claude/skills/einja-task-qa/{reference → references}/failure-patterns.md +0 -0
  83. /package/{scaffolds → presets/default/docs/einja}/example/specs/issues/issue999-example-task/design.md +0 -0
  84. /package/{scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/evidence → presets/default/docs/einja/example/specs/issues/issue999-example-task/qa-tests/evidence/story1}/.gitkeep +0 -0
  85. /package/{scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/evidence → presets/default/docs/einja/example/specs/issues/issue999-example-task/qa-tests/evidence/story2}/.gitkeep +0 -0
  86. /package/{scaffolds → presets/default/docs/einja}/example/specs/issues/issue999-example-task/requirements.md +0 -0
  87. /package/{scaffolds → presets/default/docs/einja}/example/specs/issues/issue999-example-task/tasks.md +0 -0
  88. /package/{scaffolds → presets/default/docs/einja}/instructions/task-execute.md +0 -0
  89. /package/{scaffolds → presets/default/docs/einja}/instructions/task-vibe-kanban-loop.md +0 -0
  90. /package/{scaffolds → presets/default/docs/einja}/steering/README.md +0 -0
  91. /package/{scaffolds → presets/default/docs/einja}/steering/architecture.md +0 -0
  92. /package/{scaffolds → presets/default/docs/einja}/steering/branch-strategy.md +0 -0
  93. /package/{scaffolds → presets/default/docs/einja}/steering/commit-rules.md +0 -0
  94. /package/{scaffolds → presets/default/docs/einja}/steering/db-schema-design.md +0 -0
  95. /package/{scaffolds → presets/default/docs/einja}/steering/development/api-development.md +0 -0
  96. /package/{scaffolds → presets/default/docs/einja}/steering/development/backend-architecture.md +0 -0
  97. /package/{scaffolds → presets/default/docs/einja}/steering/development/frontend-development.md +0 -0
  98. /package/{scaffolds → presets/default/docs/einja}/steering/development/review-guidelines.md +0 -0
  99. /package/{scaffolds → presets/default/docs/einja}/steering/development/testing-strategy.md +0 -0
  100. /package/{scaffolds → presets/default/docs/einja}/steering/development-workflow.md +0 -0
  101. /package/{scaffolds → presets/default/docs/einja}/steering/infrastructure/deployment.md +0 -0
  102. /package/{scaffolds → presets/default/docs/einja}/steering/product.md +0 -0
  103. /package/{scaffolds → presets/default/docs/einja}/steering/task-management.md +0 -0
  104. /package/{scaffolds → presets/default/docs/einja}/templates/design-simple.md.template +0 -0
  105. /package/{scaffolds → presets/default/docs/einja}/templates/design.md.template +0 -0
  106. /package/{scaffolds → presets/default/docs/einja}/templates/requirements.md.template +0 -0
@@ -0,0 +1,605 @@
1
+ <!-- @einja:managed:start -->
2
+ # Neon CLI/API リファレンス
3
+
4
+ ## 概要
5
+
6
+ このドキュメントは、Neonプロジェクトのセットアップにおいて、どの操作がCLI/API/Dashboardで可能かを明確にしたリファレンスです。
7
+
8
+ ダッシュボード操作中心のセットアップ手順は [デプロイセットアップ手順](./deployment-setup.md) を参照してください。
9
+
10
+ ---
11
+
12
+ ## 操作別対応表
13
+
14
+ | 操作 | CLI | API | Dashboard |
15
+ |------|:---:|:---:|:---------:|
16
+ | プロジェクト作成 | ✅ | ✅ | ✅ |
17
+ | プロジェクト一覧取得 | ✅ | ✅ | ✅ |
18
+ | プロジェクト削除 | ✅ | ✅ | ✅ |
19
+ | ブランチ作成 | ✅ | ✅ | ✅ |
20
+ | ブランチ一覧取得 | ✅ | ✅ | ✅ |
21
+ | ブランチ削除 | ✅ | ✅ | ✅ |
22
+ | 接続文字列取得 | ✅ | ✅ | ✅ |
23
+ | データベース作成 | ✅ | ✅ | ✅ |
24
+ | データベース一覧取得 | ✅ | ✅ | ✅ |
25
+ | ロール(ユーザー)管理 | ✅ | ✅ | ✅ |
26
+ | ブランチの自動サスペンド設定 | ❌ | ✅ | ✅ |
27
+
28
+ ### 凡例
29
+ - ✅: 対応(推奨または唯一の方法)
30
+ - ❌: 非対応
31
+
32
+ ---
33
+
34
+ ## CLIコマンドリファレンス
35
+
36
+ ### 認証
37
+
38
+ ```bash
39
+ # 対話モード(手動操作用)
40
+ neonctl auth
41
+
42
+ # 環境変数認証(自動化用・Skill推奨)
43
+ export NEON_API_KEY=your_api_key
44
+
45
+ # コマンドオプション認証
46
+ neonctl projects list --api-key your_api_key
47
+ ```
48
+
49
+ #### `neonctl auth` を使用しない理由
50
+
51
+ `neonctl auth` はNeon CLIの対話的認証コマンドですが、以下の理由からClaude CodeのSkill実行では使用しません。
52
+
53
+ | 理由 | 説明 |
54
+ |------|------|
55
+ | **ブラウザ認証が必要** | `neonctl auth` はブラウザを開いてOAuth認証を行います。Claude Codeの自動実行環境ではブラウザ操作ができません。 |
56
+ | **トークンの二重管理** | `neonctl auth` で認証するとトークンがCLI内部(`~/.neonctl/credentials.json` 等)に保存されます。`.env.personal` の `NEON_API_KEY` との二重管理になり、どちらが使われるか混乱します。 |
57
+ | **再現性の欠如** | 環境変数ベースの認証は設定ファイルで管理でき、再現性が高いです。`neonctl auth` は対話的な操作のため、自動化スクリプトに組み込めません。 |
58
+
59
+ #### 推奨認証方式
60
+
61
+ | 方式 | コマンド例 | 用途 |
62
+ |------|----------|------|
63
+ | `--api-key` フラグ | `neonctl branches list --api-key $NEON_API_KEY` | コマンド単発実行 |
64
+ | `NEON_API_KEY` 環境変数 | `export NEON_API_KEY=...` → `neonctl branches list` | セッション内で複数コマンド実行 |
65
+ | `neonctl auth` | `neonctl auth` | **非推奨**(手動操作専用、Skill実行では不使用) |
66
+
67
+ **自動化時の推奨方法**:
68
+ - `NEON_API_KEY` 環境変数の使用
69
+ - `--api-key` フラグは冗長になるため非推奨(環境変数で十分)
70
+
71
+ ### プロジェクト操作
72
+
73
+ ```bash
74
+ # プロジェクト一覧
75
+ neonctl projects list
76
+
77
+ # プロジェクト作成
78
+ neonctl projects create \
79
+ --name einja-management \
80
+ --region-id aws-ap-northeast-1
81
+
82
+ # プロジェクト削除
83
+ neonctl projects delete $PROJECT_ID
84
+
85
+ # プロジェクト詳細確認
86
+ neonctl projects get $PROJECT_ID
87
+ ```
88
+
89
+ ### ブランチ操作
90
+
91
+ ```bash
92
+ # ブランチ一覧取得
93
+ neonctl branches list --project-id $PROJECT_ID
94
+
95
+ # ブランチ作成(親ブランチ指定なし)
96
+ neonctl branches create \
97
+ --project-id $PROJECT_ID \
98
+ --name production
99
+
100
+ # ブランチ作成(親ブランチ指定あり)
101
+ # --parent はブランチ名、ブランチID、タイムスタンプ、LSNを受け付ける
102
+ neonctl branches create \
103
+ --project-id $PROJECT_ID \
104
+ --name preview/pr-123 \
105
+ --parent production
106
+
107
+ # ブランチ削除
108
+ neonctl branches delete $BRANCH_ID --project-id $PROJECT_ID
109
+
110
+ # ブランチ詳細確認
111
+ neonctl branches get $BRANCH_ID --project-id $PROJECT_ID
112
+ ```
113
+
114
+ ### 接続文字列取得
115
+
116
+ ```bash
117
+ # デフォルトブランチの接続文字列
118
+ neonctl connection-string --project-id $PROJECT_ID
119
+
120
+ # 特定ブランチの接続文字列
121
+ neonctl connection-string $BRANCH_NAME --project-id $PROJECT_ID
122
+
123
+ # プール接続(Connection Pooling)
124
+ neonctl connection-string $BRANCH_NAME \
125
+ --project-id $PROJECT_ID \
126
+ --pooled
127
+
128
+ # 特定データベース指定
129
+ neonctl connection-string $BRANCH_NAME \
130
+ --project-id $PROJECT_ID \
131
+ --database-name neondb
132
+ ```
133
+
134
+ ### データベース操作
135
+
136
+ ```bash
137
+ # データベース一覧(デフォルトブランチ)
138
+ neonctl databases list --project-id $PROJECT_ID
139
+
140
+ # データベース一覧(特定ブランチ)
141
+ neonctl databases list \
142
+ --project-id $PROJECT_ID \
143
+ --branch $BRANCH_NAME
144
+
145
+ # データベース作成(デフォルトブランチ)
146
+ neonctl databases create \
147
+ --project-id $PROJECT_ID \
148
+ --name neondb
149
+
150
+ # データベース作成(特定ブランチ、オーナー指定)
151
+ neonctl databases create \
152
+ --project-id $PROJECT_ID \
153
+ --branch $BRANCH_NAME \
154
+ --name neondb \
155
+ --owner-name $ROLE_NAME
156
+
157
+ # データベース削除
158
+ neonctl databases delete $DATABASE_NAME \
159
+ --project-id $PROJECT_ID \
160
+ --branch $BRANCH_NAME
161
+ ```
162
+
163
+ **注意**: `--project-id` はマルチプロジェクトアカウントの場合のみ必須。`--branch` はオプション(省略時はデフォルトブランチが使用される)。
164
+
165
+ ### ロール(ユーザー)管理
166
+
167
+ ```bash
168
+ # ロール一覧(デフォルトブランチ)
169
+ neonctl roles list --project-id $PROJECT_ID
170
+
171
+ # ロール一覧(特定ブランチ)
172
+ neonctl roles list \
173
+ --project-id $PROJECT_ID \
174
+ --branch $BRANCH_NAME
175
+
176
+ # ロール作成(デフォルトブランチ)
177
+ neonctl roles create \
178
+ --project-id $PROJECT_ID \
179
+ --name $ROLE_NAME
180
+
181
+ # ロール作成(特定ブランチ)
182
+ neonctl roles create \
183
+ --project-id $PROJECT_ID \
184
+ --branch $BRANCH_NAME \
185
+ --name $ROLE_NAME
186
+
187
+ # ロール作成(ログイン不可)
188
+ neonctl roles create \
189
+ --project-id $PROJECT_ID \
190
+ --name $ROLE_NAME \
191
+ --no-login
192
+
193
+ # ロール削除
194
+ neonctl roles delete $ROLE_NAME \
195
+ --project-id $PROJECT_ID \
196
+ --branch $BRANCH_NAME
197
+ ```
198
+
199
+ **注意**:
200
+ - `--project-id` はマルチプロジェクトアカウントの場合のみ必須
201
+ - `--branch` はオプション(省略時はデフォルトブランチが使用される)
202
+ - `--name` フラグが必須で、位置引数 `<role-name>` ではない点に注意(公式ドキュメント準拠)
203
+
204
+ ### CLIの制限事項
205
+
206
+ CLIでは以下の操作が**できません**:
207
+
208
+ 1. **ブランチの自動サスペンド設定**: APIまたはDashboardで設定が必要
209
+ 2. **プロジェクトのリージョン変更**: プロジェクト作成時のみ指定可能
210
+ 3. **接続プール設定の詳細調整**: Dashboardで設定が必要
211
+
212
+ ---
213
+
214
+ ## APIリファレンス
215
+
216
+ ### 認証
217
+
218
+ ```bash
219
+ # Bearer Token認証
220
+ Authorization: Bearer $NEON_API_KEY
221
+
222
+ # ベースURL
223
+ https://console.neon.tech/api/v2
224
+ ```
225
+
226
+ 環境変数 `NEON_API_KEY` を設定するか、リクエスト時に指定します。
227
+
228
+ ### 接続文字列取得(connection_uri API)
229
+
230
+ **エンドポイント**: `GET /projects/{project_id}/connection_uri`
231
+
232
+ このAPIは接続文字列を直接返すため、sedやjqでのパース不要です。
233
+
234
+ ```bash
235
+ # 直接接続(pooled=false)
236
+ curl -s \
237
+ "https://console.neon.tech/api/v2/projects/$PROJECT_ID/connection_uri?branch_id=$BRANCH_ID&pooled=false&database_name=neondb" \
238
+ -H "Authorization: Bearer $NEON_API_KEY" \
239
+ -H "Accept: application/json" | jq -r '.uri'
240
+
241
+ # プール接続(pooled=true)
242
+ curl -s \
243
+ "https://console.neon.tech/api/v2/projects/$PROJECT_ID/connection_uri?branch_id=$BRANCH_ID&pooled=true&database_name=neondb" \
244
+ -H "Authorization: Bearer $NEON_API_KEY" \
245
+ -H "Accept: application/json" | jq -r '.uri'
246
+ ```
247
+
248
+ **パラメータ**:
249
+
250
+ | パラメータ | 説明 | 必須 |
251
+ |-----------|------|:----:|
252
+ | `branch_id` | ブランチID | ✅ |
253
+ | `pooled` | Connection Pooling有効化 | ❌ |
254
+ | `database_name` | データベース名 | ❌ |
255
+ | `role_name` | ロール名 | ❌ |
256
+
257
+ **注意**: このAPIは `uri` フィールドに完全な接続文字列を返すため、GitHub Actionsでのマスキング(`::add-mask::`)を忘れずに実施してください。
258
+
259
+ ### ブランチ一覧取得(ページネーション対応)
260
+
261
+ **エンドポイント**: `GET /projects/{project_id}/branches`
262
+
263
+ ```bash
264
+ # 基本的な取得(最大100件)
265
+ curl -s \
266
+ "https://console.neon.tech/api/v2/projects/$PROJECT_ID/branches?limit=100" \
267
+ -H "Authorization: Bearer $NEON_API_KEY" \
268
+ -H "Accept: application/json"
269
+
270
+ # ページネーション(cursor使用)
271
+ CURSOR=""
272
+ ALL_BRANCHES="[]"
273
+ while true; do
274
+ URL="https://console.neon.tech/api/v2/projects/$PROJECT_ID/branches?limit=100"
275
+ if [ -n "$CURSOR" ]; then
276
+ URL="${URL}&cursor=${CURSOR}"
277
+ fi
278
+ RESPONSE=$(curl -s "$URL" \
279
+ -H "Authorization: Bearer $NEON_API_KEY" \
280
+ -H "Accept: application/json")
281
+ PAGE=$(echo "$RESPONSE" | jq '.branches')
282
+ ALL_BRANCHES=$(echo "$ALL_BRANCHES $PAGE" | jq -s '.[0] + .[1]')
283
+ NEXT=$(echo "$RESPONSE" | jq -r '.pagination.next // empty')
284
+ if [ -z "$NEXT" ]; then
285
+ break
286
+ fi
287
+ CURSOR="$NEXT"
288
+ done
289
+ ```
290
+
291
+ **パラメータ**:
292
+
293
+ | パラメータ | 説明 | デフォルト |
294
+ |-----------|------|----------|
295
+ | `limit` | 最大取得件数 | 100 |
296
+ | `cursor` | ページネーションカーソル | - |
297
+ | `search` | ブランチ名で検索 | - |
298
+
299
+ ### ブランチ作成(自動サスペンド設定付き)
300
+
301
+ **エンドポイント**: `POST /projects/{project_id}/branches`
302
+
303
+ ```bash
304
+ curl -X POST \
305
+ "https://console.neon.tech/api/v2/projects/$PROJECT_ID/branches" \
306
+ -H "Authorization: Bearer $NEON_API_KEY" \
307
+ -H "Content-Type: application/json" \
308
+ -d '{
309
+ "branch": {
310
+ "name": "preview/pr-123",
311
+ "parent_id": "$PARENT_BRANCH_ID"
312
+ },
313
+ "endpoints": [
314
+ {
315
+ "type": "read_write",
316
+ "autoscaling_limit_min_cu": 0.25,
317
+ "autoscaling_limit_max_cu": 0.25,
318
+ "suspend_timeout_seconds": 86400
319
+ }
320
+ ]
321
+ }'
322
+ ```
323
+
324
+ **パラメータ**:
325
+
326
+ | パラメータ | 説明 | デフォルト |
327
+ |-----------|------|----------|
328
+ | `branch.name` | ブランチ名 | 必須 |
329
+ | `branch.parent_id` | 親ブランチID | - |
330
+ | `endpoints[].suspend_timeout_seconds` | 自動サスペンドまでの秒数 | 300 |
331
+ | `endpoints[].autoscaling_limit_min_cu` | 最小CU(Compute Units) | 0.25 |
332
+ | `endpoints[].autoscaling_limit_max_cu` | 最大CU | 0.25 |
333
+
334
+ **自動サスペンドの設定**:
335
+ - `86400` 秒(1日間)アクセスなしでサスペンド
336
+ - コスト削減に有効
337
+
338
+ ### ブランチ削除
339
+
340
+ **エンドポイント**: `DELETE /projects/{project_id}/branches/{branch_id}`
341
+
342
+ ```bash
343
+ curl -X DELETE \
344
+ "https://console.neon.tech/api/v2/projects/$PROJECT_ID/branches/$BRANCH_ID" \
345
+ -H "Authorization: Bearer $NEON_API_KEY" \
346
+ -H "Accept: application/json"
347
+ ```
348
+
349
+ ### ブランチ存在確認(search + 完全一致)
350
+
351
+ ```bash
352
+ # 検索API(部分一致)
353
+ HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
354
+ "https://console.neon.tech/api/v2/projects/$PROJECT_ID/branches?search=production" \
355
+ -H "Authorization: Bearer $NEON_API_KEY" \
356
+ -H "Accept: application/json")
357
+
358
+ # 完全一致確認(jqで絞り込み)
359
+ BRANCH_EXISTS=$(curl -s \
360
+ "https://console.neon.tech/api/v2/projects/$PROJECT_ID/branches?search=production" \
361
+ -H "Authorization: Bearer $NEON_API_KEY" \
362
+ -H "Accept: application/json" | jq -r ".branches[] | select(.name == \"production\") | .name")
363
+
364
+ if [ -n "$BRANCH_EXISTS" ]; then
365
+ echo "Branch exists: production"
366
+ else
367
+ echo "Branch not found: production"
368
+ fi
369
+ ```
370
+
371
+ **注意**: `search` パラメータは部分一致のため、完全一致が必要な場合は `jq` で絞り込みが必要です。
372
+
373
+ ---
374
+
375
+ ## 実践例: ブランチ戦略セットアップ手順
376
+
377
+ ### 前提条件
378
+
379
+ - Neonアカウント作成済み
380
+ - `NEON_API_KEY` 環境変数が設定済み
381
+ - `NEON_PROJECT_ID` を把握している
382
+
383
+ ### Step 1: production(main)ブランチの確認
384
+
385
+ Neonプロジェクトのデフォルトブランチは自動的に `main` という名前で作成されます。このブランチを本番環境用として使用します。
386
+
387
+ ```bash
388
+ # ブランチ一覧を確認
389
+ neonctl branches list --project-id $PROJECT_ID
390
+
391
+ # デフォルトブランチの接続文字列を取得
392
+ neonctl connection-string main --project-id $PROJECT_ID --pooled
393
+ ```
394
+
395
+ **推奨**: デフォルトブランチ名を `production` にリネームする場合は、Neon Dashboardから変更してください(CLIでは非対応)。
396
+
397
+ ### Step 2: developmentブランチの作成
398
+
399
+ ```bash
400
+ # developmentブランチ作成(親: main)
401
+ # --parent にはブランチ名、ブランチID、タイムスタンプ、LSNを指定可能
402
+ neonctl branches create \
403
+ --project-id $PROJECT_ID \
404
+ --name development \
405
+ --parent main
406
+
407
+ # 接続文字列を取得
408
+ neonctl connection-string development \
409
+ --project-id $PROJECT_ID \
410
+ --pooled
411
+ ```
412
+
413
+ ### Step 3: preview/pr-*ブランチの自動作成(GitHub Actions連携)
414
+
415
+ PR Preview用のブランチは、GitHub Actionsで自動作成・削除します。ブランチ名はGitブランチ名に依存せず、PR番号から生成されます。
416
+
417
+ 詳細は [デプロイメント設計方針](../steering/infrastructure/deployment.md) の「ブランチ別デプロイフロー」セクションを参照してください。
418
+
419
+ **自動作成の流れ**:
420
+
421
+ 1. PR作成時: `deploy-pr-preview.yml` が `preview/pr-<PR番号>` ブランチを作成
422
+ - 例: PR #123 → `preview/pr-123`
423
+ 2. PR更新時: 既存ブランチを再利用(`connection_uri` APIで接続文字列取得)
424
+ 3. PRクローズ時: `cleanup-pr-preview-on-close.yml` がブランチを即座削除
425
+ 4. 定期クリーンアップ: `cleanup-pr-preview-db.yml` が孤立ブランチを削除(毎日00:00 UTC)
426
+
427
+ ---
428
+
429
+ ## 自動化時の注意点
430
+
431
+ ### 非対話実行
432
+
433
+ `neonctl auth` は対話型のため、自動化には以下のいずれかを使用します:
434
+
435
+ 1. **環境変数方式(推奨)**:
436
+ ```bash
437
+ export NEON_API_KEY=your_api_key
438
+ neonctl projects list
439
+ ```
440
+
441
+ 2. **コマンドオプション方式**:
442
+ ```bash
443
+ neonctl projects list --api-key your_api_key
444
+ ```
445
+
446
+ ### エラーハンドリング
447
+
448
+ **既存リソース重複**:
449
+
450
+ ```bash
451
+ # ブランチ作成時の重複チェック
452
+ BRANCH_EXISTS=$(curl -s \
453
+ "https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/branches?search=preview/pr-123" \
454
+ -H "Authorization: Bearer $NEON_API_KEY" \
455
+ -H "Accept: application/json" | jq -r ".branches[] | select(.name == \"preview/pr-123\") | .id")
456
+
457
+ if [ -z "$BRANCH_EXISTS" ]; then
458
+ echo "Creating new branch..."
459
+ # ブランチ作成処理
460
+ else
461
+ echo "Branch already exists, reusing..."
462
+ # 既存ブランチIDを使用
463
+ fi
464
+ ```
465
+
466
+ ### レート制限
467
+
468
+ Neon APIにはレート制限があります(詳細はドキュメント未公開)。
469
+
470
+ **推奨対策**:
471
+ - バッチ処理では適度な間隔(1秒程度)を空ける
472
+ - ページネーション時は一度に大量取得せず、必要な分のみ取得
473
+
474
+ ### 出力フォーマット
475
+
476
+ CLIは `--output json` オプションをサポートしていますが、デフォルトで構造化されたJSON出力が得られます。
477
+
478
+ ```bash
479
+ # JSON形式で出力(デフォルト)
480
+ neonctl branches list --project-id $PROJECT_ID
481
+
482
+ # jqでパース
483
+ neonctl branches list --project-id $PROJECT_ID | jq -r '.branches[] | .name'
484
+ ```
485
+
486
+ ---
487
+
488
+ ## トラブルシューティング
489
+
490
+ ### neonctl未インストール
491
+
492
+ **症状**: `command not found: neonctl`
493
+
494
+ **解決策**:
495
+
496
+ ```bash
497
+ # npmでグローバルインストール
498
+ npm install -g neonctl
499
+
500
+ # pnpmでグローバルインストール
501
+ pnpm add -g neonctl
502
+
503
+ # バージョン確認
504
+ neonctl --version
505
+ ```
506
+
507
+ ### 認証エラー
508
+
509
+ **症状**: `401 Unauthorized` または `Error: Authentication required`
510
+
511
+ **原因**:
512
+ - `NEON_API_KEY` が未設定または無効
513
+ - APIキーの有効期限切れ
514
+
515
+ **解決策**:
516
+
517
+ ```bash
518
+ # APIキーの確認
519
+ echo $NEON_API_KEY
520
+
521
+ # Neon Dashboard > Account Settings > API Keys から新しいAPIキーを生成
522
+ # 環境変数を再設定
523
+ export NEON_API_KEY=new_api_key
524
+ ```
525
+
526
+ ### ブランチ名の制約
527
+
528
+ **制約**:
529
+ - 小文字、数字、ハイフン(`-`)、スラッシュ(`/`)のみ使用可能
530
+ - 最大63文字
531
+ - スラッシュ(`/`)は許可されているが、階層構造を持たない
532
+
533
+ **良い例**:
534
+ - `production`
535
+ - `development`
536
+ - `preview/pr-123`
537
+
538
+ **悪い例**:
539
+ - `PRODUCTION` (大文字不可)
540
+ - `preview_pr_123` (アンダースコア不可)
541
+
542
+ ### 接続文字列の問題
543
+
544
+ **症状**: 接続文字列が空または `null` になる
545
+
546
+ **原因**:
547
+ - ブランチIDが不正
548
+ - データベース名が存在しない
549
+ - APIリクエストが失敗している
550
+
551
+ **解決策**:
552
+
553
+ ```bash
554
+ # ブランチIDを確認
555
+ neonctl branches list --project-id $PROJECT_ID
556
+
557
+ # データベース一覧を確認
558
+ neonctl databases list --project-id $PROJECT_ID --branch $BRANCH_NAME
559
+
560
+ # 手動でAPIを実行してレスポンスを確認
561
+ curl -v \
562
+ "https://console.neon.tech/api/v2/projects/$PROJECT_ID/connection_uri?branch_id=$BRANCH_ID&pooled=true&database_name=neondb" \
563
+ -H "Authorization: Bearer $NEON_API_KEY" \
564
+ -H "Accept: application/json"
565
+ ```
566
+
567
+ ### 孤立ブランチの削除
568
+
569
+ **症状**: PRがクローズされたのにNeonブランチが残っている
570
+
571
+ **原因**:
572
+ - `cleanup-pr-preview-on-close.yml` の実行失敗
573
+ - 手動削除漏れ
574
+
575
+ **解決策**:
576
+
577
+ ```bash
578
+ # 定期クリーンアップワークフローを手動実行
579
+ gh workflow run cleanup-pr-preview-db.yml
580
+
581
+ # または手動削除
582
+ BRANCH_ID=$(neonctl branches list --project-id $PROJECT_ID | jq -r '.branches[] | select(.name == "preview/pr-123") | .id')
583
+ neonctl branches delete $BRANCH_ID --project-id $PROJECT_ID
584
+ ```
585
+
586
+ ---
587
+
588
+ ## 関連ドキュメント
589
+
590
+ - [デプロイセットアップ手順(Neonセクション)](./deployment-setup.md)
591
+ - [デプロイメント設計方針(Neonブランチ戦略)](../steering/infrastructure/deployment.md)
592
+ - [環境変数設計方針](../steering/infrastructure/environment-variables.md)
593
+ - [Neon公式ドキュメント](https://neon.tech/docs)
594
+ - [Neon API公式リファレンス](https://api-docs.neon.tech/reference/getting-started-with-neon-api)
595
+ - [neonctl CLI公式ドキュメント](https://neon.tech/docs/reference/neon-cli)
596
+ <!-- @einja:managed:end -->
597
+
598
+ ---
599
+
600
+ <!-- @einja:seed:start id="neon-cli-reference-project" -->
601
+ ## プロジェクト固有の設定
602
+
603
+ <!-- このセクションはプロジェクト固有の内容を追記する場合はここに記載 -->
604
+ <!-- einja syncで上書きされません -->
605
+ <!-- @einja:seed:end -->
@@ -1,3 +1,4 @@
1
+ <!-- @einja:managed:start -->
1
2
  # Vercel CLI/API リファレンス
2
3
 
3
4
  ## 概要
@@ -449,3 +450,82 @@ jobs:
449
450
  - [Vercel CLI公式ドキュメント](https://vercel.com/docs/cli)
450
451
  - [Vercel REST API公式ドキュメント](https://vercel.com/docs/rest-api)
451
452
  - [GitHub CLI公式ドキュメント](https://cli.github.com/manual/)
453
+
454
+ ## 自動化時の注意点
455
+
456
+ ### 非対話モード
457
+
458
+ 自動化スクリプトやClaude Code Skillから呼び出す場合、確認プロンプトをスキップする必要があります:
459
+
460
+ | コマンド | 非対話オプション | 説明 |
461
+ |---------|----------------|------|
462
+ | `vercel link` | `--yes` | プロジェクトリンクの確認をスキップ |
463
+ | `vercel deploy` | `--yes` | デプロイ確認をスキップ |
464
+ | `vercel env add` | パイプ入力 | `echo "value" \| vercel env add NAME <environment>` (environment: production/preview/development 必須) |
465
+ | `vercel env rm` | `--yes` | 削除確認をスキップ |
466
+
467
+ ### トークン認証
468
+
469
+ CLIの対話的ログインではなく、トークンを使用して認証:
470
+
471
+ ```bash
472
+ # 環境変数で認証
473
+ export VERCEL_TOKEN="your-token"
474
+ vercel --token $VERCEL_TOKEN <command>
475
+
476
+ # または .env.personal から読み込み
477
+ source .env.personal
478
+ vercel --token $VERCEL_TOKEN <command>
479
+ ```
480
+
481
+ ### JSON出力について
482
+
483
+ **注意**: Vercel CLI v35以降、`vercel ls` 等で `--json` フラグはサポートされていません。
484
+ プログラマティックにVercelの情報を取得する場合は、REST APIを使用してください:
485
+
486
+ ```bash
487
+ # REST APIによるプロジェクト情報取得
488
+ curl -s -H "Authorization: Bearer $VERCEL_TOKEN" \
489
+ "https://api.vercel.com/v9/projects/<project-id>"
490
+
491
+ # REST APIによるデプロイ一覧取得
492
+ curl -s -H "Authorization: Bearer $VERCEL_TOKEN" \
493
+ "https://api.vercel.com/v6/deployments?projectId=<project-id>&limit=5"
494
+ ```
495
+
496
+ ## 環境変数同期自動化
497
+
498
+ ### 初回セットアップ時の手動同期
499
+
500
+ **注意**: 通常はGitHub Actions (`deploy-stable-branches.yml`) が環境変数を自動同期します。
501
+ 以下の手順は**初回セットアップ時のみ**手動で実行してください。
502
+
503
+ ### .env.* からVercelへの環境変数同期
504
+
505
+ 暗号化された `.env.*` ファイルからEncryptedキーのみを抽出し、Vercelに同期するコマンド例:
506
+
507
+ ```bash
508
+ # .env.production の暗号化キーをVercelのproduction環境に同期
509
+ dotenvx decrypt -f .env.production --stdout | while IFS='=' read -r key value; do
510
+ # DOTENV_PUBLIC_KEY_ で始まるキーはスキップ
511
+ [[ "$key" == DOTENV_PUBLIC_KEY_* ]] && continue
512
+ # 空行やコメント行をスキップ
513
+ [[ -z "$key" || "$key" == \#* ]] && continue
514
+ echo "$value" | vercel env add "$key" production --yes 2>/dev/null || true
515
+ done
516
+ ```
517
+
518
+ ### Neon CLI リファレンス
519
+
520
+ Neon CLIの詳細は [Neon CLI リファレンス](./neon-cli-reference.md) を参照してください。
521
+
522
+ <!-- @einja:managed:end -->
523
+
524
+ ---
525
+
526
+ <!-- @einja:seed:start id="vercel-cli-reference-project" -->
527
+ ## プロジェクト固有の設定
528
+
529
+ <!-- このセクションはプロジェクト固有の内容を追記する場所です -->
530
+ <!-- einja syncで上書きされません -->
531
+ <!-- @einja:seed:end -->
@@ -92,12 +92,11 @@ ACx.y: <振る舞いの1文要約>
92
92
 
93
93
  ### 関連
94
94
  - **受け入れ条件**: AC2.1, AC4.1, AC8.1(シナリオに関連するAC番号)
95
- - **関連タスク**: 2.1, 2.4, 3.1(シナリオに含まれるタスク番号)
96
95
 
97
96
  ### 実施タイミング
98
- - **タスク2.1完了後**: Step 1-3まで実施可能
99
- - **タスク2.4完了後**: Step 1-5まで実施可能
100
- - **タスク3.1完了後**: 全Step実施(フルシナリオ)
97
+ - **AC2.1〜AC2.3実装後**: Step 1-3まで実施可能
98
+ - **AC4.1〜AC4.2実装後**: Step 1-5まで実施可能
99
+ - **AC8.1実装後**: 全Step実施(フルシナリオ)
101
100
 
102
101
  ### テスト手順
103
102