create-einja-app 0.3.0 → 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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-einja-app",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "CLI tool to create new projects with Einja Management Template",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+ # plan-mode-skill-loader.sh - Plan mode中にeinja-skill-firstのリマインダーを注入
3
+ #
4
+ # UserPromptSubmit hookとして設定
5
+ # permission_mode == "plan" の場合に、軽量リマインダーをadditionalContextとして注入
6
+ # 毎回注入しても2-3行なのでコスト無視可能。状態管理不要。
7
+
8
+ set -uo pipefail
9
+
10
+ input=$(cat)
11
+
12
+ # permission_modeを取得
13
+ permission_mode=$(echo "$input" | jq -r '.permission_mode // empty')
14
+
15
+ # Plan mode以外はスキップ
16
+ if [[ "$permission_mode" != "plan" ]]; then
17
+ exit 0
18
+ fi
19
+
20
+ # 軽量リマインダーを注入
21
+ jq -n '{
22
+ "additionalContext": "【Plan mode自動リマインダー】計画作成前にeinja-skill-firstの評価を実施してください。.claude/skills/einja-skill-first/SKILL.mdを参照し、スキップ基準に該当しない場合はSkill作成の必要性を評価してください。スキップ基準(単発の小規模修正、既存キーワードトリガー一致、具体的かつ限定的な作業指示、1回限りの作業)に該当する場合は省略可。"
23
+ }'
@@ -1,4 +1,7 @@
1
1
  {
2
+ "env": {
3
+ "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
4
+ },
2
5
  "includeCoAuthoredBy": false,
3
6
  "plansDirectory": "docs/plans",
4
7
  "permissions": {
@@ -182,9 +185,20 @@
182
185
  }
183
186
  ]
184
187
  }
188
+ ],
189
+ "UserPromptSubmit": [
190
+ {
191
+ "hooks": [
192
+ {
193
+ "type": "command",
194
+ "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/einja/plan-mode-skill-loader.sh",
195
+ "timeout": 5000
196
+ }
197
+ ]
198
+ }
185
199
  ]
186
200
  },
187
201
  "enabledPlugins": {
188
202
  "code-simplifier@claude-plugins-official": true
189
203
  }
190
- }
204
+ }
@@ -19,8 +19,12 @@
19
19
  # 必要なスコープ: repo, read:org
20
20
  GITHUB_TOKEN=
21
21
 
22
- # Claude Code 実験的機能フラグ
23
- ENABLE_TOOL_SEARCH=true
22
+ # Asana APIトークン(プロジェクト管理ツールAsanaのAPIアクセス用)
23
+ # 取得方法: https://app.asana.com/0/my-apps で個人アクセストークンを追加
24
+ ASANA_TOKEN=
25
+
26
+ # Serena MCPサーバーのポート番号(ポート衝突時のみ変更。通常は自動解決)
27
+ # SERENA_PORT=9851
24
28
 
25
29
  # その他の個人用トークン(必要に応じて)
26
30
  # OPENAI_API_KEY=
@@ -23,6 +23,11 @@ MAIN_WORKTREE=$(get_main_worktree)
23
23
  if [ -n "$MAIN_WORKTREE" ] && [ -f "$MAIN_WORKTREE/.env.personal" ]; then
24
24
  dotenv_if_exists "$MAIN_WORKTREE/.env.personal"
25
25
  fi
26
+
27
+ # Serena MCP サーバー自動起動
28
+ if [ -n "$MAIN_WORKTREE" ] && [ -f "$MAIN_WORKTREE/scripts/ensure-serena.sh" ]; then
29
+ source "$MAIN_WORKTREE/scripts/ensure-serena.sh" "$MAIN_WORKTREE"
30
+ fi
26
31
  # @einja:managed:end
27
32
 
28
33
  # @einja:seed:start id="project-env"
@@ -261,26 +261,6 @@ jobs:
261
261
  echo "name=$PROJECT_NAME" >> $GITHUB_OUTPUT
262
262
  fi
263
263
 
