# Plan: skill `spark-ssh` para conectarse y ejecutar comandos en spark vía SSH ## Contexto El usuario quiere que Claude Code pueda operar directamente sobre su servidor "spark" (<>) ejecutando comandos remotos vía SSH, sin tener que pedir manualmente la contraseña cada vez. Verificado en el entorno actual: - `~/.ssh/config` ya tiene un host `spark` configurado (`HostName <>`, `User aleleba`), pero la autenticación falla por key (`ssh -o BatchMode=yes spark` → `Permission denied (publickey,password)`) — spark solo acepta password. - La variable de entorno `SPARK_PASSWORD` ya existe en este entorno de desarrollo. - `sshpass` **no está instalado**, pero está disponible vía `apt` (`sshpass 1.09-1`) y hay sudo sin password (`sudo -n true` → OK), así que se puede instalar como parte del preflight de la skill. - `/mnt/docker-nas` no existe en este entorno de desarrollo — es un mount NFS que solo existe **del lado de spark**. Dentro de él, `/mnt/docker-nas/projects` es el mismo storage que `~/projects` aquí. Es decir: un proyecto en `~/projects/` en este entorno de desarrollo es exactamente `/mnt/docker-nas/projects/` visto desde spark (mismo filesystem compartido vía NAS). El objetivo es crear una skill global (en `~/.claude/skills/`, siguiendo el patrón de las skills existentes como `web-ui-test`, `aleleba-pr`) que documente el patrón de conexión y las convenciones de seguridad/rutas para que Claude la use de forma consistente cada vez que el usuario pida ejecutar algo en spark. ## Archivo a crear `~/.claude/skills/spark-ssh/SKILL.md` ## Contenido de la skill **Frontmatter:** - `name: spark-ssh` - `description`: explica que conecta a spark por SSH con password vía `SPARK_PASSWORD`, y que traduce rutas entre `/mnt/docker-nas/projects` (en spark) y `~/projects` (en este entorno). Incluye triggers en español: "conéctate a spark", "ejecuta esto en spark", "corre este comando en spark", "revisa spark". - `effort: low` - `argument-hint: "[comando o tarea a ejecutar en spark]"` **Cuerpo (en español, consistente con el resto de skills del usuario):** 1. **Contexto fijo**: host `spark` ya está en `~/.ssh/config`; autenticación es por password (no key); password vive en `$SPARK_PASSWORD`; mapeo de rutas `~/projects/` ↔ `/mnt/docker-nas/projects/`. 2. **Preflight — instalar `sshpass` si falta** (idempotente): ```bash which sshpass >/dev/null 2>&1 || sudo apt-get install -y sshpass ``` 3. **Ejecutar un comando remoto**, usando siempre `sshpass -e` (nunca `-p`, que expone la password en `ps`): ```bash SSHPASS="$SPARK_PASSWORD" sshpass -e ssh spark '' ``` Para comandos multilínea o con comillas complejas, usar heredoc remoto vía `ssh spark bash -s <<'EOF'`. 4. **Regla de rutas compartidas**: si el comando remoto opera sobre un proyecto que también existe localmente en `~/projects/`, la ruta equivalente en spark es `/mnt/docker-nas/projects/`. Para *editar* código de esos proyectos, preferir las tools locales (Read/Edit) ya que es el mismo filesystem; usar SSH solo para **ejecutar** (builds, procesos, comandos específicos del entorno/hardware de spark). 5. **Seguridad**: nunca imprimir/loggear `$SPARK_PASSWORD`; aplicar las reglas generales de confirmación antes de comandos destructivos ejecutados en spark (rm -rf, docker rm, kill, etc.). ## Verificación Después de crear el archivo: ```bash which sshpass >/dev/null 2>&1 || sudo apt-get install -y sshpass SSHPASS="$SPARK_PASSWORD" sshpass -e ssh spark 'hostname && whoami && ls /mnt/docker-nas/projects | head -5' ``` Confirmar que devuelve el hostname de spark y que `/mnt/docker-nas/projects` lista el mismo contenido que `~/projects` localmente.