@einja/dev-cli 0.1.41 → 0.1.45

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 (103) hide show
  1. package/README.md +0 -1
  2. package/dist/cli.js +0 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/sync.d.ts.map +1 -1
  5. package/dist/commands/sync.js +1 -20
  6. package/dist/commands/sync.js.map +1 -1
  7. package/dist/commands/task-loop/lib/github-client.test.js.map +1 -1
  8. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js +2 -2
  9. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js.map +1 -1
  10. package/dist/lib/preset-update/file-copier.js +3 -3
  11. package/dist/lib/preset-update/file-copier.js.map +1 -1
  12. package/dist/lib/sync/file-filter.js +2 -2
  13. package/dist/lib/sync/file-filter.js.map +1 -1
  14. package/dist/lib/sync/file-filter.test.js +20 -0
  15. package/dist/lib/sync/file-filter.test.js.map +1 -1
  16. package/dist/lib/sync/marker-processor.js.map +1 -1
  17. package/dist/lib/sync/metadata-manager.js +1 -1
  18. package/dist/lib/sync/metadata-manager.js.map +1 -1
  19. package/dist/lib/sync/metadata-manager.test.js +3 -2
  20. package/dist/lib/sync/metadata-manager.test.js.map +1 -1
  21. package/dist/lib/sync/project-private-synchronizer.d.ts.map +1 -1
  22. package/dist/lib/sync/project-private-synchronizer.js +5 -1
  23. package/dist/lib/sync/project-private-synchronizer.js.map +1 -1
  24. package/dist/types/index.d.ts +0 -1
  25. package/dist/types/index.d.ts.map +1 -1
  26. package/package.json +1 -1
  27. package/presets/default/.claude/agents/einja/backend-architect.md +17 -1
  28. package/presets/default/.claude/agents/einja/codex-agent.md +1 -1
  29. package/presets/default/.claude/agents/einja/design-engineer.md +1 -1
  30. package/presets/default/.claude/agents/einja/docs/docs-updater.md +3 -93
  31. package/presets/default/.claude/agents/einja/frontend-architect.md +17 -1
  32. package/presets/default/.claude/agents/einja/frontend-coder.md +1 -1
  33. package/presets/default/.claude/agents/einja/{specs/spec-design-generator.md → issue-specs/design-generator.md} +12 -7
  34. package/presets/default/.claude/agents/einja/{specs/spec-qa-generator.md → issue-specs/qa-generator.md} +6 -4
  35. package/presets/default/.claude/agents/einja/{specs/spec-requirements-generator.md → issue-specs/requirements-generator.md} +5 -5
  36. package/presets/default/.claude/agents/einja/{specs/spec-tasks-generator.md → issue-specs/tasks-generator.md} +13 -14
  37. package/presets/default/.claude/agents/einja/{specs/spec-tasks-validator.md → issue-specs/tasks-validator.md} +9 -9
  38. package/presets/default/.claude/agents/einja/issue-specs/ui-design-generator.md +114 -0
  39. package/presets/default/.claude/agents/einja/task/task-executer.md +9 -3
  40. package/presets/default/.claude/agents/einja/task/task-modification-analyzer.md +2 -2
  41. package/presets/default/.claude/agents/einja/task/task-qa.md +3 -3
  42. package/presets/default/.claude/agents/einja/task/task-reviewer.md +13 -1
  43. package/presets/default/.claude/commands/einja/einja-sync.md +119 -44
  44. package/presets/default/.claude/commands/einja/issue-exec.md +29 -19
  45. package/presets/default/.claude/commands/einja/sync-cursor-commands.md +6 -6
  46. package/presets/default/.claude/commands/einja/{update-docs-by-task-specs.md → update-docs-by-issue-specs.md} +58 -58
  47. package/presets/default/.claude/hooks/einja/plan-mode-skill-loader.sh +5 -1
  48. package/presets/default/.claude/settings.json +14 -4
  49. package/presets/default/.claude/skills/{einja-general-context-loader → _einja-general-context-loader}/SKILL.md +2 -2
  50. package/presets/default/.claude/skills/{einja-output-format → _einja-output-format}/SKILL.md +1 -1
  51. package/presets/default/.claude/skills/_einja-project-overview/SKILL.md +29 -0
  52. package/presets/default/.claude/skills/{einja-spec-context-loader → _einja-spec-context-loader}/SKILL.md +5 -5
  53. package/presets/default/.claude/skills/einja-coding-standards/references/testing-strategy.md +899 -0
  54. package/presets/default/.claude/skills/einja-conflict-resolver/SKILL.md +1 -1
  55. package/presets/default/.claude/skills/einja-create-pr/SKILL.md +138 -0
  56. package/presets/default/.claude/skills/einja-infra-maintenance/SKILL.md +779 -0
  57. package/presets/default/.claude/{commands/einja/spec-create.md → skills/einja-issue-spec-create/SKILL.md} +47 -24
  58. package/presets/default/.claude/skills/einja-issue-spec-generator/SKILL.md +105 -0
  59. package/presets/default/.claude/skills/einja-issue-spec-generator/references/format-rules.md +35 -0
  60. package/presets/default/.claude/skills/einja-issue-spec-validator/SKILL.md +130 -0
  61. package/presets/default/.claude/skills/einja-issue-spec-validator/references/validation-rules.md +52 -0
  62. package/presets/default/.claude/skills/einja-npm-release/SKILL.md +242 -0
  63. package/presets/default/.claude/skills/einja-skill-creator/SKILL.md +68 -12
  64. package/presets/default/.claude/skills/einja-skill-creator/scripts/aggregate_benchmark.py +368 -121
  65. package/presets/default/.claude/skills/einja-skill-creator/scripts/compare_runs.py +154 -0
  66. package/presets/default/.claude/skills/einja-skill-creator/scripts/generate_report.py +14 -7
  67. package/presets/default/.claude/skills/einja-skill-creator/scripts/improve_description.py +2 -7
  68. package/presets/default/.claude/skills/einja-skill-creator/scripts/run_loop.py +263 -183
  69. package/presets/default/.claude/skills/einja-skill-first/SKILL.md +265 -0
  70. package/presets/default/.claude/skills/einja-subagent-question-protocol/SKILL.md +98 -0
  71. package/presets/default/.claude/skills/einja-task-commit/SKILL.md +7 -7
  72. package/presets/default/.claude/{commands/einja/task-exec.md → skills/einja-task-exec/SKILL.md} +3 -78
  73. package/presets/default/.claude/skills/einja-task-qa/SKILL.md +4 -4
  74. package/presets/default/.claude/skills/einja-task-qa/references/troubleshooting.md +1 -1
  75. package/presets/default/.claude/skills/einja-task-qa/references/usage-patterns.md +2 -2
  76. package/presets/default/.claude/skills/einja-team-exec/SKILL.md +165 -0
  77. package/presets/default/CLAUDE.md.template +21 -6
  78. package/presets/default/docs/einja/instructions/deployment-setup.md +1 -1
  79. package/presets/default/docs/einja/instructions/issue-exec-workflow.md +11 -11
  80. package/presets/default/docs/einja/instructions/local-server-environment-and-worktree.md +1 -1
  81. package/presets/default/docs/einja/instructions/setup-flow.md +279 -0
  82. package/presets/default/docs/einja/instructions/task-execute.md +42 -42
  83. package/presets/default/docs/einja/steering/acceptance-criteria-and-qa-guide.md +1 -1
  84. package/presets/default/docs/einja/steering/branch-strategy.md +1 -1
  85. package/presets/default/docs/einja/steering/development-workflow.md +93 -25
  86. package/presets/default/docs/einja/steering/infrastructure/deployment.md +107 -0
  87. package/presets/default/docs/einja/steering/task-management.md +9 -13
  88. package/presets/default/scripts/ensure-serena.sh +2 -2
  89. package/presets/default/scripts/env-rotate-secrets.ts +66 -6
  90. package/presets/default/scripts/init-github.ts +363 -0
  91. package/presets/default/scripts/init.sh +11 -5
  92. package/presets/default/scripts/setup-dev.ts +16 -1
  93. package/dist/lib/sync/backup-manager.d.ts +0 -50
  94. package/dist/lib/sync/backup-manager.d.ts.map +0 -1
  95. package/dist/lib/sync/backup-manager.js +0 -117
  96. package/dist/lib/sync/backup-manager.js.map +0 -1
  97. package/dist/lib/sync/backup-manager.test.d.ts +0 -2
  98. package/dist/lib/sync/backup-manager.test.d.ts.map +0 -1
  99. package/dist/lib/sync/backup-manager.test.js +0 -155
  100. package/dist/lib/sync/backup-manager.test.js.map +0 -1
  101. package/presets/default/.claude/agents/einja/git/conflict-resolver.md +0 -152
  102. package/presets/default/.claude/hooks/einja/validate-git-commit.sh +0 -239
  103. package/presets/default/.claude/skills/einja-project-overview/SKILL.md +0 -39
