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