@einja/dev-cli 0.1.40 → 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 +2 -2
  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
@@ -0,0 +1,403 @@
1
+ ---
2
+ description: "GitHub Issueの全タスクを階層的に並列実行するコマンド。Manager→Director→Workerの3階層でtmux+worktreeを使用。ARGUMENTS: 自然言語でIssue番号や実行オプションを指定(例: '#123 autoで全部やって', '45番 phase2まで')"
3
+ allowed-tools: Task, TaskCreate, TaskUpdate, TaskList, TaskGet, TaskOutput, Skill, Read, Write, Edit, MultiEdit, Bash, Grep, Glob, WebFetch, AskUserQuestion, mcp__github__*
4
+ ---
5
+
6
+ # Issue 実行コマンド(Manager)
7
+
8
+ ## 役割
9
+ GitHub Issue全体のタスクを Manager → Director → Worker の3階層で並列実行する。
10
+ tmux セッション、git worktree、ステータスファイルを使って全プロセスを管理する。
11
+
12
+ ## 入力の解析
13
+
14
+ ### Step A: $ARGUMENTS を自然言語として解析
15
+
16
+ $ARGUMENTS をLLMとして自然言語解析し、以下の情報を抽出する:
17
+
18
+ | 項目 | 抽出例 |
19
+ |------|--------|
20
+ | Issue番号 | `#123`, `123`, `Issue 45`, `45番` → 数値を抽出 |
21
+ | マージモード | `autoで`, `自動マージ`, `全部自動` → auto / `タスクだけ自動` → task-group-auto / `手動で確認`, `慎重に` → manual |
22
+ | 実行範囲 | `phase2まで`, `フェーズ1だけ`, `全部` → max-phase 数値 or null |
23
+ | ベースブランチ | `developから`, `mainベース` → ブランチ名 |
24
+ | セッション復旧 | `再開`, `resume`, `続きから` → resume フラグ |
25
+
26
+ 解析できなかった項目は「未指定」とする。曖昧な場合も無理に推測せず「未指定」とする。
27
+
28
+ ### Step B: resume が検出された場合
29
+ セッション復旧フローへ直接進む(Step 0 の復旧処理)。以降の質問はスキップ。
30
+
31
+ ### Step C: 未指定項目を AskUserQuestion で確認
32
+
33
+ **Issue番号** が未指定の場合、まず Issue番号を質問する。
34
+
35
+ 残りの未指定オプションを **1回の AskUserQuestion** でまとめて質問する(指定済みの項目はスキップ):
36
+
37
+ #### Q1: マージモード(未指定時のみ)
38
+ - header: "Merge mode"
39
+ - multiSelect: false
40
+ - options:
41
+ 1. label: "manual(推奨)"
42
+ description: "タスクPR・Phase PRとも人間がマージ。変更内容を都度レビューしたい場合に最適"
43
+ 2. label: "task-group-auto"
44
+ description: "タスクPR(task→phase)はCI通過後に自動マージ。Phase PRは人間マージ。スピードと安全性のバランス型"
45
+ 3. label: "auto"
46
+ description: "タスクPR・Phase PRとも自動マージ。最終PR(issue→base)のみ人間マージ。最速だがリスクあり"
47
+
48
+ #### Q2: 実行範囲(未指定時のみ)
49
+ - header: "Phase範囲"
50
+ - multiSelect: false
51
+ - options:
52
+ 1. label: "全Phase実行(推奨)"
53
+ description: "Issueに定義された全Phaseを順次実行する"
54
+ 2. label: "特定Phaseまで"
55
+ description: "Phase番号を指定して途中まで実行。段階的に確認したい場合に有用(Other欄にPhase番号を入力)"
56
+
57
+ #### Q3: ベースブランチ(未指定時のみ)
58
+ - header: "Base branch"
59
+ - multiSelect: false
60
+ - options:
61
+ 1. label: "main(推奨)"
62
+ description: "デフォルトのメインブランチからIssueブランチを作成"
63
+ 2. label: "develop"
64
+ description: "developブランチがある場合。GitFlow運用向け"
65
+
66
+ ## 処理フロー
67
+
68
+ ### Step 0: 環境準備
69
+
70
+ #### 1. tmux インストール確認・自動導入
71
+
72
+ 1. `command -v tmux` で tmux の存在を確認
73
+ 2. **インストール済みの場合**: `tmux -V` でバージョン表示し、次のステップへ進む
74
+ 3. **未インストールの場合**: `uname -s` で OS を判定し、以下のフローで自動導入を提案
75
+
76
+ **macOS(`uname -s` = `Darwin`):**
77
+ 1. `command -v brew` で Homebrew を確認
78
+ 2. Homebrew あり:
79
+ - AskUserQuestion で「`brew install tmux` を実行してよいか?」確認 → 承認後に実行
80
+ 3. Homebrew なし:
81
+ - 以下を表示して**停止**:
82
+ > tmux のインストールには Homebrew が必要です。
83
+ > 以下のコマンドで Homebrew をインストール後、再度 issue-exec を実行してください:
84
+ > `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`
85
+
86
+ **Linux(`uname -s` = `Linux`):**
87
+ 1. パッケージマネージャーを検出(上から優先):
88
+ - `command -v apt-get` → `apt-get update && apt-get install -y tmux`
89
+ - `command -v dnf` → `dnf install -y tmux`
90
+ - `command -v yum` → `yum install -y tmux`
91
+ - いずれも検出できない場合 → 「対応パッケージマネージャーが見つかりません。手動で tmux をインストールしてください」と表示して**停止**
92
+ 2. 権限判定とインストール:
93
+ - `id -u` が 0(root)→ sudo 不要。AskUserQuestion で「`<pm> install tmux` を実行してよいか?」確認 → 承認後に実行
94
+ - root でない場合 → `sudo -n true 2>/dev/null` で sudo 権限を確認
95
+ - sudo 可能 → AskUserQuestion で「`sudo <pm> install tmux` を実行してよいか?」確認 → 承認後に実行
96
+ - sudo 不可 → AskUserQuestion で「tmux のインストールには sudo 権限が必要です。パスワード入力が求められる場合があります。`sudo <pm> install tmux` を実行しますか?それとも手動でインストールしますか?」と確認
97
+ - 手動を選択 → インストールコマンドを表示して**停止**
98
+
99
+ **その他(`MINGW*`, `MSYS*`, `CYGWIN*`, 不明な OS):**
100
+ - 以下を表示して**停止**:
101
+ > issue-exec は tmux を必須としており、この環境では利用できません。
102
+ > WSL2 環境での実行を推奨します。
103
+ > 代替: `/einja:task-exec` で個別タスクグループを逐次実行することは可能です。
104
+
105
+ **インストール後の検証:**
106
+ - `hash -r` で PATH をリフレッシュし、`command -v tmux && tmux -V` で成功確認
107
+ - 失敗した場合 → 「tmux のインストールは完了しましたが、PATH に反映されていません。シェルを再起動して再度実行してください」と表示して**停止**
108
+
109
+ #### 2. ディレクトリ準備
110
+ - `~/.einja/sessions/` と `~/.einja/worktrees/` ディレクトリを確認・作成
111
+
112
+ #### 3. セッション復元
113
+ - `--resume` フラグがある場合、`~/.einja/sessions/issue-{N}/session.json` からセッション状態を復元
114
+ - 未完了のPhaseのDirectorを再起動する
115
+
116
+ ### Step 1: Issue パース
117
+ 1. `gh issue view {issue番号} --json body,title,number` でIssue本文を取得
118
+ 2. Issue本文からPhase構造をパース:
119
+ - `### Phase N: {Phase名}` のセクションを抽出
120
+ - 各Phase内のタスクグループ(X.Y形式)を抽出
121
+ - タスクグループ間の依存関係を分析
122
+ 3. `--max-phase` が指定されている場合、その番号以降のPhaseを除外
123
+
124
+ ### Step 2: ブランチ & worktree 作成
125
+ 1. Issue ブランチ作成: `issue/{issue番号}`(base ブランチから)
126
+ 2. 各 Phase のブランチ作成: `issue/{issue番号}-phase{N}`(issue ブランチから)
127
+ 3. git worktree 作成:
128
+ ```bash
129
+ mkdir -p ~/.einja/worktrees/issue-{N}/
130
+ git worktree add ~/.einja/worktrees/issue-{N}/phase{M} issue/{N}-phase{M}
131
+ ```
132
+ 4. worktree 作成時は必ずリモートにpush:
133
+ ```bash
134
+ git push -u origin issue/{N}
135
+ git push -u origin issue/{N}-phase{M}
136
+ ```
137
+
138
+ ### Step 3: セッションファイル初期化
139
+ パス: `~/.einja/sessions/issue-{N}/`
140
+
141
+ ```
142
+ session.json # セッション全体
143
+ phase-{M}/
144
+ status.json # Phase状態
145
+ task-{X.Y}.json # 各タスクグループの状態
146
+ questions/
147
+ q-{uuid}.json # 質問ファイル
148
+ events.jsonl # イベントログ
149
+ ```
150
+
151
+ session.json の初期状態:
152
+ ```json
153
+ {
154
+ "issueNumber": 123,
155
+ "mergeMode": "manual",
156
+ "baseBranch": "main",
157
+ "startedAt": "ISO8601",
158
+ "managerPid": "PID",
159
+ "phases": [
160
+ { "number": 1, "name": "Phase名", "status": "pending", "branch": "issue/123-phase1" }
161
+ ]
162
+ }
163
+ ```
164
+
165
+ ### Step 4: tmux セッション作成
166
+ ```bash
167
+ tmux new-session -d -s einja-{issue番号} -n manager
168
+ ```
169
+
170
+ ### Step 5: Director 起動(Phase単位)
171
+ Phase の依存関係を考慮し、着手可能な Phase から Director を起動。
172
+
173
+ 1. Phase worktree のディレクトリに移動
174
+ 2. tmux window で `claude` を対話モードで起動
175
+ 3. 初期プロンプトとして以下を送信(tmux send-keys):
176
+
177
+ ```
178
+ tmux new-window -t einja-{N} -n director-phase{M}
179
+ tmux send-keys -t einja-{N}:director-phase{M} 'cd ~/.einja/worktrees/issue-{N}/phase{M} && claude' Enter
180
+ ```
181
+
182
+ claude が起動したら、以下のプロンプトを送信:
183
+ ```
184
+ tmux send-keys -t einja-{N}:director-phase{M} '
185
+ あなたは Director(Phase {M})です。以下の Phase を管理してください。
186
+
187
+ ## Phase情報
188
+ - Issue番号: #{issue番号}
189
+ - Phase: {M} - {Phase名}
190
+ - Phase ブランチ: issue/{N}-phase{M}
191
+ - マージモード: {mergeMode}
192
+ - セッションパス: ~/.einja/sessions/issue-{N}/phase-{M}/
193
+ - worktree パス: ~/.einja/worktrees/issue-{N}/
194
+
195
+ ## タスクグループ一覧
196
+ {タスクグループ一覧(番号、名前、依存関係を含む)}
197
+
198
+ ## 責務
199
+ 1. 依存関係のないタスクグループは並列でWorkerを起動してください
200
+ 2. 各Worker には tmux window + claude 対話モードで起動:
201
+ - worktree作成: git worktree add ~/.einja/worktrees/issue-{N}/task-{X.Y} task/{N}-{X.Y}
202
+ - tmux: tmux new-window + claude 起動 + /einja:task-exec #{N} {X.Y} を実行
203
+ 3. Worker完了後:
204
+ - ステータスファイルでPR番号を確認
205
+ - マージモードに応じたPR処理
206
+ - 他active Workerにsync通知
207
+ - 完了したworktree削除
208
+ 4. 質問対応: Workerからの質問にspec/design/issueベースで回答。回答不可ならManagerにエスカレーション
209
+ 5. Phase完了時: ステータスファイルで Manager に報告
210
+ 6. GitHub Issue のチェックボックス更新
211
+
212
+ ## 質問エスカレーション
213
+ 回答不可な質問は ~/.einja/sessions/issue-{N}/questions/ にJSONファイルを作成してManagerに通知してください。
214
+ ' Enter
215
+ ```
216
+
217
+ ### Step 6: 監視ループ
218
+ Manager は以下を定期的に監視:
219
+
220
+ 1. **ステータスファイル監視**(30秒間隔):
221
+ - 各 Phase の status.json をチェック
222
+ - Phase 完了を検知したら Phase PR を作成
223
+ - 質問ファイルの pending 状態を検知
224
+
225
+ 2. **質問エスカレーション処理**:
226
+ - `~/.einja/sessions/issue-{N}/questions/` の pending 質問を検知
227
+ - AskUserQuestion で人間に質問を表示
228
+ - 回答をステータスファイルに書き込み
229
+
230
+ 3. **Phase 完了処理**:
231
+ - Phase PR 作成: `gh pr create --base issue/{N} --head issue/{N}-phase{M}`
232
+ - マージモードに応じた処理(manual: 待機、auto: 自動マージ)
233
+ - マージ後、Phase worktree 削除
234
+ - 他 active Phase への変更伝播通知
235
+
236
+ 4. **tmux window 消失検知**:
237
+ - Director/Worker の tmux window が消失した場合のリカバリ処理
238
+
239
+ ### Step 7: 全Phase完了 → 最終PR
240
+ 1. 最終PR作成: `gh pr create --base {baseBranch} --head issue/{N}`
241
+ 2. PR URL を表示
242
+ 3. セッションクリーンアップ(worktree 削除、セッションファイル削除)
243
+
244
+ ## マージモード詳細
245
+
246
+ | モード | タスクPR (task→phase) | Phase PR (phase→issue) | 最終PR (issue→base) |
247
+ |---|---|---|---|
248
+ | `manual` | 人間マージ待ち | 人間マージ待ち | 人間マージ待ち |
249
+ | `task-group-auto` | CI通過後に自動マージ | 人間マージ待ち | 人間マージ待ち |
250
+ | `auto` | CI通過後に自動マージ | CI通過後に自動マージ | 人間マージ待ち(常に手動) |
251
+
252
+ ## ブランチ構成
253
+
254
+ ```
255
+ {baseBranch}
256
+ └── issue/{N} Manager管理
257
+ ├── issue/{N}-phase1 Director1 worktree
258
+ │ ├── task/{N}-1.1 Worker1.1 worktree
259
+ │ ├── task/{N}-1.2 Worker1.2 worktree
260
+ │ └── task/{N}-1.3 Worker1.3 worktree
261
+ └── issue/{N}-phase2 Director2 worktree
262
+ └── task/{N}-2.1 Worker2.1 worktree
263
+ ```
264
+
265
+ ## worktree 物理パス
266
+ ```
267
+ ~/.einja/worktrees/issue-{N}/
268
+ ├── phase{M}/ ← Director cwd
269
+ ├── task-{X.Y}/ ← Worker cwd
270
+ ```
271
+
272
+ ## ステータスファイル詳細
273
+
274
+ ### session.json
275
+ ```json
276
+ {
277
+ "issueNumber": 123,
278
+ "mergeMode": "manual",
279
+ "baseBranch": "main",
280
+ "startedAt": "2025-01-01T00:00:00Z",
281
+ "managerPid": "12345",
282
+ "phases": [
283
+ { "number": 1, "name": "基盤構築", "status": "in_progress", "branch": "issue/123-phase1" },
284
+ { "number": 2, "name": "機能実装", "status": "pending", "branch": "issue/123-phase2" }
285
+ ]
286
+ }
287
+ ```
288
+
289
+ ### phase-{M}/status.json
290
+ ```json
291
+ {
292
+ "phaseNumber": 1,
293
+ "status": "in_progress",
294
+ "directorPid": "12346",
295
+ "startedAt": "2025-01-01T00:00:00Z"
296
+ }
297
+ ```
298
+
299
+ ### phase-{M}/task-{X.Y}.json
300
+ ```json
301
+ {
302
+ "taskGroup": "1.1",
303
+ "status": "completed",
304
+ "branch": "task/123-1.1",
305
+ "workerPid": "12347",
306
+ "prNumber": 456,
307
+ "startedAt": "2025-01-01T00:00:00Z",
308
+ "completedAt": "2025-01-01T01:00:00Z"
309
+ }
310
+ ```
311
+
312
+ ### questions/q-{uuid}.json
313
+ ```json
314
+ {
315
+ "id": "q-001",
316
+ "from": "worker-1.1",
317
+ "question": "ユーザー認証にJWTとセッションのどちらを使うべきか?",
318
+ "context": "design.md にはどちらの記載もない",
319
+ "status": "pending",
320
+ "escalatedTo": null,
321
+ "answer": null,
322
+ "answeredBy": null,
323
+ "docUpdate": null
324
+ }
325
+ ```
326
+
327
+ ### events.jsonl
328
+ 各行が1つのイベント:
329
+ ```json
330
+ {"timestamp":"2025-01-01T00:00:00Z","pid":"12345","event_type":"session_started","data":{"issueNumber":123}}
331
+ {"timestamp":"2025-01-01T00:01:00Z","pid":"12346","event_type":"director_started","data":{"phase":1}}
332
+ ```
333
+
334
+ ## エラーリカバリ
335
+
336
+ | 障害 | 検知方法 | リカバリ |
337
+ |---|---|---|
338
+ | Worker異常終了(PR作成前) | tmux window消失 + ステータス未更新 | リトライ(最大2回)→ 失敗時はManagerに報告 → 人間判断 |
339
+ | Worker異常終了(PR作成済み) | tmux window消失 + PRあり | スキップ(PRマージ待ち継続) |
340
+ | Director異常終了 | tmux window消失 + ステータス未更新 | 各Workerのステータスを確認 → 未完了Workerのみ再実行 |
341
+ | Manager異常終了 | ユーザー手動 | `--resume` でセッション復元 |
342
+ | rebaseコンフリクト | git rebase失敗 | conflict-resolverで自力解消 |
343
+ | CI失敗 | gh run status | 修正 → 再push → 再CI待機 |
344
+
345
+ ## CI 待機タイムアウト
346
+ - デフォルト: 30分
347
+ - 超過時は AskUserQuestion でユーザーに通知
348
+
349
+ ## 質問回答のドキュメント還元
350
+ 質問エスカレーションで得られた回答のうち、ドキュメント未記載のものは適切なドキュメントに追記する。
351
+
352
+ 回答ステータスファイルに追記先を記録:
353
+ ```json
354
+ {
355
+ "answer": "JWT を使用する",
356
+ "answeredBy": "human",
357
+ "docUpdate": {
358
+ "target": "design.md",
359
+ "section": "認証方式",
360
+ "content": "認証方式は JWT を採用する。理由: ..."
361
+ }
362
+ }
363
+ ```
364
+
365
+ ### 追記先の判定基準
366
+ | 回答の種類 | 追記先 |
367
+ |-----------|--------|
368
+ | 要件・仕様に関する判断 | requirements.md |
369
+ | 技術的な設計判断 | design.md |
370
+ | プロジェクト横断の方針 | docs/einja/memory/decisions.md |
371
+ | 再利用可能なパターン | docs/einja/memory/patterns.md |
372
+
373
+ ## Worker 起動コマンド(Director が実行)
374
+
375
+ ```bash
376
+ # 1. タスクブランチ作成 & worktree 追加
377
+ git branch task/{N}-{X.Y} issue/{N}-phase{M}
378
+ git push -u origin task/{N}-{X.Y}
379
+ git worktree add ~/.einja/worktrees/issue-{N}/task-{X.Y} task/{N}-{X.Y}
380
+
381
+ # 2. tmux window で claude 起動
382
+ tmux new-window -t einja-{N} -n worker-{X.Y}
383
+ tmux send-keys -t einja-{N}:worker-{X.Y} 'cd ~/.einja/worktrees/issue-{N}/task-{X.Y} && claude' Enter
384
+
385
+ # 3. task-exec コマンドを実行
386
+ # claude 起動後に以下を送信:
387
+ tmux send-keys -t einja-{N}:worker-{X.Y} '/einja:task-exec #{N} {X.Y}' Enter
388
+ ```
389
+
390
+ ## セッションクリーンアップ
391
+
392
+ Issue完了時に以下を自動削除:
393
+ - `~/.einja/sessions/issue-{N}/` (セッションファイル)
394
+ - `~/.einja/worktrees/issue-{N}/` (worktree。事前に `git worktree remove` を実行)
395
+ - ローカルブランチのクリーンアップ(task/*, issue/*-phase*)
396
+
397
+ ## 注意事項
398
+
399
+ - 全プロセスは**対話モード**(`claude`、非 `-p`)で起動。質問エスカレーションのため
400
+ - Worker 内部のタスク並列実行は既存の task-exec フロー(Task ツール + run_in_background)をそのまま活用
401
+ - ステータスファイルの `status.json` 更新には `flock` による排他制御を使用
402
+ - 質問ファイルは1ファイル1質問のためロック不要(UUID でアトミック書き込み)
403
+ - Worker は各タスク完了毎 + PR作成前にステータスファイルをチェック(sync_required検知時は次タスク開始前にrebase)
@@ -32,7 +32,7 @@ TodoWriteツールを使用して全体の進捗を可視化し、ユーザー
32
32
 
33
33
  ### 0. 前提確認フェーズ(ワークフロー開始時)
34
34
 
35
- **⚠️ 重要**: 仕様書作成開始前に、以下の3つの質問で前提を確認すること。
35
+ **⚠️ 重要**: 仕様書作成開始前に、以下の確認を行うこと。
36
36
 
37
37
  #### 0.1 TDD適用判定
38
38
 
@@ -108,6 +108,16 @@ AskUserQuestion:
108
108
  **「その他」選択時の対応**:
109
109
  - ブランチ名をユーザーに確認し、IssueBranchBaseとして記録する
110
110
 
111
+ #### 0.4 Skill作成必要性の評価
112
+
113
+ `einja-skill-first` Skillを使用して、このタスクに対してSkillを先に作るべきかを自動評価する。
114
+
115
+ - **スキップ基準に該当する場合**(単発修正、具体的な小規模指示等): 評価を省略し次へ進む
116
+ - **評価実行時**: Skillが構造化された評価結果(🟢推奨/🟡拡張推奨/⚪不要)を返却
117
+ - 🟢推奨 → AskUserQuestionでユーザーに提案。承認されたら仕様書作成前にSkill作成を実施
118
+ - 🟡拡張推奨 → 既存Skill拡張の提案をユーザーに確認
119
+ - ⚪不要 → そのまま次へ進む
120
+
111
121
  ### 1. 外部リソースの確認
112
122
 
113
123
  **AsanaタスクURL**の場合:
@@ -327,3 +337,7 @@ AskUserQuestion:
327
337
  - Asana/Figma連携によるトレーサビリティ確保
328
338
 
329
339
  実行を開始します...
340
+
341
+ <!-- @einja:project-private:start id="spec-create-project" -->
342
+ <!-- プロジェクト固有の情報を記入 -->
343
+ <!-- @einja:project-private:end -->
@@ -96,3 +96,7 @@ pnpm dev:logs
96
96
  # または直接
97
97
  tail -f log/dev.log
98
98
  ```
99
+
100
+ <!-- @einja:project-private:start id="start-dev-project" -->
101
+ <!-- プロジェクト固有の情報を記入 -->
102
+ <!-- @einja:project-private:end -->
@@ -276,3 +276,7 @@ Cursor で以下のルールが利用可能になりました:
276
276
  - 注意書きの内容
277
277
  - エラーハンドリングの詳細度
278
278
  - ルールタイプ(`alwaysApply` / `globs`)の設定
279
+
280
+ <!-- @einja:project-private:start id="sync-cursor-commands-project" -->
281
+ <!-- プロジェクト固有の情報を記入 -->
282
+ <!-- @einja:project-private:end -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: "GitHub Issueのタスクグループを実行するコマンド。ARGUMENTS: Issue番号(必須、#123形式)とタスクグループ番号(必須、1.1形式)"
3
- allowed-tools: Task, Read, Write, Edit, MultiEdit, Bash, Grep, Glob, WebFetch, mcp__github__*, mcp__serena__*
3
+ allowed-tools: Task, TaskCreate, TaskUpdate, TaskList, TaskGet, TaskOutput, Skill, Read, Write, Edit, MultiEdit, Bash, Grep, Glob, WebFetch, mcp__github__*, mcp__serena__*
4
4
  ---
5
5
 
6
6
  # タスク実行コマンド
@@ -36,7 +36,7 @@ $ARGUMENTSから以下を解析:
36
36
 
37
37
  | Phase番号 | 判定 | 処理フロー |
38
38
  |-----------|------|-----------|
39
- | 1〜98 | 通常タスク | task-executer → task-reviewer → task-qa → einja-task-commit Skill |
39
+ | 1〜98 | 通常タスク | Issueパースspec読込 → TaskCreate登録 → 並列実行 → task-reviewer → task-qa → einja-task-commit Skill |
40
40
  | 99 | ドキュメント反映タスク | docs-updater → einja-task-commit Skill |
41
41
 
42
42
  ### 通常タスクのフロー(Phase 1〜98)
@@ -45,10 +45,15 @@ $ARGUMENTSから以下を解析:
45
45
  ┌─────────────────────────────────────────────────────────┐
46
46
  │ 品質保証ループ │
47
47
  │ │
48
- task-executertask-reviewertask-qa
49
- │ │
50
- └──────────────┴──────────────┘
51
- (MAJOR/テスト失敗時は自動的に戻る)
48
+ Issueパースspecパス特定TaskCreate登録
49
+
50
+ 依存関係ベース並列実行:
51
+ task-executer × N(独立タスク並列)
52
+ │ ↓ 全タスク完了 │
53
+ │ task-reviewer → task-qa │
54
+ │ ↑ │ │
55
+ │ └──────────────┘ │
56
+ │ (MAJOR/テスト失敗時は該当タスクのみ再実行) │
52
57
  │ │
53
58
  │ QA合格後 ↓ │
54
59
  │ ┌─────────────────────────────────────────────┐ │
@@ -101,21 +106,104 @@ $ARGUMENTSから以下を解析:
101
106
 
102
107
  各フェーズ完了後、サブエージェントの出力を表示したら即座に次のフェーズへ進む。ユーザーの応答は待たない。
103
108
 
104
- ### 1. 実装フェーズ(task-executer)
105
- - 要件定義・設計書に基づいた実装を実行
106
- - 完了後、出力を表示して即座にレビューフェーズへ
109
+ ### Step 0: 入力解析
107
110
 
108
- ### 2. レビューフェーズ(task-reviewer)
111
+ $ARGUMENTSからIssue番号とタスクグループ番号を解析する(現行通り)。
112
+
113
+ ### Step 1: Issueフェッチ + タスク解析
114
+
115
+ 1. `gh issue view {issue番号} --json body,title` でIssue本文を取得
116
+ 2. 指定タスクグループ(X.Y)配下のタスク(X.Y.Z)をパース
117
+ 3. 各タスクのメタデータを抽出:
118
+ - タスク名
119
+ - 要件(Story番号)
120
+ - 依存関係(なし / X.Y.Z形式)
121
+ - 完了条件
122
+ - 対応設計セクション名
123
+ - シナリオテスト
124
+
125
+ ### Step 2: spec読み込み + AC抽出
126
+
127
+ **目的**: task-executerから spec/Issue 読み込み責務を移管し、親が一括で行う。
128
+
129
+ 1. **specディレクトリを探索**: `docs/specs/issues/*/issue{N}-*/` パターンで検索
130
+ 2. **存在チェック**:
131
+ - 完全なspec(requirements.md + design.md + qa-tests/) → 次へ
132
+ - 部分的spec → エラー終了(`/einja:spec-create` の実行を案内)
133
+ - specなし → `einja-general-context-loader` Skill を呼び出してコンテキスト収集
134
+ 3. **requirements.md を読み込み**、各タスクのメタデータ(`**要件**: Story X`)に基づいてACを抽出
135
+ - ACはGiven/When/Then形式で小さい(~50-100トークン/AC)ので直接保持
136
+ 4. **design.md はパスのみ特定**(内容は読み込まない)
137
+ - 各タスクの`**対応設計**: design.md「セクション名」`からセクション名を記録
138
+
139
+ ### Step 3: TaskCreate登録
140
+
141
+ 各タスクを `TaskCreate` で登録し、依存関係を設定する。
142
+
143
+ **TaskCreate の形式**:
144
+ ```
145
+ TaskCreate:
146
+ subject: "X.Y.Z タスク名"
147
+ description: |
148
+ ## 受け入れ基準(抽出済み)
149
+ - AC1.2: Given: ... When: ... Then: ...
150
+ - AC1.3: Given: ... When: ... Then: ...
151
+ ## 設計参照
152
+ {specパス}/design.md → 「セクション名」セクション
153
+ ## 完了条件
154
+ (Issueから抽出した完了条件 + ACを満たす)
155
+ ## 参考(追加情報が必要な場合)
156
+ - requirements.md: {specパス}/requirements.md
157
+ - design.md: {specパス}/design.md
158
+ activeForm: "タスクX.Y.Zを実装中"
159
+ ```
160
+
161
+ **依存関係の設定**:
162
+ - `TaskUpdate` の `addBlockedBy` で依存関係を設定
163
+ - `**依存関係**: X.Y.Z` → 対応するTaskのIDを `addBlockedBy` に設定
164
+ - `**依存関係**: なし` → ブロックなし
165
+ - `**依存関係**: X.Y`(タスクグループ依存) → グループ外依存のため事前に完了済みと想定
166
+
167
+ **タスク番号→TaskID のマッピングテーブル**を保持し、依存関係解決に使用する。
168
+
169
+ ### Step 4: 依存関係ベース並列実行ループ
170
+
171
+ ```
172
+ while (未完了タスクが存在):
173
+ 1. TaskList で未完了タスクを確認
174
+ 2. blockedBy が空かつ pending のタスクを収集
175
+ 3. 収集したタスクを TaskUpdate で in_progress に設定
176
+ 4. Task ツールで複数の task-executer を並列起動:
177
+ - 各 task-executer のpromptに以下を含める(ハイブリッド方式):
178
+ a. タスクID + タスク名 + 実装指示(Issueから抽出したサブタスク内容)
179
+ b. AC(受け入れ基準)→ 直接埋め込み(親が抽出済み)
180
+ c. 設計 → design.mdパス + セクション名(executerが自分でRead)
181
+ d. 完了条件
182
+ e. フォールバック用specファイルパス(追加情報が必要な場合)
183
+ - run_in_background: true で非同期起動(2タスク以上の場合)
184
+ 5. 各エージェントの完了を待機(TaskOutput で結果取得)
185
+ 6. 完了したタスクを TaskUpdate で completed に設定
186
+ 7. ループ先頭に戻る
187
+ ```
188
+
189
+ **注意事項**:
190
+ - 並列起動するタスク間でファイル変更対象が重複しないよう、設計セクションから推定して確認する
191
+ - 重複懸念がある場合は直列化する
192
+ - task-executerにはコミットさせない(Step 7でまとめて実行)
193
+
194
+ ### Step 5: レビューフェーズ(task-reviewer)
195
+ - 全タスク完了後、グループ全体で1回実行
109
196
  - 要件定義・設計との整合性確認
110
- - MAJOR判定 → 実装フェーズに戻る
197
+ - MAJOR判定 → 該当タスクのみ再実行(Step 4に戻る)
111
198
  - PASS/MINOR判定 → 品質保証フェーズへ
112
199
 
113
- ### 3. 品質保証フェーズ(task-qa)
200
+ ### Step 6: 品質保証フェーズ(task-qa)
201
+ - グループ全体で1回実行
114
202
  - 受け入れ条件に基づく動作確認
115
- - テスト失敗 → 実装フェーズに戻る
203
+ - テスト失敗 → 該当タスクのみ再実行(Step 4に戻る)
116
204
  - 全テスト合格 → コミット・プッシュフェーズへ
117
205
 
118
- ### 4. コミット・プッシュフェーズ(einja-task-commit Skill)
206
+ ### Step 7: コミット・プッシュフェーズ(einja-task-commit Skill)
119
207
  - QA合格後、Skill toolで `einja-task-commit` Skillを直接呼び出し
120
208
  - 変更がある場合のみ実行(変更なしの場合はスキップ)
121
209
  - コミット分割案の確認はスキップ(QA合格済みのため自動適用)
@@ -388,3 +476,7 @@ AskUserQuestion:
388
476
  - Issue番号とタスクグループ番号の両方が必須
389
477
  - GitHub Issueのチェックボックス更新は自動では行わない
390
478
  - コミット時は [コミットルール](../../docs/einja/steering/commit-rules.md) を遵守
479
+
480
+ <!-- @einja:project-private:start id="task-exec-project" -->
481
+ <!-- プロジェクト固有の情報を記入 -->
482
+ <!-- @einja:project-private:end -->
@@ -446,3 +446,7 @@ allowed-tools: Read, Write, Edit, Bash, Grep, Glob
446
446
  ```
447
447
  /update-docs-by-task-specs docs/specs/tasks/monorepo/20251104-monorepo-turborepo-nextjs-setup docs/specs/tasks/auth/20251105-login-feature
448
448
  ```
449
+
450
+ <!-- @einja:project-private:start id="update-docs-by-task-specs-project" -->
451
+ <!-- プロジェクト固有の情報を記入 -->
452
+ <!-- @einja:project-private:end -->
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+ # plan-mode-skill-loader.sh - Plan mode中にeinja-skill-firstのリマインダーを注入
3
+ #
4
+ # UserPromptSubmit hookとして設定
5
+ # permission_mode == "plan" の場合に、軽量リマインダーをadditionalContextとして注入
6
+ # 毎回注入しても2-3行なのでコスト無視可能。状態管理不要。
7
+
8
+ set -uo pipefail
9
+
10
+ input=$(cat)
11
+
12
+ # permission_modeを取得
13
+ permission_mode=$(echo "$input" | jq -r '.permission_mode // empty')
14
+
15
+ # Plan mode以外はスキップ
16
+ if [[ "$permission_mode" != "plan" ]]; then
17
+ exit 0
18
+ fi
19
+
20
+ # 軽量リマインダーを注入
21
+ jq -n '{
22
+ "additionalContext": "【Plan mode自動リマインダー】計画作成前にeinja-skill-firstの評価を実施してください。.claude/skills/einja-skill-first/SKILL.mdを参照し、スキップ基準に該当しない場合はSkill作成の必要性を評価してください。スキップ基準(単発の小規模修正、既存キーワードトリガー一致、具体的かつ限定的な作業指示、1回限りの作業)に該当する場合は省略可。"
23
+ }'
@@ -1,4 +1,7 @@
1
1
  {
2
+ "env": {
3
+ "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
4
+ },
2
5
  "includeCoAuthoredBy": false,
3
6
  "plansDirectory": "docs/plans",
4
7
  "permissions": {
@@ -182,9 +185,20 @@
182
185
  }
183
186
  ]
184
187
  }
188
+ ],
189
+ "UserPromptSubmit": [
190
+ {
191
+ "hooks": [
192
+ {
193
+ "type": "command",
194
+ "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/einja/plan-mode-skill-loader.sh",
195
+ "timeout": 5000
196
+ }
197
+ ]
198
+ }
185
199
  ]
186
200
  },
187
201
  "enabledPlugins": {
188
202
  "code-simplifier@claude-plugins-official": true
189
203
  }
190
- }
204
+ }