@einja/dev-cli 0.1.41 → 0.1.44
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.
- package/dist/commands/task-loop/lib/github-client.test.js.map +1 -1
- package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js +2 -2
- package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js.map +1 -1
- package/dist/lib/preset-update/file-copier.js +3 -3
- package/dist/lib/preset-update/file-copier.js.map +1 -1
- package/dist/lib/sync/marker-processor.js.map +1 -1
- package/dist/lib/sync/metadata-manager.js +1 -1
- package/dist/lib/sync/metadata-manager.js.map +1 -1
- package/dist/lib/sync/metadata-manager.test.js +3 -2
- package/dist/lib/sync/metadata-manager.test.js.map +1 -1
- package/dist/lib/sync/project-private-synchronizer.d.ts.map +1 -1
- package/dist/lib/sync/project-private-synchronizer.js +5 -1
- package/dist/lib/sync/project-private-synchronizer.js.map +1 -1
- package/package.json +1 -1
- package/presets/default/.claude/agents/einja/backend-architect.md +17 -1
- package/presets/default/.claude/agents/einja/codex-agent.md +1 -1
- package/presets/default/.claude/agents/einja/design-engineer.md +1 -1
- package/presets/default/.claude/agents/einja/docs/docs-updater.md +3 -93
- package/presets/default/.claude/agents/einja/frontend-architect.md +17 -1
- package/presets/default/.claude/agents/einja/frontend-coder.md +1 -1
- package/presets/default/.claude/agents/einja/{specs/spec-design-generator.md → issue-specs/design-generator.md} +12 -7
- package/presets/default/.claude/agents/einja/{specs/spec-qa-generator.md → issue-specs/qa-generator.md} +6 -4
- package/presets/default/.claude/agents/einja/{specs/spec-requirements-generator.md → issue-specs/requirements-generator.md} +5 -5
- package/presets/default/.claude/agents/einja/{specs/spec-tasks-generator.md → issue-specs/tasks-generator.md} +13 -14
- package/presets/default/.claude/agents/einja/{specs/spec-tasks-validator.md → issue-specs/tasks-validator.md} +9 -9
- package/presets/default/.claude/agents/einja/issue-specs/ui-design-generator.md +114 -0
- package/presets/default/.claude/agents/einja/task/task-executer.md +9 -3
- package/presets/default/.claude/agents/einja/task/task-modification-analyzer.md +2 -2
- package/presets/default/.claude/agents/einja/task/task-qa.md +3 -3
- package/presets/default/.claude/agents/einja/task/task-reviewer.md +13 -1
- package/presets/default/.claude/commands/einja/einja-sync.md +119 -44
- package/presets/default/.claude/commands/einja/issue-exec.md +29 -19
- package/presets/default/.claude/commands/einja/sync-cursor-commands.md +6 -6
- package/presets/default/.claude/commands/einja/{update-docs-by-task-specs.md → update-docs-by-issue-specs.md} +58 -58
- package/presets/default/.claude/hooks/einja/plan-mode-skill-loader.sh +5 -1
- package/presets/default/.claude/settings.json +14 -4
- package/presets/default/.claude/skills/{einja-general-context-loader → _einja-general-context-loader}/SKILL.md +2 -2
- package/presets/default/.claude/skills/{einja-output-format → _einja-output-format}/SKILL.md +1 -1
- package/presets/default/.claude/skills/_einja-project-overview/SKILL.md +29 -0
- package/presets/default/.claude/skills/{einja-spec-context-loader → _einja-spec-context-loader}/SKILL.md +5 -5
- package/presets/default/.claude/skills/einja-coding-standards/references/testing-strategy.md +899 -0
- package/presets/default/.claude/skills/einja-conflict-resolver/SKILL.md +1 -1
- package/presets/default/.claude/skills/einja-create-pr/SKILL.md +138 -0
- package/presets/default/.claude/skills/einja-infra-maintenance/SKILL.md +779 -0
- package/presets/default/.claude/{commands/einja/spec-create.md → skills/einja-issue-spec-create/SKILL.md} +47 -24
- package/presets/default/.claude/skills/einja-issue-spec-generator/SKILL.md +105 -0
- package/presets/default/.claude/skills/einja-issue-spec-generator/references/format-rules.md +35 -0
- package/presets/default/.claude/skills/einja-issue-spec-validator/SKILL.md +130 -0
- package/presets/default/.claude/skills/einja-issue-spec-validator/references/validation-rules.md +52 -0
- package/presets/default/.claude/skills/einja-npm-release/SKILL.md +242 -0
- package/presets/default/.claude/skills/einja-skill-creator/SKILL.md +68 -12
- package/presets/default/.claude/skills/einja-skill-creator/scripts/aggregate_benchmark.py +368 -121
- package/presets/default/.claude/skills/einja-skill-creator/scripts/compare_runs.py +154 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/generate_report.py +14 -7
- package/presets/default/.claude/skills/einja-skill-creator/scripts/improve_description.py +2 -7
- package/presets/default/.claude/skills/einja-skill-creator/scripts/run_loop.py +263 -183
- package/presets/default/.claude/skills/einja-skill-first/SKILL.md +265 -0
- package/presets/default/.claude/skills/einja-subagent-question-protocol/SKILL.md +98 -0
- package/presets/default/.claude/skills/einja-task-commit/SKILL.md +7 -7
- package/presets/default/.claude/{commands/einja/task-exec.md → skills/einja-task-exec/SKILL.md} +3 -78
- package/presets/default/.claude/skills/einja-task-qa/SKILL.md +4 -4
- package/presets/default/.claude/skills/einja-task-qa/references/troubleshooting.md +1 -1
- package/presets/default/.claude/skills/einja-task-qa/references/usage-patterns.md +2 -2
- package/presets/default/.claude/skills/einja-team-exec/SKILL.md +165 -0
- package/presets/default/CLAUDE.md.template +21 -6
- package/presets/default/docs/einja/instructions/deployment-setup.md +1 -1
- package/presets/default/docs/einja/instructions/issue-exec-workflow.md +11 -11
- package/presets/default/docs/einja/instructions/local-server-environment-and-worktree.md +1 -1
- package/presets/default/docs/einja/instructions/setup-flow.md +279 -0
- package/presets/default/docs/einja/instructions/task-execute.md +42 -42
- package/presets/default/docs/einja/steering/acceptance-criteria-and-qa-guide.md +1 -1
- package/presets/default/docs/einja/steering/branch-strategy.md +1 -1
- package/presets/default/docs/einja/steering/development-workflow.md +93 -25
- package/presets/default/docs/einja/steering/infrastructure/deployment.md +107 -0
- package/presets/default/docs/einja/steering/task-management.md +9 -13
- package/presets/default/scripts/ensure-serena.sh +2 -2
- package/presets/default/scripts/env-rotate-secrets.ts +66 -6
- package/presets/default/scripts/init-github.ts +363 -0
- package/presets/default/scripts/init.sh +11 -5
- package/presets/default/scripts/setup-dev.ts +16 -1
- package/presets/default/.claude/agents/einja/git/conflict-resolver.md +0 -152
- package/presets/default/.claude/hooks/einja/validate-git-commit.sh +0 -239
- package/presets/default/.claude/skills/einja-project-overview/SKILL.md +0 -39
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: einja-team-exec
|
|
3
|
+
description: "Agent Teamsによるチーム並列実行を行うSkill。ユーザーが「チームで」「Teamで」「Agent Teamsで」「並列チームで」等と明示的にチーム実行を指示した場合に使用。通常のサブエージェント委託とは異なり、独立したClaude Codeインスタンスによるチーム協調を行う"
|
|
4
|
+
---
|
|
5
|
+
<!-- 参考: https://code.claude.com/docs/en/agent-teams -->
|
|
6
|
+
|
|
7
|
+
# Agent Teams チーム実行
|
|
8
|
+
|
|
9
|
+
## 概要
|
|
10
|
+
|
|
11
|
+
Agent Teams機能を使い、複数のteammateを編成してタスクを並列実行する。各teammateは独立したClaude Codeインスタンスとして動作し、自身のコンテキストウィンドウを持つ。サブエージェント(`Task`ツール)とは根本的に異なるアーキテクチャ。
|
|
12
|
+
|
|
13
|
+
### サブエージェントとの違い
|
|
14
|
+
|
|
15
|
+
| 項目 | Agent Teams (Teammates) | サブエージェント (Task) |
|
|
16
|
+
|------|------------------------|----------------------|
|
|
17
|
+
| 実体 | 独立したClaude Codeインスタンス | メインセッション内の子プロセス |
|
|
18
|
+
| コンテキスト | 各自独立(リードの会話履歴は引き継がない) | メインの指示を引き継ぎ |
|
|
19
|
+
| 通信 | メンバー間で直接メッセージ可能 | メインにのみ結果を報告 |
|
|
20
|
+
| 協調 | 共有タスクリストで自己調整 | メインが全作業を管理 |
|
|
21
|
+
| 適用場面 | 議論・協調が必要な複雑な作業 | 結果のみが重要な集中タスク |
|
|
22
|
+
| トークンコスト | 高い(各自が独立コンテキスト) | 低い(結果がメインに要約される) |
|
|
23
|
+
|
|
24
|
+
### 有効なユースケース
|
|
25
|
+
|
|
26
|
+
- **リサーチ・レビュー**: 複数の観点から同時に調査し、知見を共有・検証
|
|
27
|
+
- **新規モジュール・機能開発**: 各teammateが異なるファイル群を担当
|
|
28
|
+
- **競合仮説のデバッグ**: 異なる理論を並行検証し、議論で収束
|
|
29
|
+
- **クロスレイヤー変更**: フロントエンド・バックエンド・テストを各teammateが担当
|
|
30
|
+
|
|
31
|
+
## 前提条件
|
|
32
|
+
|
|
33
|
+
`settings.json`に以下が設定されていること:
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"env": {
|
|
37
|
+
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## ワークフロー
|
|
43
|
+
|
|
44
|
+
### 1. チーム構成の設計
|
|
45
|
+
|
|
46
|
+
タスク内容を分析し、以下を決定する:
|
|
47
|
+
|
|
48
|
+
- **teammate数**: 3-5名が推奨(コスト・協調のバランス)
|
|
49
|
+
- **役割分担**: 各teammateの担当範囲と責務を明確化
|
|
50
|
+
- **タスク粒度**: 5-6タスク/teammateが目安
|
|
51
|
+
- **ファイル分割**: 各teammateが異なるファイル群を担当するよう分割
|
|
52
|
+
|
|
53
|
+
### 2. 自然言語でチーム起動を指示
|
|
54
|
+
|
|
55
|
+
リードに対して、タスク内容とチーム構成を自然言語で指示する。`subagent_type`等のパラメータ指定は不要。
|
|
56
|
+
|
|
57
|
+
**プロンプト例:**
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Create an agent team for [タスク名].
|
|
61
|
+
Spawn teammates:
|
|
62
|
+
- [役割1]: [担当範囲と具体的な指示]
|
|
63
|
+
- [役割2]: [担当範囲と具体的な指示]
|
|
64
|
+
- [役割3]: [担当範囲と具体的な指示]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**具体例(フルスタック機能開発):**
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
認証機能を実装するチームを作成してください。
|
|
71
|
+
teammateを3名spawn:
|
|
72
|
+
- frontend: src/app/auth/ 配下のログインフォーム・認証画面を実装。NextAuth.jsを使用
|
|
73
|
+
- backend: src/server/auth/ 配下のAPI・ミドルウェアを実装。JWT + httpOnly Cookie方式
|
|
74
|
+
- testing: 認証機能のE2Eテスト・ユニットテストを作成。Playwright + Vitest使用
|
|
75
|
+
各teammateは担当ファイル以外を編集しないこと。
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**具体例(コードレビュー):**
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
PR #142をレビューするチームを作成してください。
|
|
82
|
+
3名のレビュアーをspawn:
|
|
83
|
+
- セキュリティ観点でのレビュー
|
|
84
|
+
- パフォーマンス影響のチェック
|
|
85
|
+
- テストカバレッジの検証
|
|
86
|
+
各自レビュー後に発見事項を報告してください。
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 3. spawn時のプロンプト設計ガイド
|
|
90
|
+
|
|
91
|
+
teammateはリードの会話履歴を引き継がないため、spawn時のプロンプトに十分なコンテキストを含める。
|
|
92
|
+
|
|
93
|
+
#### 含めるべき情報
|
|
94
|
+
- **担当範囲**: 具体的なファイルパスやディレクトリ
|
|
95
|
+
- **技術的コンテキスト**: 使用するライブラリ・フレームワーク・パターン
|
|
96
|
+
- **制約**: 編集してはいけないファイル、守るべきルール
|
|
97
|
+
- **成果物**: 何を完了とするか
|
|
98
|
+
|
|
99
|
+
#### 含めなくてよい情報
|
|
100
|
+
- プロジェクトの基本構成(CLAUDE.md経由で自動ロードされる)
|
|
101
|
+
- git操作安全ルール(CLAUDE.md経由で自動適用される)
|
|
102
|
+
- MCP設定(自動的に引き継がれる)
|
|
103
|
+
|
|
104
|
+
### 4. 実行と監視
|
|
105
|
+
|
|
106
|
+
- teammateはタスク完了時に自動的にリードにメッセージを送信する
|
|
107
|
+
- idle通知は自動配信されるため、手動チェック不要
|
|
108
|
+
- 必要に応じてteammateに追加指示を送る:
|
|
109
|
+
- **個別指示**: `SendMessage`(type: `message`)で特定のteammateに
|
|
110
|
+
- **全体通知**: `SendMessage`(type: `broadcast`)で全員に(コスト高、緊急時のみ)
|
|
111
|
+
- `Shift+Down`でteammate間を切り替え(in-processモード)
|
|
112
|
+
- ブロッカー発生時は即座にユーザーに報告する
|
|
113
|
+
|
|
114
|
+
### 5. 完了とシャットダウン
|
|
115
|
+
|
|
116
|
+
1. 全タスクの完了を`TaskList`で確認
|
|
117
|
+
2. 各teammateに`SendMessage`(type: `shutdown_request`)を送信
|
|
118
|
+
3. 各teammateがシャットダウンを承認するまで待機
|
|
119
|
+
4. 全teammate停止後、`TeamDelete`でチームリソースをクリーンアップ
|
|
120
|
+
5. ユーザーに最終結果を報告
|
|
121
|
+
|
|
122
|
+
**重要**: クリーンアップは必ずリードが実行する。teammateからのクリーンアップは不整合を招く。
|
|
123
|
+
|
|
124
|
+
## ファイル競合の防止
|
|
125
|
+
|
|
126
|
+
Agent Teamsにおける最大のリスクはファイル競合。2つのteammateが同じファイルを編集すると上書きが発生する。
|
|
127
|
+
|
|
128
|
+
### 防止策
|
|
129
|
+
|
|
130
|
+
- **チーム設計時にファイル担当を明確に分割する**
|
|
131
|
+
- 各teammateのspawnプロンプトに担当ファイル/ディレクトリを明記
|
|
132
|
+
- 共有ファイル(設定ファイル等)の編集は1名のteammateに限定
|
|
133
|
+
|
|
134
|
+
## コミット管理
|
|
135
|
+
|
|
136
|
+
CLAUDE.mdの「サブエージェントのgit操作安全ルール」がCLAUDE.md経由で全teammateに自動適用される。
|
|
137
|
+
|
|
138
|
+
### 追加の注意点
|
|
139
|
+
|
|
140
|
+
- `einja-task-commit` Skill経由でコミットを一元管理するのが望ましい
|
|
141
|
+
- teammateに直接コミットさせる場合は、変更対象ファイルをspawnプロンプトで明示的に指定
|
|
142
|
+
- 完了検証: teammateの「完了」報告を鵜呑みにせず、`Read`や`Grep`で変更がディスク上に存在することを確認
|
|
143
|
+
|
|
144
|
+
## チーム設計のベストプラクティス
|
|
145
|
+
|
|
146
|
+
- **3-5名で開始**: バランスの良い並列度。それ以上はコスト対効果が下がる
|
|
147
|
+
- **1 teammateあたり5-6タスク**: 生産性とコンテキスト切り替えのバランス
|
|
148
|
+
- **リサーチ・レビューから始める**: 実装より低リスクで、並列探索の効果を確認しやすい
|
|
149
|
+
- **タスク粒度を適切に**: 小さすぎ→協調オーバーヘッドが上回る / 大きすぎ→チェックインなく進行し、リスク増大
|
|
150
|
+
- **定期的に進捗を確認**: 放置すると無駄な作業が蓄積する
|
|
151
|
+
- **plan approval活用**: 複雑・リスクの高いタスクではteammateにplan mode必須を設定
|
|
152
|
+
|
|
153
|
+
## 制限事項(実験機能)
|
|
154
|
+
|
|
155
|
+
- セッション再開(`/resume`)でin-processのteammateは復元されない
|
|
156
|
+
- タスクステータスの更新が遅延することがある
|
|
157
|
+
- シャットダウンに時間がかかる場合がある(現在のリクエスト完了を待つ)
|
|
158
|
+
- 1セッションにつき1チームのみ
|
|
159
|
+
- nested teams(teammateが自身のチームを作る)は不可
|
|
160
|
+
- リードは固定(交代不可)
|
|
161
|
+
- split panesはtmux/iTerm2が必要
|
|
162
|
+
|
|
163
|
+
<!-- @einja:project-private:start id="einja-team-exec-project" -->
|
|
164
|
+
<!-- プロジェクト固有の情報を記入 -->
|
|
165
|
+
<!-- @einja:project-private:end -->
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
3. **影響範囲の最小化**: 変更は必要な箇所のみ。関係ないコードに触れない
|
|
11
11
|
4. **直接実装の禁止**: あなたは絶対に直接実装を行わない。すべての作業はsubagentに委託し、可能な限り並行で呼び出す。サブエージェントの出力はユーザにも見える場所に出力すること
|
|
12
12
|
5. **実装品質の自己検証**: 複雑な変更では完了前に「よりエレガントな方法はないか」を自問する。ただし単純な修正には不要
|
|
13
|
+
6. **Skill-First原則**: 実装着手前に `einja-skill-first` Skillで「Skillを先に作るべきか」を評価する。反復性のある作業はSkill化してから本作業を開始する
|
|
13
14
|
|
|
14
15
|
## Agent Teams の使用制限
|
|
15
16
|
|
|
@@ -26,7 +27,6 @@
|
|
|
26
27
|
|
|
27
28
|
| 作業 | 委託先 |
|
|
28
29
|
|------|--------|
|
|
29
|
-
| コンフリクト解消 | `conflict-resolver` |
|
|
30
30
|
| Codex作業(レビュー・実装支援等) | `codex-agent` |
|
|
31
31
|
| フロントエンド アーキテクチャ設計 | `frontend-architect` |
|
|
32
32
|
| フロントエンド デザイン実装 | `design-engineer` |
|
|
@@ -40,11 +40,21 @@
|
|
|
40
40
|
| `einja-task-commit` | コミット・プッシュ |
|
|
41
41
|
| `einja-conflict-resolver` | gitコンフリクト解消 |
|
|
42
42
|
| `einja-skill-creator` | Skill作成・更新 |
|
|
43
|
-
| `einja-skill-first` | 作業前のSkill作成必要性評価(Plan/spec-create時に自動起動) |
|
|
43
|
+
| `einja-skill-first` | 作業前のSkill作成必要性評価(Plan/einja-issue-spec-create時に自動起動) |
|
|
44
44
|
| `einja-infra-maintenance` | インフラ環境セットアップ・メンテナンス |
|
|
45
|
-
| `einja:issue-exec` | Issue全体の階層的並列実行(
|
|
46
|
-
| `einja
|
|
47
|
-
| `einja
|
|
45
|
+
| `einja:issue-exec` | Issue全体の階層的並列実行(Command) |
|
|
46
|
+
| `einja-task-exec` | タスクグループ実行(Skill tool) |
|
|
47
|
+
| `einja-issue-spec-create` | Issue仕様書作成(Skill tool) |
|
|
48
|
+
|
|
49
|
+
#### サブエージェント質問プロトコル(PENDING_QUESTIONS)
|
|
50
|
+
|
|
51
|
+
サブエージェントではAskUserQuestionが動作しないため、質問が必要な場合は `## PENDING_QUESTIONS` 形式で返却される。
|
|
52
|
+
|
|
53
|
+
サブエージェント出力に `## PENDING_QUESTIONS` が含まれている場合:
|
|
54
|
+
1. 質問内容を解析し、AskUserQuestionでユーザーに確認する
|
|
55
|
+
2. Agent toolの `resume` パラメータで同じサブエージェントを再開(コンテキスト維持)
|
|
56
|
+
3. プロンプトにユーザーの回答を含めて渡す(例: `ユーザーの回答: Q1→A、Q2→B。これを踏まえて作業を継続してください。`)
|
|
57
|
+
4. 再度PENDING_QUESTIONSがある場合は同様に処理(最大2回まで)
|
|
48
58
|
|
|
49
59
|
## コード変更時の動作方針
|
|
50
60
|
|
|
@@ -126,7 +136,7 @@
|
|
|
126
136
|
## プロジェクト概要
|
|
127
137
|
|
|
128
138
|
Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は以下のSkillを参照:
|
|
129
|
-
- `
|
|
139
|
+
- `_einja-project-overview` - 構成、技術スタック、頻出コマンド
|
|
130
140
|
- `docs/einja/steering/development/coding-standards.md` - コーディング規約、インポートパス規約
|
|
131
141
|
- `einja-infra-maintenance` - 開発環境セットアップ、サーバー管理
|
|
132
142
|
|
|
@@ -165,6 +175,11 @@ Turborepoモノレポ構成(pnpm workspaces)。詳細が必要な場合は
|
|
|
165
175
|
- 番号付きリスト: 詳細説明が必要な場合
|
|
166
176
|
- 推奨オプションには `(推奨)` と理由を付記
|
|
167
177
|
|
|
178
|
+
### 選択肢の記述ルール
|
|
179
|
+
- 各選択肢の `description` に**必ず詳細説明・注意点・補足**を記載する
|
|
180
|
+
- トレードオフ、影響範囲、前提条件など判断に必要な情報を含める
|
|
181
|
+
- ラベルだけで選択させない。ユーザーが十分な情報に基づいて判断できるようにする
|
|
182
|
+
|
|
168
183
|
## 報告ルール
|
|
169
184
|
|
|
170
185
|
### 出力形式
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
|--------|----------------|------|
|
|
36
36
|
| Volta | `curl https://get.volta.sh \| bash` | Node.jsバージョン管理 |
|
|
37
37
|
| pnpm | `volta install pnpm` | パッケージ管理 |
|
|
38
|
-
| Docker | [Docker
|
|
38
|
+
| Docker | macOS: [OrbStack](https://orbstack.dev/)(推奨)/ その他: [Docker Engine](https://docs.docker.com/engine/install/) | PostgreSQL実行 |
|
|
39
39
|
| GitHub CLI (`gh`) | `brew install gh` | GitHub操作 |
|
|
40
40
|
| Vercel CLI | `pnpm add -g vercel` | Vercelデプロイ |
|
|
41
41
|
| Neon CLI (`neonctl`) | `npm install -g neonctl` | Neonデータベース管理 |
|
|
@@ -46,13 +46,13 @@ Manager (Claude Code: /einja:issue-exec)
|
|
|
46
46
|
│ │
|
|
47
47
|
│ ├─ tmux window → Worker 1.1 (claude 対話モード)
|
|
48
48
|
│ │ Task worktree: ~/.einja/worktrees/issue-123/task-1.1/
|
|
49
|
-
│ │ →
|
|
49
|
+
│ │ → einja-task-exec Skill: #123 1.1
|
|
50
50
|
│ │ ├─ サブエージェント: Task 1.1.1 実装(run_in_background)
|
|
51
51
|
│ │ ├─ サブエージェント: Task 1.1.2 実装(run_in_background)
|
|
52
52
|
│ │ └─ reviewer → QA → commit
|
|
53
53
|
│ │
|
|
54
54
|
│ ├─ tmux window → Worker 1.2 (claude 対話モード)
|
|
55
|
-
│ │ →
|
|
55
|
+
│ │ → einja-task-exec Skill: #123 1.2
|
|
56
56
|
│ │
|
|
57
57
|
│ └─ (依存タスクグループは先行完了後に起動)
|
|
58
58
|
│
|
|
@@ -68,7 +68,7 @@ Manager (Claude Code: /einja:issue-exec)
|
|
|
68
68
|
|------|------|---------|
|
|
69
69
|
| **Manager** | Issue パース、ブランチ管理、worktree 管理、tmux 管理、Director 起動、Phase マージ、質問エスカレーション、エラー監視 | Claude Code カスタムコマンド |
|
|
70
70
|
| **Director** | Phase 内のタスクグループ管理、Worker 起動、並列制御、PR マージ検知、変更伝播、質問対応、worktree クリーンアップ | claude 対話モード(tmux window) |
|
|
71
|
-
| **Worker** | task-exec 実行(executer→reviewer→qa→commit)、Phase 変更取り込み、PR 作成、完了報告 | claude 対話モード(tmux window) |
|
|
71
|
+
| **Worker** | einja-task-exec Skill 実行(executer→reviewer→qa→commit)、Phase 変更取り込み、PR 作成、完了報告 | claude 対話モード(tmux window) |
|
|
72
72
|
|
|
73
73
|
### 各階層の通信方式
|
|
74
74
|
|
|
@@ -123,10 +123,10 @@ main (デフォルト)
|
|
|
123
123
|
tmux session: einja-123
|
|
124
124
|
window 0: Manager (メインプロセスのログ表示)
|
|
125
125
|
window 1: Director-Phase1 (claude 対話モード)
|
|
126
|
-
window 2: Worker-1.1 (claude 対話モード →
|
|
127
|
-
window 3: Worker-1.2 (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
128
|
window 4: Director-Phase2 (claude 対話モード)
|
|
129
|
-
window 5: Worker-2.1 (claude 対話モード →
|
|
129
|
+
window 5: Worker-2.1 (claude 対話モード → einja-task-exec: #123 2.1)
|
|
130
130
|
```
|
|
131
131
|
|
|
132
132
|
ユーザーは `tmux attach -t einja-123` で全プロセスを監視可能。
|
|
@@ -248,18 +248,18 @@ Manager 検知
|
|
|
248
248
|
| Worker 異常終了(PR作成済み) | tmux window 消失 + PR あり | スキップ(PR マージ待ちのまま継続) |
|
|
249
249
|
| Director 異常終了 | tmux window 消失 + ステータス未更新 | 各 Worker のステータスを確認 → 未完了 Worker のみ再実行 |
|
|
250
250
|
| Manager 異常終了 | ユーザー手動 | `--resume` でステータスファイルから復元 |
|
|
251
|
-
| rebase コンフリクト | git rebase 失敗 | conflict-resolver で自力解消 |
|
|
251
|
+
| rebase コンフリクト | git rebase 失敗 | einja-conflict-resolver Skill で自力解消 |
|
|
252
252
|
| CI 失敗 | gh run status | 修正 → 再push → 再CI待機 |
|
|
253
253
|
| CI 待機タイムアウト | 30分超過 | Manager に通知 → 人間判断 |
|
|
254
254
|
|
|
255
255
|
---
|
|
256
256
|
|
|
257
|
-
##
|
|
257
|
+
## `einja-task-exec` Skill との使い分け
|
|
258
258
|
|
|
259
|
-
|
|
|
259
|
+
| 実行方法 | 用途 | 対象 | 推奨シーン |
|
|
260
260
|
|---------|------|------|----------|
|
|
261
261
|
| **`/einja:issue-exec`** | Issue全体の並列実行 | 複数Phase・複数タスクグループ | 大規模機能実装 |
|
|
262
|
-
|
|
|
262
|
+
| **`einja-task-exec` Skill** | 単一タスクグループの実行 | 1つのタスクグループ | 品質重視、複雑な実装 |
|
|
263
263
|
|
|
264
264
|
---
|
|
265
265
|
|
|
@@ -267,7 +267,7 @@ Manager 検知
|
|
|
267
267
|
|
|
268
268
|
- [タスク実行ワークフロー](./task-execute.md)
|
|
269
269
|
- [タスク管理ガイドライン](../steering/task-management.md)
|
|
270
|
-
- [仕様書作成ワークフロー](./einja
|
|
270
|
+
- [仕様書作成ワークフロー](./task-execute.md#フェーズ1-issue仕様書作成-einja-issue-spec-create-skill)
|
|
271
271
|
- [ブランチ運用戦略](../steering/branch-strategy.md)
|
|
272
272
|
<!-- @einja:managed:end -->
|
|
273
273
|
|
|
@@ -59,7 +59,7 @@ npm install -g pnpm@10
|
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
#### Docker
|
|
62
|
-
- macOS: [
|
|
62
|
+
- macOS: [OrbStack](https://orbstack.dev/)(推奨。`brew install orbstack`)
|
|
63
63
|
- Windows: [Docker Desktop for Windows](https://docs.docker.com/desktop/install/windows-install/)
|
|
64
64
|
- Linux: [Docker Engine](https://docs.docker.com/engine/install/)
|
|
65
65
|
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# セットアップフローガイド
|
|
2
|
+
|
|
3
|
+
## 概要
|
|
4
|
+
|
|
5
|
+
このドキュメントでは、einja プロジェクトにおける3つの主要セットアップシナリオのフローを解説します。
|
|
6
|
+
|
|
7
|
+
| シナリオ | 対象者 | 目的 |
|
|
8
|
+
|---------|--------|------|
|
|
9
|
+
| **1. `npx create-einja-app`** | 新規プロジェクト作成者 | テンプレートからプロジェクトを一括生成 |
|
|
10
|
+
| **2. `git clone` 後の環境構築** | 既存プロジェクトへの参加者 | 開発環境を手元に再現 |
|
|
11
|
+
| **3. `einja sync`** | 既存プロジェクト運用者 | テンプレートの最新変更をプロジェクトに同期 |
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## シナリオ別フロー
|
|
16
|
+
|
|
17
|
+
### 1. `npx create-einja-app`(新規プロジェクト作成)
|
|
18
|
+
|
|
19
|
+
テンプレートからプロジェクトを新規作成し、初回セットアップまで自動で完了するフローです。
|
|
20
|
+
|
|
21
|
+
```mermaid
|
|
22
|
+
sequenceDiagram
|
|
23
|
+
actor User
|
|
24
|
+
participant CLI as create-einja-app<br/>cli.ts
|
|
25
|
+
participant Tmpl as generators/<br/>template.ts
|
|
26
|
+
participant Post as generators/<br/>post-setup.ts
|
|
27
|
+
participant Init as scripts/<br/>init.sh
|
|
28
|
+
participant Rotate as scripts/<br/>env-rotate-secrets.ts
|
|
29
|
+
participant DevCLI as @einja/dev-cli
|
|
30
|
+
|
|
31
|
+
User->>CLI: npx create-einja-app my-app
|
|
32
|
+
Note over CLI: 対話プロンプト<br/>(プロジェクト名・スコープ・認証方式等)
|
|
33
|
+
|
|
34
|
+
CLI->>Tmpl: generateTemplate(config, targetPath)
|
|
35
|
+
activate Tmpl
|
|
36
|
+
Note over Tmpl: 1. テンプレートディレクトリをコピー<br/>2. 認証方式に応じたファイル除外<br/>3. .template ファイルのリネーム<br/>4. gitignore → .gitignore リネーム<br/>5. プレースホルダー変数置換<br/>6. .sh ファイルに実行権限付与
|
|
37
|
+
Tmpl-->>CLI: 完了
|
|
38
|
+
deactivate Tmpl
|
|
39
|
+
|
|
40
|
+
CLI->>Post: execPostSetup(config, targetPath, options)
|
|
41
|
+
activate Post
|
|
42
|
+
|
|
43
|
+
Post->>Init: bash scripts/init.sh
|
|
44
|
+
activate Init
|
|
45
|
+
Note over Init: Step 1: Volta インストール<br/>Step 2: シェル設定(VOLTA_FEATURE_PNPM)<br/>Step 3: Node.js / pnpm インストール<br/>Step 4: direnv allow
|
|
46
|
+
Init-->>Post: 完了
|
|
47
|
+
deactivate Init
|
|
48
|
+
|
|
49
|
+
Note over Post: PATH補完<br/>(~/.volta/bin を process.env.PATH に追加)
|
|
50
|
+
|
|
51
|
+
Post->>Post: pnpm install
|
|
52
|
+
Post->>Post: pnpm db:generate
|
|
53
|
+
|
|
54
|
+
Post->>Rotate: pnpm env:rotate-secrets --all --non-interactive
|
|
55
|
+
activate Rotate
|
|
56
|
+
Note over Rotate: 全環境の AUTH_SECRET +<br/>DOTENV_PRIVATE_KEY をローテーション<br/>(バックアップ付き自動復元)
|
|
57
|
+
Rotate-->>Post: 完了
|
|
58
|
+
deactivate Rotate
|
|
59
|
+
|
|
60
|
+
Post->>Post: git init + git add . + git commit
|
|
61
|
+
|
|
62
|
+
opt setupEinjaCli=true の場合
|
|
63
|
+
Post->>DevCLI: npx --yes @einja/dev-cli init --force --no-backup
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
Post-->>User: 完了メッセージ表示
|
|
67
|
+
deactivate Post
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### 処理詳細テーブル
|
|
71
|
+
|
|
72
|
+
| ステップ | 実行元 | 処理内容 |
|
|
73
|
+
|---------|--------|---------|
|
|
74
|
+
| 対話プロンプト | `cli.ts` | プロジェクト名、パッケージスコープ、認証方式等を対話的に入力 |
|
|
75
|
+
| テンプレート展開 | `generators/template.ts` | テンプレートコピー → `{{projectName}}` `{{packageName}}` `{{description}}` `@repo/` 等の変数置換 → `.template` リネーム → `gitignore` → `.gitignore` リネーム → 認証方式に応じたファイル除外 → `.sh` に実行権限付与 |
|
|
76
|
+
| Step 0: init.sh | `generators/post-setup.ts` | Volta/Node.js/pnpm/direnv の初期導入(`stdio: inherit` で出力をそのまま表示) |
|
|
77
|
+
| PATH補完 | `generators/post-setup.ts` | `~/.volta/bin` を `process.env.PATH` に追加(init.sh で導入した Volta を後続ステップで利用可能にする) |
|
|
78
|
+
| Step 1: 依存関係 | `generators/post-setup.ts` | `pnpm install` + `pnpm db:generate`(Prisma クライアント生成) |
|
|
79
|
+
| Step 2: 秘密鍵ローテーション | `env-rotate-secrets.ts` | `--all --non-interactive` モードで全環境の AUTH_SECRET と DOTENV_PRIVATE_KEY を自動ローテーション |
|
|
80
|
+
| Step 3: Git初期化 | `generators/post-setup.ts` | `git init` → `git add .` → `git commit -m "Initial commit"` |
|
|
81
|
+
| Step 4: dev-cli 初期化 | `generators/post-setup.ts` | `setupEinjaCli=true` 時のみ `npx --yes @einja/dev-cli@latest init --force --no-backup` を実行 |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
### 2. `git clone` 後の環境構築(既存プロジェクトへの参加)
|
|
86
|
+
|
|
87
|
+
既存プロジェクトに新たに参加する開発者が、ローカル環境を構築するフローです。
|
|
88
|
+
|
|
89
|
+
```mermaid
|
|
90
|
+
flowchart TD
|
|
91
|
+
A[git clone → cd project] --> B[./scripts/init.sh]
|
|
92
|
+
|
|
93
|
+
subgraph init ["scripts/init.sh(初回のみ手動実行)"]
|
|
94
|
+
B --> B1[Step 1: Volta インストール]
|
|
95
|
+
B1 --> B2[Step 2: シェル設定<br/>VOLTA_FEATURE_PNPM=1]
|
|
96
|
+
B2 --> B3[Step 3: Node.js / pnpm インストール]
|
|
97
|
+
B3 --> B4[Step 4: direnv allow]
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
B4 --> C["exec $SHELL(ターミナル再起動)"]
|
|
101
|
+
C --> D[pnpm dev:setup]
|
|
102
|
+
|
|
103
|
+
subgraph devsetup ["scripts/setup-dev.ts(= pnpm dev:setup)"]
|
|
104
|
+
D --> D1[Step 1-3: Volta 確認 / シェル設定 / Node.js・pnpm]
|
|
105
|
+
D1 --> D4[Step 4: direnv インストール<br/>macOS: brew install direnv]
|
|
106
|
+
D4 --> D5[Step 5: シェルに direnv hook 追加]
|
|
107
|
+
D5 --> D6[Step 6: dotenvx インストール]
|
|
108
|
+
D6 --> D7["Step 7: .env 作成<br/>(.env.local + .env.keys で復号)"]
|
|
109
|
+
D7 --> D8["Step 8: .env.personal 作成<br/>+ GITHUB_TOKEN 設定(対話的)"]
|
|
110
|
+
D8 --> D9["Step 9: direnv allow<br/>→ .envrc 評価(Serena MCP 自動起動)"]
|
|
111
|
+
D9 --> D10["Step 10: PostgreSQL 起動<br/>(docker-compose up -d postgres)"]
|
|
112
|
+
D10 --> D11["Step 11: DB 初期化<br/>(pnpm db:generate + pnpm db:push)"]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
D11 --> E[pnpm dev で開発開始]
|
|
116
|
+
|
|
117
|
+
style init fill:#e8f4fd,stroke:#2196F3
|
|
118
|
+
style devsetup fill:#e8f5e9,stroke:#4CAF50
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
#### 処理詳細テーブル
|
|
122
|
+
|
|
123
|
+
| ステップ | 実行ファイル | 処理内容 |
|
|
124
|
+
|---------|-------------|---------|
|
|
125
|
+
| Step 1: Volta | `init.sh` → `setup-dev.ts` | Volta 未インストール時は `curl` で導入。macOS 以外では手動インストールを案内 |
|
|
126
|
+
| Step 2: シェル設定 | `init.sh` → `setup-dev.ts` | `~/.zshrc` 等に `VOLTA_FEATURE_PNPM=1` を追記(既存なら冪等にスキップ) |
|
|
127
|
+
| Step 3: Node.js/pnpm | `init.sh` → `setup-dev.ts` | `package.json` の `volta` フィールドからバージョンを読み取り `volta install` |
|
|
128
|
+
| Step 4: direnv | `setup-dev.ts` | macOS では `brew install direnv` を自動実行。他 OS は手動案内 |
|
|
129
|
+
| Step 5: direnv hook | `setup-dev.ts` | `~/.zshrc` 等に `eval "$(direnv hook zsh)"` を追記 |
|
|
130
|
+
| Step 6: dotenvx | `setup-dev.ts` | `curl -sfS https://dotenvx.sh/install.sh` で導入。失敗時は `npm install -g @dotenvx/dotenvx` にフォールバック |
|
|
131
|
+
| Step 7: .env 作成 | `setup-dev.ts` | `.env.local`(暗号化済み) + `.env.keys`(秘密鍵)から `dotenvx decrypt` で `.env` を生成。worktree 環境では親リポジトリから `.env.keys` を自動コピー。失敗時は `.env.example` にフォールバック |
|
|
132
|
+
| Step 8: .env.personal | `setup-dev.ts` | `.env.personal.example` からコピー → GITHUB_TOKEN を対話的に入力(スキップ可) |
|
|
133
|
+
| Step 9: direnv 有効化 | `setup-dev.ts` | `direnv allow` 実行 → `.envrc` が評価される → Serena MCP サーバー自動起動 |
|
|
134
|
+
| Step 10: DB 起動 | `setup-dev.ts` | `docker-compose up -d postgres` + 3秒の起動待機 |
|
|
135
|
+
| Step 11: DB 初期化 | `setup-dev.ts` | `pnpm db:generate`(Prisma クライアント生成) + `pnpm db:push`(スキーマ適用) |
|
|
136
|
+
|
|
137
|
+
#### .envrc の役割
|
|
138
|
+
|
|
139
|
+
`.envrc` は direnv によりディレクトリ進入時に自動評価され、以下の処理を行います。
|
|
140
|
+
|
|
141
|
+
| 処理 | 条件 | 詳細 |
|
|
142
|
+
|------|------|------|
|
|
143
|
+
| dotenv 読み込み | 常時 | `dotenv_if_exists .env` で環境変数をロード |
|
|
144
|
+
| worktree 間 .env.personal 共有 | `$MAIN_WORKTREE` が設定済みの場合 | メインワークツリーの `.env.personal` を `dotenv_if_exists` で読み込み(worktree 環境でも個人トークンを共有) |
|
|
145
|
+
| Serena MCP 自動起動 | `$MAIN_WORKTREE` が設定済み かつ `ensure-serena.sh` が存在する場合 | メインワークツリーの `scripts/ensure-serena.sh` を `source` で実行 |
|
|
146
|
+
|
|
147
|
+
#### ensure-serena.sh の動作
|
|
148
|
+
|
|
149
|
+
| 処理 | 詳細 |
|
|
150
|
+
|------|------|
|
|
151
|
+
| 既存インスタンスチェック | `.serena-port` ファイルから PID を読み取り、生存確認。生存中ならポート番号を再利用して即座に `return` |
|
|
152
|
+
| uvx 確認 | `uvx` コマンドの存在チェック。未インストール時は警告のみでブロックしない |
|
|
153
|
+
| 空きポート検出 | デフォルトポート 9850 から最大10ポートを `nc -z` で試行 |
|
|
154
|
+
| バックグラウンド起動 | `uvx --from git+https://github.com/oraios/serena serena start-mcp-server` を `--transport streamable-http` で起動、`disown` で切り離し |
|
|
155
|
+
| 起動待機 | PID 生存 + ポート LISTEN を最大30秒(0.5秒間隔)で確認。成功時に `.serena-port` にポート番号と PID を記録 |
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### 3. `einja sync`(テンプレート同期)
|
|
160
|
+
|
|
161
|
+
テンプレートの最新変更を既存プロジェクトに同期するフローです。2つの CLI ツールがそれぞれ異なる対象を担当します。
|
|
162
|
+
|
|
163
|
+
```mermaid
|
|
164
|
+
sequenceDiagram
|
|
165
|
+
actor User
|
|
166
|
+
participant Skill as einja:einja-sync<br/>Skill
|
|
167
|
+
participant DevCLI as @einja/dev-cli<br/>sync
|
|
168
|
+
participant CEA as create-einja-app<br/>sync
|
|
169
|
+
|
|
170
|
+
User->>Skill: einja sync(Skill経由)
|
|
171
|
+
|
|
172
|
+
rect rgb(232, 244, 253)
|
|
173
|
+
Note over DevCLI: dev-cli sync — Claude Code 関連ファイル
|
|
174
|
+
Skill->>DevCLI: einja sync [--only categories]
|
|
175
|
+
activate DevCLI
|
|
176
|
+
Note over DevCLI: 1. カテゴリ指定(--only)のパース<br/>2. メタデータ読み込み<br/>3. 同期対象スキャン<br/>4. ハッシュベース差分計算<br/>5. dry-run / 確認プロンプト<br/>6. バックアップ作成<br/>7. ファイルマージ(マーカー / 3方向 / JSON)<br/>8. 孤児ファイル検出・削除<br/>9. メタデータ保存<br/>10. 依存関係チェック + インストール
|
|
177
|
+
DevCLI-->>Skill: 結果レポート
|
|
178
|
+
deactivate DevCLI
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
rect rgb(232, 245, 233)
|
|
182
|
+
Note over CEA: create-einja-app sync — プロジェクト構成ファイル
|
|
183
|
+
Skill->>CEA: npx create-einja-app sync
|
|
184
|
+
activate CEA
|
|
185
|
+
Note over CEA: 1. Git状態チェック<br/>2. カテゴリ選択(対話 / --all / --categories)<br/>3. プロジェクト設定検出(変数置換用)<br/>4. ファイル収集(globパターン)<br/>5. バックアップ作成<br/>6. マージ・コピー処理<br/>7. テンプレート変数置換<br/>8. 置換漏れ検証<br/>9. 結果レポート
|
|
186
|
+
CEA-->>Skill: 結果レポート
|
|
187
|
+
deactivate CEA
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
Skill-->>User: 同期完了報告
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
#### dev-cli sync の同期対象とマージ方式
|
|
194
|
+
|
|
195
|
+
| カテゴリ | 対象パス | 説明 |
|
|
196
|
+
|---------|---------|------|
|
|
197
|
+
| `commands` | `.claude/commands/einja/` | Claude Code コマンド定義 |
|
|
198
|
+
| `agents` | `.claude/agents/einja/` | サブエージェント定義 |
|
|
199
|
+
| `skills` | `.claude/skills/einja-*/`, `_einja-*/` | Skill 定義(`einja-` / `_einja-` プレフィックス) |
|
|
200
|
+
| `hooks` | `.claude/hooks/` | フック定義 |
|
|
201
|
+
| `docs` | `docs/einja/` | ステアリングドキュメント |
|
|
202
|
+
| `scripts` | `scripts/` | ユーティリティスクリプト(`_` プレフィックスは除外) |
|
|
203
|
+
| `env` | `.envrc` | direnv 設定 |
|
|
204
|
+
| `tools` | `.vscode/settings.json` | VS Code 設定 |
|
|
205
|
+
|
|
206
|
+
**マージ方式:**
|
|
207
|
+
|
|
208
|
+
| 方式 | 適用条件 | 動作 |
|
|
209
|
+
|------|---------|------|
|
|
210
|
+
| マーカーベースマージ | `@einja:managed:[start/end]`、`@einja:project-private:[start/end]` マーカーを含むファイル | managed セクションをテンプレートで置換し、project-private セクションはローカルを保持 |
|
|
211
|
+
| レガシーマーカー自動マイグレーション | `@einja:seed:[start/end]` マーカーを含むファイル | レガシー `@einja:seed:` マーカーを `@einja:managed:` に自動変換した上でマーカーベースマージを実行 |
|
|
212
|
+
| project-private のみマージ | `@einja:project-private` のみで `@einja:managed` を含まないファイル | project-private セクションをローカルから保持し、それ以外をテンプレートで上書き(`syncProjectPrivateOnlyFile`) |
|
|
213
|
+
| JSON マージ | `.json` 拡張子のファイル | managed/project-private の JSON パス指定に基づきマージ |
|
|
214
|
+
| 3方向マージ | マーカーなしの通常ファイル | base(前回テンプレート)・local・template の3方向差分で自動マージ。コンフリクト時はマーカー付きで出力 |
|
|
215
|
+
|
|
216
|
+
#### create-einja-app sync の同期対象カテゴリ
|
|
217
|
+
|
|
218
|
+
| カテゴリ | 対象パターン | デフォルト選択 |
|
|
219
|
+
|---------|-------------|--------------|
|
|
220
|
+
| `env` | `.env*`, `.envrc`, `.volta`, `.node-version` | ON |
|
|
221
|
+
| `tools` | `biome.json`, `.prettierrc*`, `.editorconfig`, `.vscode/` | ON |
|
|
222
|
+
| `git` | `.gitignore`, `.gitattributes` | OFF |
|
|
223
|
+
| `git-hooks` | `.husky/` | OFF |
|
|
224
|
+
| `github` | `.github/workflows/`, `.github/actions/`, `.github/dependabot.yml` | OFF |
|
|
225
|
+
| `docker` | `Dockerfile*`, `docker-compose*.yml`, `.dockerignore` | OFF |
|
|
226
|
+
| `monorepo` | `turbo.json`, `pnpm-workspace.yaml` | OFF |
|
|
227
|
+
| `root-config` | `package.json`, `tsconfig.json` | OFF |
|
|
228
|
+
| `scripts` | `scripts/` 配下 | OFF |
|
|
229
|
+
| `apps` | `apps/` 配下(個別選択可) | OFF |
|
|
230
|
+
| `packages` | `packages/` 配下(個別選択可) | OFF |
|
|
231
|
+
| `docs` | `README.md`, `docs/` | OFF |
|
|
232
|
+
|
|
233
|
+
**保護対象ファイル(同期から除外):**
|
|
234
|
+
- `.env.keys`, `.env.personal`, `.env.develop`, `.env.local`, `.env.production`, `.env.staging`, `.env.preview`
|
|
235
|
+
- `**/prisma/schema.prisma`, `**/prisma/migrations/**`, `pnpm-lock.yaml`
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## ファイル別リファレンス
|
|
240
|
+
|
|
241
|
+
各スクリプト/ファイルの役割と呼び出し元を逆引きテーブルで示します。
|
|
242
|
+
|
|
243
|
+
| ファイル | 役割 | 呼び出し元 |
|
|
244
|
+
|---------|------|-----------|
|
|
245
|
+
| `scripts/init.sh` | Volta/Node.js/pnpm/direnv 初期導入(初回のみ) | `create-einja-app`(`post-setup.ts` から `bash scripts/init.sh`) / 手動実行 |
|
|
246
|
+
| `scripts/setup-dev.ts` | 環境構築一式(Volta確認・direnv・dotenvx・.env復号・DB起動) | `pnpm dev:setup` |
|
|
247
|
+
| `scripts/ensure-serena.sh` | Serena MCP サーバーの冪等起動(PIDベース) | `.envrc` から `source`(direnv 評価時に自動実行) |
|
|
248
|
+
| `scripts/env-rotate-secrets.ts` | AUTH_SECRET / DOTENV_PRIVATE_KEY のローテーション | `create-einja-app`(`post-setup.ts` から `--all --non-interactive`) / `pnpm env:rotate-secrets` |
|
|
249
|
+
| `.envrc` | dotenv 読み込み + worktree 間 .env.personal 共有 + Serena MCP 起動 | direnv(シェルでディレクトリ進入時に自動評価) |
|
|
250
|
+
| `packages/create-einja-app/src/generators/post-setup.ts` | プロジェクト作成後のセットアップ(init.sh → install → rotate → git → dev-cli) | `create-einja-app` create コマンド |
|
|
251
|
+
| `packages/create-einja-app/src/generators/template.ts` | テンプレート展開・変数置換・リネーム処理 | `create-einja-app` create コマンド |
|
|
252
|
+
| `packages/create-einja-app/src/generators/sync.ts` | create-einja-app 用同期ファイル収集(カテゴリ → glob パターン → フィルタリング) | `create-einja-app` sync コマンド |
|
|
253
|
+
| `packages/create-einja-app/src/commands/sync.ts` | create-einja-app sync のメインフロー(バックアップ・マージ・検証) | `npx create-einja-app sync` |
|
|
254
|
+
| `packages/cli/src/commands/sync.ts` | dev-cli sync のメインフロー(ハッシュ差分・マーカーマージ・孤児管理) | `einja sync` コマンド |
|
|
255
|
+
| `packages/cli/src/lib/sync/file-filter.ts` | dev-cli sync の同期対象スキャン・カテゴリマッピング | `packages/cli/src/commands/sync.ts` |
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 処理の重複と設計意図
|
|
260
|
+
|
|
261
|
+
### init.sh と setup-dev.ts の重複
|
|
262
|
+
|
|
263
|
+
`init.sh` と `setup-dev.ts` の Step 1-3(Volta/シェル設定/Node.js・pnpm インストール)は意図的に重複しています。
|
|
264
|
+
|
|
265
|
+
| 観点 | 説明 |
|
|
266
|
+
|------|------|
|
|
267
|
+
| **冪等性** | 両スクリプトともに「既にインストール済み」を検出するガードがあり、何度実行しても安全 |
|
|
268
|
+
| **init.sh の位置づけ** | 最小限の初期導入スクリプト。`create-einja-app` からは `bash scripts/init.sh` で一括実行。手動実行も可能 |
|
|
269
|
+
| **setup-dev.ts の位置づけ** | 環境構築の包括スクリプト。init.sh 相当の処理を内包した上で、direnv/dotenvx/.env/DB 等の追加セットアップを実行 |
|
|
270
|
+
| **分離の理由** | `init.sh` は bash スクリプトで Node.js 不要。`setup-dev.ts` は TypeScript で Node.js 必須。初回セットアップ時は Node.js がまだ存在しない可能性があるため、`init.sh` で Node.js 導入 → `setup-dev.ts` で残りの処理という順序が必要 |
|
|
271
|
+
|
|
272
|
+
### dev-cli sync と create-einja-app sync の分担
|
|
273
|
+
|
|
274
|
+
| ツール | 同期対象 | マージ方式 |
|
|
275
|
+
|--------|---------|-----------|
|
|
276
|
+
| **dev-cli sync** | Claude Code 関連(`.claude/`、`docs/einja/`、`scripts/`、`.envrc`、`.vscode/settings.json`) | マーカーベース + 3方向マージ + JSON マージ。ハッシュキャッシュによる差分検出 |
|
|
277
|
+
| **create-einja-app sync** | プロジェクト構成全般(CI/CD、Docker、モノレポ設定、apps/、packages/ 等) | カテゴリ選択式。テンプレート変数置換 + マーカーベースマージ。置換漏れ検証つき |
|
|
278
|
+
|
|
279
|
+
両ツールは対象領域が異なり、通常は競合しません。`einja:einja-sync` Skill から統合的に呼び出されます。
|