ensemble-claude 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. ensemble/__init__.py +5 -0
  2. ensemble/ack.py +86 -0
  3. ensemble/cli.py +31 -0
  4. ensemble/commands/__init__.py +1 -0
  5. ensemble/commands/_init_impl.py +208 -0
  6. ensemble/commands/_launch_impl.py +217 -0
  7. ensemble/commands/init.py +35 -0
  8. ensemble/commands/launch.py +32 -0
  9. ensemble/config.py +218 -0
  10. ensemble/dashboard.py +168 -0
  11. ensemble/helpers.py +79 -0
  12. ensemble/lock.py +77 -0
  13. ensemble/logger.py +80 -0
  14. ensemble/notes.py +221 -0
  15. ensemble/queue.py +166 -0
  16. ensemble/templates/__init__.py +75 -0
  17. ensemble/templates/agents/conductor.md +239 -0
  18. ensemble/templates/agents/dispatch.md +351 -0
  19. ensemble/templates/agents/integrator.md +138 -0
  20. ensemble/templates/agents/learner.md +133 -0
  21. ensemble/templates/agents/reviewer.md +84 -0
  22. ensemble/templates/agents/security-reviewer.md +136 -0
  23. ensemble/templates/agents/worker.md +184 -0
  24. ensemble/templates/commands/go-light.md +49 -0
  25. ensemble/templates/commands/go.md +101 -0
  26. ensemble/templates/commands/improve.md +116 -0
  27. ensemble/templates/commands/review.md +74 -0
  28. ensemble/templates/commands/status.md +56 -0
  29. ensemble/templates/scripts/dashboard-update.sh +78 -0
  30. ensemble/templates/scripts/launch.sh +137 -0
  31. ensemble/templates/scripts/pane-setup.sh +111 -0
  32. ensemble/templates/scripts/setup.sh +163 -0
  33. ensemble/templates/scripts/worktree-create.sh +89 -0
  34. ensemble/templates/scripts/worktree-merge.sh +194 -0
  35. ensemble/templates/workflows/default.yaml +78 -0
  36. ensemble/templates/workflows/heavy.yaml +149 -0
  37. ensemble/templates/workflows/simple.yaml +41 -0
  38. ensemble/templates/workflows/worktree.yaml +202 -0
  39. ensemble/utils.py +60 -0
  40. ensemble/workflow.py +127 -0
  41. ensemble/worktree.py +322 -0
  42. ensemble_claude-0.3.0.dist-info/METADATA +144 -0
  43. ensemble_claude-0.3.0.dist-info/RECORD +46 -0
  44. ensemble_claude-0.3.0.dist-info/WHEEL +4 -0
  45. ensemble_claude-0.3.0.dist-info/entry_points.txt +2 -0
  46. ensemble_claude-0.3.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,56 @@
