@einja/dev-cli 0.1.39 → 0.1.41

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 (183) hide show
  1. package/README.md +89 -1
  2. package/dist/cli.js +1 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +71 -1
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/list.js.map +1 -1
  8. package/dist/commands/sync.d.ts.map +1 -1
  9. package/dist/commands/sync.js +187 -13
  10. package/dist/commands/sync.js.map +1 -1
  11. package/dist/lib/dependency-checker.d.ts.map +1 -1
  12. package/dist/lib/merger.d.ts +12 -0
  13. package/dist/lib/merger.d.ts.map +1 -1
  14. package/dist/lib/merger.js +28 -0
  15. package/dist/lib/merger.js.map +1 -1
  16. package/dist/lib/preset-update/cli-repo-detector.d.ts.map +1 -1
  17. package/dist/lib/preset-update/file-copier.d.ts.map +1 -1
  18. package/dist/lib/preset-update/preset-finder.d.ts.map +1 -1
  19. package/dist/lib/preset.d.ts.map +1 -1
  20. package/dist/lib/sync/category-validator.d.ts +1 -1
  21. package/dist/lib/sync/category-validator.d.ts.map +1 -1
  22. package/dist/lib/sync/category-validator.js +2 -1
  23. package/dist/lib/sync/category-validator.js.map +1 -1
  24. package/dist/lib/sync/category-validator.test.js +3 -1
  25. package/dist/lib/sync/category-validator.test.js.map +1 -1
  26. package/dist/lib/sync/conflict-reporter.d.ts.map +1 -1
  27. package/dist/lib/sync/diff-engine.d.ts.map +1 -1
  28. package/dist/lib/sync/file-filter.d.ts.map +1 -1
  29. package/dist/lib/sync/file-filter.js +1 -0
  30. package/dist/lib/sync/file-filter.js.map +1 -1
  31. package/dist/lib/sync/integration.test.js +255 -69
  32. package/dist/lib/sync/integration.test.js.map +1 -1
  33. package/dist/lib/sync/json-processor.d.ts +4 -4
  34. package/dist/lib/sync/json-processor.d.ts.map +1 -1
  35. package/dist/lib/sync/json-processor.js +11 -11
  36. package/dist/lib/sync/json-processor.js.map +1 -1
  37. package/dist/lib/sync/marker-processor.d.ts +60 -8
  38. package/dist/lib/sync/marker-processor.d.ts.map +1 -1
  39. package/dist/lib/sync/marker-processor.js +117 -26
  40. package/dist/lib/sync/marker-processor.js.map +1 -1
  41. package/dist/lib/sync/marker-processor.test.js +261 -40
  42. package/dist/lib/sync/marker-processor.test.js.map +1 -1
  43. package/dist/lib/sync/metadata-manager.d.ts +4 -0
  44. package/dist/lib/sync/metadata-manager.d.ts.map +1 -1
  45. package/dist/lib/sync/metadata-manager.js +15 -0
  46. package/dist/lib/sync/metadata-manager.js.map +1 -1
  47. package/dist/lib/sync/metadata-manager.test.js +68 -0
  48. package/dist/lib/sync/metadata-manager.test.js.map +1 -1
  49. package/dist/lib/sync/orphan-cleaner.d.ts +29 -0
  50. package/dist/lib/sync/orphan-cleaner.d.ts.map +1 -0
  51. package/dist/lib/sync/orphan-cleaner.js +80 -0
  52. package/dist/lib/sync/orphan-cleaner.js.map +1 -0
  53. package/dist/lib/sync/orphan-cleaner.test.d.ts +2 -0
  54. package/dist/lib/sync/orphan-cleaner.test.d.ts.map +1 -0
  55. package/dist/lib/sync/orphan-cleaner.test.js +169 -0
  56. package/dist/lib/sync/orphan-cleaner.test.js.map +1 -0
  57. package/dist/lib/sync/project-private-synchronizer.d.ts +52 -0
  58. package/dist/lib/sync/project-private-synchronizer.d.ts.map +1 -0
  59. package/dist/lib/sync/project-private-synchronizer.js +106 -0
  60. package/dist/lib/sync/project-private-synchronizer.js.map +1 -0
  61. package/dist/lib/sync/project-private-synchronizer.test.d.ts +2 -0
  62. package/dist/lib/sync/project-private-synchronizer.test.d.ts.map +1 -0
  63. package/dist/lib/sync/project-private-synchronizer.test.js +348 -0
  64. package/dist/lib/sync/project-private-synchronizer.test.js.map +1 -0
  65. package/dist/types/index.d.ts +1 -0
  66. package/dist/types/index.d.ts.map +1 -1
  67. package/dist/types/sync.d.ts +36 -6
  68. package/dist/types/sync.d.ts.map +1 -1
  69. package/dist/types/sync.js +2 -2
  70. package/dist/types/sync.js.map +1 -1
  71. package/package.json +5 -4
  72. package/presets/default/.claude/agents/einja/Explore.md +140 -0
  73. package/presets/default/.claude/agents/einja/backend-architect.md +4 -0
  74. package/presets/default/.claude/agents/einja/codex-agent.md +4 -0
  75. package/presets/default/.claude/agents/einja/design-engineer.md +4 -0
  76. package/presets/default/.claude/agents/einja/docs/docs-updater.md +4 -0
  77. package/presets/default/.claude/agents/einja/frontend-architect.md +4 -0
  78. package/presets/default/.claude/agents/einja/frontend-coder.md +4 -0
  79. package/presets/default/.claude/agents/einja/git/conflict-resolver.md +4 -0
  80. package/presets/default/.claude/agents/einja/specs/spec-design-generator.md +4 -1
  81. package/presets/default/.claude/agents/einja/specs/spec-qa-generator.md +4 -0
  82. package/presets/default/.claude/agents/einja/specs/spec-requirements-generator.md +4 -1
  83. package/presets/default/.claude/agents/einja/specs/spec-tasks-generator.md +6 -2
  84. package/presets/default/.claude/agents/einja/specs/spec-tasks-validator.md +4 -0
  85. package/presets/default/.claude/agents/einja/task/task-executer.md +57 -115
  86. package/presets/default/.claude/agents/einja/task/task-modification-analyzer.md +4 -0
  87. package/presets/default/.claude/agents/einja/task/task-qa.md +4 -0
  88. package/presets/default/.claude/agents/einja/task/task-reviewer.md +4 -0
  89. package/presets/default/.claude/commands/einja/einja-sync.md +5 -1
  90. package/presets/default/.claude/commands/einja/frontend-implement.md +3 -1
  91. package/presets/default/.claude/commands/einja/issue-exec.md +403 -0
  92. package/presets/default/.claude/commands/einja/spec-create.md +15 -1
  93. package/presets/default/.claude/commands/einja/start-dev.md +4 -0
  94. package/presets/default/.claude/commands/einja/sync-cursor-commands.md +4 -0
  95. package/presets/default/.claude/commands/einja/task-exec.md +106 -14
  96. package/presets/default/.claude/commands/einja/update-docs-by-task-specs.md +4 -0
  97. package/presets/default/.claude/hooks/einja/plan-mode-skill-loader.sh +23 -0
  98. package/presets/default/.claude/settings.json +15 -1
  99. package/presets/default/.claude/skills/einja-conflict-resolver/SKILL.md +4 -0
  100. package/presets/default/.claude/skills/einja-general-context-loader/SKILL.md +4 -0
  101. package/presets/default/.claude/skills/einja-output-format/SKILL.md +4 -0
  102. package/presets/default/.claude/skills/einja-project-overview/SKILL.md +7 -3
  103. package/presets/default/.claude/skills/einja-skill-creator/SKILL.md +266 -274
  104. package/presets/default/.claude/skills/einja-skill-creator/agents/analyzer.md +274 -0
  105. package/presets/default/.claude/skills/einja-skill-creator/agents/comparator.md +202 -0
  106. package/presets/default/.claude/skills/einja-skill-creator/agents/grader.md +195 -0
  107. package/presets/default/.claude/skills/einja-skill-creator/assets/eval_review.html +146 -0
  108. package/presets/default/.claude/skills/einja-skill-creator/eval-viewer/generate_review.py +471 -0
  109. package/presets/default/.claude/skills/einja-skill-creator/eval-viewer/viewer.html +1325 -0
  110. package/presets/default/.claude/skills/einja-skill-creator/references/schemas.md +430 -0
  111. package/presets/default/.claude/skills/einja-skill-creator/scripts/aggregate_benchmark.py +154 -0
  112. package/presets/default/.claude/skills/einja-skill-creator/scripts/generate_report.py +265 -0
  113. package/presets/default/.claude/skills/einja-skill-creator/scripts/improve_description.py +252 -0
  114. package/presets/default/.claude/skills/einja-skill-creator/scripts/init_skill.py +13 -19
  115. package/presets/default/.claude/skills/einja-skill-creator/scripts/package_skill.py +36 -7
  116. package/presets/default/.claude/skills/einja-skill-creator/scripts/run_eval.py +310 -0
  117. package/presets/default/.claude/skills/einja-skill-creator/scripts/run_loop.py +295 -0
  118. package/presets/default/.claude/skills/einja-skill-creator/scripts/utils.py +48 -0
  119. package/presets/default/.claude/skills/einja-spec-context-loader/SKILL.md +4 -0
  120. package/presets/default/.claude/skills/einja-task-commit/SKILL.md +4 -0
  121. package/presets/default/.claude/skills/einja-task-qa/SKILL.md +4 -0
  122. package/presets/default/.envrc +5 -0
  123. package/presets/default/.mcp.json +2 -12
  124. package/presets/default/CLAUDE.md.template +26 -4
  125. package/presets/default/docs/einja/example/specs/issues/issue999-example-task/tasks.md +1 -1
  126. package/presets/default/docs/einja/instructions/deployment-setup.md +3 -8
  127. package/presets/default/docs/einja/instructions/environment-setup.md +3 -8
  128. package/presets/default/docs/einja/instructions/issue-exec-workflow.md +276 -0
  129. package/presets/default/docs/einja/instructions/local-server-environment-and-worktree.md +70 -8
  130. package/presets/default/docs/einja/instructions/neon-cli-reference.md +3 -8
  131. package/presets/default/docs/einja/instructions/task-execute.md +23 -28
  132. package/presets/default/docs/einja/instructions/vercel-cli-reference.md +17 -10
  133. package/presets/default/docs/einja/steering/README.md +11 -11
  134. package/presets/default/docs/einja/steering/acceptance-criteria-and-qa-guide.md +3 -8
  135. package/presets/default/docs/einja/steering/architecture.md +3 -8
  136. package/presets/default/docs/einja/steering/branch-strategy.md +63 -70
  137. package/presets/default/docs/einja/steering/commit-rules.md +3 -8
  138. package/presets/default/docs/einja/steering/db-schema-design.md +3 -8
  139. package/presets/default/docs/einja/steering/development/api-development.md +3 -8
  140. package/presets/default/docs/einja/steering/development/backend-architecture.md +3 -8
  141. package/presets/default/docs/einja/steering/development/coding-standards.md +723 -0
  142. package/presets/default/docs/einja/steering/development/component-design.md +502 -0
  143. package/presets/default/docs/einja/steering/development/database-guidelines.md +54 -5
  144. package/presets/default/docs/einja/steering/development/frontend-development.md +3 -8
  145. package/presets/default/docs/einja/steering/development/playwright-guidelines.md +59 -0
  146. package/presets/default/docs/einja/steering/development/review-guidelines.md +3 -8
  147. package/presets/default/docs/einja/steering/development/testing-strategy.md +3 -8
  148. package/presets/default/docs/einja/steering/development-workflow.md +71 -124
  149. package/presets/default/docs/einja/steering/infrastructure/deployment.md +49 -55
  150. package/presets/default/docs/einja/steering/infrastructure/environment-variables.md +4 -8
  151. package/presets/default/docs/einja/steering/product.md +3 -8
  152. package/presets/default/docs/einja/steering/task-management.md +14 -98
  153. package/presets/default/scripts/ensure-serena.sh +75 -0
  154. package/presets/default/scripts/env-rotate-secrets.ts +336 -0
  155. package/presets/default/scripts/env-show.ts +130 -0
  156. package/presets/default/scripts/env.ts +479 -0
  157. package/presets/default/scripts/init.sh +92 -0
  158. package/presets/default/scripts/lib/env-common.ts +108 -0
  159. package/presets/default/scripts/lib/worktree-config.ts +64 -0
  160. package/presets/default/scripts/setup-dev.ts +640 -0
  161. package/presets/default/scripts/stop-serena.sh +25 -0
  162. package/presets/default/scripts/worktree/dev.ts +872 -0
  163. package/dist/lib/sync/seed-synchronizer.d.ts +0 -27
  164. package/dist/lib/sync/seed-synchronizer.d.ts.map +0 -1
  165. package/dist/lib/sync/seed-synchronizer.js +0 -72
  166. package/dist/lib/sync/seed-synchronizer.js.map +0 -1
  167. package/dist/lib/sync/seed-synchronizer.test.d.ts +0 -2
  168. package/dist/lib/sync/seed-synchronizer.test.d.ts.map +0 -1
  169. package/dist/lib/sync/seed-synchronizer.test.js +0 -147
  170. package/dist/lib/sync/seed-synchronizer.test.js.map +0 -1
  171. package/presets/default/.claude/skills/einja-api-development/SKILL.md +0 -14
  172. package/presets/default/.claude/skills/einja-backend-architecture/SKILL.md +0 -18
  173. package/presets/default/.claude/skills/einja-coding-standards/SKILL.md +0 -132
  174. package/presets/default/.claude/skills/einja-coding-standards/references/import-conventions.md +0 -69
  175. package/presets/default/.claude/skills/einja-coding-standards/references/naming-conventions.md +0 -107
  176. package/presets/default/.claude/skills/einja-coding-standards/references/prohibited-patterns.md +0 -169
  177. package/presets/default/.claude/skills/einja-coding-standards/references/typescript-rules.md +0 -247
  178. package/presets/default/.claude/skills/einja-component-design/SKILL.md +0 -109
  179. package/presets/default/.claude/skills/einja-component-design/references/directory-structure.md +0 -117
  180. package/presets/default/.claude/skills/einja-component-design/references/props-patterns.md +0 -159
  181. package/presets/default/.claude/skills/einja-component-design/references/styling-guide.md +0 -122
  182. package/presets/default/.claude/skills/einja-frontend-development/SKILL.md +0 -14
  183. package/presets/default/docs/einja/instructions/task-vibe-kanban-loop.md +0 -565
