@einja/dev-cli 0.1.40 → 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/README.md +89 -1
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +71 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +187 -13
- package/dist/commands/sync.js.map +1 -1
- 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/dependency-checker.d.ts.map +1 -1
- package/dist/lib/merger.d.ts +12 -0
- package/dist/lib/merger.d.ts.map +1 -1
- package/dist/lib/merger.js +28 -0
- package/dist/lib/merger.js.map +1 -1
- package/dist/lib/preset-update/cli-repo-detector.d.ts.map +1 -1
- package/dist/lib/preset-update/file-copier.d.ts.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/preset-update/preset-finder.d.ts.map +1 -1
- package/dist/lib/preset.d.ts.map +1 -1
- package/dist/lib/sync/category-validator.d.ts +1 -1
- package/dist/lib/sync/category-validator.d.ts.map +1 -1
- package/dist/lib/sync/category-validator.js +2 -1
- package/dist/lib/sync/category-validator.js.map +1 -1
- package/dist/lib/sync/category-validator.test.js +3 -1
- package/dist/lib/sync/category-validator.test.js.map +1 -1
- package/dist/lib/sync/conflict-reporter.d.ts.map +1 -1
- package/dist/lib/sync/diff-engine.d.ts.map +1 -1
- package/dist/lib/sync/file-filter.d.ts.map +1 -1
- package/dist/lib/sync/file-filter.js +1 -0
- package/dist/lib/sync/file-filter.js.map +1 -1
- package/dist/lib/sync/integration.test.js +255 -69
- package/dist/lib/sync/integration.test.js.map +1 -1
- package/dist/lib/sync/json-processor.d.ts +4 -4
- package/dist/lib/sync/json-processor.d.ts.map +1 -1
- package/dist/lib/sync/json-processor.js +11 -11
- package/dist/lib/sync/json-processor.js.map +1 -1
- package/dist/lib/sync/marker-processor.d.ts +60 -8
- package/dist/lib/sync/marker-processor.d.ts.map +1 -1
- package/dist/lib/sync/marker-processor.js +117 -26
- package/dist/lib/sync/marker-processor.js.map +1 -1
- package/dist/lib/sync/marker-processor.test.js +261 -40
- package/dist/lib/sync/marker-processor.test.js.map +1 -1
- package/dist/lib/sync/metadata-manager.d.ts +4 -0
- package/dist/lib/sync/metadata-manager.d.ts.map +1 -1
- package/dist/lib/sync/metadata-manager.js +15 -0
- package/dist/lib/sync/metadata-manager.js.map +1 -1
- package/dist/lib/sync/metadata-manager.test.js +69 -0
- package/dist/lib/sync/metadata-manager.test.js.map +1 -1
- package/dist/lib/sync/orphan-cleaner.d.ts +29 -0
- package/dist/lib/sync/orphan-cleaner.d.ts.map +1 -0
- package/dist/lib/sync/orphan-cleaner.js +80 -0
- package/dist/lib/sync/orphan-cleaner.js.map +1 -0
- package/dist/lib/sync/orphan-cleaner.test.d.ts +2 -0
- package/dist/lib/sync/orphan-cleaner.test.d.ts.map +1 -0
- package/dist/lib/sync/orphan-cleaner.test.js +169 -0
- package/dist/lib/sync/orphan-cleaner.test.js.map +1 -0
- package/dist/lib/sync/project-private-synchronizer.d.ts +52 -0
- package/dist/lib/sync/project-private-synchronizer.d.ts.map +1 -0
- package/dist/lib/sync/project-private-synchronizer.js +110 -0
- package/dist/lib/sync/project-private-synchronizer.js.map +1 -0
- package/dist/lib/sync/project-private-synchronizer.test.d.ts +2 -0
- package/dist/lib/sync/project-private-synchronizer.test.d.ts.map +1 -0
- package/dist/lib/sync/project-private-synchronizer.test.js +348 -0
- package/dist/lib/sync/project-private-synchronizer.test.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/sync.d.ts +36 -6
- package/dist/types/sync.d.ts.map +1 -1
- package/dist/types/sync.js +2 -2
- package/dist/types/sync.js.map +1 -1
- package/package.json +5 -4
- package/presets/default/.claude/agents/einja/Explore.md +140 -0
- package/presets/default/.claude/agents/einja/backend-architect.md +21 -1
- package/presets/default/.claude/agents/einja/codex-agent.md +5 -1
- package/presets/default/.claude/agents/einja/design-engineer.md +5 -1
- package/presets/default/.claude/agents/einja/docs/docs-updater.md +7 -93
- package/presets/default/.claude/agents/einja/frontend-architect.md +21 -1
- package/presets/default/.claude/agents/einja/frontend-coder.md +5 -1
- package/presets/default/.claude/agents/einja/{specs/spec-design-generator.md → issue-specs/design-generator.md} +16 -8
- package/presets/default/.claude/agents/einja/{specs/spec-qa-generator.md → issue-specs/qa-generator.md} +10 -4
- package/presets/default/.claude/agents/einja/{specs/spec-requirements-generator.md → issue-specs/requirements-generator.md} +9 -6
- package/presets/default/.claude/agents/einja/{specs/spec-tasks-generator.md → issue-specs/tasks-generator.md} +19 -16
- package/presets/default/.claude/agents/einja/{specs/spec-tasks-validator.md → issue-specs/tasks-validator.md} +13 -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 +64 -116
- package/presets/default/.claude/agents/einja/task/task-modification-analyzer.md +6 -2
- package/presets/default/.claude/agents/einja/task/task-qa.md +7 -3
- package/presets/default/.claude/agents/einja/task/task-reviewer.md +17 -1
- package/presets/default/.claude/commands/einja/einja-sync.md +124 -45
- package/presets/default/.claude/commands/einja/frontend-implement.md +3 -1
- package/presets/default/.claude/commands/einja/issue-exec.md +413 -0
- package/presets/default/.claude/commands/einja/start-dev.md +4 -0
- package/presets/default/.claude/commands/einja/sync-cursor-commands.md +10 -6
- package/presets/default/.claude/commands/einja/{update-docs-by-task-specs.md → update-docs-by-issue-specs.md} +61 -57
- package/presets/default/.claude/hooks/einja/plan-mode-skill-loader.sh +27 -0
- package/presets/default/.claude/settings.json +29 -5
- package/presets/default/.claude/skills/{einja-general-context-loader → _einja-general-context-loader}/SKILL.md +6 -2
- package/presets/default/.claude/skills/{einja-output-format → _einja-output-format}/SKILL.md +5 -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 +9 -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 +5 -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} +60 -23
- 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 +311 -263
- package/presets/default/.claude/skills/einja-skill-creator/agents/analyzer.md +274 -0
- package/presets/default/.claude/skills/einja-skill-creator/agents/comparator.md +202 -0
- package/presets/default/.claude/skills/einja-skill-creator/agents/grader.md +195 -0
- package/presets/default/.claude/skills/einja-skill-creator/assets/eval_review.html +146 -0
- package/presets/default/.claude/skills/einja-skill-creator/eval-viewer/generate_review.py +471 -0
- package/presets/default/.claude/skills/einja-skill-creator/eval-viewer/viewer.html +1325 -0
- package/presets/default/.claude/skills/einja-skill-creator/references/schemas.md +430 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/aggregate_benchmark.py +401 -0
- 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 +272 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/improve_description.py +247 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/init_skill.py +13 -19
- package/presets/default/.claude/skills/einja-skill-creator/scripts/package_skill.py +36 -7
- package/presets/default/.claude/skills/einja-skill-creator/scripts/run_eval.py +310 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/run_loop.py +375 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/utils.py +48 -0
- 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 +11 -7
- package/presets/default/.claude/{commands/einja/task-exec.md → skills/einja-task-exec/SKILL.md} +106 -89
- package/presets/default/.claude/skills/einja-task-qa/SKILL.md +8 -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/.envrc +5 -0
- package/presets/default/.mcp.json +2 -12
- package/presets/default/CLAUDE.md.template +45 -8
- package/presets/default/docs/einja/example/specs/issues/issue999-example-task/tasks.md +1 -1
- package/presets/default/docs/einja/instructions/deployment-setup.md +4 -9
- package/presets/default/docs/einja/instructions/environment-setup.md +3 -8
- package/presets/default/docs/einja/instructions/issue-exec-workflow.md +276 -0
- package/presets/default/docs/einja/instructions/local-server-environment-and-worktree.md +71 -9
- package/presets/default/docs/einja/instructions/neon-cli-reference.md +3 -8
- package/presets/default/docs/einja/instructions/setup-flow.md +279 -0
- package/presets/default/docs/einja/instructions/task-execute.md +63 -68
- package/presets/default/docs/einja/instructions/vercel-cli-reference.md +17 -10
- package/presets/default/docs/einja/steering/README.md +11 -11
- package/presets/default/docs/einja/steering/acceptance-criteria-and-qa-guide.md +4 -9
- package/presets/default/docs/einja/steering/architecture.md +3 -8
- package/presets/default/docs/einja/steering/branch-strategy.md +63 -70
- package/presets/default/docs/einja/steering/commit-rules.md +3 -8
- package/presets/default/docs/einja/steering/db-schema-design.md +3 -8
- package/presets/default/docs/einja/steering/development/api-development.md +3 -8
- package/presets/default/docs/einja/steering/development/backend-architecture.md +3 -8
- package/presets/default/docs/einja/steering/development/coding-standards.md +723 -0
- package/presets/default/docs/einja/steering/development/component-design.md +502 -0
- package/presets/default/docs/einja/steering/development/database-guidelines.md +2 -2
- package/presets/default/docs/einja/steering/development/frontend-development.md +3 -8
- package/presets/default/docs/einja/steering/development/playwright-guidelines.md +59 -0
- package/presets/default/docs/einja/steering/development/review-guidelines.md +3 -8
- package/presets/default/docs/einja/steering/development/testing-strategy.md +3 -8
- package/presets/default/docs/einja/steering/development-workflow.md +155 -140
- package/presets/default/docs/einja/steering/infrastructure/deployment.md +156 -55
- package/presets/default/docs/einja/steering/infrastructure/environment-variables.md +4 -8
- package/presets/default/docs/einja/steering/product.md +3 -8
- package/presets/default/docs/einja/steering/task-management.md +22 -110
- package/presets/default/scripts/ensure-serena.sh +75 -0
- package/presets/default/scripts/env-rotate-secrets.ts +396 -0
- package/presets/default/scripts/env-show.ts +130 -0
- package/presets/default/scripts/env.ts +479 -0
- package/presets/default/scripts/init-github.ts +363 -0
- package/presets/default/scripts/init.sh +98 -0
- package/presets/default/scripts/lib/env-common.ts +108 -0
- package/presets/default/scripts/lib/worktree-config.ts +64 -0
- package/presets/default/scripts/setup-dev.ts +655 -0
- package/presets/default/scripts/stop-serena.sh +25 -0
- package/presets/default/scripts/worktree/dev.ts +872 -0
- package/dist/lib/sync/seed-synchronizer.d.ts +0 -27
- package/dist/lib/sync/seed-synchronizer.d.ts.map +0 -1
- package/dist/lib/sync/seed-synchronizer.js +0 -72
- package/dist/lib/sync/seed-synchronizer.js.map +0 -1
- package/dist/lib/sync/seed-synchronizer.test.d.ts +0 -2
- package/dist/lib/sync/seed-synchronizer.test.d.ts.map +0 -1
- package/dist/lib/sync/seed-synchronizer.test.js +0 -147
- package/dist/lib/sync/seed-synchronizer.test.js.map +0 -1
- package/presets/default/.claude/agents/einja/git/conflict-resolver.md +0 -148
- package/presets/default/.claude/hooks/einja/validate-git-commit.sh +0 -239
- package/presets/default/.claude/skills/einja-api-development/SKILL.md +0 -14
- package/presets/default/.claude/skills/einja-backend-architecture/SKILL.md +0 -18
- package/presets/default/.claude/skills/einja-coding-standards/SKILL.md +0 -132
- package/presets/default/.claude/skills/einja-coding-standards/references/import-conventions.md +0 -69
- package/presets/default/.claude/skills/einja-coding-standards/references/naming-conventions.md +0 -107
- package/presets/default/.claude/skills/einja-coding-standards/references/prohibited-patterns.md +0 -169
- package/presets/default/.claude/skills/einja-coding-standards/references/typescript-rules.md +0 -247
- package/presets/default/.claude/skills/einja-component-design/SKILL.md +0 -109
- package/presets/default/.claude/skills/einja-component-design/references/directory-structure.md +0 -117
- package/presets/default/.claude/skills/einja-component-design/references/props-patterns.md +0 -159
- package/presets/default/.claude/skills/einja-component-design/references/styling-guide.md +0 -122
- package/presets/default/.claude/skills/einja-frontend-development/SKILL.md +0 -14
- package/presets/default/.claude/skills/einja-project-overview/SKILL.md +0 -35
- package/presets/default/docs/einja/instructions/task-vibe-kanban-loop.md +0 -565
|
@@ -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 Skill: #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 Skill: #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** | einja-task-exec Skill 実行(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 失敗 | einja-conflict-resolver Skill で自力解消 |
|
|
252
|
+
| CI 失敗 | gh run status | 修正 → 再push → 再CI待機 |
|
|
253
|
+
| CI 待機タイムアウト | 30分超過 | Manager に通知 → 人間判断 |
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## `einja-task-exec` Skill との使い分け
|
|
258
|
+
|
|
259
|
+
| 実行方法 | 用途 | 対象 | 推奨シーン |
|
|
260
|
+
|---------|------|------|----------|
|
|
261
|
+
| **`/einja:issue-exec`** | Issue全体の並列実行 | 複数Phase・複数タスクグループ | 大規模機能実装 |
|
|
262
|
+
| **`einja-task-exec` Skill** | 単一タスクグループの実行 | 1つのタスクグループ | 品質重視、複雑な実装 |
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 関連ドキュメント
|
|
267
|
+
|
|
268
|
+
- [タスク実行ワークフロー](./task-execute.md)
|
|
269
|
+
- [タスク管理ガイドライン](../steering/task-management.md)
|
|
270
|
+
- [仕様書作成ワークフロー](./task-execute.md#フェーズ1-issue仕様書作成-einja-issue-spec-create-skill)
|
|
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 -->
|
|
@@ -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
|
|
|
@@ -530,7 +530,7 @@ pnpm build
|
|
|
530
530
|
環境構築が完了したら、以下のドキュメントも参照してください:
|
|
531
531
|
|
|
532
532
|
- **[タスク実行ガイド](./task-execute.md)**: /task-execコマンドの使用方法
|
|
533
|
-
- **[コーディング規約](
|
|
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
|
-
|
|
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
|
-
<!--
|
|
638
|
-
<!-- @einja:
|
|
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:
|
|
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 -->
|
|
@@ -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 から統合的に呼び出されます。
|