@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.
- package/README.md +1 -0
- package/dist/lib/file-system.d.ts +1 -5
- package/dist/lib/file-system.d.ts.map +1 -1
- package/dist/lib/file-system.js +2 -8
- package/dist/lib/file-system.js.map +1 -1
- package/dist/lib/mcp-config.js +3 -3
- package/dist/lib/mcp-config.js.map +1 -1
- package/dist/lib/mcp-config.test.js +2 -2
- package/dist/lib/mcp-config.test.js.map +1 -1
- package/dist/lib/merger.d.ts.map +1 -1
- package/dist/lib/merger.js +5 -5
- package/dist/lib/merger.js.map +1 -1
- package/dist/lib/preset-update/file-copier.d.ts.map +1 -1
- package/dist/lib/preset-update/file-copier.js +5 -0
- package/dist/lib/preset-update/file-copier.js.map +1 -1
- package/dist/lib/preset-update/file-copier.test.js +26 -0
- package/dist/lib/preset-update/file-copier.test.js.map +1 -1
- package/dist/lib/sync/category-validator.d.ts +5 -1
- package/dist/lib/sync/category-validator.d.ts.map +1 -1
- package/dist/lib/sync/category-validator.js +16 -2
- package/dist/lib/sync/category-validator.js.map +1 -1
- package/dist/lib/sync/category-validator.test.js +14 -4
- package/dist/lib/sync/category-validator.test.js.map +1 -1
- package/dist/lib/sync/file-filter.d.ts.map +1 -1
- package/dist/lib/sync/file-filter.js +24 -0
- package/dist/lib/sync/file-filter.js.map +1 -1
- package/dist/lib/sync/file-filter.test.js +37 -0
- package/dist/lib/sync/file-filter.test.js.map +1 -1
- package/package.json +1 -1
- package/presets/default/.claude/agents/einja/specs/spec-qa-generator.md +40 -43
- package/presets/default/.claude/agents/einja/specs/spec-tasks-generator.md +16 -6
- package/presets/default/.claude/agents/einja/task/task-executer.md +13 -11
- package/presets/default/.claude/commands/einja/einja-sync.md +238 -0
- package/presets/default/.claude/commands/einja/spec-create.md +7 -3
- package/presets/default/.claude/commands/einja/task-exec.md +6 -6
- package/presets/default/.claude/settings.json +1 -0
- package/presets/default/.claude/skills/einja-coding-standards/SKILL.md +4 -3
- package/presets/default/.claude/skills/einja-coding-standards/references/import-conventions.md +69 -0
- package/presets/default/.claude/skills/einja-component-design/SKILL.md +3 -3
- package/presets/default/.claude/skills/einja-project-overview/SKILL.md +35 -0
- package/presets/default/.claude/skills/einja-skill-creator/SKILL.md +421 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/init_skill.py +333 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/package_skill.py +110 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/quick_validate.py +117 -0
- package/presets/default/.claude/skills/einja-spec-context-loader/SKILL.md +6 -6
- package/presets/default/.claude/skills/einja-task-qa/SKILL.md +24 -22
- package/presets/default/.claude/skills/einja-task-qa/{reference → references}/troubleshooting.md +1 -1
- package/presets/default/.claude/skills/einja-task-qa/{reference → references}/usage-patterns.md +2 -2
- package/presets/default/.claude/skills/einja-task-qa/templates/qa-test-template.md +13 -13
- package/{scaffolds → presets/default}/.mcp.json +27 -6
- package/presets/default/.vscode/settings.json +18 -0
- package/presets/default/CLAUDE.md.template +192 -0
- package/{scaffolds → presets/default/docs/einja}/example/README.md +1 -1
- package/{scaffolds → presets/default/docs/einja}/example/specs/issues/issue999-example-task/qa-tests/README.md +20 -23
- package/presets/default/docs/einja/example/specs/issues/issue999-example-task/qa-tests/evidence/story3/.gitkeep +0 -0
- package/{scaffolds → presets/default/docs/einja}/example/specs/issues/issue999-example-task/qa-tests/scenarios.md +12 -16
- package/presets/default/docs/einja/example/specs/issues/issue999-example-task/qa-tests/story1.md +101 -0
- package/presets/default/docs/einja/example/specs/issues/issue999-example-task/qa-tests/story2.md +70 -0
- package/presets/default/docs/einja/example/specs/issues/issue999-example-task/qa-tests/story3.md +69 -0
- package/{scaffolds → presets/default/docs/einja}/instructions/deployment-setup.md +93 -9
- package/{scaffolds → presets/default/docs/einja}/instructions/environment-setup.md +152 -4
- package/{scaffolds → presets/default/docs/einja}/instructions/local-server-environment-and-worktree.md +99 -0
- package/presets/default/docs/einja/instructions/neon-cli-reference.md +605 -0
- package/{scaffolds → presets/default/docs/einja}/instructions/vercel-cli-reference.md +80 -0
- package/{scaffolds → presets/default/docs/einja}/steering/acceptance-criteria-and-qa-guide.md +3 -4
- package/{scaffolds → presets/default/docs/einja}/steering/development/database-guidelines.md +52 -3
- package/{scaffolds → presets/default/docs/einja}/steering/infrastructure/environment-variables.md +4 -4
- package/{scaffolds → presets/default/docs/einja}/templates/README.md +1 -1
- package/{scaffolds → presets/default/docs/einja}/templates/qa-test.md.template +29 -26
- package/presets/default/symlinks.json +0 -45
- package/scaffolds/cli/preset.yaml +0 -137
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-1.md +0 -268
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-2.md +0 -179
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-3.md +0 -392
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/2-1.md +0 -459
- /package/presets/default/.claude/skills/einja-coding-standards/{reference → references}/naming-conventions.md +0 -0
- /package/presets/default/.claude/skills/einja-coding-standards/{reference → references}/prohibited-patterns.md +0 -0
- /package/presets/default/.claude/skills/einja-coding-standards/{reference → references}/typescript-rules.md +0 -0
- /package/presets/default/.claude/skills/einja-component-design/{reference → references}/directory-structure.md +0 -0
- /package/presets/default/.claude/skills/einja-component-design/{reference → references}/props-patterns.md +0 -0
- /package/presets/default/.claude/skills/einja-component-design/{reference → references}/styling-guide.md +0 -0
- /package/presets/default/.claude/skills/einja-task-qa/{reference → references}/failure-patterns.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/example/specs/issues/issue999-example-task/design.md +0 -0
- /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
- /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
- /package/{scaffolds → presets/default/docs/einja}/example/specs/issues/issue999-example-task/requirements.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/example/specs/issues/issue999-example-task/tasks.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/instructions/task-execute.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/instructions/task-vibe-kanban-loop.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/README.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/architecture.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/branch-strategy.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/commit-rules.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/db-schema-design.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/development/api-development.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/development/backend-architecture.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/development/frontend-development.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/development/review-guidelines.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/development/testing-strategy.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/development-workflow.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/infrastructure/deployment.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/product.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/steering/task-management.md +0 -0
- /package/{scaffolds → presets/default/docs/einja}/templates/design-simple.md.template +0 -0
- /package/{scaffolds → presets/default/docs/einja}/templates/design.md.template +0 -0
- /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 -->
|
package/{scaffolds → presets/default/docs/einja}/steering/acceptance-criteria-and-qa-guide.md
RENAMED
|
@@ -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
|
-
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
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
|
|