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,78 @@
1
+ # packages層の相対パスインポート禁止を強制する
2
+
3
+ ## Context
4
+
5
+ import-conventions.md で「`../` や `./` を使用しない」と規定されているが、packages層では強制手段がなく、29ファイルで `../../` 形式の相対パスが使われている。TSConfig paths エイリアス(`@/`)を追加し、既存の相対パスインポートを書き換える。
6
+
7
+ ## 対象ファイル数
8
+
9
+ | パッケージ | 違反ファイル数 | 備考 |
10
+ |-----------|-------------|------|
11
+ | packages/server-core | 8件 | vitest.config.ts に `@/` alias 定義済み |
12
+ | packages/cli | 13件 | vitest alias 追加必要 |
13
+ | packages/create-einja-app | 8件 | テストファイル中心 |
14
+
15
+ ## 実施内容
16
+
17
+ ### Step 1: TSConfig paths 追加(3ファイル)
18
+
19
+ 各パッケージの `tsconfig.json` に `paths` を追加。IDEの補完・型チェックで `@/` が使えるようになる。
20
+
21
+ ```json
22
+ "compilerOptions": {
23
+ "paths": {
24
+ "@/*": ["./src/*"]
25
+ }
26
+ }
27
+ ```
28
+
29
+ 対象:
30
+ - `packages/server-core/tsconfig.json`
31
+ - `packages/cli/tsconfig.json`
32
+ - `packages/create-einja-app/tsconfig.json`(テスト用に `tests/` へのalias も検討)
33
+
34
+ ### Step 2: vitest.config.ts の alias 追加(2ファイル)
35
+
36
+ server-core は既に定義済み。cli と create-einja-app に追加。
37
+
38
+ ```typescript
39
+ resolve: {
40
+ alias: {
41
+ "@": path.resolve(__dirname, "./src"),
42
+ },
43
+ },
44
+ ```
45
+
46
+ 対象:
47
+ - `packages/cli/vitest.config.ts`(存在確認要)
48
+ - `packages/create-einja-app/vitest.config.ts`(存在確認要)
49
+
50
+ ### Step 3: 相対パスインポートを `@/` に書き換え(29ファイル)
51
+
52
+ 例:
53
+ ```typescript
54
+ // Before
55
+ import type { User } from "../../../domain/entities/User";
56
+ import { type Result, failure, success } from "../../../core/result";
57
+
58
+ // After
59
+ import type { User } from "@/domain/entities/User";
60
+ import { type Result, failure, success } from "@/core/result";
61
+ ```
62
+
63
+ ### Step 4: ドキュメント更新(1ファイル)
64
+
65
+ `.claude/skills/einja-coding-standards/references/import-conventions.md` の禁止事項セクションを更新:
66
+ - packages層でも `@/` エイリアスを使用する旨を明記
67
+ - 各パッケージの `@/` が何を指すか記載
68
+
69
+ ### Step 5: 検証
70
+
71
+ - `pnpm typecheck` — 型チェック通過
72
+ - `pnpm test` — テスト通過(server-core, cli, create-einja-app)
73
+ - `pnpm build` — ビルド通過
74
+ - `grep` で `../../` が残っていないことを確認
75
+
76
+ ## Lint強制について
77
+
78
+ Biomeの `noRestrictedImports` は完全一致のみでパターンマッチ不可。自動検出は不可のため、コードレビュー + ドキュメントで担保する。
@@ -0,0 +1,56 @@
1
+ # CLAUDE.md ベストプラクティス統合
2
+
3
+ ## Context
4
+
5
+ 外部CLAUDE.mdベストプラクティスとの差分分析を行い、Codex分析・Planレビューの結果を踏まえて、取り入れるべき4つの改善を特定した。
6
+
7
+ ## 対象ファイル
8
+
9
+ - `CLAUDE.md`
10
+
11
+ ## 変更内容
12
+
13
+ ### 変更1: 基本原則に「設計の見直し」追加(L11の後)
14
+
15
+ ```markdown
16
+ 5. **設計の見直し**: 複雑な変更では実装前に「より良い設計はないか」を検討する。ただし単純な修正には不要
17
+ ```
18
+
19
+ ### 変更2: ブロッカー対応テーブルに汎用ルール追加(L68の後)
20
+
21
+ ```markdown
22
+ | 想定外の事態全般 | **即座に停止**。無理に推し進めず再計画 |
23
+ ```
24
+
25
+ ### 変更3: 完了判定の必須チェックに差分確認追加(L172の後)
26
+
27
+ ```markdown
28
+ - [ ] `git diff` で意図しない変更が混入していないことを確認(`git diff --stat` で変更ファイル一覧を確認)
29
+ ```
30
+
31
+ ### 変更4: 報告ルールセクションに進捗報告追加(L142-149)
32
+
33
+ セクション名を変更し、進捗報告ルールを追加:
34
+
35
+ **Before:**
36
+ ```markdown
37
+ ## サブエージェント結果報告のルール
38
+ ```
39
+
40
+ **After:**
41
+ ```markdown
42
+ ## 報告ルール
43
+ ```
44
+
45
+ L149の後に追加:
46
+ ```markdown
47
+ ### 進捗報告の原則
48
+ - 複数ステップのタスクでは、各ステップ完了時にユーザーへ進捗を報告する
49
+ - 完了した作業と次のステップを簡潔に示す
50
+ - 問題が発生した場合は即座に共有する
51
+ ```
52
+
53
+ ## 検証方法
54
+
55
+ - CLAUDE.mdの各変更箇所をReadで確認
56
+ - 既存ルールとの矛盾がないことを目視確認
@@ -0,0 +1,210 @@
1
+ # Vercel環境変数競合解消 + デプロイジョブ動的マトリクス化
2
+
3
+ ## Context
4
+
5
+ 参照コミット:
6
+ 1. https://github.com/drlovekoushiki/drlove_demo_app/commit/565dd31 (env競合解消)
7
+ 2. https://github.com/drlovekoushiki/drlove_demo_app/commit/1ad3045 (変更検知フィルタ追加)
8
+ 3. https://github.com/drlovekoushiki/drlove_demo_app/commit/2cf8bbf (動的マトリクス化)
9
+ 4. https://github.com/drlovekoushiki/drlove_demo_app/commit/d12f7c4 (エッジケース対応)
10
+
11
+ **問題1**: PR環境で`vercel env add`が重複追加・並行PR競合を起こす
12
+ **問題2**: 変更がないアプリもデプロイジョブが走り、各ステップで`should_deploy`条件分岐が冗長
13
+ **問題3**: grep正規表現が数字含む変数名に非対応、空文字値の未注入、changesジョブ失敗時ガード不足
14
+
15
+ **解決方針**:
16
+ - PR環境: `vercel env add`を廃止し、`--env`フラグで実行時注入
17
+ - stable branches: mainブランチのみ`vercel env add`、他は`--env`注入
18
+ - 変更検知フィルタに`.github/workflows/**`を追加
19
+ - 動的マトリクスで変更のあるアプリのみジョブを生成
20
+ - エッジケース修正を最初から反映
21
+
22
+ ## 変更対象ファイル
23
+
24
+ | ファイル | 変更内容 |
25
+ |---------|---------|
26
+ | `.github/workflows/deploy-pr-preview.yml` | env sync削除、deploy時`--env`注入 |
27
+ | `.github/workflows/deploy-stable-branches.yml` | 動的マトリクス化、env syncをmain限定、deploy時`--env`注入、フィルタ追加 |
28
+ | `docs/einja/steering/infrastructure/deployment.md` | フロー図・説明を新方式に更新 |
29
+ | `docs/einja/instructions/vercel-cli-reference.md` | 環境変数同期セクションを新方式に更新 |
30
+ | `.claude/skills/einja-infra-maintenance/SKILL.md` | env sync説明をmain限定+`--env`注入に更新 |
31
+
32
+ ## 詳細変更計画
33
+
34
+ ### 1. deploy-pr-preview.yml
35
+
36
+ #### 1a. 「Sync environment variables to Vercel」ステップを削除(L264-282)
37
+
38
+ 現在のL264-282にある`vercel env rm`/`vercel env add`ループを完全削除。
39
+
40
+ #### 1b. 「Deploy to Vercel」ステップを変更(L294-300)
41
+
42
+ **変更後:**
43
+ ```yaml
44
+ - name: Deploy to Vercel
45
+ id: deploy
46
+ run: |
47
+ npx dotenvx run -f $GITHUB_WORKSPACE/.env.preview -- bash -c '
48
+ declare -a ENV_FLAGS=()
49
+ while IFS= read -r key; do
50
+ case "$key" in
51
+ NEON_*|DOTENV_PUBLIC_KEY_*) continue ;;
52
+ esac
53
+ value="${!key}"
54
+ if [ -n "$value" ]; then
55
+ echo "::add-mask::${value}"
56
+ fi
57
+ ENV_FLAGS+=("--env" "${key}=${value}")
58
+ done < <(grep -E "^[A-Z_][A-Z0-9_]*=\"?encrypted:" "$GITHUB_WORKSPACE/.env.preview" | cut -d= -f1)
59
+
60
+ # DATABASE_URLはNeon APIから取得した値を注入(.env.previewには含まれない)
61
+ ENV_FLAGS+=("--env" "DATABASE_URL=${DATABASE_URL}")
62
+
63
+ echo "Deploying with ${#ENV_FLAGS[@]} runtime env vars..."
64
+ DEPLOY_URL=$(vercel deploy --prebuilt "${ENV_FLAGS[@]}" --token="$VERCEL_TOKEN")
65
+ echo "url=$DEPLOY_URL" >> "$GITHUB_OUTPUT"
66
+ '
67
+ env:
68
+ DOTENV_PRIVATE_KEY_PREVIEW: ${{ secrets.DOTENV_PRIVATE_KEY_PREVIEW }}
69
+ DATABASE_URL: ${{ steps.db-urls.outputs.db_url_pooled }}
70
+ ```
71
+
72
+ **反映済みエッジケース修正(コミット#4):**
73
+ - grep正規表現: `[A-Z_][A-Z0-9_]*`(数字含む変数名対応)
74
+ - `ENV_FLAGS+=`を`if`の外に配置(空文字値も`--env`注入)
75
+
76
+ ### 2. deploy-stable-branches.yml
77
+
78
+ #### 2a. changesジョブ: フィルタ追加 + 動的マトリクス構築
79
+
80
+ ```yaml
81
+ outputs:
82
+ web: ${{ steps.filter.outputs.web }}
83
+ admin: ${{ steps.filter.outputs.admin }}
84
+ deploy_matrix: ${{ steps.matrix.outputs.matrix }} # 追加
85
+ ```
86
+
87
+ web/admin両方のフィルタに`.github/workflows/**`追加。新規ステップ追加:
88
+
89
+ ```yaml
90
+ - name: Build deploy matrix
91
+ id: matrix
92
+ run: |
93
+ MATRIX='[]'
94
+ if [ "${{ steps.filter.outputs.web }}" = "true" ]; then
95
+ MATRIX=$(echo "$MATRIX" | jq -c '. + [{"app": "web"}]')
96
+ fi
97
+ if [ "${{ steps.filter.outputs.admin }}" = "true" ]; then
98
+ MATRIX=$(echo "$MATRIX" | jq -c '. + [{"app": "admin"}]')
99
+ fi
100
+ echo "matrix=$MATRIX" >> $GITHUB_OUTPUT
101
+ ```
102
+
103
+ #### 2b. deployジョブ: 動的マトリクスに変更 + should_deploy全削除
104
+
105
+ ```yaml
106
+ deploy:
107
+ needs: [ci, migrate, changes]
108
+ if: always() && needs.ci.result == 'success' && (needs.migrate.result == 'success' || needs.migrate.result == 'skipped') && needs.changes.result == 'success' && needs.changes.outputs.deploy_matrix != '[]'
109
+ runs-on: ubuntu-latest
110
+ strategy:
111
+ fail-fast: false
112
+ matrix:
113
+ include: ${{ fromJSON(needs.changes.outputs.deploy_matrix) }}
114
+ ```
115
+
116
+ - 「Check if deploy is needed」ステップを完全削除
117
+ - 全ステップから`if: steps.check.outputs.should_deploy == 'true'`を削除
118
+ - `Extract alias domain`と`Set Vercel alias`は`if: env.DEPLOY_RUN_ALIAS == 'true'`のみに
119
+
120
+ #### 2c. env sync関連をmainブランチ限定に + grep修正
121
+
122
+ if条件を変更し、grep正規表現も数字含む変数名に対応:
123
+
124
+ ```yaml
125
+ - name: Sync environment variables to Vercel
126
+ if: github.ref_name == 'main'
127
+ run: |
128
+ npx dotenvx run -f ${{ env.DEPLOY_DOTENV_FILE }} -- bash -c '
129
+ grep -E "^[A-Z_][A-Z0-9_]*=\"?encrypted:" ${{ env.DEPLOY_DOTENV_FILE }} | cut -d= -f1 | while read -r key; do
130
+ case "$key" in
131
+ NEON_*) continue ;;
132
+ esac
133
+ value="${!key}"
134
+ if [ -n "$value" ]; then
135
+ echo "Syncing $key to Vercel (${{ env.DEPLOY_VERCEL_ENV }})..."
136
+ echo "$value" | vercel env rm "$key" ${{ env.DEPLOY_VERCEL_ENV }} --yes --token=$VERCEL_TOKEN 2>/dev/null || true
137
+ echo "$value" | vercel env add "$key" ${{ env.DEPLOY_VERCEL_ENV }} --token=$VERCEL_TOKEN
138
+ fi
139
+ done
140
+ '
141
+ env:
142
+ DOTENV_PRIVATE_KEY_PRODUCTION: ${{ secrets.DOTENV_PRIVATE_KEY_PRODUCTION }}
143
+ DOTENV_PRIVATE_KEY_STAGING: ${{ secrets.DOTENV_PRIVATE_KEY_STAGING }}
144
+ DOTENV_PRIVATE_KEY_DEVELOP: ${{ secrets.DOTENV_PRIVATE_KEY_DEVELOP }}
145
+ ```
146
+
147
+ ```yaml
148
+ - name: Re-pull Vercel Environment after sync
149
+ if: github.ref_name == 'main'
150
+ ```
151
+
152
+ #### 2d. 「Deploy to Vercel」ステップを`--env`注入に変更
153
+
154
+ ```yaml
155
+ - name: Deploy to Vercel
156
+ id: deploy
157
+ run: |
158
+ npx dotenvx run -f $DEPLOY_DOTENV_FILE -- bash -c '
159
+ declare -a ENV_FLAGS=()
160
+ while IFS= read -r key; do
161
+ case "$key" in
162
+ NEON_*|VERCEL_ALIAS_DOMAIN_*|DOTENV_PUBLIC_KEY_*) continue ;;
163
+ esac
164
+ value="${!key}"
165
+ if [ -n "$value" ]; then
166
+ echo "::add-mask::${value}"
167
+ fi
168
+ ENV_FLAGS+=("--env" "${key}=${value}")
169
+ done < <(grep -E "^[A-Z_][A-Z0-9_]*=\"?encrypted:" "$DEPLOY_DOTENV_FILE" | cut -d= -f1)
170
+
171
+ echo "Deploying with ${#ENV_FLAGS[@]} runtime env vars..."
172
+ DEPLOY_URL=$(vercel deploy --prebuilt $DEPLOY_PROD_FLAG "${ENV_FLAGS[@]}" --token="$VERCEL_TOKEN")
173
+ echo "url=$DEPLOY_URL" >> "$GITHUB_OUTPUT"
174
+ '
175
+ env:
176
+ DOTENV_PRIVATE_KEY_PRODUCTION: ${{ secrets.DOTENV_PRIVATE_KEY_PRODUCTION }}
177
+ DOTENV_PRIVATE_KEY_STAGING: ${{ secrets.DOTENV_PRIVATE_KEY_STAGING }}
178
+ DOTENV_PRIVATE_KEY_DEVELOP: ${{ secrets.DOTENV_PRIVATE_KEY_DEVELOP }}
179
+ ```
180
+
181
+ **注意**: このプロジェクトでは`DEPLOY_VERCEL_TARGET_FLAG`ではなく`DEPLOY_PROD_FLAG`を使用。
182
+
183
+ ### 3. docs/einja/steering/infrastructure/deployment.md
184
+
185
+ 更新箇所:
186
+ - PRプレビューフローのmermaid図: `環境変数同期` → `vercel deploy --env(実行時注入)`
187
+ - Stableブランチフローのmermaid図: mainのみ環境変数同期、他は`--env`注入
188
+ - フローチャート: 動的マトリクスで変更アプリのみデプロイ
189
+ - 同時PR運用時の注意: 全encrypted環境変数`--env`注入の説明に更新
190
+ - Vercel環境変数の自動同期: mainブランチ限定を明記
191
+ - ワークフロー一覧テーブル: 動的マトリクス、`--env`注入の説明追加
192
+
193
+ ### 4. docs/einja/instructions/vercel-cli-reference.md
194
+
195
+ 更新箇所:
196
+ - 環境変数同期自動化セクション: mainのみ`vercel env add`、他は`--env`注入
197
+ - CI/CD非対話パターン表: `vercel deploy --env`の使い方追記
198
+
199
+ ### 5. .claude/skills/einja-infra-maintenance/SKILL.md
200
+
201
+ 更新箇所:
202
+ - 環境変数同期の説明: mainのみ`vercel env add`、他は`--env`注入
203
+ - ワークフロー一覧テーブル: 動的マトリクス、`--env`注入の説明追加
204
+ - 競合回避ルール: env syncがmain限定であることを明記
205
+
206
+ ## 検証方法
207
+
208
+ 1. YAML構文チェック(両ファイル)
209
+ 2. `git diff --stat`で変更が5ファイルのみであることを確認
210
+ 3. PR作成後にActionsでの動作確認(推奨)
@@ -0,0 +1,122 @@
1
+ # サブエージェント質問プロトコル(PENDING_QUESTIONS)導入
2
+
3
+ ## Context
4
+
5
+ Claude Code v2.0.56以降、**サブエージェントではAskUserQuestionがシステムレベルでフィルタリングされ動作しない**(GitHub Issue [#12890](https://github.com/anthropics/claude-code/issues/12890), [#20275](https://github.com/anthropics/claude-code/issues/20275)で確認済み)。また**CLAUDE.mdはサブエージェントに自動ロードされない**。
6
+
7
+ 現在8つのエージェントがAskUserQuestionを参照しているが、全て動作しない。Agent toolの`resume`パラメータ(コンテキスト維持で再開)を活用し、親経由で質問するプロトコルを導入する。
8
+
9
+ ## 変更方針
10
+
11
+ - **共通Skill**にプロトコルを1箇所だけ定義し、全エージェントに`skills:`でpreload
12
+ - **CLAUDE.md**に親側のハンドリングルールを追加
13
+ - 各エージェントの既存AskUserQuestion YAML例は**参照情報として残し**、PENDING_QUESTIONS形式の使用例を併記
14
+
15
+ ## 変更内容
16
+
17
+ ### 1. 共通Skill作成(新規)
18
+ **パス**: `.claude/skills/einja-subagent-question-protocol/SKILL.md`
19
+
20
+ 内容:
21
+ - サブエージェントではAskUserQuestionが動作しない旨の説明
22
+ - PENDING_QUESTIONSフォーマット定義(具体的な出力例付き)
23
+ - AskUserQuestion YAML → PENDING_QUESTIONS形式の変換ガイド
24
+ - ルール: 1回にまとめる、選択肢と背景・影響を含める、resumeで再開後に作業継続
25
+
26
+ フォーマット例:
27
+ ```markdown
28
+ ## PENDING_QUESTIONS
29
+
30
+ 以下の不明点の解消が必要です。
31
+
32
+ ### Q1: [質問タイトル]
33
+ **背景**: [なぜこの質問が必要か]
34
+
35
+ | 選択肢 | 説明 | メリット | デメリット |
36
+ |--------|------|----------|------------|
37
+ | A: [ラベル] | [詳細] | [メリット] | [デメリット] |
38
+ | B: [ラベル] | [詳細] | [メリット] | [デメリット] |
39
+
40
+ **推奨**: A([理由])
41
+ ```
42
+
43
+ ### 2. CLAUDE.md(親側ハンドリング追加)
44
+ **パス**: `CLAUDE.md`
45
+
46
+ 「サブエージェント委託ルール」セクション内に追加:
47
+
48
+ ```markdown
49
+ ### サブエージェント質問プロトコル(PENDING_QUESTIONS)
50
+
51
+ サブエージェント出力に `## PENDING_QUESTIONS` が含まれている場合:
52
+ 1. 質問内容を解析し、AskUserQuestionでユーザーに確認
53
+ 2. Agent toolの`resume`パラメータで同じサブエージェントを再開(コンテキスト維持)
54
+ 3. プロンプトにユーザーの回答を含めて渡す
55
+ 4. 再度PENDING_QUESTIONSがある場合は同様に処理(最大2回まで)
56
+ ```
57
+
58
+ ### 3. 全エージェント定義の更新
59
+
60
+ #### 3a. issue-specs系(`skills:` フィールド追加 + 「優先順位3」書き換え)
61
+
62
+ | ファイル | 変更 |
63
+ |---|---|
64
+ | `requirements-generator.md` | `skills:` 追加 + 49-52行目をプロトコル参照1行に |
65
+ | `design-generator.md` | `skills:` 追加 + 103-107行目をプロトコル参照1行に |
66
+ | `qa-generator.md` | `skills:` 追加 + 62行目をプロトコル参照1行に |
67
+ | `tasks-generator.md` | `skills:` 追加 + 95行目をプロトコル参照1行に |
68
+
69
+ 書き換え後:
70
+ ```markdown
71
+ - **優先順位3: ユーザーへの確認(最終手段)**
72
+ - 上記の方法で解決できない場合、preload済みの「サブエージェント質問プロトコル」に従いPENDING_QUESTIONS形式で質問を返却して停止する
73
+ ```
74
+
75
+ #### 3b. task系・architect系(`skills:` にpreload追加 + AskUserQuestion部分に注釈追加)
76
+
77
+ | ファイル | 変更 |
78
+ |---|---|
79
+ | `task-executer.md` | `skills: []` に追加 + AskUserQuestion YAML例の前に「⚠️ サブエージェントではAskUserQuestionは動作しない。代わりにPENDING_QUESTIONS形式で返却すること」注釈を追加 |
80
+ | `task-reviewer.md` | `skills:` 追加 + 同様の注釈 |
81
+ | `frontend-architect.md` | `skills:` に追加 + 同様の注釈 |
82
+ | `backend-architect.md` | `skills:` に追加 + 同様の注釈 |
83
+
84
+ **注釈の形式**(各AskUserQuestion YAML例の直前に挿入):
85
+ ```markdown
86
+ > ⚠️ サブエージェントではAskUserQuestionは動作しません。
87
+ > 以下のYAML例は「どんな質問をすべきか」の参照情報です。
88
+ > 実際にはpreload済みの「サブエージェント質問プロトコル」に従い、
89
+ > PENDING_QUESTIONS形式で質問を返却して停止してください。
90
+ ```
91
+
92
+ これにより既存YAML例の情報(選択肢・description・推奨理由)を完全に保持しつつ、プロトコルへの誘導を行う。
93
+
94
+ ### 4. 変更不要なエージェント
95
+
96
+ Explore, tasks-validator, task-qa(Skill側で処理済み), task-modification-analyzer, docs-updater, codex-agent, design-engineer, frontend-coder, ui-design-generator
97
+
98
+ ## 変更ファイルまとめ
99
+
100
+ | # | ファイル | 操作 |
101
+ |---|---|---|
102
+ | 1 | `.claude/skills/einja-subagent-question-protocol/SKILL.md` | **新規作成** |
103
+ | 2 | `CLAUDE.md` | 親側ハンドリング追加 |
104
+ | 3 | `.claude/agents/einja/issue-specs/requirements-generator.md` | skills追加 + 記述置換 |
105
+ | 4 | `.claude/agents/einja/issue-specs/design-generator.md` | skills追加 + 記述置換 |
106
+ | 5 | `.claude/agents/einja/issue-specs/qa-generator.md` | skills追加 + 記述置換 |
107
+ | 6 | `.claude/agents/einja/issue-specs/tasks-generator.md` | skills追加 + 記述置換 |
108
+ | 7 | `.claude/agents/einja/task/task-executer.md` | skills追加 + 注釈追加 |
109
+ | 8 | `.claude/agents/einja/task/task-reviewer.md` | skills追加 + 注釈追加 |
110
+ | 9 | `.claude/agents/einja/frontend-architect.md` | skills追加 + 注釈追加 |
111
+ | 10 | `.claude/agents/einja/backend-architect.md` | skills追加 + 注釈追加 |
112
+
113
+ ## 検証方法
114
+
115
+ ### 静的検証(Grep)
116
+ 1. 共通Skillファイルが存在し、PENDING_QUESTIONSフォーマット例が含まれること
117
+ 2. CLAUDE.mdに親側ハンドリングセクションが存在すること
118
+ 3. 対象8エージェントの`skills:`に`einja-subagent-question-protocol`が含まれること
119
+
120
+ ### 動作検証(手動)
121
+ 4. requirements-generatorを意図的に曖昧な要件でフォアグラウンド起動し、PENDING_QUESTIONS形式で質問が返却されることを確認
122
+ 5. 返却された質問をAskUserQuestionで確認後、resumeで再開してコンテキストが維持されていることを確認
@@ -0,0 +1,75 @@
1
+ # インポートエイリアス書き換え: packages/server-core
2
+
3
+ ## 実施日
4
+ 2026-02-26
5
+
6
+ ## 目的
7
+ packages/server-core の相対パスインポートを `@/` エイリアスに統一し、コードの可読性と保守性を向上させる。
8
+
9
+ ## 変更ファイル一覧
10
+
11
+ ### 1. tsconfig.json 修正
12
+
13
+ #### `packages/server-core/tsconfig.json`
14
+ - `paths` エイリアスを追加: `@/*` → `./src/*`
15
+
16
+ ### 2. インポートパス書き換え (8ファイル)
17
+
18
+ | ファイル | 変更内容 |
19
+ |---------|---------|
20
+ | `src/domain/entities/User.test.ts` | `../../testing` → `@/testing` |
21
+ | `src/domain/repository-interfaces/IUserRepository.ts` | `../../core/result`, `../entities/User` → `@/` 形式 |
22
+ | `src/infrastructure/database/mappers/UserMapper.ts` | `../../../domain/entities/User` → `@/domain/entities/User` |
23
+ | `src/infrastructure/database/repositories/UserRepository.ts` | 5箇所の相対パス → `@/` 形式 |
24
+ | `src/infrastructure/database/mappers/UserMapper.test.ts` | `../../../` 形式 → `@/` 形式 |
25
+ | `src/infrastructure/database/repositories/UserRepository.test.ts` | `../../../` 形式、`../client` → `@/` 形式 |
26
+ | `src/testing/factories/index.ts` | `../../__generated__/fabbrica` → `@/__generated__/fabbrica` |
27
+ | `src/testing/factories/user.factory.ts` | 4箇所の相対パス → `@/` 形式 |
28
+
29
+ ### 3. モノレポ対応 (2ファイル)
30
+
31
+ #### `apps/web/tsconfig.json`
32
+ - `paths` に `@/*` のマッピングを拡張: `["./src/*", "../../packages/server-core/src/*"]`
33
+ - server-core の `@/` エイリアスを解決できるよう設定
34
+
35
+ #### `apps/admin/tsconfig.json`
36
+ - 同上
37
+
38
+ ## 検証結果
39
+
40
+ ### TypeScript 型チェック
41
+ ```bash
42
+ pnpm prepush:typecheck
43
+ ```
44
+ ✅ 成功 - モジュール解決エラーなし
45
+
46
+ ### Vitest テスト
47
+ ```bash
48
+ pnpm --filter @repo/server-core test
49
+ ```
50
+ ✅ 全59テスト成功
51
+
52
+ ### 影響範囲
53
+ - **破壊的変更**: なし(内部的なインポートパスの変更のみ)
54
+ - **外部API**: 変更なし
55
+ - **ビルド**: 正常
56
+
57
+ ## 技術メモ
58
+
59
+ ### モノレポでのエイリアス解決
60
+ - `@/` エイリアスは **パッケージ内部の相対パス解決** のためのもの
61
+ - 他パッケージから参照する場合、参照元の tsconfig にもエイリアスマッピングが必要
62
+ - 解決方法:
63
+ 1. TypeScript Project References を使用
64
+ 2. 参照元の `paths` に参照先のエイリアスを追加(今回採用)
65
+
66
+ ### vitest.config.ts
67
+ - 既に `alias: { "@": path.resolve(__dirname, "./src") }` が設定済み
68
+ - 変更不要
69
+
70
+ ## 残存課題
71
+ なし
72
+
73
+ ## 次のステップ
74
+ - 他パッケージでも同様に `@/` エイリアス導入を検討
75
+ - `@repo/front-core` などでも統一