create-einja-app 0.3.1 → 0.3.3

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 (120) hide show
  1. package/README.md +34 -1
  2. package/dist/cli.js +92 -80
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +1 -1
  5. package/templates/default/.changeset/config.json +11 -0
  6. package/templates/default/.claude/hooks/einja/plan-mode-skill-loader.sh +27 -0
  7. package/templates/default/.claude/settings.json +29 -1
  8. package/templates/default/.claude/skills/cli-package-specs/SKILL.md +247 -0
  9. package/templates/default/.einja-sync.json +1 -1
  10. package/templates/default/.env.personal.example +6 -2
  11. package/templates/default/.envrc +5 -0
  12. package/templates/default/.github/release.yml +10 -0
  13. package/templates/default/.github/workflows/changeset-status.yml +60 -0
  14. package/templates/default/.github/workflows/deploy-pr-preview.yml +23 -24
  15. package/templates/default/.github/workflows/deploy-stable-branches.yml +336 -100
  16. package/templates/default/.mcp.json +2 -12
  17. package/templates/default/.serena/project.yml +7 -0
  18. package/templates/default/CLAUDE.md +61 -10
  19. package/templates/default/README.md +22 -10
  20. package/templates/default/apps/admin/package.json +1 -1
  21. package/templates/default/apps/admin/tsconfig.json +2 -1
  22. package/templates/default/apps/web/package.json +1 -1
  23. package/templates/default/apps/web/tsconfig.json +2 -1
  24. package/templates/default/docs/plans/.gitkeep +0 -0
  25. package/templates/default/docs/plans/agile-munching-knuth.md +161 -0
  26. package/templates/default/docs/plans/agile-riding-nova.md +158 -0
  27. package/templates/default/docs/plans/agile-wibbling-dusk.md +91 -0
  28. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-a87e67c.md +221 -0
  29. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-ab73a1c.md +107 -0
  30. package/templates/default/docs/plans/ancient-greeting-flamingo.md +120 -0
  31. package/templates/default/docs/plans/ancient-watching-otter.md +152 -0
  32. package/templates/default/docs/plans/bright-sauteeing-bumblebee.md +30 -0
  33. package/templates/default/docs/plans/bright-stargazing-dawn.md +87 -0
  34. package/templates/default/docs/plans/calm-stirring-bonbon.md +196 -0
  35. package/templates/default/docs/plans/calm-watching-widget.md +111 -0
  36. package/templates/default/docs/plans/cheerful-wiggling-ullman.md +164 -0
  37. package/templates/default/docs/plans/compiled-humming-cherny.md +94 -0
  38. package/templates/default/docs/plans/composed-doodling-mountain.md +362 -0
  39. package/templates/default/docs/plans/dapper-launching-lynx.md +81 -0
  40. package/templates/default/docs/plans/dazzling-foraging-cascade.md +32 -0
  41. package/templates/default/docs/plans/effervescent-munching-kite-agent-ac08baf.md +672 -0
  42. package/templates/default/docs/plans/effervescent-munching-kite-agent-aecc373.md +442 -0
  43. package/templates/default/docs/plans/effervescent-munching-kite.md +263 -0
  44. package/templates/default/docs/plans/enchanted-wiggling-ember-agent-a5befd57d0ca4c7c7.md +177 -0
  45. package/templates/default/docs/plans/enchanted-wiggling-ember.md +170 -0
  46. package/templates/default/docs/plans/federated-questing-kahan.md +47 -0
  47. package/templates/default/docs/plans/fix-orphan-cleaner-review.md +25 -0
  48. package/templates/default/docs/plans/fix-sync-template-variables.md +162 -0
  49. package/templates/default/docs/plans/flickering-pondering-hearth.md +26 -0
  50. package/templates/default/docs/plans/fluttering-snuggling-sprout.md +172 -0
  51. package/templates/default/docs/plans/generic-sleeping-snowglobe-agent-a41d8da.md +179 -0
  52. package/templates/default/docs/plans/generic-sleeping-snowglobe.md +108 -0
  53. package/templates/default/docs/plans/generic-snuggling-pudding.md +57 -0
  54. package/templates/default/docs/plans/glimmering-giggling-sedgewick.md +126 -0
  55. package/templates/default/docs/plans/glittery-swimming-bachman.md +78 -0
  56. package/templates/default/docs/plans/happy-watching-toast.md +56 -0
  57. package/templates/default/docs/plans/harmonic-strolling-nebula.md +210 -0
  58. package/templates/default/docs/plans/idempotent-wiggling-cherny.md +122 -0
  59. package/templates/default/docs/plans/import-alias-refactor.md +75 -0
  60. package/templates/default/docs/plans/lazy-percolating-sloth-agent-abda679.md +346 -0
  61. package/templates/default/docs/plans/lazy-percolating-sloth.md +151 -0
  62. package/templates/default/docs/plans/linked-greeting-llama-agent-a7a6e5b.md +345 -0
  63. package/templates/default/docs/plans/linked-greeting-llama.md +467 -0
  64. package/templates/default/docs/plans/lovely-bubbling-rose.md +80 -0
  65. package/templates/default/docs/plans/optimized-watching-sprout.md +149 -0
  66. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a292da6.md +288 -0
  67. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a819699.md +366 -0
  68. package/templates/default/docs/plans/peaceful-beaming-toast-agent-ac11de2.md +474 -0
  69. package/templates/default/docs/plans/peaceful-beaming-toast.md +345 -0
  70. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6194c.md +300 -0
  71. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6900e.md +444 -0
  72. package/templates/default/docs/plans/purrfect-spinning-hickey.md +361 -0
  73. package/templates/default/docs/plans/recursive-fluttering-mitten.md +176 -0
  74. package/templates/default/docs/plans/recursive-kindling-lemon-agent-a42199e.md +186 -0
  75. package/templates/default/docs/plans/recursive-kindling-lemon.md +36 -0
  76. package/templates/default/docs/plans/seed-migration-tests.md +47 -0
  77. package/templates/default/docs/plans/sprightly-leaping-manatee.md +224 -0
  78. package/templates/default/docs/plans/stateful-wishing-lerdorf.md +161 -0
  79. package/templates/default/docs/plans/streamed-purring-wreath.md +40 -0
  80. package/templates/default/docs/plans/synthetic-percolating-pearl.md +101 -0
  81. package/templates/default/docs/plans/todo-create-einja-app-ux-fix.md +16 -0
  82. package/templates/default/docs/plans/todo-direnv-hang-fix.md +12 -0
  83. package/templates/default/docs/plans/todo-fix-sync-template-variables.md +21 -0
  84. package/templates/default/docs/plans/todo-github-actions-release-workflow.md +34 -0
  85. package/templates/default/docs/plans/todo-issue-spec-rename.md +24 -0
  86. package/templates/default/docs/plans/todo-phase4-marker-update.md +39 -0
  87. package/templates/default/docs/plans/todo-skill-creator-sync.md +23 -0
  88. package/templates/default/docs/plans/todo-skill-creator-upgrade.md +18 -0
  89. package/templates/default/docs/plans/typed-snuggling-parnas-agent-a6f6391.md +476 -0
  90. package/templates/default/docs/plans/typed-snuggling-parnas-agent-adb678b.md +144 -0
  91. package/templates/default/docs/plans/typed-snuggling-parnas.md +84 -0
  92. package/templates/default/docs/plans/velvety-chasing-spark.md +28 -0
  93. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a30aa4f.md +534 -0
  94. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a57a278.md +508 -0
  95. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a90b809.md +421 -0
  96. package/templates/default/docs/plans/warm-hopping-lighthouse.md +199 -0
  97. package/templates/default/docs/plans/wondrous-strolling-crystal-agent-a0615fc.md +215 -0
  98. package/templates/default/docs/plans/wondrous-strolling-crystal.md +182 -0
  99. package/templates/default/docs/plans/zesty-roaming-steele.md +74 -0
  100. package/templates/default/docs/verification-test.md +2 -0
  101. package/templates/default/gitignore +9 -1
  102. package/templates/default/package.json +6 -2
  103. package/templates/default/packages/admin-ui/package.json +1 -1
  104. package/templates/default/packages/server-core/tsconfig.json +6 -1
  105. package/templates/default/pnpm-lock.yaml +823 -57
  106. package/templates/default/scripts/ensure-serena.sh +75 -0
  107. package/templates/default/scripts/env-rotate-secrets.ts +66 -6
  108. package/templates/default/scripts/init-github.ts +363 -0
  109. package/templates/default/scripts/init.sh +11 -5
  110. package/templates/default/scripts/lib/worktree-config.ts +64 -0
  111. package/templates/default/scripts/setup-dev.ts +16 -1
  112. package/templates/default/scripts/stop-serena.sh +25 -0
  113. package/templates/default/scripts/worktree/dev.ts +2 -2
  114. package/templates/default/.claude/skills/create-einja-app-release/SKILL.md +0 -186
  115. package/templates/default/.claude/skills/dev-cli-release/SKILL.md +0 -173
  116. package/templates/default/.cursor/commands/spec-create.md +0 -227
  117. package/templates/default/.cursor/commands/task-exec.md +0 -287
  118. package/templates/default/.cursor/commands/update-docs-by-task-specs.md +0 -448
  119. /package/templates/default/scripts/{cli-template-update.ts → _cli-template-update.ts} +0 -0
  120. /package/templates/default/scripts/{template-update.ts → _template-update.ts} +0 -0
