Skip to content

ADR 0007 — CLI ​

  • Estado: aceptada
  • Fecha: 2026-09-25

Decisiones ​

  1. Sin framework de CLI. Argumentos con node:util parseArgs (modo estricto: una opción desconocida es un error de uso). Cada comando es un Command (nombre, uso, opciones, ayuda, run) que solo llama a la API pública de tenancy.
  2. Configuración con jiti. tenancy.config.(ts|mts|cts|js|mjs|cjs) se carga sin compilar. Se acepta export default defineConfig(...) (recomendado: el CLI crea la instancia con su propio logger), una instancia o export const tenancy. Se usa una sola caché de módulos, así no aparecen dos copias del núcleo en el mismo proceso.
  3. Robustez ante copias duplicadas del paquete. El núcleo reconoce Tenant y TenantId por estructura (isTenant, toTenantId), no por instanceof: funciona aunque ESM y CJS, o dos versiones, convivan.
  4. Salida y logs separados. stdout lleva la salida del comando (texto o --json); stderr los errores legibles y los logs de nivel error. --log-file / TENANCY_LOG_FILE guarda todos los logs JSON con el formato de ADR 0005; --verbose los muestra todos. Los errores del paquete no se registran dos veces: ya los registró la operación que falló, con su tenant.
  5. Códigos de salida: 0 bien, 1 falló (también si falló en algún tenant), 2 uso o configuración inválidos.
  6. Operaciones peligrosas confirmadas. delete pide escribir el id del tenant; fuera de una terminal exige --force. Las contraseñas de servers:add se leen de una variable de entorno, no de la línea de comandos.
  7. Tests con los paquetes compilados. Los tests del CLI cargan @tenancy-node/* desde dist (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 test compila antes (Turborepo, con caché).

Consecuencias ​

  • El CLI no tiene dependencias salvo jiti y el núcleo.
  • Los comandos de fases siguientes (worker, outbox:relay, admin:serve, schema) se agregan como nuevos Command sin tocar los existentes.

Publicado bajo la licencia MIT.