create-einja-app 0.3.1 → 0.3.2

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 (80) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +32 -16
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +1 -1
  5. package/templates/default/.claude/hooks/einja/plan-mode-skill-loader.sh +23 -0
  6. package/templates/default/.claude/settings.json +15 -1
  7. package/templates/default/.env.personal.example +6 -2
  8. package/templates/default/.envrc +5 -0
  9. package/templates/default/.github/workflows/deploy-pr-preview.yml +23 -24
  10. package/templates/default/.github/workflows/deploy-stable-branches.yml +55 -49
  11. package/templates/default/.mcp.json +2 -12
  12. package/templates/default/.serena/project.yml +7 -0
  13. package/templates/default/CLAUDE.md +28 -4
  14. package/templates/default/README.md +2 -2
  15. package/templates/default/apps/admin/package.json +1 -1
  16. package/templates/default/apps/admin/tsconfig.json +2 -1
  17. package/templates/default/apps/web/package.json +1 -1
  18. package/templates/default/apps/web/tsconfig.json +2 -1
  19. package/templates/default/docs/plans/.gitkeep +0 -0
  20. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-a87e67c.md +221 -0
  21. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-ab73a1c.md +107 -0
  22. package/templates/default/docs/plans/ancient-greeting-flamingo.md +120 -0
  23. package/templates/default/docs/plans/bright-stargazing-dawn.md +87 -0
  24. package/templates/default/docs/plans/calm-stirring-bonbon.md +196 -0
  25. package/templates/default/docs/plans/calm-watching-widget.md +111 -0
  26. package/templates/default/docs/plans/cheerful-wiggling-ullman.md +164 -0
  27. package/templates/default/docs/plans/compiled-humming-cherny.md +94 -0
  28. package/templates/default/docs/plans/dapper-launching-lynx.md +81 -0
  29. package/templates/default/docs/plans/effervescent-munching-kite-agent-ac08baf.md +672 -0
  30. package/templates/default/docs/plans/effervescent-munching-kite-agent-aecc373.md +442 -0
  31. package/templates/default/docs/plans/effervescent-munching-kite.md +263 -0
  32. package/templates/default/docs/plans/fix-orphan-cleaner-review.md +25 -0
  33. package/templates/default/docs/plans/fix-sync-template-variables.md +162 -0
  34. package/templates/default/docs/plans/glimmering-giggling-sedgewick.md +126 -0
  35. package/templates/default/docs/plans/glittery-swimming-bachman.md +78 -0
  36. package/templates/default/docs/plans/happy-watching-toast.md +56 -0
  37. package/templates/default/docs/plans/harmonic-strolling-nebula.md +210 -0
  38. package/templates/default/docs/plans/import-alias-refactor.md +75 -0
  39. package/templates/default/docs/plans/lazy-percolating-sloth-agent-abda679.md +346 -0
  40. package/templates/default/docs/plans/lazy-percolating-sloth.md +151 -0
  41. package/templates/default/docs/plans/linked-greeting-llama-agent-a7a6e5b.md +345 -0
  42. package/templates/default/docs/plans/linked-greeting-llama.md +467 -0
  43. package/templates/default/docs/plans/lovely-bubbling-rose.md +80 -0
  44. package/templates/default/docs/plans/optimized-watching-sprout.md +149 -0
  45. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a292da6.md +288 -0
  46. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a819699.md +366 -0
  47. package/templates/default/docs/plans/peaceful-beaming-toast-agent-ac11de2.md +474 -0
  48. package/templates/default/docs/plans/peaceful-beaming-toast.md +345 -0
  49. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6194c.md +300 -0
  50. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6900e.md +444 -0
  51. package/templates/default/docs/plans/purrfect-spinning-hickey.md +361 -0
  52. package/templates/default/docs/plans/recursive-kindling-lemon-agent-a42199e.md +186 -0
  53. package/templates/default/docs/plans/recursive-kindling-lemon.md +36 -0
  54. package/templates/default/docs/plans/seed-migration-tests.md +47 -0
  55. package/templates/default/docs/plans/sprightly-leaping-manatee.md +224 -0
  56. package/templates/default/docs/plans/stateful-wishing-lerdorf.md +161 -0
  57. package/templates/default/docs/plans/streamed-purring-wreath.md +40 -0
  58. package/templates/default/docs/plans/synthetic-percolating-pearl.md +101 -0
  59. package/templates/default/docs/plans/todo-fix-sync-template-variables.md +21 -0
  60. package/templates/default/docs/plans/todo-phase4-marker-update.md +39 -0
  61. package/templates/default/docs/plans/todo-skill-creator-sync.md +23 -0
  62. package/templates/default/docs/plans/typed-snuggling-parnas-agent-a6f6391.md +476 -0
  63. package/templates/default/docs/plans/typed-snuggling-parnas-agent-adb678b.md +144 -0
  64. package/templates/default/docs/plans/typed-snuggling-parnas.md +84 -0
  65. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a30aa4f.md +534 -0
  66. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a57a278.md +508 -0
  67. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a90b809.md +421 -0
  68. package/templates/default/docs/plans/warm-hopping-lighthouse.md +199 -0
  69. package/templates/default/docs/verification-test.md +2 -0
  70. package/templates/default/gitignore +4 -0
  71. package/templates/default/package.json +2 -2
  72. package/templates/default/packages/admin-ui/package.json +1 -1
  73. package/templates/default/packages/server-core/tsconfig.json +6 -1
  74. package/templates/default/pnpm-lock.yaml +276 -57
  75. package/templates/default/scripts/ensure-serena.sh +75 -0
  76. package/templates/default/scripts/lib/worktree-config.ts +64 -0
  77. package/templates/default/scripts/stop-serena.sh +25 -0
  78. package/templates/default/scripts/worktree/dev.ts +2 -2
  79. /package/templates/default/scripts/{cli-template-update.ts → _cli-template-update.ts} +0 -0
  80. /package/templates/default/scripts/{template-update.ts → _template-update.ts} +0 -0
