@@ -110,12 +110,10 @@ resource "coder_script" "claude_code" {
110110 #!/bin/bash
111111 set -e
112112
113- # Function to check if a command exists
114113 command_exists() {
115114 command -v "$1" >/dev/null 2>&1
116115 }
117116
118- # Function to install tmux if needed
119117 install_tmux() {
120118 echo "Installing tmux..."
121119 if command_exists apt-get; then
@@ -134,7 +132,6 @@ resource "coder_script" "claude_code" {
134132 fi
135133 }
136134
137- # Check if the specified folder exists
138135 if [ ! -d "${ var . folder } " ]; then
139136 echo "Warning: The specified folder '${ var . folder } ' does not exist."
140137 echo "Creating the folder..."
@@ -143,23 +140,18 @@ resource "coder_script" "claude_code" {
143140 mkdir -p "${ var . folder } "
144141 echo "Folder created successfully."
145142 fi
146-
147- # Run pre-install script if provided
148143 if [ -n "${ local . encoded_pre_install_script } " ]; then
149144 echo "Running pre-install script..."
150145 echo "${ local . encoded_pre_install_script } " | base64 -d > /tmp/pre_install.sh
151146 chmod +x /tmp/pre_install.sh
152147 /tmp/pre_install.sh
153148 fi
154149
155- # Install Claude Code if enabled
156150 if [ "${ var . install_claude_code } " = "true" ]; then
157- # Check if npm is available, if not try to install Node.js using NVM
158151 if ! command_exists npm; then
159152 echo "npm not found, checking for Node.js installation..."
160153 if ! command_exists node; then
161154 echo "Node.js not found, installing Node.js via NVM..."
162- # Install NVM
163155 export NVM_DIR="$HOME/.nvm"
164156 if [ ! -d "$NVM_DIR" ]; then
165157 mkdir -p "$NVM_DIR"
@@ -169,7 +161,6 @@ resource "coder_script" "claude_code" {
169161 [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
170162 fi
171163
172- # Install Node.js LTS version
173164 nvm install --lts
174165 nvm use --lts
175166 nvm alias default node
@@ -190,40 +181,32 @@ resource "coder_script" "claude_code" {
190181 coder exp mcp configure claude-code ${ var . folder }
191182 fi
192183
193- # Run post-install script if provided
194184 if [ -n "${ local . encoded_post_install_script } " ]; then
195185 echo "Running post-install script..."
196186 echo "${ local . encoded_post_install_script } " | base64 -d > /tmp/post_install.sh
197187 chmod +x /tmp/post_install.sh
198188 /tmp/post_install.sh
199189 fi
200190
201- # Handle terminal multiplexer selection (tmux or screen)
202191 if [ "${ var . experiment_use_tmux } " = "true" ] && [ "${ var . experiment_use_screen } " = "true" ]; then
203192 echo "Error: Both experiment_use_tmux and experiment_use_screen cannot be true simultaneously."
204193 echo "Please set only one of them to true."
205194 exit 1
206195 fi
207196
208- # Validate session persistence requirements
209197 if [ "${ var . experiment_tmux_session_persistence } " = "true" ] && [ "${ var . experiment_use_tmux } " != "true" ]; then
210198 echo "Error: Session persistence requires tmux to be enabled."
211199 echo "Please set experiment_use_tmux = true when using session persistence."
212200 exit 1
213201 fi
214202
215- # Install and configure tmux if enabled
216203 if [ "${ var . experiment_use_tmux } " = "true" ]; then
217- # Install tmux if not present
218204 if ! command_exists tmux; then
219205 install_tmux
220206 fi
221207
222- # Configure tmux session persistence if enabled
223208 if [ "${ var . experiment_tmux_session_persistence } " = "true" ]; then
224209 echo "Setting up tmux session persistence..."
225-
226- # Check and install git if needed
227210 if ! command_exists git; then
228211 echo "Git not found, installing git..."
229212 if command_exists apt-get; then
@@ -243,28 +226,27 @@ resource "coder_script" "claude_code" {
243226 fi
244227 fi
245228
246- # Install TPM and plugins
247229 mkdir -p ~/.tmux/plugins
248230 if [ ! -d ~/.tmux/plugins/tpm ]; then
249231 git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
250232 fi
251233
252- # Configure .tmux.conf for persistence
253234 cat > ~/.tmux.conf << EOF
254235# Claude Code tmux persistence configuration
255236set -g @plugin 'tmux-plugins/tmux-resurrect'
256237set -g @plugin 'tmux-plugins/tmux-continuum'
257238
258239# Configure session persistence
259240set -g @resurrect-processes 'claude'
241+ set -g @resurrect-capture-pane-contents 'on'
260242set -g @continuum-restore 'on'
261243set -g @continuum-save-interval '${ var . experiment_tmux_session_save_interval } '
244+ set -g @continuum-boot 'on'
262245
263246# Initialize plugin manager
264247run '~/.tmux/plugins/tpm/tpm'
265248EOF
266249
267- # Install plugins
268250 ~/.tmux/plugins/tpm/scripts/install_plugins.sh
269251 fi
270252
@@ -273,25 +255,33 @@ EOF
273255 export LANG=en_US.UTF-8
274256 export LC_ALL=en_US.UTF-8
275257
276- # Create or attach to session (persistence handles restoration automatically)
277- if ! tmux has-session -t claude-code 2>/dev/null; then
278- tmux new-session -d -s claude-code -c ${ var . folder } "claude --dangerously-skip-permissions \"$CODER_MCP_CLAUDE_TASK_PROMPT\""
258+ if [ "${ var . experiment_tmux_session_persistence } " = "true" ]; then
259+ sleep 3
260+
261+ if tmux has-session -t claude-code 2>/dev/null; then
262+ # Existing session - only start Claude if not running (no prompt)
263+ if ! tmux list-panes -t claude-code -F '#{pane_current_command}' | grep -q "claude"; then
264+ tmux send-keys -t claude-code "cd ${ var . folder } && claude --dangerously-skip-permissions" C-m
265+ fi
266+ else
267+ # New session - include prompt
268+ tmux new-session -d -s claude-code -c ${ var . folder } "claude --dangerously-skip-permissions \"$CODER_MCP_CLAUDE_TASK_PROMPT\""
269+ fi
270+ else
271+ if ! tmux has-session -t claude-code 2>/dev/null; then
272+ tmux new-session -d -s claude-code -c ${ var . folder } "claude --dangerously-skip-permissions \"$CODER_MCP_CLAUDE_TASK_PROMPT\""
273+ fi
279274 fi
280275 fi
281276
282- # Run with screen if enabled
283277 if [ "${ var . experiment_use_screen } " = "true" ]; then
284278 echo "Running Claude Code in the background..."
285-
286- # Check if screen is installed
287279 if ! command_exists screen; then
288280 echo "Error: screen is not installed. Please install screen manually."
289281 exit 1
290282 fi
291283
292284 touch "$HOME/.claude-code.log"
293-
294- # Ensure the screenrc exists
295285 if [ ! -f "$HOME/.screenrc" ]; then
296286 echo "Creating ~/.screenrc and adding multiuser settings..." | tee -a "$HOME/.claude-code.log"
297287 echo -e "multiuser on\nacladd $(whoami)" > "$HOME/.screenrc"
316306 exec bash
317307 '
318308 else
319- # Check if claude is installed before running
320309 if ! command_exists claude; then
321310 echo "Error: Claude Code is not installed. Please enable install_claude_code or install it manually."
322311 exit 1
@@ -343,7 +332,11 @@ resource "coder_app" "claude_code" {
343332 tmux attach-session -t claude-code
344333 else
345334 echo "Starting a new Claude Code tmux session." | tee -a "$HOME/.claude-code.log"
346- tmux new-session -s claude-code -c ${ var . folder } "claude --dangerously-skip-permissions | tee -a \"$HOME/.claude-code.log\"; exec bash"
335+ if [ -n "$CODER_MCP_CLAUDE_TASK_PROMPT" ]; then
336+ tmux new-session -s claude-code -c ${ var . folder } "claude --dangerously-skip-permissions \"$CODER_MCP_CLAUDE_TASK_PROMPT\" | tee -a \"$HOME/.claude-code.log\"; exec bash"
337+ else
338+ tmux new-session -s claude-code -c ${ var . folder } "claude --dangerously-skip-permissions | tee -a \"$HOME/.claude-code.log\"; exec bash"
339+ fi
347340 fi
348341 elif [ "${ var . experiment_use_screen } " = "true" ]; then
349342 if screen -list | grep -q "claude-code"; then
0 commit comments