arcli 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +37 -1
  2. package/README.md +55 -156
  3. package/dist/cli/commands/vouchers.command.js +4 -3
  4. package/dist/cli/commands/vouchers.command.js.map +1 -1
  5. package/dist/cli/help.js +1 -1
  6. package/dist/cli/interactive/config.flow.d.ts +1 -1
  7. package/dist/cli/interactive/config.flow.js +53 -18
  8. package/dist/cli/interactive/config.flow.js.map +1 -1
  9. package/dist/cli/interactive/history.flow.d.ts +4 -0
  10. package/dist/cli/interactive/history.flow.js +22 -8
  11. package/dist/cli/interactive/history.flow.js.map +1 -1
  12. package/dist/cli/interactive/interactive-mode.js +24 -10
  13. package/dist/cli/interactive/interactive-mode.js.map +1 -1
  14. package/dist/cli/interactive/invoice-picker.d.ts +25 -0
  15. package/dist/cli/interactive/invoice-picker.js +152 -0
  16. package/dist/cli/interactive/invoice-picker.js.map +1 -0
  17. package/dist/cli/interactive/note.flow.d.ts +6 -2
  18. package/dist/cli/interactive/note.flow.js +19 -30
  19. package/dist/cli/interactive/note.flow.js.map +1 -1
  20. package/dist/cli/interactive/prompts.d.ts +34 -5
  21. package/dist/cli/interactive/prompts.js +181 -19
  22. package/dist/cli/interactive/prompts.js.map +1 -1
  23. package/dist/cli/interactive/repeat.flow.js +5 -11
  24. package/dist/cli/interactive/repeat.flow.js.map +1 -1
  25. package/dist/cli/interactive/status.flow.d.ts +3 -0
  26. package/dist/cli/interactive/status.flow.js +29 -0
  27. package/dist/cli/interactive/status.flow.js.map +1 -0
  28. package/dist/cli/version.d.ts +1 -1
  29. package/dist/cli/version.js +1 -1
  30. package/dist/modules/config/config-value-parser.d.ts +1 -1
  31. package/dist/modules/config/config-value-parser.js +10 -0
  32. package/dist/modules/config/config-value-parser.js.map +1 -1
  33. package/dist/modules/config/config.presenter.d.ts +4 -0
  34. package/dist/modules/config/config.presenter.js +57 -37
  35. package/dist/modules/config/config.presenter.js.map +1 -1
  36. package/dist/modules/config/config.schemas.d.ts +2 -0
  37. package/dist/modules/config/config.schemas.js +4 -0
  38. package/dist/modules/config/config.schemas.js.map +1 -1
  39. package/dist/modules/config/config.sections.d.ts +14 -0
  40. package/dist/modules/config/config.sections.js +61 -0
  41. package/dist/modules/config/config.sections.js.map +1 -0
  42. package/dist/modules/config/config.service.js +1 -0
  43. package/dist/modules/config/config.service.js.map +1 -1
  44. package/dist/modules/interactive/config-fields.d.ts +1 -3
  45. package/dist/modules/interactive/config-fields.js +36 -42
  46. package/dist/modules/interactive/config-fields.js.map +1 -1
  47. package/dist/modules/vouchers/voucher-history.d.ts +9 -4
  48. package/dist/modules/vouchers/voucher-history.js +8 -3
  49. package/dist/modules/vouchers/voucher-history.js.map +1 -1
  50. package/dist/modules/vouchers/voucher-history.presenter.d.ts +9 -2
  51. package/dist/modules/vouchers/voucher-history.presenter.js +32 -14
  52. package/dist/modules/vouchers/voucher-history.presenter.js.map +1 -1
  53. package/dist/ui/components/statusBar.d.ts +2 -0
  54. package/dist/ui/components/statusBar.js +5 -1
  55. package/dist/ui/components/statusBar.js.map +1 -1
  56. package/llms.txt +3 -3
  57. package/package.json +1 -1
  58. package/dist/cli/interactive/lookup.flow.d.ts +0 -5
  59. package/dist/cli/interactive/lookup.flow.js +0 -72
  60. package/dist/cli/interactive/lookup.flow.js.map +0 -1
@@ -6,9 +6,13 @@ import { UI_THEME } from '../theme/theme.js';
6
6
  * Barra de una linea con el contexto de la sesion, como la barra de estado de un editor:
7
7
  * `━━ TITULO ━━━━━━━━━━━━ estado ━━`. No es una caja: no compite con los paneles de contenido.
8
8
  */
