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.
- ensemble/__init__.py +5 -0
- ensemble/ack.py +86 -0
- ensemble/cli.py +31 -0
- ensemble/commands/__init__.py +1 -0
- ensemble/commands/_init_impl.py +208 -0
- ensemble/commands/_launch_impl.py +217 -0
- ensemble/commands/init.py +35 -0
- ensemble/commands/launch.py +32 -0
- ensemble/config.py +218 -0
- ensemble/dashboard.py +168 -0
- ensemble/helpers.py +79 -0
- ensemble/lock.py +77 -0
- ensemble/logger.py +80 -0
- ensemble/notes.py +221 -0
- ensemble/queue.py +166 -0
- ensemble/templates/__init__.py +75 -0
- ensemble/templates/agents/conductor.md +239 -0
- ensemble/templates/agents/dispatch.md +351 -0
- ensemble/templates/agents/integrator.md +138 -0
- ensemble/templates/agents/learner.md +133 -0
- ensemble/templates/agents/reviewer.md +84 -0
- ensemble/templates/agents/security-reviewer.md +136 -0
- ensemble/templates/agents/worker.md +184 -0
- ensemble/templates/commands/go-light.md +49 -0
- ensemble/templates/commands/go.md +101 -0
- ensemble/templates/commands/improve.md +116 -0
- ensemble/templates/commands/review.md +74 -0
- ensemble/templates/commands/status.md +56 -0
- ensemble/templates/scripts/dashboard-update.sh +78 -0
- ensemble/templates/scripts/launch.sh +137 -0
- ensemble/templates/scripts/pane-setup.sh +111 -0
- ensemble/templates/scripts/setup.sh +163 -0
- ensemble/templates/scripts/worktree-create.sh +89 -0
- ensemble/templates/scripts/worktree-merge.sh +194 -0
- ensemble/templates/workflows/default.yaml +78 -0
- ensemble/templates/workflows/heavy.yaml +149 -0
- ensemble/templates/workflows/simple.yaml +41 -0
- ensemble/templates/workflows/worktree.yaml +202 -0
- ensemble/utils.py +60 -0
- ensemble/workflow.py +127 -0
- ensemble/worktree.py +322 -0
- ensemble_claude-0.3.0.dist-info/METADATA +144 -0
- ensemble_claude-0.3.0.dist-info/RECORD +46 -0
- ensemble_claude-0.3.0.dist-info/WHEEL +4 -0
- ensemble_claude-0.3.0.dist-info/entry_points.txt +2 -0
- 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}"
|