Skip to content

Releases: facturadirecta/cli

v0.17.0

Choose a tag to compare

@ami-facturadirecta ami-facturadirecta released this 29 Oct 10:22

Añadido

  • facturadirecta query --limit-per-group N: con dos dimensiones, como
    máximo N filas de la segunda dentro de cada valor de la primera («los tres
    productos más vendidos a cada cliente»).
  • facturadirecta query --amounts company: los importes de invoices,
    bills y sus líneas en la moneda de la empresa, en un solo grupo aunque
    haya varias monedas (document, por defecto, los separa por moneda).

Cambiado

  • facturadirecta query admite las fuentes invoiceLines y billLines
    (líneas de facturas de venta y compra) con los mismos permisos que
    invoices y bills; la ayuda y los errores de --from las enumeran.
  • La skill que instala el CLI y el README enseñan a sacar los productos más
    vendidos y las compras por producto con invoiceLines y billLines, y
    avisan de que los cobros a fondo y el margen dependen del plan
    (plan_limit_exceeded).

v0.16.2

Choose a tag to compare

@ami-facturadirecta ami-facturadirecta released this 22 Oct 17:42

Cambiado

  • La ayuda larga de invoices create e invoices update explica que
    emitir una factura (main.draft a false) le asigna número y, con
    VeriFactu o TicketBAI activos, genera el registro de facturación y lo
    envía a la AEAT o a la Diputación Foral en ese momento, sin vuelta atrás
    (solo anular, rectificar o subsanar); que anular (main.voided a true)
    tampoco se revierte; que una factura emitida con VeriFactu solo admite
    cambios subsanables y con TicketBAI ninguno; y que sin main.draft se
    aplica sales.newInvoiceMode de la empresa, que puede ser final.
  • La skill pide crear siempre como borrador y emitir, anular o subsanar
    solo cuando el usuario lo pida para esa factura y tras avisarle.
  • El contrato vendorizado trae las descripciones nuevas de createInvoice,
    updateInvoice, main.draft y main.voided (describe las muestra), y
    las notas de describe de esas dos acciones se quedan con lo que el
    contrato no dice: borrador siempre, la ventana de fechas de VeriFactu, no
    subsanar por cuenta propia y restaurar una anulada solo sin datos de
    VeriFactu, TicketBAI ni Batuz.

v0.16.1

Choose a tag to compare

@ami-facturadirecta ami-facturadirecta released this 21 Oct 17:14

Cambiado

  • El contrato vendorizado es el de FacturaDirecta 4.1.13: query admite
    fiscalId y contacts (describe query los explica), el --data de
    contactos y documentos de venta admite language, y api list_activity
    filtra también por los tipos delegatedRenewalReverted y
    partnerDelegatedRenewalReverted.
  • describe de query, get_results_summary, list_results_detail,
    get_profit_loss y get_balance_sheet explica que el tope de 5 años del
    periodo cuenta el primer y el último día: «los últimos 5 años» hasta el
    2026-10-19 empiezan el 2021-10-20, y con el 2021-10-19 la API responde 400.
  • facturadirecta query: la ayuda de --by incluye fiscalId (agrupa por
    el identificador fiscal y reúne los contactos duplicados con el mismo NIF)
    y la de --measures, contacts (cuántos contactos hay detrás de cada
    grupo). Los ejemplos, el README y la skill añaden los mejores clientes por
    NIF y la búsqueda de contactos duplicados. En la tabla, la columna
    fiscalId muestra el NIF delante del nombre.
  • --summary de contactos y documentos de venta incluye language (el
    idioma en que se imprimen y se envían sus documentos) cuando tiene valor;
    sin él se usa el idioma base de la plantilla.

v0.16.0

Choose a tag to compare

@ami-facturadirecta ami-facturadirecta released this 19 Oct 15:32

