Files
gh-dashed-claude-marketplac…/tools/create-session.sh
2025-11-29 18:17:58 +08:00

225 lines
6.2 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# create-session.sh - Create and register tmux sessions
#
# Creates a new tmux session and optionally registers it in the session registry.
# Supports launching different types of sessions (Python REPL, gdb, shell).
#
# Usage:
# ./create-session.sh -n <name> [options]
#
# Options:
# -n, --name Session name (required)
# -S, --socket Custom socket path (optional, uses default)
# -w, --window Window name (default: "shell")
# --python Launch Python REPL with PYTHON_BASIC_REPL=1
# --gdb Launch gdb
# --shell Launch shell (default)
# --no-register Don't add to registry
# -h, --help Show this help message
#
# Exit codes:
# 0 - Success
# 1 - Invalid arguments
# 2 - Session already exists
# 3 - Tmux command failed
# 4 - Registry operation failed
set -euo pipefail
# Get script directory to source registry library
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=lib/registry.sh
source "$SCRIPT_DIR/lib/registry.sh"
#------------------------------------------------------------------------------
# Configuration
#------------------------------------------------------------------------------
# Defaults
session_name=""
socket=""
window_name="shell"
session_type="shell"
launch_command="bash"
register_session=true
#------------------------------------------------------------------------------
# Functions
#------------------------------------------------------------------------------
usage() {
cat << EOF
Usage: $(basename "$0") -n <name> [options]
Create a new tmux session and optionally register it in the session registry.
Options:
-n, --name Session name (required)
-S, --socket Custom socket path (optional, uses default)
-w, --window Window name (default: "shell")
--python Launch Python REPL with PYTHON_BASIC_REPL=1
--gdb Launch gdb
--shell Launch shell (default)
--no-register Don't add to registry
-h, --help Show this help message
Session Types:
--shell Launches bash (default)
--python Launches Python REPL with PYTHON_BASIC_REPL=1
--gdb Launches gdb debugger
Examples:
# Create Python REPL session (auto-registered)
$(basename "$0") -n my-python --python
# Create session with custom socket
$(basename "$0") -n my-session -S /tmp/custom.sock --shell
# Create session without registering
$(basename "$0") -n temp-session --no-register
Exit codes:
0 - Success
1 - Invalid arguments
2 - Session already exists
3 - Tmux command failed
4 - Registry operation failed
EOF
}
#------------------------------------------------------------------------------
# Argument parsing
#------------------------------------------------------------------------------
if [[ $# -eq 0 ]]; then
usage
exit 1
fi
while [[ $# -gt 0 ]]; do
case "$1" in
-n|--name)
session_name="$2"
shift 2
;;
-S|--socket)
socket="$2"
shift 2
;;
-w|--window)
window_name="$2"
shift 2
;;
--python)
session_type="python-repl"
launch_command="PYTHON_BASIC_REPL=1 python3 -q"
shift
;;
--gdb)
session_type="debugger"
launch_command="gdb"
shift
;;
--shell)
session_type="shell"
launch_command="bash"
shift
;;
--no-register)
register_session=false
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "Error: Unknown option: $1" >&2
usage
exit 1
;;
esac
done
#------------------------------------------------------------------------------
# Validation
#------------------------------------------------------------------------------
if [[ -z "$session_name" ]]; then
echo "Error: Session name is required (use -n <name>)" >&2
usage
exit 1
fi
# Set default socket if not provided
if [[ -z "$socket" ]]; then
socket="$CLAUDE_TMUX_SOCKET_DIR/claude.sock"
fi
# Ensure socket directory exists
socket_dir="$(dirname "$socket")"
mkdir -p "$socket_dir"
#------------------------------------------------------------------------------
# Check if session already exists
#------------------------------------------------------------------------------
# Check in registry first
if [[ "$register_session" == true ]] && registry_session_exists "$session_name"; then
echo "Error: Session '$session_name' already exists in registry" >&2
echo "Use a different name or remove the existing session first" >&2
exit 2
fi
# Check if tmux session actually exists on this socket
if tmux -S "$socket" has-session -t "$session_name" 2>/dev/null; then
echo "Error: Tmux session '$session_name' already exists on socket $socket" >&2
echo "Use a different name or kill the existing session first" >&2
exit 2
fi
#------------------------------------------------------------------------------
# Create tmux session
#------------------------------------------------------------------------------
if ! tmux -S "$socket" new-session -d -s "$session_name" -n "$window_name" "$launch_command" 2>/dev/null; then
echo "Error: Failed to create tmux session '$session_name'" >&2
exit 3
fi
# Get the session PID
session_pid=$(tmux -S "$socket" display-message -p -t "$session_name" '#{pane_pid}' 2>/dev/null || echo "")
# Build target (session:window.pane)
target="$session_name:0.0"
#------------------------------------------------------------------------------
# Register session
#------------------------------------------------------------------------------
if [[ "$register_session" == true ]]; then
if ! registry_add_session "$session_name" "$socket" "$target" "$session_type" "$session_pid"; then
echo "Warning: Session created but failed to register in registry" >&2
# Don't fail completely, session was created successfully
fi
fi
#------------------------------------------------------------------------------
# Output session info as JSON
#------------------------------------------------------------------------------
cat << EOF
{
"name": "$session_name",
"socket": "$socket",
"target": "$target",
"type": "$session_type",
"pid": ${session_pid:-null},
"window": "$window_name",
"registered": $register_session
}
EOF
exit 0