@@ -63,6 +63,45 @@ fi
6363install -d -m 700 -o "$SSH_USER" -g "$SSH_USER" "/home/${SSH_USER}/.ssh"
6464install -m 600 -o "$SSH_USER" -g "$SSH_USER" "$KEY_PATH" "/home/${SSH_USER}/.ssh/authorized_keys"
6565
66+# Ensure codex/claude are visible in the user's HOME
67+USER_HOME="$(getent passwd "$SSH_USER" | cut -d: -f6 2>/dev/null || true)"
68+if [ -z "$USER_HOME" ]; then
69+ USER_HOME="/home/${SSH_USER}"
70+fi
71+install -d -m 755 /usr/local/codex /usr/local/claude
72+if [ ! -e "${USER_HOME}/.codex" ]; then
73+ ln -s /usr/local/codex "${USER_HOME}/.codex"
74+fi
75+if [ ! -e "${USER_HOME}/.claude" ]; then
76+ ln -s /usr/local/claude "${USER_HOME}/.claude"
77+fi
78+chown -h "${SSH_USER}:${SSH_USER}" "${USER_HOME}/.codex" "${USER_HOME}/.claude" 2>/dev/null || true
79+
80+# Install Mise
81+curl https://mise.run | sh
82+echo 'eval "$(~/.local/bin/mise activate bash)"' >> "${USER_HOME}/.bashrc"
83+
84+export PATH="${USER_HOME}/.local/bin:$PATH"
85+
86+mkdir -p "${USER_HOME}/.config/mise"
87+
88+cat > "${USER_HOME}/.config/mise/config.toml" <<MISE
89+ [settings]
90+ # Always use the venv created by uv, if available in directory
91+ python.uv_venv_auto = true
92+ experimental = true
93+ idiomatic_version_file_enable_tools = ["rust"]
94+
95+ [tools]
96+ uv = "0.9.25"
97+ node = "24.13.0"
98+ "npm:@openai/codex" = "latest"
99+ "npm:@anthropic-ai/claude-code" = "latest"
100+MISE
101+
102+touch "${USER_HOME}/.config/mise/mise.lock"
103+mise install
104+
66105# 3) start ssh (don't swallow failures)
67106# If ssh is already active, don't force start/restart.
68107if ! systemctl is-active --quiet ssh; then