264
- # Vercel環境変数の自動同期(encrypted-only方式:dotenvxで管理しているもの = Vercelに同期すべきもの)
265
- - name: Sync environment variables to Vercel
266
- run: |
267
- # .env.previewから encrypted: を含むキー名を抽出
268
- # NEON_*とDATABASE_*を除外(Neon APIから動的取得・--envで注入するため)
269
- ENCRYPTED_KEYS=$(grep 'encrypted:' $GITHUB_WORKSPACE/.env.preview | sed 's/=.*//' | grep -vE '^(NEON_|DATABASE_)')
270
-
271
- npx dotenvx run -f $GITHUB_WORKSPACE/.env.preview -- bash -c "
272
- for key in $ENCRYPTED_KEYS; do
273
- value=\$(printenv \"\$key\" 2>/dev/null || true)
274
- if [ -n \"\$value\" ]; then
275
- echo \"Syncing \$key to Vercel (preview)...\"
276
- echo \"\$value\" | vercel env rm \"\$key\" preview --yes --token=\$VERCEL_TOKEN 2>/dev/null || true
277
- echo \"\$value\" | vercel env add \"\$key\" preview --token=\$VERCEL_TOKEN
278
- fi
279
- done
280
- "
281
- env:
282
- DOTENV_PRIVATE_KEY_PREVIEW: ${{ secrets.DOTENV_PRIVATE_KEY_PREVIEW }}
283
-
284
264
  # NOTE: dotenvxはデフォルトで既存の環境変数を上書きしない
285
265
  # env:で設定したDATABASE_URLがNeonブランチのURLとして優先される
286
266
  - name: Build Project (apps/${{ matrix.app }})
@@ -291,13 +271,32 @@ jobs:
291
271
  DOTENV_PRIVATE_KEY_PREVIEW: ${{ secrets.DOTENV_PRIVATE_KEY_PREVIEW }}
292
272
  DATABASE_URL: ${{ steps.db-urls.outputs.db_url_pooled }}
293
273
 
294
- # Vercel Deploy(ランタイムにもDATABASE_URLを渡す)
295
274
  - name: Deploy to Vercel
296
275
  id: deploy
297
276
  run: |
298
- DEPLOY_URL=$(vercel deploy --prebuilt --token=$VERCEL_TOKEN \
299
- --env DATABASE_URL="${{ steps.db-urls.outputs.db_url_pooled }}")
300
- echo "url=$DEPLOY_URL" >> $GITHUB_OUTPUT
277
+ npx dotenvx run -f $GITHUB_WORKSPACE/.env.preview -- bash -c '
278
+ declare -a ENV_FLAGS=()
279
+ while IFS= read -r key; do
280
+ case "$key" in
281
+ NEON_*|DOTENV_PUBLIC_KEY_*) continue ;;
282
+ esac
283
+ value="${!key}"
284
+ if [ -n "$value" ]; then
285
+ echo "::add-mask::${value}"
286
+ fi
287
+ ENV_FLAGS+=("--env" "${key}=${value}")
288
+ done < <(grep -E "^[A-Z_][A-Z0-9_]*=\"?encrypted:" "$GITHUB_WORKSPACE/.env.preview" | cut -d= -f1)
289
+
290
+ # DATABASE_URLはNeon APIから取得した値を注入(.env.previewには含まれない)
291
+ ENV_FLAGS+=("--env" "DATABASE_URL=${DATABASE_URL}")
292
+
293
+ echo "Deploying with ${#ENV_FLAGS[@]} runtime env vars..."
294
+ DEPLOY_URL=$(vercel deploy --prebuilt "${ENV_FLAGS[@]}" --token="$VERCEL_TOKEN")
295
+ echo "url=$DEPLOY_URL" >> "$GITHUB_OUTPUT"
296
+ '
297
+ env:
298
+ DOTENV_PRIVATE_KEY_PREVIEW: ${{ secrets.DOTENV_PRIVATE_KEY_PREVIEW }}
299
+ DATABASE_URL: ${{ steps.db-urls.outputs.db_url_pooled }}
301
300
 
302
301
  - name: Set Vercel alias
303
302
  if: steps.project-name.outputs.name != ''
@@ -42,6 +42,7 @@ jobs:
42
42
  outputs:
43
43
  web: ${{ steps.filter.outputs.web }}
44
44
  admin: ${{ steps.filter.outputs.admin }}
45
+ deploy_matrix: ${{ steps.matrix.outputs.matrix }}
45
46
  steps:
46
47
  - uses: actions/checkout@v4
47
48
  with:
@@ -62,6 +63,7 @@ jobs:
62
63
  - 'turbo.json'
63
64
  - 'tsconfig.json'
64
65
  - '.env.*'
66
+ - '.github/workflows/**'
65
67
  admin:
66
68
  - 'apps/admin/**'
67
69
  - 'packages/admin-ui/**'
@@ -73,6 +75,19 @@ jobs:
73
75
  - 'turbo.json'
74
76
  - 'tsconfig.json'
75
77
  - '.env.*'
78
+ - '.github/workflows/**'
79
+
80
+ - name: Build deploy matrix
81
+ id: matrix
82
+ run: |
83
+ MATRIX='[]'
84
+ if [ "${{ steps.filter.outputs.web }}" = "true" ]; then
85
+ MATRIX=$(echo "$MATRIX" | jq -c '. + [{"app": "web"}]')
86
+ fi
87
+ if [ "${{ steps.filter.outputs.admin }}" = "true" ]; then
88
+ MATRIX=$(echo "$MATRIX" | jq -c '. + [{"app": "admin"}]')
89
+ fi
90
+ echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
76
91
 
77
92
  migrate:
78
93
  needs: ci
@@ -102,43 +117,24 @@ jobs:
102
117
  # Web/Adminデプロイ(並列実行・変更検知付き)
103
118
  deploy:
104
119
  needs: [ci, migrate, changes]
105
- if: always() && needs.ci.result == 'success' && needs.changes.result == 'success' && (needs.migrate.result == 'success' || needs.migrate.result == 'skipped')
120
+ if: always() && needs.ci.result == 'success' && (needs.migrate.result == 'success' || needs.migrate.result == 'skipped') && needs.changes.result == 'success' && needs.changes.outputs.deploy_matrix != '[]'
106
121
  runs-on: ubuntu-latest
107
122
  strategy:
108
123
  fail-fast: false
109
124
  matrix:
110
- app: [web, admin]
125
+ include: ${{ fromJSON(needs.changes.outputs.deploy_matrix) }}
111
126
  env:
112
127
  VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
113
128
  VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
114
129
  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
115
130
  TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
116
131
  steps:
117
- # 変更検知によるスキップ判定
118
- - name: Check if deploy is needed
119
- id: check
120
- run: |
121
- case "${{ matrix.app }}" in
122
- web) CHANGED="${{ needs.changes.outputs.web }}" ;;
123
- admin) CHANGED="${{ needs.changes.outputs.admin }}" ;;
124
- esac
125
- if [ "$CHANGED" = "true" ]; then
126
- echo "should_deploy=true" >> $GITHUB_OUTPUT
127
- echo "${{ matrix.app }}: changes detected, will deploy"
128
- else
129
- echo "should_deploy=false" >> $GITHUB_OUTPUT
130
- echo "${{ matrix.app }}: no changes detected, skipping deploy"
131
- fi
132
-
133
132
  - uses: actions/checkout@v4
