create-einja-app 0.3.2 → 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 (53) hide show
  1. package/README.md +33 -0
  2. package/dist/cli.js +60 -64
  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 +5 -1
  7. package/templates/default/.claude/settings.json +14 -0
  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/.github/release.yml +10 -0
  11. package/templates/default/.github/workflows/changeset-status.yml +60 -0
  12. package/templates/default/.github/workflows/deploy-stable-branches.yml +289 -59
  13. package/templates/default/CLAUDE.md +35 -8
  14. package/templates/default/README.md +20 -8
  15. package/templates/default/docs/plans/agile-munching-knuth.md +161 -0
  16. package/templates/default/docs/plans/agile-riding-nova.md +158 -0
  17. package/templates/default/docs/plans/agile-wibbling-dusk.md +91 -0
  18. package/templates/default/docs/plans/ancient-watching-otter.md +152 -0
  19. package/templates/default/docs/plans/bright-sauteeing-bumblebee.md +30 -0
  20. package/templates/default/docs/plans/composed-doodling-mountain.md +362 -0
  21. package/templates/default/docs/plans/dazzling-foraging-cascade.md +32 -0
  22. package/templates/default/docs/plans/enchanted-wiggling-ember-agent-a5befd57d0ca4c7c7.md +177 -0
  23. package/templates/default/docs/plans/enchanted-wiggling-ember.md +170 -0
  24. package/templates/default/docs/plans/federated-questing-kahan.md +47 -0
  25. package/templates/default/docs/plans/flickering-pondering-hearth.md +26 -0
  26. package/templates/default/docs/plans/fluttering-snuggling-sprout.md +172 -0
  27. package/templates/default/docs/plans/generic-sleeping-snowglobe-agent-a41d8da.md +179 -0
  28. package/templates/default/docs/plans/generic-sleeping-snowglobe.md +108 -0
  29. package/templates/default/docs/plans/generic-snuggling-pudding.md +57 -0
  30. package/templates/default/docs/plans/idempotent-wiggling-cherny.md +122 -0
  31. package/templates/default/docs/plans/recursive-fluttering-mitten.md +176 -0
  32. package/templates/default/docs/plans/todo-create-einja-app-ux-fix.md +16 -0
  33. package/templates/default/docs/plans/todo-direnv-hang-fix.md +12 -0
  34. package/templates/default/docs/plans/todo-github-actions-release-workflow.md +34 -0
  35. package/templates/default/docs/plans/todo-issue-spec-rename.md +24 -0
  36. package/templates/default/docs/plans/todo-skill-creator-upgrade.md +18 -0
  37. package/templates/default/docs/plans/velvety-chasing-spark.md +28 -0
  38. package/templates/default/docs/plans/wondrous-strolling-crystal-agent-a0615fc.md +215 -0
  39. package/templates/default/docs/plans/wondrous-strolling-crystal.md +182 -0
  40. package/templates/default/docs/plans/zesty-roaming-steele.md +74 -0
  41. package/templates/default/gitignore +6 -2
  42. package/templates/default/package.json +6 -2
  43. package/templates/default/pnpm-lock.yaml +547 -0
  44. package/templates/default/scripts/ensure-serena.sh +2 -2
  45. package/templates/default/scripts/env-rotate-secrets.ts +66 -6
  46. package/templates/default/scripts/init-github.ts +363 -0
  47. package/templates/default/scripts/init.sh +11 -5
  48. package/templates/default/scripts/setup-dev.ts +16 -1
  49. package/templates/default/.claude/skills/create-einja-app-release/SKILL.md +0 -186
  50. package/templates/default/.claude/skills/dev-cli-release/SKILL.md +0 -173
  51. package/templates/default/.cursor/commands/spec-create.md +0 -227
  52. package/templates/default/.cursor/commands/task-exec.md +0 -287
  53. package/templates/default/.cursor/commands/update-docs-by-task-specs.md +0 -448
