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,467 @@
1
+ # Plan: issue:exec を Vibe-Kanban から脱却し、階層的 Claude Code プロセスに移行
2
+
3
+ ## Context
4
+
5
+ 現在の `pnpm task:loop`(TypeScript CLI)は Vibe-Kanban MCP に依存して Claude Code セッションの起動・PR管理・タスク状態管理を行っている。これを廃止し、Claude Code カスタムコマンド `einja:issue-exec` に移行する。tmux, claude 対話モード, git worktree で同等以上の機能を実現する。
6
+
7
+ **目的**: Manager → Director → Worker の3階層プロセスで、Issue 全体のタスクを並列実行する仕組みを構築する。
8
+
9
+ ---
10
+
11
+ ## Agent Teams 評価結果(不採用)
12
+
13
+ | 項目 | 評価 |
14
+ |---|---|
15
+ | Split panes(tmux/iTerm2) | ✅ 各 Teammate が独立ペインで表示。監視に最適 |
16
+ | 共有タスクリスト + 依存関係 | ✅ pending → in_progress → completed、依存自動解除 |
17
+ | Teammate 間メッセージング | ✅ message / broadcast |
18
+ | TaskCompleted / TeammateIdle フック | ✅ 品質ゲートに活用可能 |
19
+ | **ネスト(Teammate が自チーム作成)** | ❌ **不可**。3階層は Agent Teams 単独で実現不可 |
20
+ | **Teammate 別 worktree(cwd指定)** | ❌ **公式未サポート**。だがWorker内部では同一worktreeのため問題なし |
21
+ | **セッション再開(/resume)** | ❌ in-process teammates は復元不可 |
22
+ | **安定性** | ⚠️ 実験的機能。タスク状態遅延等の既知問題あり |
23
+
24
+ ### 結論: Agent Teams は不採用。Worker 内部はサブエージェント(Task ツール)で実装
25
+
26
+ 調査の結果、Agent Teams は実験的機能であり制約が多い(`-p` モード不可、ネスト不可、復元不可)。
27
+ Worker 内部のタスク並列実行は、既存の **Task ツール(サブエージェント)** で十分に実現可能。
28
+ 現在の `task-exec` が既にサブエージェント並列実行を行っているため、そのまま活用する。
29
+
30
+ | 項目 | Agent Teams | サブエージェント(Task ツール)✅ 採用 |
31
+ |---|---|---|
32
+ | 並列実行 | Teammate で並列 | `run_in_background: true` で並列 |
33
+ | 依存管理 | 共有タスクリスト | TaskCreate + blockedBy |
34
+ | 実行モード | 対話モード必須 | `-p` でも対話でも動作 |
35
+ | 安定性 | ⚠️ 実験的 | ✅ 安定(本番利用実績あり) |
36
+ | 復元性 | ❌ 不可 | ✅ セッション再開可能 |
37
+
38
+ **Manager → Director → Worker 間は tmux + claude 対話モード**(質問エスカレーション対応)
39
+
40
+ ---
41
+
42
+ ## 推奨アーキテクチャ: tmux + サブエージェント
43
+
44
+ ### 全体構成
45
+
46
+ ```
47
+ Manager (Claude Code: einja:issue-exec)
48
+ │ Issue worktree: issue/123
49
+
50
+ ├─ tmux window → Director Phase1 (claude 対話モード)
51
+ │ │ Phase worktree: worktrees/issue-123-phase1
52
+ │ │
53
+ │ ├─ tmux window → Worker 1.1 (claude 対話モード)
54
+ │ │ Task worktree: worktrees/issue-123-task-1.1
55
+ │ │ → task-exec #123 1.1
56
+ │ │ ├─ サブエージェント: Task 1.1.1 実装(run_in_background)
57
+ │ │ ├─ サブエージェント: Task 1.1.2 実装(run_in_background)
58
+ │ │ └─ reviewer → QA → commit
59
+ │ │
60
+ │ ├─ tmux window → Worker 1.2 (claude 対話モード)
61
+ │ │ Task worktree: worktrees/issue-123-task-1.2
62
+ │ │ → task-exec #123 1.2 ...
63
+ │ │
64
+ │ └─ (依存タスクグループは先行完了後に起動)
65
+
66
+ ├─ tmux window → Director Phase2 (claude 対話モード, Phase1完了後 or 並列)
67
+ │ │ Phase worktree: worktrees/issue-123-phase2
68
+ │ └─ ...
69
+
70
+ └─ 全Phase完了 → PR: issue/123 → main
71
+ ```
72
+
73
+ ### 各階層の通信方式
74
+
75
+ | 階層 | 方式 | 理由 |
76
+ |---|---|---|
77
+ | Manager → Director | tmux + ステータスファイル + 質問エスカレーション | TypeScript CLI からの制御。別 worktree が必要 |
78
+ | Director → Worker | tmux + ステータスファイル + 質問エスカレーション | 別 worktree が必要 |
79
+ | Worker 内部(タスク間) | サブエージェント(Task ツール) | 既存 task-exec のフローをそのまま活用。`run_in_background` で並列化 |
80
+
81
+ **重要**: 全プロセスは**対話モード**(`claude`、非 `-p`)で起動。子プロセスからの質問を受け取り、回答またはさらに上位へエスカレーションする。
82
+
83
+ ### 質問エスカレーションチェーン
84
+
85
+ ```
86
+ Worker(task-exec 実行中に疑問発生)
87
+ ↓ ステータスファイル(質問キュー)
88
+ Director(spec/design/issue で回答可能?)
89
+ ├─ Yes → 回答をステータスファイルに書き込み
90
+ └─ No ↓ ステータスファイル(質問キュー)
91
+ Manager(Claude Code カスタムコマンド)
92
+ ↓ AskUserQuestion で人間に質問
93
+ Human(回答入力)
94
+ ↓ 回答をステータスファイルに書き込み → 逆順で伝播
95
+ ```
96
+
97
+ ### 質問ステータスファイル形式
98
+
99
+ パス: `~/.einja/sessions/issue-123/questions/`
100
+
101
+ ```json
102
+ {
103
+ "id": "q-001",
104
+ "from": "worker-1.1",
105
+ "question": "ユーザー認証にJWTとセッションのどちらを使うべきか?",
106
+ "context": "design.md にはどちらの記載もない",
107
+ "status": "pending", // pending → escalated → answered
108
+ "escalatedTo": "director-phase1",
109
+ "answer": null,
110
+ "answeredBy": null
111
+ }
112
+ ```
113
+
114
+ ### 回答権限
115
+
116
+ | 回答者 | 回答可能な範囲 |
117
+ |---|---|
118
+ | Worker | spec(requirements.md, design.md)に明記されている内容(task-exec 内で自己解決) |
119
+ | Director | spec + Issue 本文 + Phase 全体のコンテキスト |
120
+ | Manager → Human | 上記で回答不可能な要件・方針の判断 |
121
+
122
+ ---
123
+
124
+ ## 各レイヤーの責務
125
+
126
+ ### Manager (Claude Code カスタムコマンド)
127
+
128
+ **実装方法**: `.claude/commands/einja/issue-exec.md` として新規作成。Bash ツールで tmux/worktree/gh CLI を制御。
129
+
130
+ | 責務 | 詳細 |
131
+ |---|---|
132
+ | Issue パース | `gh issue view` + Claude Code による Markdown 直接パース |
133
+ | 依存関係解析 | Issue 本文から Phase/タスクグループの依存関係を直接分析 |
134
+ | ブランチ管理 | Bash ツールで `git branch`, `git push` 等を実行 |
135
+ | worktree 管理 | Bash ツールで `git worktree add/remove` を実行 |
136
+ | tmux 管理 | Bash ツールで `tmux new-session/new-window/send-keys` 等を実行 |
137
+ | Director 起動 | Phase 毎に tmux window で `claude` を起動 |
138
+ | マージモード制御 | manual / task-group-auto / auto |
139
+ | Phase マージ | `gh pr create/merge` で Phase → Issue ブランチの PR 管理 |
140
+ | 変更伝播 | Phase マージ後、ステータスファイルで他 active Phase に通知 |
141
+ | 最終 PR | `gh pr create` で Issue → base ブランチの PR 作成 |
142
+ | **質問エスカレーション** | Director から回答不可な質問を受け取り、AskUserQuestion で人間に表示 → 回答を伝播 |
143
+ | エラー監視 | tmux pane 消失 + ステータスファイル未更新を監視 |
144
+
145
+ ### Director (claude 対話モード in tmux window)
146
+
147
+ **実装方法**: `claude` (対話モード)で Phase worktree の cwd で起動。初期プロンプトで Phase 情報を渡す。
148
+
149
+ | 責務 | 詳細 |
150
+ |---|---|
151
+ | タスクグループ管理 | Phase 内のタスクグループを依存順に処理 |
152
+ | Worker 起動 | 各タスクグループに対して tmux window + `claude`(対話モード)で Worker 起動 |
153
+ | Task worktree 作成 | `git worktree add` でタスクブランチ用 worktree 作成 |
154
+ | 並列制御 | 依存のないタスクグループは並列 Worker 起動 |
155
+ | PR マージ検知 | `gh pr list --state merged` ポーリングで Worker PR のマージ検知 |
156
+ | 変更伝播通知 | マージ後、他の active Worker にステータスファイルで sync 通知 |
157
+ | **質問対応** | Worker からの質問に spec/design/issue ベースで回答。回答不可なら Manager にエスカレーション |
158
+ | worktree クリーンアップ | Worker 完了・マージ後にタスク worktree 削除 |
159
+ | Phase 完了報告 | 全タスクグループ完了時にステータスファイルで Manager に報告 |
160
+ | GitHub Issue 更新 | タスクグループ完了時にチェックボックス更新 |
161
+
162
+ ### Worker (claude 対話モード in tmux window)
163
+
164
+ **実装方法**: `claude` 対話モードでタスク worktree 内で起動。`einja:task-exec` を実行(既存フローをそのまま活用)。
165
+
166
+ | 責務 | 詳細 |
167
+ |---|---|
168
+ | task-exec 実行 | `einja:task-exec #{issue} {taskGroupId}` 実行(executer→reviewer→qa→commit) |
169
+ | **タスク並列実装** | task-exec 内部で Task ツール(`run_in_background`)を使い並列実装(既存機能) |
170
+ | **品質管理** | 全タスク完了後、reviewer → QA → commit を統括(既存 task-exec フロー) |
171
+ | Phase 変更取り込み | 作業開始前 / sync 通知時 / PR 作成前に `git rebase origin/{phaseBranch}` |
172
+ | CI 待機 | push 後、`gh run list` で CI 完了を確認 |
173
+ | PR 作成 | `gh pr create --base {phaseBranch} --head {taskBranch}` |
174
+ | 完了報告 | ステータスファイルに PR 番号・完了状態を書き込み |
175
+ | コンフリクト解消 | rebase 時のコンフリクトを conflict-resolver で自力解消 |
176
+
177
+ ### Worker 起動コマンド(Director が Worker を起動する際)
178
+
179
+ ```bash
180
+ cd ~/.einja/worktrees/issue-123/task-1.1
181
+ claude "/einja:task-exec #123 1.1"
182
+ ```
183
+
184
+ task-exec 内部は既存フローをそのまま活用(変更なし):
185
+ - Task ツール + `run_in_background` で並列実装
186
+ - TaskCreate + blockedBy で依存管理
187
+ - executer → reviewer → qa → commit の品質保証ループ
188
+
189
+ ---
190
+
191
+ ## タスク完了フロー
192
+
193
+ ```
194
+ Worker-1.1 作業中
195
+
196
+ ├─ 0. git rebase origin/issue/123-phase1(最新取り込み)
197
+ ├─ 1. task-exec 完了 → task/123-1.1 に commit & push
198
+ ├─ 2. CI 完了待機(gh run list ポーリング)
199
+ ├─ 3. gh pr create --base issue/123-phase1 --head task/123-1.1
200
+ ├─ 4. ステータスファイル: { status: "pr_created", pr: 456 }
201
+ └─ 5. claude プロセス終了
202
+
203
+ Director 検知(ステータスファイル + プロセス監視)
204
+
205
+ ├─ manual モード: gh pr list --state merged ポーリング → マージ検知まで待機
206
+ ├─ task-group-auto: gh pr merge --squash --auto 実行
207
+ ├─ auto: gh pr merge --squash 即実行
208
+
209
+ ├─ マージ検知後:
210
+ │ ├─ 他 active Worker にステータスで sync_required 通知
211
+ │ │ → Worker 自身が git rebase で取り込み
212
+ │ ├─ タスク worktree 削除 + tmux window kill
213
+ │ ├─ GitHub Issue チェックボックス更新
214
+ │ └─ 依存タスク起動判定 → 新 Worker 起動
215
+
216
+ └─ Phase 全タスク完了 → ステータスで Manager に報告
217
+
218
+ Manager 検知
219
+
220
+ ├─ Phase PR 作成: issue/123-phase1 → issue/123
221
+ ├─ マージモードに応じた処理(manual: 待機 / auto: 自動マージ)
222
+ ├─ マージ後: Phase worktree 削除
223
+ ├─ 他 active Phase に変更伝播(Director にリベース指示)
224
+ └─ 次 Phase 起動 or 全完了 → 最終 PR 作成
225
+ ```
226
+
227
+ ---
228
+
229
+ ## マージモード
230
+
231
+ ```
232
+ einja:issue-exec #123 # デフォルト: manual
233
+ einja:issue-exec #123 --merge-mode task-group-auto # タスクPR自動マージ
234
+ einja:issue-exec #123 --merge-mode auto # 全自動
235
+ einja:issue-exec #123 --max-phase 2 # Phase 2 まで
236
+ einja:issue-exec #123 --base develop # ベースブランチ指定
237
+ ```
238
+
239
+ | モード | タスクPR (task→phase) | Phase PR (phase→issue) | 最終PR (issue→base) |
240
+ |---|---|---|---|
241
+ | `manual` | 人間マージ待ち | 人間マージ待ち | 人間マージ待ち |
242
+ | `task-group-auto` | CI通過後に自動マージ | 人間マージ待ち | 人間マージ待ち |
243
+ | `auto` | CI通過後に自動マージ | CI通過後に自動マージ | 人間マージ待ち(常に手動) |
244
+
245
+ ---
246
+
247
+ ## ブランチ & worktree 構成
248
+
249
+ ```
250
+ main
251
+ └── issue/123 Manager管理、メインリポまたはworktree
252
+ ├── issue/123-phase1 Director1 worktree
253
+ │ ├── task/123-1.1 Worker1.1 worktree
254
+ │ ├── task/123-1.2 Worker1.2 worktree
255
+ │ └── task/123-1.3 Worker1.3 worktree(1.1完了後に作成)
256
+ └── issue/123-phase2 Director2 worktree(Phase1完了後 or 並列)
257
+ └── task/123-2.1 Worker2.1 worktree
258
+ ```
259
+
260
+ worktree 物理パス:
261
+ ```
262
+ ~/.einja/worktrees/issue-123/
263
+ ├── phase1/ ← Director1 cwd
264
+ ├── task-1.1/ ← Worker1.1 cwd
265
+ ├── task-1.2/ ← Worker1.2 cwd
266
+ └── phase2/ ← Director2 cwd
267
+ ```
268
+
269
+ ---
270
+
271
+ ## ステータスファイル
272
+
273
+ パス: `~/.einja/sessions/issue-123/`
274
+
275
+ ```
276
+ session.json # セッション全体(Manager PID、開始時刻、マージモード等)
277
+ phase-1/
278
+ status.json # Phase状態 + Director PID
279
+ task-1.1.json # { status, prNumber, branch }
280
+ task-1.2.json
281
+ phase-2/
282
+ status.json
283
+ questions/
284
+ q-{uuid}.json # 質問ファイル(1ファイル1質問)
285
+ events.jsonl # JSON Lines 形式の追記型イベントログ(タイムスタンプ + PID 付き)
286
+ ```
287
+
288
+ ### ステータスファイル永続化
289
+
290
+ - `~/.einja/sessions/` に配置し、システム再起動後も `--resume` で復元可能
291
+ - 完了時に Manager が自動クリーンアップ(ディレクトリ削除)
292
+ - `status.json` の更新は `flock` による排他制御を使用(複数プロセスの同時更新を防止)
293
+ - git push 対象外(純粋にローカル実行状態管理)
294
+
295
+ ---
296
+
297
+ ## tmux セッション構成
298
+
299
+ ```
300
+ tmux session: einja-123
301
+ window 0: Manager (メインプロセスのログ表示)
302
+ window 1: Director-Phase1 (claude 対話モード)
303
+ window 2: Worker-1.1 (claude 対話モード → task-exec #123 1.1)
304
+ window 3: Worker-1.2 (claude 対話モード → task-exec #123 1.2)
305
+ window 4: Director-Phase2 (claude 対話モード)
306
+ window 5: Worker-2.1 (claude 対話モード → task-exec #123 2.1)
307
+ ```
308
+
309
+ - ユーザーは `tmux attach -t einja-123` で全プロセスを監視可能
310
+ - 全プロセスが対話モード(`claude`)のため、質問エスカレーションが可能
311
+ - Worker 内部のサブエージェント並列実行は tmux には表示されない(Claude Code 内部処理)
312
+
313
+ ---
314
+
315
+ ## ファイル変更一覧
316
+
317
+ ### 新規作成
318
+
319
+ | ファイル | 役割 |
320
+ |---|---|
321
+ | `.claude/commands/einja/issue-exec.md` | **Manager**: Issue 全体のオーケストレーション(カスタムコマンド) |
322
+
323
+ ### 変更なし(そのまま活用)
324
+
325
+ | ファイル | 用途 |
326
+ |---|---|
327
+ | `.claude/commands/einja/task-exec.md` | Worker が実行するタスクグループ処理 |
328
+ | `.claude/agents/einja/task/task-executer.md` | 実装サブエージェント |
329
+ | `.claude/agents/einja/task/task-reviewer.md` | レビューサブエージェント |
330
+ | `.claude/skills/einja-task-qa/` | QA サブエージェント |
331
+ | `.claude/skills/einja-task-commit/` | コミット・プッシュ |
332
+
333
+ ### 削除
334
+
335
+ | ファイル/ディレクトリ | 理由 |
336
+ |---|---|
337
+ | `packages/cli/src/commands/issue-exec/` | **ディレクトリごと削除**。TypeScript CLI → Claude Code カスタムコマンドに移行 |
338
+ | `docs/einja/instructions/task-vibe-kanban-loop.md` | Vibe-Kanban ドキュメント(マネージドなので削除は dev-cli 側で対応) |
339
+
340
+ ### 注意
341
+
342
+ TypeScript モジュール(`issue-parser.ts`, `dependency-resolver.ts`, `branch-manager.ts` 等)は**再利用しない**。
343
+ Manager(カスタムコマンド)が Claude Code の Bash ツール + gh CLI で直接 Issue パース・ブランチ管理・PR 操作を行う。
344
+
345
+ ---
346
+
347
+ ## エラーリカバリ
348
+
349
+ | 障害 | 検知 | リカバリ |
350
+ |---|---|---|
351
+ | Worker 異常終了(PR作成前) | Director: tmux window 消失 + ステータス未更新 | Director: リトライ(最大2回)→ 失敗時は Manager に報告 → 人間判断 |
352
+ | Worker 異常終了(PR作成済み) | Director: tmux window 消失 + ステータスに PR 番号あり | Director: スキップ(PR マージ待ちのまま継続) |
353
+ | Director 異常終了 | Manager: tmux window 消失 + ステータス未更新 | Manager: 各 Worker のステータスを確認 → 未完了 Worker のみ再実行する形で Director 再起動 |
354
+ | Manager 異常終了 | ユーザー手動 | `einja:issue-exec #123 --resume` でステータスファイルから全体状態を復元 → 未完了 Phase の Director を再起動 |
355
+ | rebase コンフリクト | Worker: git rebase 失敗 | Worker: conflict-resolver で自力解消 |
356
+ | CI 失敗 | Worker: gh run status | Worker: 修正 → 再push → 再CI待機 |
357
+
358
+ ---
359
+
360
+ ## ドキュメント変更
361
+
362
+ `docs/einja/` はマネージドディレクトリのため、原本は `packages/cli/` 側で編集 → `einja sync` で同期。
363
+
364
+ ### 書き換え対象
365
+
366
+ | ファイル | 変更内容 | 優先度 |
367
+ |---|---|---|
368
+ | `docs/einja/instructions/task-vibe-kanban-loop.md` | **リネーム + 全面書き換え** → `issue-exec-workflow.md`。Manager→Director→Worker の3階層フロー、tmux 構成、ステータスファイル、マージモード、質問エスカレーションを記載 | ⭐⭐⭐ |
369
+ | `docs/einja/steering/development-workflow.md` | **フェーズB 書き換え**。Vibe-Kanban → `einja:issue-exec` + `einja:task-exec` に変更。`einja:task-simple` も追記 | ⭐⭐⭐ |
370
+ | `docs/einja/steering/task-management.md` | **部分書き換え**。「親Issue/サブIssue階層」セクション、コマンドリファレンスの `pnpm task:loop` → `einja:issue-exec` | ⭐⭐⭐ |
371
+ | `docs/einja/instructions/task-execute.md` | **整理**。`development-workflow.md` と重複内容を統合・整理 | ⭐⭐ |
372
+
373
+ ### 書き換え不要
374
+
375
+ | ファイル | 理由 |
376
+ |---|---|
377
+ | `.claude/commands/einja/task-exec.md` | Worker が使用。変更なし |
378
+ | `.claude/agents/einja/task/*.md` | エージェント定義は呼び出し元に依存しない |
379
+ | `.claude/skills/einja-*/SKILL.md` | Skill 実装は変わらない |
380
+ | `CLAUDE.md` | `einja:issue-exec` を Skill・コマンド表に追加(ビルド時に自動反映) |
381
+
382
+ ---
383
+
384
+ ## 質問回答のドキュメント還元
385
+
386
+ 質問エスカレーションで得られた回答のうち、既存ドキュメント(requirements.md, design.md, Issue 本文)に記載がなかったものは、適切なドキュメントに追記する。これにより同じ質問が繰り返されるのを防ぐ。
387
+
388
+ ### フロー
389
+
390
+ ```
391
+ 質問発生 → 回答取得
392
+
393
+ 回答者が「ドキュメント未記載」と判断
394
+
395
+ 回答ステータスファイルに追記先を記録:
396
+ {
397
+ "answer": "JWT を使用する",
398
+ "answeredBy": "human",
399
+ "docUpdate": {
400
+ "target": "design.md",
401
+ "section": "認証方式",
402
+ "content": "認証方式は JWT を採用する。理由: ..."
403
+ }
404
+ }
405
+
406
+ Worker / Director が回答を受け取った際に、指定されたドキュメントに追記
407
+
408
+ 追記内容は modifications/ にも記録
409
+ ```
410
+
411
+ ### 追記先の判定基準
412
+
413
+ | 回答の種類 | 追記先 |
414
+ |-----------|--------|
415
+ | **要件・仕様に関する判断** | `requirements.md`(該当 AC やストーリーに追記) |
416
+ | **技術的な設計判断** | `design.md`(該当セクションに追記) |
417
+ | **プロジェクト横断の方針** | `docs/einja/memory/decisions.md`(判断の「なぜ」を記録) |
418
+ | **再利用可能なパターン** | `docs/einja/memory/patterns.md` |
419
+
420
+ ### 注意事項
421
+
422
+ - 追記は**回答を受け取ったプロセス**(Worker または Director)が実行
423
+ - 追記内容には「質問ID」「回答者」「日付」をメタデータとして含める
424
+ - Issue 本文への追記は行わない(GitHub Issue は読み取り専用として扱う)
425
+
426
+ ---
427
+
428
+ ## スコープ外: 小規模 Issue
429
+
430
+ Phase=1 かつ タスクグループ=1 の小規模 Issue は、本プランの3階層アーキテクチャではオーバーヘッドが大きい。
431
+ 別 Skill `einja:task-simple` として実装する(別プランで対応)。
432
+
433
+ | 項目 | issue:exec(本プラン) | task-simple(別プラン) |
434
+ |---|---|---|
435
+ | 対象 | 複数 Phase / 複数タスクグループ | Phase=1, TaskGroup=1 |
436
+ | 階層 | Manager → Director → Worker | Manager → Worker 直接 |
437
+ | 入力 | `einja:issue-exec #123` | `einja:task-simple #123` |
438
+ | タスク並列化 | サブエージェント(Task ツール) | サブエージェント(Task ツール) |
439
+ | ベース | issue-exec index.ts | task-exec.md 拡張 |
440
+
441
+ ---
442
+
443
+ ## 補完事項(Codex レビュー反映)
444
+
445
+ | 項目 | 対策 |
446
+ |---|---|
447
+ | **CI 待機タイムアウト** | デフォルト 30分。超過時は Manager に通知 → 人間判断 |
448
+ | **worktree ディスク容量** | `~/.einja/worktrees/` に作成。完了後即削除 |
449
+ | **Worker 復元** | Manager --resume 時、未完了 Worker は task-exec を再実行(サブエージェントは再 spawn) |
450
+ | **質問ファイル競合** | UUID ベースの ID 生成。1ファイル1質問でアトミック書き込み |
451
+ | **ステータスファイル排他制御** | `status.json` の更新には `flock` を使用。質問ファイルは 1ファイル1質問のためロック不要 |
452
+ | **変更伝播タイミング** | Worker は各タスク完了毎 + PR 作成前にステータスファイルをチェック。sync_required 検知時は次タスク開始前に rebase |
453
+ | **セッションクリーンアップ** | Issue 完了時に Manager が `~/.einja/sessions/issue-{N}/` と `~/.einja/worktrees/issue-{N}/` を自動削除 |
454
+ | **イベントログ形式** | JSON Lines(`.jsonl`)形式。各行に `timestamp`, `pid`, `event_type`, `data` を含む |
455
+
456
+ ---
457
+
458
+ ## 検証方法
459
+
460
+ 1. **ユニットテスト**: tmux-manager, status-file-manager, merge-mode-handler, question-escalation-manager の各モジュール
461
+ 2. **統合テスト**: Issue(Phase 1つ、タスクグループ 2つ)で E2E 実行
462
+ 3. **マージモード検証**: manual / task-group-auto / auto 各モードで動作確認
463
+ 4. **エラーリカバリ検証**: Worker/Director を意図的に kill して復旧確認
464
+ 5. **並列実行検証**: 依存のない2タスクグループが実際に並列実行されることを確認
465
+ 6. **サブエージェント並列検証**: Worker 内で Task ツール(run_in_background)による並列実装を確認
466
+ 7. **質問エスカレーション検証**: Worker → Director → Manager → Human の質問伝播を確認
467
+ 8. **既存テスト**: `pnpm test` で既存テスト全体が通ること(task-loop 削除による影響なし確認)
@@ -0,0 +1,80 @@
1
+ # Plan: issue-exec の tmux 自動インストール機能追加
2
+
3
+ ## Context
4
+
5
+ `issue-exec` コマンドは tmux を必須依存としているが、現在 Step 0 で `which tmux` による確認のみで、未インストール時のフォールバックがない。tmux が入っていないとコマンドが即座に失敗するため、UX として自動インストールを提案・実行できるようにする。
6
+
7
+ ## 変更対象
8
+
9
+ | ファイル | 変更内容 |
10
+ |---------|---------|
11
+ | `.claude/commands/einja/issue-exec.md` | Step 0 の tmux 確認ロジックを拡張(`which tmux` → `command -v tmux` + 自動導入フロー) |
12
+
13
+ ## 変更内容: Step 0 を以下に書き換え
14
+
15
+ ```markdown
16
+ ### Step 0: 環境準備
17
+
18
+ #### 1. tmux インストール確認・自動導入
19
+
20
+ 1. `command -v tmux` で tmux の存在を確認
21
+ 2. **インストール済みの場合**: `tmux -V` でバージョン表示し、次のステップへ進む
22
+ 3. **未インストールの場合**: `uname -s` で OS を判定し、以下のフローで自動導入を提案
23
+
24
+ **macOS(`uname -s` = `Darwin`):**
25
+ 1. `command -v brew` で Homebrew を確認
26
+ 2. Homebrew あり:
27
+ - AskUserQuestion で「`brew install tmux` を実行してよいか?」確認 → 承認後に実行
28
+ 3. Homebrew なし:
29
+ - 以下を表示して**停止**:
30
+ > tmux のインストールには Homebrew が必要です。
31
+ > 以下のコマンドで Homebrew をインストール後、再度 issue-exec を実行してください:
32
+ > `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`
33
+
34
+ **Linux(`uname -s` = `Linux`):**
35
+ 1. パッケージマネージャーを検出(上から優先):
36
+ - `command -v apt-get` → `apt-get update && apt-get install -y tmux`
37
+ - `command -v dnf` → `dnf install -y tmux`
38
+ - `command -v yum` → `yum install -y tmux`
39
+ - いずれも検出できない場合 → 「対応パッケージマネージャーが見つかりません。手動で tmux をインストールしてください」と表示して**停止**
40
+ 2. 権限判定とインストール:
41
+ - `id -u` が 0(root)→ sudo 不要。AskUserQuestion で「`<pm> install tmux` を実行してよいか?」確認 → 承認後に実行
42
+ - root でない場合 → `sudo -n true 2>/dev/null` で sudo 権限を確認
43
+ - sudo 可能 → AskUserQuestion で「`sudo <pm> install tmux` を実行してよいか?」確認 → 承認後に実行
44
+ - sudo 不可 → AskUserQuestion で「tmux のインストールには sudo 権限が必要です。パスワード入力が求められる場合があります。`sudo <pm> install tmux` を実行しますか?それとも手動でインストールしますか?」と確認
45
+ - 手動を選択 → インストールコマンドを表示して**停止**
46
+
47
+ **その他(`MINGW*`, `MSYS*`, `CYGWIN*`, 不明な OS):**
48
+ - 以下を表示して**停止**:
49
+ > issue-exec は tmux を必須としており、この環境では利用できません。
50
+ > WSL2 環境での実行を推奨します。
51
+ > 代替: `/einja:task-exec` で個別タスクグループを逐次実行することは可能です。
52
+
53
+ **インストール後の検証:**
54
+ - `hash -r` で PATH をリフレッシュし、`command -v tmux && tmux -V` で成功確認
55
+ - 失敗した場合 → 「tmux のインストールは完了しましたが、PATH に反映されていません。シェルを再起動して再度実行してください」と表示して**停止**
56
+
57
+ #### 2. ディレクトリ準備
58
+ (既存の内容を維持)
59
+
60
+ #### 3. セッション復元
61
+ (既存の内容を維持)
62
+ ```
63
+
64
+ ## 設計判断
65
+
66
+ | 判断ポイント | 決定 | 理由 |
67
+ |------------|------|------|
68
+ | OS 判定方法 | `uname -s` | POSIX 準拠。WSL2 は `Linux` を返すので自動カバー |
69
+ | tmux 確認方法 | `command -v`(`which` から変更) | POSIX 準拠。`which` は環境依存が大きい |
70
+ | ユーザー確認 | AskUserQuestion 1回に集約 | sudo 状態を含めて1問で完結。UX 改善 |
71
+ | Homebrew 未導入時 | 手動案内 + 停止 | curl\|bash は Agent の自動化範囲外。Xcode CLT 等の前提条件が複雑 |
72
+ | Linux 権限 | `id -u` + `sudo -n` の2段階 | root 直実行 / sudo 可能 / sudo 不可を正確に判別 |
73
+ | Windows ネイティブ | 注意書きレベル(`uname -s` の else 分岐) | Claude Code Agent が PowerShell/CMD で動作するケースは事実上ない |
74
+ | リトライ | 廃止(`hash -r` + 再確認のみ) | インストール直後の失敗は PATH 問題。リトライしても解決しない |
75
+
76
+ ## 検証方法
77
+
78
+ 1. `.md` ファイルのフロー整合性を確認(全分岐がエラー停止 or 成功に到達する)
79
+ 2. macOS 環境で `issue-exec` を起動し、tmux インストール済みでバージョン表示されることを確認
80
+ 3. `command -v tmux` / `uname -s` / `command -v brew` の出力が想定通りか Bash で確認