@@ -0,0 +1,444 @@
1
+ # SKILL.md修正計画レビュー結果
2
+
3
+ ## レビュー対象
4
+ - 計画: `docs/plans/purrfect-spinning-hickey.md`
5
+ - 対象ファイル: `.claude/skills/einja-infra-maintenance/SKILL.md`(640行)
6
+ - 修正箇所: 10箇所
7
+
8
+ ---
9
+
10
+ ## 1. SKILL.mdとの整合性
11
+
12
+ ### ✅ 正確な箇所(問題なし)
13
+
14
+ | 修正# | 計画記載 | 実際 | 状態 |
15
+ |------|---------|------|------|
16
+ | 1 | L52-68(Phase 1) | L52-68でCLI確認後に挿入可能 | ✅ 正確 |
17
+ | 2 | L94-104(推奨ロジック テーブル) | L97-104がテーブル、追加可能 | ✅ 正確 |
18
+ | 3 | L143(`.env.keys`不在 行) | L143が該当行 | ✅ 正確 |
19
+ | 9 | L607-613(エラーハンドリング テーブル) | L607-613が該当テーブル | ✅ 正確 |
20
+ | 10 | L394-416(カテゴリ6) | L394-416がCLIツール確認セクション | ✅ 正確 |
21
+
22
+ ### ⚠️ 修正が必要な箇所
23
+
24
+ #### 修正4: Vercelプロジェクト作成(L214-223)
25
+
26
+ **問題**: 計画のコードブロックに**変数の未定義参照**がある
27
+
28
+ L98-119の計画では以下の変数を使用しているが、定義箇所が不明:
29
+ - `$PROJECT_NAME` (L111) — AskUserQuestionの結果をどの変数に格納するか明記されていない
30
+ - `$APP_NAME` (L118) — web/adminのループ処理がない(単一アプリ用コード)
31
+ - `$APP_NAME_UPPER` (L126) — 大文字変換の実装がない
32
+
33
+ **修正提案**:
34
+ ```bash
35
+ # 1. プロジェクト名の推定
36
+ BASE_NAME=$(cat package.json | jq -r '.name' | sed 's/@[^/]*\///' | sed 's/-monorepo$//' | sed 's/-template$//')
37
+ if [ -z "$BASE_NAME" ] || [ "$BASE_NAME" = "null" ]; then
38
+ BASE_NAME=$(basename $(git remote get-url origin 2>/dev/null) .git | sed 's/-template$//')
39
+ fi
40
+
41
+ # 2. 既存プロジェクト確認(ORG_ID未取得時はAPI経由取得)
42
+ if [ -z "$VERCEL_ORG_ID" ]; then
43
+ VERCEL_ORG_ID=$(curl -s "https://api.vercel.com/v2/teams" \
44
+ -H "Authorization: Bearer $VERCEL_TOKEN" | jq -r '.teams[0].id')
45
+ fi
46
+ EXISTING_PROJECTS=$(curl -s "https://api.vercel.com/v9/projects?teamId=$VERCEL_ORG_ID" \
47
+ -H "Authorization: Bearer $VERCEL_TOKEN" | jq -r '.projects[].name')
48
+
49
+ # 3. AskUserQuestion: プロジェクト名と作成対象を確認
50
+ # 推定名を提示: ${BASE_NAME}-web, ${BASE_NAME}-admin
51
+ # 既存プロジェクトがある場合は「既に存在」と表示
52
+ # → ユーザー確認後、$VERCEL_PROJECT_NAME_WEB, $VERCEL_PROJECT_NAME_ADMIN に格納
53
+
54
+ # 4. GitHubリポジトリ情報を自動取得
55
+ GH_ORG=$(git remote get-url origin | sed 's|.*github.com[:/]\(.*\)/.*|\1|')
56
+ GH_REPO=$(basename $(git remote get-url origin) .git)
57
+
58
+ # 5. プロジェクト作成(web/admin両方のループ)
59
+ for APP_NAME in web admin; do
60
+ APP_NAME_UPPER=$(echo "$APP_NAME" | tr '[:lower:]' '[:upper:]')
61
+ if [ "$APP_NAME" = "web" ]; then
62
+ PROJECT_NAME="$VERCEL_PROJECT_NAME_WEB"
63
+ else
64
+ PROJECT_NAME="$VERCEL_PROJECT_NAME_ADMIN"
65
+ fi
66
+
67
+ # 既存チェック(スキップ判定)
68
+ if echo "$EXISTING_PROJECTS" | grep -q "^${PROJECT_NAME}$"; then
69
+ echo "⚠️ ${PROJECT_NAME} は既に存在します。スキップします"
70
+ continue
71
+ fi
72
+
73
+ # プロジェクト作成
74
+ RESPONSE=$(curl -X POST "https://api.vercel.com/v9/projects?teamId=$VERCEL_ORG_ID" \
75
+ -H "Authorization: Bearer $VERCEL_TOKEN" \
76
+ -H "Content-Type: application/json" \
77
+ -d "{
78
+ \"name\": \"$PROJECT_NAME\",
79
+ \"framework\": \"nextjs\",
80
+ \"gitRepository\": {
81
+ \"type\": \"github\",
82
+ \"repo\": \"$GH_ORG/$GH_REPO\"
83
+ },
84
+ \"rootDirectory\": \"apps/$APP_NAME\"
85
+ }")
86
+
87
+ PROJECT_ID=$(echo "$RESPONSE" | jq -r '.id')
88
+ echo "✅ ${PROJECT_NAME} を作成しました(ID: $PROJECT_ID)"
89
+
90
+ # vercel link
91
+ cd "apps/$APP_NAME" && vercel link --project="$PROJECT_NAME" --yes && cd ../..
92
+
93
+ # GitHub Secrets登録
94
+ gh secret set "VERCEL_PROJECT_ID_${APP_NAME_UPPER}" --body "$PROJECT_ID"
95
+ echo "✅ VERCEL_PROJECT_ID_${APP_NAME_UPPER} を設定しました"
96
+ done
97
+ ```
98
+
99
+ **注意**: L129の注記「`VERCEL_ORG_ID` は最初のプロジェクトの `vercel link` 後に `.vercel/project.json` から自動取得」は**矛盾**している。API呼び出し(L94-95)でORG_IDが必要なため、先にAPI経由で取得すべき。
100
+
101
+ #### 修正5: 初期設定の PROJECT_ID 自動取得(L225-237)
102
+
103
+ **問題**: L237「プロジェクトID取得・表示」の具体的内容が不明
104
+
105
+ 計画のL139-145では `.vercel/project.json` からの自動取得を提案しているが、現在のSKILL.md L236には「プロジェクトID取得・表示」と簡潔にしか書かれていない。
106
+
107
+ **修正提案**: 計画通りに変更(明確な自動取得コードに置き換え)
108
+
109
+ #### 修正6: Neonプロジェクト作成(L269-280)
110
+
111
+ **問題1**: 既存プロジェクト確認のステップ(計画L162-168)が**ステップ2**として追加されるが、ステップ3の「プロジェクト名の推定・確認・作成」との整合性が不明確
112
+
113
+ **修正提案**: ステップ番号を修正
114
+ ```
115
+ 2. **既存プロジェクトの確認**:
116
+ ```bash
117
+ neonctl projects list --api-key $NEON_API_KEY --output json
118
+ ```
119
+ 既存プロジェクトがあれば一覧表示し、AskUserQuestionで使用するプロジェクトを確認。
120
+ - 既存プロジェクト使用 → IDを自動取得してステップ4へ
121
+ - 新規作成 → ステップ3へ
122
+
123
+ 3. **プロジェクト名の推定・確認・作成**:
124
+ (以下計画通り)
125
+ ```
126
+
127
+ **問題2**: 計画L173の「確認後にプロジェクト作成」コードで、変数`$NEON_PROJECT_NAME`が未定義
128
+
129
+ **修正提案**:
130
+ ```bash
131
+ # AskUserQuestionの結果を $NEON_PROJECT_NAME に格納後
132
+ PROJECT_JSON=$(neonctl projects create --name "$NEON_PROJECT_NAME" --region-id aws-ap-northeast-1 --api-key $NEON_API_KEY --output json)
133
+ ```
134
+
135
+ **問題3**: 計画L197「プロジェクトID取得」サブメニューは既にステップ2で実装されるため**重複**
136
+
137
+ **修正提案**: サブメニューから削除するか、「既存プロジェクトID確認」に変更
138
+
139
+ #### 修正7: カテゴリ5 一括設定 Step 2(L352-365)
140
+
141
+ **問題1**: 計画L233「カテゴリ3で作成したプロジェクト名($VERCEL_PROJECT_NAME_WEB / $VERCEL_PROJECT_NAME_ADMIN)を使用」とあるが、**カテゴリ3とカテゴリ5の実行順序が保証されていない**
142
+
143
+ カテゴリ5を先に実行した場合、変数が未定義でエラーになる。
144
+
145
+ **修正提案**: 環境変数やファイルから推定するロジックを追加
146
+ ```bash
147
+ # プロジェクト名の推定(カテゴリ3と同じロジック)
148
+ BASE_NAME=$(cat package.json | jq -r '.name' | sed 's/@[^/]*\///' | sed 's/-monorepo$//' | sed 's/-template$//')
149
+ if [ -z "$BASE_NAME" ] || [ "$BASE_NAME" = "null" ]; then
150
+ BASE_NAME=$(basename $(git remote get-url origin 2>/dev/null) .git | sed 's/-template$//')
151
+ fi
152
+
153
+ for app in web admin; do
154
+ # デフォルトのプロジェクト名(AskUserQuestionで変更可能にする)
155
+ DEFAULT_PROJECT_NAME="${BASE_NAME}-${app}"
156
+
157
+ # .vercel/project.json から取得を優先
158
+ PROJECT_ID=$(cat "apps/$app/.vercel/project.json" 2>/dev/null | jq -r '.projectId')
159
+
160
+ if [ -z "$PROJECT_ID" ] || [ "$PROJECT_ID" = "null" ]; then
161
+ # AskUserQuestion: プロジェクト名を確認(デフォルト値を提示)
162
+ # → $PROJECT_NAME に格納
163
+ PROJECT_ID=$(curl -s "https://api.vercel.com/v9/projects/$PROJECT_NAME?teamId=$VERCEL_ORG_ID" \
164
+ -H "Authorization: Bearer $VERCEL_TOKEN" | jq -r '.id')
165
+ fi
166
+
167
+ # 以下同じ
168
+ done
169
+ ```
170
+
171
+ **問題2**: L237「$PROJECT_ID = "null"」のチェックがあるが、L231で `cat` が失敗した場合、`$PROJECT_ID` は空文字列(not "null")。jq出力が"null"の場合を想定しているなら問題ないが、混在リスクあり。
172
+
173
+ **修正提案**: 統一して `[ -z "$PROJECT_ID" ] || [ "$PROJECT_ID" = "null" ]` でチェック
174
+
175
+ #### 修正8: TURBO_TOKEN 案内改善(L367-383)
176
+
177
+ **問題**: L260「別トークンを使用したい場合のみ AskUserQuestion で入力」のロジックが具体的でない
178
+
179
+ **修正提案**:
180
+ ```bash
181
+ # Step 2-a で取得した VERCEL_TOKEN を再利用(デフォルト動作)
182
+ # AskUserQuestion: 「VERCEL_TOKENと同じ値を使用しますか?」
183
+ # → Yes: そのまま設定、No: 別のトークンを入力
184
+
185
+ if [ "$USE_VERCEL_TOKEN" = "yes" ]; then
186
+ gh secret set TURBO_TOKEN --body "$VERCEL_TOKEN"
187
+ echo "✅ TURBO_TOKEN を設定しました(VERCEL_TOKENと同一値)"
188
+ else
189
+ # AskUserQuestionで別のトークンを入力
190
+ gh secret set TURBO_TOKEN --body "$TURBO_TOKEN_INPUT"
191
+ fi
192
+ ```
193
+
194
+ ---
195
+
196
+ ## 2. 設計原則の徹底確認
197
+
198
+ ### 原則: API/CLIで取得・生成可能な値は絶対に人間に操作させない
199
+
200
+ 修正後も**人間入力が残る箇所**を全てリストアップ:
201
+
202
+ | 箇所 | AskUserQuestionの内容 | CLI/API代替可否 | 判定 |
203
+ |------|---------------------|---------------|------|
204
+ | カテゴリ1 L143 | `.env.keys` メインworktreeからコピー or 手動配置 | ✅ 修正3で自動化 | ✅ 適切 |
205
+ | カテゴリ2 L168-172 | トークン値入力(GITHUB_TOKEN, VERCEL_TOKEN, NEON_API_KEY) | ❌ ブラウザ操作必須 | ✅ 適切 |
206
+ | カテゴリ2 L181 | チーム共有設定の対象ファイル選択 | ✅ 可能(編集したい変数名から推定) | ⚠️ 要改善 |
207
+ | カテゴリ2 L183 | 変更内容確認 | ✅ 可能(変数名と値を直接指定) | ⚠️ 要改善 |
208
+ | カテゴリ2 L190 | 新規変数追加の変数名・用途・対象環境 | ❌ 人間判断必須 | ✅ 適切 |
209
+ | カテゴリ2 L194 | 他環境への展開確認 | ❌ 人間判断必須 | ✅ 適切 |
210
+ | カテゴリ3 修正4 | プロジェクト名・作成対象アプリ確認 | ⚠️ 推定値をデフォルトとして提示(確認のみ) | ✅ 適切 |
211
+ | カテゴリ3 L227 | アプリ選択(web / admin) | ⚠️ 既存プロジェクトから自動推定可能 | ⚠️ 要改善 |
212
+ | カテゴリ3 L243 | 環境変数同期対象確認 | ✅ 可能(.env.keys全件が対象) | ⚠️ 要改善 |
213
+ | カテゴリ4 修正6 | 既存プロジェクト使用 or 新規作成 | ❌ 人間判断必須 | ✅ 適切 |
214
+ | カテゴリ4 修正6 | Neonプロジェクト名確認 | ⚠️ 推定値をデフォルトとして提示 | ✅ 適切 |
215
+ | カテゴリ5 L332 | 個別設定のSecret名と値 | ❌ 人間判断必須 | ✅ 適切 |
216
+ | カテゴリ5 修正7 | VERCEL_TOKENのみ入力(他は自動取得) | ❌ ブラウザ操作必須 | ✅ 適切 |
217
+ | カテゴリ5 修正8 | TURBO_TOKEN(VERCEL_TOKEN再利用 or 別入力) | ⚠️ デフォルト動作を自動化すべき | ⚠️ 要改善 |
218
+ | カテゴリ7 L524 | 失敗調査のrun-id選択 | ✅ 可能(最新の失敗を自動選択) | ⚠️ 要改善 |
219
+
220
+ ### ⚠️ さらなる自動化が可能な箇所
221
+
222
+ #### カテゴリ2: チーム共有設定変更(L181, L183)
223
+
224
+ **現状**: ファイル選択・変更内容をAskUserQuestion
225
+
226
+ **改善案**: コマンド引数で変数名と値を直接指定
227
+ ```bash
228
+ # 例: pnpm env:update set DATABASE_URL="postgres://..." --env=production
229
+ # → AskUserQuestionなしで .env.production を復号→編集→暗号化
230
+ ```
231
+
232
+ Skill起動時の引数で指定可能にすれば、AskUserQuestionを削減できる。
233
+
234
+ #### カテゴリ3: 環境変数同期対象確認(L243)
235
+
236
+ **現状**: AskUserQuestionで同期対象を確認
237
+
238
+ **改善案**: `.env.keys` の全DOTENV_PRIVATE_KEY_*を自動同期(確認不要)
239
+ - 理由: GitHub Secretsと同じく、全件同期が標準動作
240
+ - マスク表示して確認を求める理由が不明(秘密鍵は全て同期すべき)
241
+
242
+ #### カテゴリ5 修正8: TURBO_TOKEN(L367-383)
243
+
244
+ **現状**: AskUserQuestionで「別トークン使用するか」確認
245
+
246
+ **改善案**: デフォルトでVERCEL_TOKENを再利用。別トークンが必要な場合のみ引数で指定
247
+ ```bash
248
+ # デフォルト(確認なし)
249
+ gh secret set TURBO_TOKEN --body "$VERCEL_TOKEN"
250
+
251
+ # 別トークンが必要な場合のみ
252
+ # Skill起動時: /infra-maintenance カテゴリ5 --turbo-token-separate
253
+ ```
254
+
255
+ #### カテゴリ7: 失敗調査のrun-id選択(L524)
256
+
257
+ **現状**: AskUserQuestionでrun-id選択
258
+
259
+ **改善案**: 最新の失敗を自動選択(複数ある場合のみ選択肢表示)
260
+ ```bash
261
+ FAILED_RUNS=$(gh run list --status=failure --limit 5 --json databaseId,conclusion,workflowName)
262
+ COUNT=$(echo "$FAILED_RUNS" | jq '. | length')
263
+
264
+ if [ "$COUNT" -eq 1 ]; then
265
+ RUN_ID=$(echo "$FAILED_RUNS" | jq -r '.[0].databaseId')
266
+ echo "最新の失敗: $(echo "$FAILED_RUNS" | jq -r '.[0].workflowName') を調査します"
267
+ gh run view "$RUN_ID" --log-failed
268
+ else
269
+ # 複数ある場合のみAskUserQuestion
270
+ fi
271
+ ```
272
+
273
+ ---
274
+
275
+ ## 3. プロジェクト名推定ロジックの妥当性
276
+
277
+ ### ✅ 正常動作の検証
278
+
279
+ 実際のリポジトリで検証:
280
+ ```bash
281
+ # package.json name
282
+ "einja-management-monorepo"
283
+ → sed 's/@[^/]*\///' → "einja-management-monorepo"
284
+ → sed 's/-monorepo$//' → "einja-management"
285
+ → sed 's/-template$//' → "einja-management" ✅
286
+
287
+ # Git リポジトリ名
288
+ "einja-management-template.git"
289
+ → basename .git → "einja-management-template"
290
+ → sed 's/-template$//' → "einja-management" ✅
291
+
292
+ # scoped package
293
+ "@repo/web"
294
+ → sed 's/@[^/]*\///' → "web" ✅
295
+ ```
296
+
297
+ ### ⚠️ 潜在的な問題
298
+
299
+ #### 問題1: `-monorepo` と `-template` の除去順序
300
+
301
+ 現在のロジック:
302
+ ```bash
303
+ sed 's/@[^/]*\///' | sed 's/-monorepo$//' | sed 's/-template$//'
304
+ ```
305
+
306
+ `einja-management-monorepo-template` のような名前の場合:
307
+ 1. `sed 's/-monorepo$//'` → `einja-management-monorepo-template`(末尾が-templateなので変更なし)
308
+ 2. `sed 's/-template$//'` → `einja-management-monorepo`(-monorepoが残る)
309
+
310
+ **修正提案**: 両方を同時に除去
311
+ ```bash
312
+ sed 's/@[^/]*\///' | sed 's/-\(monorepo\|template\)$//'
313
+ ```
314
+
315
+ または複数回適用:
316
+ ```bash
317
+ sed 's/@[^/]*\///' | sed -e 's/-monorepo$//' -e 's/-template$//' -e 's/-monorepo$//'
318
+ ```
319
+
320
+ #### 問題2: 他に除去すべきサフィックスはないか?
321
+
322
+ 考慮すべきパターン:
323
+ - `-repo` (例: `my-project-repo`)
324
+ - `-workspace` (例: `my-project-workspace`)
325
+ - `-starter` (例: `my-project-starter`)
326
+ - `-boilerplate` (例: `my-project-boilerplate`)
327
+
328
+ **推奨**: 汎用的な正規表現に変更
329
+ ```bash
330
+ # 一般的なサフィックスを除去
331
+ sed 's/@[^/]*\///' | sed 's/-\(monorepo\|template\|repo\|workspace\|starter\|boilerplate\)$//'
332
+ ```
333
+
334
+ ただし、この変更は**このリポジトリ専用のSKILL.md**には不要かもしれない。他プロジェクトでも使う場合のみ検討。
335
+
336
+ #### 問題3: scoped packageの `name` フィールドが `@org/monorepo` の場合
337
+
338
+ `@einja/management-monorepo` → `sed 's/@[^/]*\///'` → `management-monorepo` → `management` ✅
339
+
340
+ 問題なし。
341
+
342
+ ---
343
+
344
+ ## 4. 漏れている修正
345
+
346
+ ### ⚠️ カテゴリ2: トークン有効性検証が不足
347
+
348
+ **修正1**(Phase 1)と**修正10**(カテゴリ6)でトークン検証を追加しているが、**カテゴリ2: 環境変数管理**の「個人トークン設定」(L168-178)では、トークン入力後の**有効性検証**が実装されていない。
349
+
350
+ 計画の修正9(L287「API検証で有効性確認」)で言及されているが、カテゴリ2の該当箇所は修正対象に含まれていない。
351
+
352
+ **修正提案**: カテゴリ2 L172-178 に検証ブロックを追加
353
+ ```bash
354
+ 2. AskUserQuestionでトークン値を入力してもらう
355
+ 3. `.env.personal`に保存
356
+ 4. `chmod 600 .env.personal` 実行
357
+ 5. API検証(可能な場合):
358
+ - GitHub: `gh auth status` で有効性確認。失敗時は再入力を促す
359
+ - Vercel: `vercel whoami --token "$VERCEL_TOKEN"` で確認。失敗時は再入力を促す
360
+ - Neon: `neonctl projects list --api-key "$NEON_API_KEY"` で確認。失敗時は再入力を促す
361
+ 6. 検証成功後、「✅ トークンが有効です」と表示
362
+ ```
363
+
364
+ ### ✅ カテゴリ7: GitHub Actions CI/CD管理
365
+
366
+ 計画に含まれていないが、このカテゴリは**現状でも十分に自動化されている**。追加の改善は不要。
367
+
368
+ ---
369
+
370
+ ## 5. 依存関係の確認
371
+
372
+ ### ✅ 修正間の依存関係に問題なし
373
+
374
+ | 修正 | 依存元 | 依存先 | 状態 |
375
+ |------|--------|--------|------|
376
+ | 修正1 | - | - | 独立(Phase 1に追加) |
377
+ | 修正2 | 修正1 | - | 修正1の結果を推奨ロジックで使用 |
378
+ | 修正3 | - | - | 独立(`.env.keys`コピー) |
379
+ | 修正4 | - | 修正5, 修正7 | Vercelプロジェクト作成 → ID取得 → Secrets設定 |
380
+ | 修正5 | 修正4 | - | 修正4で作成したプロジェクトのID取得 |
381
+ | 修正6 | - | - | 独立(Neonプロジェクト作成) |
382
+ | 修正7 | 修正4, 修正5 | - | ⚠️ カテゴリ3未実行時の対応が必要(上記「修正7」参照) |
383
+ | 修正8 | 修正7 | - | VERCEL_TOKEN(修正7で取得)を再利用 |
384
+ | 修正9 | - | - | 独立(エラーハンドリング テーブル更新) |
385
+ | 修正10 | 修正1 | - | 修正1と同じロジックをカテゴリ6に追加 |
386
+
387
+ ### ⚠️ 修正7の依存問題
388
+
389
+ 前述の通り、**カテゴリ5を先に実行した場合**にカテゴリ3の変数(`$VERCEL_PROJECT_NAME_WEB`等)が未定義になる。
390
+
391
+ **対策**: 修正7のコードで、カテゴリ3と同じ推定ロジックを実装する(上記「修正7」参照)
392
+
393
+ ---
394
+
395
+ ## 総合評価
396
+
397
+ ### ✅ 計画の優れた点
398
+
399
+ 1. **設計原則が明確**: 「API/CLIで取得可能な値は自動化」が一貫している
400
+ 2. **プロジェクト名推定ロジック**: package.json → Git repo のフォールバックが適切
401
+ 3. **トークン検証の追加**: Phase 1とカテゴリ6での検証は有用
402
+ 4. **修正箇所の大半が正確**: 10修正中7箇所は行番号が正確
403
+
404
+ ### ⚠️ 修正が必要な問題
405
+
406
+ | 問題 | 重大度 | 影響 |
407
+ |------|--------|------|
408
+ | 修正4の変数未定義(`$PROJECT_NAME`, `$APP_NAME_UPPER`) | 🔴 高 | 実行時エラー |
409
+ | 修正7のカテゴリ間依存(プロジェクト名変数) | 🔴 高 | 先に実行するとエラー |
410
+ | 修正6のステップ番号不明確 | 🟡 中 | 混乱を招く |
411
+ | 修正8のAskUserQuestion具体性不足 | 🟡 中 | 実装時の曖昧さ |
412
+ | 修正4のORG_ID取得タイミング矛盾 | 🟡 中 | 設計の不整合 |
413
+ | カテゴリ2のトークン検証漏れ | 🟡 中 | ユーザー体験の低下 |
414
+ | プロジェクト名推定の複数サフィックス対応不足 | 🟢 低 | エッジケースのみ |
415
+
416
+ ### 📋 推奨アクション
417
+
418
+ #### 必須修正(実装前に対応)
419
+
420
+ 1. **修正4**: 変数定義とループ処理を追加(上記修正提案を適用)
421
+ 2. **修正7**: プロジェクト名推定ロジックを追加(カテゴリ3非依存に)
422
+ 3. **修正6**: ステップ番号を明確化(既存プロジェクト確認をステップ2に)
423
+ 4. **修正8**: AskUserQuestionの具体的なロジックを記載
424
+
425
+ #### 推奨修正(優先度:高)
426
+
427
+ 5. **カテゴリ2**: トークン有効性検証をL172-178に追加
428
+ 6. **修正4**: ORG_ID取得を先頭に移動(API呼び出し前に取得)
429
+
430
+ #### オプション改善(優先度:中)
431
+
432
+ 7. **カテゴリ3 L243**: 環境変数同期の確認を削除(全件自動同期)
433
+ 8. **カテゴリ7 L524**: 最新失敗の自動選択ロジック追加
434
+
435
+ #### 将来検討(優先度:低)
436
+
437
+ 9. **プロジェクト名推定**: 複数サフィックス対応(`-repo`, `-workspace`等)
438
+ 10. **カテゴリ2**: コマンド引数による非対話モード対応
439
+
440
+ ---
441
+
442
+ ## レビュー完了
443
+
444
+ 計画全体としては**非常に優れた自動化設計**ですが、変数定義・依存関係の部分で**実装前の修正が必須**です。上記の必須修正を適用すれば、実装可能な状態になります。