#!/bin/bash
# 端末とtmuxセッションの自動起動(修正版)
# ログ関数の定義
log_info() {
echo "[INFO] $*" >&2
}
log_error() {
echo "[ERROR] $*" >&2
}
log_success() {
echo "[SUCCESS] $*" >&2
}
# サポートされる端末エミュレータを検出
detect_terminal() {
if command -v gnome-terminal >/dev/null 2>&1; then
echo "gnome-terminal"
elif command -v konsole >/dev/null 2>&1; then
echo "konsole"
elif command -v xterm >/dev/null 2>&1; then
echo "xterm"
elif command -v alacritty >/dev/null 2>&1; then
echo "alacritty"
elif command -v kitty >/dev/null 2>&1; then
echo "kitty"
elif command -v wezterm >/dev/null 2>&1; then
echo "wezterm"
elif [ "$(uname)" = "Darwin" ]; then
echo "terminal"
else
echo "none"
fi
}
# 新しい端末でtmuxセッションを起動
launch_terminal_with_tmux() {
local session_name="$1"
local worker_count="$2"
local working_dir="${3:-$(pwd)}"
local terminal_type=$(detect_terminal)
log_info "端末タイプ: $terminal_type"
log_info "tmuxセッション作成: $session_name (ワーカー数: $worker_count)"
# tmuxセッションが既に存在する場合は削除
tmux kill-session -t "$session_name" 2>/dev/null || true
# tmuxコマンドを直接実行
local tmux_cmd="tmux new-session -d -s '$session_name' -c '$working_dir' && "
# Boss + Worker構成の場合
if [ "$worker_count" -gt 1 ]; then
tmux_cmd+="tmux rename-window -t '${session_name}:0' 'Boss' && "
# Worker用のペインを追加(Boss + worker_count個のペインを作成)
for i in $(seq 1 $worker_count); do
tmux_cmd+="tmux split-window -t '${session_name}:0' -h -c '$working_dir' && "
tmux_cmd+="tmux select-layout -t '${session_name}:0' even-horizontal && "
done
# ペインにラベルを設定
tmux_cmd+="tmux select-pane -t '${session_name}:0.0' -T 'Boss' && "
for i in $(seq 1 $worker_count); do
tmux_cmd+="tmux select-pane -t '${session_name}:0.$i' -T 'Worker$i' && "
done
else
# Worker1つのみの場合
tmux_cmd+="tmux rename-window -t '${session_name}:0' 'Worker1' && "
tmux_cmd+="tmux select-pane -t '${session_name}:0.0' -T 'Worker1' && "
fi
# ステータスバー設定
tmux_cmd+="tmux set-option -t '$session_name' status-left '[Parallel] ' && "
tmux_cmd+="tmux set-option -t '$session_name' status-right '#[fg=green]Workers: $worker_count #[default]| %H:%M' && "
# ペインタイトル表示設定
tmux_cmd+="tmux set-option -t '$session_name' pane-border-status top && "
tmux_cmd+="tmux set-option -t '$session_name' pane-border-format ' #{pane_index}: #{pane_title} ' && "
tmux_cmd+="tmux set-option -t '$session_name' pane-border-style fg=blue && "
tmux_cmd+="tmux set-option -t '$session_name' pane-active-border-style fg=red,bold && "
# 最後にアタッチ
tmux_cmd+="tmux attach-session -t '$session_name'"
# 端末タイプに応じて起動
case "$terminal_type" in
"gnome-terminal")
gnome-terminal --title="Parallel Implementation: $session_name" \
--geometry=200x50 \
-- bash -c "$tmux_cmd"
;;
"konsole")
konsole --title "Parallel Implementation: $session_name" \
--geometry 200x50 \
-e bash -c "$tmux_cmd"
;;
"xterm")
xterm -title "Parallel Implementation: $session_name" \
-geometry 200x50 \
-e bash -c "$tmux_cmd" &
;;
"alacritty")
alacritty --title "Parallel Implementation: $session_name" \
--dimensions 200 50 \
-e bash -c "$tmux_cmd" &
;;
"kitty")
kitty --title "Parallel Implementation: $session_name" \
--override initial_window_width=200 \
--override initial_window_height=50 \
bash -c "$tmux_cmd" &
;;
"wezterm")
wezterm start --cwd "$working_dir" \
-- bash -c "$tmux_cmd" &
;;
"terminal")
# macOS Terminal.app
osascript <<EOF
tell application "Terminal"
do script "$tmux_cmd"
set current settings of front window to settings set "Pro"
set bounds of front window to {100, 100, 1400, 900}
end tell
EOF
;;
*)
log_error "サポートされている端末が見つかりません"
return 1
;;
esac
# tmuxセッションが起動するまで待機
local max_wait=30
local count=0
while [ $count -lt $max_wait ]; do
if tmux has-session -t "$session_name" 2>/dev/null; then
log_success "tmuxセッション起動完了: $session_name"
return 0
fi
sleep 1
count=$((count + 1))
done
log_error "tmuxセッション起動タイムアウト"
return 1
}
# 並列実装用の専用セッションを作成
create_parallel_session() {
local base_name="$1"
local worker_count="$2"
local working_dir="${3:-$(pwd)}"
local timestamp=$(date +%Y%m%d_%H%M%S)
local random_suffix=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 4 | head -n 1)
local session_name="parallel_${base_name}_${timestamp}_${random_suffix}"
log_info "並列セッション作成: $session_name (作業ディレクトリ: $working_dir)"
# 新しい端末でtmuxセッションを起動
if launch_terminal_with_tmux "$session_name" "$worker_count" "$working_dir"; then
echo "$session_name"
return 0
else
return 1
fi
}
# メイン処理
main() {
local command="${1:-}"
shift || true
case "$command" in
"launch")
launch_terminal_with_tmux "$@"
;;
"create-parallel")
create_parallel_session "$@"
;;
"detect")
detect_terminal
;;
*)
echo "使用法: $0 {launch|create-parallel|detect} [options]"
echo ""
echo "コマンド:"
echo " launch <session_name> <worker_count> [working_dir]"
echo " create-parallel <base_name> <worker_count>"
echo " detect"
exit 1
;;
esac
}
# 実行
main "$@"