134
- if: steps.check.outputs.should_deploy == 'true'
135
133
 
136
134
  - name: Setup Environment
137
- if: steps.check.outputs.should_deploy == 'true'
138
135
  uses: ./.github/actions/setup
139
136
 
140
137
  - name: Resolve Vercel Project ID
141
- if: steps.check.outputs.should_deploy == 'true'
142
138
  id: resolve
143
139
  run: |
144
140
  case "${{ matrix.app }}" in
@@ -147,16 +143,13 @@ jobs:
147
143
  esac
148
144
 
149
145
  - name: Set VERCEL_PROJECT_ID
150
- if: steps.check.outputs.should_deploy == 'true'
151
146
  run: echo "VERCEL_PROJECT_ID=${{ steps.resolve.outputs.project_id }}" >> $GITHUB_ENV
152
147
 
153
148
  - name: Install Vercel CLI
154
- if: steps.check.outputs.should_deploy == 'true'
155
149
  run: pnpm add -g vercel@latest
156
150
 
157
151
  # ブランチ判定 — 環境変数を $GITHUB_ENV に書き出す
158
152
  - name: Determine environment
159
- if: steps.check.outputs.should_deploy == 'true'
160
153
  run: |
161
154
  BRANCH="${GITHUB_REF##*/}"