Añadido

  • facturadirecta tax-declarations: los modelos de impuestos que la
    empresa ha generado y guardado (303, 111, 115, 130, 202, 180, 190, 347,
    349 y 390), de solo lectura: list (por modelo, ejercicio y periodo, con
    el resultado y si tiene fichero AEAT; --related boxes añade las
    casillas), get (las casillas; --related records, los registros por
    tercero de las informativas), pdf, aeat-file (url y filename del
    fichero de presentación) y attachments list.
  • facturadirecta query: la consulta analítica de la API (POST /query),
    la misma acción query del servidor MCP. Una fuente (--from invoices,
    bills, contacts o journal), medidas (--measures), hasta dos
    dimensiones (--by), un periodo abreviado (--period 2026, 2026-Q3,
    2026-09, 2026-01-01..2026-06-30) con comparativa (--compare) o
    desglose (--breakdown), filtros (--filter "state in overdue"), orden,
    --limit y --other; o la petición completa con --data. En la terminal,
    una tabla con los grupos, la fila de otros y los totales; con -j o -q,
    el JSON de la API. Responde en una llamada «mis cinco mejores clientes»,
    «¿cuánto suman las facturas vencidas?» o «gastos por proveedor» sin
    paginar. journal exige el módulo de Contabilidad, como journal.
  • --totals en invoices list y bills list: la respuesta añade totals
    con el recuento y la suma de la base imponible, los impuestos, el total y
    el pendiente de todo lo que cumple los filtros, por moneda; en la terminal
    sale bajo la tabla y --summary lo conserva (-q solo da los elementos).
  • describe muestra los ejemplos de cuerpo del propio contrato en las
    operaciones que api-docs aún no documenta (describe query --example).

Cambiado

  • El contrato vendorizado es el de producción (FacturaDirecta 4.1.12), con
    la consulta analítica y las declaraciones de impuestos. El login deja de
    pedir los scopes que Keycloak aún no conozca (contract.PendingScopes,
    hoy vacío).

v0.15.0

Choose a tag to compare

@ami-facturadirecta ami-facturadirecta released this 16 Oct 14:17

Añadido

  • facturadirecta banks get <id>: un banco por su id, con la misma forma que
    cada elemento del listado y --url.
  • --related en banks list y banks get: añade bajo related el saldo
    contable (balance, el de la pantalla de bancos y el que sirve para la
    contabilidad), el saldo según la entidad (linkedBalance), el estado de la
    conexión automática (link) y los movimientos pendientes de conciliar
    (statements); repetido o separado por comas. --balance-date AAAA-MM-DD
    da el saldo contable al cierre de ese día y pide balance por sí sola.
    En la terminal, banks list muestra una tabla con las columnas de lo que
    se pida.
  • facturadirecta settings company: la ficha de la empresa y su forma de
    trabajar (datos fiscales, moneda, modo borrador o definitivo, impuestos,
    numeración, bloqueo contable, VeriFactu y TicketBAI, buzón de la bandeja y
    módulos del plan); --url da la página de ajustes en la web.

Cambiado

  • facturadirecta banks pasa a ser un grupo, como statements: el listado es
    ahora facturadirecta banks list (con las mismas flags).

v0.14.0

Choose a tag to compare

@ami-facturadirecta ami-facturadirecta released this 15 Oct 21:42

