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.
- package/README.md +1 -1
- package/dist/cli.js +32 -16
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/templates/default/.claude/hooks/einja/plan-mode-skill-loader.sh +23 -0
- package/templates/default/.claude/settings.json +15 -1
- package/templates/default/.env.personal.example +6 -2
- package/templates/default/.envrc +5 -0
- package/templates/default/.github/workflows/deploy-pr-preview.yml +23 -24
- package/templates/default/.github/workflows/deploy-stable-branches.yml +55 -49
- package/templates/default/.mcp.json +2 -12
- package/templates/default/.serena/project.yml +7 -0
- package/templates/default/CLAUDE.md +28 -4
- package/templates/default/README.md +2 -2
- package/templates/default/apps/admin/package.json +1 -1
- package/templates/default/apps/admin/tsconfig.json +2 -1
- package/templates/default/apps/web/package.json +1 -1
- package/templates/default/apps/web/tsconfig.json +2 -1
- package/templates/default/docs/plans/.gitkeep +0 -0
- package/templates/default/docs/plans/ancient-greeting-flamingo-agent-a87e67c.md +221 -0
- package/templates/default/docs/plans/ancient-greeting-flamingo-agent-ab73a1c.md +107 -0
- package/templates/default/docs/plans/ancient-greeting-flamingo.md +120 -0
- package/templates/default/docs/plans/bright-stargazing-dawn.md +87 -0
- package/templates/default/docs/plans/calm-stirring-bonbon.md +196 -0
- package/templates/default/docs/plans/calm-watching-widget.md +111 -0
- package/templates/default/docs/plans/cheerful-wiggling-ullman.md +164 -0
- package/templates/default/docs/plans/compiled-humming-cherny.md +94 -0
- package/templates/default/docs/plans/dapper-launching-lynx.md +81 -0
- package/templates/default/docs/plans/effervescent-munching-kite-agent-ac08baf.md +672 -0
- package/templates/default/docs/plans/effervescent-munching-kite-agent-aecc373.md +442 -0
- package/templates/default/docs/plans/effervescent-munching-kite.md +263 -0
- package/templates/default/docs/plans/fix-orphan-cleaner-review.md +25 -0
- package/templates/default/docs/plans/fix-sync-template-variables.md +162 -0
- package/templates/default/docs/plans/glimmering-giggling-sedgewick.md +126 -0
- package/templates/default/docs/plans/glittery-swimming-bachman.md +78 -0
- package/templates/default/docs/plans/happy-watching-toast.md +56 -0
- package/templates/default/docs/plans/harmonic-strolling-nebula.md +210 -0
- package/templates/default/docs/plans/import-alias-refactor.md +75 -0
- package/templates/default/docs/plans/lazy-percolating-sloth-agent-abda679.md +346 -0
- package/templates/default/docs/plans/lazy-percolating-sloth.md +151 -0
- package/templates/default/docs/plans/linked-greeting-llama-agent-a7a6e5b.md +345 -0
- package/templates/default/docs/plans/linked-greeting-llama.md +467 -0
- package/templates/default/docs/plans/lovely-bubbling-rose.md +80 -0
- package/templates/default/docs/plans/optimized-watching-sprout.md +149 -0
- package/templates/default/docs/plans/peaceful-beaming-toast-agent-a292da6.md +288 -0
- package/templates/default/docs/plans/peaceful-beaming-toast-agent-a819699.md +366 -0
- package/templates/default/docs/plans/peaceful-beaming-toast-agent-ac11de2.md +474 -0
- package/templates/default/docs/plans/peaceful-beaming-toast.md +345 -0
- package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6194c.md +300 -0
- package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6900e.md +444 -0
- package/templates/default/docs/plans/purrfect-spinning-hickey.md +361 -0
- package/templates/default/docs/plans/recursive-kindling-lemon-agent-a42199e.md +186 -0
- package/templates/default/docs/plans/recursive-kindling-lemon.md +36 -0
- package/templates/default/docs/plans/seed-migration-tests.md +47 -0
- package/templates/default/docs/plans/sprightly-leaping-manatee.md +224 -0
- package/templates/default/docs/plans/stateful-wishing-lerdorf.md +161 -0
- package/templates/default/docs/plans/streamed-purring-wreath.md +40 -0
- package/templates/default/docs/plans/synthetic-percolating-pearl.md +101 -0
- package/templates/default/docs/plans/todo-fix-sync-template-variables.md +21 -0
- package/templates/default/docs/plans/todo-phase4-marker-update.md +39 -0
- package/templates/default/docs/plans/todo-skill-creator-sync.md +23 -0
- package/templates/default/docs/plans/typed-snuggling-parnas-agent-a6f6391.md +476 -0
- package/templates/default/docs/plans/typed-snuggling-parnas-agent-adb678b.md +144 -0
- package/templates/default/docs/plans/typed-snuggling-parnas.md +84 -0
- package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a30aa4f.md +534 -0
- package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a57a278.md +508 -0
- package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a90b809.md +421 -0
- package/templates/default/docs/plans/warm-hopping-lighthouse.md +199 -0
- package/templates/default/docs/verification-test.md +2 -0
- package/templates/default/gitignore +4 -0
- package/templates/default/package.json +2 -2
- package/templates/default/packages/admin-ui/package.json +1 -1
- package/templates/default/packages/server-core/tsconfig.json +6 -1
- package/templates/default/pnpm-lock.yaml +276 -57
- package/templates/default/scripts/ensure-serena.sh +75 -0
- package/templates/default/scripts/lib/worktree-config.ts +64 -0
- package/templates/default/scripts/stop-serena.sh +25 -0
- package/templates/default/scripts/worktree/dev.ts +2 -2
- /package/templates/default/scripts/{cli-template-update.ts → _cli-template-update.ts} +0 -0
- /package/templates/default/scripts/{template-update.ts → _template-update.ts} +0 -0
package/package.json
CHANGED
|
@@ -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
|
-
#
|
|
23
|
-
|
|
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=
|
package/templates/default/.envrc
CHANGED
|
@@ -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
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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.
|
|
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
|
-
|
|
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:
|
|
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環境変数の自動同期(
|
|
201
|
+
# Vercel環境変数の自動同期(mainのみ — develop/stagingは--env注入)
|
|
210
202
|
- name: Sync environment variables to Vercel
|
|
211
|
-
if:
|
|
203
|
+
if: github.ref_name == 'main'
|
|
212
204
|
run: |
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
value
|
|
219
|
-
if [ -n
|
|
220
|
-
echo
|
|
221
|
-
echo
|
|
222
|
-
echo
|
|
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:
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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:
|
|
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": "
|
|
36
|
-
"
|
|
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
|
-
|
|
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
|
|
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
|
-
- [コーディング規約](
|
|
292
|
-
- [コンポーネント設計ガイドライン](
|
|
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)
|
|
File without changes
|