162
155
  case "$BRANCH" in
@@ -183,7 +176,7 @@ jobs:
183
176
 
184
177
  # Extract alias domain(自アプリ分のみ)
185
178
  - name: Extract alias domain
186
- if: steps.check.outputs.should_deploy == 'true' && env.DEPLOY_RUN_ALIAS == 'true'
179
+ if: env.DEPLOY_RUN_ALIAS == 'true'
187
180
  run: |
188
181
  case "${{ matrix.app }}" in
189
182
  web)
@@ -203,39 +196,35 @@ jobs:
203
196
 
204
197
  # Vercel pull
205
198
  - name: Pull Vercel Environment
206
- if: steps.check.outputs.should_deploy == 'true'
207
199
  run: vercel pull --yes --environment=${{ env.DEPLOY_VERCEL_ENV }} --token=$VERCEL_TOKEN
208
200
 
209
- # Vercel環境変数の自動同期(encrypted-only方式:dotenvxで管理しているもの = Vercelに同期すべきもの)
201
+ # Vercel環境変数の自動同期(mainのみ develop/stagingは--env注入)
210
202
  - name: Sync environment variables to Vercel
211
- if: steps.check.outputs.should_deploy == 'true'
203
+ if: github.ref_name == 'main'
212
204
  run: |