Añadido

  • facturadirecta api <operación> [ids…] (ADR-0008): llama a cualquier
    operación de la API por su nombre de acción (el de describe y del servidor
    MCP) o su operationId, también las que no tienen comando propio (pedidos,
    órdenes de compra, versiones, campos personalizados, stock, actividad…).
    • Los ids de la ruta van como argumentos y la query con -p nombre=valor;
      el cuerpo, con --data '<json>', --data @fichero o por stdin.
    • --idempotency-key la envía donde la espera la operación; --dry-run
      imprime la petición, sin credenciales, sin enviarla; --output guarda la
      respuesta.
    • Las escrituras necesitan login --scope full y los borrados
      irreversibles, confirmación (--yes), como los comandos dedicados.
    • describe añade la invocación genérica (cli.api).
  • La salida JSON (también la de --jq y la de los errores en modo agente) ya
    no escapa <, > ni & como \u003c, \u003e y \u0026: los textos y las
    formas de uso (<id>) se leen tal cual. Sigue siendo el mismo JSON.
  • commands.json (la superficie que publica cada release) añade, en cada
    comando, las operaciones de la API a las que llama (operations, con
    operationId y action), y apiOnly, las operaciones sin comando
    dedicado, que se llaman con facturadirecta api. Son campos nuevos: los
    existentes no cambian.
  • facturadirecta describe [objetivo…] (ADR-0008 del monorepo): el contrato de
    cualquier operación de la API sin llamarla. Muestra parámetros, la forma y el
    esquema del cuerpo, el esquema de la respuesta, los ejemplos de la
    documentación, las notas de uso y los comandos del CLI que la llaman.
    • Admite la acción (create_invoice, con los nombres del servidor MCP), el
      operationId (createInvoice), la ruta de un comando (invoices create) o
      una sección (invoices, delivery-notes); sin objetivo, lista las
      secciones.
    • Con -j la salida es JSON. --schema body|response imprime solo el
      esquema completo, y --example [n] el cuerpo de ejemplo, listo para
      --data.
  • La ayuda (--help) de cada comando que llama a la API termina con la forma
    del cuerpo (Cuerpo (--data o stdin): {"content" (obligatorio), "tags"}) y
    el describe de su operación.
  • --search <texto> en invoices list, estimates list,
    delivery-notes list, bills list, payrolls list y recurring list:
    búsqueda aproximada en el texto del documento (título, líneas, notas) y en
    el nombre de su contacto, con el mismo criterio que la búsqueda rápida de la
    web (sale del contrato de la API).
  • Informes de FacturaDirecta en facturadirecta accounting, con las mismas
    cifras que la web y calculados en el servidor:
    • accounting results: ingresos, gastos y beneficio por origen, en todos los
      planes; --breakdown month|quarter|year (con --total) o
      --compare previousPeriod|previousYear (con --difference, --variance).
    • accounting results-documents --category <categoría>: los documentos que
      forman una cifra del resumen.
    • accounting profit-loss, accounting balance-sheet y
      accounting trial-balance: pérdidas y ganancias, balance de situación y
      sumas y saldos, para las empresas con el módulo de Contabilidad.
  • whoami indica en cada empresa si tiene el módulo de Contabilidad
    (accountingModule), con una conexión por empresa.
  • Adjuntos, como en el MCP: --summary indica en facturas, presupuestos y
    gastos cuántos ficheros adjuntos tiene cada documento (attachments, solo si
    tiene alguno), y fetch los enumera al final del texto y en
    metadata.attachments con su url, que es pública y permanente.
  • La ayuda de statements reconcile-new explica cómo cobrar o pagar una
    factura, un gasto o una nómina con el movimiento: {"document": "<id>"},
    también entre monedas; amount para un parcial entre monedas; lines solo
    para movimientos sin documento. La de invoices pay, bills pay y
    payrolls pay recomienda conciliar el movimiento cuando el cobro o pago sale
    del extracto bancario.

Cambiado

  • products list --search usa ahora la búsqueda global de la API (título,
    referencia y descripciones del producto); el filtro por nombre que antes
    hacía --search es ahora --title.
  • journal solo responde para las empresas con el módulo de Contabilidad (con
    una conexión por empresa): sin él, falla con plan_limit_exceeded y la pista
    facturadirecta accounting results.
  • Los límites del plan (plan_limit_exceeded, exit 3) y los informes que
    tardan demasiado (report_query_timeout, exit 6) tienen su propio error: ya
    no sugieren login --scope full ni «revisa los parámetros».
  • Los errores de validación de la API (invalid_input) traen en detail los
    mensajes de errors[] con su campo y, cuando el cuerpo no cumple el esquema
    («Documento con formato incorrecto»), la ruta y el motivo de cada campo
    rechazado (hasta 5), como el MCP. Antes detail solo traía el mensaje
    genérico y un agente no sabía qué corregir.
  • --help de los subcomandos muestra su descripción antes del uso, como la
    ayuda por defecto de Cobra. Antes solo mostraba el uso, y los textos largos
    (accounting, auth logout, auth permissions…) no se veían.

