Usar con agentes
CLI
La CLI tiene los mismos comandos que el MCP, con nombres en kebab-case. Sirve para scripts, integración continua y servidores sin interfaz gráfica.
Cómo obtenerla
| Dónde | Cómo se ejecuta |
|---|---|
| Imagen Docker | canvappen <comando> dentro del contenedor. Ver Imagen Docker |
| Código fuente | pnpm cli <comando> desde el repositorio, después de pnpm install y pnpm build |
Uso
canvappen <comando> [opciones]
canvappen help <comando|tema>
canvappen <comando> --help| Opción global | Efecto |
|---|---|
--json | Respuesta en JSON, para procesarla en scripts |
--help | Ayuda del comando |
--version | Versión de canvappen |
| Código de salida | Significado |
|---|---|
0 | Correcto |
1 | Error en la operación o archivo inválido |
2 | Uso incorrecto: comando u opción desconocidos, o falta un argumento |
Comandos
Leer el documento
inspectResumen de un .pen: frames raíz, variables, themes, librerías y componentesget-nodesNodos por id con sus hijos; opcionalmente con instancias, variables y posición calculadassearch-nodesBusca nodos por nombre, texto o tipolist-componentsComponentes del documento y de las librerías importadasget-variablesVariables con su valor resuelto y ejes de themeRevisar y mantener
Editar
Imágenes, fuentes y recursos
import-imageCopia una imagen a images/ junto al .pen y opcionalmente la insertaimport-fontCopia una fuente .ttf u .otf a fonts/ y la registra en el documentolocalizeDescarga las fuentes de Google Fonts y las imágenes remotas a fonts/ e images/ y actualiza el .penpermissionsPermisos de recursos remotos (Google Fonts, imágenes http) por documentoReferencia
inspect
Resumen del documentoSolo lecturaDevuelve la versión, la cantidad de nodos, los frames raíz con posición y tamaño, las variables, los themes, las librerías importadas y los componentes locales. Indica si el documento está abierto en la app canvappen.
canvappen inspect <path>Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
Ejemplos
Resumen de un diseño
canvappen inspect design.penRespuestaJSON con path, openInApp, version, nodeCount, roots, themes, variables, imports y components
get-nodes
Leer nodosSolo lecturaDevuelve nodos por id con sus hijos hasta 'depth'. Con resolve expande instancias (ref) y variables y agrega 'bounds' calculados (posición absoluta y tamaño). Sin ids devuelve los nodos raíz.
canvappen get-nodes <path> [--ids <ids>] [--depth <depth>] [--resolve]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--ids | lista de textos | Ids de nodos; para descendientes de instancias usa 'instancia/descendiente' |
--depth | entero | Profundidad de hijosde 0 a 20 · por defecto 2 |
--resolve | sí/no | Expandir instancias y variables y calcular boundspor defecto false |
Ejemplos
Leer un frame con dos niveles
canvappen get-nodes design.pen --ids Lg3BfCon posición calculada
canvappen get-nodes design.pen --ids Lg3Bf --resolveRespuestaJSON: lista de nodos
search-nodes
Buscar nodosSolo lecturaBusca nodos por nombre, contenido de texto o tipo. Devuelve id, tipo, nombre, ancestros y un fragmento del texto.
canvappen search-nodes <path> [--query <query>] [--type <type>] [--reusable-only] [--limit <limit>]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--query | texto | Texto a buscar en name y content, sin distinguir mayúsculas |
--type | texto | Filtrar por tipo de nodo (frame, text, ref…) |
--reusable-only | sí/no | Solo componentes (reusable)por defecto false |
--limit | entero | Máximo de resultadosde 1 a 500 · por defecto 50 |
Ejemplos
Buscar botones
canvappen search-nodes design.pen --query botónRespuestaJSON con count y results
list-components
Listar componentesSolo lecturaLista los componentes (reusable) del documento y de las librerías .lib.pen importadas, con el id que debe usarse en 'ref'.
canvappen list-components <path>Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
Ejemplos
Componentes disponibles
canvappen list-components design.penRespuestaJSON con libraries, count y components
get-variables
Variables y themesSolo lecturaDevuelve las variables (definición y valor resuelto) y los ejes de theme. Opcionalmente resuelve con una selección de theme.
canvappen get-variables <path> [--theme <theme>]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--theme | objeto | Selección de theme, por ejemplo {"mode":"dark"} (en la CLI: --theme mode=dark) |
Ejemplos
Variables en modo oscuro
canvappen get-variables design.pen --theme mode=darkRespuestaJSON con themes, theme y variables
validate
ValidarSolo lecturaValida el documento contra el schema 2.21 y reporta migraciones necesarias, normalizaciones y errores.
canvappen validate <path...>Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path...>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
Ejemplos
Validar un diseño
canvappen validate design.penValidar varios
canvappen validate *.penRespuestaJSON con valid, migratedFrom, warnings e issues. En la CLI el código de salida es 1 si algún archivo tiene errores
migrate
MigrarCrea archivosSolo CLIMuestra qué cambiaría al migrar a 2.21; con write escribe el archivo. El MCP no lo necesita porque siempre guarda en 2.21.
canvappen migrate <path...> [--write]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path...>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--write | sí/no | Escribir el archivo (escritura atómica)por defecto false |
Ejemplos
Migrar todos los diseños
canvappen migrate *.pen --writeRespuestaUn resultado por archivo
format
FormatearCrea archivosSolo CLIMuestra qué cambiaría al reescribir en el formato canónico (orden de claves e indentación); con write escribe el archivo.
canvappen format <path...> [--write]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path...>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--write | sí/no | Escribir el archivo (escritura atómica)por defecto false |
Ejemplos
Formatear un diseño
canvappen format design.pen --writeRespuestaUn resultado por archivo
apply-operations
Aplicar operacionesModifica el archivoAplica operaciones de edición en una transacción: insert, update, delete, move, replace, copy, detach, set_variables, set_themes, set_imports y set_fonts (ver el tema operations). Si la app canvappen tiene el documento abierto, el cambio se ve en vivo con el puntero del agente; si no, se escribe el archivo con respaldo. Si el archivo no existe, se crea.
canvappen apply-operations <path> --operations <operations> [--dry-run] [--label <label>]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--operationsobligatorio | JSON | Lista de operaciones (en la CLI: archivo .json, '-' para stdin o JSON en línea) |
--dry-run | sí/no | Valida y simula sin guardarpor defecto false |
--label | texto | Descripción corta del cambio (se muestra en la app) |
Ejemplos
Cambiar un texto
canvappen apply-operations design.pen --operations cambios.jsonSeparar una instancia
echo '[{"op":"detach","id":"card1"}]' | canvappen apply-operations design.pen --operations -RespuestaJSON con appliedIn, createdIds, affectedIds, deletedIds y backup
convert-to-library
Convertir en libreríaModifica el archivoRenombra el archivo a .lib.pen para usarlo como librería de componentes. Solo es posible si el documento no tiene librerías adjuntas. Si el documento está abierto en la app, ciérralo antes.
canvappen convert-to-library <path>Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
Ejemplos
Convertir un sistema de diseño
canvappen convert-to-library sistema.penRespuestaJSON con from y to
import-image
Importar imagenCrea archivosCopia una imagen local (.png, .jpg, .jpeg, .webp o .gif) a la carpeta images/ del documento (sin duplicar si el contenido es igual) y, si insert es verdadero, inserta un rectángulo con la imagen a su tamaño real (máximo 1200 px).
canvappen import-image <path> --source <source> [--insert] [--parent <parent>] [--x <x>] [--y <y>] [--name <name>]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--sourceobligatorio | texto | Ruta de la imagen a importar |
--insert | sí/no | Insertar un nodo con la imagenpor defecto true |
--parent | texto | Id del frame donde insertar; por defecto en la raíz |
--x | número | Posición X |
--y | número | Posición Y |
--name | texto | Nombre del nodo; por defecto el nombre del archivo |
Ejemplos
Usar una foto de Descargas
canvappen import-image design.pen --source ~/Downloads/foto.jpg --parent heroRespuestaJSON con url (relativa al .pen), width, height y nodeId
import-font
Importar fuenteCrea archivosCopia la fuente a la carpeta fonts/ del documento, lee su familia, peso y estilo, y la agrega a 'fonts' del .pen.
canvappen import-font <path> --source <source>Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--sourceobligatorio | texto | Ruta del archivo .ttf u .otf |
Ejemplos
Agregar una fuente
canvappen import-font design.pen --source ~/Downloads/Marca-Bold.otfRespuestaJSON con name, url, weight y style
localize
Hacer autocontenidoCrea archivosDescarga a la carpeta del documento las fuentes que hoy vienen de Google Fonts (solo los pesos y estilos que se usan, incluidos los de componentes de librerías) y las imágenes por http(s), y cambia las referencias del .pen a esos archivos. Después el documento se renderiza y exporta sin internet. Solo descarga de dominios permitidos: allowedHosts de la configuración o los permitidos por una persona para ese documento. Las fuentes del sistema que no están en Google Fonts se informan para importarlas con import_font.
canvappen localize <path> [--with-libraries]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--with-libraries | sí/no | También localizar las librerías .lib.pen importadas (modifica esos archivos)por defecto false |
Ejemplos
Preparar una presentación para el servidor
canvappen localize deck.penIncluir las librerías
canvappen localize deck.pen --with-librariesRespuestaJSON con files (por archivo: fuentes, imágenes y recursos omitidos con el motivo) y complete. En la CLI el código de salida es 1 si quedó algún recurso sin localizar
permissions
Permisos de redCrea archivosSolo CLILista, permite, bloquea o reinicia los permisos de dominios remotos de un documento. No está en el MCP: un agente no debe poder darse permisos de red.
canvappen permissions <path> [--allow <allow>] [--deny <deny>] [--reset <reset>]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--allow | lista de textos | Dominios a permitir |
--deny | lista de textos | Dominios a bloquear |
--reset | lista de textos | Dominios a reiniciar |
Ejemplos
Permitir Google Fonts
canvappen permissions design.pen --allow fonts.googleapis.com --allow fonts.gstatic.comRespuestaJSON con los permisos del documento
export
ExportarCrea archivosExporta nodos o el documento completo. Con ids se respeta su orden; sin ids se exporta todo en orden de lectura del canvas. Por defecto guarda en <carpeta del .pen>/exports/<nombre-del-pen>/ (ver el tema export).
canvappen export <path> --format <format> [--ids <ids>] [--scale <scale>] [--quality <quality>] [--out <out>] [--overwrite] [--strict]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<path>obligatorio | texto | Ruta del archivo .pen (absoluta, relativa o con ~) |
--formatobligatorio | pdf svg png jpeg webp html | Formato de salida |
--ids | lista de textos | Ids de nodos; para descendientes de instancias usa 'instancia/descendiente' |
--scale | número | Escala (no aplica a SVG ni HTML)de 1 a 4 · por defecto 2 |
--quality | high medium low | Calidad (no aplica a SVG ni HTML)por defecto "high" |
--out | texto | Ruta de salida; por defecto exports/<nombre-del-pen>/ |
--overwrite | sí/no | Sobrescribir si out ya existe (dentro de exports/ siempre se sobrescribe)por defecto false |
--strict | sí/no | Fallar si falta alguna fuente, imagen, icono, componente de librería o hay errores de scripts (por defecto, según la configuración: "strict" en config.json o CANVAPPEN_STRICT) |
Ejemplos
Presentación completa en PDF
canvappen export deck.pen --format pdfTres láminas en un orden propio
canvappen export deck.pen --format pdf --ids c3,a1,b2Un frame en PNG a 3x
canvappen export design.pen --format png --ids Lg3Bf --scale 3RespuestaJSON con file, kind, count, order, bytes y siempre missingFonts, missingImages, missingIcons, brokenLibraries y scriptErrors (aunque estén vacíos). Con strict y algún faltante no se escribe el archivo y la respuesta es un error (código 1 en la CLI)
help
AyudaSolo lecturaSin topic devuelve la vista general: qué es canvappen, el catálogo de funcionalidades y la lista de temas. Con topic devuelve el detalle de una funcionalidad (parámetros, respuesta y ejemplos) o de un tema: pen-format, operations, export o files.
canvappen help [topic]Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
<topic> | texto | Funcionalidad o tema (por ejemplo export, pen-format u operations) |
Ejemplos
Vista general
canvappen helpDetalle de la exportación
canvappen help exportFormato .pen
canvappen help pen-formatRespuestaTexto en Markdown