213
- # dotenvxファイルから encrypted: を含むキー名を抽出
214
- ENCRYPTED_KEYS=$(grep 'encrypted:' ${{ env.DEPLOY_DOTENV_FILE }} | sed 's/=.*//')
215
-
216
- npx dotenvx run -f ${{ env.DEPLOY_DOTENV_FILE }} -- bash -c "
217
- for key in $ENCRYPTED_KEYS; do
218
- value=\$(printenv \"\$key\" 2>/dev/null || true)
219
- if [ -n \"\$value\" ]; then
220
- echo \"Syncing \$key to Vercel (${{ env.DEPLOY_VERCEL_ENV }})...\"
221
- echo \"\$value\" | vercel env rm \"\$key\" ${{ env.DEPLOY_VERCEL_ENV }} --yes --token=\$VERCEL_TOKEN 2>/dev/null || true
222
- echo \"\$value\" | vercel env add \"\$key\" ${{ env.DEPLOY_VERCEL_ENV }} --token=\$VERCEL_TOKEN
205
+ npx dotenvx run -f ${{ env.DEPLOY_DOTENV_FILE }} -- bash -c '
206
+ grep -E "^[A-Z_][A-Z0-9_]*=\"?encrypted:" ${{ env.DEPLOY_DOTENV_FILE }} | cut -d= -f1 | while read -r key; do
207
+ case "$key" in
208
+ NEON_*) continue ;;
209
+ esac
210
+ value="${!key}"
211
+ if [ -n "$value" ]; then
212
+ echo "Syncing $key to Vercel (${{ env.DEPLOY_VERCEL_ENV }})..."
213
+ echo "$value" | vercel env rm "$key" ${{ env.DEPLOY_VERCEL_ENV }} --yes --token=$VERCEL_TOKEN 2>/dev/null || true
214
+ echo "$value" | vercel env add "$key" ${{ env.DEPLOY_VERCEL_ENV }} --token=$VERCEL_TOKEN
223
215
  fi
224
216
  done
225
- "
217
+ '
226
218
  env:
227
219
  DOTENV_PRIVATE_KEY_PRODUCTION: ${{ secrets.DOTENV_PRIVATE_KEY_PRODUCTION }}
228
- DOTENV_PRIVATE_KEY_STAGING: ${{ secrets.DOTENV_PRIVATE_KEY_STAGING }}
229
- DOTENV_PRIVATE_KEY_DEVELOP: ${{ secrets.DOTENV_PRIVATE_KEY_DEVELOP }}
230
220
 
231
221
  # Re-pull after sync
232
- - name: Re-pull Vercel Environment
233
- if: steps.check.outputs.should_deploy == 'true'
222
+ - name: Re-pull Vercel Environment after sync
223
+ if: github.ref_name == 'main'
234
224
  run: vercel pull --yes --environment=${{ env.DEPLOY_VERCEL_ENV }} --token=$VERCEL_TOKEN
235
225
 
236
226
  # Vercel build (dotenvxでアプリ環境変数を注入)
237
227
  - name: Build Project
238
- if: steps.check.outputs.should_deploy == 'true'
239
228
  run: |
240
229
  npx dotenvx run -f ${{ env.DEPLOY_DOTENV_FILE }} -- \
241
230
  vercel build ${{ env.DEPLOY_PROD_FLAG }} --token=$VERCEL_TOKEN
@@ -246,14 +235,31 @@ jobs:
246
235
 
247
236
  # Vercel deploy
248
237
  - name: Deploy to Vercel
249
- if: steps.check.outputs.should_deploy == 'true'
250
238
  id: deploy
251
239
  run: |
252
- DEPLOY_URL=$(vercel deploy --prebuilt ${{ env.DEPLOY_PROD_FLAG }} --token=$VERCEL_TOKEN)
253
- echo "url=$DEPLOY_URL" >> $GITHUB_OUTPUT
254
- echo "Deployed to: $DEPLOY_URL"
240
+ npx dotenvx run -f $DEPLOY_DOTENV_FILE -- bash -c '
241
+ declare -a ENV_FLAGS=()
242
+ while IFS= read -r key; do
243
+ case "$key" in
244
+ NEON_*|VERCEL_ALIAS_DOMAIN_*|DOTENV_PUBLIC_KEY_*) continue ;;
245
+ esac
246
+ value="${!key}"
247
+ if [ -n "$value" ]; then
248
+ echo "::add-mask::${value}"
249
+ fi
250
+ ENV_FLAGS+=("--env" "${key}=${value}")
251
+ done < <(grep -E "^[A-Z_][A-Z0-9_]*=\"?encrypted:" "$DEPLOY_DOTENV_FILE" | cut -d= -f1)
252
+
253
+ echo "Deploying with ${#ENV_FLAGS[@]} runtime env vars..."
254
+ DEPLOY_URL=$(vercel deploy --prebuilt $DEPLOY_PROD_FLAG "${ENV_FLAGS[@]}" --token="$VERCEL_TOKEN")
255
+ echo "url=$DEPLOY_URL" >> "$GITHUB_OUTPUT"
256
+ '
257
+ env:
258
+ DOTENV_PRIVATE_KEY_PRODUCTION: ${{ secrets.DOTENV_PRIVATE_KEY_PRODUCTION }}
259
+ DOTENV_PRIVATE_KEY_STAGING: ${{ secrets.DOTENV_PRIVATE_KEY_STAGING }}
260
+ DOTENV_PRIVATE_KEY_DEVELOP: ${{ secrets.DOTENV_PRIVATE_KEY_DEVELOP }}
255
261
 
256
262
  # Alias (develop/stagingのみ)
257
263
  - name: Set Vercel alias
258
- if: steps.check.outputs.should_deploy == 'true' && env.DEPLOY_RUN_ALIAS == 'true'
264
+ if: env.DEPLOY_RUN_ALIAS == 'true'
259
265
  run: vercel alias ${{ steps.deploy.outputs.url }} "${{ env.VERCEL_ALIAS_DOMAIN }}" --token=$VERCEL_TOKEN
@@ -32,18 +32,8 @@
32
32
  ]
33
33
  },
34
34
  "serena": {
35
- "type": "stdio",
36
- "command": "uvx",
37
- "args": [
38
- "--from",
39
- "git+https://github.com/oraios/serena",
40
- "serena",
41
- "start-mcp-server",
42
- "--context",
43
- "claude-code",
44
- "--open-web-dashboard",
45
- "false"
46
- ]
35
+ "type": "http",
36
+ "url": "http://127.0.0.1:${SERENA_PORT:-9850}/mcp"
47
37
  },