1
+ ---
2
+ description: 現在の進捗状況を表示・更新する
3
+ ---
4
+
5
+ `status/dashboard.md` を読み込み、現在の進捗を報告してください。
6
+
7
+ ## 実行手順
8
+
9
+ ### 1. ダッシュボードの確認
10
+
11
+ ```bash
12
+ cat status/dashboard.md
13
+ ```
14
+
15
+ ### 2. 状態の収集
16
+
17
+ 以下を確認し、ダッシュボードの内容と照合:
18
+
19
+ - **queue/tasks/**: 未処理のタスクがあるか
20
+ - **queue/reports/**: 未処理の完了報告があるか
21
+ - **queue/ack/**: 未確認のACKがあるか
22
+
23
+ ### 3. 差分があれば更新
24
+
25
+ ダッシュボードの内容が古い場合:
26
+
27
+ 1. 各ペイン/worktreeの状況を確認
28
+ 2. `status/dashboard.md` を更新
29
+ 3. 更新内容を報告
30
+
31
+ ### 4. サマリーの報告
32
+
33
+ 以下の形式で報告:
34
+
35
+ ```
36
+ ## 現在の状態
37
+
38
+ - **アクティブタスク**: [タスク名]
39
+ - **進捗**: [完了サブタスク数]/[全サブタスク数]
40
+ - **実行中のエージェント**: [エージェント一覧]
41
+ - **待機中の作業**: [あれば記載]
42
+
43
+ ## 最近の完了
44
+
45
+ - [直近の完了タスク一覧]
46
+
47
+ ## 注意事項
48
+
49
+ - [問題があれば記載]
50
+ ```
51
+
52
+ ## 注意事項
53
+
54
+ - このコマンドは読み取り専用の操作が中心
55
+ - ダッシュボード更新以外のファイル変更は行わない
56
+ - 問題を発見した場合はConductorに報告する
@@ -0,0 +1,78 @@
1
+ #!/bin/bash
2
+ # scripts/dashboard-update.sh
3
+ # ダッシュボードを更新する
4
+
5
+ set -euo pipefail
6
+
7
+ PROJECT_DIR="${PROJECT_DIR:-$(pwd)}"
8
+ DASHBOARD="$PROJECT_DIR/status/dashboard.md"
9
+
10
+ # コマンド
11
+ CMD="${1:-}"
12
+ shift || true
13
+
14
+ case "$CMD" in
15
+ task)
16
+ # タスク名を設定: dashboard-update.sh task "タスク名"
17
+ TASK_NAME="${1:-なし}"
18
+ sed -i "s/## 現在のタスク.*/## 現在のタスク\n$TASK_NAME/" "$DASHBOARD"
19
+ ;;
20
+
21
+ status)
22
+ # エージェント状態を更新: dashboard-update.sh status "pane-0" "busy" "conductor" "計画中"
23
+ PANE="${1:-}"
24
+ STATE="${2:-idle}"
25
+ AGENT="${3:--}"
26
+ PROGRESS="${4:--}"
27
+
28
+ # 状態行を生成
29
+ STATUS_LINE="| $PANE | $STATE | $AGENT | $PROGRESS |"
30
+
31
+ # 既存の状態テーブルを更新(簡易版:最後の行を置換)
32
+ # TODO: 複数ペイン対応
33
+ ;;
34
+
35
+ complete)
36
+ # タスク完了を記録: dashboard-update.sh complete "task-001" "success"
37
+ TASK_ID="${1:-}"
38
+ RESULT="${2:-success}"
39
+ TIMESTAMP=$(date '+%Y-%m-%d %H:%M')
40
+
41
+ # 完了タスクに追加
42
+ if grep -q "## 最近の完了タスク" "$DASHBOARD"; then
43
+ sed -i "/## 最近の完了タスク/a - $TASK_ID: $RESULT ($TIMESTAMP)" "$DASHBOARD"
44
+ fi
45
+ ;;
46
+
47
+ log)
48
+ # ログを追加: dashboard-update.sh log "メッセージ"
49
+ MESSAGE="${1:-}"
50
+ TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
51
+
52
+ if grep -q "## 改善ログ" "$DASHBOARD"; then
53
+ sed -i "/## 改善ログ/a - [$TIMESTAMP] $MESSAGE" "$DASHBOARD"
54
+ fi
55
+ ;;
56
+
57
+ timestamp)
58
+ # 最終更新時刻を更新
59
+ TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
60
+ sed -i "s/*Last updated:.*/*Last updated: $TIMESTAMP*/" "$DASHBOARD"
61
+ ;;
62
+
63
+ *)
64
+ echo "Usage: dashboard-update.sh <command> [args]"
65
+ echo ""
66
+ echo "Commands:"
67
+ echo " task <name> - Set current task name"
68
+ echo " status <pane> <state> <agent> <progress> - Update agent status"
69
+ echo " complete <task_id> <result> - Record task completion"
70
+ echo " log <message> - Add log entry"
71
+ echo " timestamp - Update last modified time"
72
+ exit 1
73
+ ;;
74
+ esac
75
+
76
+ # 常に最終更新時刻を更新
77
+ TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
78
+ sed -i "s/*Last updated:.*/*Last updated: $TIMESTAMP*/" "$DASHBOARD"
@@ -0,0 +1,137 @@
1
+ #!/bin/bash
2
+ # scripts/launch.sh
3
+ # Ensembleのメインtmuxセッションを起動する
4
+ # 構成: 左=conductor、右=その他(tiled)
5
+ #
6
+ # 注意: ペインIDを使用することで、ユーザーのtmux設定(pane-base-index等)に
7
+ # 依存せずに動作する
8
+
9
+ set -euo pipefail
10
+
11
+ SESSION="ensemble"
12
+ PROJECT_DIR="${PROJECT_DIR:-$(pwd)}"
13
+ LOG_DIR="$PROJECT_DIR/logs"
14
+ QUEUE_DIR="$PROJECT_DIR/queue"
15
+
16
+ echo "Launching Ensemble..."
17
+
18
+ # ログディレクトリ作成
19
+ mkdir -p "$LOG_DIR"
20
+
21
+ # キューディレクトリ作成
22
+ mkdir -p "$QUEUE_DIR/tasks" "$QUEUE_DIR/processing" "$QUEUE_DIR/reports" "$QUEUE_DIR/ack"
23
+
24
+ # 既存セッションがあれば削除
25
+ if tmux has-session -t "$SESSION" 2>/dev/null; then
26
+ echo "Killing existing session..."
27
+ tmux kill-session -t "$SESSION"
28
+ fi
29
+
30
+ # キューのクリーンアップ(新しいセッションはクリーンスタート)
31
+ echo "Cleaning up queue..."
32
+ rm -f "$QUEUE_DIR/tasks/"*.yaml 2>/dev/null || true
33
+ rm -f "$QUEUE_DIR/processing/"*.yaml 2>/dev/null || true
34
+ rm -f "$QUEUE_DIR/reports/"*.yaml 2>/dev/null || true
35
+ rm -f "$QUEUE_DIR/ack/"*.ack 2>/dev/null || true
36
+
37
+ # ログに記録
38
+ echo "$(date -Iseconds) Session started, queue cleaned" >> "$LOG_DIR/ensemble-$(date +%Y%m%d).log"
39
+
40
+ # === レイアウト ===
41
+ # +------------------+----------+
42
+ # | conductor | |
43
+ # | | dashboard|
44
+ # +------------------+ |
45
+ # | dispatch | |
46
+ # +------------------+----------+
47
+ # ワーカー追加時はdashboard列に縦に追加される
48
+
49
+ # 1. セッション作成(全体)
50
+ echo "Creating session..."
51
+ tmux new-session -d -s "$SESSION" -n "main" -c "$PROJECT_DIR"
52
+
53
+ # 最初のペインのIDを取得(これがconductorになる)
54
+ CONDUCTOR_PANE=$(tmux list-panes -t "$SESSION:main" -F '#{pane_id}')
55
+ echo " Conductor pane: $CONDUCTOR_PANE"
56
+
57
+ # 2. 左右に分割(左65% : 右35%)
58
+ tmux split-window -h -t "$CONDUCTOR_PANE" -c "$PROJECT_DIR" -l 35%
59
+
60
+ # 新しく作成されたペインのIDを取得(これがdashboardになる)
61
+ DASHBOARD_PANE=$(tmux list-panes -t "$SESSION:main" -F '#{pane_id}' | grep -v "$CONDUCTOR_PANE")
62
+ echo " Dashboard pane: $DASHBOARD_PANE"
63
+
64
+ # 3. 左ペイン(conductor)を上下に分割(conductor / dispatch)
65
+ tmux split-window -v -t "$CONDUCTOR_PANE" -c "$PROJECT_DIR" -l 50%
66
+
67
+ # 新しく作成されたペインのIDを取得(これがdispatchになる)
68
+ # conductorとdashboard以外のペインがdispatch
69
+ DISPATCH_PANE=$(tmux list-panes -t "$SESSION:main" -F '#{pane_id}' | grep -v "$CONDUCTOR_PANE" | grep -v "$DASHBOARD_PANE")
70
+ echo " Dispatch pane: $DISPATCH_PANE"
71
+
72
+ # 現在の状態:
73
+ # CONDUCTOR_PANE: conductor (左上)
74
+ # DISPATCH_PANE: dispatch (左下)
75
+ # DASHBOARD_PANE: dashboard (右、フル高さ)
76
+
77
+ # 4. 各ペインでコマンド起動(2回分割方式)
78
+ # conductor (--agent でエージェント定義をロード)
79
+ echo "Starting Conductor (Opus, no thinking)..."
80
+ tmux send-keys -t "$CONDUCTOR_PANE" \
81
+ "MAX_THINKING_TOKENS=0 claude --agent conductor --model opus --dangerously-skip-permissions"
82
+ sleep 1
83
+ tmux send-keys -t "$CONDUCTOR_PANE" Enter
84
+
85
+ # フレンドリーファイア防止
86
+ sleep 3
87
+
88
+ # dispatch (--agent でエージェント定義をロード)
89
+ echo "Starting Dispatch (Sonnet)..."
90
+ tmux send-keys -t "$DISPATCH_PANE" \
91
+ "claude --agent dispatch --model sonnet --dangerously-skip-permissions"
92
+ sleep 1
93
+ tmux send-keys -t "$DISPATCH_PANE" Enter
94
+
95
+ # フレンドリーファイア防止
96
+ sleep 3
97
+
98
+ # dashboard
99
+ echo "Starting Dashboard monitor..."
100
+ tmux send-keys -t "$DASHBOARD_PANE" \
101
+ "watch -n 5 cat status/dashboard.md"
102
+ sleep 1
103
+ tmux send-keys -t "$DASHBOARD_PANE" Enter
104
+
105
+ # 5. conductorペインにフォーカス
106
+ tmux select-pane -t "$CONDUCTOR_PANE"
107
+
108
+ # ペインIDをファイルに保存(他のスクリプトから参照可能に)
109
+ mkdir -p "$PROJECT_DIR/.ensemble"
110
+ cat > "$PROJECT_DIR/.ensemble/panes.env" << EOF
111
+ # Ensemble pane IDs (auto-generated)
112
+ CONDUCTOR_PANE=$CONDUCTOR_PANE
113
+ DISPATCH_PANE=$DISPATCH_PANE
114
+ DASHBOARD_PANE=$DASHBOARD_PANE
115
+ EOF
116
+
117
+ echo ""
118
+ echo "=========================================="
119
+ echo " Ensemble launched successfully!"
120
+ echo "=========================================="
121
+ echo ""
122
+ echo "Layout:"
123
+ echo " +------------------+----------+"
124
+ echo " | conductor | |"
125
+ echo " | | dashboard|"
126
+ echo " +------------------+ |"
127
+ echo " | dispatch | |"
128
+ echo " +------------------+----------+"
129
+ echo ""
130
+ echo "Panes:"
131
+ echo " - $CONDUCTOR_PANE (left-top) : Conductor (Opus, no thinking)"
132
+ echo " - $DISPATCH_PANE (left-bottom): Dispatch (Sonnet)"
133
+ echo " - $DASHBOARD_PANE (right) : Dashboard monitor"
134
+ echo ""
135
+ echo "Add workers: ./scripts/pane-setup.sh [count]"
136
+ echo "To attach: tmux attach-session -t $SESSION"
137
+ echo ""
@@ -0,0 +1,111 @@
1
+ #!/bin/bash
2
+ # scripts/pane-setup.sh
3
+ # ワーカーペインを既存のmainウィンドウに追加する(右側縦並び)
4
+ # フレンドリーファイア防止のため3秒間隔で起動
5
+ #
6
+ # 注意: ペインIDを使用することで、ユーザーのtmux設定(pane-base-index等)に
7
+ # 依存せずに動作する
8
+ #
9
+ # 初期レイアウト:
10
+ # +------------------+----------+
11
+ # | conductor | |
12
+ # | | dashboard|
13
+ # +------------------+ |
14
+ # | dispatch | |
15
+ # +------------------+----------+
16
+ #
17
+ # ワーカー追加後:
18
+ # +------------------+----------+
19
+ # | conductor | worker-1 |
20
+ # | +----------+
21
+ # +------------------+ worker-2 |
22
+ # | dispatch +----------+
23
+ # | | dashboard|
24
+ # +------------------+----------+
25
+
26
+ set -euo pipefail
27
+
28
+ SESSION="${SESSION:-ensemble}"
29
+ PROJECT_DIR="${PROJECT_DIR:-$(pwd)}"
30
+ WORKER_COUNT="${1:-2}" # デフォルト2ワーカー
31
+ PANES_FILE="$PROJECT_DIR/.ensemble/panes.env"
32
+
33
+ # 最大4ワーカー(Claude Max 5並列 - Conductor用1を除く)
34
+ if [ "$WORKER_COUNT" -gt 4 ]; then
35
+ echo "Warning: Max 4 workers allowed. Reducing from $WORKER_COUNT to 4."
36
+ WORKER_COUNT=4
37
+ fi
38
+
39
+ # panes.env から既存のペインIDを読み込む
40
+ if [ -f "$PANES_FILE" ]; then
41
+ source "$PANES_FILE"
42
+ else
43
+ echo "Error: $PANES_FILE not found. Run launch.sh first."
44
+ exit 1
45
+ fi
46
+
47
+ echo "Adding $WORKER_COUNT worker panes..."
48
+ echo " Using dashboard pane: $DASHBOARD_PANE"
49
+
50
+ # mainウィンドウを選択
51
+ tmux select-window -t "$SESSION:main"
52
+
53
+ # ワーカーペインIDを格納する配列
54
+ declare -a WORKER_PANES=()
55
+
56
+ # 現在のペインID一覧を取得(後で新しいペインを特定するため)
57
+ get_all_pane_ids() {
58
+ tmux list-panes -t "$SESSION:main" -F '#{pane_id}'
59
+ }
60
+
61
+ for i in $(seq 1 "$WORKER_COUNT"); do
62
+ echo "Starting worker-$i..."
63
+
64
+ # 分割前のペインID一覧
65
+ BEFORE_PANES=$(get_all_pane_ids)
66
+
67
+ # dashboardペインを上に分割してワーカーを追加
68
+ tmux split-window -v -t "$DASHBOARD_PANE" -c "$PROJECT_DIR" -b
69
+
70
+ # フレンドリーファイア防止
71
+ sleep 2
72
+
73
+ # 分割後のペインID一覧から新しいペインを特定
74
+ AFTER_PANES=$(get_all_pane_ids)
75
+ NEW_PANE=$(comm -13 <(echo "$BEFORE_PANES" | sort) <(echo "$AFTER_PANES" | sort))
76
+
77
+ echo " Worker-$i pane: $NEW_PANE"
78
+ WORKER_PANES+=("$NEW_PANE")
79
+
80
+ # WORKER_ID環境変数を設定して、--agent workerでClaudeを起動
81
+ # 重要: send-keysは2回分割で送信(shogunパターン)
82
+ tmux send-keys -t "$NEW_PANE" \
83
+ "export WORKER_ID=$i && claude --agent worker --dangerously-skip-permissions"
84
+ sleep 1
85
+ tmux send-keys -t "$NEW_PANE" Enter
86
+ done
87
+
88
+ # 全ワーカーのClaude起動完了を待つ(各ワーカー約10秒)
89
+ echo "Waiting for all workers to initialize..."
90
+ sleep $((WORKER_COUNT * 10))
91
+
92
+ # Conductorペインにフォーカスを戻す
93
+ tmux select-pane -t "$CONDUCTOR_PANE"
94
+
95
+ # panes.env を更新(ワーカーペインIDを追加)
96
+ {
97
+ echo "# Ensemble pane IDs (auto-generated)"
98
+ echo "CONDUCTOR_PANE=$CONDUCTOR_PANE"
99
+ echo "DISPATCH_PANE=$DISPATCH_PANE"
100
+ echo "DASHBOARD_PANE=$DASHBOARD_PANE"
101
+ for idx in "${!WORKER_PANES[@]}"; do
102
+ echo "WORKER_$((idx + 1))_PANE=${WORKER_PANES[$idx]}"
103
+ done
104
+ echo "WORKER_COUNT=$WORKER_COUNT"
105
+ } > "$PANES_FILE"
106
+
107
+ echo ""
108
+ echo "Worker panes added: $WORKER_COUNT workers (ready for tasks)"
109
+ echo ""
110
+ echo "Current panes:"
111
+ tmux list-panes -t "$SESSION:main" -F " #{pane_id}: #{pane_width}x#{pane_height}"
@@ -0,0 +1,163 @@
1
+ #!/bin/bash
2
+ # Ensemble Setup Script
3
+ # Creates the directory structure and initial files for Ensemble AI Orchestration
4
+
5
+ set -e
6
+
7
+ echo "🎵 Ensemble Setup"
8
+ echo "=================="
9
+
10
+ # Get the project root (parent of scripts/)
11
+ PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
12
+ cd "$PROJECT_DIR"
13
+
14
+ # 1. Check required commands
15
+ echo "Checking required commands..."
16
+ for cmd in claude tmux git; do
17
+ if ! command -v $cmd &> /dev/null; then
18
+ echo "⚠️ Warning: $cmd is not installed. Some features may not work."
19
+ fi
20
+ done
21
+
22
+ # 2. Create directory structure
23
+ echo "Creating directory structure..."
24
+
25
+ mkdir -p .claude/{agents,commands,skills}
26
+ mkdir -p scripts
27
+ mkdir -p workflows
28
+ mkdir -p status
29
+ mkdir -p notes
30
+ mkdir -p queue/{tasks,reports,ack}
31
+
32
+ # 3. Create CLAUDE.md (only if it doesn't exist)
33
+ if [ ! -f CLAUDE.md ]; then
34
+ echo "Creating CLAUDE.md..."
35
+ cat > CLAUDE.md << 'CLAUDEEOF'
36
+ # プロジェクト: Ensemble AI Orchestration
37
+
38
+ ## 概要
39
+ このプロジェクトはEnsemble AIオーケストレーションシステムを使用しています。
40
+
41
+ ## 基本ルール
42
+ - /go コマンドでタスクを開始する
43
+ - /go-light で軽量ワークフロー(コスト最小)
44
+ - 実行パターンはConductorが自動判定する
45
+ - 自己改善フェーズを必ず実行する
46
+
47
+ ## ⚠️ コンパクション復帰プロトコル(全エージェント必須)
48
+
49
+ コンパクション後は、作業を再開する前に**必ず**以下を実行せよ:
50
+
51
+ 1. **自分のペイン名を確認する**:
52
+ ```bash
53
+ tmux display-message -p '#W'
54
+ ```
55
+
56
+ 2. **対応するエージェント定義を読み直す**:
57
+ - conductor → `.claude/agents/conductor.md`
58
+ - dispatch → `.claude/agents/dispatch.md`
59
+ - reviewer → `.claude/agents/reviewer.md`
60
+ - (その他、自分の役割に対応するファイル)
61
+
62
+ 3. **禁止事項を確認してから作業開始**
63
+
64
+ 4. **現在のタスクをダッシュボードで確認**:
65
+ ```bash
66
+ cat status/dashboard.md
67
+ ```
68
+
69
+ summaryの「次のステップ」を見てすぐ作業してはならぬ。
70
+ **まず自分が誰かを確認せよ。**
71
+
72
+ ## 通信プロトコル
73
+ - エージェント間の指示・報告はファイルベースキュー(queue/)経由
74
+ - send-keysは「新タスクあり」の通知のみに使用
75
+ - ACKファイルで受領確認を行う
76
+
77
+ ## 実行パターン
78
+ - パターンA: 単純タスク → subagentで直接実行
79
+ - パターンB: 中規模タスク → tmux多ペインで並列実行
80
+ - パターンC: 大規模タスク → git worktreeで分離 + 各worktree内並列
81
+
82
+ ## 学習済みルール(自動追記)
83
+ <!-- learner agentが自動追記するセクション -->
84
+
85
+ CLAUDEEOF
86
+ else
87
+ echo "CLAUDE.md already exists, skipping..."
88
+ fi
89
+
90
+ # 4. Create dashboard.md
91
+ echo "Creating status/dashboard.md..."
92
+ cat > status/dashboard.md << 'EOF'
93
+ # 🎵 Ensemble Dashboard
94
+
95
+ ## 現在のタスク
96
+ なし
97
+
98
+ ## 実行状態
99
+ | ペイン/Worktree | 状態 | エージェント | 進捗 |
100
+ |---|---|---|---|
101
+ | - | idle | - | - |
102
+
103
+ ## 最近の完了タスク
104
+ なし
105
+
106
+ ## Skills候補
107
+ なし
108
+
109
+ ## 改善ログ
110
+ なし
111
+
112
+ ---
113
+ *Last updated: -*
114
+ EOF
115
+
116
+ # 5. Create .gitignore additions
117
+ if [ -f .gitignore ]; then
118
+ if ! grep -q "queue/tasks/" .gitignore 2>/dev/null; then
119
+ echo "" >> .gitignore
120
+ echo "# Ensemble queue files (transient)" >> .gitignore
121
+ echo "queue/tasks/*.yaml" >> .gitignore
122
+ echo "queue/reports/*.yaml" >> .gitignore
123
+ echo "queue/ack/*.ack" >> .gitignore
124
+ fi
125
+ else
126
+ cat > .gitignore << 'EOF'
127
+ # Ensemble queue files (transient)
128
+ queue/tasks/*.yaml
129
+ queue/reports/*.yaml
130
+ queue/ack/*.ack
131
+
132
+ # Python
133
+ __pycache__/
134
+ *.pyc
135
+ .pytest_cache/
136
+ .coverage
137
+ htmlcov/
138
+ *.egg-info/
139
+ dist/
140
+ build/
141
+
142
+ # Virtual environments
143
+ .venv/
144
+ venv/
145
+
146
+ # IDE
147
+ .idea/
148
+ .vscode/
149
+ *.swp
150
+ EOF
151
+ fi
152
+
153
+ echo ""
154
+ echo "✅ セットアップ完了!"
155
+ echo ""
156
+ echo "使い方:"
157
+ echo " claude # Claude Codeを起動"
158
+ echo " /go タスク内容 # Ensembleでタスクを実行"
159
+ echo " /go-light タスク内容 # 軽量ワークフロー"
160
+ echo ""
161
+ echo "次のステップ:"
162
+ echo " 1. .claude/agents/conductor.md を確認"
163
+ echo " 2. MAX_THINKING_TOKENS=0 claude --model opus で起動"
@@ -0,0 +1,89 @@
1
+ #!/bin/bash
2
+ # scripts/worktree-create.sh
3
+ # Ensembleの並列開発用worktreeを作成する
4
+
5
+ set -euo pipefail
6
+
7
+ # 色定義
8
+ RED='\033[0;31m'
9
+ GREEN='\033[0;32m'
10
+ YELLOW='\033[1;33m'
11
+ NC='\033[0m' # No Color
12
+
13
+ # ログ関数
14
+ log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
15
+ log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
16
+ log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
17
+
18
+ # 使用方法
19
+ usage() {
20
+ echo "Usage: $0 <branch-name> [base-branch]"
21
+ echo ""
22
+ echo "Arguments:"
23
+ echo " branch-name 作成するブランチ名(ensemble/接頭辞が自動付与)"
24
+ echo " base-branch ベースとなるブランチ(デフォルト: main)"
25
+ echo ""
26
+ echo "Example:"
27
+ echo " $0 feature-auth main"
28
+ echo " → ../ensemble-feature-auth にworktreeが作成される"
29
+ echo " → ブランチ名: ensemble/feature-auth"
30
+ exit 1
31
+ }
32
+
33
+ # 引数チェック
34
+ if [ $# -lt 1 ]; then
35
+ usage
36
+ fi
37
+
38
+ BRANCH_NAME="$1"
39
+ BASE_BRANCH="${2:-main}"
40
+
41
+ # ensemble/ プレフィックスを付与(まだない場合)
42
+ if [[ ! "$BRANCH_NAME" =~ ^ensemble/ ]]; then
43
+ FULL_BRANCH_NAME="ensemble/${BRANCH_NAME}"
44
+ else
45
+ FULL_BRANCH_NAME="$BRANCH_NAME"
46
+ BRANCH_NAME="${BRANCH_NAME#ensemble/}"
47
+ fi
48
+
49
+ # worktreeディレクトリ名
50
+ PROJECT_ROOT=$(git rev-parse --show-toplevel)
51
+ PARENT_DIR=$(dirname "$PROJECT_ROOT")
52
+ WORKTREE_DIR="${PARENT_DIR}/ensemble-${BRANCH_NAME}"
53
+
54
+ log_info "Creating worktree for: ${FULL_BRANCH_NAME}"
55
+ log_info "Base branch: ${BASE_BRANCH}"
56
+ log_info "Worktree directory: ${WORKTREE_DIR}"
57
+
58
+ # 既存チェック
59
+ if [ -d "$WORKTREE_DIR" ]; then
60
+ log_error "Worktree directory already exists: ${WORKTREE_DIR}"
61
+ exit 1
62
+ fi
63
+
64
+ # ベースブランチが存在するか確認
65
+ if ! git rev-parse --verify "$BASE_BRANCH" >/dev/null 2>&1; then
66
+ log_error "Base branch does not exist: ${BASE_BRANCH}"
67
+ exit 1
68
+ fi
69
+
70
+ # ブランチが既に存在するか確認
71
+ if git rev-parse --verify "$FULL_BRANCH_NAME" >/dev/null 2>&1; then
72
+ log_warn "Branch already exists: ${FULL_BRANCH_NAME}"
73
+ log_info "Creating worktree with existing branch..."
74
+ git worktree add "$WORKTREE_DIR" "$FULL_BRANCH_NAME"
75
+ else
76
+ log_info "Creating new branch and worktree..."
77
+ git worktree add -b "$FULL_BRANCH_NAME" "$WORKTREE_DIR" "$BASE_BRANCH"
78
+ fi
79
+
80
+ # 成功メッセージ
81
+ log_info "Worktree created successfully!"
82
+ echo ""
83
+ echo "Next steps:"
84
+ echo " 1. cd ${WORKTREE_DIR}"
85
+ echo " 2. Start Claude Code in this directory"
86
+ echo ""
87
+ echo "To remove this worktree later:"
88
+ echo " git worktree remove ${WORKTREE_DIR}"
89
+ echo " git branch -d ${FULL_BRANCH_NAME}"