@@ -0,0 +1,361 @@
1
+ # Plan: infra-maintenance SKILL.md 自動化レベル強化
2
+
3
+ ## Context
4
+
5
+ 前回の修正(カテゴリ5全Secrets対応、ゼロ状態判定、Vercel新規プロジェクト作成)が適用済み。
6
+ Explore + Codex の並行調査+レビューで、以下の問題が発見された:
7
+
8
+ 1. **CLI/APIで自動取得可能な値を人間に手動操作させている箇所が5件**
9
+ 2. **Vercelプロジェクト作成がDashboard GUI操作のまま**(CLI自動化可能)
10
+ 3. **Neonプロジェクト名がハードコード**(`einja-management` 固定)
11
+ 4. **トークン有効性の検証なし**(存在確認のみ)
12
+
13
+ **設計原則**:
14
+ 1. API/CLIで取得・生成可能な値は絶対に人間に操作させない
15
+ 2. プロジェクト名は推定+確認のハイブリッド方式
16
+ 3. 人間に聞く場合は必ず取得手順を提示
17
+
18
+ ---
19
+
20
+ ## 共通: プロジェクト名推定ロジック
21
+
22
+ Vercel/Neon のプロジェクト作成時に使用:
23
+
24
+ ```bash
25
+ # 1. package.json name から推定(優先)
26
+ BASE_NAME=$(cat package.json | jq -r '.name // empty' | sed 's/@[^/]*\///' | sed 's/-monorepo$//' | sed 's/-template$//')
27
+
28
+ # 2. フォールバック: Git リポジトリ名
29
+ if [ -z "$BASE_NAME" ]; then
30
+ BASE_NAME=$(basename "$(git remote get-url origin 2>/dev/null)" .git | sed 's/-template$//')
31
+ fi
32
+
33
+ # 3. jq未インストール時のフォールバック
34
+ if [ -z "$BASE_NAME" ]; then
35
+ BASE_NAME=$(grep '"name"' package.json | head -1 | sed 's/.*"name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/' | sed 's/@[^/]*\///' | sed 's/-monorepo$//' | sed 's/-template$//')
36
+ fi
37
+ ```
38
+
39
+ 推定した `$BASE_NAME` を元に:
40
+ - **Vercel**: `${BASE_NAME}-web`, `${BASE_NAME}-admin`
41
+ - **Neon**: `${BASE_NAME}`
42
+
43
+ AskUserQuestionで推定名をデフォルト値として提示し、ユーザーに承認/変更してもらう。
44
+
45
+ ---
46
+
47
+ ## 修正計画
48
+
49
+ **対象ファイル**: `.claude/skills/einja-infra-maintenance/SKILL.md` のみ
50
+
51
+ ### 修正1: Phase 1にトークン有効性検証を追加
52
+
53
+ **修正箇所**: L52-68(Phase 1: 環境状態の自動検出)
54
+
55
+ CLI存在確認の後に追加:
56
+ ```bash
57
+ # === トークン有効性検証(.env.personal 存在時のみ) ===
58
+ if [ -f ".env.personal" ]; then
59
+ # 並行実行で高速化(各コマンドにタイムアウト設定)
60
+ timeout 5 gh auth status 2>/dev/null && echo "✅ GITHUB_TOKEN 有効" || echo "⚠️ GITHUB_TOKEN 無効/未設定" &
61
+ timeout 5 vercel whoami 2>/dev/null && echo "✅ VERCEL_TOKEN 有効" || echo "⚠️ VERCEL_TOKEN 無効/未設定" &
62
+ if [ -n "$NEON_API_KEY" ]; then
63
+ timeout 5 neonctl projects list --api-key "$NEON_API_KEY" >/dev/null 2>&1 && echo "✅ NEON_API_KEY 有効" || echo "⚠️ NEON_API_KEY 無効/期限切れ" &
64
+ else
65
+ echo "⚠️ NEON_API_KEY 未設定"
66
+ fi
67
+ wait
68
+ fi
69
+ ```
70
+
71
+ ### 修正2: Phase 2推奨ロジックにトークン無効を追加
72
+
73
+ **修正箇所**: L94-104(推奨ロジック テーブル)
74
+
75
+ テーブルに追加:
76
+ ```
77
+ | トークン無効/期限切れ | 環境変数管理(個人トークン再設定) |
78
+ ```
79
+
80
+ ### 修正3: カテゴリ1 `.env.keys` 自動コピー化
81
+
82
+ **修正箇所**: L143(エラー対処テーブル `.env.keys`不在 行)
83
+
84
+ 現状: `AskUserQuestion: 「メインworktreeからコピー or 手動配置」`
85
+
86
+ 修正後:
87
+ ```
88
+ | `.env.keys`不在 | `git worktree list` でメインworktreeを検出し、`.env.keys` が存在すれば自動コピー。不在の場合は「チームメンバーから `.env.keys` ファイルを受け取り、プロジェクトルートに配置してください」と案内 |
89
+ ```
90
+
91
+ ### 修正4: カテゴリ3 Vercelプロジェクト作成をCLI自動化
92
+
93
+ **修正箇所**: L214-223(新規プロジェクト作成セクション)
94
+
95
+ 現状: Dashboard GUIでの手動作成を案内
96
+
97
+ 修正後: CLI(`vercel link` + `vercel git connect`)+ API(Root Directory)で自動化
98
+ > **根拠**: `vercel-cli-reference.md` L280-302 の「新規アプリのセットアップ手順」に準拠
99
+
100
+ ```
101
+ #### 新規プロジェクト作成(初回のみ)
102
+ > Vercelにプロジェクトが存在しない場合(ゼロ状態)のみ実行。VERCEL_TOKEN 取得済みが前提。
103
+
104
+ 1. **プロジェクト名の推定・確認**:
105
+ 共通推定ロジックで `$BASE_NAME` を取得し、`${BASE_NAME}-web`, `${BASE_NAME}-admin` を候補として生成。
106
+ AskUserQuestionでプロジェクト名と作成対象アプリ(web / admin / 両方)を確認。
107
+
108
+ 2. **既存プロジェクトの確認**:
109
+ ```bash
110
+ vercel project ls
111
+ ```
112
+ 既にプロジェクトが存在する場合は「既にVercelに存在します。スキップしますか?」と確認。
113
+
114
+ 3. **CLIでプロジェクト作成・Git接続**:
115
+ ```bash
116
+ # チーム切り替え(必要な場合)
117
+ vercel switch <team-slug>
118
+
119
+ # アプリごとにプロジェクト作成
120
+ for APP_NAME in web admin; do
121
+ cd "apps/$APP_NAME"
122
+ vercel link --project="${BASE_NAME}-${APP_NAME}" --yes
123
+ vercel git connect "https://github.com/${GH_ORG}/${GH_REPO}" --yes
124
+ cd ../..
125
+ done
126
+ ```
127
+ > `vercel link` はプロジェクトが存在しない場合に自動作成する(`vercel-cli-reference.md` L287)
128
+
129
+ 4. **APIでRoot Directory設定**(CLIでは不可: `vercel-cli-reference.md` L112):
130
+ ```bash
131
+ for APP_NAME in web admin; do
132
+ PROJECT_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.projectId')
133
+ VERCEL_ORG_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.orgId')
134
+ curl -X PATCH "https://api.vercel.com/v9/projects/$PROJECT_ID?teamId=$VERCEL_ORG_ID" \
135
+ -H "Authorization: Bearer $VERCEL_TOKEN" \
136
+ -H "Content-Type: application/json" \
137
+ -d "{\"rootDirectory\": \"apps/$APP_NAME\"}"
138
+ done
139
+ ```
140
+
141
+ 5. **プロジェクトID/ORG IDを自動取得・表示**:
142
+ ```bash
143
+ for APP_NAME in web admin; do
144
+ echo "$(echo $APP_NAME | tr '[:lower:]' '[:upper:]'):"
145
+ echo " PROJECT_ID: $(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.projectId')"
146
+ echo " ORG_ID: $(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.orgId')"
147
+ done
148
+ ```
149
+ GitHub Secretsへの登録を提案(→ カテゴリ5: 一括設定 Step 2)
150
+ ```
151
+
152
+ ### 修正5: カテゴリ3 初期設定の PROJECT_ID 自動取得
153
+
154
+ **修正箇所**: L225-237(初期設定セクション)
155
+
156
+ 現状 L237: `プロジェクトID取得・表示`(手動)
157
+
158
+ 修正後:
159
+ ```
160
+ 5. `.vercel/project.json` からプロジェクトIDとORG IDを自動取得:
161
+ ```bash
162
+ VERCEL_PROJECT_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.projectId')
163
+ VERCEL_ORG_ID=$(cat "apps/$APP_NAME/.vercel/project.json" | jq -r '.orgId')
164
+ ```
165
+ 6. 取得結果を表示し、GitHub Secretsへの登録を提案(→ カテゴリ5)
166
+ ```
167
+
168
+ ### 修正6: カテゴリ4 Neonプロジェクト作成の自動化
169
+
170
+ **修正箇所**: L269-280(Neon初期設定セクション全体)
171
+
172
+ 現状の問題:
173
+ - プロジェクト名 `einja-management` がハードコード
174
+ - 既存プロジェクトの存在チェックなし
175
+ - NEON_PROJECT_ID の `.env.preview` への設定が手動
176
+
177
+ 修正後:
178
+ ```
179
+ #### 初期設定
180
+ 1. NEON_API_KEY確認 → 未設定時はURL案内 + `.env.personal`保存
181
+ - 取得URL: https://console.neon.tech/app/settings/api-keys
182
+ - **`neonctl auth`は使用しない**(理由: `neon-cli-reference.md`「認証方式」参照)
183
+
184
+ 2. **既存プロジェクトの確認**:
185
+ ```bash
186
+ neonctl projects list --api-key $NEON_API_KEY
187
+ ```
188
+ 既存プロジェクトがあれば一覧表示し、使用するプロジェクトをAskUserQuestionで確認。
189
+ 既存プロジェクトを使用する場合 → `neonctl projects get $PROJECT_ID` でIDを取得してステップ4へ。
190
+
191
+ 3. **プロジェクト名の推定・確認・作成**:
192
+ 共通推定ロジックで `$BASE_NAME` を取得。AskUserQuestionで確認(デフォルト値として提示)。
193
+ ```bash
194
+ neonctl projects create --name "$NEON_PROJECT_NAME" --region-id aws-ap-northeast-1 --api-key $NEON_API_KEY
195
+ ```
196
+ 作成後、`neonctl projects list` でプロジェクトIDを取得:
197
+ ```bash
198
+ NEON_PROJECT_ID=$(neonctl projects list --api-key $NEON_API_KEY | jq -r ".projects[] | select(.name==\"$NEON_PROJECT_NAME\") | .id")
199
+ ```
200
+
201
+ 4. **`.env.preview` に自動設定** → dotenvx暗号化:
202
+ ```bash
203
+ dotenvx decrypt -f .env.preview --stdout > .env.preview.tmp
204
+ # 既存の同名変数を削除してから追加(重複防止)
205
+ grep -v "^NEON_PROJECT_ID=" .env.preview.tmp | grep -v "^NEON_API_KEY=" > .env.preview.clean
206
+ echo "NEON_PROJECT_ID=$NEON_PROJECT_ID" >> .env.preview.clean
207
+ echo "NEON_API_KEY=$NEON_API_KEY" >> .env.preview.clean
208
+ rm .env.preview && mv .env.preview.clean .env.preview
209
+ dotenvx encrypt -f .env.preview
210
+ ```
211
+
212
+ 5. ブランチ戦略初期設定:
213
+ - production(main)ブランチ確認
214
+ - developmentブランチ作成
215
+ ```
216
+
217
+ カテゴリ4サブメニューに追加:
218
+ ```
219
+ - **プロジェクトID取得**: 既存プロジェクトのIDを `neonctl projects list` で自動取得
220
+ ```
221
+
222
+ ### 修正7: カテゴリ5 一括設定 Step 2 を自動取得に変更
223
+
224
+ **修正箇所**: L352-365(Step 2: Vercel関連Secrets)
225
+
226
+ 現状: AskUserQuestionで4つの値を手動入力
227
+
228
+ 修正後: VERCEL_TOKEN のみ人間入力、残り3つは自動取得
229
+ ```
230
+ **Step 2: Vercel関連Secrets**
231
+
232
+ 2-a. `VERCEL_TOKEN`(人間入力が必須):
233
+ AskUserQuestionで値を入力してもらう。取得手順:
234
+ - Vercel Dashboard(https://vercel.com/account/tokens)> 「Create Token」
235
+ - Scope: Full Account を選択
236
+ - 入力後、`vercel whoami --token $TOKEN` で有効性を自動検証
237
+
238
+ 2-b. `VERCEL_ORG_ID`(自動取得):
239
+ ```bash
240
+ # apps/web/.vercel/project.json から取得(vercel link 実行済みの場合)
241
+ VERCEL_ORG_ID=$(cat apps/web/.vercel/project.json 2>/dev/null | jq -r '.orgId')
242
+ # 未取得の場合はAPI経由
243
+ if [ -z "$VERCEL_ORG_ID" ] || [ "$VERCEL_ORG_ID" = "null" ]; then
244
+ VERCEL_ORG_ID=$(curl -s "https://api.vercel.com/v2/teams" \
245
+ -H "Authorization: Bearer $VERCEL_TOKEN" | jq -r '.teams[0].id')
246
+ fi
247
+ gh secret set VERCEL_ORG_ID --body "$VERCEL_ORG_ID"
248
+ echo "✅ VERCEL_ORG_ID = $VERCEL_ORG_ID を設定しました"
249
+ ```
250
+
251
+ 2-c. `VERCEL_PROJECT_ID_WEB` / `VERCEL_PROJECT_ID_ADMIN`(自動取得):
252
+ ```bash
253
+ for APP_NAME in web admin; do
254
+ # apps/<app>/.vercel/project.json から取得(vercel link 実行済みの場合)
255
+ PROJECT_ID=$(cat "apps/$APP_NAME/.vercel/project.json" 2>/dev/null | jq -r '.projectId')
256
+ if [ -z "$PROJECT_ID" ] || [ "$PROJECT_ID" = "null" ]; then
257
+ # vercel link 未実行の場合: カテゴリ3(新規プロジェクト作成 or 初期設定)を先に実行するよう案内
258
+ echo "⚠️ apps/$APP_NAME/.vercel/project.json が見つかりません。先にカテゴリ3でVercelプロジェクトをリンクしてください"
259
+ continue
260
+ fi
261
+ SECRET_NAME="VERCEL_PROJECT_ID_$(echo $APP_NAME | tr '[:lower:]' '[:upper:]')"
262
+ gh secret set "$SECRET_NAME" --body "$PROJECT_ID"
263
+ echo "✅ $SECRET_NAME = $PROJECT_ID を設定しました"
264
+ done
265
+ ```
266
+ ```
267
+
268
+ ### 修正8: カテゴリ5 一括設定 Step 3 の TURBO_TOKEN 自動化
269
+
270
+ **修正箇所**: L367-383(Step 3: Turborepo Remote Cache)
271
+
272
+ ```
273
+ **Step 3: Turborepo Remote Cache**
274
+
275
+ 3-a. `TURBO_TOKEN`:
276
+ VERCEL_TOKEN(Step 2-a で取得済み)と同じ値を使用(別トークンを使う場合のみAskUserQuestionで入力):
277
+ ```bash
278
+ gh secret set TURBO_TOKEN --body "$VERCEL_TOKEN"
279
+ echo "✅ TURBO_TOKEN を設定しました(VERCEL_TOKENと同一値)"
280
+ ```
281
+
282
+ 3-b. `TURBO_TEAM`(自動取得):
283
+ ```bash
284
+ TURBO_TEAM=$(cat .turbo/config.json 2>/dev/null | jq -r '.teamId // empty')
285
+ if [ -z "$TURBO_TEAM" ]; then
286
+ echo "⚠️ .turbo/config.json 未生成。先に npx turbo login && npx turbo link を実行します"
287
+ npx turbo login && npx turbo link
288
+ TURBO_TEAM=$(cat .turbo/config.json | jq -r '.teamId')
289
+ fi
290
+ gh secret set TURBO_TEAM --body "$TURBO_TEAM"
291
+ echo "✅ TURBO_TEAM = $TURBO_TEAM を設定しました"
292
+ ```
293
+ ```
294
+
295
+ ### 修正9: エラーハンドリング テーブルの改善
296
+
297
+ **修正箇所**: L607-613
298
+
299
+ 修正後:
300
+ ```
301
+ | CLI未インストール | 自動インストール実行: `brew install <cli>` または `npm i -g <cli>`。Docker のみ OrbStack インストール案内(GUI必須のため) |
302
+ | トークン未設定 | 取得URL案内 → AskUserQuestionで値入力 → `.env.personal`に保存 → API検証(`vercel whoami` / `gh auth status` / `neonctl projects list`)で有効性確認 |
303
+ | トークン無効/期限切れ | 再取得URL案内 → AskUserQuestionで新しい値入力 → `.env.personal`を更新 → API検証で有効性確認 |
304
+ ```
305
+
306
+ ### 修正10: カテゴリ6 ヘルスチェックにトークン検証追加
307
+
308
+ **修正箇所**: L394-416(カテゴリ6: ローカル環境チェック)
309
+
310
+ CLIツール確認の後に、修正1と同じトークン有効性検証ブロック(タイムアウト付き並行実行)を追加。
311
+
312
+ ---
313
+
314
+ ## 修正サマリー
315
+
316
+ | # | 箇所 | 変更内容 | 効果 |
317
+ |---|------|---------|------|
318
+ | 1 | Phase 1 | トークン有効性検証追加(並行・タイムアウト付き) | 期限切れ・無効トークンを自動検知 |
319
+ | 2 | Phase 2 | 推奨ロジックにトークン無効を追加 | 無効時に自動でカテゴリ2へ誘導 |
320
+ | 3 | カテゴリ1 | `.env.keys` 自動コピー化 | worktree存在時は人間操作不要 |
321
+ | 4 | カテゴリ3 | Vercelプロジェクト作成をCLI自動化(`vercel link` + `vercel git connect` + API Root Directory) | Dashboard操作不要 |
322
+ | 5 | カテゴリ3 | PROJECT_ID/ORG_ID を `apps/<app>/.vercel/project.json` から自動取得 | 手動入力不要 |
323
+ | 6 | カテゴリ4 | Neonプロジェクト名推定+確認 / 既存チェック / ID自動取得 / `.env.preview` 自動設定(重複防止付き) | ハードコード解消 |
324
+ | 7 | カテゴリ5 Step 2 | VERCEL_ORG_ID/PROJECT_ID を `.vercel/project.json` から自動取得。VERCEL_TOKEN のみ手動 | 4値→1値のみ手動 |
325
+ | 8 | カテゴリ5 Step 3 | TURBO_TOKEN をVERCEL_TOKEN再利用で自動化 | 手動入力不要 |
326
+ | 9 | エラーハンドリング | CLI自動実行化 + トークン検証フロー | 提案→自動実行 |
327
+ | 10 | カテゴリ6 | トークン有効性検証追加 | ヘルスチェック精度向上 |
328
+
329
+ ## 人間操作が必要な場面(技術的制約で自動化不可)
330
+
331
+ | 場面 | 理由 | 提供する取得手順 |
332
+ |------|------|----------------|
333
+ | VERCEL_TOKEN 入力 | Dashboard でのトークン生成が必須 | URL(https://vercel.com/account/tokens)+ 「Create Token」手順 |
334
+ | NEON_API_KEY 入力 | Console でのキー生成が必須 | URL(https://console.neon.tech/app/settings/api-keys)+ 手順 |
335
+ | GITHUB_TOKEN 入力 | Settings ページでの生成が必須 | URL(https://github.com/settings/tokens/new)+ 必要スコープ |
336
+ | Docker インストール | GUIインストーラーが必須 | `brew install orbstack` + 公式サイトURL |
337
+ | `.env.keys` 配置 | チーム内の秘密鍵共有(worktree不在時) | 「チームメンバーから受け取りプロジェクトルートに配置」 |
338
+ | プロジェクト名確認 | 命名はプロジェクト固有の判断 | 推定名をデフォルト提示、変更可 |
339
+
340
+ **上記以外の全ての値は CLI/API で自動取得・自動設定される。**
341
+
342
+ ## レビュー指摘事項と対応
343
+
344
+ | 指摘 | 対応 |
345
+ |------|------|
346
+ | Vercel `POST /v9/projects` API未記載 | ❌廃止 → CLI `vercel link` + `vercel git connect` に変更(修正4) |
347
+ | Neon `--output json` レスポンス構造未確認 | `neonctl projects list` + `jq` パースに変更(修正6) |
348
+ | dotenvx `.env.preview` 重複追加リスク | `grep -v` で既存行を削除してから追加(修正6) |
349
+ | `.vercel/project.json` パス不統一 | 全箇所を `apps/<app>/.vercel/project.json` に統一(修正4,5,7) |
350
+ | `jq` 未インストール時のフォールバック | 共通推定ロジックに `grep` + `sed` フォールバック追加 |
351
+ | Phase 1 トークン検証のパフォーマンス | バックグラウンド並行実行 + `timeout 5` を追加(修正1) |
352
+
353
+ ## 検証方法
354
+
355
+ 1. `pnpm prepush` でlint/typecheck/testが通ることを確認
356
+ 2. 全AskUserQuestion箇所を洗い出し、CLI/APIで代替可能な値がないことをgrepで確認
357
+ 3. ゼロ状態シミュレーション:
358
+ - VERCEL_TOKEN入力 → `vercel link` でプロジェクト作成 → `apps/<app>/.vercel/project.json` から ORG_ID/PROJECT_ID 自動取得 → Secrets 自動登録
359
+ - NEON_API_KEY入力 → `neonctl projects create` → `neonctl projects list` でID取得 → `.env.preview` 自動設定(重複防止付き)
360
+ - Phase 1 でトークン有効性検証(並行・タイムアウト付き)→ 期限切れ検知 → カテゴリ2 へ自動誘導
361
+ 4. `.vercel/project.json` パスが全箇所で `apps/<app>/` 配下を参照していることを確認
@@ -0,0 +1,176 @@
1
+ # einja-issue-spec-createにui-designステップを追加 + Pencil MCP設定
2
+
3
+ ## Context
4
+
5
+ einja-issue-spec-create Skillは仕様書を段階的に作成するワークフローだが、現在はUI設計がdesign.md内のmermaid/表形式のみ。
6
+ Pencil MCPを活用してビジュアルなUIモックアップ(.penファイル)を生成するステップを追加し、UXの合意形成を効率化する。
7
+
8
+ ## Skill-first評価
9
+
10
+ **スキップ**: 既存のeinja-issue-spec-create Skillへの機能追加であり、新規Skill作成の対象外。
11
+
12
+ ## 変更対象ファイル
13
+
14
+ | # | ファイル | 操作 | 概要 |
15
+ |---|---------|------|------|
16
+ | 1 | `~/.claude/settings.json` | 変更 | Pencil MCP mcpServers設定追加 |
17
+ | 2 | `.claude/settings.json` | 変更 | Pencil MCP permissions追加 |
18
+ | 3 | `.claude/agents/einja/issue-specs/ui-design-generator.md` | **新規** | UIデザイン生成エージェント |
19
+ | 4 | `.claude/skills/einja-issue-spec-create/SKILL.md` | 変更 | ui-designステップ挿入 + Phase再番号付け |
20
+ | 5 | `.claude/agents/einja/issue-specs/design-generator.md` | 変更 | ui-design.pen参照追加 |
21
+
22
+ **注意**: `.claude/agents/einja/` および `.claude/skills/einja-*/` 配下のファイルは `presets/default/` に自動コピーされる。直接編集は不要。
23
+
24
+ ## 実装手順
25
+
26
+ ### Step 1: Pencil MCP設定追加(並行可)
27
+
28
+ #### 1a. `~/.claude/settings.json`(グローバル)にmcpServers追加
29
+
30
+ MCPサーバー定義はグローバル設定に配置(下流プロジェクトへの影響を防ぐため):
31
+
32
+ ```json
33
+ "mcpServers": {
34
+ "pencil": {
35
+ "transport": "stdio",
36
+ "command": "/Applications/Pencil.app/Contents/Resources/app.asar.unpacked/out/mcp-server-darwin-arm64",
37
+ "args": ["--app", "desktop"],
38
+ "env": {}
39
+ }
40
+ }
41
+ ```
42
+
43
+ #### 1b. `.claude/settings.json`(プロジェクト)にpermissions追加
44
+
45
+ `permissions.allow`に以下を追加:
46
+
47
+ ```
48
+ mcp__pencil__batch_design
49
+ mcp__pencil__batch_get
50
+ mcp__pencil__find_empty_space_on_canvas
51
+ mcp__pencil__get_editor_state
52
+ mcp__pencil__get_guidelines
53
+ mcp__pencil__get_screenshot
54
+ mcp__pencil__get_style_guide
55
+ mcp__pencil__get_style_guide_tags
56
+ mcp__pencil__get_variables
57
+ mcp__pencil__open_document
58
+ mcp__pencil__replace_all_matching_properties
59
+ mcp__pencil__search_all_unique_properties
60
+ mcp__pencil__set_variables
61
+ mcp__pencil__snapshot_layout
62
+ ```
63
+
64
+ ### Step 2: `ui-design-generator.md` 新規作成(並行可)
65
+
66
+ **パス**: `.claude/agents/einja/issue-specs/ui-design-generator.md`
67
+
68
+ **構造**(既存エージェントパターンに準拠 - `design-generator.md`等と同じ形式):
69
+ - **frontmatter**: name, description, tools(Pencil MCP + Playwright MCP読み取り用), model: sonnet, color: purple
70
+ - **ペルソナ**: UIデザイナー/UXエンジニアリング専門家
71
+ - **ワークフロー**:
72
+ 1. ステップ0: requirements.md読み込み + 既存画面判定
73
+ 2. ステップ1: Pencil MCP環境準備(open_document → get_guidelines → get_style_guide)
74
+ 3. ステップ2: 画面設計(find_empty_space_on_canvas → batch_design)
75
+ - `get_guidelines` でPencil MCPの操作ルール・構文仕様を取得してから実行
76
+ 4. ステップ3: ビジュアル確認(get_screenshot)と修正
77
+ 5. ステップ4: 既存画面改修時のPlaywright連携(スクリーンショット取得 → 参考にデザイン作成)
78
+ - **複数画面管理**: 1つの.penファイル内に複数フレーム。横方向(right)に自動配置、padding: 100px
79
+ - **既存画面改修**: Playwright MCPでスクショ取得 → 参考にしてデザイン作成
80
+ - **出力**: `{仕様書ディレクトリ}/ui-design.pen`(gitコミット対象)
81
+
82
+ ### Step 3: `einja-issue-spec-create/SKILL.md` 更新(Step 1,2に依存)
83
+
84
+ #### 変更1: allowed-tools に `mcp__pencil__*`, `mcp__playwright__*` 追加
85
+
86
+ #### 変更2: Phase構成の再番号付け
87
+
88
+ ```
89
+ Phase 1: requirements.md(要件定義書) ← 変更なし
90
+ Phase 2: ui-design.pen(UIデザイン) ← 新規
91
+ Phase 3: design.md(設計書) ← 旧Phase 2
92
+ Phase 4: QAテスト仕様生成 ← 旧Phase 3
93
+ Phase 5: GitHub Issueへのタスク記述 ← 旧Phase 4
94
+ ```
95
+
96
+ #### 変更3: Phase 2 ui-design ステップの挿入
97
+
98
+ Phase 1の後に以下を挿入:
99
+ - **スキップ判定**: requirements.mdに画面・UI・フォーム関連の要件がない場合はスキップ
100
+ - 明示的な判定基準: requirements.md内に「画面」「UI」「フォーム」「ダッシュボード」「表示」等のキーワードが含まれるか確認
101
+ - 判断が曖昧な場合はAskUserQuestionでユーザーに確認
102
+ - **既存画面確認**: 改修の場合はPlaywright MCPでスクリーンショット取得
103
+ - **エージェント呼び出し**: `ui-design-generator`で.pen生成
104
+ - **ユーザー確認**: get_screenshotで各画面プレビューを提示
105
+ - **承認後**: ui-design.penをコミット&プッシュ
106
+ - コミットメッセージ: `docs: {機能名}のUIデザインを追加`
107
+
108
+ #### 変更4: 旧Phase 2→3, 3→4, 4→5 の番号修正
109
+
110
+ 全てのPhase参照・セクション番号・サブセクション(4.1→5.1, 4.2→5.2等)を更新。
111
+
112
+ #### 変更5: Phase 3(旧Phase 2)design.mdセクションに ui-design.pen参照追加
113
+
114
+ ```
115
+ - **ui-design.penが存在する場合、Pencil MCPでビジュアルモックアップを参照してUI関連セクション(9-11)を作成**
116
+ ```
117
+
118
+ #### 変更6: 成果物ディレクトリ構成に `ui-design.pen` 追加
119
+
120
+ ```
121
+ /docs/specs/issues/{機能カテゴリ名}/issue{N}-{機能名}/
122
+ ├── requirements.md # Phase 1
123
+ ├── ui-design.pen # Phase 2(UI関連のみ)
124
+ ├── design.md # Phase 3
125
+ └── qa-tests/ # Phase 4
126
+ ```
127
+
128
+ #### 変更7: Phase 5 Issue説明文にUIデザインへのリンク追加
129
+
130
+ ### Step 4: `design-generator.md` 更新(Step 2に依存)
131
+
132
+ **パス**: `.claude/agents/einja/issue-specs/design-generator.md`
133
+
134
+ - ステップ0: ui-design.penの存在確認を追加
135
+ - ステップ1: 優先読み込みリストにui-design.penを追加
136
+ - セクション10(画面設計): ui-design.pen存在時はPencil MCPで参照(batch_get + get_screenshot)
137
+ - tools: `mcp__pencil__batch_get`, `mcp__pencil__get_screenshot` を追加(読み取り専用)
138
+
139
+ ## ui-design.pen と design.md の関係
140
+
141
+ | 観点 | ui-design.pen (Phase 2) | design.md (Phase 3) |
142
+ |------|------------------------|---------------------|
143
+ | 形式 | ビジュアル(.penファイル) | テキスト(mermaid/表) |
144
+ | 目的 | UX検証・デザイン合意 | 実装仕様の定義 |
145
+ | git管理 | .penファイルをコミット | 通常のmdファイル |
146
+ | セクション10 画面設計 | 各画面のビジュアルモックアップ | mermaid図(Pencil MCPで.penを参照して作成) |
147
+
148
+ **補完関係**: ui-design.pen=「何をどう見せるか」、design.md=「どう実装するか」
149
+
150
+ ## 実行順序
151
+
152
+ ```
153
+ Step 1 ─┐
154
+ ├─→ Step 3 ─→ 完了
155
+ Step 2 ─┤
156
+ └─→ Step 4
157
+ ```
158
+
159
+ Step 1とStep 2は並行実行可能。Step 3はStep 1,2完了後、Step 4はStep 2完了後。
160
+
161
+ ## Codexレビュー指摘事項への対応
162
+
163
+ | 指摘 | 対応 |
164
+ |------|------|
165
+ | mcpServersが下流プロジェクトにコピーされる | グローバル設定に配置、プロジェクトはpermissionsのみ |
166
+ | .penファイルのgit管理 | .penファイルをそのままgitコミット |
167
+ | batch_designのAPI仕様未記載 | エージェント内でget_guidelinesで仕様を取得してから実行 |
168
+ | Phase 2スキップ基準が曖昧 | キーワードベースの判定基準を明示 |
169
+ | allowed-tools更新の必要性 | Skillからサブエージェント経由で使うため追加 |
170
+
171
+ ## 検証方法
172
+
173
+ 1. **Pencil MCP接続テスト**: `mcp__pencil__get_editor_state` が応答するか確認
174
+ 2. **SKILL.md全体フロー確認**: Phase番号の整合性、次ステップへの参照が正しいか目視確認
175
+ 3. **新規エージェント構文確認**: frontmatterの形式が既存エージェント(design-generator.md等)と一致するか確認
176
+ 4. **CLIビルドへの影響確認**: agents/、skills/配下の新ファイルが`presets/default/`に自動コピーされることを確認