Cambiado (BREAKING)

  • Los borrados irreversibles piden confirmación: los delete de facturas,
    presupuestos, albaranes, gastos, nóminas, recurrentes, contactos, productos,
    métodos de pago, API keys y webhooks, y los attachments delete.
    • En una terminal preguntan [s/N].
    • En scripts y agentes (sin terminal, o con -j, -q, --agent o --jq)
      hace falta --yes. Sin él fallan con confirmation_required (exit 2) y no
      llaman a la API.
    • inbox archive y statements unreconcile no la piden porque se pueden
      deshacer.
    • La API pública y los SDK no cambian: la confirmación es solo del CLI.

Eliminado (BREAKING)

  • accounting summary y accounting accounts. Sumaban el diario en el CLI,
    recorriendo hasta 10.000 apuntes, y en las empresas grandes eran lentos e
    incompletos.

Corregido

  • <recurso> attachments list -q devuelve la lista de adjuntos, como el resto
    de listados (imprimía el objeto {"items": …} entero), y admite --ids-only
    y --count. Encontrado probando contra el sandbox.
  • describe de update_bill y de los update_* de documentos numerados avisa
    de los campos de la lectura que la escritura no admite
    (content.accounting, content.books y content.import en los gastos, y
    content.main.manualTotals en los documentos numerados), y la skill lo
    dice. Reenviar el content de un gasto tal como lo devuelve get daba 400.
  • Ejemplos de la skill y del README: las altas y modificaciones usaban
    {"main": {...}}, y el contrato exige
    {"content": {"type": "<tipo>", "main": {...}}}. Los envíos por email
    van con {"to": [...]} (no emails), invoices substitution con
    {"contact", "substitutedInvoices"}, los pagos llevan bank y el alta de
    webhooks, name. El alta de contactos lleva currency y accounts (vacío =
    cliente) y la de productos, sales.account: comprobado contra la API, que
    los exige aunque algunos ejemplos de api-docs los omitan.
  • La skill explica además que update sustituye el contenido completo (hay
    que partir de get), que invoices list y bills list solo muestran
    borradores con --draft only|all, cómo conciliar con document, cómo
    tratar los adjuntos y que search no busca en el texto de los documentos
    (para eso, --search en los listados). Ya no dice que search use la misma
    heurística que el MCP, que ahora usa la búsqueda global de la API.
  • La regla de update de la skill dice lo que hace la API (comprobado contra
    el sandbox): en contactos, productos y métodos de pago los obligatorios se
    envían siempre (no conservan su valor) y no hay líneas ni docNumber; en
    los documentos solo se conservan los campos que FacturaDirecta completa por
    su cuenta, y docNumber va tal cual solo en facturas, presupuestos y
    albaranes. tags y webhooks endpoints update no sustituyen el contenido.
  • describe de las operaciones de endpoints y eventos de webhooks y de los
    adjuntos de gastos, pedidos, albaranes, presupuestos, nóminas, órdenes de
    compra y recurrentes daba la descripción y los ejemplos de otra operación.
    Por ejemplo, la del PUT de un endpoint describía el alta, y ahora dice
    que es una actualización parcial. Ahora cada una tiene los suyos y su
    enlace a la documentación lleva a su sección. Los enlaces con tilde en el
    encabezado (23 operaciones) tampoco llevaban a su sección en GitHub.

Migración

  • Scripts y agentes que borran: añade --yes a delete y attachments delete
    después de confirmar el borrado.
  • accounting summary → accounting results para ingresos, gastos y
    beneficio (--group-by month → --breakdown month), o
    accounting trial-balance --account <prefijo> para los totales de una
    cuenta o grupo.
  • accounting accounts → accounting trial-balance, que lista las cuentas con
    movimientos y su saldo.

v0.13.0

Choose a tag to compare

@ami-facturadirecta ami-facturadirecta released this 30 Sep 15:18

