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,186 @@
1
+ # コードレビュー計画
2
+
3
+ ## 対象コミット
4
+
5
+ 1. `79b5dbb` - refactor(cli): setup/addコマンドを廃止しsyncコマンドに統合
6
+ 2. `2bdb9a7` - refactor: QAテスト構造をタスクグループ単位からユーザーストーリー(AC)単位に移行
7
+
8
+ ## レビュー観点
9
+
10
+ ### 1. 型の整合性
11
+ ### 2. 未使用コード
12
+ ### 3. 新規コード品質
13
+ ### 4. Story形式の一貫性
14
+ ### 5. テストカバレッジ
15
+ ### 6. 破壊的変更
16
+
17
+ ---
18
+
19
+ ## 🤖 Codex作業完了
20
+
21
+ ### タスク: 直近2コミットのコードレビュー(CLI統合 + QA構造移行)
22
+
23
+ ### 作業結果: ✅ SUCCESS
24
+
25
+ ### 作業モード: レビュー
26
+
27
+ ### サマリー
28
+
29
+ - **レビュー対象**: 2コミット(59ファイル変更、+1702/-5943行)
30
+ - **重大な問題**: 0件
31
+ - **警告レベル**: 2件
32
+ - **改善提案**: 5件
33
+ - **Good Point**: 4件
34
+
35
+ ---
36
+
37
+ ## 詳細レビュー
38
+
39
+ ### コミット1: CLI統合(79b5dbb)
40
+
41
+ **変更規模**: 32ファイル(+1276/-4471行)
42
+
43
+ #### ✅ Good Points
44
+
45
+ 1. **大規模リファクタリングの整合性**
46
+ - 4コマンド→2コマンド統合で3195行削除
47
+ - 型定義が全ファイルで一貫している(`ConflictStrategy`, `packageJsonSections`)
48
+ - 破壊的変更なし(既存syncコマンド利用者への影響0)
49
+
50
+ 2. **新規機能の実装品質**
51
+ - `post-sync-actions.ts`: エラーハンドリングが適切
52
+ - 型ガードが明示的(`hasEnvCategory && isEnvrcSynced`)
53
+ - テストカバレッジ100%(441行のテストコード)
54
+
55
+ 3. **コードの可読性**
56
+ - Given-When-Thenコメントが全テストに記載
57
+ - 関数名が明確(`isDirenvAvailable`, `runDirenvAllowAction`)
58
+
59
+ 4. **依存関係の整理**
60
+ - 未使用型削除(`SyncDetailConfig`, `PackageJsonSyncConfig`)
61
+ - インポート整理済み
62
+
63
+ #### ⚠️ 警告レベル
64
+
65
+ 1. **peerDependencies型不一致の修正内容が不明**
66
+ - コミットメッセージに記載あり:「peerDependenciesの型不一致を修正」
67
+ - しかし差分では `packageJsonSections` 配列に `peerDependencies` が追加されただけ
68
+ - **実際の型不一致がどこで発生していたか**が読み取れない
69
+ - 影響: 今後同じ問題が再発する可能性
70
+
71
+ 2. **dist/cli.js の2400行削除**
72
+ - ビルド成果物の差分が大きい(-2400行)
73
+ - トランスパイル結果なので正確性検証が困難
74
+ - 推奨: ビルド後の動作確認(`pnpm einja sync --dry-run`)
75
+
76
+ #### 💡 改善提案(優先度: 低)
77
+
78
+ 1. **conflictStrategy のデフォルト値**
79
+ - `mergeAndWriteFile` のデフォルトが `"merge"` で統一されている ✅
80
+ - しかし `promptSyncCategories` の初期値は変数宣言時のみ設定
81
+ - 推奨: 型レベルでデフォルトを明示(`ConflictStrategy = "merge"`)
82
+
83
+ 2. **post-sync-actions の拡張性**
84
+ - 現在2アクション(direnv, husky)のみ
85
+ - 今後アクションが増えた場合の設計: 配列ベースのアクション管理推奨
86
+ ```typescript
87
+ const actions = [
88
+ { category: 'env', file: '.envrc', handler: runDirenvAllowAction },
89
+ { category: 'git-hooks', file: '.husky/pre-commit', handler: runHuskyChmodAction },
90
+ ];
91
+ ```
92
+
93
+ 3. **テストのエッジケース**
94
+ - `post-sync-actions.test.ts` でエラー発生時のテストが不足
95
+ - 例: `chmodSync` が例外を投げた場合のエラーハンドリング
96
+ - 現在はエラーログ出力のみ(処理は継続)→ テストケース追加推奨
97
+
98
+ ---
99
+
100
+ ### コミット2: QAテスト構造移行(2bdb9a7)
101
+
102
+ **変更規模**: 27ファイル(+426/-1472行)
103
+
104
+ #### ✅ Good Points
105
+
106
+ 1. **旧形式への参照完全削除**
107
+ - `phase1/`, `phase2/` ディレクトリとファイルをすべて削除
108
+ - CLIテンプレート(`qa-test.md.template`)も新形式に更新
109
+ - 検索結果: "phase" への参照なし(`grep -r "phase{N}" .claude/ docs/` = 0件)
110
+
111
+ 2. **一貫性のある構造変更**
112
+ - `qa-tests/phase{N}/{X-Y}.md` → `qa-tests/story{N}.md`
113
+ - エビデンス配置: `phase{N}/evidence/` → `evidence/story{N}/`
114
+ - 変更記録: `modifications/phase-{N}/{X-Y}.md` → `modifications/task-{X}-{Y}.md`
115
+
116
+ 3. **入力形式の自然言語化**
117
+ - 旧: 構造化データ(JSON形式でphase/task指定)
118
+ - 新: 自然言語(「AC1.1, AC1.2のテストを実行」)
119
+ - task-qaの可読性向上
120
+
121
+ 4. **メタデータ改善**
122
+ - タスクメタデータに「実装AC」推奨項目を追加
123
+ - タスク実行時にACマッピングが明確化
124
+
125
+ #### ⚠️ 情報(影響なし)
126
+
127
+ 1. **issue999サンプルの移行**
128
+ - 旧: phase1/1-1.md(268行), 1-2.md(179行), 1-3.md(392行)
129
+ - 新: story1.md(101行), story2.md(70行), story3.md(69行)
130
+ - 行数削減(-1058行)はサンプルの簡略化による(問題なし)
131
+
132
+ #### 💡 改善提案(優先度: 低)
133
+
134
+ 1. **AC番号からStory特定ロジックの明示**
135
+ - `SKILL.md`に記載: 「AC番号の先頭数字(1)からStory 1を特定」
136
+ - エッジケース未定義: AC10.1の場合はStory 10 or Story 1?
137
+ - 推奨: 正規表現パターンを明示(`AC(\d+)\.(\d+)` → Story `$1`)
138
+
139
+ 2. **scenarios.md の実施タイミング基準**
140
+ - 旧: Phase単位(「Phase 1完了後に実施」)
141
+ - 新: AC番号基準(「AC1.3完了後に実施」)
142
+ - 問題: AC番号の順序性に依存(AC1.1→AC1.2→AC1.3の実装順序が保証されるか?)
143
+ - 推奨: 実施タイミングの依存関係を明示
144
+
145
+ ---
146
+
147
+ ## 総合評価
148
+
149
+ ### 🎯 品質スコア: 8.5/10
150
+
151
+ | 観点 | スコア | コメント |
152
+ |-----|-------|---------|
153
+ | 型の整合性 | 10/10 | 型定義が全ファイルで一貫 |
154
+ | 未使用コード | 10/10 | 削除漏れなし |
155
+ | 新規コード品質 | 9/10 | エラーハンドリング適切、テストカバレッジ100% |
156
+ | Story形式の一貫性 | 9/10 | 旧形式への参照完全削除 |
157
+ | テストカバレッジ | 8/10 | post-sync-actionsのエッジケース不足 |
158
+ | 破壊的変更 | 10/10 | 既存利用者への影響なし |
159
+
160
+ ### 📌 次のステップ
161
+
162
+ **即時対応不要(すべて低優先度)**
163
+
164
+ 1. ビルド後の動作確認(推奨)
165
+ ```bash
166
+ pnpm einja sync --dry-run --categories env,tools
167
+ ```
168
+
169
+ 2. エッジケーステスト追加(任意)
170
+ - `post-sync-actions.test.ts` にエラー発生時のテストケース追加
171
+
172
+ 3. ドキュメント改善(任意)
173
+ - AC番号パース仕様を明示
174
+
175
+ ---
176
+
177
+ ## レビュー完了
178
+
179
+ **結論**: 両コミットとも**高品質**で、即座のアクション不要。
180
+
181
+ - 設計が一貫している
182
+ - テストカバレッジが十分
183
+ - 破壊的変更がない
184
+ - ドキュメントが整備されている
185
+
186
+ **マージ推奨**: 問題なし ✅
@@ -0,0 +1,36 @@
1
+ # CLIテンプレートの旧Phase形式参照をStory形式に修正
2
+
3
+ ## Context
4
+
5
+ QAテスト構造をタスクグループ単位(`phase{N}/{N}-{M}.md`)からユーザーストーリー単位(`story{N}.md`)に移行済み。エージェント定義・Skill・コマンドはStory形式に更新済みだが、CLIテンプレート1ファイルに旧Phase形式への参照が残っている。
6
+
7
+ 完了済み実タスク(issue21, 22, 101)の旧形式QAテストは配布対象外(`.templateignore`で除外)のため放置。
8
+
9
+ ---
10
+
11
+ ## 修正対象
12
+
13
+ ### `packages/cli/templates/qa-test.md.template` L83-84
14
+
15
+ ```diff
16
+ - - ログファイル: `qa-tests/phaseX/evidence/X-Y-1-*.log`
17
+ - - スクリーンショット: `qa-tests/phaseX/evidence/X-Y-1-*.png`
18
+ + - ログファイル: `qa-tests/evidence/story{N}/AC{N}-{M}-*.log`
19
+ + - スクリーンショット: `qa-tests/evidence/story{N}/AC{N}-{M}-*.png`
20
+ ```
21
+
22
+ ---
23
+
24
+ ## 検証
25
+
26
+ ```bash
27
+ # 旧形式参照が残っていないことを確認
28
+ grep -r "phaseX\|phase{N}\|phase1/" packages/cli/templates/ --include="*.md*"
29
+ # → 出力なしなら完了
30
+ ```
31
+
32
+ ## コミット
33
+
34
+ ```
35
+ docs: CLIテンプレートのQAテストパスをStory形式に修正
36
+ ```
@@ -0,0 +1,47 @@
1
+ # Plan: seed → project-private 変換テスト追加
2
+
3
+ ## 目的
4
+ `@einja:seed` → `@einja:project-private` 変換が正しく動作することを単体テストで保証する。
5
+
6
+ ## テスト一覧
7
+
8
+ ### Group A: marker-processor.test.ts(#1, #2, #9)
9
+
10
+ | # | テスト | ケース |
11
+ |---|--------|--------|
12
+ | 1 | `parseMarkers()` legacy seed認識 | Markdown legacy seed → type: "project-private" で返る |
13
+ | 1 | `parseMarkers()` legacy seed認識 | YAML legacy seed → type: "project-private" で返る |
14
+ | 1 | `parseMarkers()` legacy seed認識 | legacy seed + managed混在 → 両方正しくパース |
15
+ | 1 | `parseMarkers()` legacy seed認識 | legacy seed ID属性保持 |
16
+ | 2 | `migrateLegacySeedMarkers()` 詳細 | managed + seed混在 → seedのみ変換、managedはそのまま |
17
+ | 2 | `migrateLegacySeedMarkers()` 詳細 | YAML形式のseed → 変換 |
18
+ | 2 | `migrateLegacySeedMarkers()` 詳細 | 空seedセクション(マーカーペアのみ) |
19
+ | 2 | `migrateLegacySeedMarkers()` 詳細 | 複数seedマーカー → すべて変換 |
20
+ | 2 | `migrateLegacySeedMarkers()` 詳細 | ID属性を含むseed → ID保持して変換 |
21
+ | 9 | `validateMarkers()` legacy seed | legacy seedでID欠落 → エラー検出 |
22
+ | 9 | `validateMarkers()` legacy seed | legacy seedのネスト → エラー検出 |
23
+
24
+ ### Group B: project-private-synchronizer.test.ts(#3, #4)
25
+
26
+ | # | テスト | ケース |
27
+ |---|--------|--------|
28
+ | 3 | `syncProjectPrivateSections()` legacy | ローカルがlegacy seed → ID認識して重複追加しない |
29
+ | 3 | `syncProjectPrivateSections()` legacy | ローカルがlegacy seed + テンプレートが新規PP → 新規のみ追加 |
30
+ | 4 | `syncProjectPrivateOnlyFile()` legacy | legacy seedファイル → PP抽出・本文マージ・PP再付加が動く |
31
+ | 4 | `syncProjectPrivateOnlyFile()` legacy | legacy seedの空セクション → 存在扱い(テンプレートでseedしない) |
32
+
33
+ ### Group C: integration.test.ts(#6, #7, #8)
34
+
35
+ | # | テスト | ケース |
36
+ |---|--------|--------|
37
+ | 6 | E2Eマイグレーション | legacy seed入力 → migrateLegacySeedMarkers → parseMarkers → replaceManaged → 正常出力 |
38
+ | 6 | E2Eマイグレーション | legacy seed + managed混在 → マイグレーション後にmanaged置換 + PP保持 |
39
+ | 6 | E2Eマイグレーション | legacy seed(managedなし)→ マイグレーション後に3方向マージ + PP保持 |
40
+ | 7 | hasMarkers() | `@einja:seed:start` を含む → true |
41
+ | 7 | hasMarkers() | `@einja:project-private:start` を含む → true |
42
+ | 7 | hasMarkers() | マーカーなし → false |
43
+ | 8 | validateMarkers() + migration | legacy seed → マイグレーション → バリデーション通過 |
44
+
45
+ ## 実装方針
46
+ - 既存テストファイルにdescribeブロックを追加(新規ファイルは作らない)
47
+ - Group A, B, Cを並行で実装可能(ファイルが異なる)
@@ -0,0 +1,224 @@
1
+ # task-exec: タスク単位並列実行 + TodoWrite進捗管理
2
+
3
+ ## Context
4
+
5
+ 現在の `task-exec` コマンドはタスクグループ(X.Y)全体を1つの `task-executer` に丸投げし、内部で順次実装している。この方式では:
6
+ - 依存関係のない独立タスクも直列実行されるため非効率
7
+ - task-executerが自分でIssue/spec読み込みを行うため、並列時にN回重複読み込みが発生
8
+ - task-executerがIssue構造に依存しており、汎用性が低い
9
+
10
+ **目的**:
11
+ 1. task-exec(親)がIssue解析・AC抽出・specパス特定を一括で行い、ハイブリッド方式でタスクごとに渡す
12
+ 2. TodoWriteで進捗管理しつつ、依存関係に基づいた並列実行を実現
13
+ 3. task-executerをIssue非依存の汎用実装エージェントにする
14
+
15
+ **情報渡し方式: ハイブリッド**
16
+ - AC(受け入れ基準)→ 親が抽出してpromptに直接埋め込む(小さい・重要・~100トークン/AC)
17
+ - 設計(design.md)→ ファイルパス + セクション名のみ渡す(大きい・executerが自分でRead)
18
+ - フォールバック: ファイルパスも併記し、executerが追加情報を自由に読める
19
+
20
+ ## 新フロー
21
+
22
+ ```
23
+ task-exec(親)
24
+ 1. Issueフェッチ → タスクグループ内タスク(X.Y.Z)を解析
25
+ 2. spec存在チェック + requirements.mdからAC抽出 + design.mdパス特定
26
+ 3. TaskCreate で各タスクを登録(依存関係 + AC + 設計参照パス付き)
27
+ 4. 依存関係ベース並列実行ループ:
28
+ - ブロックなしタスク → 並列で task-executer 起動
29
+ (各executerに「AC直接埋込 + 設計パス参照 + タスク指示」を渡す)
30
+ - 完了後、新たにブロック解除されたタスク → 次バッチで並列起動
31
+ - 全タスク完了まで繰り返し
32
+ 5. task-reviewer(グループ全体で1回)
33
+ 6. task-qa(グループ全体で1回)
34
+ 7. einja-task-commit
35
+ ```
36
+
37
+ ## 変更ファイル
38
+
39
+ ### 1. `.claude/commands/einja/task-exec.md`(主要変更)
40
+
41
+ #### allowed-tools に追加
42
+ - `Skill` ツールを追加(必要時のspec-context-loader呼び出し用)
43
+
44
+ #### 処理フローの書き換え
45
+
46
+ ##### Step 0: 入力解析(現行通り)
47
+ - Issue番号とタスクグループ番号を$ARGUMENTSから解析
48
+
49
+ ##### Step 1: Issueフェッチ + タスク解析(新規)
50
+
51
+ 1. `gh issue view` でIssue本文を取得
52
+ 2. 指定タスクグループ(X.Y)配下のタスク(X.Y.Z)をパース
53
+ 3. 各タスクのメタデータを抽出:
54
+ - タスク名
55
+ - 要件(Story番号)
56
+ - 依存関係(なし / X.Y.Z形式)
57
+ - 完了条件
58
+ - 対応設計セクション名
59
+ - シナリオテスト
60
+
61
+ ##### Step 2: spec読み込み + AC抽出(新規 - task-executerから移管)
62
+
63
+ 1. specディレクトリを探索: `docs/specs/issues/*/issue{N}-*/`
64
+ 2. 存在チェック:
65
+ - 完全なspec → 次へ
66
+ - 部分的spec → エラー終了
67
+ - specなし → general-context-loader Skill呼び出し
68
+ 3. requirements.mdを読み込み、各タスクのメタデータ(`**要件**: Story X`)に基づいてACを抽出
69
+ - ACはGiven/When/Then形式で小さい(~50-100トークン/AC)ので直接保持
70
+ 4. design.mdは**パスのみ特定**(内容は読み込まない)
71
+ - 各タスクの`**対応設計**: design.md「セクション名」`からセクション名を記録
72
+
73
+ ##### Step 3: TodoWrite登録(新規)
74
+
75
+ 各タスクを `TaskCreate` で登録:
76
+ ```
77
+ TaskCreate:
78
+ subject: "X.Y.Z タスク名"
79
+ description: |
80
+ ## 受け入れ基準(抽出済み)
81
+ - AC1.2: Given: DBスキーマ定義済 When: マイグレーション実行 Then: テーブル作成
82
+ - AC1.3: Given: アプリ起動 When: DB接続 Then: 正常接続
83
+ ## 設計参照
84
+ {specパス}/design.md → 「3. DB設計」セクション
85
+ ## 完了条件
86
+ DBに接続できること(AC1.2〜AC1.3を満たす)
87
+ ## 参考(追加情報が必要な場合)
88
+ - requirements.md: {specパス}/requirements.md
89
+ - design.md: {specパス}/design.md
90
+ activeForm: "タスクX.Y.Zを実装中"
91
+ ```
92
+
93
+ 依存関係を `TaskUpdate` の `addBlockedBy` で設定:
94
+ - `**依存関係**: 1.1.1` → 対応するTodoタスクIDを `addBlockedBy` に設定
95
+ - `**依存関係**: なし` → ブロックなし
96
+ - `**依存関係**: 1.1` (タスクグループ依存) → グループ外依存のため事前に完了済みと想定
97
+
98
+ ##### Step 4: 依存関係ベース並列実行ループ(新規)
99
+
100
+ ```
101
+ while (未完了タスクが存在):
102
+ 1. TaskList で未完了タスクを確認
103
+ 2. blockedBy が空かつ pending のタスクを収集
104
+ 3. 収集したタスクを TaskUpdate で in_progress に設定
105
+ 4. Task ツールで複数の task-executer を並列起動:
106
+ - 各 task-executer のpromptに以下を含める(ハイブリッド方式):
107
+ a. タスクID + タスク名 + 実装指示(Issueから抽出したサブタスク内容)
108
+ b. AC(受け入れ基準)→ 直接埋め込み(親が抽出済み)
109
+ c. 設計 → design.mdパス + セクション名(executerが自分でRead)
110
+ d. 完了条件
111
+ e. フォールバック用specファイルパス(追加情報が必要な場合)
112
+ - run_in_background: true で非同期起動(2タスク以上の場合)
113
+ 5. 各エージェントの完了を待機
114
+ 6. 完了したタスクを TaskUpdate で completed に設定
115
+ 7. ループ先頭に戻る
116
+ ```
117
+
118
+ ##### Step 5-7: レビュー・QA・コミット(現行と同様)
119
+ - task-reviewer: グループ全体で1回
120
+ - task-qa: グループ全体で1回
121
+ - einja-task-commit: QA合格後に実行
122
+
123
+ ##### フロー図
124
+
125
+ ```
126
+ ┌─────────────────────────────────────────────────────────┐
127
+ │ 品質保証ループ │
128
+ │ │
129
+ │ Issueパース → specパス特定 → TodoWrite登録 │
130
+ │ ↓ │
131
+ │ 依存関係ベース並列実行: │
132
+ │ task-executer × N(独立タスク並列) │
133
+ │ ↓ 全タスク完了 │
134
+ │ task-reviewer → task-qa │
135
+ │ ↑ │ │
136
+ │ └──────────────┘ │
137
+ │ (MAJOR/テスト失敗時は該当タスクのみ再実行) │
138
+ │ │
139
+ │ QA合格後 ↓ │
140
+ │ einja-task-commit Skill │
141
+ └─────────────────────────────────────────────────────────┘
142
+ ```
143
+
144
+ ### 2. `.claude/agents/einja/task/task-executer.md`(中規模変更)
145
+
146
+ #### A. Issue/spec自動読み込み機能の削除
147
+
148
+ 以下を削除:
149
+ - `skills:` セクションから `spec-context-loader`, `general-context-loader` を削除
150
+ - セクション「1.0 spec 存在チェック」を削除
151
+ - セクション「1.2 コンテキスト収集モードの決定」(1.2A, 1.2B, 1.2C)を削除
152
+ - spec関連エラー処理を削除
153
+
154
+ #### B. 入力形式の変更
155
+
156
+ 新しい入力形式をセクション冒頭に追記:
157
+
158
+ ```markdown
159
+ ## 入力(ハイブリッド方式)
160
+
161
+ task-exec(親)からpromptで以下の情報を受け取ります:
162
+ - **タスクID**: X.Y.Z形式
163
+ - **タスク名・実装指示**: Issueから抽出した具体的な作業内容
164
+ - **AC(直接埋込)**: Given/When/Then形式の受け入れ基準テキスト(親が抽出済み)
165
+ - **設計参照**: design.mdのファイルパス + セクション名(自分でReadする)
166
+ - **完了条件**: ACを含む具体的な完了条件
167
+ - **フォールバックパス**: requirements.md / design.md のフルパス(追加情報が必要な場合)
168
+
169
+ ACはpromptに直接含まれるので即座に参照可能。
170
+ 設計情報は指定されたパス+セクションをRead toolで読み込む。
171
+ ```
172
+
173
+ #### C. 実行フローの簡素化
174
+
175
+ 現行のセクション1(コンテキスト収集)を以下に置換:
176
+ ```markdown
177
+ ### 1. コンテキスト確認
178
+ 1.1 promptに埋め込まれたAC(受け入れ基準)を確認
179
+ 1.2 設計参照パス + セクション名に基づき、design.mdの該当セクションをReadで読み込む
180
+ 1.3 実装種別に応じたドキュメント参照(現行の1.3と同等)
181
+ 1.4 既存実装の分析(Serena MCPで関連コード調査 - 現行の1.1と同等)
182
+ ```
183
+
184
+ #### D. 並列実行時の注意事項(新規追加)
185
+
186
+ ```markdown
187
+ #### 4.0 並列実行モードの注意事項
188
+
189
+ task-execから個別タスク(X.Y.Z)として呼び出された場合:
190
+ - 指定されたタスクのみを実装する(他のタスクには触れない)
191
+ - git操作はCLAUDE.mdのサブエージェント安全ルールに従う
192
+ - コミットは行わない(task-exec完了後にまとめて実行)
193
+ ```
194
+
195
+ #### E. 修正記録パスの調整
196
+
197
+ ```
198
+ - **タスクグループ単位実行**: `modifications/task-{X}-{Y}.md`(従来互換)
199
+ - **個別タスク実行**: `modifications/task-{X}-{Y}-{Z}.md`
200
+ ```
201
+
202
+ ## 変更しないファイル
203
+
204
+ - `task-reviewer.md` - グループ全体レビューは現行通り
205
+ - `task-qa.md` - グループ全体QAは現行通り
206
+ - `task-management.md` - read-only(マネージドディレクトリ)
207
+ - `CLAUDE.md` - git安全ルールは既に十分
208
+
209
+ ## リスクと対策
210
+
211
+ | リスク | 対策 |
212
+ |--------|------|
213
+ | 並列task-executerのファイル衝突 | 設計書のセクション分割から変更対象を推定。重複懸念時は直列化 |
214
+ | TodoWrite IDと依存関係のマッピング | タスク番号→TodoID のマッピングテーブルを保持 |
215
+ | 失敗タスクのリカバリー | 失敗タスクとそれにブロックされるタスクを特定し再実行 |
216
+ | AC抽出精度 | ACはGiven/When/Then定型なので抽出は機械的。フォールバックパスも併記 |
217
+
218
+ ## 検証方法
219
+
220
+ 1. **構文確認**: 変更後のtask-exec.md、task-executer.mdをReadで確認
221
+ 2. **実際のIssueでテスト**: 既存のGitHub Issue(タスクグループ付き)に対して `/einja:task-exec` を実行
222
+ 3. **TodoWrite動作確認**: TaskList でタスクが正しく登録・依存関係設定されていることを確認
223
+ 4. **並列実行確認**: 独立タスクが実際に並列dispatchされることを確認
224
+ 5. **QAループ確認**: 全タスク完了後にreviewer→qaが正常に動作することを確認
@@ -0,0 +1,161 @@
1
+ # Plan: einja-skill-advisor Skill 作成
2
+
3
+ ## Context
4
+
5
+ タスク着手前に「Skillを先に作るべきか」を評価し、必要なら Skill 作成を TODO の先頭に積むメタ Skill を作成する。Plan mode 中でも評価・提案フェーズが動作し、Skill 作成自体は Plan 承認後に `einja-skill-creator` へ委譲する設計。
6
+
7
+ ## 作成するファイル
8
+
9
+ | ファイル | 内容 |
10
+ |---------|------|
11
+ | `.claude/skills/einja-skill-advisor/SKILL.md` | Skill 本体(新規作成) |
12
+
13
+ ## 修正するファイル
14
+
15
+ | ファイル | 変更内容 |
16
+ |---------|---------|
17
+ | `CLAUDE.md` | 必須フローに自動起動ステップ追加 + Skillテーブル追記 + キーワードトリガー追記 |
18
+ | `.claude/commands/einja/spec-create.md` | Phase 0 に skill-advisor 自動評価ステップ追加 |
19
+
20
+ ## Skill 設計概要
21
+
22
+ ### 名前・トリガー
23
+
24
+ - **Skill名**: `einja-skill-advisor`
25
+ - **allowed-tools**: `Read`, `Grep`, `Glob`(Plan mode 制約に完全適合)
26
+ - **起動方式**: 以下の3系統(いずれもユーザーが意識せず Claude が自動判断)
27
+ 1. **Plan mode 進入時**: CLAUDE.md の必須フロー Step 1 で自動実行。ユーザーが自由形式でタスクを依頼→Plan mode に入った時点で評価
28
+ 2. **spec-create 実行時**: `/einja:spec-create` の Phase 0(前提確認)で自動実行。新機能の仕様策定前に Skill の必要性を評価
29
+ 3. **明示起動(補助)**: キーワード「Skill作るべき?」「Skill-first」等でも直接呼び出し可能
30
+ - **設計意図**: 既存のドキュメント・Skill・サブエージェントがない領域のタスクで特に効果を発揮。「未整備の領域で場当たり的に作業する前に、まず Skill を作って品質を安定させる」判断を Claude が自動で行う
31
+
32
+ ### フロー(4ステップ)
33
+
34
+ ```
35
+ ステップ1: 作業パターン分析
36
+ - 作業カテゴリ特定(FE/BE/インフラ/ドキュメント/リファクタ等)
37
+ - 反復性評価(今後も繰り返すか、memory/patterns.md を参照)
38
+ - 複雑度評価(手順数・判断分岐数・参照ドキュメント数)
39
+
40
+ ステップ2: 既存Skillギャップ分析
41
+ - .claude/skills/einja-*/SKILL.md を Glob で動的取得
42
+ - 各Skillの name/description を読み取り、カバレッジを3段階判定
43
+ - 完全カバー → Skill作成不要
44
+ - 部分カバー → 既存Skill拡張を検討
45
+ - カバー外 → 新規Skill作成を検討
46
+
47
+ ステップ3: ROI評価(スコアリング)
48
+ コスト側: 作成時間 + 複雑度 + テスト必要度(各1-3点)
49
+ 価値側: 再利用頻度 + 品質安定化 + 時間節約 + チーム共有(各1-3点)
50
+ 判定: 価値合計 - コスト合計 >= 2 → 推奨
51
+
52
+ ステップ4: 構造化出力
53
+ - 判定結果(🟢推奨 / 🟡拡張推奨 / ⚪不要)
54
+ - Skill概要仕様(推奨時: 名前・目的・主要フロー・推定時間)
55
+ - 推奨ワークフロー
56
+ ```
57
+
58
+ ### スキップ基準(即座に「不要」判定)
59
+
60
+ - 単発の小規模修正(バグ修正、typo、設定値変更)
61
+ - CLAUDE.md のキーワードトリガーに既に一致するタスク
62
+ - 作業指示が具体的かつ限定的(「ファイルXのY行をZ変更」等)
63
+
64
+ ### Plan mode 対応
65
+
66
+ ```
67
+ Plan mode 内で skill-advisor が行うこと:
68
+ ✅ 既存Skill一覧を Glob + Read で取得
69
+ ✅ memory/patterns.md を参照
70
+ ✅ ROI評価ロジック実行(計算のみ)
71
+ ✅ 構造化された評価結果を返却
72
+
73
+ Plan mode 内で行わないこと:
74
+ ❌ ファイル作成・編集
75
+ ❌ einja-skill-creator の呼び出し
76
+ ❌ Bash コマンド実行
77
+
78
+ 親エージェントの責務(Plan mode 内):
79
+ - skill-advisor の結果を受け取り AskUserQuestion で提案
80
+ - 承認されたら計画ファイルの TODO-0 に Skill 作成を記載
81
+
82
+ Plan mode 解除後:
83
+ - TODO-0: einja-skill-creator で Skill 作成
84
+ - TODO-1〜: 作成した Skill で本作業実行
85
+ ```
86
+
87
+ ### einja-skill-creator との責務分離
88
+
89
+ | 責務 | skill-advisor | skill-creator |
90
+ |------|:---:|:---:|
91
+ | ギャップ分析・ROI評価 | ○ | - |
92
+ | Skill仕様ドラフト(概要) | ○ | - |
93
+ | SKILL.md 作成 | - | ○ |
94
+ | テスト・eval | - | ○ |
95
+
96
+ skill-advisor の出力(Skill概要仕様)が skill-creator の入力として機能する設計。
97
+
98
+ ## CLAUDE.md 変更内容
99
+
100
+ ### 1. 必須フローへの自動起動の組み込み(最重要)
101
+
102
+ 現行の必須フロー:
103
+ ```
104
+ 1. 問題・要件を調査・分析する
105
+ 2. 修正計画を docs/plans/ に作成し提示する
106
+ 3. ユーザーの明示的な承認を得る
107
+ 4. 承認後、実装を開始する
108
+ ```
109
+
110
+ 変更後:
111
+ ```
112
+ 1. 問題・要件を調査・分析する
113
+ 2. 修正計画を docs/plans/ に作成する
114
+ 3. einja-skill-advisor で「Skill を先に作るべきか」を自動評価する
115
+ - 計画の内容・スコープを見て判断(全体像が見えた状態で評価)
116
+ - 推奨判定 → AskUserQuestion でユーザーに提案
117
+ - 承認 → 計画の TODO-0 に Skill 作成を追加
118
+ - 不要判定 → そのまま次へ進む
119
+ ※ スキップ基準に該当する場合は評価自体を省略
120
+ 4. 計画をユーザーに提示し、明示的な承認を得る
121
+ 5. 承認後、実装を開始する(TODO-0 があれば Skill 作成から)
122
+ ```
123
+
124
+ **ポイント**: 計画を作って全体像が見えてから Skill の必要性を判断する。ユーザーが Skill の存在を知らなくても、Claude Code 側から自動的に「先に Skill を作ったほうが効率的です」と提案する。
125
+
126
+ ### 2. spec-create.md への組み込み
127
+
128
+ spec-create の Phase 0(前提確認)に追加:
129
+ ```
130
+ Phase 0: 前提確認
131
+ ├─ TDD適用判定
132
+ ├─ 要件明確さ確認
133
+ ├─ ブランチ選択
134
+ └─ 【追加】einja-skill-advisor で Skill 作成必要性を評価
135
+ → 推奨時はユーザーに提案、承認なら先に Skill 作成
136
+ ```
137
+
138
+ ### 3. Skill・コマンドテーブルに追記
139
+
140
+ ```markdown
141
+ | `einja-skill-advisor` | 作業前のSkill作成必要性評価(Plan/spec-create時に自動起動) |
142
+ ```
143
+
144
+ ### 4. キーワードトリガーテーブルに追記(excluded セクション)
145
+
146
+ ```markdown
147
+ | `Skill作るべき?` `Skill化` `skill-advisor` `Skill-first` | `.claude/skills/einja-skill-advisor/SKILL.md` |
148
+ ```
149
+
150
+ ## 実装手順
151
+
152
+ 1. **SKILL.md 作成**: `einja-skill-creator` Skill を使用して `.claude/skills/einja-skill-advisor/SKILL.md` を作成
153
+ 2. **CLAUDE.md 更新**: テーブル2箇所に追記
154
+ 3. **動作確認**: 適当なタスク説明を与えて Skill を呼び出し、評価結果の出力を確認
155
+
156
+ ## 検証方法
157
+
158
+ - skill-advisor を Task ツールで呼び出し、テストケースで動作確認:
159
+ - ケース1: 「ログイン画面を作って」→ 既存 Skill(frontend-implement系)でカバー → 不要判定
160
+ - ケース2: 「Prismaスキーマ変更の自動マイグレーション運用を整備して」→ 既存 Skill にない → 推奨判定
161
+ - ケース3: 「READMEのtypo修正」→ スキップ基準に該当 → 即座に不要判定