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