@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,413 @@
|
|
|
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` Skill で個別タスクグループを逐次実行することは可能です。
|
|
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
|
+
- Manager worktree の存在確認: `git worktree list | grep issue-{N}/manager`
|
|
115
|
+
- 存在しない場合は再作成: `git worktree add ~/.einja/worktrees/issue-{N}/manager issue/{N}`
|
|
116
|
+
- 未完了のPhaseのDirectorを再起動する
|
|
117
|
+
|
|
118
|
+
### Step 1: Issue パース
|
|
119
|
+
1. `gh issue view {issue番号} --json body,title,number` でIssue本文を取得
|
|
120
|
+
2. Issue本文からPhase構造をパース:
|
|
121
|
+
- `### Phase N: {Phase名}` のセクションを抽出
|
|
122
|
+
- 各Phase内のタスクグループ(X.Y形式)を抽出
|
|
123
|
+
- タスクグループ間の依存関係を分析
|
|
124
|
+
3. `--max-phase` が指定されている場合、その番号以降のPhaseを除外
|
|
125
|
+
|
|
126
|
+
### Step 2: ブランチ & worktree 作成
|
|
127
|
+
1. Issue ブランチ作成(メインリポジトリから): `issue/{issue番号}`(base ブランチから)
|
|
128
|
+
2. Manager worktree 作成(メインリポジトリから):
|
|
129
|
+
```bash
|
|
130
|
+
mkdir -p ~/.einja/worktrees/issue-{N}/
|
|
131
|
+
git worktree add ~/.einja/worktrees/issue-{N}/manager issue/{N}
|
|
132
|
+
git push -u origin issue/{N}
|
|
133
|
+
```
|
|
134
|
+
3. **以降の操作は全て Manager worktree 内から実行**(cwd: `~/.einja/worktrees/issue-{N}/manager`)
|
|
135
|
+
4. 各 Phase のブランチ作成(Manager worktree から): `issue/{issue番号}-phase{N}`(issue ブランチから)
|
|
136
|
+
5. Phase worktree 作成(Manager worktree から):
|
|
137
|
+
```bash
|
|
138
|
+
git worktree add ~/.einja/worktrees/issue-{N}/phase{M} issue/{N}-phase{M}
|
|
139
|
+
git push -u origin issue/{N}-phase{M}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Step 3: セッションファイル初期化
|
|
143
|
+
パス: `~/.einja/sessions/issue-{N}/`
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
session.json # セッション全体
|
|
147
|
+
phase-{M}/
|
|
148
|
+
status.json # Phase状態
|
|
149
|
+
task-{X.Y}.json # 各タスクグループの状態
|
|
150
|
+
questions/
|
|
151
|
+
q-{uuid}.json # 質問ファイル
|
|
152
|
+
events.jsonl # イベントログ
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
session.json の初期状態:
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"issueNumber": 123,
|
|
159
|
+
"mergeMode": "manual",
|
|
160
|
+
"baseBranch": "main",
|
|
161
|
+
"startedAt": "ISO8601",
|
|
162
|
+
"managerPid": "PID",
|
|
163
|
+
"phases": [
|
|
164
|
+
{ "number": 1, "name": "Phase名", "status": "pending", "branch": "issue/123-phase1" }
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Step 4: tmux セッション作成
|
|
170
|
+
```bash
|
|
171
|
+
tmux new-session -d -s einja-{issue番号} -n manager -c ~/.einja/worktrees/issue-{N}/manager
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Step 5: Director 起動(Phase単位)
|
|
175
|
+
Phase の依存関係を考慮し、着手可能な Phase から Director を起動。
|
|
176
|
+
|
|
177
|
+
1. Phase worktree のディレクトリに移動
|
|
178
|
+
2. tmux window で `claude` を対話モードで起動
|
|
179
|
+
3. 初期プロンプトとして以下を送信(tmux send-keys):
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
tmux new-window -t einja-{N} -n director-phase{M}
|
|
183
|
+
tmux send-keys -t einja-{N}:director-phase{M} 'cd ~/.einja/worktrees/issue-{N}/phase{M} && claude' Enter
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
claude が起動したら、以下のプロンプトを送信:
|
|
187
|
+
```
|
|
188
|
+
tmux send-keys -t einja-{N}:director-phase{M} '
|
|
189
|
+
あなたは Director(Phase {M})です。以下の Phase を管理してください。
|
|
190
|
+
|
|
191
|
+
## Phase情報
|
|
192
|
+
- Issue番号: #{issue番号}
|
|
193
|
+
- Phase: {M} - {Phase名}
|
|
194
|
+
- Phase ブランチ: issue/{N}-phase{M}
|
|
195
|
+
- マージモード: {mergeMode}
|
|
196
|
+
- セッションパス: ~/.einja/sessions/issue-{N}/phase-{M}/
|
|
197
|
+
- worktree パス: ~/.einja/worktrees/issue-{N}/
|
|
198
|
+
|
|
199
|
+
## タスクグループ一覧
|
|
200
|
+
{タスクグループ一覧(番号、名前、依存関係を含む)}
|
|
201
|
+
|
|
202
|
+
## 責務
|
|
203
|
+
1. 依存関係のないタスクグループは並列でWorkerを起動してください
|
|
204
|
+
2. 各Worker には tmux window + claude 対話モードで起動:
|
|
205
|
+
- worktree作成: git worktree add ~/.einja/worktrees/issue-{N}/task-{X.Y} task/{N}-{X.Y}
|
|
206
|
+
- tmux: tmux new-window + claude 起動 + einja-task-exec Skill で #{N} {X.Y} を実行
|
|
207
|
+
3. Worker完了後:
|
|
208
|
+
- ステータスファイルでPR番号を確認
|
|
209
|
+
- マージモードに応じたPR処理
|
|
210
|
+
- 他active Workerにsync通知
|
|
211
|
+
- 完了したworktree削除
|
|
212
|
+
4. Phase完了時: `/einja-create-pr --auto --base issue/{N}` でPhase PRを作成
|
|
213
|
+
5. 質問対応: Workerからの質問にspec/design/issueベースで回答。回答不可ならManagerにエスカレーション
|
|
214
|
+
6. Phase完了時: ステータスファイルで Manager に報告
|
|
215
|
+
7. GitHub Issue のチェックボックス更新
|
|
216
|
+
|
|
217
|
+
## 質問エスカレーション
|
|
218
|
+
回答不可な質問は ~/.einja/sessions/issue-{N}/questions/ にJSONファイルを作成してManagerに通知してください。
|
|
219
|
+
' Enter
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Step 6: 監視ループ
|
|
223
|
+
Manager は以下を定期的に監視:
|
|
224
|
+
|
|
225
|
+
1. **ステータスファイル監視**(30秒間隔):
|
|
226
|
+
- 各 Phase の status.json をチェック
|
|
227
|
+
- Phase 完了を検知したら Phase PR を作成
|
|
228
|
+
- 質問ファイルの pending 状態を検知
|
|
229
|
+
|
|
230
|
+
2. **質問エスカレーション処理**:
|
|
231
|
+
- `~/.einja/sessions/issue-{N}/questions/` の pending 質問を検知
|
|
232
|
+
- AskUserQuestion で人間に質問を表示
|
|
233
|
+
- 回答をステータスファイルに書き込み
|
|
234
|
+
|
|
235
|
+
3. **Phase 完了処理**:
|
|
236
|
+
- Phase PR 作成: `gh pr create --base issue/{N} --head issue/{N}-phase{M}`
|
|
237
|
+
- マージモードに応じた処理(manual: 待機、auto: 自動マージ)
|
|
238
|
+
- マージ後、Phase worktree 削除
|
|
239
|
+
- 他 active Phase への変更伝播通知
|
|
240
|
+
|
|
241
|
+
4. **tmux window 消失検知**:
|
|
242
|
+
- Director/Worker の tmux window が消失した場合のリカバリ処理
|
|
243
|
+
|
|
244
|
+
### Step 7: 全Phase完了 → 最終PR
|
|
245
|
+
1. 最終PR作成: `/einja-create-pr --auto --base {baseBranch}` を実行
|
|
246
|
+
- changeset自動生成 + ラベル付与 + PR作成が一括実行される
|
|
247
|
+
2. PR URL を表示
|
|
248
|
+
3. セッションクリーンアップ(worktree 削除、セッションファイル削除)
|
|
249
|
+
|
|
250
|
+
## マージモード詳細
|
|
251
|
+
|
|
252
|
+
| モード | タスクPR (task→phase) | Phase PR (phase→issue) | 最終PR (issue→base) |
|
|
253
|
+
|---|---|---|---|
|
|
254
|
+
| `manual` | 人間マージ待ち | 人間マージ待ち | 人間マージ待ち |
|
|
255
|
+
| `task-group-auto` | CI通過後に自動マージ | 人間マージ待ち | 人間マージ待ち |
|
|
256
|
+
| `auto` | CI通過後に自動マージ | CI通過後に自動マージ | 人間マージ待ち(常に手動) |
|
|
257
|
+
|
|
258
|
+
## ブランチ構成
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
{baseBranch}
|
|
262
|
+
└── issue/{N} Manager worktree
|
|
263
|
+
├── issue/{N}-phase1 Director1 worktree
|
|
264
|
+
│ ├── task/{N}-1.1 Worker1.1 worktree
|
|
265
|
+
│ ├── task/{N}-1.2 Worker1.2 worktree
|
|
266
|
+
│ └── task/{N}-1.3 Worker1.3 worktree
|
|
267
|
+
└── issue/{N}-phase2 Director2 worktree
|
|
268
|
+
└── task/{N}-2.1 Worker2.1 worktree
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## worktree 物理パス
|
|
272
|
+
```
|
|
273
|
+
~/.einja/worktrees/issue-{N}/
|
|
274
|
+
├── manager/ ← Manager cwd
|
|
275
|
+
├── phase{M}/ ← Director cwd
|
|
276
|
+
├── task-{X.Y}/ ← Worker cwd
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## ステータスファイル詳細
|
|
280
|
+
|
|
281
|
+
### session.json
|
|
282
|
+
```json
|
|
283
|
+
{
|
|
284
|
+
"issueNumber": 123,
|
|
285
|
+
"mergeMode": "manual",
|
|
286
|
+
"baseBranch": "main",
|
|
287
|
+
"startedAt": "2025-01-01T00:00:00Z",
|
|
288
|
+
"managerPid": "12345",
|
|
289
|
+
"phases": [
|
|
290
|
+
{ "number": 1, "name": "基盤構築", "status": "in_progress", "branch": "issue/123-phase1" },
|
|
291
|
+
{ "number": 2, "name": "機能実装", "status": "pending", "branch": "issue/123-phase2" }
|
|
292
|
+
]
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### phase-{M}/status.json
|
|
297
|
+
```json
|
|
298
|
+
{
|
|
299
|
+
"phaseNumber": 1,
|
|
300
|
+
"status": "in_progress",
|
|
301
|
+
"directorPid": "12346",
|
|
302
|
+
"startedAt": "2025-01-01T00:00:00Z"
|
|
303
|
+
}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### phase-{M}/task-{X.Y}.json
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"taskGroup": "1.1",
|
|
310
|
+
"status": "completed",
|
|
311
|
+
"branch": "task/123-1.1",
|
|
312
|
+
"workerPid": "12347",
|
|
313
|
+
"prNumber": 456,
|
|
314
|
+
"startedAt": "2025-01-01T00:00:00Z",
|
|
315
|
+
"completedAt": "2025-01-01T01:00:00Z"
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### questions/q-{uuid}.json
|
|
320
|
+
```json
|
|
321
|
+
{
|
|
322
|
+
"id": "q-001",
|
|
323
|
+
"from": "worker-1.1",
|
|
324
|
+
"question": "ユーザー認証にJWTとセッションのどちらを使うべきか?",
|
|
325
|
+
"context": "design.md にはどちらの記載もない",
|
|
326
|
+
"status": "pending",
|
|
327
|
+
"escalatedTo": null,
|
|
328
|
+
"answer": null,
|
|
329
|
+
"answeredBy": null,
|
|
330
|
+
"docUpdate": null
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### events.jsonl
|
|
335
|
+
各行が1つのイベント:
|
|
336
|
+
```json
|
|
337
|
+
{"timestamp":"2025-01-01T00:00:00Z","pid":"12345","event_type":"session_started","data":{"issueNumber":123}}
|
|
338
|
+
{"timestamp":"2025-01-01T00:01:00Z","pid":"12346","event_type":"director_started","data":{"phase":1}}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
## エラーリカバリ
|
|
342
|
+
|
|
343
|
+
| 障害 | 検知方法 | リカバリ |
|
|
344
|
+
|---|---|---|
|
|
345
|
+
| Worker異常終了(PR作成前) | tmux window消失 + ステータス未更新 | リトライ(最大2回)→ 失敗時はManagerに報告 → 人間判断 |
|
|
346
|
+
| Worker異常終了(PR作成済み) | tmux window消失 + PRあり | スキップ(PRマージ待ち継続) |
|
|
347
|
+
| Director異常終了 | tmux window消失 + ステータス未更新 | 各Workerのステータスを確認 → 未完了Workerのみ再実行 |
|
|
348
|
+
| Manager異常終了 | ユーザー手動 | `--resume` でセッション復元 |
|
|
349
|
+
| rebaseコンフリクト | git rebase失敗 | einja-conflict-resolver Skillで自力解消 |
|
|
350
|
+
| CI失敗 | gh run status | 修正 → 再push → 再CI待機 |
|
|
351
|
+
|
|
352
|
+
## CI 待機タイムアウト
|
|
353
|
+
- デフォルト: 30分
|
|
354
|
+
- 超過時は AskUserQuestion でユーザーに通知
|
|
355
|
+
|
|
356
|
+
## 質問回答のドキュメント還元
|
|
357
|
+
質問エスカレーションで得られた回答のうち、ドキュメント未記載のものは適切なドキュメントに追記する。
|
|
358
|
+
|
|
359
|
+
回答ステータスファイルに追記先を記録:
|
|
360
|
+
```json
|
|
361
|
+
{
|
|
362
|
+
"answer": "JWT を使用する",
|
|
363
|
+
"answeredBy": "human",
|
|
364
|
+
"docUpdate": {
|
|
365
|
+
"target": "design.md",
|
|
366
|
+
"section": "認証方式",
|
|
367
|
+
"content": "認証方式は JWT を採用する。理由: ..."
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### 追記先の判定基準
|
|
373
|
+
| 回答の種類 | 追記先 |
|
|
374
|
+
|-----------|--------|
|
|
375
|
+
| 要件・仕様に関する判断 | requirements.md |
|
|
376
|
+
| 技術的な設計判断 | design.md |
|
|
377
|
+
| プロジェクト横断の方針 | docs/einja/memory/decisions.md |
|
|
378
|
+
| 再利用可能なパターン | docs/einja/memory/patterns.md |
|
|
379
|
+
|
|
380
|
+
## Worker 起動コマンド(Director が実行)
|
|
381
|
+
|
|
382
|
+
```bash
|
|
383
|
+
# 1. タスクブランチ作成 & worktree 追加
|
|
384
|
+
git branch task/{N}-{X.Y} issue/{N}-phase{M}
|
|
385
|
+
git push -u origin task/{N}-{X.Y}
|
|
386
|
+
git worktree add ~/.einja/worktrees/issue-{N}/task-{X.Y} task/{N}-{X.Y}
|
|
387
|
+
|
|
388
|
+
# 2. tmux window で claude 起動
|
|
389
|
+
tmux new-window -t einja-{N} -n worker-{X.Y}
|
|
390
|
+
tmux send-keys -t einja-{N}:worker-{X.Y} 'cd ~/.einja/worktrees/issue-{N}/task-{X.Y} && claude' Enter
|
|
391
|
+
|
|
392
|
+
# 3. einja-task-exec Skill を実行
|
|
393
|
+
# claude 起動後に以下を送信:
|
|
394
|
+
tmux send-keys -t einja-{N}:worker-{X.Y} '/einja-task-exec #{N} {X.Y}' Enter
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
## セッションクリーンアップ
|
|
398
|
+
|
|
399
|
+
Issue完了時に以下を自動削除:
|
|
400
|
+
- `~/.einja/sessions/issue-{N}/` (セッションファイル)
|
|
401
|
+
- `~/.einja/worktrees/issue-{N}/` (worktree。事前に `git worktree remove` を各ディレクトリに対して実行)
|
|
402
|
+
- `git worktree remove ~/.einja/worktrees/issue-{N}/task-{X.Y}`(Worker)
|
|
403
|
+
- `git worktree remove ~/.einja/worktrees/issue-{N}/phase{M}`(Director)
|
|
404
|
+
- `git worktree remove ~/.einja/worktrees/issue-{N}/manager`(Manager - 最後に削除)
|
|
405
|
+
- ローカルブランチのクリーンアップ(task/*, issue/*-phase*)
|
|
406
|
+
|
|
407
|
+
## 注意事項
|
|
408
|
+
|
|
409
|
+
- 全プロセスは**対話モード**(`claude`、非 `-p`)で起動。質問エスカレーションのため
|
|
410
|
+
- Worker 内部のタスク並列実行は既存の einja-task-exec Skill フロー(Task ツール + run_in_background)をそのまま活用
|
|
411
|
+
- ステータスファイルの `status.json` 更新には `flock` による排他制御を使用
|
|
412
|
+
- 質問ファイルは1ファイル1質問のためロック不要(UUID でアトミック書き込み)
|
|
413
|
+
- Worker は各タスク完了毎 + PR作成前にステータスファイルをチェック(sync_required検知時は次タスク開始前にrebase)
|
|
@@ -51,7 +51,7 @@ Glob: .claude/commands/**/*.md
|
|
|
51
51
|
|
|
52
52
|
例:
|
|
53
53
|
- `task-executer` → `.claude/agents/task/task-executer.md`
|
|
54
|
-
- `
|
|
54
|
+
- `requirements-generator` → `.claude/agents/issue-specs/requirements-generator.md`
|
|
55
55
|
|
|
56
56
|
**変換テンプレート**:
|
|
57
57
|
|
|
@@ -131,8 +131,8 @@ alwaysApply: false
|
|
|
131
131
|
|
|
132
132
|
```bash
|
|
133
133
|
# 例(フォルダ形式)
|
|
134
|
-
.claude/
|
|
135
|
-
.claude/
|
|
134
|
+
.claude/skills/einja-task-exec/SKILL.md → .cursor/rules/task-exec/RULE.md
|
|
135
|
+
.claude/skills/einja-issue-spec-create/SKILL.md → .cursor/rules/spec-create/RULE.md
|
|
136
136
|
.claude/commands/einja/start-dev.md → .cursor/rules/start-dev/RULE.md
|
|
137
137
|
```
|
|
138
138
|
|
|
@@ -178,8 +178,8 @@ Cursor で以下のルールが利用可能になりました:
|
|
|
178
178
|
|
|
179
179
|
### レガシーファイル
|
|
180
180
|
以下の古い形式のファイルが検出されました(削除推奨):
|
|
181
|
-
- `.cursor/commands/task-exec.md`
|
|
182
|
-
- `.cursor/commands/spec-create.md`
|
|
181
|
+
- `.cursor/commands/einja-task-exec.md`
|
|
182
|
+
- `.cursor/commands/einja-issue-spec-create.md`
|
|
183
183
|
```
|
|
184
184
|
|
|
185
185
|
|
|
@@ -216,7 +216,7 @@ Cursor で以下のルールが利用可能になりました:
|
|
|
216
216
|
├── .cursor/rules/spec-create/RULE.md (3箇所のサブエージェント参照を変換)
|
|
217
217
|
├── .cursor/rules/task-exec/RULE.md (4箇所のサブエージェント参照を変換)
|
|
218
218
|
├── .cursor/rules/start-dev/RULE.md (変換不要)
|
|
219
|
-
└── .cursor/rules/update-docs-by-
|
|
219
|
+
└── .cursor/rules/update-docs-by-issue-specs/RULE.md (変換不要)
|
|
220
220
|
```
|
|
221
221
|
|
|
222
222
|
## エラー処理
|
|
@@ -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 -->
|