ADR 0007 — CLI
- Estado: aceptada
- Fecha: 2026-09-25
Decisiones
- Sin framework de CLI. Argumentos con
node:utilparseArgs(modo estricto: una opción desconocida es un error de uso). Cada comando es unCommand(nombre, uso, opciones, ayuda,run) que solo llama a la API pública detenancy. - Configuración con jiti.
tenancy.config.(ts|mts|cts|js|mjs|cjs)se carga sin compilar. Se aceptaexport default defineConfig(...)(recomendado: el CLI crea la instancia con su propio logger), una instancia oexport const tenancy. Se usa una sola caché de módulos, así no aparecen dos copias del núcleo en el mismo proceso. - Robustez ante copias duplicadas del paquete. El núcleo reconoce
TenantyTenantIdpor estructura (isTenant,toTenantId), no porinstanceof: funciona aunque ESM y CJS, o dos versiones, convivan. - Salida y logs separados. stdout lleva la salida del comando (texto o
--json); stderr los errores legibles y los logs de nivelerror.--log-file/TENANCY_LOG_FILEguarda todos los logs JSON con el formato de ADR 0005;--verboselos muestra todos. Los errores del paquete no se registran dos veces: ya los registró la operación que falló, con su tenant. - Códigos de salida:
0bien,1falló (también si falló en algún tenant),2uso o configuración inválidos. - Operaciones peligrosas confirmadas.
deletepide escribir el id del tenant; fuera de una terminal exige--force. Las contraseñas deservers:addse leen de una variable de entorno, no de la línea de comandos. - Tests con los paquetes compilados. Los tests del CLI cargan
@tenancy-node/*desdedist(como el proyecto de un usuario), así prueban lo que se publica y no mezclan la cobertura de v8 con código transpilado por jiti.pnpm testcompila antes (Turborepo, con caché).
Consecuencias
- El CLI no tiene dependencias salvo
jitiy el núcleo. - Los comandos de fases siguientes (
worker,outbox:relay,admin:serve,schema) se agregan como nuevosCommandsin tocar los existentes.