Añadido

  • Empresas y permisos por conexión (ADR-0006 del monorepo): tras el login
    OAuth, el CLI abre una página de FacturaDirecta para elegir a qué empresas
    accede y con qué permisos en cada área, espera a que lo confirmes y guarda
    la conexión en el perfil (id, secreto, URL de gestión y nombre; permisos
    0600). Cada petición a la API lleva la cabecera FD-Connection. Con
    --device o --no-browser la URL solo se imprime. Si cancelas o la
    solicitud caduca, el login falla sin guardar nada (el perfil anterior queda
    como estaba); si el servidor aún no admite conexiones, avisa y sigue sin
    ella. Con --api-key no hay paso de conexión.
  • login --no-connection: se salta la conexión (acceso a todas tus empresas
    con los permisos de tu rol) e inicia sesión con el cliente OAuth
    facturadirecta-api, el único con el que la API admite peticiones sin
    conexión.
  • facturadirecta auth permissions: abre (o imprime, con --no-browser) la
    página para cambiar las empresas y permisos de la conexión del perfil, sin
    volver a iniciar sesión. Sin conexión, falla con connection_required y la
    pista de login.
  • auth status y auth profile muestran la conexión (aplicación, id y URL de
    gestión); auth profile, además, los permisos de la conexión en cada
    empresa.
  • whoami muestra la conexión y los permisos de la conexión en cada empresa.
    En JSON (whoami --json, la llamada inicial de los agentes) añade
    connection (id, clientName y manageUrl: la de /profile o, si no
    la trae, la del perfil guardado; nunca el secreto) y, en cada empresa de
    companies y en company, permissions (área → read, full…) y
    manageUrl. Sin conexión esos campos no aparecen.
  • Nuevos códigos de error para los 401/403 de la API con conexiones, los
    mismos que el MCP (exit 3): connection_permission_insufficient y
    company_not_in_connection (pista facturadirecta auth permissions, con
    data.manageUrl y data.companyId), user_role_insufficient,
    plan_api_not_available, token_scope_missing (pista login --scope full),
    connection_required y connection_revoked (pista login). Con estos
    códigos, el texto para humanos es HTTP 403: <mensaje> en vez del cuerpo
    JSON. Sin code, todo sigue igual.
  • Variables de entorno para probar contra otro entorno:
    FACTURADIRECTA_SERVER (servidor de la API que el login guarda en el
    perfil) y FACTURADIRECTA_OAUTH_CLIENT_ID (fuerza el cliente OAuth del
    login; por defecto facturadirecta-cli y, con --no-connection,
    facturadirecta-api).
  • Comando oculto facturadirecta __surface: imprime en JSON el árbol completo
    de comandos visibles (ruta, padre, textos, uso, subcomandos y flags propias),
    las flags globales y los grupos de la ayuda raíz. make surface-json lo
    escribe en dist/commands.json.
  • Cada release adjunta ese JSON como asset commands.json en
    facturadirecta/cli, con URL estable
    https://github.com/facturadirecta/cli/releases/latest/download/commands.json.
    La web de desarrolladores genera con él la referencia del CLI.

Cambiado

  • El login OAuth usa por defecto el cliente propio del CLI,
    facturadirecta-cli (antes facturadirecta-api, compartido con Zapier y
    las integraciones): con él, la API exige la conexión (connection_required
    sin ella). Necesita ese cliente en el realm de Keycloak (tarea 6 de
    tools/mcp-connect-clients.sh del repo keycloak) y la API con conexiones.
    Los perfiles existentes siguen funcionando con facturadirecta-api hasta el
    siguiente login. --no-connection usa facturadirecta-api.
  • logout revoca la conexión del perfil en FacturaDirecta antes de borrarlo;
    si no puede, avisa y cierra la sesión igualmente. Volver a iniciar sesión
    sobre un perfil con otra conexión también la revoca.
  • El perfil guarda el cliente OAuth del login y el token se renueva siempre
    con él (los perfiles anteriores, con facturadirecta-api).

v0.12.2

Choose a tag to compare

@ami-facturadirecta ami-facturadirecta released this 28 Sep 16:52

