@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.
- package/README.md +0 -1
- package/dist/cli.js +0 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +1 -20
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/task-loop/lib/github-client.test.js.map +1 -1
- package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js +2 -2
- package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js.map +1 -1
- package/dist/lib/preset-update/file-copier.js +3 -3
- package/dist/lib/preset-update/file-copier.js.map +1 -1
- package/dist/lib/sync/file-filter.js +2 -2
- package/dist/lib/sync/file-filter.js.map +1 -1
- package/dist/lib/sync/file-filter.test.js +20 -0
- package/dist/lib/sync/file-filter.test.js.map +1 -1
- package/dist/lib/sync/marker-processor.js.map +1 -1
- package/dist/lib/sync/metadata-manager.js +1 -1
- package/dist/lib/sync/metadata-manager.js.map +1 -1
- package/dist/lib/sync/metadata-manager.test.js +3 -2
- package/dist/lib/sync/metadata-manager.test.js.map +1 -1
- package/dist/lib/sync/project-private-synchronizer.d.ts.map +1 -1
- package/dist/lib/sync/project-private-synchronizer.js +5 -1
- package/dist/lib/sync/project-private-synchronizer.js.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/presets/default/.claude/agents/einja/backend-architect.md +17 -1
- package/presets/default/.claude/agents/einja/codex-agent.md +1 -1
- package/presets/default/.claude/agents/einja/design-engineer.md +1 -1
- package/presets/default/.claude/agents/einja/docs/docs-updater.md +3 -93
- package/presets/default/.claude/agents/einja/frontend-architect.md +17 -1
- package/presets/default/.claude/agents/einja/frontend-coder.md +1 -1
- package/presets/default/.claude/agents/einja/{specs/spec-design-generator.md → issue-specs/design-generator.md} +12 -7
- package/presets/default/.claude/agents/einja/{specs/spec-qa-generator.md → issue-specs/qa-generator.md} +6 -4
- package/presets/default/.claude/agents/einja/{specs/spec-requirements-generator.md → issue-specs/requirements-generator.md} +5 -5
- package/presets/default/.claude/agents/einja/{specs/spec-tasks-generator.md → issue-specs/tasks-generator.md} +13 -14
- package/presets/default/.claude/agents/einja/{specs/spec-tasks-validator.md → issue-specs/tasks-validator.md} +9 -9
- package/presets/default/.claude/agents/einja/issue-specs/ui-design-generator.md +114 -0
- package/presets/default/.claude/agents/einja/task/task-executer.md +9 -3
- package/presets/default/.claude/agents/einja/task/task-modification-analyzer.md +2 -2
- package/presets/default/.claude/agents/einja/task/task-qa.md +3 -3
- package/presets/default/.claude/agents/einja/task/task-reviewer.md +13 -1
- package/presets/default/.claude/commands/einja/einja-sync.md +119 -44
- package/presets/default/.claude/commands/einja/issue-exec.md +29 -19
- package/presets/default/.claude/commands/einja/sync-cursor-commands.md +6 -6
- package/presets/default/.claude/commands/einja/{update-docs-by-task-specs.md → update-docs-by-issue-specs.md} +58 -58
- package/presets/default/.claude/hooks/einja/plan-mode-skill-loader.sh +5 -1
- package/presets/default/.claude/settings.json +14 -4
- package/presets/default/.claude/skills/{einja-general-context-loader → _einja-general-context-loader}/SKILL.md +2 -2
- package/presets/default/.claude/skills/{einja-output-format → _einja-output-format}/SKILL.md +1 -1
- package/presets/default/.claude/skills/_einja-project-overview/SKILL.md +29 -0
- package/presets/default/.claude/skills/{einja-spec-context-loader → _einja-spec-context-loader}/SKILL.md +5 -5
- package/presets/default/.claude/skills/einja-coding-standards/references/testing-strategy.md +899 -0
- package/presets/default/.claude/skills/einja-conflict-resolver/SKILL.md +1 -1
- package/presets/default/.claude/skills/einja-create-pr/SKILL.md +138 -0
- package/presets/default/.claude/skills/einja-infra-maintenance/SKILL.md +779 -0
- package/presets/default/.claude/{commands/einja/spec-create.md → skills/einja-issue-spec-create/SKILL.md} +47 -24
- package/presets/default/.claude/skills/einja-issue-spec-generator/SKILL.md +105 -0
- package/presets/default/.claude/skills/einja-issue-spec-generator/references/format-rules.md +35 -0
- package/presets/default/.claude/skills/einja-issue-spec-validator/SKILL.md +130 -0
- package/presets/default/.claude/skills/einja-issue-spec-validator/references/validation-rules.md +52 -0
- package/presets/default/.claude/skills/einja-npm-release/SKILL.md +242 -0
- package/presets/default/.claude/skills/einja-skill-creator/SKILL.md +68 -12
- package/presets/default/.claude/skills/einja-skill-creator/scripts/aggregate_benchmark.py +368 -121
- package/presets/default/.claude/skills/einja-skill-creator/scripts/compare_runs.py +154 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/generate_report.py +14 -7
- package/presets/default/.claude/skills/einja-skill-creator/scripts/improve_description.py +2 -7
- package/presets/default/.claude/skills/einja-skill-creator/scripts/run_loop.py +263 -183
- package/presets/default/.claude/skills/einja-skill-first/SKILL.md +265 -0
- package/presets/default/.claude/skills/einja-subagent-question-protocol/SKILL.md +98 -0
- package/presets/default/.claude/skills/einja-task-commit/SKILL.md +7 -7
- package/presets/default/.claude/{commands/einja/task-exec.md → skills/einja-task-exec/SKILL.md} +3 -78
- package/presets/default/.claude/skills/einja-task-qa/SKILL.md +4 -4
- package/presets/default/.claude/skills/einja-task-qa/references/troubleshooting.md +1 -1
- package/presets/default/.claude/skills/einja-task-qa/references/usage-patterns.md +2 -2
- package/presets/default/.claude/skills/einja-team-exec/SKILL.md +165 -0
- package/presets/default/CLAUDE.md.template +21 -6
- package/presets/default/docs/einja/instructions/deployment-setup.md +1 -1
- package/presets/default/docs/einja/instructions/issue-exec-workflow.md +11 -11
- package/presets/default/docs/einja/instructions/local-server-environment-and-worktree.md +1 -1
- package/presets/default/docs/einja/instructions/setup-flow.md +279 -0
- package/presets/default/docs/einja/instructions/task-execute.md +42 -42
- package/presets/default/docs/einja/steering/acceptance-criteria-and-qa-guide.md +1 -1
- package/presets/default/docs/einja/steering/branch-strategy.md +1 -1
- package/presets/default/docs/einja/steering/development-workflow.md +93 -25
- package/presets/default/docs/einja/steering/infrastructure/deployment.md +107 -0
- package/presets/default/docs/einja/steering/task-management.md +9 -13
- package/presets/default/scripts/ensure-serena.sh +2 -2
- package/presets/default/scripts/env-rotate-secrets.ts +66 -6
- package/presets/default/scripts/init-github.ts +363 -0
- package/presets/default/scripts/init.sh +11 -5
- package/presets/default/scripts/setup-dev.ts +16 -1
- package/dist/lib/sync/backup-manager.d.ts +0 -50
- package/dist/lib/sync/backup-manager.d.ts.map +0 -1
- package/dist/lib/sync/backup-manager.js +0 -117
- package/dist/lib/sync/backup-manager.js.map +0 -1
- package/dist/lib/sync/backup-manager.test.d.ts +0 -2
- package/dist/lib/sync/backup-manager.test.d.ts.map +0 -1
- package/dist/lib/sync/backup-manager.test.js +0 -155
- package/dist/lib/sync/backup-manager.test.js.map +0 -1
- package/presets/default/.claude/agents/einja/git/conflict-resolver.md +0 -152
- package/presets/default/.claude/hooks/einja/validate-git-commit.sh +0 -239
- 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 -->
|