@@ -63,6 +63,45 @@ fi
63install -d -m 700 -o "$SSH_USER" -g "$SSH_USER" "/home/${SSH_USER}/.ssh"
63install -d -m 700 -o "$SSH_USER" -g "$SSH_USER" "/home/${SSH_USER}/.ssh"
64install -m 600 -o "$SSH_USER" -g "$SSH_USER" "$KEY_PATH" "/home/${SSH_USER}/.ssh/authorized_keys"
64install -m 600 -o "$SSH_USER" -g "$SSH_USER" "$KEY_PATH" "/home/${SSH_USER}/.ssh/authorized_keys"
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}"
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"
75+if [ ! -e "${USER_HOME}/.claude" ]; then
76+ ln -s /usr/local/claude "${USER_HOME}/.claude"
78+chown -h "${SSH_USER}:${SSH_USER}" "${USER_HOME}/.codex" "${USER_HOME}/.claude" 2>/dev/null || true
81+curl https://mise.run | sh
82+echo 'eval "$(~/.local/bin/mise activate bash)"' >> "${USER_HOME}/.bashrc"
84+export PATH="${USER_HOME}/.local/bin:$PATH"
86+mkdir -p "${USER_HOME}/.config/mise"
88+cat > "${USER_HOME}/.config/mise/config.toml" <<MISE
90+ # Always use the venv created by uv, if available in directory
91+ python.uv_venv_auto = true
93+ idiomatic_version_file_enable_tools = ["rust"]
98+ "npm:@openai/codex" = "latest"
99+ "npm:@anthropic-ai/claude-code" = "latest"
102+touch "${USER_HOME}/.config/mise/mise.lock"
66# 3) start ssh (don't swallow failures)
105# 3) start ssh (don't swallow failures)
67# If ssh is already active, don't force start/restart.
106# If ssh is already active, don't force start/restart.
68if ! systemctl is-active --quiet ssh; then
107if ! systemctl is-active --quiet ssh; then