@@ -0,0 +1,779 @@
1
+ ---
2
+ name: einja-infra-maintenance
3
+ description: "インフラ環境のセットアップ・メンテナンスを対話的に実行するSkill。ローカル環境、Vercel、Neon、GitHub Actions、環境変数管理をカバー"
4
+ user-invocable: true
5
+ ---
6
+
7
+ # インフラ環境メンテナンス Skill
8
+
9
+ ## 概要
10
+
11
+ インフラ環境のセットアップ・メンテナンスを**対話的に**実行するSkillです。ローカル開発環境、Vercel、Neon、GitHub Actions、環境変数管理をカバーします。
12
+
13
+ ## 参照ドキュメント
14
+
15
+ > **重要**: ドキュメントは**起動時に全て読まない**。選択されたカテゴリの実行時に、該当する参照ドキュメントのみを読むこと。各カテゴリの「参照ドキュメント」セクションに記載されたファイルが対象。
16
+
17
+ ### 設計方針
18
+ - `docs/einja/steering/infrastructure/environment-variables.md`
19
+ - `docs/einja/steering/infrastructure/deployment.md`
20
+
21
+ ### 手順書
22
+ - `docs/einja/instructions/environment-setup.md`
23
+ - `docs/einja/instructions/deployment-setup.md`
24
+ - `docs/einja/instructions/vercel-cli-reference.md`
25
+ - `docs/einja/instructions/neon-cli-reference.md`
26
+ - `docs/einja/instructions/local-server-environment-and-worktree.md`
27
+
28
+ > **Single Source of Truth**: このSkillは対話フローの定義であり、具体的なコマンド手順は各カテゴリの参照ドキュメントが正。
29
+
30
+ ---
31
+
32
+ ## 実行フロー
33
+
34
+ ```mermaid
35
+ graph TB
36
+ Start[Skill起動] --> Detect[Phase 1: 環境状態の自動検出]
37
+ Detect --> Judge[Phase 2: 意図判定]
38
+ Judge -->|意図が明確| Direct[該当カテゴリへ直接遷移]
39
+ Judge -->|意図が不明確| Menu[AskUserQuestion: メインメニュー]
40
+ Menu --> Cat[カテゴリ 1-7 選択]
41
+ Direct --> Exec[実行]
42
+ Cat --> Exec
43
+ Exec --> Result[結果報告]
44
+ ```
45
+
46
+ ---
47
+
48
+ ## Phase 1: 環境状態の自動検出
49
+
50
+ Skill起動時に以下を自動検出し、結果をユーザーに表示する。
51
+
52
+ ```bash
53
+ # === ファイル存在確認 ===
54
+ for f in .env .env.local .env.keys .env.personal .env.develop .env.staging .env.production .env.preview; do
55
+ [ -f "$f" ] && echo "✅ $f" || echo "❌ $f"
56
+ done
57
+
58
+ # === CLI存在確認 ===
59
+ for cmd in vercel neonctl gh dotenvx docker; do
60
+ command -v "$cmd" >/dev/null 2>&1 && echo "✅ $cmd" || echo "❌ $cmd"
61
+ done
62
+
63
+ # === Docker/PostgreSQL状態 ===
64
+ docker compose ps 2>/dev/null | grep postgres
65
+
66
+ # === 開発サーバー状態 ===
67
+ pnpm dev:status 2>/dev/null || echo "停止中"
68
+
69
+ # === トークン有効性検証(.env.personal 存在時のみ) ===
70
+ if [ -f ".env.personal" ]; then
71
+ # 並行実行で高速化(各コマンドにタイムアウト設定)
72
+ timeout 5 gh auth status 2>/dev/null && echo "✅ GITHUB_TOKEN 有効" || echo "⚠️ GITHUB_TOKEN 無効/未設定" &
73
+ timeout 5 vercel whoami 2>/dev/null && echo "✅ VERCEL_TOKEN 有効" || echo "⚠️ VERCEL_TOKEN 無効/未設定" &
74
+ if [ -n "$NEON_API_KEY" ]; then
75
+ timeout 5 neonctl projects list --api-key "$NEON_API_KEY" >/dev/null 2>&1 && echo "✅ NEON_API_KEY 有効" || echo "⚠️ NEON_API_KEY 無効/期限切れ" &
76
+ else
77
+ echo "⚠️ NEON_API_KEY 未設定"
78
+ fi
79
+ wait
80
+ fi
81
+ ```
82
+
83
+ 検出結果をサマリー表示した上で、AskUserQuestionでメインメニューを表示する。
84
+
85
+ ---
86
+
87
+ ## Phase 2: 意図判定とメインメニュー
88
+
89
+ ### 意図が明確な場合(質問せずに直接実行)
90
+
91
+ Skill起動時の引数やユーザーの指示から意図が読み取れる場合は、AskUserQuestionを使わずに該当カテゴリに直接進む。
92
+
93
+ **直接実行の例:**
94
+ - `/infra-maintenance Vercel初期設定` → カテゴリ3: Vercel管理へ直接遷移
95
+ - `/infra-maintenance ヘルスチェック` → カテゴリ6: 環境状態確認へ直接遷移
96
+ - `Neonのブランチを作成したい` → カテゴリ4: Neon管理へ直接遷移
97
+ - `GitHub Secretsを一括設定して` → カテゴリ5: GitHub Secrets管理へ直接遷移
98
+ - `環境変数を追加したい` → カテゴリ2: 環境変数管理へ直接遷移
99
+ - `CIが失敗してる` → カテゴリ7: GitHub Actions CI/CD管理へ直接遷移
100
+ - `ワークフローの実行状況を見たい` → カテゴリ7: GitHub Actions CI/CD管理へ直接遷移
101
+
102
+ ### 意図が不明確な場合のみメニューを表示
103
+
104
+ 引数がない、または意図が曖昧な場合のみ、AskUserQuestionで以下の選択肢を提示する。検出結果に基づいて推奨を表示する。
105
+
106
+ #### 検出結果に基づく推奨ロジック
107
+
108
+ Phase 1の検出結果から、推奨カテゴリにマーク(推奨)を付与してAskUserQuestionの選択肢に表示する。
109
+
110
+ | 検出結果 | 推奨カテゴリ |
111
+ |---------|------------|
112
+ | `.env.keys`不在 | ローカル環境セットアップ |
113
+ | 開発サーバー停止中 + `.env.keys`存在 | ローカル環境セットアップ |
114
+ | vercel CLI未インストール or 未リンク | Vercel管理 |
115
+ | neonctl未インストール | Neon管理 |
116
+ | `.env.personal`不在 | 環境変数管理 |
117
+ | トークン無効/期限切れ | 環境変数管理(個人トークン再設定) |
118
+ | 上記に該当しない | 環境状態確認(デフォルト) |
119
+
120
+ | 選択肢 | 説明 |
121
+ |--------|------|
122
+ | ローカル環境セットアップ | 初回セットアップ、開発サーバー起動 |
123
+ | 環境変数管理 | 個人トークン設定、チーム共有設定変更、新規変数追加 |
124
+ | Vercel管理 | 初期設定、環境変数同期、デプロイ状態確認 |
125
+ | Neon管理 | 初期設定、ブランチ管理、接続文字列取得 |
126
+ | GitHub Secrets管理 | 一覧表示、個別設定、一括設定 |
127
+ | 環境状態確認 | 包括的ヘルスチェック |
128
+ | GitHub Actions CI/CD管理 | ワークフロー状態確認、失敗調査、手動トリガー |
129
+
130
+ ---
131
+
132
+ ## カテゴリ1: ローカル環境セットアップ
133
+
134
+ ### サブメニュー
135
+ - **初回セットアップ**: `pnpm dev:setup` 実行
136
+ - **開発サーバー起動**: `pnpm dev:bg` 実行
137
+ - **サーバー停止**: `pnpm dev:stop` 実行
138
+ - **ログ確認**: `pnpm dev:logs` 実行
139
+
140
+ ### 実行手順
141
+
142
+ #### ゼロ状態判定
143
+ Phase 1の検出結果で `.env*` ファイルが**全て不在**の場合、「初回プロジェクトセットアップ」モードとして以下の順序で案内する:
144
+ 1. 必須CLIツールの確認・インストール案内(Docker含む)
145
+ 2. `pnpm install` → `pnpm dev:setup` の実行
146
+ 3. 完了後、カテゴリ2(環境変数管理)への誘導
147
+
148
+ #### 初回セットアップ
149
+ 1. `pnpm install` で依存関係インストール
150
+ 2. `pnpm dev:setup` で環境セットアップ
151
+ 3. エラー時: エラー内容を分析し、対話的にトラブルシュート
152
+
153
+ #### エラー時の対処
154
+
155
+ | エラー | 対処 |
156
+ |--------|------|
157
+ | `.env.keys`不在 | `git worktree list` でメインworktreeを検出し、`.env.keys` が存在すれば自動コピー。不在の場合は「チームメンバーから `.env.keys` ファイルを受け取り、プロジェクトルートに配置してください」と案内 |
158
+ | Docker未インストール | [OrbStack](https://orbstack.dev/) のインストールを案内。`brew install orbstack` または公式サイトからダウンロード |
159
+ | PostgreSQL接続エラー | `docker compose up -d postgres` → ヘルスチェック |
160
+ | Node.jsバージョン不一致 | `volta install node@22` 提案 |
161
+ | pnpmバージョン不一致 | `volta install pnpm@10` 提案 |
162
+
163
+ ### 参照ドキュメント
164
+ - `docs/einja/instructions/local-server-environment-and-worktree.md`
165
+ - `docs/einja/instructions/environment-setup.md`
166
+
167
+ ---
168
+
169
+ ## カテゴリ2: 環境変数管理
170
+
171
+ ### サブメニュー
172
+ - **個人トークン設定**: `.env.personal`にトークンを保存
173
+ - **チーム共有設定変更**: `.env.local`等の復号→編集→再暗号化
174
+ - **新規環境変数追加**: プロジェクト全体への変数追加フロー
175
+ - **環境変数の状態表示**: 現在の設定状態を表示
176
+
177
+ > **クイック操作**: `pnpm env:update` を実行すると、個人トークン設定・チーム共有設定変更を対話式ウィザードで実行できます。
178
+
179
+ ### 実行手順
180
+
181
+ #### 個人トークン設定
182
+ 1. 必要なトークンをAskUserQuestionで確認:
183
+ - `GITHUB_TOKEN`: https://github.com/settings/tokens/new
184
+ - `VERCEL_TOKEN`: https://vercel.com/account/tokens
185
+ - `NEON_API_KEY`: https://console.neon.tech/app/settings/api-keys
186
+ 2. AskUserQuestionでトークン値を入力してもらう
187
+ 3. `.env.personal`に保存
188
+ 4. `chmod 600 .env.personal` 実行
189
+ 5. API検証(可能な場合):
190
+ - GitHub: `gh auth status`
191
+ - Vercel: `vercel whoami`
192
+ - Neon: `neonctl projects list --api-key $NEON_API_KEY`
193
+
194
+ #### チーム共有設定変更
195
+ 1. AskUserQuestionで対象ファイルを選択(.env.local / .env.develop / .env.production / .env.preview)
196
+ 2. `dotenvx decrypt -f <file> --stdout > <file>.tmp`
197
+ 3. 変更内容をAskUserQuestionで確認
198
+ 4. 編集実行
199
+ 5. `rm <file> && mv <file>.tmp <file>`
200
+ 6. `dotenvx encrypt -f <file>`
201
+ 7. コミット案内
202
+
203
+ #### 新規環境変数追加
204
+ 1. AskUserQuestionで変数名・用途・対象環境(local/develop/production/preview)を確認
205
+ 2. 対象環境に応じた`.env.*`ファイルを特定
206
+ 3. 暗号化ファイルの場合: チーム共有設定変更と同じフロー(decrypt→編集→encrypt)
207
+ 4. 非暗号化ファイルの場合(.env/.env.personal): 直接編集
208
+ 5. AskUserQuestion: 他環境への展開が必要か確認
209
+ 6. コミット案内(チーム共有設定の場合)
210
+
211
+ > **詳細手順**: `docs/einja/instructions/environment-setup.md`の「新規環境変数を追加するとき」を参照
212
+
213
+ ### 参照ドキュメント
214
+ - `docs/einja/instructions/environment-setup.md`
215
+
216
+ ---
217
+
218
+ ## カテゴリ3: Vercel管理
219
+
220
+ ### サブメニュー
221
+ - **新規プロジェクト作成**: Vercelプロジェクトの新規作成(初回のみ)
222
+ - **初期設定**: プロジェクトリンク・Root Directory設定
223
+ - **環境変数同期**: dotenvx鍵のVercel同期
224
+ - **デプロイ状態確認**: 最新デプロイ情報表示
225
+
226
+ ### 実行手順
227
+
228
+ #### 新規プロジェクト作成(初回のみ)
229
+ > Vercelにプロジェクトが存在しない場合(ゼロ状態)のみ実行。VERCEL_TOKEN 取得済みが前提。
230
+
231
+ 1. **プロジェクト名の推定・確認**:
232
+ package.jsonのnameフィールドからプロジェクト名を推定(`@scope/name` → `name`、`-monorepo`/`-template`サフィックス除去)。
233
+ フォールバック: Gitリポジトリ名から推定。
234
+ ```bash
235
+ BASE_NAME=$(cat package.json | jq -r '.name // empty' | sed 's/@[^/]*\///' | sed 's/-monorepo$//' | sed 's/-template$//')
236
+ if [ -z "$BASE_NAME" ]; then
237
+ BASE_NAME=$(basename "$(git remote get-url origin 2>/dev/null)" .git | sed 's/-template$//')
238
+ fi
239
+ # jq未インストール時のフォールバック
240
+ if [ -z "$BASE_NAME" ]; then
241
+ BASE_NAME=$(grep '"name"' package.json | head -1 | sed 's/.*"name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/' | sed 's/@[^/]*\///' | sed 's/-monorepo$//' | sed 's/-template$//')
242
+ fi
243
+ ```
244
+ 推定した `${BASE_NAME}-web`, `${BASE_NAME}-admin` をAskUserQuestionでプロジェクト名と作成対象アプリ(web / admin / 両方)を確認。
245
+
246
+ 2. **既存プロジェクトの確認**:
247
+ ```bash
248
+ vercel project ls
249
+ ```
250
+ 既にプロジェクトが存在する場合は「既にVercelに存在します。スキップしますか?」と確認。
251
+
252
+ 3. **CLIでプロジェクト作成・Git接続**:
253
+ ```bash
254
+ # チーム切り替え(必要な場合)
255
+ vercel switch <team-slug>
256
+
257
+ # アプリごとにプロジェクト作成
258
+ for APP_NAME in web admin; do
259
+ cd "apps/$APP_NAME"
260
+ vercel link --project="${BASE_NAME}-${APP_NAME}" --yes
261
+ vercel git connect "https://github.com/${GH_ORG}/${GH_REPO}" --yes
262
+ cd ../..
263
+ done
264
+ ```
265
+ > `vercel link` はプロジェクトが存在しない場合に自動作成する(`vercel-cli-reference.md` L287)
266
+
267
+ 4. **APIでRoot Directory設定**(CLIでは不可: `vercel-cli-reference.md` L112):
268
+ ```bash
269
+ for APP_NAME in web admin; do
270
+ PROJECT_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.projectId')
271
+ VERCEL_ORG_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.orgId')
272
+ curl -X PATCH "https://api.vercel.com/v9/projects/$PROJECT_ID?teamId=$VERCEL_ORG_ID" \
273
+ -H "Authorization: Bearer $VERCEL_TOKEN" \
274
+ -H "Content-Type: application/json" \
275
+ -d "{\"rootDirectory\": \"apps/$APP_NAME\"}"
276
+ done
277
+ ```
278
+
279
+ 5. **プロジェクトID/ORG IDを自動取得・表示**:
280
+ ```bash
281
+ for APP_NAME in web admin; do
282
+ echo "$(echo $APP_NAME | tr '[:lower:]' '[:upper:]'):"
283
+ echo " PROJECT_ID: $(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.projectId')"
284
+ echo " ORG_ID: $(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.orgId')"
285
+ done
286
+ ```
287
+ GitHub Secretsへの登録を提案(→ カテゴリ5: 一括設定 Step 2)
288
+
289
+ #### 初期設定
290
+ 1. VERCEL_TOKEN確認 → 未設定時はURL案内 + `.env.personal`保存
291
+ 2. AskUserQuestionでアプリ選択(web / admin)
292
+ 3. `vercel link --project=$NAME --yes` で接続
293
+ 4. Root Directory設定:
294
+ ```bash
295
+ curl -X PATCH "https://api.vercel.com/v9/projects/$PROJECT_ID?teamId=$VERCEL_ORG_ID" \
296
+ -H "Authorization: Bearer $VERCEL_TOKEN" \
297
+ -H "Content-Type: application/json" \
298
+ -d '{"rootDirectory": "apps/$APP_NAME"}'
299
+ ```
300
+ 5. `.vercel/project.json` からプロジェクトIDとORG IDを自動取得:
301
+ ```bash
302
+ VERCEL_PROJECT_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.projectId')
303
+ VERCEL_ORG_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.orgId')
304
+ ```
305
+ 6. 取得結果を表示し、GitHub Secretsへの登録を提案(→ カテゴリ5)
306
+
307
+ #### 環境変数同期
308
+ > **注意**: CI/CDではmainブランチのみ`vercel env add`で自動同期。develop/staging/PRは`--env`実行時注入。
309
+ > 以下の手動同期は**初回セットアップ時のみ**実行。
310
+
311
+ 1. `.env.keys`からDOTENV_PRIVATE_KEY_*を抽出
312
+ 2. AskUserQuestionで同期対象を確認(値はマスク表示)
313
+ 3. 承認後、`vercel env rm` + `vercel env add` でVercelに同期
314
+ 4. 設定結果を `vercel env ls` で確認
315
+
316
+ > **詳細手順**: `docs/einja/instructions/vercel-cli-reference.md`の「環境変数同期自動化」を参照
317
+
318
+ #### デプロイ状態確認
319
+ ```bash
320
+ vercel ls
321
+ ```
322
+
323
+ ### 参照ドキュメント
324
+ - `docs/einja/instructions/vercel-cli-reference.md`
325
+ - `docs/einja/instructions/deployment-setup.md`
326
+
327
+ ---
328
+
329
+ ## カテゴリ4: Neon管理
330
+
331
+ ### サブメニュー
332
+ - **初期設定**: プロジェクト作成・ブランチ戦略初期化
333
+ - **ブランチ管理**: 一覧表示・作成・削除
334
+ - **接続文字列取得**: 特定ブランチの接続URLを取得
335
+ - **プロジェクトID取得**: 既存プロジェクトのIDを `neonctl projects list` で自動取得
336
+
337
+ ### 実行手順
338
+
339
+ #### 初期設定
340
+ 1. NEON_API_KEY確認 → 未設定時はURL案内 + `.env.personal`保存
341
+ - 取得URL: https://console.neon.tech/app/settings/api-keys
342
+ - **`neonctl auth`は使用しない**(理由: `docs/einja/instructions/neon-cli-reference.md`「認証方式」参照)→ `--api-key`フラグまたは`NEON_API_KEY`環境変数で認証
343
+
344
+ 2. **既存プロジェクトの確認**:
345
+ ```bash
346
+ neonctl projects list --api-key $NEON_API_KEY
347
+ ```
348
+ 既存プロジェクトがあれば一覧表示し、使用するプロジェクトをAskUserQuestionで確認。
349
+ 既存プロジェクトを使用する場合 → `neonctl projects get $PROJECT_ID` でIDを取得してステップ4へ。
350
+
351
+ 3. **プロジェクト名の推定・確認・作成**:
352
+ 共通推定ロジック(カテゴリ3と同様)で `$BASE_NAME` を取得。AskUserQuestionで確認(デフォルト値として提示)。
353
+ ```bash
354
+ neonctl projects create --name "$NEON_PROJECT_NAME" --region-id aws-ap-northeast-1 --api-key $NEON_API_KEY
355
+ ```
356
+ 作成後、`neonctl projects list` でプロジェクトIDを取得:
357
+ ```bash
358
+ NEON_PROJECT_ID=$(neonctl projects list --api-key $NEON_API_KEY --output json | jq -r ".[] | select(.name==\"$NEON_PROJECT_NAME\") | .id")
359
+ ```
360
+
361
+ 4. **`.env.preview` に自動設定** → dotenvx暗号化:
362
+ ```bash
363
+ dotenvx decrypt -f .env.preview --stdout > .env.preview.tmp
364
+ # 既存の同名変数を削除してから追加(重複防止)
365
+ grep -v "^NEON_PROJECT_ID=" .env.preview.tmp | grep -v "^NEON_API_KEY=" > .env.preview.clean
366
+ echo "NEON_PROJECT_ID=$NEON_PROJECT_ID" >> .env.preview.clean
367
+ echo "NEON_API_KEY=$NEON_API_KEY" >> .env.preview.clean
368
+ rm .env.preview && mv .env.preview.clean .env.preview
369
+ dotenvx encrypt -f .env.preview
370
+ ```
371
+
372
+ 5. ブランチ戦略初期設定:
373
+ - production(main)ブランチ確認
374
+ - developmentブランチ作成
375
+
376
+ #### ブランチ管理
377
+ ```bash
378
+ # 一覧
379
+ neonctl branches list --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY
380
+
381
+ # 作成
382
+ neonctl branches create --project-id $NEON_PROJECT_ID --name $NAME --api-key $NEON_API_KEY
383
+
384
+ # 削除
385
+ neonctl branches delete $BRANCH_ID --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY
386
+ ```
387
+
388
+ #### 接続文字列取得
389
+ ```bash
390
+ # CLI(単一ブランチ)
391
+ neonctl connection-string <branch-name> --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY
392
+
393
+ # API(複数ブランチ一括取得時)
394
+ curl -s "https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/connection_uri?branch_id=$BRANCH_ID&database_name=neondb&role_name=$ROLE_NAME" \
395
+ -H "Authorization: Bearer $NEON_API_KEY"
396
+ ```
397
+
398
+ > **pooled/unpooled接続の使い分け**:
399
+ > - **マイグレーション用(unpooled)**: `neonctl connection-string <branch> --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY`(デフォルトはpooled=false)
400
+ > - **アプリruntime用(pooled)**: `neonctl connection-string <branch> --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY --pooled`
401
+ > - CI/CDワークフローではマイグレーション時にunpooled、アプリビルド時にpooled接続を使い分けている
402
+
403
+ > **注意**: 孤立ブランチのクリーンアップは`cleanup-pr-preview-db.yml`ワークフローが自動実行するため、このSkillでは手動クリーンアップを提供しない。
404
+
405
+ ### 参照ドキュメント
406
+ - `docs/einja/instructions/neon-cli-reference.md`
407
+ - `docs/einja/instructions/deployment-setup.md`
408
+
409
+ ---
410
+
411
+ ## カテゴリ5: GitHub Secrets管理
412
+
413
+ ### サブメニュー
414
+ - **一覧表示**: 現在のSecrets一覧
415
+ - **個別設定**: 指定したSecretを設定
416
+ - **一括設定**: `.env.keys`からdotenvx秘密鍵を一括設定
417
+
418
+ ### 実行手順
419
+
420
+ #### 一覧表示
421
+ ```bash
422
+ gh secret list
423
+ ```
424
+
425
+ #### 個別設定
426
+ 1. AskUserQuestionでSecret名と値を入力
427
+ 2. `gh secret set $NAME --body "<value>"`
428
+ 3. 設定確認: `gh secret list`
429
+
430
+ #### 一括設定(全Secrets)
431
+ > **参照**: `docs/einja/instructions/deployment-setup.md`(セクション6)に全Secretsの取得手順あり
432
+
433
+ **Step 1: dotenvx秘密鍵を自動抽出**
434
+ ```bash
435
+ for key_name in PREVIEW PRODUCTION DEVELOP STAGING; do
436
+ value=$(grep "DOTENV_PRIVATE_KEY_${key_name}" .env.keys | cut -d'=' -f2 | tr -d "\"'")
437
+ if [ -n "$value" ]; then
438
+ gh secret set "DOTENV_PRIVATE_KEY_${key_name}" --body "$value"
439
+ echo "✅ DOTENV_PRIVATE_KEY_${key_name} を設定しました"
440
+ else
441
+ echo "⚠️ DOTENV_PRIVATE_KEY_${key_name} が .env.keys に見つかりません"
442
+ fi
443
+ done
444
+ ```
445
+
446
+ **Step 2: Vercel関連Secrets**
447
+
448
+ 2-a. `VERCEL_TOKEN`(人間入力が必須):
449
+ AskUserQuestionで値を入力してもらう。取得手順:
450
+ - Vercel Dashboard(https://vercel.com/account/tokens)> 「Create Token」
451
+ - Scope: Full Account を選択
452
+ - 入力後、`vercel whoami --token $TOKEN` で有効性を自動検証
453
+
454
+ 2-b. `VERCEL_ORG_ID`(自動取得):
455
+ ```bash
456
+ # apps/web/.vercel/project.json から取得(vercel link 実行済みの場合)
457
+ VERCEL_ORG_ID=$(cat apps/web/.vercel/project.json 2>/dev/null | jq -r '.orgId')
458
+ # 未取得の場合はAPI経由
459
+ if [ -z "$VERCEL_ORG_ID" ] || [ "$VERCEL_ORG_ID" = "null" ]; then
460
+ VERCEL_ORG_ID=$(curl -s "https://api.vercel.com/v2/teams" \
461
+ -H "Authorization: Bearer $VERCEL_TOKEN" | jq -r '.teams[0].id')
462
+ fi
463
+ gh secret set VERCEL_ORG_ID --body "$VERCEL_ORG_ID"
464
+ echo "✅ VERCEL_ORG_ID = $VERCEL_ORG_ID を設定しました"
465
+ ```
466
+
467
+ 2-c. `VERCEL_PROJECT_ID_WEB` / `VERCEL_PROJECT_ID_ADMIN`(自動取得):
468
+ ```bash
469
+ for APP_NAME in web admin; do
470
+ # apps/<app>/.vercel/project.json から取得(vercel link 実行済みの場合)
471
+ PROJECT_ID=$(cat "apps/$APP_NAME/.vercel/project.json" 2>/dev/null | jq -r '.projectId')
472
+ if [ -z "$PROJECT_ID" ] || [ "$PROJECT_ID" = "null" ]; then
473
+ # vercel link 未実行の場合: カテゴリ3(新規プロジェクト作成 or 初期設定)を先に実行するよう案内
474
+ echo "⚠️ apps/$APP_NAME/.vercel/project.json が見つかりません。先にカテゴリ3でVercelプロジェクトをリンクしてください"
475
+ continue
476
+ fi
477
+ SECRET_NAME="VERCEL_PROJECT_ID_$(echo $APP_NAME | tr '[:lower:]' '[:upper:]')"
478
+ gh secret set "$SECRET_NAME" --body "$PROJECT_ID"
479
+ echo "✅ $SECRET_NAME = $PROJECT_ID を設定しました"
480
+ done
481
+ ```
482
+
483
+ **Step 3: Turborepo Remote Cache**
484
+
485
+ 3-a. `TURBO_TOKEN`:
486
+ VERCEL_TOKEN(Step 2-a で取得済み)と同じ値を使用(別トークンを使う場合のみAskUserQuestionで入力):
487
+ ```bash
488
+ gh secret set TURBO_TOKEN --body "$VERCEL_TOKEN"
489
+ echo "✅ TURBO_TOKEN を設定しました(VERCEL_TOKENと同一値)"
490
+ ```
491
+
492
+ 3-b. `TURBO_TEAM`(自動取得):
493
+ ```bash
494
+ TURBO_TEAM=$(cat .turbo/config.json 2>/dev/null | jq -r '.teamId // empty')
495
+ if [ -z "$TURBO_TEAM" ]; then
496
+ echo "⚠️ .turbo/config.json 未生成。先に npx turbo login && npx turbo link を実行します"
497
+ npx turbo login && npx turbo link
498
+ TURBO_TEAM=$(cat .turbo/config.json | jq -r '.teamId')
499
+ fi
500
+ gh secret set TURBO_TEAM --body "$TURBO_TEAM"
501
+ echo "✅ TURBO_TEAM = $TURBO_TEAM を設定しました"
502
+ ```
503
+
504
+ ### 参照ドキュメント
505
+ - `docs/einja/instructions/deployment-setup.md`(セクション6: GitHub Secrets登録)
506
+
507
+ ---
508
+
509
+ ## カテゴリ6: 環境状態確認(ヘルスチェック)
510
+
511
+ ### チェック対象
512
+
513
+ #### ローカル環境
514
+ ```bash
515
+ # ランタイム
516
+ node --version
517
+ pnpm --version
518
+
519
+ # 環境変数ファイル
520
+ for f in .env .env.local .env.keys .env.personal; do
521
+ [ -f "$f" ] && echo "✅ $f" || echo "❌ $f"
522
+ done
523
+
524
+ # Docker/PostgreSQL
525
+ docker compose ps
526
+ docker compose exec postgres pg_isready -U postgres
527
+
528
+ # 開発サーバー
529
+ pnpm dev:status
530
+
531
+ # CLIツール
532
+ for cmd in gh vercel neonctl dotenvx; do
533
+ command -v "$cmd" >/dev/null 2>&1 && echo "✅ $cmd" || echo "❌ $cmd"
534
+ done
535
+
536
+ # === トークン有効性検証(.env.personal 存在時のみ) ===
537
+ if [ -f ".env.personal" ]; then
538
+ # 並行実行で高速化(各コマンドにタイムアウト設定)
539
+ timeout 5 gh auth status 2>/dev/null && echo "✅ GITHUB_TOKEN 有効" || echo "⚠️ GITHUB_TOKEN 無効/未設定" &
540
+ timeout 5 vercel whoami 2>/dev/null && echo "✅ VERCEL_TOKEN 有効" || echo "⚠️ VERCEL_TOKEN 無効/未設定" &
541
+ if [ -n "$NEON_API_KEY" ]; then
542
+ timeout 5 neonctl projects list --api-key "$NEON_API_KEY" >/dev/null 2>&1 && echo "✅ NEON_API_KEY 有効" || echo "⚠️ NEON_API_KEY 無効/期限切れ" &
543
+ else
544
+ echo "⚠️ NEON_API_KEY 未設定"
545
+ fi
546
+ wait
547
+ fi
548
+ ```
549
+
550
+ #### Vercel
551
+ ```bash
552
+ vercel ls
553
+ ```
554
+
555
+ #### Neon
556
+ ```bash
557
+ neonctl branches list --project-id $NEON_PROJECT_ID --api-key $NEON_API_KEY
558
+ ```
559
+
560
+ #### GitHub
561
+ ```bash
562
+ gh secret list
563
+ gh run list --limit 5
564
+ ```
565
+
566
+ ### 結果表示
567
+
568
+ チェック結果を以下の形式でサマリー表示する:
569
+
570
+ ```
571
+ === 環境ヘルスチェック結果 ===
572
+
573
+ 📦 ローカル環境
574
+ ✅ Node.js 22.16.0
575
+ ✅ pnpm 10.14.0
576
+ ✅ PostgreSQL 起動中
577
+ ✅ 開発サーバー 起動中 (port 3195)
578
+ ❌ .env.personal 不在
579
+
580
+ 🔧 CLI ツール
581
+ ✅ gh 2.x
582
+ ✅ vercel 37.x
583
+ ❌ neonctl 未インストール
584
+ ✅ dotenvx 1.x
585
+
586
+ 🔑 トークン有効性
587
+ ✅ GITHUB_TOKEN 有効
588
+ ✅ VERCEL_TOKEN 有効
589
+ ⚠️ NEON_API_KEY 未設定
590
+
591
+ ☁️ Vercel
592
+ ✅ 最新デプロイ: 2h ago (Ready)
593
+
594
+ 🗄️ Neon
595
+ ✅ ブランチ: 3個 (main, development, preview/feature-auth)
596
+
597
+ 🔐 GitHub Secrets
598
+ ✅ 10個のSecrets設定済み
599
+ ✅ 最新CI: 成功 (2h ago)
600
+ ```
601
+
602
+ ### 推奨アクション提案
603
+
604
+ ヘルスチェック結果に❌がある場合、以下のルールで推奨アクションを提示する:
605
+
606
+ | 検出結果 | 推奨アクション |
607
+ |---------|--------------|
608
+ | `.env.keys`不在 / CLI未インストール | → カテゴリ1(ローカル環境セットアップ) |
609
+ | `.env.personal`不在 / トークン未設定 | → カテゴリ2(環境変数管理 > 個人トークン設定) |
610
+ | トークン無効/期限切れ | → カテゴリ2(環境変数管理 > 個人トークン再設定) |
611
+ | Vercel未リンク / デプロイエラー | → カテゴリ3(Vercel管理) |
612
+ | Neonブランチ取得失敗 | → カテゴリ4(Neon管理) |
613
+ | GitHub Secrets不足 | → カテゴリ5(GitHub Secrets管理) |
614
+ | CI失敗 | → カテゴリ7(GitHub Actions CI/CD管理 > 失敗調査) |
615
+
616
+ ❌が3個以上の場合は「初期セットアップが必要です。カテゴリ1を実行してください」と表示。
617
+
618
+ ### 参照ドキュメント
619
+ - `docs/einja/instructions/local-server-environment-and-worktree.md`(包括的ヘルスチェック)
620
+
621
+ ---
622
+
623
+ ## カテゴリ7: GitHub Actions CI/CD管理
624
+
625
+ ### サブメニュー
626
+ - **ワークフロー状態確認**: 最新の実行結果一覧
627
+ - **失敗調査**: 失敗したワークフローのログ分析
628
+ - **手動トリガー**: ワークフローの手動実行
629
+ - **ワークフロー一覧**: 利用可能なワークフロー確認
630
+
631
+ ### プロジェクトのワークフロー
632
+
633
+ | ワークフロー | ファイル | トリガー | 用途 | 備考 |
634
+ |------------|---------|---------|------|------|
635
+ | デプロイ(安定ブランチ) | `deploy-stable-branches.yml` | push to main/develop/staging | 動的マトリクス → 変更アプリのみデプロイ | mainのみenv sync、他は`--env`実行時注入 |
636
+ | PRプレビューデプロイ | `deploy-pr-preview.yml` | PR open/sync | PR毎のプレビュー環境作成 | `--env`実行時注入(env sync廃止) |
637
+ | PRプレビューDB削除 | `cleanup-pr-preview-db.yml` | schedule/manual | 孤立Neonブランチのクリーンアップ | PR未存在のブランチを自動削除 |
638
+ | PRクローズ時クリーンアップ | `cleanup-pr-preview-on-close.yml` | PR close | PR関連リソース削除 | Neonブランチ + Vercel Preview削除 |
639
+ | CLIリリース | `release-cli.yml` | manual | @einja/cli NPM公開 | workflow_dispatch対応 |
640
+ | create-einja-appリリース | `release-create-einja-app.yml` | manual | create-einja-app NPM公開 | workflow_dispatch対応 |
641
+ | Claude Code | `claude.yml` | issue comment | Claude Codeによる自動対応 | `/claude`コメントでトリガー |
642
+
643
+ ### 実行手順
644
+
645
+ #### ワークフロー状態確認
646
+ ```bash
647
+ # 最新の実行結果一覧
648
+ gh run list --limit 10
649
+
650
+ # 特定ワークフローの実行一覧
651
+ gh run list --workflow=deploy-stable-branches.yml --limit 5
652
+
653
+ # 実行中のワークフロー
654
+ gh run list --status=in_progress
655
+ ```
656
+
657
+ #### 失敗調査
658
+ 1. 失敗したワークフローの一覧を取得:
659
+ ```bash
660
+ gh run list --status=failure --limit 5
661
+ ```
662
+ 2. AskUserQuestionで調査対象のrun-idを選択
663
+ 3. 失敗したジョブのログを表示:
664
+ ```bash
665
+ gh run view <run-id> --log-failed
666
+ ```
667
+ 4. **ログ分析→アクション提案**: エラーパターンに基づいてカテゴリ遷移を提案
668
+
669
+ | エラーパターン | 推奨アクション |
670
+ |---------------|---------------|
671
+ | `Secret not found: DOTENV_PRIVATE_KEY_*` | → カテゴリ5(GitHub Secrets管理)で一括設定 |
672
+ | `vercel deploy failed` | → カテゴリ3(Vercel管理)で状態確認 |
673
+ | `neonctl: authentication failed` | → カテゴリ5でNEON_API_KEY更新 |
674
+ | `Permission denied` | → `.github/workflows/`のpermissions設定確認を案内 |
675
+ | その他 | エラーログ全文を表示し、対処方法をAskUserQuestionで相談 |
676
+
677
+ #### 手動トリガー
678
+ ```bash
679
+ # workflow_dispatch対応ワークフローを手動実行
680
+ gh workflow run <workflow-file> --ref <branch>
681
+
682
+ # 入力パラメータ付き
683
+ gh workflow run <workflow-file> --ref <branch> -f param1=value1
684
+
685
+ # PRプレビューDBクリーンアップの手動実行
686
+ gh workflow run cleanup-pr-preview-db.yml --ref main
687
+ ```
688
+
689
+ #### ワークフロー一覧
690
+ ```bash
691
+ # 利用可能なワークフロー一覧
692
+ gh workflow list
693
+
694
+ # 特定ワークフローの詳細
695
+ gh workflow view <workflow-file>
696
+ ```
697
+
698
+ ### エラー時の対処
699
+
700
+ | エラー | 対処 |
701
+ |--------|------|
702
+ | デプロイ失敗 | `gh run view <id> --log-failed` でログ確認 → 原因特定 |
703
+ | Secrets不足 | カテゴリ5(GitHub Secrets管理)で設定 |
704
+ | 環境変数同期失敗 | dotenvx秘密鍵のSecret設定を確認 |
705
+ | Neonブランチ作成失敗 | NEON_API_KEY のSecret設定・有効期限を確認 |
706
+ | Permission denied | ワークフローのpermissions設定を確認 |
707
+
708
+ ### 参照ドキュメント
709
+ - `.github/workflows/` 内の各ワークフローファイル
710
+ - `docs/einja/instructions/deployment-setup.md`
711
+ - `docs/einja/steering/infrastructure/deployment.md`
712
+
713
+ ---
714
+
715
+ ## セキュリティ考慮事項
716
+
717
+ ### トークン・API Keyの管理
718
+
719
+ | トークン | 保存先 | セキュリティ |
720
+ |---------|--------|------------|
721
+ | VERCEL_TOKEN | `.env.personal` | gitignore対象、`chmod 600`設定 |
722
+ | NEON_API_KEY | `.env.personal` | gitignore対象、`chmod 600`設定 |
723
+ | GITHUB_TOKEN | `.env.personal` | gitignore対象、`chmod 600`設定 |
724
+ | DOTENV_PRIVATE_KEY_* | `.env.keys` | gitignore対象、1Password等で共有 |
725
+ | NEON_PROJECT_ID | `.env.preview`(暗号化) | dotenvx暗号化、Git管理 |
726
+
727
+ **必須**: トークン保存後は `chmod 600 .env.personal` を実行すること。
728
+
729
+ ### CLI vs REST API 使い分け
730
+
731
+ | 操作 | 方式 | 理由 |
732
+ |------|------|------|
733
+ | Vercel プロジェクト操作 | CLI (`vercel link --yes`) | 認証簡単、非対話モード対応 |
734
+ | Vercel Root Directory設定 | API (`PATCH /v9/projects/{id}`) | CLIでは不可 |
735
+ | Vercel 標準環境変数 | CLI (`vercel env add/rm`) | バッチ対応 |
736
+ | Neon ブランチ操作 | CLI (`neonctl --api-key`) | 環境変数認証で非対話実行可 |
737
+ | Neon 接続URL取得 | CLI + API | CLI: 単一ブランチ、API: 一括取得 |
738
+ | GitHub Secrets | CLI (`gh secret set`) | API暗号化が複雑 |
739
+ | GitHub Actions監視 | CLI (`gh run list/view`) | フォーマット良好 |
740
+
741
+ ---
742
+
743
+ ## エラーハンドリング
744
+
745
+ | エラー種別 | 対処 |
746
+ |-----------|------|
747
+ | CLI未インストール | 自動インストール実行: `brew install <cli>` または `npm i -g <cli>`。Docker のみ OrbStack インストール案内(GUI必須のため) |
748
+ | トークン未設定 | 取得URL案内 → AskUserQuestionで値入力 → `.env.personal`に保存 → API検証(`vercel whoami` / `gh auth status` / `neonctl projects list`)で有効性確認 |
749
+ | トークン無効/期限切れ | 再取得URL案内 → AskUserQuestionで新しい値入力 → `.env.personal`を更新 → API検証で有効性確認 |
750
+ | API呼び出し失敗 | エラー内容表示 → リトライ or 代替手段提示 |
751
+ | dotenvx復号失敗 | `.env.keys`確認 → 秘密鍵再設定ガイド |
752
+ | ネットワークエラー | 3回リトライ → 失敗時は手動手順提示 |
753
+
754
+ ---
755
+
756
+ ## 既存ワークフローとの整合性
757
+
758
+ ### 競合回避ルール
759
+
760
+ - **環境変数同期**: `vercel env add`によるVercel環境変数ストアへの書き込みはmainブランチのみ。develop/staging/PRは`vercel deploy --env`で実行時注入(並行デプロイ間の競合防止)
761
+ - **初回セットアップ**: Skillでは初回セットアップ時のみ手動同期。以降はGitHub Actionsが自動管理
762
+ - **Neonブランチクリーンアップ**: `cleanup-pr-preview-db.yml`が定期実行。Skillでは手動クリーンアップは提供しない
763
+ - **GitHub Secrets更新**: Skillで設定した値はワークフローでそのまま使用される(同じdotenvxコマンド体系)
764
+
765
+ ---
766
+
767
+ ## 初版で除外する機能
768
+
769
+ 以下の機能は将来版で対応予定:
770
+
771
+ | 機能 | 除外理由 | 対応方針 |
772
+ |------|---------|---------|
773
+ | トークンローテーション | 手順書にドキュメント化のみで十分 | `environment-setup.md`を参照 |
774
+ | Vercelカスタム環境操作 | API仕様の安定性要調査 | 安定確認後に追加 |
775
+ | Neon孤立ブランチ手動クリーンアップ | 既存ワークフローに任せる | `cleanup-pr-preview-db.yml`が担当 |
776
+
777
+ <!-- @einja:project-private:start id="einja-infra-maintenance-project" -->
778
+ <!-- プロジェクト固有の情報を記入 -->
779
+ <!-- @einja:project-private:end -->