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,172 @@
1
+ # Plan: einja-skill-creator を公式版に追従改善 + skill-first hook修正
2
+
3
+ ## Context
4
+
5
+ 公式 Anthropic skill-creator(`anthropics/claude-plugins-official`)が更新されており、einja版は以前のバージョンをベースに日本語化・カスタマイズしたもの。
6
+ 公式版との差分を分析し、einja版に取り込むべき改善点を特定した。
7
+
8
+ また、Plan mode時に `einja-skill-first` の評価リマインダーを自動注入する `plan-mode-skill-loader.sh` hookが正常に機能していないことが判明。hookの修正も本Planに含める。
9
+
10
+ ---
11
+
12
+ ## 差分分析サマリー
13
+
14
+ ### 優先度: 高(機能・正確性に影響)
15
+
16
+ | # | 差分 | 影響 |
17
+ |---|------|------|
18
+ | 1 | **run_loop.py のシグネチャ不一致** — `holdout`が公式=float(割合) vs einja=int(件数)、第一引数が`eval_set:list` vs `eval_set_path:str` | SKILL.mdの手順通りに`--holdout 0.4`で実行すると動作しない |
19
+ | 2 | **run_loop.py のtrain/test順次実行** — 公式版は1バッチで並列実行してから分割、einja版は順次 | 評価実行時間が約2倍 |
20
+ | 3 | **run_loop.py のblinded_history欠落** — 公式版はimprove時にtest結果を隠蔽してオーバーフィット防止 | einja版はtestスコアが改善プロンプトに漏れてオーバーフィットリスクあり |
21
+ | 4 | **aggregate_benchmark.py が完全別機能** — 公式版はschemas.md準拠のbenchmark.json生成、einja版は複数run_loop出力の横断比較 | Benchmarkモード(viewer.htmlのBenchmarkタブ)が動作しない |
22
+ | 5 | **SKILL.md: grading.jsonフィールド名警告の欠落** — `text`/`passed`/`evidence`必須、`name`/`met`/`details`禁止 | viewerがフィールド不一致で正しく表示されないリスク |
23
+
24
+ ### 優先度: 中(品質・UXに影響)
25
+
26
+ | # | 差分 | 影響 |
27
+ |---|------|------|
28
+ | 6 | **SKILL.md: eval queryのGood/Bad具体例が欠落** — トリガー評価クエリの品質基準 | 低品質なevalクエリが生成されdescription最適化の精度低下 |
29
+ | 7 | **SKILL.md: タイミングデータ即時処理の警告欠落** — 「通知は1回限り、バッチ不可」 | timing.jsonの保存漏れリスク |
30
+ | 8 | **SKILL.md: コアループ再掲+TodoList指示の欠落** — 末尾のフロー要約とCowork向けTodoList指示 | 作業手順の抜け漏れリスク(特にCowork環境) |
31
+ | 9 | **SKILL.md: Claude.ai制限の文脈説明欠落** — ブラインドテスト不可の注意 | ユーザーが結果の制限を理解できない |
32
+ | 10 | **run_loop.py: ブラウザ自動オープン+results_dir保存機能なし** | ライブモニタリング・出力管理の利便性低下 |
33
+ | 11 | **generate_report.py: stdin対応なし** — 公式版は`--input -`でstdinから読める | パイプライン連携の柔軟性が低い |
34
+
35
+ ### 優先度: 低(軽微・好みの問題)
36
+
37
+ | # | 差分 | 影響 |
38
+ |---|------|------|
39
+ | 12 | **SKILL.md: feedback.jsonのスキーマ例欠落** | ユーザーがフィードバック形式を理解しにくい |
40
+ | 13 | **SKILL.md: Coworkフィードバックアクセス権限の注意欠落** | Coworkユーザーがfeedback.json読み込みで詰まる |
41
+ | 14 | **generate_report.py: UIデザインの差異** — 公式版はtest/train色分けが明確 | 視認性の差(機能的には同等) |
42
+
43
+ ### einja版の独自強み(維持すべき)
44
+
45
+ | 要素 | 内容 |
46
+ |------|------|
47
+ | `init_skill.py` | Skill初期化スクリプト(公式版にない) |
48
+ | 参考ドキュメント記録規約 | 設計根拠追跡のHTMLコメント記録 |
49
+ | `@einja:excluded` / `@einja:project-private` | テンプレート除外マーカー |
50
+ | `quick_validate.py` のeinja固有チェック | プレフィックス推奨、行数チェック |
51
+ | import フォールバック | `run_eval.py`のtry/except import |
52
+ | description日英併記 | 日本語ユーザー向けトリガー精度向上 |
53
+
54
+ ---
55
+
56
+ ## 推奨改善アプローチ
57
+
58
+ ### Phase 0: plan-mode-skill-loader.sh hook修正
59
+
60
+ **対象ファイル**: `.claude/hooks/einja/plan-mode-skill-loader.sh`
61
+
62
+ **現状**: hook自体は正常終了(exit 0)するが、`additionalContext` のリマインダーがAIコンテキストに到達していない。会話冒頭で `UserPromptSubmit hook success: Success` のみ表示され、リマインダーテキストが注入されていない。
63
+
64
+ **調査・修正方針**:
65
+
66
+ 1. **デバッグ確認**: hookにデバッグ出力を追加し、`permission_mode` の実際の値を確認
67
+ - `echo "DEBUG: permission_mode=$permission_mode" >&2` を追加して値を特定
68
+ 2. **原因候補の検証**:
69
+ - `permission_mode` が `"plan"` 以外の値(例: `"default"` でPlan modeでも変わらない等)
70
+ - `additionalContext` の出力が "discrete"(背景的)すぎて実効性がない
71
+ - jqの出力がパイプで消失している
72
+ 3. **修正案**:
73
+ - **案A**: `additionalContext` を `hookSpecificOutput` でネストして明示的に注入
74
+ - **案B**: Plain text stdoutに切り替えてトランスクリプトに直接表示
75
+ - **案C**: `permission_mode` の条件を緩和/修正(値が異なる場合)
76
+ 4. **検証**: Plan modeで新セッションを開始し、リマインダーが表示されることを確認
77
+
78
+ ### Phase 1: スクリプト互換性修正(高優先度 #1-4)
79
+
80
+ **注意**: Phase 1完了後、SKILL.mdのコマンド例が一時的に不整合になる。Phase 2で連動更新する。
81
+
82
+ #### 1-a. run_loop.py を公式版ベースに再構築
83
+ - `holdout` を float 割合に統一(公式: `0.4` = 40%)
84
+ - train/test 並列バッチ実行に変更(1バッチで並列→分割)
85
+ - blinded_history を追加(test結果を隠蔽してオーバーフィット防止)
86
+ - ブラウザ自動オープン(`webbrowser.open`)・`results_dir` 保存を追加
87
+ - 終了条件を公式版に統一(trainのみ全パスで終了、testは過学習チェック用)
88
+ - **einja独自機能の保持判断**:
89
+ - `--improve-model`(評価/改善モデル分離)→ **保持**(公式版より柔軟)
90
+ - `--seed`(再現性確保)→ **保持**(デバッグに有用)
91
+ - import フォールバック・日本語コメント → **保持**
92
+
93
+ #### 1-b. improve_description.py の互換性確認・修正
94
+ - blinded_history導入に伴うシグネチャ変更の要否を確認
95
+ - 公式版: `/tmp/official-sc-scripts-improve_description.py`
96
+ - einja版: `.claude/skills/einja-skill-creator/scripts/improve_description.py`
97
+ - 差分があればblinded_history対応を追加
98
+
99
+ #### 1-c. aggregate_benchmark.py を公式版に差し替え
100
+ - 既存のeinja版横断比較機能は `compare_runs.py` に別名保存
101
+ - schemas.md準拠のbenchmark.json生成を復元(viewer.htmlのBenchmarkタブが動作するように)
102
+ - **現状の不整合**: einja版SKILL.mdに記載のコマンド `python -m scripts.aggregate_benchmark <workspace>/iteration-N --skill-name <name>` が既にeinja版スクリプトでは動作しない状態。公式版差し替えでこの不整合が解消される
103
+
104
+ ### Phase 2: SKILL.md内容補完(高・中優先度 #5-9) ※Phase 1との連動更新含む
105
+
106
+ #### 2-a. Phase 1連動のコマンド例更新
107
+ - run_loopのコマンド例を公式版シグネチャに合わせて更新
108
+ - `--holdout 0.4` 引数の追記
109
+ - `--improve-model`(einja独自)の説明追記
110
+ - aggregate_benchmarkのコマンド例は既に正しい(公式版差し替えで整合)
111
+
112
+ #### 2-b. 公式版の重要な詳細を追記
113
+ - grading.jsonフィールド名警告(#5)— `text`/`passed`/`evidence`必須、誤フィールド禁止
114
+ - eval queryのGood/Bad具体例(#6)— 公式版の具体例を日本語化
115
+ - タイミングデータ即時処理警告(#7)— 「通知は1回限り、バッチ不可」
116
+ - コアループ再掲+TodoList指示(#8)— 末尾にフロー要約を追加
117
+ - Claude.ai制限の文脈説明(#9)— ブラインドテスト不可の注意
118
+ - feedback.jsonスキーマ例(#12)
119
+ - Coworkアクセス権限注意(#13)
120
+
121
+ #### 2-c. compare_runs.py(別名保存した横断比較)の説明追加(任意)
122
+
123
+ ### Phase 3: UX改善(中・低優先度 #10-14)
124
+
125
+ 4. **generate_report.py のstdin対応追加**(`--input -`)
126
+ 5. **generate_report.py のtest/train色分け改善**(任意)
127
+ 6. **回帰テスト**: `init_skill.py`・`quick_validate.py` が引き続き動作することを確認
128
+
129
+ ---
130
+
131
+ ## 対象ファイル
132
+
133
+ | ファイル | 変更内容 |
134
+ |---------|---------|
135
+ | `.claude/hooks/einja/plan-mode-skill-loader.sh` | デバッグ・修正(リマインダー注入が機能するように) |
136
+ | `.claude/skills/einja-skill-creator/SKILL.md` | 公式版の詳細指示を追記 + コマンド例更新 |
137
+ | `.claude/skills/einja-skill-creator/scripts/run_loop.py` | 公式版ベースに再構築(einja独自機能保持) |
138
+ | `.claude/skills/einja-skill-creator/scripts/improve_description.py` | blinded_history対応(要否確認後) |
139
+ | `.claude/skills/einja-skill-creator/scripts/aggregate_benchmark.py` | 公式版に差し替え(既存は `compare_runs.py` に別名保存) |
140
+ | `.claude/skills/einja-skill-creator/scripts/compare_runs.py` | aggregate_benchmark.pyの旧einja版を別名保存 |
141
+ | `.claude/skills/einja-skill-creator/scripts/generate_report.py` | stdin対応追加 |
142
+
143
+ ## 公式版ファイル(参照用)
144
+
145
+ `/tmp/` にダウンロード済み:
146
+ - `/tmp/official-skill-creator-SKILL.md` — 公式SKILL.md(479行)
147
+ - `/tmp/official-sc-scripts-run_loop.py` — 公式run_loop.py
148
+ - `/tmp/official-sc-scripts-aggregate_benchmark.py` — 公式aggregate_benchmark.py
149
+ - `/tmp/official-sc-scripts-generate_report.py` — 公式generate_report.py
150
+ - その他 `/tmp/official-sc-*` — 公式版の全ファイル
151
+
152
+ ## 検証方法
153
+
154
+ ### Phase 0: hook修正
155
+ - Plan modeで新セッションを開始し、`<system-reminder>` にskill-firstリマインダーが表示されることを確認
156
+ - Plan mode以外ではリマインダーが注入されないことを確認
157
+
158
+ ### Phase 1: スクリプト互換性
159
+ - `python -m scripts.run_loop --help` で引数が公式版と一致(`--holdout` がfloat、`--results-dir` 等が存在)
160
+ - `python -m scripts.aggregate_benchmark --help` で引数が公式版と一致(ディレクトリ引数)
161
+ - `python -m scripts.improve_description --help` でblinded_history対応を確認
162
+ - 小規模実行テスト: 2-3クエリのeval setで `run_loop` を実際に実行し、benchmark.json生成→viewer.htmlのBenchmarkタブ表示まで確認
163
+ - `compare_runs.py` が旧einja版の横断比較機能として動作することを確認
164
+
165
+ ### Phase 2: SKILL.md補完
166
+ - SKILL.md の公式版との差分レビュー(grading.jsonフィールド警告、eval query Good/Bad例、コアループ再掲等が反映されていることを目視確認)
167
+ - SKILL.md のコマンド例が更新後のスクリプトシグネチャと整合していることを確認
168
+
169
+ ### Phase 3: UX + 回帰テスト
170
+ - `python -m scripts.quick_validate` でスキーマ検証パス
171
+ - `init_skill.py` が引き続き動作することを確認
172
+ - `generate_report.py` のstdin対応テスト
@@ -0,0 +1,179 @@
1
+ # 計画レビュー結果: generic-sleeping-snowglobe
2
+
3
+ ## レビュー完了日時
4
+ 2026-03-04
5
+
6
+ ## 総評
7
+ ⚠️ PARTIAL - 3件の重要な問題を検出。修正後に実装可能。
8
+
9
+ ## 問題点と修正指示
10
+
11
+ ### 問題1: Step 2 に Manager worktree 作成が記述されていない【最重要】
12
+
13
+ **箇所:** `.claude/commands/einja/issue-exec.md` L124-137
14
+
15
+ **現状:**
16
+ ```markdown
17
+ ### Step 2: ブランチ & worktree 作成
18
+ 1. Issue ブランチ作成: `issue/{issue番号}`(base ブランチから)
19
+ 2. 各 Phase のブランチ作成: `issue/{issue番号}-phase{N}`(issue ブランチから)
20
+ 3. git worktree 作成:
21
+ mkdir -p ~/.einja/worktrees/issue-{N}/
22
+ git worktree add ~/.einja/worktrees/issue-{N}/phase{M} issue/{N}-phase{M}
23
+ ```
24
+
25
+ **修正後:**
26
+ ```markdown
27
+ ### Step 2: ブランチ & worktree 作成
28
+ 1. Issue ブランチ作成: `issue/{issue番号}`(base ブランチから)
29
+ 2. Manager worktree 作成(メインリポジトリから):
30
+ ```bash
31
+ mkdir -p ~/.einja/worktrees/issue-{N}/
32
+ git worktree add ~/.einja/worktrees/issue-{N}/manager issue/{N}
33
+ git push -u origin issue/{N}
34
+ ```
35
+ 3. **以降の操作は全て Manager worktree 内から実行する**(cwd: `~/.einja/worktrees/issue-{N}/manager`)
36
+ 4. 各 Phase のブランチ作成(Manager worktree から): `issue/{issue番号}-phase{N}`(issue ブランチから)
37
+ 5. Phase worktree 作成(Manager worktree から):
38
+ ```bash
39
+ git worktree add ~/.einja/worktrees/issue-{N}/phase{M} issue/{N}-phase{M}
40
+ git push -u origin issue/{N}-phase{M}
41
+ ```
42
+ ```
43
+
44
+ **理由:** 計画の中核である「Manager を worktree 化」が実装記述に反映されていない
45
+
46
+ ---
47
+
48
+ ### 問題2: Step 4 tmux セッション起動ディレクトリ未指定
49
+
50
+ **箇所:** `.claude/commands/einja/issue-exec.md` L166-168
51
+
52
+ **現状:**
53
+ ```bash
54
+ tmux new-session -d -s einja-{issue番号} -n manager
55
+ ```
56
+
57
+ **修正後:**
58
+ ```bash
59
+ tmux new-session -d -s einja-{issue番号} -n manager -c ~/.einja/worktrees/issue-{N}/manager
60
+ ```
61
+
62
+ **理由:** Manager が worktree 内で動作するよう cwd を明示する必要がある
63
+
64
+ ---
65
+
66
+ ### 問題3: worktree 物理パス構成図に manager/ が欠落
67
+
68
+ **箇所:** `.claude/commands/einja/issue-exec.md` L266-270
69
+
70
+ **現状:**
71
+ ```markdown
72
+ ## worktree 物理パス
73
+ ```
74
+ ~/.einja/worktrees/issue-{N}/
75
+ ├── phase{M}/ ← Director cwd
76
+ ├── task-{X.Y}/ ← Worker cwd
77
+ ```
78
+ ```
79
+
80
+ **修正後:**
81
+ ```markdown
82
+ ## worktree 物理パス
83
+ ```
84
+ ~/.einja/worktrees/issue-{N}/
85
+ ├── manager/ ← Manager cwd(NEW)
86
+ ├── phase{M}/ ← Director cwd
87
+ ├── task-{X.Y}/ ← Worker cwd
88
+ ```
89
+ ```
90
+
91
+ **理由:** 計画で明記された構成図との整合性
92
+
93
+ ---
94
+
95
+ ## 改善提案
96
+
97
+ ### 提案1: Step 0-3 セッション復元に Manager worktree 再作成を追記
98
+
99
+ **箇所:** `.claude/commands/einja/issue-exec.md` L112-114
100
+
101
+ **現状:**
102
+ ```markdown
103
+ #### 3. セッション復元
104
+ - `--resume` フラグがある場合、`~/.einja/sessions/issue-{N}/session.json` からセッション状態を復元
105
+ - 未完了のPhaseのDirectorを再起動する
106
+ ```
107
+
108
+ **追記案:**
109
+ ```markdown
110
+ #### 3. セッション復元
111
+ - `--resume` フラグがある場合、`~/.einja/sessions/issue-{N}/session.json` からセッション状態を復元
112
+ - Manager worktree の存在確認: `git worktree list | grep issue-{N}/manager`
113
+ - 存在しない場合は再作成: `git worktree add ~/.einja/worktrees/issue-{N}/manager issue/{N}`
114
+ - 未完了のPhaseのDirectorを再起動する
115
+ ```
116
+
117
+ **理由:** 計画で明記されているが、実装記述に含まれていない
118
+
119
+ ---
120
+
121
+ ### 提案2: セッションクリーンアップに Manager worktree 削除を追加
122
+
123
+ **箇所:** `.claude/commands/einja/issue-exec.md` L390-395
124
+
125
+ **現状:**
126
+ ```markdown
127
+ ## セッションクリーンアップ
128
+
129
+ Issue完了時に以下を自動削除:
130
+ - `~/.einja/sessions/issue-{N}/` (セッションファイル)
131
+ - `~/.einja/worktrees/issue-{N}/` (worktree。事前に `git worktree remove` を実行)
132
+ - ローカルブランチのクリーンアップ(task/*, issue/*-phase*)
133
+ ```
134
+
135
+ **追記案:**
136
+ ```markdown
137
+ ## セッションクリーンアップ
138
+
139
+ Issue完了時に以下を自動削除:
140
+ - `~/.einja/sessions/issue-{N}/` (セッションファイル)
141
+ - `~/.einja/worktrees/issue-{N}/` (worktree。事前に `git worktree remove` を各ディレクトリに対して実行)
142
+ - `git worktree remove ~/.einja/worktrees/issue-{N}/manager`
143
+ - `git worktree remove ~/.einja/worktrees/issue-{N}/phase{M}`
144
+ - `git worktree remove ~/.einja/worktrees/issue-{N}/task-{X.Y}`
145
+ - ローカルブランチのクリーンアップ(task/*, issue/*-phase*, issue/{N})
146
+ ```
147
+
148
+ **理由:** Manager worktree も削除対象に含める必要がある
149
+
150
+ ---
151
+
152
+ ## 検証済み項目
153
+
154
+ ### ✅ 技術的正確性
155
+ - worktree内から `git worktree add` / `git branch` / `git push` が動作することを確認済み(計画に記載あり)
156
+
157
+ ### ✅ 複数Issue同時実行の安全性
158
+ - 各 Manager が独立した worktree で動作するため race condition は発生しない
159
+ - ブランチ名も `issue/{N}` で分離されており衝突しない
160
+
161
+ ### ✅ 後方互換性
162
+ - Director/Worker の起動方法は変更なし
163
+ - ステータスファイル構造は絶対パスで管理されており影響なし
164
+
165
+ ### ✅ その他の変更なし箇所
166
+ - Director/Worker 起動方法
167
+ - ステータスファイル構造
168
+ - `gh pr create` コマンド
169
+ - `einja-team-exec` Skill
170
+ - `task-exec` コマンド
171
+
172
+ ---
173
+
174
+ ## 次のステップ
175
+
176
+ 1. 上記3件の問題を修正する
177
+ 2. 改善提案2件を検討・適用する
178
+ 3. 修正後、issue-exec.md の全体整合性を再確認する
179
+ 4. `presets/default/` へのビルド反映は自動(CLAUDE.md記載のとおり)
@@ -0,0 +1,108 @@
1
+ # Plan: issue-exec Manager を worktree 化し、複数Issue同時実行を可能にする
2
+
3
+ ## Context
4
+
5
+ 現在の `issue-exec` コマンドでは、Manager がメインリポジトリで直接動作する。
6
+ これにより:
7
+ 1. 複数Issue同時実行時に git 状態の race condition リスクがある
8
+ 2. Manager 実行中にメインリポジトリで手動作業ができない
9
+
10
+ Manager も worktree で動作させることで、これらを解消する。
11
+
12
+ **技術的前提**: Git 2.15+ では worktree 内から `git worktree add` / `git branch` / `git push` が可能(検証済み)。
13
+
14
+ ## 変更対象
15
+
16
+ `.claude/commands/einja/issue-exec.md` (1ファイルのみ)
17
+
18
+ ## 具体的な変更箇所(5箇所)
19
+
20
+ ### 1. Step 2: ブランチ & worktree 作成(L124-137)
21
+
22
+ Manager worktree を最初に作成し、以降のgit操作はすべて Manager worktree 内から実行する。
23
+
24
+ ```markdown
25
+ ### Step 2: ブランチ & worktree 作成
26
+ 1. Issue ブランチ作成(メインリポジトリから): `issue/{issue番号}`(base ブランチから)
27
+ 2. Manager worktree 作成(メインリポジトリから):
28
+ ```bash
29
+ mkdir -p ~/.einja/worktrees/issue-{N}/
30
+ git worktree add ~/.einja/worktrees/issue-{N}/manager issue/{N}
31
+ git push -u origin issue/{N}
32
+ ```
33
+ 3. **以降の操作は全て Manager worktree 内から実行**(cwd: `~/.einja/worktrees/issue-{N}/manager`)
34
+ 4. 各 Phase のブランチ作成(Manager worktree から): `issue/{issue番号}-phase{N}`(issue ブランチから)
35
+ 5. Phase worktree 作成(Manager worktree から):
36
+ ```bash
37
+ git worktree add ~/.einja/worktrees/issue-{N}/phase{M} issue/{N}-phase{M}
38
+ git push -u origin issue/{N}-phase{M}
39
+ ```
40
+ ```
41
+
42
+ ### 2. Step 4: tmux セッション作成(L166-168)
43
+
44
+ Manager の cwd を worktree に指定する。
45
+
46
+ ```bash
47
+ tmux new-session -d -s einja-{issue番号} -n manager -c ~/.einja/worktrees/issue-{N}/manager
48
+ ```
49
+
50
+ ### 3. Step 0-3: セッション復元(L112-114)
51
+
52
+ Manager worktree の存在確認・再作成ロジックを追加。
53
+
54
+ ```markdown
55
+ #### 3. セッション復元
56
+ - `--resume` フラグがある場合、`~/.einja/sessions/issue-{N}/session.json` からセッション状態を復元
57
+ - Manager worktree の存在確認: `git worktree list | grep issue-{N}/manager`
58
+ - 存在しない場合は再作成: `git worktree add ~/.einja/worktrees/issue-{N}/manager issue/{N}`
59
+ - 未完了のPhaseのDirectorを再起動する
60
+ ```
61
+
62
+ ### 4. worktree 物理パス構成図(L266-270)
63
+
64
+ `manager/` を追加。
65
+
66
+ ```
67
+ ~/.einja/worktrees/issue-{N}/
68
+ ├── manager/ ← Manager cwd
69
+ ├── phase{M}/ ← Director cwd
70
+ ├── task-{X.Y}/ ← Worker cwd
71
+ ```
72
+
73
+ ### 5. セッションクリーンアップ(L390-395)
74
+
75
+ Manager worktree を削除対象に追加。
76
+
77
+ ```markdown
78
+ Issue完了時に以下を自動削除:
79
+ - `~/.einja/sessions/issue-{N}/` (セッションファイル)
80
+ - `~/.einja/worktrees/issue-{N}/` (worktree。事前に `git worktree remove` を各ディレクトリに対して実行)
81
+ - `git worktree remove ~/.einja/worktrees/issue-{N}/task-{X.Y}`(Worker)
82
+ - `git worktree remove ~/.einja/worktrees/issue-{N}/phase{M}`(Director)
83
+ - `git worktree remove ~/.einja/worktrees/issue-{N}/manager`(Manager - 最後に削除)
84
+ - ローカルブランチのクリーンアップ(task/*, issue/*-phase*)
85
+ ```
86
+
87
+ ## ブランチ構成図の更新
88
+
89
+ ```
90
+ {baseBranch}
91
+ └── issue/{N} Manager worktree(← 変更点)
92
+ ├── issue/{N}-phase1 Director1 worktree
93
+ │ ├── task/{N}-1.1 Worker1.1 worktree
94
+ ...
95
+ ```
96
+
97
+ ## 変更しない箇所
98
+
99
+ - Director/Worker の起動方法
100
+ - ステータスファイル構造(絶対パスで管理)
101
+ - `gh pr create` コマンド
102
+ - `task-exec` コマンド
103
+ - `einja-team-exec` Skill
104
+
105
+ ## 検証方法
106
+
107
+ 1. 変更後の `issue-exec.md` 全体を通読し、Step 0〜7の整合性を確認
108
+ 2. worktree 構成図・ブランチ構成図が一致しているか確認
@@ -0,0 +1,57 @@
1
+ # Plan: conflict-resolver サブエージェント廃止 → Skill一本化
2
+
3
+ ## Context
4
+
5
+ `conflict-resolver` はサブエージェント定義(`.claude/agents/`)とSkill定義(`.claude/skills/`)の2重構造になっている。
6
+ サブエージェント経由では `AskUserQuestion` が使えないため、コンフリクト解消の核心機能(1ファイルずつユーザー確認)が動作しない。
7
+ Skill単体で親エージェントが直接実行すれば `AskUserQuestion` が正常に動作するため、サブエージェント定義を廃止してSkill一本化する。
8
+
9
+ ## 変更内容
10
+
11
+ ### TODO-1: エージェント定義の削除
12
+
13
+ **削除ファイル:**
14
+ - `.claude/agents/einja/git/conflict-resolver.md`
15
+
16
+ ### TODO-2: CLAUDE.md の参照更新
17
+
18
+ **ファイル:** `CLAUDE.md`
19
+
20
+ - **行29**: サブエージェント委託テーブルから `コンフリクト解消 → conflict-resolver` の行を削除
21
+ - **行41**: Skill テーブルの `einja-conflict-resolver` はそのまま維持
22
+ - **行92**: `gitコンフリクト発生時の対応` セクションもそのまま維持(既にSkillを参照している)
23
+
24
+ ### TODO-3: einja-task-commit Skill の参照更新
25
+
26
+ **ファイル:** `.claude/skills/einja-task-commit/SKILL.md`
27
+
28
+ - **行52**: `conflict-resolver エージェント を Task ツールで呼び出して解消` → `einja-conflict-resolver Skill の手順に従って解消`
29
+ - **行256**: `conflict-resolver エージェントを Task ツールで呼び出して解消を試行` → `einja-conflict-resolver Skill の手順に従って解消を試行`
30
+
31
+ ### TODO-4: issue-exec コマンドの参照更新
32
+
33
+ **ファイル:** `.claude/commands/einja/issue-exec.md`
34
+
35
+ - **行349**: `conflict-resolverで自力解消` → `einja-conflict-resolver Skillで自力解消`
36
+
37
+ ### TODO-5: .einja-sync.json のエントリ削除
38
+
39
+ **ファイル:** `.einja-sync.json`
40
+
41
+ - agent定義のsyncエントリ(`.claude/agents/einja/git/conflict-resolver.md`)を削除
42
+
43
+ ### 変更不要(参照のみ・読み取り専用)
44
+
45
+ | ファイル | 理由 |
46
+ |---------|------|
47
+ | `docs/einja/steering/branch-strategy.md` | マネージドディレクトリ(読み取り専用)※ただしこのリポジトリでは編集可。"conflict-resolver で解消"は曖昧でSkillを指すとも読めるため変更不要 |
48
+ | `docs/einja/instructions/issue-exec-workflow.md` | 同上 |
49
+ | `docs/plans/*.md` | 過去のPlan。履歴として変更不要 |
50
+ | `.claude/commands/einja/einja-sync.md` | "einja-conflict-resolver Skill は使用しない"の記述。変更不要 |
51
+ | `.claude/skills/einja-conflict-resolver/SKILL.md` | Skill本体。変更不要 |
52
+
53
+ ## 検証
54
+
55
+ 1. `grep -r "conflict-resolver" .claude/agents/` でエージェント定義が残っていないことを確認
56
+ 2. `grep -r "conflict-resolver.*エージェント.*Task" .claude/ CLAUDE.md` でサブエージェント呼び出し記述が残っていないことを確認
57
+ 3. `pnpm prepush` でlint/typecheck/testが通ることを確認
@@ -0,0 +1,126 @@
1
+ # Plan: Plan mode進入時にeinja-skill-firstを自動リマインドするhook
2
+
3
+ ## Context
4
+
5
+ 現在、`einja-skill-first` SkillはCLAUDE.mdの指示に基づいて親エージェントが手動で呼び出す運用になっている。しかし強制力がなく、忘れる可能性がある。
6
+
7
+ `UserPromptSubmit` hookを使い、Plan mode中のプロンプト送信時に**軽量リマインダー**を自動注入することで、確実にeinja-skill-first評価が実行される仕組みを作る。
8
+
9
+ **なぜ `UserPromptSubmit` か:**
10
+ - `PreToolUse(EnterPlanMode)` はLLMが呼ぶ場合のみ発火し、**Shift+Tab**での手動Plan mode進入をカバーできない
11
+ - `UserPromptSubmit` は `permission_mode` フィールドを受け取れるため、Plan mode中の全プロンプト送信を確実に検出可能
12
+
13
+ **なぜ軽量リマインダー方式か:**
14
+ - SKILL.md全文(240行)を注入するとコンテキストを圧迫する
15
+ - 短い指示(2-3行)なら毎回注入しても低コスト → **状態管理(フラグファイル等)が不要**
16
+ - LLMが自分でSKILL.mdを読みに行くので、Compaction後も再読み込み可能
17
+
18
+ ## 実装内容
19
+
20
+ ### 1. hookスクリプト作成
21
+
22
+ **ファイル**: `.claude/hooks/einja/plan-mode-skill-loader.sh`
23
+
24
+ ```bash
25
+ #!/bin/bash
26
+ # plan-mode-skill-loader.sh - Plan mode中にeinja-skill-firstのリマインダーを注入
27
+ #
28
+ # UserPromptSubmit hookとして設定
29
+ # permission_mode == "plan" の場合に、軽量リマインダーをadditionalContextとして注入
30
+ # 毎回注入しても2-3行なのでコスト無視可能。状態管理不要。
31
+
32
+ set -uo pipefail
33
+
34
+ input=$(cat)
35
+
36
+ # permission_modeを取得
37
+ permission_mode=$(echo "$input" | jq -r '.permission_mode // empty')
38
+
39
+ # Plan mode以外はスキップ
40
+ if [[ "$permission_mode" != "plan" ]]; then
41
+ exit 0
42
+ fi
43
+
44
+ # 軽量リマインダーを注入
45
+ jq -n '{
46
+ "additionalContext": "【Plan mode自動リマインダー】計画作成前にeinja-skill-firstの評価を実施してください。.claude/skills/einja-skill-first/SKILL.mdを参照し、スキップ基準に該当しない場合はSkill作成の必要性を評価してください。スキップ基準(単発の小規模修正、既存キーワードトリガー一致、具体的かつ限定的な作業指示、1回限りの作業)に該当する場合は省略可。"
47
+ }'
48
+ ```
49
+
50
+ ### 2. settings.json にhookを追加
51
+
52
+ **ファイル**: `.claude/settings.json`
53
+
54
+ `hooks` セクションに `UserPromptSubmit` を追加:
55
+
56
+ ```json
57
+ "UserPromptSubmit": [
58
+ {
59
+ "hooks": [
60
+ {
61
+ "type": "command",
62
+ "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/einja/plan-mode-skill-loader.sh",
63
+ "timeout": 5000
64
+ }
65
+ ]
66
+ }
67
+ ]
68
+ ```
69
+
70
+ ※ `UserPromptSubmit` はmatcherをサポートしない(全プロンプトで発火)。スクリプト内で `permission_mode` をチェックして制御する。
71
+
72
+ ### 3. CLAUDE.md のskill-first関連記述を更新
73
+
74
+ **ファイル**: `CLAUDE.md`
75
+
76
+ 現在の必須フロー Step3 の記述を更新:
77
+
78
+ **変更前:**
79
+ ```
80
+ 3. `einja-skill-first` で「Skill を先に作るべきか」を自動評価する
81
+ ```
82
+
83
+ **変更後:**
84
+ ```
85
+ 3. `einja-skill-first` で「Skill を先に作るべきか」を評価する
86
+ - Plan mode中は `UserPromptSubmit` hookにより自動でリマインダーが注入される
87
+ - `.claude/skills/einja-skill-first/SKILL.md` を読み込んで評価を実施する
88
+ ```
89
+
90
+ 手動キーワードトリガー(「Skill作るべき?」等)はそのまま維持。
91
+
92
+ ## 変更対象ファイル
93
+
94
+ | ファイル | 操作 |
95
+ |---------|------|
96
+ | `.claude/hooks/einja/plan-mode-skill-loader.sh` | **新規作成** |
97
+ | `.claude/settings.json` | **編集** - `UserPromptSubmit` hook追加 |
98
+ | `CLAUDE.md` | **編集** - skill-first記述を更新(任意) |
99
+
100
+ ## 検証方法
101
+
102
+ 1. **スクリプト単体テスト**:
103
+ ```bash
104
+ # Plan modeの場合 → additionalContext出力
105
+ echo '{"permission_mode":"plan","session_id":"test123"}' | \
106
+ CLAUDE_PROJECT_DIR="$(pwd)" \
107
+ bash .claude/hooks/einja/plan-mode-skill-loader.sh
108
+
109
+ # 通常modeの場合 → 何も出力しない
110
+ echo '{"permission_mode":"default","session_id":"test123"}' | \
111
+ CLAUDE_PROJECT_DIR="$(pwd)" \
112
+ bash .claude/hooks/einja/plan-mode-skill-loader.sh
113
+ ```
114
+
115
+ 2. **実動作テスト**:
116
+ - Shift+TabでPlan modeに入りプロンプトを送信
117
+ - リマインダーが注入され、skill-first評価が促されることを確認
118
+
119
+ 3. **通常mode非発火テスト**:
120
+ - Plan mode以外でプロンプト送信した際に何も注入されないことを確認
121
+
122
+ ## 注意事項
123
+
124
+ - `.claude/` 配下の変更は `presets/default/` にビルド時に自動コピーされる
125
+ - `additionalContext` はCompaction対象だが、毎回再注入されるため消失しても問題ない
126
+ - hookのタイムアウトは5秒(jqの実行のみなので十分余裕あり)