Corregido

  • Las URLs de --summary, --url, search y fetch apuntan a la
    aplicación web (https://3.facturadirecta.com/…): son el webUrl que
    devuelve la API. Antes el CLI las componía sobre el servidor del perfil
    (app.facturadirecta.com), donde esas rutas daban 404. Si la API no
    devuelve webUrl, los resúmenes, search y fetch omiten url y --url
    termina con un error upstream_error.

Cambiado

  • Textos de ayuda de las flags de listados corregidos desde el contrato de la
    API: --has-tags decía lo contrario de lo que hace (con true devuelve
    solo los elementos que tienen al menos una etiqueta), y se corrigen erratas
    en las fechas (--min-creation-date y similares) y en --max-total.

v0.12.1

Choose a tag to compare

@ami-facturadirecta ami-facturadirecta released this 27 Sep 15:51

Corregido

  • Las búsquedas y filtros con espacios (contacts list --search "Acme SL")
    fallaban con 400: el SDK Go codificaba el espacio como +, que la API
    rechaza ("must be url encoded"); ahora va como %20 (RFC 3986).
  • facturadirecta whoami y auth profile fallaban con un perfil de API key
    (HTTP 401: Es necesaria identificación para usar este servicio): llamaban
    a GET /profile, que solo admite OAuth, y las API keys son por empresa y
    no tienen usuario. Ahora detectan el perfil apikey y, sin pasar por
    /profile, devuelven la empresa de la clave (la de
    login --api-key --company; --company y FACTURADIRECTA_COMPANY siguen
    mandando): en JSON con authType: "apikey", company y companies (solo
    esa), y en la tabla como "Perfil con API key: empresa ". Comprueban
    además que la clave es válida para esa empresa con
    GET /{companyId}/apiKeyInfo e incluyen sus scopes (scopes en JSON); si
    la API responde 401/403, el error (auth_required) indica que la API key
    no es válida o ha sido revocada y cómo volver a iniciar sesión. Un perfil
    de API key sin empresa ya no consulta /profile en ningún comando: pide
    --company o un nuevo login.
  • Un 401 de la API (sesión caducada, API key no válida o revocada) se
    clasificaba como insufficient_scope y sugería facturadirecta login --scope full, que no lo arregla. Ahora es auth_required (exit 3) con el
    mensaje "La API no ha aceptado las credenciales (HTTP 401)…" y la pista
    facturadirecta login. El 403 sigue siendo insufficient_scope con la
    pista --scope full.
  • Las pistas de login (auth_required, readonly e insufficient_scope)
    añaden --profile <nombre> cuando el perfil activo no es el por defecto,
    para que el comando sugerido repare la sesión que ha fallado y no cree
    otra.
  • Cuando el refresh token OAuth ha caducado o ha sido revocado, el CLI
    devolvía un error genérico (internal, exit 1). Ahora es auth_required
    (exit 3) con la respuesta del servidor de identidad en detail y la pista
    de login; si lo que falla es la red al renovar, es network_error. El
    error "No hay sesión activa" del cliente HTTP también es auth_required.
  • --profile <nombre> (o FACTURADIRECTA_PROFILE) con un perfil que no
    existe devolvía un error genérico. Ahora es auth_required con la pista
    facturadirecta login --profile <nombre> y los perfiles disponibles en
    data.profiles.

v0.12.0

Choose a tag to compare

@ami-facturadirecta ami-facturadirecta released this 26 Sep 12:45

Añadido

  • facturadirecta login --device: inicio de sesión por dispositivo (OAuth 2.0
    Device Authorization Grant, RFC 8628) para máquinas sin navegador (SSH,
    contenedores, agentes): el CLI muestra una URL y un código para autorizar
    desde cualquier dispositivo. Requiere el grant activado en el cliente
    facturadirecta-api de Keycloak.
  • login --no-browser (solo imprime la URL) y login --port (fija el puerto
    del callback). Variable FACTURADIRECTA_KEYCLOAK_URL para apuntar el login
    a otro Keycloak (desarrollo).
  • statements unreconcile --delete-transaction: el parámetro del contrato
    que faltaba (borrar también el asiento al desconciliar).
  • facturadirecta search <texto> y facturadirecta fetch <id>: la búsqueda
    combinada y el detalle legible que ofrecen las tools search/fetch del
    MCP, con los mismos ids (tipo:empresa:id) y URLs. search combina
    contactos, productos, facturas y presupuestos por número y los últimos
    documentos de los contactos encontrados; --type acota los tipos. Sin
    empresa fijada y con varias empresas busca en hasta 5.
  • Errores clasificados. En modo agente (-j, -q, --agent, --jq) los
    errores van a stderr como una línea JSON con code (los del MCP:
    not_found, insufficient_scope, invalid_input, company_required,
    upstream_error; y los del CLI: usage, auth_required, readonly,
    network_error), message, status, detail, hint y data; el
    proceso sale con un código por clase (2 uso/entrada, 3 sesión/permisos,
    4 no encontrado, 5 empresa, 6 API/red). El texto para humanos no cambia.
  • facturadirecta accounting summary y accounting accounts: agregados del
    diario contable con la misma forma que summarize_accounting y
    list_accounts del MCP. summary devuelve debe, haber y saldo por cuenta,
    mes o cuenta+mes, más ingresos (grupo 7), gastos (grupo 6) y resultado;
    accounts lista las cuentas con movimientos y su saldo (la API no expone
    el plan de cuentas). Paginan el diario hasta 10.000 apuntes y avisan si el
    periodo tiene más.
  • facturadirecta whoami: perfil, usuario, modo de acceso, la empresa que
    usarán los comandos (y de dónde sale) y las empresas disponibles en una sola
    llamada; con --json devuelve un objeto compacto pensado para agentes.
  • --summary en list y get de facturas, presupuestos, gastos, contactos y
    productos: resumen compacto por elemento (id, número, fecha, contacto,
    totales, estado, saldo pendiente y url) en las salidas JSON. En facturas y
    gastos pide related=state,balance automáticamente; pendingAmount es
    positivo cuando queda importe por cobrar o pagar.
  • --url en get: imprime solo la URL del elemento en la web de FacturaDirecta.
  • Variable de entorno FACTURADIRECTA_COMPANY: fija la empresa para una
    sesión de shell sin tocar el perfil.
  • journal --id: apuntes originados por un documento concreto (asiento,
    factura, gasto, nómina o remesa). No confundir con --document, que filtra
    por el documento al que se imputan.
  • statements list --matched-document: extractos conciliados con un asiento.
  • settings series admite clientOrder y purchaseOrder.

Cambiado

  • El callback OAuth del login escucha en un puerto loopback libre elegido por
    el sistema (127.0.0.1:<puerto>, RFC 8252) en vez del 31337 fijo: dos
    logins a la vez o un puerto ocupado ya no hacen fallar el inicio de sesión.
  • Los scopes que pide el login salen del contrato de la API (SDK) en vez de
    una lista escrita a mano: incluye ahora clientOrders, customFields y
    purchaseOrders.
  • Las flags de query de todos los listados y consultas se generan desde el
    contrato de la API (internal/commands/flags.gen.go, emitido por el
    generador del monorepo desde la IR) en vez de escribirse a mano: nombre
    kebab-case, tipo y ayuda (primera frase de la documentación de la API más
    los valores admitidos). Los nombres de las flags no cambian; sí cambian
    los textos de --help. La paridad con el contrato la comprueba un test
    (internal/cli/flags_test.go) que sustituye a scripts/check-flags.py.
  • Los errores se imprimen una sola vez: sin el "Error:" duplicado de cobra ni
    el volcado del usage completo tras cada fallo (en errores de uso se
    sugiere --help).
  • Resolución de empresa determinista: --company > FACTURADIRECTA_COMPANY >
    empresa fijada en el perfil > la única empresa del usuario (se guarda en el
    perfil). Con varias empresas y ninguna fijada, el error lista las
    disponibles en vez de exigir auth use-company.
  • El skill para agentes pasa a llamarse facturadirecta-cli y se instala en
    <skills>/facturadirecta-cli, para no pisar el skill facturadirecta del
    MCP remoto (ni ser pisado por él). setup retira la copia antigua del CLI
    si la encuentra. El skill recomienda empezar con whoami --json y usar
    --summary en los listados, y corrige journal list (el comando es
    journal).