@@ -23,6 +23,11 @@ MAIN_WORKTREE=$(get_main_worktree)
23
23
  if [ -n "$MAIN_WORKTREE" ] && [ -f "$MAIN_WORKTREE/.env.personal" ]; then
24
24
  dotenv_if_exists "$MAIN_WORKTREE/.env.personal"
25
25
  fi
26
+
27
+ # Serena MCP サーバー自動起動
28
+ if [ -n "$MAIN_WORKTREE" ] && [ -f "$MAIN_WORKTREE/scripts/ensure-serena.sh" ]; then
29
+ source "$MAIN_WORKTREE/scripts/ensure-serena.sh" "$MAIN_WORKTREE"
30
+ fi
26
31
  # @einja:managed:end
27
32
 
28
33
  # @einja:seed:start id="project-env"
@@ -32,18 +32,8 @@
32
32
  ]
33
33
  },
34
34
  "serena": {
35
- "type": "stdio",
36
- "command": "uvx",
37
- "args": [
38
- "--from",
39
- "git+https://github.com/oraios/serena",
40
- "serena",
41
- "start-mcp-server",
42
- "--context",
43
- "claude-code",
44
- "--open-web-dashboard",
45
- "false"
46
- ]
35
+ "type": "http",
36
+ "url": "http://127.0.0.1:${SERENA_PORT:-9850}/mcp"
47
37
  },