48
38
  "github": {
49
39
  "type": "http",
@@ -107,3 +107,10 @@ fixed_tools: []
107
107
  # override of the corresponding setting in serena_config.yml, see the documentation there.
108
108
  # If null or missing, the value from the global config is used.
109
109
  symbol_info_budget:
110
+
111
+ # The language backend to use for this project.
112
+ # If not set, the global setting from serena_config.yml is used.
113
+ # Valid values: LSP, JetBrains
114
+ # Note: the backend is fixed at startup. If a project with a different backend
115
+ # is activated post-init, an error will be returned.
116
+ language_backend:
@@ -11,6 +11,15 @@
11
11
  4. **直接実装の禁止**: あなたは絶対に直接実装を行わない。すべての作業はsubagentに委託し、可能な限り並行で呼び出す。サブエージェントの出力はユーザにも見える場所に出力すること
12
12
  5. **実装品質の自己検証**: 複雑な変更では完了前に「よりエレガントな方法はないか」を自問する。ただし単純な修正には不要
13
13
 
14
+ ## Agent Teams の使用制限
15
+
16
+ **Agent Teams(`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS`)はユーザーが明示的にチーム編成を指示した場合のみ使用すること。**
17
+
18
+ - 通常のタスクではサブエージェント(`Task`ツール)を使用する
19
+ - 「チームで」「複数agentで並列に」等の明示的な指示があった場合のみAgent Teamsを起動する
20
+ - チーム実行時は `einja-team-exec` Skillの手順に従う
21
+ - 判断に迷う場合はサブエージェントを使用する(デフォルト動作)
22
+
14
23
  ## サブエージェント委託ルール
15
24
 
16
25
  #### カスタムサブエージェント(直接委託)
@@ -31,7 +40,9 @@
31
40
  | `einja-task-commit` | コミット・プッシュ |
32
41
  | `einja-conflict-resolver` | gitコンフリクト解消 |
33
42
  | `einja-skill-creator` | Skill作成・更新 |
43
+ | `einja-skill-first` | 作業前のSkill作成必要性評価(Plan/spec-create時に自動起動) |
34
44
  | `einja-infra-maintenance` | インフラ環境セットアップ・メンテナンス |
45
+ | `einja:issue-exec` | Issue全体の階層的並列実行(Manager→Director→Worker) |
35
46
  | `einja:task-exec` | タスクグループ実行 |
36
47
  | `einja:spec-create` | 仕様書作成 |
37
48
 
@@ -41,9 +52,16 @@
41
52
 
42
53
  ### 必須フロー
43
54
  1. 問題・要件を調査・分析する
44
- 2. 修正計画を `docs/plans/` に作成し提示する
45
- 3. **ユーザーの明示的な承認を得る**
46
- 4. 承認後、`docs/plans/todo-{plan名}.md` で進捗管理しながら実装を開始する
55
+ 2. 修正計画を `docs/plans/` に作成する
56
+ 3. `einja-skill-first` で「Skill を先に作るべきか」を評価する
57
+ - Plan mode中は `UserPromptSubmit` hookにより自動でリマインダーが注入される
58
+ - `.claude/skills/einja-skill-first/SKILL.md` を読み込んで評価を実施する
59
+ - 推奨判定 → AskUserQuestion でユーザーに提案
60
+ - 承認 → 計画の TODO-0 に Skill 作成を追加
61
+ - 不要判定 → そのまま次へ進む
62
+ - ※ スキップ基準に該当する場合は評価自体を省略
63
+ 4. 計画をユーザーに提示し、**明示的な承認を得る**
64
+ 5. 承認後、`docs/plans/todo-{plan名}.md` で進捗管理しながら実装を開始する(TODO-0 があれば Skill 作成から)
47
65
 
48
66
  ### 例外(承認不要)
49
67
  - 読み取り専用操作(質問への回答、情報調査、コード調査)
@@ -109,7 +127,7 @@
109
127
 
110
128
  Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は以下のSkillを参照:
111
129
  - `einja-project-overview` - 構成、技術スタック、頻出コマンド
112
- - `einja-coding-standards` - コーディング規約、インポートパス規約
130
+ - `docs/einja/steering/development/coding-standards.md` - コーディング規約、インポートパス規約
113
131
  - `einja-infra-maintenance` - 開発環境セットアップ、サーバー管理
114
132
 
115
133
  ## マネージドディレクトリ(編集禁止)
@@ -189,6 +207,10 @@ Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は
189
207
  - サブエージェントの「完了」報告のみで完了判定しない
190
208
  - 検証をスキップして完了宣言しない
191
209
 
210
+ <!-- @einja:project-private:start id="claude-md-project" -->
211
+ <!-- プロジェクト固有の情報を記入 -->
212
+ <!-- @einja:project-private:end -->
213
+
192
214
  <!-- @einja:excluded:start -->
193
215
  ## このリポジトリ限定の設定
194
216
 
@@ -203,6 +225,7 @@ Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は
203
225
  | `einja cli` `@einja/dev-cli` `公開` `リリース` `publish` `release` | `.claude/skills/dev-cli-release/SKILL.md` |
204
226
  | `create-einja-app` | `.claude/skills/create-einja-app-release/SKILL.md` |
205
227
  | `インフラ` `環境変数管理` `Vercel` `Neon` `デプロイ設定` `GitHub Secrets` `環境セットアップ` `GitHub Actions` `CI/CD` `ワークフロー` | `.claude/skills/einja-infra-maintenance/SKILL.md` |
228
+ | `Skill作るべき?` `Skill化` `skill-first` `Skill-first` | `.claude/skills/einja-skill-first/SKILL.md` |
206
229
 
207
230
  ### CLIパッケージの二重管理禁止
208
231
 
@@ -218,6 +241,7 @@ Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は
218
241
  | `.vscode/settings.json` | `presets/default/.vscode/settings.json` | 単純コピー |
219
242
  | `docs/einja/` (memory,cli除く) | `presets/default/docs/einja/` | 単純コピー(sync + init対象) |
220
243
  | `CLAUDE.md` | `presets/default/CLAUDE.md.template` | **変換生成** |
244
+ | `scripts/` (`_`プレフィクス除く) | `presets/default/scripts/` | 単純コピー |
221
245
 
222
246
  **コピー先のファイルは直接編集禁止**(ビルド時に上書きされる)
223
247
  <!-- @einja:excluded:end -->
@@ -288,8 +288,8 @@ rm -rf .turbo apps/*/.turbo packages/*/.turbo
288
288
 
289
289
  詳細は以下のドキュメントを参照してください:
290
290
 
291
- - [コーディング規約](./.claude/skills/einja-coding-standards/SKILL.md)
292
- - [コンポーネント設計ガイドライン](./.claude/skills/einja-component-design/SKILL.md)
291
+ - [コーディング規約](./docs/einja/steering/development/coding-standards.md)
292
+ - [コンポーネント設計ガイドライン](./docs/einja/steering/development/component-design.md)
293
293
  - [テスト戦略](./docs/einja/steering/development/testing-strategy.md)
294
294
  - [コードレビューガイドライン](./docs/einja/steering/development/review-guidelines.md)
295
295
  - [コミットルール](./docs/einja/steering/commit-rules.md)
@@ -28,7 +28,7 @@
28
28
  "clsx": "^2.1.1",
29
29
  "date-fns": "^4.1.0",
30
30
  "lucide-react": "^0.523.0",
31
- "next": "15.3.3",
31
+ "next": "15.3.9",
32
32
  "next-auth": "^5.0.0-beta.28",
33
33
  "next-themes": "^0.4.6",
34
34
  "postcss": "^8.5.6",
@@ -8,7 +8,8 @@
8
8
  ],
9
9
  "paths": {
10
10
  "@/*": [
11
- "./src/*"
11
+ "./src/*",
12
+ "../../packages/server-core/src/*"
12
13
  ],
13
14
  "@admin/*": [
14
15
  "./src/*",
@@ -28,7 +28,7 @@
28
28
  "bcryptjs": "^3.0.2",
29
29
  "clsx": "^2.1.1",
30
30
  "lucide-react": "^0.523.0",
31
- "next": "15.3.3",
31
+ "next": "15.3.9",
32
32
  "next-auth": "^5.0.0-beta.28",
33
33
  "next-themes": "^0.4.6",
34
34
  "postcss": "^8.5.6",
@@ -8,7 +8,8 @@
8
8
  ],
9
9
  "paths": {
10
10
  "@/*": [
11
- "./src/*"
11
+ "./src/*",
12
+ "../../packages/server-core/src/*"
12
13
  ],
13
14
  "@web/*": [
14
15
  "./src/*",
File without changes