stratum --help
Un agente de línea de comandos sobre un loop ReAct. Habla con cualquier API OpenAI-compatible (Ollama, llama.cpp, vLLM, LiteLLM, OpenAI) y no necesita ninguna cuenta propia.
Instalación
Requisitos
- Node.js 22 o superior.
- Un backend que exponga una API OpenAI-compatible: un servidor local (Ollama, llama.cpp, vLLM), un proxy (LiteLLM) o un servicio alojado.
Con npm
npm install -g stratum-cli
stratum --versionPara probarlo sin instalar nada:
npx stratum-cli chatPara actualizar, repite la instalación con stratum-cli@latest.
Desde el código fuente
git clone https://github.com/choruzo/CLI.git
cd CLI/stratum-cli
npm install
npm run build
npm link # deja el comando `stratum` en el PATH@xenova/transformers, better-sqlite3 y sqlite-vec. Si su
compilación nativa falla, Stratum sigue funcionando: el índice pasa a una búsqueda en JavaScript
y las decisiones guardadas no se pierden.
Configuración
1. Conectar un modelo
A un provider le bastan la URL base y la API key. El asistente pregunta por ambas:
stratum provider addO en una sola línea, sin asistente:
stratum provider add ollama --base-url http://localhost:11434/v1 --api-key ollama --default
stratum provider add hosted --base-url https://api.example.com/v1 --api-key-env EXAMPLE_API_KEY
Con --api-key-env el fichero guarda ${EXAMPLE_API_KEY}, no el valor: la
key se lee del entorno en cada arranque. --api-key la deja escrita en claro.
El modelo es opcional. Si no lo indicas, Stratum consulta GET /models:
chat abre el selector al arrancar y recuerda la elección; run e
init usan el único modelo expuesto y, si hay varios, se detienen y los listan para
que elijas con --model.
stratum provider list # providers y conectividad
stratum provider models # modelos que expone el provider activo
stratum provider models --set <id> # fija el modelo por defecto
stratum provider use <alias> # cambia el provider activo
stratum provider remove <alias>2. Dónde vive la configuración
| Fichero | Alcance |
|---|---|
~/.stratum/.stratumrc.json | Global: vale para todos los proyectos y es la que usa Desktop |
./.stratumrc.json | Proyecto: se fusiona sobre la global y gana en caso de conflicto |
Un fichero mínimo escrito a mano:
{
"provider": {
"default": "local-ollama",
"providers": {
"local-ollama": {
"type": "openai-compatible",
"baseUrl": "http://localhost:11434/v1",
"apiKey": "ollama",
"model": "qwen3.5:9b"
}
}
}
}También se puede leer y escribir clave a clave:
stratum config get provider.default
stratum config set agents.maxConcurrency 2/models cuando el servidor la declara; si no, puedes fijarla con
contextWindow en el provider o en models.<id>.contextWindow. Debe
reflejar el contexto real del servidor.
3. Secciones del fichero
| Sección | Qué controla |
|---|---|
provider | Providers, modelo por defecto, timeouts. El orden define el fallback automático |
memory | Rutas de STRATUM.md, decisiones e índice semántico; extracción automática |
tools | Confirmaciones, comandos vigilados, búsqueda web, auditoría, redacción de secretos, testCommand |
mcp | Servidores MCP y modo de arranque (lazy / eager) |
agents | Perfil por defecto y subagentes en paralelo (maxConcurrency) |
ssh | Inventario de hosts remotos |
environments | Reglas por entorno: confirmación, plan obligatorio, solo lectura |
session | Perfil de sesión (auto, code, infra, full) y retención de planes |
logging | Nivel y fichero de logs |
desktop | Preferencias de Stratum Desktop |
El ejemplo con todas las claves está en .stratumrc.json.example ↗.
Servidores MCP
Un servidor que declara package se instala una sola vez en
~/.stratum/mcp/ y arranca directo con Node, sin pasar por npx cada vez.
Sus tools aparecen como mcp__<servidor>__<tool>.
{
"mcp": {
"servers": [
{ "name": "filesystem", "package": "@modelcontextprotocol/server-filesystem@2025.8.21", "args": ["/home/user/projects"] },
{ "name": "otro", "command": "npx", "args": ["-y", "some-mcp-server@latest"] }
]
}
}stratum mcp install # instala los que declaran `package`
stratum mcp list # servidores y tools disponiblesHosts remotos (SSH)
Stratum lleva su propio cliente SSH y no usa el binario del sistema. El agente solo ve los
alias; las credenciales nunca pasan por el modelo. Sin sección ssh, las tools
remotas ni siquiera existen.
{
"ssh": {
"hosts": {
"bastion": { "host": "bastion.example.com", "user": "javi", "privateKey": "~/.ssh/id_ed25519" },
"prod-web": { "host": "192.168.1.10", "user": "javi", "privateKey": "~/.ssh/id_ed25519",
"jumpHost": "bastion", "confirmAll": true }
}
}
}stratum ssh list # inventario con conectividad en vivo
stratum ssh trust prod-web # muestra el fingerprint y lo confía
stratum ssh trust prod-web --force # tras reinstalar el host
La primera conexión enseña el fingerprint y pregunta; después se verifica en silencio. Si la
clave del host cambia, la conexión se aborta siempre. Las contraseñas y passphrases se pasan como
env:<VAR>.
Entornos
Las reglas por entorno solo afectan a lo que cambia algo: leer en producción nunca pregunta.
{
"environments": {
"prod": { "match": ["ssh:prod-*"], "tier": "production", "requirePlan": true },
"staging": { "match": ["ssh:stg-*"], "tier": "staging" },
"lab": { "match": ["ssh:dev-*"], "policy": "allow" }
}
}Uso
Primeros pasos
stratum init # explora el proyecto y escribe STRATUM.md
stratum chat # sesión interactiva
stratum run "Analiza ./src y resume la arquitectura"
stratum run --plan "Refactoriza el módulo de autenticación"
STRATUM.md es la memoria del proyecto: se carga en cada sesión. Hay otro global en
~/.stratum/STRATUM.md para lo que vale en todos tus proyectos.
Modos de trabajo
| Comando | Para qué |
|---|---|
stratum chat | Conversación interactiva; guarda la sesión al cerrar cada turno |
stratum chat --resume <id> | Continúa una sesión guardada |
stratum run "<tarea>" | Una tarea y termina. Sirve para scripts y CI |
stratum run --plan "<tarea>" | Investiga, propone un plan, espera tu aprobación y lo ejecuta paso a paso. --yes lo aprueba sin preguntar |
stratum run --agent <perfil> | Usa un perfil como agente principal |
stratum run --delegate <perfil> | Entrega la tarea directamente a un subagente |
Opciones comunes de chat y run
| Opción | Efecto |
|---|---|
--provider <alias> · --model <id> | Provider y modelo solo para esta ejecución |
--read-only | Solo observación: no escribe ficheros y solo admite comandos de lectura |
--profile <nombre> · --code · --infra | Perfil de sesión: qué familia de tools ve el agente |
--allow-destructive · --deny-destructive | Solo en run: aprueba o deniega las operaciones destructivas sin preguntar |
--debug · --log-level <nivel> | Logs detallados |
chat se confirman una a una. En
run se pregunta por terminal y, sin terminal interactivo (CI), se deniegan. Algunas
guardas no se pueden levantar con ningún flag: rm -rf sobre la raíz, lectura de
claves privadas o los comandos marcados como block.
Comandos dentro del chat
Escribe / para abrir la paleta, con autocompletado por Tab.
| Comando | Qué hace |
|---|---|
/help | Lista todos los comandos |
/init | Genera o actualiza STRATUM.md |
/plan <tarea> | Planifica, pide aprobación y ejecuta |
/model · /provider <alias> | Cambia de modelo o de provider en la sesión |
/config_provider | Edita el provider activo y lo guarda |
/agents · /agent <perfil> · /agent off | Lista los perfiles y activa uno como agente principal |
@perfil <tarea> | Encarga la tarea a un subagente |
/subagents | Inspecciona lo que hizo cada subagente |
/readonly · /profile · /env | Modo solo lectura, perfil de sesión y entornos definidos |
/memory show|list|search|forget | Memoria del proyecto y decisiones guardadas |
/context · /compact · /clear | Uso del contexto, compresión inmediata y vaciado de la conversación |
/changes · /todo | Cambios del árbol de trabajo y panel de tareas |
/tools · /mcp reload | Tools disponibles y reinicio de los servidores MCP |
/sessions list|resume|delete | Sesiones guardadas, sin salir del chat |
/config get|set | Lee o cambia una clave de configuración |
/debug | Muestra el razonamiento completo del modelo |
/quit | Guarda y sale |
Atajos de teclado
| Tecla | Acción |
|---|---|
| ↑ ↓ | Historial de mensajes enviados |
| Tab · Space | Recorre los bloques de tools y despliega el seleccionado |
| Ctrl+L | Vacía la conversación (igual que /clear) |
| Ctrl+U | Borra lo escrito |
| Ctrl+T | Pliega o despliega el panel de tareas |
Perfiles de agente y skills
Un perfil es un fichero markdown con frontmatter en .stratum/agents/<nombre>.md
(proyecto) o ~/.stratum/agents/ (global): describe para qué sirve, qué tools puede
usar y su prompt. Las skills son instrucciones de tarea en
.stratum/skills/<nombre>/SKILL.md; el agente ve su índice y lee el cuerpo solo
cuando lo necesita.
stratum agents list # perfiles válidos e inválidos, con su origenSesiones, memoria y logs
stratum sessions list
stratum sessions resume <id>
stratum sessions prune --older 30d
stratum memory list
stratum memory search "por qué elegimos sqlite"
stratum memory forget <id>
stratum logs path # para adjuntar a un bug report
stratum logs tail 100
Cada comando que ejecuta el agente, local o remoto, queda registrado en
~/.stratum/logs/exec-audit.jsonl.
open Stratum.app
Un asistente de chat de escritorio. Cada conversación tiene su propia carpeta de trabajo: adjuntas ficheros, el asistente los lee y deja los resultados para que los guardes. No ejecuta comandos en tu máquina.
Instalación
La app instalada es autónoma: no necesita Node ni Rust. Los instaladores están en las
releases de GitHub con etiqueta desktop-v…; la actual es la
0.3.0 (pre-release).
Windows
- Ejecuta el
.exe(o el.msisi lo despliegas con herramientas de empresa). - Necesita WebView2, que ya viene con Windows 11 y con las versiones actuales de Windows 10.
- Si el instalador no está firmado, SmartScreen mostrará un aviso: «Más información» → «Ejecutar de todas formas».
Linux
# Debian / Ubuntu
sudo apt install ./Stratum_0.3.0_amd64.deb
# Cualquier distribución
chmod +x Stratum_0.3.0_amd64.AppImage
./Stratum_0.3.0_amd64.AppImageComprobar la descarga
Cada release incluye SHA256SUMS.txt:
# Linux
sha256sum -c SHA256SUMS.txt --ignore-missing
# Windows (PowerShell): compara el resultado con la línea del fichero
Get-FileHash .\Stratum_0.3.0_x64-setup.exe -Algorithm SHA256Actualizaciones
Al arrancar, la app busca versiones nuevas en silencio y muestra un aviso con «Instalar y reiniciar» o «Más tarde». Nunca instala sin que lo pidas. Se puede desactivar en Ajustes → Sistema.
Desde el código fuente
Hacen falta Node 22 y Rust estable (en Windows, MSVC Build Tools; en Linux, las librerías de WebKitGTK).
git clone https://github.com/choruzo/CLI.git
cd CLI/stratum-cli && npm install
cd ../stratum-desktop && npm install
npm run sidecar:build # empaqueta el núcleo; repítelo si cambia stratum-cli
npm run tauri dev # ventana de desarrollo
npm run tauri build # instaladoresConfiguración
Primer arranque
Sin ningún modelo configurado, la app abre un asistente: URL del servidor, API key, nombre y
modelo (los lista consultando /models). Al terminar, la conversación queda lista
para escribir. Si eliges «Ahora no», un aviso con «Conectar un modelo» lo retoma más tarde.
~/.stratum/.stratumrc.json. Un provider que añadas con
stratum provider add aparece en Desktop, y al revés.
Ajustes
Se abren con Ctrl+,, con /settings o con el icono ⚙.
| Pestaña | Contenido |
|---|---|
| Providers | Alta, edición y prueba de conexión. Las API keys se muestran enmascaradas |
| Modelo activo | Modelo por defecto y cuántas conversaciones responden a la vez (2 por defecto; el resto espera en cola) |
| Búsqueda web | DuckDuckGo, Tavily o ambos |
| Memoria | Memoria global del asistente y decisiones guardadas |
| Espacios de trabajo | Carpeta raíz, límites de tamaño, retención y espacio ocupado |
| Sistema | Notificaciones, atajo global y actualizaciones |
| Avanzado | El resto del fichero de configuración |
Los cambios se aplican a cada conversación antes de su siguiente mensaje. La carpeta y los límites de los espacios de trabajo, y el logging, piden reiniciar el agente; la app lo ofrece.
Claves de desktop
{
"desktop": {
"maxConcurrentTurns": 2,
"notifications": { "enabled": true, "minSeconds": 10 },
"globalHotkey": "CommandOrControl+Shift+Space",
"updates": { "autoCheck": true },
"workspaces": {
"root": "~/.stratum/desktop/workspaces",
"maxFileMB": 25,
"maxWorkspaceMB": 250,
"compressAfterDays": 7,
"deleteAfterDays": 30
}
}
}Uso
Conversaciones
El panel lateral las agrupa por fecha. Se pueden buscar, renombrar, fijar y eliminar; el título se pone solo tras el primer mensaje. Varias conversaciones pueden trabajar a la vez: las que superan el límite quedan «en cola» y arrancan por orden.
Ficheros
- Adjuntar: con el botón o arrastrando al chat. Se copian a la carpeta
inputs/de la conversación. - Resultados: lo que el asistente genera aparece en
outputs/como tarjetas con «Abrir», «Guardar como…» y vista previa. - Descargar todo: un
.zipcon los ficheros de la conversación. - El asistente solo puede leer y escribir dentro de esa carpeta. Por defecto, 25 MB por fichero y 250 MB por conversación.
0 los desactiva.
Comandos
| Comando | Qué hace |
|---|---|
/new | Empieza una conversación nueva |
/clear | Vacía la conversación; sus ficheros se conservan |
/compact | Comprime el contexto ahora |
/model [modelo] | Ve o cambia el modelo de esta conversación |
/memory | Ve y edita la memoria global |
/settings | Abre Ajustes |
Atajos de teclado
| Tecla | Acción |
|---|---|
| Ctrl+N | Nueva conversación |
| Ctrl+K | Buscar conversaciones |
| Ctrl+B | Plegar el panel lateral |
| Ctrl+L | Vaciar la conversación (pide confirmación) |
| Ctrl+, | Ajustes |
| Esc | Detener la respuesta en curso |
| Ctrl+Shift+Space | Atajo global: trae la ventana al frente desde cualquier aplicación (configurable) |
Confirmaciones y avisos
- Antes de una operación que modifica ficheros de forma destructiva, el asistente pregunta. Sin respuesta en 5 minutos, se deniega.
- Si una respuesta tarda más de 10 segundos y la ventana no está a la vista, llega una notificación del sistema al terminar.
- El razonamiento del modelo se muestra plegado («Razonó 12 s») y se despliega al pulsarlo.
Dónde se guardan los datos
| Ruta | Contenido |
|---|---|
~/.stratum/.stratumrc.json | Configuración (compartida con la CLI) |
~/.stratum/desktop/conversations/ | Título y mensajes visibles de cada conversación |
~/.stratum/desktop/workspaces/ | Ficheros de cada conversación |
~/.stratum/desktop/memory/ | Memoria del asistente, separada de la de cualquier proyecto |
stratum doctor
Lo que más se repite al empezar.
«Config error» al arrancar
El mensaje indica el fichero, la línea y la clave que falla. Si el error es de JSON, revisa comas y comillas; si es de validación, compara la clave con el ejemplo ↗. Recuerda que el fichero del proyecto se fusiona sobre el global.
run se detiene listando varios modelos
El provider no tiene modelo fijado y el servidor expone más de uno. Elige con
--model <id> o déjalo fijo con stratum provider models --set <id>.
El provider no responde o da 401
Comprueba la conectividad con stratum provider list. Si la key se guardó como
${VAR}, la variable tiene que existir en el entorno desde el que lanzas Stratum;
si no, se sustituye por vacío y se avisa al arrancar. La URL base debe incluir /v1.
La barra de estado muestra Σ n/d
El servidor no devuelve el consumo de tokens. Stratum no lo estima: el resto funciona igual y los límites se controlan por iteraciones y tiempo.
El agente pierde el hilo en conversaciones largas
Suele ser una ventana de contexto mal declarada. Mira el uso real con /context y
fija contextWindow con el valor con el que arrancaste el servidor.
Una conexión SSH se aborta por la clave del host
La clave guardada no coincide con la que presenta el servidor. Si el host se reinstaló, confía
la nueva con stratum ssh trust <alias> --force. Si no esperabas el cambio, no
la aceptes.
Desktop: «el agente no arranca»
La pantalla de fallo muestra el motivo y las últimas líneas del log, con «Reintentar» y «Ver logs». Si el problema es de configuración, «Abrir ajustes» permite corregirla sin salir.
Desktop en Linux: el atajo global no funciona
El atajo global necesita X11 (o XWayland). En una sesión Wayland nativa el registro falla y Ajustes → Sistema lo indica. Si otra aplicación ya usa la combinación, elige otra.
Desktop: los ficheros de una conversación aparecen como «caducado»
Pasó el plazo de borrado de la retención. El texto de la conversación sigue ahí, pero los ficheros no se pueden recuperar; vuelve a adjuntarlos.
¿No está aquí? Abre una incidencia en
github.com/choruzo/CLI/issues ↗
y adjunta la salida de stratum logs tail.