48
38
  "github": {
49
39
  "type": "http",
@@ -11,6 +11,15 @@
11
11
  4. **直接実装の禁止**: あなたは絶対に直接実装を行わない。すべての作業はsubagentに委託し、可能な限り並行で呼び出す。サブエージェントの出力はユーザにも見える場所に出力すること
12
12
  5. **実装品質の自己検証**: 複雑な変更では完了前に「よりエレガントな方法はないか」を自問する。ただし単純な修正には不要
13
13
 
14
+ ## Agent Teams の使用制限
15
+
16
+ **Agent Teams(`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS`)はユーザーが明示的にチーム編成を指示した場合のみ使用すること。**
17
+
18
+ - 通常のタスクではサブエージェント(`Task`ツール)を使用する
19
+ - 「チームで」「複数agentで並列に」等の明示的な指示があった場合のみAgent Teamsを起動する
20
+ - チーム実行時は `einja-team-exec` Skillの手順に従う
21
+ - 判断に迷う場合はサブエージェントを使用する(デフォルト動作)
22
+
14
23
  ## サブエージェント委託ルール
15
24
 
16
25
  #### カスタムサブエージェント(直接委託)
@@ -31,7 +40,9 @@
31
40
  | `einja-task-commit` | コミット・プッシュ |
32
41
  | `einja-conflict-resolver` | gitコンフリクト解消 |
33
42
  | `einja-skill-creator` | Skill作成・更新 |
43
+ | `einja-skill-first` | 作業前のSkill作成必要性評価(Plan/spec-create時に自動起動) |
34
44
  | `einja-infra-maintenance` | インフラ環境セットアップ・メンテナンス |
45
+ | `einja:issue-exec` | Issue全体の階層的並列実行(Manager→Director→Worker) |
35
46
  | `einja:task-exec` | タスクグループ実行 |
36
47
  | `einja:spec-create` | 仕様書作成 |
37
48
 
@@ -41,9 +52,16 @@
41
52
 
42
53
  ### 必須フロー
43
54
  1. 問題・要件を調査・分析する
44
- 2. 修正計画を `docs/plans/` に作成し提示する
45
- 3. **ユーザーの明示的な承認を得る**
46
- 4. 承認後、`docs/plans/todo-{plan名}.md` で進捗管理しながら実装を開始する
55
+ 2. 修正計画を `docs/plans/` に作成する
56
+ 3. `einja-skill-first` で「Skill を先に作るべきか」を評価する
57
+ - Plan mode中は `UserPromptSubmit` hookにより自動でリマインダーが注入される
58
+ - `.claude/skills/einja-skill-first/SKILL.md` を読み込んで評価を実施する
59
+ - 推奨判定 → AskUserQuestion でユーザーに提案
60
+ - 承認 → 計画の TODO-0 に Skill 作成を追加
61
+ - 不要判定 → そのまま次へ進む
62
+ - ※ スキップ基準に該当する場合は評価自体を省略
63
+ 4. 計画をユーザーに提示し、**明示的な承認を得る**
64
+ 5. 承認後、`docs/plans/todo-{plan名}.md` で進捗管理しながら実装を開始する(TODO-0 があれば Skill 作成から)
47
65
 
48
66
  ### 例外(承認不要)
49
67
  - 読み取り専用操作(質問への回答、情報調査、コード調査)
@@ -109,7 +127,7 @@
109
127
 
110
128
  Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は以下のSkillを参照:
111
129
  - `einja-project-overview` - 構成、技術スタック、頻出コマンド
112
- - `einja-coding-standards` - コーディング規約、インポートパス規約
130
+ - `docs/einja/steering/development/coding-standards.md` - コーディング規約、インポートパス規約
113
131
  - `einja-infra-maintenance` - 開発環境セットアップ、サーバー管理
114
132
 
115
133
  ## マネージドディレクトリ(編集禁止)
@@ -189,4 +207,8 @@ Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は
189
207
  - サブエージェントの「完了」報告のみで完了判定しない
190
208
  - 検証をスキップして完了宣言しない
191
209
 
210
+ <!-- @einja:project-private:start id="claude-md-project" -->
211
+ <!-- プロジェクト固有の情報を記入 -->
212
+ <!-- @einja:project-private:end -->
213
+
192
214
 
@@ -159,7 +159,7 @@
159
159
 
160
160
  ### タスク階層(4階層)
161
161
  - **Phase(フェーズ)**: 最上位単位(1, 2, 3...)
162
- - **タスクグループ**: Vibe-KanbanタスクとPRの作成単位(1.1, 1.2...)、**チェックボックス付き**(`- [ ]`)、1-4時間
162
+ - **タスクグループ**: PRの作成単位(1.1, 1.2...)、**チェックボックス付き**(`- [ ]`)、1-4時間
163
163
  - **タスク**: 作業単位・コミット単位(1.1.1, 1.1.2...)、**チェックボックスなし**、15-60分
164
164
  - **サブタスク**: タスク内の詳細作業項目、**箇条書き**(`-`)
165
165
 
@@ -599,11 +599,6 @@ gh secret set TURBO_TOKEN --body "new-token"
599
599
  - [GitHub Actions - Encrypted secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets)
600
600
  <!-- @einja:managed:end -->
601
601
 
602
- ---
603
-
604
- <!-- @einja:seed:start id="deployment-setup-project" -->
605
- ## プロジェクト固有の設定
606
-
607
- <!-- このセクションはプロジェクト固有の内容を追記する場所です -->
608
- <!-- einja syncで上書きされません -->
609
- <!-- @einja:seed:end -->
602
+ <!-- @einja:project-private:start id="deployment-setup-project" -->
603
+ <!-- プロジェクト固有の情報を記入 -->
604
+ <!-- @einja:project-private:end -->
@@ -639,11 +639,6 @@ dotenvx run -f .env -f .env.local -- <command>
639
639
  - **共有禁止**: 他の開発者とトークンを共有しないこと
640
640
  <!-- @einja:managed:end -->
641
641
 
642
- ---
643
-
644
- <!-- @einja:seed:start id="environment-setup-project" -->
645
- ## プロジェクト固有の設定
646
-
647
- <!-- このセクションはプロジェクト固有の内容を追記する場所です -->
648
- <!-- einja syncで上書きされません -->
649
- <!-- @einja:seed:end -->
642
+ <!-- @einja:project-private:start id="environment-setup-project" -->
643
+ <!-- プロジェクト固有の情報を記入 -->
644
+ <!-- @einja:project-private:end -->
@@ -0,0 +1,276 @@
1
+ <!-- @einja:managed:start -->
2
+ # `einja:issue-exec` コマンド
3
+
4
+ ## 概要
5
+
6
+ GitHub Issue のタスクを Manager → Director → Worker の3階層プロセスで並列実行する Claude Code カスタムコマンド。tmux セッション、git worktree、ステータスファイルで全プロセスを管理する。
7
+
8
+ **⚠️ 重要**: Vibe-Kanban(`pnpm task:loop`)は廃止され、`/einja:issue-exec` に移行しました。
9
+
10
+ ---
11
+
12
+ ## 使用方法
13
+
14
+ ### コマンド実行
15
+
16
+ ```bash
17
+ # 基本
18
+ /einja:issue-exec #123
19
+
20
+ # オプション指定
21
+ /einja:issue-exec #123 --merge-mode task-group-auto # タスクPR自動マージ
22
+ /einja:issue-exec #123 --merge-mode auto # 全自動
23
+ /einja:issue-exec #123 --max-phase 2 # Phase 2 まで
24
+ /einja:issue-exec #123 --base develop # ベースブランチ指定
25
+ /einja:issue-exec #123 --resume # セッション復旧
26
+ ```
27
+
28
+ ### 事前準備
29
+
30
+ - tmux がインストールされていること
31
+ - GitHub CLI(`gh`)がインストール・認証済みであること
32
+ - Docker が起動していること(必要な場合)
33
+
34
+ ---
35
+
36
+ ## アーキテクチャ
37
+
38
+ ### 3階層プロセス
39
+
40
+ ```
41
+ Manager (Claude Code: /einja:issue-exec)
42
+ │ メインリポ or Issue worktree
43
+
44
+ ├─ tmux window → Director Phase1 (claude 対話モード)
45
+ │ │ Phase worktree: ~/.einja/worktrees/issue-123/phase1/
46
+ │ │
47
+ │ ├─ tmux window → Worker 1.1 (claude 対話モード)
48
+ │ │ Task worktree: ~/.einja/worktrees/issue-123/task-1.1/
49
+ │ │ → /einja:task-exec #123 1.1
50
+ │ │ ├─ サブエージェント: Task 1.1.1 実装(run_in_background)
51
+ │ │ ├─ サブエージェント: Task 1.1.2 実装(run_in_background)
52
+ │ │ └─ reviewer → QA → commit
53
+ │ │
54
+ │ ├─ tmux window → Worker 1.2 (claude 対話モード)
55
+ │ │ → /einja:task-exec #123 1.2
56
+ │ │
57
+ │ └─ (依存タスクグループは先行完了後に起動)
58
+
59
+ ├─ tmux window → Director Phase2 (Phase1完了後 or 並列)
60
+ │ └─ ...
61
+
62
+ └─ 全Phase完了 → PR: issue/123 → main
63
+ ```
64
+
65
+ ### 各階層の責務
66
+
67
+ | 階層 | 責務 | 実行方式 |
68
+ |------|------|---------|
69
+ | **Manager** | Issue パース、ブランチ管理、worktree 管理、tmux 管理、Director 起動、Phase マージ、質問エスカレーション、エラー監視 | Claude Code カスタムコマンド |
70
+ | **Director** | Phase 内のタスクグループ管理、Worker 起動、並列制御、PR マージ検知、変更伝播、質問対応、worktree クリーンアップ | claude 対話モード(tmux window) |
71
+ | **Worker** | task-exec 実行(executer→reviewer→qa→commit)、Phase 変更取り込み、PR 作成、完了報告 | claude 対話モード(tmux window) |
72
+
73
+ ### 各階層の通信方式
74
+
75
+ | 階層間 | 方式 | 理由 |
76
+ |--------|------|------|
77
+ | Manager → Director | tmux + ステータスファイル + 質問エスカレーション | 別 worktree が必要 |
78
+ | Director → Worker | tmux + ステータスファイル + 質問エスカレーション | 別 worktree が必要 |
79
+ | Worker 内部(タスク間) | サブエージェント(Task ツール) | 既存 task-exec フローを活用 |
80
+
81
+ ---
82
+
83
+ ## ブランチ & worktree 構成
84
+
85
+ ### ブランチ階層
86
+
87
+ ```
88
+ main (デフォルト)
89
+ └── issue/123 Manager管理
90
+ ├── issue/123-phase1 Director1 worktree
91
+ │ ├── task/123-1.1 Worker1.1 worktree
92
+ │ ├── task/123-1.2 Worker1.2 worktree
93
+ │ └── task/123-1.3 Worker1.3 worktree(1.1完了後に作成)
94
+ └── issue/123-phase2 Director2 worktree
95
+ └── task/123-2.1 Worker2.1 worktree
96
+ ```
97
+
98
+ ### worktree 物理パス
99
+
100
+ ```
101
+ ~/.einja/worktrees/issue-123/
102
+ ├── phase1/ ← Director1 cwd
103
+ ├── task-1.1/ ← Worker1.1 cwd
104
+ ├── task-1.2/ ← Worker1.2 cwd
105
+ └── phase2/ ← Director2 cwd
106
+ ```
107
+
108
+ ---
109
+
110
+ ## マージモード
111
+
112
+ | モード | タスクPR (task→phase) | Phase PR (phase→issue) | 最終PR (issue→base) |
113
+ |---|---|---|---|
114
+ | `manual` | 人間マージ待ち | 人間マージ待ち | 人間マージ待ち |
115
+ | `task-group-auto` | CI通過後に自動マージ | 人間マージ待ち | 人間マージ待ち |
116
+ | `auto` | CI通過後に自動マージ | CI通過後に自動マージ | 人間マージ待ち(常に手動) |
117
+
118
+ ---
119
+
120
+ ## tmux セッション構成
121
+
122
+ ```
123
+ tmux session: einja-123
124
+ window 0: Manager (メインプロセスのログ表示)
125
+ window 1: Director-Phase1 (claude 対話モード)
126
+ window 2: Worker-1.1 (claude 対話モード → /einja:task-exec #123 1.1)
127
+ window 3: Worker-1.2 (claude 対話モード → /einja:task-exec #123 1.2)
128
+ window 4: Director-Phase2 (claude 対話モード)
129
+ window 5: Worker-2.1 (claude 対話モード → /einja:task-exec #123 2.1)
130
+ ```
131
+
132
+ ユーザーは `tmux attach -t einja-123` で全プロセスを監視可能。
133
+
134
+ ---
135
+
136
+ ## ステータスファイル
137
+
138
+ パス: `~/.einja/sessions/issue-123/`
139
+
140
+ ```
141
+ session.json # セッション全体(Manager PID、開始時刻、マージモード等)
142
+ phase-1/
143
+ status.json # Phase状態 + Director PID
144
+ task-1.1.json # { status, prNumber, branch }
145
+ task-1.2.json
146
+ phase-2/
147
+ status.json
148
+ questions/
149
+ q-{uuid}.json # 質問ファイル(1ファイル1質問)
150
+ events.jsonl # JSON Lines 形式の追記型イベントログ
151
+ ```
152
+
153
+ ### ステータスファイル永続化
154
+
155
+ - `~/.einja/sessions/` に配置し、システム再起動後も `--resume` で復元可能
156
+ - 完了時に Manager が自動クリーンアップ
157
+ - `status.json` の更新は `flock` による排他制御を使用
158
+ - git push 対象外(純粋にローカル実行状態管理)
159
+
160
+ ---
161
+
162
+ ## 質問エスカレーション
163
+
164
+ ### チェーン
165
+
166
+ ```
167
+ Worker(task-exec 実行中に疑問発生)
168
+ ↓ ステータスファイル(質問キュー)
169
+ Director(spec/design/issue で回答可能?)
170
+ ├─ Yes → 回答をステータスファイルに書き込み
171
+ └─ No ↓ ステータスファイル(質問キュー)
172
+ Manager(Claude Code カスタムコマンド)
173
+ ↓ AskUserQuestion で人間に質問
174
+ Human(回答入力)
175
+ ↓ 回答をステータスファイルに書き込み → 逆順で伝播
176
+ ```
177
+
178
+ ### 質問ファイル形式
179
+
180
+ ```json
181
+ {
182
+ "id": "q-001",
183
+ "from": "worker-1.1",
184
+ "question": "ユーザー認証にJWTとセッションのどちらを使うべきか?",
185
+ "context": "design.md にはどちらの記載もない",
186
+ "status": "pending",
187
+ "escalatedTo": null,
188
+ "answer": null,
189
+ "answeredBy": null
190
+ }
191
+ ```
192
+
193
+ ### 回答のドキュメント還元
194
+
195
+ 回答のうちドキュメント未記載のものは適切なドキュメントに追記:
196
+
197
+ | 回答の種類 | 追記先 |
198
+ |-----------|--------|
199
+ | 要件・仕様に関する判断 | requirements.md |
200
+ | 技術的な設計判断 | design.md |
201
+ | プロジェクト横断の方針 | docs/einja/memory/decisions.md |
202
+ | 再利用可能なパターン | docs/einja/memory/patterns.md |
203
+
204
+ ---
205
+
206
+ ## タスク完了フロー
207
+
208
+ ```
209
+ Worker-1.1 作業中
210
+
211
+ ├─ 0. git rebase origin/issue/123-phase1(最新取り込み)
212
+ ├─ 1. task-exec 完了 → task/123-1.1 に commit & push
213
+ ├─ 2. CI 完了待機(gh run list ポーリング)
214
+ ├─ 3. gh pr create --base issue/123-phase1 --head task/123-1.1
215
+ ├─ 4. ステータスファイル: { status: "pr_created", pr: 456 }
216
+ └─ 5. claude プロセス終了
217
+
218
+ Director 検知(ステータスファイル + プロセス監視)
219
+
220
+ ├─ manual モード: gh pr list --state merged ポーリング → マージ検知まで待機
221
+ ├─ task-group-auto: gh pr merge --squash --auto 実行
222
+ ├─ auto: CI通過確認後に gh pr merge --squash 実行
223
+
224
+ ├─ マージ検知後:
225
+ │ ├─ 他 active Worker にステータスで sync_required 通知
226
+ │ ├─ タスク worktree 削除 + tmux window kill
227
+ │ ├─ GitHub Issue チェックボックス更新
228
+ │ └─ 依存タスク起動判定 → 新 Worker 起動
229
+
230
+ └─ Phase 全タスク完了 → ステータスで Manager に報告
231
+
232
+ Manager 検知
233
+
234
+ ├─ Phase PR 作成: issue/123-phase1 → issue/123
235
+ ├─ マージモードに応じた処理
236
+ ├─ マージ後: Phase worktree 削除
237
+ ├─ 他 active Phase に変更伝播
238
+ └─ 次 Phase 起動 or 全完了 → 最終 PR 作成
239
+ ```
240
+
241
+ ---
242
+
243
+ ## エラーリカバリ
244
+
245
+ | 障害 | 検知 | リカバリ |
246
+ |---|---|---|
247
+ | Worker 異常終了(PR作成前) | tmux window 消失 + ステータス未更新 | リトライ(最大2回)→ 失敗時は Manager に報告 → 人間判断 |
248
+ | Worker 異常終了(PR作成済み) | tmux window 消失 + PR あり | スキップ(PR マージ待ちのまま継続) |
249
+ | Director 異常終了 | tmux window 消失 + ステータス未更新 | 各 Worker のステータスを確認 → 未完了 Worker のみ再実行 |
250
+ | Manager 異常終了 | ユーザー手動 | `--resume` でステータスファイルから復元 |
251
+ | rebase コンフリクト | git rebase 失敗 | conflict-resolver で自力解消 |
252
+ | CI 失敗 | gh run status | 修正 → 再push → 再CI待機 |
253
+ | CI 待機タイムアウト | 30分超過 | Manager に通知 → 人間判断 |
254
+
255
+ ---
256
+
257
+ ## `/einja:task-exec` との使い分け
258
+
259
+ | コマンド | 用途 | 対象 | 推奨シーン |
260
+ |---------|------|------|----------|
261
+ | **`/einja:issue-exec`** | Issue全体の並列実行 | 複数Phase・複数タスクグループ | 大規模機能実装 |
262
+ | **`/einja:task-exec`** | 単一タスクグループの実行 | 1つのタスクグループ | 品質重視、複雑な実装 |
263
+
264
+ ---
265
+
266
+ ## 関連ドキュメント
267
+
268
+ - [タスク実行ワークフロー](./task-execute.md)
269
+ - [タスク管理ガイドライン](../steering/task-management.md)
270
+ - [仕様書作成ワークフロー](./einja:spec-create.md)
271
+ - [ブランチ運用戦略](../steering/branch-strategy.md)
272
+ <!-- @einja:managed:end -->
273
+
274
+ <!-- @einja:project-private:start id="issue-exec-workflow-project" -->
275
+ <!-- プロジェクト固有の情報を記入 -->
276
+ <!-- @einja:project-private:end -->
@@ -530,7 +530,7 @@ pnpm build
530
530
  環境構築が完了したら、以下のドキュメントも参照してください:
531
531
 
532
532
  - **[タスク実行ガイド](./task-execute.md)**: /task-execコマンドの使用方法
533
- - **[コーディング規約](../../../.claude/skills/einja-coding-standards/SKILL.md)**: コードスタイルと規約
533
+ - **[コーディング規約](../steering/development/coding-standards.md)**: コードスタイルと規約
534
534
  - **[テストガイドライン](../einja/steering/development/testing-strategy.md)**: Vitestを使用したテスト戦略
535
535
 
536
536
  ## 質問・サポート
@@ -626,13 +626,75 @@ for cmd in gh vercel neonctl dotenvx; do
626
626
  command -v $cmd >/dev/null 2>&1 && echo "✅ $cmd: $(command -v $cmd)" || echo "❌ $cmd: 未インストール"
627
627
  done
628
628
  ```
629
- <!-- @einja:managed:end -->
630
629
 
631
- ---
630
+ ### 7. MCP Server (Serena)
631
+
632
+ Serena MCPサーバーは **1プロジェクト1インスタンス** で共有され、worktree間でも再利用されます。
633
+
634
+ #### 自動起動の仕組み
635
+
636
+ ```
637
+ cd プロジェクト → direnv → ensure-serena.sh → Serena起動 → .mcp.json(http)で接続
638
+ ```
639
+
640
+ 1. `direnv` が `.envrc` を読み込む
641
+ 2. `.envrc` が `scripts/ensure-serena.sh` を `source` する
642
+ 3. スクリプトが `.serena-port` を確認し、必要に応じて起動
643
+ 4. `SERENA_PORT` 環境変数がエクスポートされる
644
+ 5. `.mcp.json` の `http://127.0.0.1:${SERENA_PORT:-9850}/mcp` で接続
645
+
646
+ #### `.serena-port` ファイル仕様
647
+
648
+ プロジェクトルートに自動生成される管理ファイル(`.gitignore` 対象)。
649
+
650
+ - **形式**: `PORT PID`(スペース区切り、例: `9850 12345`)
651
+ - **PIDベース所有権管理**: `kill -0 PID` でプロセス生存を確認
652
+ - PID生存 → 再利用(ポートをエクスポートして終了)
653
+ - PID死亡 → ファイル削除 → 新規起動
654
+
655
+ > **なぜcurlではなくPIDか**: MCP streamable-http の `/mcp` はPOST専用。GETの `curl -sf` は405を返し「未起動」と誤判定するため、PIDチェックでプロトコル非依存の判定を行う。
656
+
657
+ #### ポート自動解決
658
+
659
+ - デフォルト: `9850`
660
+ - ポート衝突時: `+1` で10回まで試行(9850〜9859)
661
+ - 全ポート使用中: 警告メッセージを出力(direnvはブロックしない)
632
662
 
633
- <!-- @einja:seed:start id="local-server-environment-and-worktree-project" -->
634
- ## プロジェクト固有の設定
663
+ #### 手動操作
664
+
665
+ ```bash
666
+ # 状態確認
667
+ cat .serena-port # PORT PID を表示
668
+
669
+ # 停止
670
+ ./scripts/stop-serena.sh
671
+
672
+ # 再起動
673
+ ./scripts/stop-serena.sh && direnv reload
674
+
675
+ # 再起動(direnv経由)
676
+ direnv reload
677
+ ```
678
+
679
+ #### トラブルシューティング
680
+
681
+ | 症状 | 原因 | 対処 |
682
+ |------|------|------|
683
+ | Serena接続エラー | プロセスが停止している | `direnv reload` で再起動 |
684
+ | ポートが意図と違う | 別プロセスが使用中 | `lsof -i :9850` で確認、不要なら停止 |
685
+ | ゾンビ `.serena-port` | プロセスが異常終了 | `rm .serena-port && direnv reload` |
686
+ | uvx not found | uv未インストール | `curl -LsSf https://astral.sh/uv/install.sh \| sh` |
687
+
688
+ #### `.env.personal` でのオーバーライド
689
+
690
+ デフォルトポートを変更したい場合:
691
+
692
+ ```bash
693
+ # .env.personal に追記
694
+ SERENA_PORT=9851
695
+ ```
696
+ <!-- @einja:managed:end -->
635
697
 
636
- <!-- このセクションはプロジェクト固有の内容を追記する場所です -->
637
- <!-- einja syncで上書きされません -->
638
- <!-- @einja:seed:end -->
698
+ <!-- @einja:project-private:start id="local-server-environment-and-worktree-project" -->
699
+ <!-- プロジェクト固有の情報を記入 -->
700
+ <!-- @einja:project-private:end -->
@@ -595,11 +595,6 @@ neonctl branches delete $BRANCH_ID --project-id $PROJECT_ID
595
595
  - [neonctl CLI公式ドキュメント](https://neon.tech/docs/reference/neon-cli)
596
596
  <!-- @einja:managed:end -->
597
597
 
598
- ---
599
-
600
- <!-- @einja:seed:start id="neon-cli-reference-project" -->
601
- ## プロジェクト固有の設定
602
-
603
- <!-- このセクションはプロジェクト固有の内容を追記する場合はここに記載 -->
604
- <!-- einja syncで上書きされません -->
605
- <!-- @einja:seed:end -->
598
+ <!-- @einja:project-private:start id="neon-cli-reference-project" -->
599
+ <!-- プロジェクト固有の情報を記入 -->
600
+ <!-- @einja:project-private:end -->
@@ -316,21 +316,21 @@ Step 4: GitHub Issueにタスク一覧を記述
316
316
 
317
317
  ---
318
318
 
319
- ### 3. `pnpm task:loop` コマンド
319
+ ### 3. `/einja:issue-exec` コマンド
320
320
 
321
- **役割**: 複数タスクの自動連続実行とVibe-Kanbanによる進捗追跡
321
+ **役割**: Issue全体のタスクをManager→Director→Workerの3階層で並列実行
322
322
 
323
323
  詳細については、専用ドキュメントを参照してください:
324
- **📖 [Vibe-Kanban自動実行ガイド](./task-vibe-kanban-loop.md)**
324
+ **📖 [Issue実行ワークフローガイド](./issue-exec-workflow.md)**
325
325
 
326
326
  #### `/einja:task-exec`との使い分け
327
327
 
328
- | コマンド | 用途 | 品質保証 | 推奨シーン |
329
- |---------|------|---------|----------|
330
- | **`/einja:task-exec`** | 重要タスクの確実な完了 | 合格まで自動ループ | 複雑な実装、品質重視 |
331
- | **`pnpm task:loop`** | 大量タスクの自動消化 | 各タスクは別プロセス | 定型作業、並行開発 |
328
+ | コマンド | 用途 | 対象 | 推奨シーン |
329
+ |---------|------|------|----------|
330
+ | **`/einja:issue-exec`** | Issue全体の並列実行 | 複数Phase・複数タスクグループ | 大規模機能実装 |
331
+ | **`/einja:task-exec`** | 単一タスクグループの確実な完了 | 1つのタスクグループ | 複雑な実装、品質重視 |
332
332
 
333
- **詳細な使い分け基準**: [task-vibe-kanban-loop.md](./task-vibe-kanban-loop.md#task-execとの使い分け)
333
+ **詳細な使い分け基準**: [issue-exec-workflow.md](./issue-exec-workflow.md#task-execとの使い分け)
334
334
 
335
335
  ---
336
336
 
@@ -452,7 +452,7 @@ stateDiagram-v2
452
452
  [*] --> 未着手: タスク作成
453
453
 
454
454
  未着手 --> 着手中_TaskExec: /einja:task-exec実行
455
- 未着手 --> Vibe登録: /task-vibe-kanban-loop実行
455
+ 未着手 --> IssueExec開始: /einja:issue-exec実行
456
456
 
457
457
  着手中_TaskExec --> 実装中: 実装フェーズ
458
458
  実装中 --> レビュー中: 実装完了
@@ -461,16 +461,16 @@ stateDiagram-v2
461
461
  QA中 --> 実装中: テスト失敗<br/>(ループバック)
462
462
  QA中 --> 完了_TaskExec: 全テスト合格
463
463
 
464
- Vibe登録 --> 実行待機: Vibe-Kanban登録完了
465
- 実行待機 --> 実行中_Vibe: エージェント開始
466
- 実行中_Vibe --> 完了_Vibe: 実行成功
467
- 実行中_Vibe --> 失敗: 実行失敗
464
+ IssueExec開始 --> Worker割当: Manager/Directorが管理
465
+ Worker割当 --> 実行中_IssueExec: Worker起動
466
+ 実行中_IssueExec --> PR作成: task-exec完了
467
+ PR作成 --> 完了_IssueExec: PRマージ
468
468
 
469
- 失敗 --> 手動修正: 開発者が修正
470
- 手動修正 --> Vibe登録: 再実行
469
+ 実行中_IssueExec --> 失敗: 実行失敗
470
+ 失敗 --> Worker割当: リトライ(最大2回)
471
471
 
472
472
  完了_TaskExec --> [*]
473
- 完了_Vibe --> [*]
473
+ 完了_IssueExec --> [*]
474
474
 
475
475
  note right of 未着手
476
476
  状態: [ ]
@@ -482,16 +482,16 @@ stateDiagram-v2
482
482
  状態: [🔄]
483
483
  end note
484
484
 
485
- note right of 実行待機
486
- 1分間隔で再試行
487
- 最大30回まで
485
+ note right of Worker割当
486
+ tmux + worktree で
487
+ 並列実行
488
488
  end note
489
489
 
490
490
  note right of 完了_TaskExec
491
491
  状態: [x]
492
492
  end note
493
493
 
494
- note right of 完了_Vibe
494
+ note right of 完了_IssueExec
495
495
  状態: [x]
496
496
  end note
497
497
  ```
@@ -639,11 +639,6 @@ sequenceDiagram
639
639
  開発を始める際は、まず`/einja:spec-create`で仕様書を作成し、その後`/einja:task-exec`でタスクグループを順次実行していきます。
640
640
  <!-- @einja:managed:end -->
641
641
 
642
- ---
643
-
644
- <!-- @einja:seed:start id="task-execute-project" -->
645
- ## プロジェクト固有の設定
646
-
647
- <!-- このセクションはプロジェクト固有の内容を追記する場所です -->
648
- <!-- einja syncで上書きされません -->
649
- <!-- @einja:seed:end -->
642
+ <!-- @einja:project-private:start id="task-execute-project" -->
643
+ <!-- プロジェクト固有の情報を記入 -->
644
+ <!-- @einja:project-private:end -->
@@ -463,6 +463,7 @@ jobs:
463
463
  | `vercel deploy` | `--yes` | デプロイ確認をスキップ |
464
464
  | `vercel env add` | パイプ入力 | `echo "value" \| vercel env add NAME <environment>` (environment: production/preview/development 必須) |
465
465
  | `vercel env rm` | `--yes` | 削除確認をスキップ |
466
+ | `vercel deploy` | `--env KEY=VALUE` | `vercel deploy --prebuilt --env KEY1=VAL1 --env KEY2=VAL2` (CI/CDでは`--env`で全encrypted変数を実行時注入) |
466
467
 
467
468
  ### トークン認証
468
469
 
@@ -495,10 +496,21 @@ curl -s -H "Authorization: Bearer $VERCEL_TOKEN" \
495
496
 
496
497
  ## 環境変数同期自動化
497
498
 
499
+ ### CI/CDでの自動同期
500
+
501
+ GitHub Actions (`deploy-stable-branches.yml`) が環境変数を自動管理します:
502
+
503
+ | ブランチ | 方式 | 説明 |
504
+ |---------|------|------|
505
+ | main | `vercel env add` + `vercel deploy --env` | Vercel環境変数ストアに同期 + 実行時注入 |
506
+ | develop/staging | `vercel deploy --env` のみ | 実行時注入のみ(`vercel env add`は使用しない) |
507
+ | PR Preview | `vercel deploy --env` のみ | 実行時注入のみ(並行PR競合防止) |
508
+
509
+ **設計意図**: `vercel env add`によるVercel環境変数ストアへの書き込みはmainブランチのみ。develop/staging/PRは`vercel deploy --env`で環境変数を実行時注入し、並行デプロイ間の競合を防止する。
510
+
498
511
  ### 初回セットアップ時の手動同期
499
512
 
500
- **注意**: 通常はGitHub Actions (`deploy-stable-branches.yml`) が環境変数を自動同期します。
501
- 以下の手順は**初回セットアップ時のみ**手動で実行してください。
513
+ **注意**: 以下の手順は**初回セットアップ時のみ**手動で実行してください。
502
514
 
503
515
  ### .env.* からVercelへの環境変数同期
504
516
 
@@ -521,11 +533,6 @@ Neon CLIの詳細は [Neon CLI リファレンス](./neon-cli-reference.md) を
521
533
 
522
534
  <!-- @einja:managed:end -->
523
535
 
524
- ---
525
-
526
- <!-- @einja:seed:start id="vercel-cli-reference-project" -->
527
- ## プロジェクト固有の設定
528
-
529
- <!-- このセクションはプロジェクト固有の内容を追記する場所です -->
530
- <!-- einja syncで上書きされません -->
531
- <!-- @einja:seed:end -->
536
+ <!-- @einja:project-private:start id="vercel-cli-reference-project" -->
537
+ <!-- プロジェクト固有の情報を記入 -->
538
+ <!-- @einja:project-private:end -->