9
+ /** Ancho de la barra de estado: el preset `wide`, o menos si la terminal es mas angosta. */
10
+ export function statusBarWidth() {
11
+ return fitToTerminal(UI_THEME.widths.wide.min);
12
+ }
9
13
  export function statusBar(title, status, statusColor = 'info') {
10
14
  const fill = usesAsciiBorders() ? '=' : '━';
11
- const width = fitToTerminal(UI_THEME.widths.wide.min);
15
+ const width = statusBarWidth();
12
16
  const left = ` ${bold(title.toUpperCase())} `;
13
17
  const right = ` ${colorize(status, statusColor)} `;
14
18
  const used = 2 + stripAnsi(left).length + stripAnsi(right).length + 2;
@@ -1 +1 @@
1
- {"version":3,"file":"statusBar.js","sourceRoot":"","sources":["../../../src/ui/components/statusBar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAoB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,MAAc,EAAE,cAA2B,MAAM;IACxF,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5C,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;IAEzC,OAAO;QACL,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QACjC,IAAI;QACJ,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QACtC,KAAK;QACL,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;KAClC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"statusBar.js","sourceRoot":"","sources":["../../../src/ui/components/statusBar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAoB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;;GAGG;AACH,4FAA4F;AAC5F,MAAM,UAAU,cAAc;IAC5B,OAAO,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,MAAc,EAAE,cAA2B,MAAM;IACxF,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5C,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;IAEzC,OAAO;QACL,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QACjC,IAAI;QACJ,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QACtC,KAAK;QACL,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;KAClC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC"}
package/llms.txt CHANGED
@@ -94,7 +94,6 @@ agentes, CI), nunca pregunta** — se comporta como si fuera dry-run salvo que s
94
94
  "dia": 10,
95
95
  "emitir": false,
96
96
  "previsualizar": true,
97
- "confirmarProduccion": false,
98
97
  "comprobanteAsociado": { "atajo": "fc", "cuit": "20123456789", "numero": 10, "puntoVenta": 3 },
99
98
  "pdf": true,
100
99
  "descripcion": "Servicios de marzo",
@@ -158,7 +157,7 @@ arcli config establecer <clave> <valor>
158
157
  arcli config eliminar <clave>
159
158
  ```
160
159
 
161
- Claves válidas: `cuit`, `cbu`, `aliasCbu` (solo facturas FCE), `verificarFce`, `alicuota`, `puntoVenta`, `concepto`, `ivaReceptor`, `moneda`, `cotizacion`,
160
+ Claves válidas: `cuit`, `cbu`, `aliasCbu` (solo facturas FCE), `verificarFce`, `alicuota`, `puntoVenta`, `comprobantesPorLista` (1 a 50, por defecto 15), `concepto`, `ivaReceptor`, `moneda`, `cotizacion`,
162
161
  `entorno` (`testing`/`produccion`), `emitir`, `json`, `bruto` (booleanos: `true/false`,
163
162
  `si/no`, `1/0`), `cert.testing`, `cert.produccion`, `key.testing`, `key.produccion`
164
163
  (rutas a archivos PEM, se validan al guardar), `ticketPath` (carpeta donde se cachea el
@@ -171,7 +170,7 @@ testing van a `testing/`), `pdfNavegador` (ruta a Chrome/Chromium/Edge), `emisor
171
170
 
172
171
  ## Otros comandos
173
172
 
174
- - `arcli ultimos <tipo> [--cantidad N] [--pv N] [--json]`: últimos comprobantes emitidos (de 1 a 50, por defecto 10), del más nuevo al más viejo. `tipo` es el atajo (`fb`, `nca`…).
173
+ - `arcli ultimos <tipo> [--cantidad N] [--pv N] [--json]`: últimos comprobantes emitidos (de 1 a 50; por defecto `config.comprobantesPorLista` o 15), del más nuevo al más viejo. `tipo` es el atajo (`fb`, `nca`…).
175
174
  - `arcli consultar <tipo> <numero> [--pv N] [--json]`: detalle de un comprobante emitido (CAE, vencimiento, importes, receptor). Si no existe, el error es `VOUCHER_NOT_FOUND`. Sirve para verificar después de emitir.
176
175
  - `arcli pdf [estado|instalar|desinstalar] [--json]`: plugin que genera los PDFs. `arcli pdf instalar` lo descarga sin preguntar (sirve en scripts).
177
176
  - `arcli estado [--json]`: si ARCA responde (servidores app/db/auth, latencia) y si el punto de venta configurado está habilitado. `listo: true` = se puede emitir. En testing ARCA no informa puntos de venta (`puntoVenta.estado: "sin-datos"`).
@@ -188,4 +187,5 @@ testing van a `testing/`), `pdfNavegador` (ruta a Chrome/Chromium/Edge), `emisor
188
187
  - `docs/validation-rules.md` y `docs/input-output.md`: reglas de validación y formatos de entrada/salida.
189
188
  - `docs/troubleshooting.md`: errores comunes de ARCA y como resolverlos.
190
189
  - `docs/pdf.md`: PDF de comprobantes, plugin, carpeta y nombre del archivo.
190
+ - `docs/modo-interactivo.md`: asistente interactivo (un agente no debe usarlo).
191
191
  - `AGENTS.md`: para agentes que van a modificar el código de este repo (no para usar el CLI).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arcli",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "description": "CLI para previsualizar y emitir comprobantes ARCA desde terminal, con validaciones claras y salida lista para automatizar",
5
5
  "keywords": [
6
6
  "arca",
@@ -1,5 +0,0 @@
1
- import { type InteractiveSession } from './session';
2
- /** Consultar un comprobante por numero, de cualquier tipo. Propone el ultimo emitido. */
3
- export declare function runLookupFlow(session: InteractiveSession): Promise<void>;
4
- /** Estado de los servidores de ARCA, del punto de venta y la cotizacion oficial del dolar. */
5
- export declare function runStatusFlow(session: InteractiveSession): Promise<void>;
@@ -1,72 +0,0 @@
1
- import { VOUCHER_KIND_MAP, VOUCHER_SHORTCUTS } from '../../modules/billing/voucher-kind-map.js';
2
- import { BACK } from '../../modules/interactive/wizard.js';
3
- import { formatQuotationAsText, formatStatusAsText } from '../../modules/parameters/parameters.presenter.js';
4
- import { buildStatusReport } from '../../modules/parameters/status.js';
5
- import { formatVoucherDetailAsText, formatVoucherNumber } from '../../modules/vouchers/voucher-history.presenter.js';
6
- import { ArcaParametersGateway } from '../../services/arca/arca-parameters.gateway.js';
7
- import { noticePanel, writeTerminalOutput } from '../../ui/index.js';
8
- import { startSpinner } from '../spinner.js';
9
- import { askTextStep, chooseStep } from './prompts.js';
10
- import { requirePointOfSale } from './session.js';
11
- async function withSpinner(text, run) {
12
- const spinner = startSpinner(text);
13
- try {
14
- return await run();
15
- }
16
- finally {
17
- spinner?.stop();
18
- }
19
- }
20
- /** Consultar un comprobante por numero, de cualquier tipo. Propone el ultimo emitido. */
21
- export async function runLookupFlow(session) {
22
- const pointOfSale = requirePointOfSale(session);
23
- if (!pointOfSale) {
24
- return;
25
- }
26
- const voucherKind = await chooseStep('¿Que tipo de comprobante?', VOUCHER_SHORTCUTS.map((shortcut) => ({
27
- name: `${VOUCHER_KIND_MAP[shortcut].displayName} (${shortcut})`,
28
- value: VOUCHER_KIND_MAP[shortcut],
29
- })));
30
- if (voucherKind === BACK) {
31
- return;
32
- }
33
- const lastNumber = await withSpinner('Consultando ARCA...', () => session.historyGateway.getLastNumber(pointOfSale, voucherKind.arcaType));
34
- if (lastNumber === 0) {
35
- writeTerminalOutput(noticePanel(`No hay ${voucherKind.displayName} emitidas en el punto de venta ${pointOfSale}.`, 'muted'));
36
- return;
37
- }
38
- const answer = await askTextStep(`Numero (el ultimo es ${lastNumber}):`, {
39
- defaultValue: String(lastNumber),
40
- validate: (value) => {
41
- const number = Number(value.trim());
42
- return Number.isInteger(number) && number > 0 && number <= lastNumber
43
- ? true
44
- : `Ingrese un numero entre 1 y ${lastNumber}.`;
45
- },
46
- });
47
- if (answer === BACK) {
48
- return;
49
- }
50
- const number = Number(answer.trim());
51
- const voucher = await withSpinner('Consultando ARCA...', () => session.historyGateway.getVoucher(number, pointOfSale, voucherKind.arcaType));
52
- if (!voucher) {
53
- writeTerminalOutput(noticePanel(`No existe la ${voucherKind.displayName} N° ${formatVoucherNumber(pointOfSale, number)}.`, 'warning'));
54
- return;
55
- }
56
- writeTerminalOutput(formatVoucherDetailAsText({ environment: session.runtime.environment, pointOfSale, voucher, voucherKind }));
57
- }
58
- /** Estado de los servidores de ARCA, del punto de venta y la cotizacion oficial del dolar. */
59
- export async function runStatusFlow(session) {
60
- const gateway = new ArcaParametersGateway(session.arca);
61
- const { environment, pointOfSale } = session.runtime;
62
- const [report, quotation] = await withSpinner('Consultando ARCA...', () => Promise.all([
63
- buildStatusReport({ environment, gateway, pointOfSale }),
64
- // La cotizacion es un extra: si falla, el estado se muestra igual.
65
- gateway.getQuotation('USD').catch(() => undefined),
66
- ]));
67
- writeTerminalOutput(formatStatusAsText(report));
68
- if (quotation) {
69
- writeTerminalOutput(formatQuotationAsText(quotation, environment));
70
- }
71
- }
72
- //# sourceMappingURL=lookup.flow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lookup.flow.js","sourceRoot":"","sources":["../../../src/cli/interactive/lookup.flow.ts"],"names":[],"mappings":"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"}