@@ -0,0 +1,362 @@
1
+ # GitHub Actions リリースワークフロー + 承認フロー設計
2
+
3
+ ## Context
4
+
5
+ 現在、main/staging/developへのpushで自動Vercelデプロイが走るが、GitHub Release作成・承認フローがない。リリースの可視性と本番デプロイの安全性を向上させるため、以下を導入する:
6
+
7
+ - staging マージ → GitHub **PreRelease** 自動作成
8
+ - main マージ → GitHub **Release** 自動作成
9
+ - production デプロイに **承認ゲート**(Environment Protection)
10
+
11
+ ## 設計方針
12
+
13
+ | 項目 | 決定 |
14
+ |------|------|
15
+ | リリース順序 | PRマージ → 自動リリース作成 |
16
+ | 昇格フロー | staging → main 直接マージPR |
17
+ | バージョニング | changesets(Turborepo公式推奨) |
18
+ | 承認フロー | GitHub Environments + Required Reviewer 1名(productionのみ) |
19
+
20
+ ## 全体フロー
21
+
22
+ ```
23
+ feature/* → staging PR(changeset含む)
24
+ ↓ マージ
25
+ [staging] → CI + Migrate + Deploy(承認不要)
26
+ → PreRelease自動作成(v0.2.0-rc.42)
27
+ ※ changeset未消費(タグ作成のみ)
28
+
29
+ staging → main PR(昇格)
30
+ ↓ マージ
31
+ [main] → CI + ⚠️承認待ち → Migrate + Deploy
32
+ → changeset version(バージョン確定)→ Release自動作成(v0.2.0)
33
+ ```
34
+
35
+ ## Codexレビュー反映事項
36
+
37
+ | # | 問題 | 修正内容 |
38
+ |---|------|---------|
39
+ | C-1 | stagingでchangeset消費すると main で残らない | `changeset version` はmainのみ。stagingはRCタグ作成のみ(未消費) |
40
+ | C-2 | `workflow_run` はdefault branch制約がある | release処理を `deploy-stable-branches.yml` 内ジョブに統合(独立ワークフロー廃止) |
41
+ | C-3 | `--previous-tag` は存在しないCLIオプション | `--notes-start-tag` に修正 |
42
+ | C-4 | 承認前にDBマイグレーションが走る | migrate + deploy 両方にproduction environment適用 |
43
+ | H-1 | `ci`ジョブのみの無限ループ防止は不十分 | `GITHUB_TOKEN` はデフォルトでワークフロー再起動しない特性を活用。ワークフロー全体ガード追加 |
44
+ | H-2 | `permissions: contents: write` 未定義 | 明示追加 |
45
+ | H-3 | `environment: ''` の動作が不確実 | ジョブ分割で解消(develop/staging/production別ジョブ) |
46
+ | H-4 | ブランチ保護との衝突リスク | version bumpはmainのみ。GITHUB_TOKEN使用(bot名義でprotection bypass可能な設定前提) |
47
+
48
+ ## 実装ステップ
49
+
50
+ ### Phase 1: changesets基盤導入
51
+
52
+ **変更ファイル:**
53
+ - `package.json` — `@changesets/cli`, `@changesets/changelog-github` をdevDependenciesに追加。scriptsに `"changeset": "changeset"` 追加
54
+ - `.changeset/config.json` — 新規作成
55
+
56
+ ```json
57
+ {
58
+ "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json",
59
+ "changelog": ["@changesets/changelog-github", { "repo": "einja-inc/einja-management-template" }],
60
+ "commit": false,
61
+ "fixed": [],
62
+ "linked": [],
63
+ "access": "restricted",
64
+ "baseBranch": "main",
65
+ "updateInternalDependencies": "patch",
66
+ "ignore": ["@einja/dev-cli", "create-einja-app"]
67
+ }
68
+ ```
69
+
70
+ **リスク:** なし。既存フローに影響しない
71
+
72
+ ### Phase 2: GitHub Environments設定(手動・GitHub UI)
73
+
74
+ | Environment | Required Reviewers | Wait Timer | Deployment Branches |
75
+ |------------|-------------------|------------|-------------------|
76
+ | `staging` | なし | なし | `staging`のみ |
77
+ | `production` | 1名 | なし | `main`のみ |
78
+
79
+ **リスク:** なし。ワークフローに`environment`参照がないため、設定だけでは動作変更なし
80
+
81
+ ### Phase 3: `deploy-stable-branches.yml` 大規模改修
82
+
83
+ **変更概要:** デプロイジョブをブランチ別に分割 + リリース作成ジョブを統合
84
+
85
+ **改修前の構造:**
86
+ ```
87
+ ci → changes → migrate → deploy(全ブランチ共通)
88
+ ```
89
+
90
+ **改修後の構造:**
91
+ ```
92
+ ci → changes → (ブランチ別分岐)
93
+ ├─ [develop] → deploy-develop(環境なし)
94
+ ├─ [staging] → deploy-staging(staging環境)→ release-staging(PreRelease作成)
95
+ └─ [main] → migrate-production(production環境・承認待ち)→ deploy-production → release-production(Release作成)
96
+ ```
97
+
98
+ **主要な変更点:**
99
+
100
+ #### 3-1. ワークフロー全体ガード(無限ループ防止)
101
+ ```yaml
102
+ on:
103
+ push:
104
+ branches: [main, develop, staging]
105
+
106
+ # GITHUB_TOKENで作成されたイベントはデフォルトでワークフロー再起動しない
107
+ # 念のため明示的にbotコミットを除外
108
+ jobs:
109
+ ci:
110
+ # github-actions[bot] のバージョンバンプコミットはスキップ
111
+ if: "!contains(github.event.head_commit.message, 'chore: release v')"
112
+ ```
113
+
114
+ #### 3-2. デプロイジョブをブランチ別に分割
115
+ ```yaml
116
+ # develop: 環境なし、承認なし
117
+ deploy-develop:
118
+ needs: [ci, changes]
119
+ if: github.ref_name == 'develop' && needs.changes.outputs.deploy_matrix != '[]'
120
+ runs-on: ubuntu-latest
121
+ strategy: ...
122
+ steps: ... # 既存のdeployステップをそのまま
123
+
124
+ # staging: staging環境、承認なし
125
+ deploy-staging:
126
+ needs: [ci, migrate, changes]
127
+ if: github.ref_name == 'staging' && ...
128
+ environment: staging
129
+ runs-on: ubuntu-latest
130
+ strategy: ...
131
+ steps: ... # 既存のdeployステップをそのまま
132
+
133
+ # main: production環境、1名承認 → migrate → deploy
134
+ migrate-production:
135
+ needs: ci
136
+ if: github.ref_name == 'main'
137
+ environment: production # ← ここで承認待ち(migrate前にブロック)
138
+ runs-on: ubuntu-latest
139
+ steps: ... # 既存のmigrateステップ
140
+
141
+ deploy-production:
142
+ needs: [migrate-production, changes]
143
+ if: github.ref_name == 'main' && needs.changes.outputs.deploy_matrix != '[]'
144
+ runs-on: ubuntu-latest
145
+ strategy: ...
146
+ steps: ... # 既存のdeployステップ
147
+ ```
148
+
149
+ #### 3-3. リリース作成ジョブを統合(release-app.yml廃止)
150
+ ```yaml
151
+ permissions:
152
+ contents: write # タグ作成・Release作成に必要
153
+
154
+ # staging: PreRelease作成(changeset未消費)
155
+ release-staging:
156
+ needs: deploy-staging
157
+ if: github.ref_name == 'staging'
158
+ runs-on: ubuntu-latest
159
+ steps:
160
+ - uses: actions/checkout@v4
161
+ with:
162
+ fetch-depth: 0
163
+ - name: Check for changesets
164
+ id: check
165
+ run: |
166
+ COUNT=$(ls .changeset/*.md 2>/dev/null | grep -cv README.md || echo 0)
167
+ echo "has_changesets=$([[ $COUNT -gt 0 ]] && echo true || echo false)" >> $GITHUB_OUTPUT
168
+ - name: Create PreRelease tag
169
+ if: steps.check.outputs.has_changesets == 'true'
170
+ id: tag
171
+ run: |
172
+ VERSION=$(node -p "require('./package.json').version")
173
+ TAG="v${VERSION}-rc.${{ github.run_number }}"
174
+ git tag "$TAG"
175
+ git push origin "$TAG"
176
+ echo "tag=$TAG" >> $GITHUB_OUTPUT
177
+ - name: Create GitHub PreRelease
178
+ if: steps.tag.outputs.tag
179
+ run: |
180
+ PREV=$(git tag --list 'v*-rc.*' --sort=-v:refname | grep -v "${{ steps.tag.outputs.tag }}" | head -1)
181
+ OPTS="--prerelease --target staging --generate-notes"
182
+ [[ -n "$PREV" ]] && OPTS="$OPTS --notes-start-tag $PREV"
183
+ gh release create "${{ steps.tag.outputs.tag }}" --title "Pre-release ${{ steps.tag.outputs.tag }}" $OPTS
184
+ env:
185
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
186
+
187
+ # main: changeset消費 + Release作成
188
+ release-production:
189
+ needs: deploy-production
190
+ if: github.ref_name == 'main'
191
+ runs-on: ubuntu-latest
192
+ steps:
193
+ - uses: actions/checkout@v4
194
+ with:
195
+ fetch-depth: 0
196
+ - name: Setup
197
+ uses: ./.github/actions/setup
198
+ - name: Check for changesets
199
+ id: check
200
+ run: |
201
+ COUNT=$(ls .changeset/*.md 2>/dev/null | grep -cv README.md || echo 0)
202
+ echo "has_changesets=$([[ $COUNT -gt 0 ]] && echo true || echo false)" >> $GITHUB_OUTPUT
203
+ - name: Version packages
204
+ if: steps.check.outputs.has_changesets == 'true'
205
+ run: npx changeset version
206
+ - name: Commit version bump and create Release
207
+ if: steps.check.outputs.has_changesets == 'true'
208
+ id: release
209
+ run: |
210
+ VERSION=$(node -p "require('./package.json').version")
211
+ TAG="v${VERSION}"
212
+ git config user.name "github-actions[bot]"
213
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
214
+ git add -A
215
+ git commit -m "chore: release ${TAG}" || echo "No changes"
216
+ git tag "$TAG"
217
+ git push origin main --follow-tags
218
+ PREV=$(git tag --list 'v*' --sort=-v:refname | grep -v 'rc' | grep -v "$TAG" | head -1)
219
+ OPTS="--target main --generate-notes"
220
+ [[ -n "$PREV" ]] && OPTS="$OPTS --notes-start-tag $PREV"
221
+ gh release create "$TAG" --title "Release ${TAG}" $OPTS
222
+ env:
223
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
224
+ ```
225
+
226
+ **無限ループ防止の多重防御:**
227
+ 1. `GITHUB_TOKEN` で作成されたpushイベントはデフォルトでワークフローを再トリガーしない
228
+ 2. コミットメッセージ `chore: release v` でのフィルタリング
229
+ 3. バージョンバンプコミットは `github-actions[bot]` 名義
230
+
231
+ **リスク:** 高。ジョブ分割により既存ワークフローの構造が大きく変わる。段階的にテストが必要
232
+
233
+ ### Phase 4: `.github/release.yml` リリースノート設定
234
+
235
+ ```yaml
236
+ changelog:
237
+ exclude:
238
+ labels: ["dependencies", "skip-changelog"]
239
+ categories:
240
+ - title: "New Features"
241
+ labels: ["enhancement", "feature"]
242
+ - title: "Bug Fixes"
243
+ labels: ["bug", "fix"]
244
+ - title: "Other Changes"
245
+ labels: ["*"]
246
+ ```
247
+
248
+ ### Phase 5: `changeset-status.yml` 新規作成(任意)
249
+
250
+ PR上にchangesetの有無を表示するワークフロー。開発体験向上目的。
251
+
252
+ ### Phase 6: einja-create-pr Skill新規作成
253
+
254
+ **新規ファイル:** `.claude/skills/einja-create-pr/SKILL.md`
255
+
256
+ **責務:** PR作成時にchangeset自動生成 + ラベル付与 + PR作成を一括実行
257
+
258
+ **処理フロー(5ステップ):**
259
+
260
+ 1. **差分分析**: `git log --format="%s%n%b" origin/{base}..HEAD` + `git diff --name-only origin/{base}..HEAD`
261
+ 2. **changeset生成判定**:
262
+ - スキップ条件: staging→main昇格PR、apps/配下に変更なし(docs/CI/設定のみ)、既にchangesetファイルがある
263
+ - 変更種別推定: コミットメッセージプレフィックスの最大値(feat+fix→minor, feat!→major)
264
+ - パッケージ判定: ファイルパスから(apps/web/** → @repo/web等)
265
+ 3. **changeset生成**: `.changeset/{ランダム名}.md` を作成 → コミット
266
+ 4. **ラベル判定**: PRタイトルプレフィックスから単一ラベル選択(enhancement/bug/maintenance)
267
+ 5. **PR作成**: `gh pr create --title ... --body ... --label ...`
268
+
269
+ **動作モード:**
270
+ | モード | トリガー | changeset確認 | ラベル確認 |
271
+ |--------|---------|--------------|-----------|
272
+ | 自動 | task-exec/issue-exec経由 | 推定値で自動決定 | 自動 |
273
+ | 対話 | 手動 `/einja-create-pr` | AskUserQuestionで確認 | AskUserQuestionで確認 |
274
+
275
+ **既存ワークフローへの統合:**
276
+ - `issue-exec.md` のManagerのPR作成部分を `/einja-create-pr` 呼び出しに変更
277
+ - `task-exec.md` は変更不要(現状PR作成は含まない)
278
+
279
+ **ラベル判定ルール(単一ラベル、優先度順):**
280
+ ```
281
+ feat!/BREAKING → breaking-change
282
+ feat: → enhancement
283
+ fix: → bug
284
+ その他 → maintenance
285
+ ```
286
+
287
+ ### Phase 7: 既存ドキュメントへの追記
288
+
289
+ **`docs/einja/steering/infrastructure/deployment.md`** — 以下のセクションを追記:
290
+ - 「8. リリース管理」: GitHub Release/PreRelease自動作成フロー
291
+ - 「9. バージョニング戦略」: changesets採番ルール、タグ形式
292
+ - 「10. 承認フロー」: GitHub Environments設定、production承認ゲート
293
+ - ワークフロー一覧テーブルに release-staging/release-production ジョブを追加
294
+
295
+ **`docs/einja/steering/development-workflow.md`** — 以下を追記:
296
+ - changesetの運用フロー(PRにchangeset含める手順)
297
+ - 「Phase A: 仕様書作成」→「Phase B: タスク実行」→「Phase C: リリース」の流れ
298
+
299
+ ## バージョニング採番ルール
300
+
301
+ ### セマンティックバージョニング(changeset指定)
302
+
303
+ | 変更種別 | changeset指定 | バージョン変更例 | 使用シーン |
304
+ |---------|--------------|----------------|----------|
305
+ | 破壊的変更 | `major` | `0.1.0` → `1.0.0` | API仕様変更、DB破壊的マイグレーション |
306
+ | 新機能追加 | `minor` | `0.1.0` → `0.2.0` | 新画面、新API追加 |
307
+ | バグ修正 | `patch` | `0.1.0` → `0.1.1` | 不具合修正、パフォーマンス改善 |
308
+
309
+ ### タグ形式
310
+
311
+ | 環境 | タグ形式 | 例 | GitHub Release種別 |
312
+ |------|---------|-----|------------------|
313
+ | staging | `v{version}-rc.{run_number}` | `v0.2.0-rc.42` | PreRelease |
314
+ | production | `v{version}` | `v0.2.0` | Release |
315
+
316
+ ### changeset消費タイミング
317
+
318
+ | ブランチ | changeset消費 | バージョンバンプ | タグ形式 |
319
+ |---------|-------------|----------------|---------|
320
+ | staging | **消費しない** | なし(package.json据え置き) | `v{current}-rc.{run_number}` |
321
+ | main | `changeset version` で消費 | package.json更新 | `v{new_version}` |
322
+
323
+ ## 変更ファイル一覧
324
+
325
+ | ファイル | 操作 | Phase |
326
+ |---------|------|-------|
327
+ | `package.json` | 改修(devDeps + scripts追加) | 1 |
328
+ | `.changeset/config.json` | 新規 | 1 |
329
+ | `.github/workflows/deploy-stable-branches.yml` | 大規模改修(ジョブ分割 + リリース統合) | 3 |
330
+ | `.github/release.yml` | 新規 | 4 |
331
+ | `.github/workflows/changeset-status.yml` | 新規(任意) | 5 |
332
+ | `.claude/skills/einja-create-pr/SKILL.md` | 新規(changeset生成 + ラベル付与 + PR作成) | 6 |
333
+ | `.claude/commands/einja/issue-exec.md` | 改修(PR作成部分をeinja-create-pr呼び出しに変更) | 6 |
334
+ | `docs/einja/steering/infrastructure/deployment.md` | 追記(リリース管理・バージョニング・承認フロー) | 7 |
335
+ | `docs/einja/steering/development-workflow.md` | 追記(changeset運用フロー) | 7 |
336
+
337
+ **変更しないファイル:**
338
+ - `release-cli.yml` / `release-create-einja-app.yml`(NPMリリースは独立運用を維持)
339
+ - `deploy-pr-preview.yml` / `cleanup-*.yml` / `claude.yml`
340
+ - Composite Actions(`setup`, `ci`, `migrate`, `neon-export-env`)
341
+
342
+ **廃止:**
343
+ - `release-app.yml` は作成しない(deploy-stable-branches.yml内に統合)
344
+
345
+ ## NPMリリースとの棲み分け
346
+
347
+ | タグパターン | 用途 | 生成元 |
348
+ |-------------|------|--------|
349
+ | `v1.2.0` | アプリ Stable Release | deploy-stable-branches.yml内 release-production ジョブ |
350
+ | `v1.2.0-rc.42` | アプリ PreRelease | deploy-stable-branches.yml内 release-staging ジョブ |
351
+ | `cli-v0.1.41` | @einja/dev-cli | 手動タグ(既存運用) |
352
+ | `create-einja-app-v0.3.2` | create-einja-app | 手動タグ(既存運用) |
353
+
354
+ ## 検証方法
355
+
356
+ 1. **Phase 1検証**: `pnpm changeset` で対話UIが起動し、`.changeset/` にmdファイルが生成されること
357
+ 2. **Phase 3検証**:
358
+ - developブランチにpush → deploy-developが承認なしで実行(従来通り)
359
+ - stagingブランチにpush → deploy-stagingが承認なしで実行 → release-stagingでPreRelease作成
360
+ - mainブランチにpush → migrate-productionがGitHub UIで承認待ち → 承認後migrate+deploy → release-productionでRelease作成
361
+ - バージョンバンプコミットでワークフローが再トリガーされない(無限ループなし)ことを確認
362
+ 3. **Phase 6検証**: `/einja-create-pr` でchangeset生成 + ラベル付与 + PR作成が一括実行されること
@@ -0,0 +1,32 @@
1
+ # Plan: docs-updater Agent を薄いラッパーに簡素化
2
+
3
+ ## Context
4
+
5
+ `docs-updater` Agent(`.claude/agents/einja/docs/docs-updater.md`)と `update-docs-by-task-specs` Command(`.claude/commands/einja/update-docs-by-task-specs.md`)が機能的にほぼ完全に重複している。Agent側は自ら「`update-docs-by-task-specs` コマンドのロジックに従って処理を実行します」と記載しているが、ステップ1〜6(33〜151行)でコマンドのロジックを丸コピーしている。
6
+
7
+ docs-updater は task-exec の Phase 99 から Agent ツールで呼ばれるサブエージェントであり、メインコンテキストの肥大化を防ぐ役割がある。Agent定義は残しつつ、ロジックの重複を解消する。
8
+
9
+ ## 変更内容
10
+
11
+ ### 1. docs-updater.md の簡素化
12
+
13
+ - **対象**: `.claude/agents/einja/docs/docs-updater.md`
14
+ - ステップ1〜6のロジック詳細(33〜151行)を削除
15
+ - 「`.claude/commands/einja/update-docs-by-task-specs.md` を Read して指示に従う」という委託形式に書き換え
16
+ - frontmatter(name, description, model, color)、入力形式、実行制約は維持
17
+
18
+ ### 2. spec-tasks-generator.md の記述確認
19
+
20
+ - **対象**: `.claude/agents/einja/specs/spec-tasks-generator.md` (264行目、274行目付近)
21
+ - 「docs-updater エージェント」の記述はそのまま維持(docs-updater を残すため変更不要)
22
+
23
+ ## 対象ファイル一覧
24
+
25
+ | ファイル | 操作 |
26
+ |---------|------|
27
+ | `.claude/agents/einja/docs/docs-updater.md` | 簡素化(ロジック重複部分を委託形式に書き換え) |
28
+
29
+ ## 検証
30
+
31
+ - 簡素化後の docs-updater.md が正しくコマンドを参照していることを Read で確認
32
+ - `git diff --stat` で意図しない変更がないことを確認
@@ -0,0 +1,177 @@
1
+ # レビューレポート: enchanted-wiggling-ember.md
2
+
3
+ レビュー実施日: 2026-03-05
4
+
5
+ ---
6
+
7
+ ## 前回指摘事項の反映確認
8
+
9
+ | 指摘番号 | 内容 | 反映状況 |
10
+ |---------|------|---------|
11
+ | 1 | 命名の一貫性: `issue-spec-requirements-generator` → 短縮名 | 反映済み(requirements-generator.md 等) |
12
+ | 2 | sync-cursor-commands の更新が必要 | TG-2.3 に追加済み |
13
+ | 3 | エージェント名の長さ: ディレクトリ名でスコープ担保 | 反映済み(issue-specs/ + 短縮ファイル名) |
14
+ | 4 | task-exec リネーム不要 | そのまま維持(妥当) |
15
+
16
+ 前回指摘 4 点はすべて反映されている。
17
+
18
+ ---
19
+
20
+ ## 新たに発見された問題
21
+
22
+ ### 重大(見落とすと壊れる)
23
+
24
+ #### [CRITICAL-1] copy-presets.mjs の Skill 固定列挙に新Skillが含まれていない
25
+
26
+ **実態**: `packages/cli/scripts/copy-presets.mjs` の Skill コピーは固定列挙(ハードコード)。
27
+ 現在の列挙に含まれているのは以下のみ:
28
+ - einja-conflict-resolver
29
+ - einja-general-context-loader
30
+ - einja-output-format
31
+ - einja-spec-context-loader
32
+ - einja-project-overview
33
+ - einja-skill-creator
34
+ - einja-task-commit
35
+ - einja-task-qa
36
+
37
+ **問題**: 新規作成される以下の Skill が列挙に入っていないため、ビルド(`pnpm build`)しても `presets/default/` にコピーされない:
38
+ - `einja-issue-spec-create`(新規)
39
+ - `einja-task-exec`(新規)
40
+ - `einja-issue-spec-generator`(リネーム後)
41
+ - `einja-issue-spec-validator`(リネーム後)
42
+
43
+ また、`einja-task-spec-generator` と `einja-task-spec-validator` の **削除エントリ** も必要。
44
+
45
+ **対処**: Phase 2 の TG として「`copy-presets.mjs` への新 Skill 追加 + 旧 Skill 削除」を追加する必要がある。
46
+
47
+ #### [CRITICAL-2] issue-exec.md の更新箇所が「2箇所」では足りない
48
+
49
+ **実態**: `issue-exec.md` の `/einja:task-exec` 参照は **少なくとも3箇所**:
50
+ - 103行目: 代替手段の説明
51
+ - 206行目: Worker 起動手順の説明
52
+ - 394行目: tmux send-keys の実際のコマンド文字列
53
+
54
+ 計画書には「2箇所」と記載されているが、394行目のコマンド文字列が漏れると Worker 起動が壊れる。
55
+
56
+ **対処**: TG-2.3 の issue-exec.md 更新対象を「全件」に修正すること。
57
+
58
+ #### [CRITICAL-3] grep 検証パターンに複数の見逃しがある
59
+
60
+ 現在の TG-3.1 grep パターンの欠落:
61
+
62
+ | 欠落しているチェック | 実際に残存する箇所 |
63
+ |--------------------|------------------|
64
+ | `agents/specs/`(einja/ なしの短縮形) | sync-cursor-commands.md:54 |
65
+ | `.cursor/commands/` 内の旧ファイル残存 | .cursor/commands/update-docs-by-task-specs.md |
66
+ | `README.md` 内の旧コマンド参照 | README.md:60 |
67
+
68
+ また、誤検知ノイズになる箇所(除外が必要):
69
+ - `docs/specs/issues/**/qa-tests/` — 履歴エビデンスなので除外推奨
70
+ - `docs/plans/` — 過去計画ファイルなので除外推奨
71
+ - `modifications/` — 作業記録なので除外推奨
72
+
73
+ **対処**: TG-3.1 の grep コマンドを修正し、除外パターンに `docs/specs/` `docs/plans/` `modifications/` `packages/create-einja-app/templates/default/docs/plans/` を追加する。また、`agents/specs/` と `.cursor/commands/` のチェックを追加する。
74
+
75
+ ---
76
+
77
+ ### 中リスク(計画漏れ)
78
+
79
+ #### [MEDIUM-1] README.md の更新が計画に含まれていない
80
+
81
+ **実態**: `README.md` 60行目に以下の記述がある:
82
+ ```
83
+ `.claude/commands/` - `/einja:spec-create`, `/einja:task-exec` などのスラッシュコマンド
84
+ ```
85
+
86
+ TG-2.5 は CLAUDE.md のみで、README.md が含まれていない。
87
+
88
+ **対処**: TG-2.5 に README.md を追加する(Skill/コマンドテーブルの記述を更新)。
89
+
90
+ #### [MEDIUM-2] sync-cursor-commands.md のパス例示が現実と不一致
91
+
92
+ **実態**: `sync-cursor-commands.md` 54行目:
93
+ ```
94
+ spec-requirements-generator → .claude/agents/specs/spec-requirements-generator.md
95
+ ```
96
+ 実際のパスは `.claude/agents/einja/specs/` だが、例示では `agents/specs/` と短縮されている。
97
+ リネーム後は `.claude/agents/einja/issue-specs/requirements-generator.md` になる。
98
+
99
+ TG-2.3 で「エージェントパス agents/specs/ → agents/issue-specs/」と記載されているが、
100
+ このパターンで置換すると `agents/einja/specs/` を持つパスには一致しない可能性がある。
101
+
102
+ **対処**: TG-2.3 の sync-cursor-commands.md 更新で、具体的にどの文字列を何に置換するかを明示すること。
103
+
104
+ #### [MEDIUM-3] .cursor/commands/update-docs-by-task-specs.md の旧ファイル削除が計画されていない
105
+
106
+ **実態**: `.cursor/commands/update-docs-by-task-specs.md` が存在する。
107
+ `sync-cursor-commands` コマンド再実行で `update-docs-by-issue-specs/RULE.md` が生成されるはずだが、
108
+ 旧ファイルの **削除** は自動では行われない(スクリプトが削除しない設計の可能性がある)。
109
+
110
+ **対処**: TG-3.2(ビルド・テスト)の手順に「`.cursor/commands/` 内の旧ファイル手動削除確認」を追加する。
111
+
112
+ #### [MEDIUM-4] einja-task-spec-generator/SKILL.md と einja-task-spec-validator/SKILL.md のリンクパス変更が2段階になっている
113
+
114
+ **実態**:
115
+ - `einja-task-spec-generator/SKILL.md`:101行目 → `../../agents/einja/specs/spec-tasks-generator.md`
116
+ - `einja-task-spec-validator/SKILL.md`:126行目 → `../../agents/einja/specs/spec-tasks-validator.md`
117
+
118
+ リネーム後(einja-issue-spec-generator/SKILL.md)ではリンクパスを:
119
+ 1. ディレクトリ: `specs/` → `issue-specs/`
120
+ 2. ファイル名: `spec-tasks-generator.md` → `tasks-generator.md`
121
+
122
+ の **両方** を変更する必要がある。TG-2.2 の記述では「エージェント名更新」とのみ書かれており、
123
+ パスの `specs/` → `issue-specs/` の変更が明記されていない。
124
+
125
+ **対処**: TG-2.2 の更新内容に「相対パス内の `specs/` → `issue-specs/` 変更」を明記する。
126
+
127
+ ---
128
+
129
+ ### 更新不要と判断できるもの
130
+
131
+ | 対象 | 判断 | 理由 |
132
+ |-----|------|------|
133
+ | `docs/specs/issues/**/qa-tests/` 内の旧語 | 更新不要 | 履歴エビデンスなので変更すると証跡が変わる |
134
+ | `docs/plans/` 内の過去計画書の旧語 | 更新不要 | 作業記録。ただし grep 検証からは除外すること |
135
+ | `modifications/` 内の旧語 | 更新不要 | 作業記録 |
136
+ | テストファイル内の旧パス(テストデータ文字列) | 更新不要 | 単なるサンプルデータとして使用。実ファイルパスを参照していない |
137
+ | `packages/cli/presets/default/` 配下 | ビルド後に自動反映 | copy-presets.mjs で上書きされる(ただし Skill の固定列挙更新は必要) |
138
+
139
+ ---
140
+
141
+ ## TG-2.2 の行数確認(Skill ファイル数の計算)
142
+
143
+ 計画書で「TG-2.2: スキル内部参照更新(8ファイル)」とあるが、実際にリストされているのは9行:
144
+
145
+ 1. einja-issue-spec-generator/SKILL.md
146
+ 2. einja-issue-spec-validator/SKILL.md
147
+ 3. einja-task-qa/SKILL.md
148
+ 4. einja-task-qa/references/troubleshooting.md
149
+ 5. einja-task-qa/references/usage-patterns.md
150
+ 6. einja-task-commit/SKILL.md
151
+ 7. einja-general-context-loader/SKILL.md
152
+ 8. einja-spec-context-loader/SKILL.md
153
+ 9. einja-skill-first/SKILL.md
154
+
155
+ ヘッダーは「8ファイル」だが実際は9ファイル。minor な誤りだが修正推奨。
156
+
157
+ ---
158
+
159
+ ## 総合評価
160
+
161
+ ### 反映状況
162
+ 前回指摘 4 点: 全反映済み。
163
+
164
+ ### 新たなリスク
165
+ - **重大**: 3件(CRITICAL-1〜3)
166
+ - **中リスク**: 4件(MEDIUM-1〜4)
167
+
168
+ ### 最小修正が必要な計画変更
169
+
170
+ 1. **新規 TG を追加**: `copy-presets.mjs` の Skill 固定列挙更新(CRITICAL-1)
171
+ 2. **TG-2.3 修正**: issue-exec.md の更新箇所を「全件(少なくとも3箇所)」に修正(CRITICAL-2)
172
+ 3. **TG-3.1 修正**: grep パターンに `agents/specs/` チェック追加、`.cursor/commands/` チェック追加、除外パターンに `docs/specs/` `docs/plans/` `modifications/` を追加(CRITICAL-3)
173
+ 4. **TG-2.5 修正**: README.md を追加(MEDIUM-1)
174
+ 5. **TG-2.3 修正**: sync-cursor-commands.md の置換文字列を具体的に明示(MEDIUM-2)
175
+ 6. **TG-3.2 修正**: .cursor/commands/ 旧ファイル削除確認を追加(MEDIUM-3)
176
+ 7. **TG-2.2 修正**: 相対パス内の `specs/` → `issue-specs/` 変更を明記(MEDIUM-4)
177
+ 8. **ヘッダー修正**: TG-2.2 の「8ファイル」→「9ファイル」(minor)