Initial commit
This commit is contained in:
224
tools/create-session.sh
Executable file
224
tools/create-session.sh
Executable file
@@ -0,0 +1,224 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user