v0.15.0

GitHubnpmEN
Tema de color

sunat-cli

SUNAT expone diez superficies distintas: SOAP con XML firmado, REST con OAuth, una cola de tickets, una carga reanudable, un buzón legacy, una API JSON y una sesión de formularios HTTP. Esto las envuelve en un binario que un agente puede manejar bajo supervisión.

Ver qué cubrenpm install -g @crafter/sunat-cli
Superficies
10
un solo binario
Tests
500+
en verde
Modos
2
headless y supervisado
# Se instala una vez. Corre sobre Node.
$ npm install -g @crafter/sunat-cli

# Pregunta qué hay y qué le falta a cada hueco
$ sunat-cli doctor
  listo · agent-browser · node · config

# Pregunta qué acepta un comando. Versionado.
$ sunat-cli schema cpe-factura
  { "version": "1.0.0", "command": "cpe factura emit" }

# El preview devuelve la forma real, más un hash
$ sunat-cli cpe factura preview --params @f.json
  { "dryRun": true, "validacion": { "ok": true } }

# Confirmar. UBL 2.1, XAdES, SOAP, de punta a punta.
$ sunat-cli cpe factura emit --params @f.json --yes
  Aceptado · CDR 0000 · F001-1234

Qué cubre

9 superficies

Comprobantes electrónicos

Factura, boleta, nota de crédito, nota de débito

Documentos UBL 2.1, firma XAdES-BES y SOAP directo a SUNAT. Verificado de punta a punta contra el endpoint beta.

$ sunat-cli cpe factura emit \
    --params @factura.json --yes

Guías de remisión

GRE remitente, modal 02

REST con JWT. El tracker es idempotente, así que reintentar después de un timeout resuelve el envío original en vez de duplicarlo.

$ sunat-cli cpe gre emit \
    --params @guia.json --yes

Registro de ventas y compras

SIRE RVIE y RCE

Baja la propuesta, hace polling del ticket, descarga el ZIP y sube las correcciones por TUS 1.0.0.

$ sunat-cli sire rvie propuesta \
    --periodo 202504 --yes

Resumen diario y bajas

Resumen diario, comunicación de baja

Las boletas de menos de S/700 se agrupan en un resumen diario. Las bajas siguen el mismo contrato de ticket.

$ sunat-cli cpe resumen send \
    --fecha 2026-04-29 --yes

Rentas de cuarta

RHE y F616

En RHE, el navegador obtiene la entrada SOL, HTTP llega al borrador, la confirmación legal queda supervisada y la descarga XML/PDF está conectada para validarla en la próxima emisión real. F616 conserva su lectura headless por API.

$ sunat-cli rhe emit \
    --params '{"empresa":"Cliente","descripcion":"Servicio","monto":100}' --preview-only

Consultas

Padrón RUC, consulta CPE, tipo de cambio

OAuth2 client credentials contra la superficie REST pública. El padrón sincroniza incremental, así que una consulta local responde en menos de un milisegundo.

$ sunat-cli api consulta \
    --tipo 01 --serie F001 --numero 123

Buzón SOL

Mensajes y notificaciones, solo metadata

Lista sin abrir el detalle, conserva conteos contradictorios como evidencia y detecta novedades con un snapshot privado local.

$ sunat-cli buzon list

Secretos en el llavero del sistema

Contraseña del certificado, clave SOL

El prompt oculto escribe en el llavero de macOS o Linux, así el valor no queda en el historial del shell, ni en variables de entorno, ni en la tabla de procesos.

$ sunat-cli keychain set CPE_CERT_PASSWORD

Introspección de esquemas

Más de 25 esquemas versionados

El agente le pregunta al binario qué acepta un comando en vez de adivinar los nombres de los campos. La versión viene en la respuesta, así que se puede fijar.

$ sunat-cli schema cpe-factura

Endpoints primero, navegador en el borde

La página del F616 parece un formulario. Es una aplicación de una sola página hablando con una API JSON, y los campos del formulario son la forma menos confiable de llegar ahí.

RHE es distinto: Menu SOL genera una entrada efímera y el backend responde HTML. La CLI usa HTTP para deducción, identidad y detalles, vuelve a renderizar el borrador, reserva el DOM para la confirmación legal y conecta XML/PDF por endpoint después de emitir.

  1. 01

    Bootstrap

    Abre SOL y obtiene la entrada o token que la superficie oficial exige.

  2. 02

    HTTP directo

    Llama la API o sesión de formularios y valida la respuesta real del servidor.

  3. 03

    Confirmar

    Para RHE, mantiene la acción legal bajo control humano y después valida y guarda los archivos si SUNAT responde con XML/PDF reales.

Hasta dónde llega cada superficie

3 de 10 en producción y verificadas

Los porcentajes son un juicio sobre cuánto de cada superficie está envuelto y disponible para un agente. El lector de metadata del Buzón SOL fue verificado con una cuenta propia en producción. Los envíos tributarios siguen en beta.

Cobertura por superficie de SUNAT, con avance y estado
SuperficieCubierto%Estado
Consultas RESTConsulta CPE, padrón, tipo de cambio
90listo
RHE y F616RHE supervisado; XML/PDF conectado, falta live
85parcial
Buzón SOLMetadata, snapshot y novedades
45parcial
ComprobantesFactura, boleta, NC, ND
85listo
Resumen diario y bajaResumen diario, comunicación de baja
80listo
SIRERVIE ventas y RCE compras
70parcial
Guías de remisiónSolo modal 02, falta transportista
50parcial
Drivers2 de 5: mock y sunat-direct
40parcial
Baja con intent tokenDiseñado, no construido
30planeado
Envíos a producciónNunca ejecutado con credenciales reales
10sin probar

Qué viene

Los números enlazan al tracker

Pensada para quien la llama y no es de fiar

Un agente va a equivocarse en el nombre de un campo, reintentar una llamada que ya salió bien, y seguir de largo después de un error donde debía frenar. Cada regla de acá existe porque una de esas fallas es barata de prevenir y cara de deshacer cuando del otro lado está SUNAT.

Payloads, no sopa de flags
Un payload JSON sobrevive a que lo escriba un modelo; veinte flags posicionales no.
Toda mutación se previsualiza
En RHE, --dry-run valida localmente y --preview-only reconcilia el borrador real de SUNAT antes de habilitar la emisión.
JSON cuando stdout no es una terminal
La vista humana y la vista de máquina salen del mismo código, así que no pueden divergir.
Esquemas en tiempo de ejecución
El binario responde qué acepta un comando, así el agente nunca inventa un nombre de campo.
Validación de entrada
El agente no es un operador de confianza. Un RUC alucinado falla la validación antes de llegar a SUNAT.
Un archivo de skill según agentskills.io
El descubrimiento funciona igual para cualquier agente que lea el estándar.