bkper 4.31.2 → 5.0.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 (122) hide show
  1. package/README.md +12 -5
  2. package/lib/agent/extensions/core-concepts-preload.d.ts +4 -6
  3. package/lib/agent/extensions/core-concepts-preload.d.ts.map +1 -1
  4. package/lib/agent/extensions/core-concepts-preload.js +52 -24
  5. package/lib/agent/extensions/core-concepts-preload.js.map +1 -1
  6. package/lib/cli.js +3 -3
  7. package/lib/cli.js.map +1 -1
  8. package/lib/commands/accounts/batch-create.d.ts +1 -1
  9. package/lib/commands/accounts/batch-create.d.ts.map +1 -1
  10. package/lib/commands/accounts/batch-create.js +3 -3
  11. package/lib/commands/accounts/batch-create.js.map +1 -1
  12. package/lib/commands/accounts/list.d.ts +2 -3
  13. package/lib/commands/accounts/list.d.ts.map +1 -1
  14. package/lib/commands/accounts/list.js +2 -12
  15. package/lib/commands/accounts/list.js.map +1 -1
  16. package/lib/commands/accounts/register.js +13 -13
  17. package/lib/commands/accounts/register.js.map +1 -1
  18. package/lib/commands/action.d.ts +2 -3
  19. package/lib/commands/action.d.ts.map +1 -1
  20. package/lib/commands/action.js +2 -3
  21. package/lib/commands/action.js.map +1 -1
  22. package/lib/commands/apps/list.d.ts +2 -3
  23. package/lib/commands/apps/list.d.ts.map +1 -1
  24. package/lib/commands/apps/list.js +2 -14
  25. package/lib/commands/apps/list.js.map +1 -1
  26. package/lib/commands/apps/register.js +10 -10
  27. package/lib/commands/apps/register.js.map +1 -1
  28. package/lib/commands/balances/list.d.ts +0 -2
  29. package/lib/commands/balances/list.d.ts.map +1 -1
  30. package/lib/commands/balances/list.js +9 -17
  31. package/lib/commands/balances/list.js.map +1 -1
  32. package/lib/commands/balances/register.d.ts.map +1 -1
  33. package/lib/commands/balances/register.js +3 -4
  34. package/lib/commands/balances/register.js.map +1 -1
  35. package/lib/commands/books/list.d.ts +2 -4
  36. package/lib/commands/books/list.d.ts.map +1 -1
  37. package/lib/commands/books/list.js +2 -30
  38. package/lib/commands/books/list.js.map +1 -1
  39. package/lib/commands/books/register.js +12 -12
  40. package/lib/commands/books/register.js.map +1 -1
  41. package/lib/commands/cli-helpers.d.ts +9 -4
  42. package/lib/commands/cli-helpers.d.ts.map +1 -1
  43. package/lib/commands/cli-helpers.js +18 -12
  44. package/lib/commands/cli-helpers.js.map +1 -1
  45. package/lib/commands/collections/list.d.ts +2 -3
  46. package/lib/commands/collections/list.d.ts.map +1 -1
  47. package/lib/commands/collections/list.js +2 -14
  48. package/lib/commands/collections/list.js.map +1 -1
  49. package/lib/commands/collections/register.d.ts.map +1 -1
  50. package/lib/commands/collections/register.js +15 -25
  51. package/lib/commands/collections/register.js.map +1 -1
  52. package/lib/commands/events/event-json.d.ts +13 -0
  53. package/lib/commands/events/event-json.d.ts.map +1 -0
  54. package/lib/commands/events/event-json.js +33 -0
  55. package/lib/commands/events/event-json.js.map +1 -0
  56. package/lib/commands/events/list.d.ts +4 -3
  57. package/lib/commands/events/list.d.ts.map +1 -1
  58. package/lib/commands/events/list.js +15 -66
  59. package/lib/commands/events/list.js.map +1 -1
  60. package/lib/commands/events/register.d.ts.map +1 -1
  61. package/lib/commands/events/register.js +7 -6
  62. package/lib/commands/events/register.js.map +1 -1
  63. package/lib/commands/files/list.d.ts +3 -2
  64. package/lib/commands/files/list.d.ts.map +1 -1
  65. package/lib/commands/files/list.js +13 -42
  66. package/lib/commands/files/list.js.map +1 -1
  67. package/lib/commands/files/register.d.ts.map +1 -1
  68. package/lib/commands/files/register.js +13 -10
  69. package/lib/commands/files/register.js.map +1 -1
  70. package/lib/commands/groups/list.d.ts +2 -3
  71. package/lib/commands/groups/list.d.ts.map +1 -1
  72. package/lib/commands/groups/list.js +2 -12
  73. package/lib/commands/groups/list.js.map +1 -1
  74. package/lib/commands/groups/register.js +12 -12
  75. package/lib/commands/groups/register.js.map +1 -1
  76. package/lib/commands/transactions/batch-create.d.ts +1 -1
  77. package/lib/commands/transactions/batch-create.d.ts.map +1 -1
  78. package/lib/commands/transactions/batch-create.js +4 -3
  79. package/lib/commands/transactions/batch-create.js.map +1 -1
  80. package/lib/commands/transactions/batch-update.d.ts +1 -1
  81. package/lib/commands/transactions/batch-update.d.ts.map +1 -1
  82. package/lib/commands/transactions/batch-update.js +4 -3
  83. package/lib/commands/transactions/batch-update.js.map +1 -1
  84. package/lib/commands/transactions/list.d.ts +4 -7
  85. package/lib/commands/transactions/list.d.ts.map +1 -1
  86. package/lib/commands/transactions/list.js +15 -32
  87. package/lib/commands/transactions/list.js.map +1 -1
  88. package/lib/commands/transactions/register.d.ts +1 -1
  89. package/lib/commands/transactions/register.d.ts.map +1 -1
  90. package/lib/commands/transactions/register.js +27 -26
  91. package/lib/commands/transactions/register.js.map +1 -1
  92. package/lib/commands/transactions/transaction-json.d.ts +23 -0
  93. package/lib/commands/transactions/transaction-json.d.ts.map +1 -0
  94. package/lib/commands/transactions/transaction-json.js +56 -0
  95. package/lib/commands/transactions/transaction-json.js.map +1 -0
  96. package/lib/docs/apps/ai.md +2 -2
  97. package/lib/docs/cli/app-management.md +0 -1
  98. package/lib/docs/cli/data-management.md +56 -54
  99. package/lib/docs/index.md +1 -1
  100. package/lib/docs-compliance/live-readme.d.ts.map +1 -1
  101. package/lib/docs-compliance/live-readme.js +0 -3
  102. package/lib/docs-compliance/live-readme.js.map +1 -1
  103. package/lib/docs-compliance/rules.d.ts.map +1 -1
  104. package/lib/docs-compliance/rules.js +9 -0
  105. package/lib/docs-compliance/rules.js.map +1 -1
  106. package/lib/render/index.d.ts +2 -4
  107. package/lib/render/index.d.ts.map +1 -1
  108. package/lib/render/index.js +1 -3
  109. package/lib/render/index.js.map +1 -1
  110. package/lib/render/output.d.ts +42 -22
  111. package/lib/render/output.d.ts.map +1 -1
  112. package/lib/render/output.js +62 -42
  113. package/lib/render/output.js.map +1 -1
  114. package/package.json +8 -7
  115. package/lib/render/csv-formatter.d.ts +0 -15
  116. package/lib/render/csv-formatter.d.ts.map +0 -1
  117. package/lib/render/csv-formatter.js +0 -37
  118. package/lib/render/csv-formatter.js.map +0 -1
  119. package/lib/render/table-formatter.d.ts +0 -34
  120. package/lib/render/table-formatter.d.ts.map +0 -1
  121. package/lib/render/table-formatter.js +0 -239
  122. package/lib/render/table-formatter.js.map +0 -1
@@ -0,0 +1,23 @@
1
+ import type { Transaction } from 'bkper-js';
2
+ /**
3
+ * Serializes a transaction for CLI output.
4
+ *
5
+ * Keeps the bkper-api-types shape (so output can be piped back into
6
+ * `transaction create/update`) and all data fields, with two changes:
7
+ * - `creditAccount.name` / `debitAccount.name` are added, so the from/to flow
8
+ * is readable without a separate account lookup.
9
+ * - Inline agent logos (`agentLogo`, `agentLogoDark`) are dropped: they are
10
+ * image payloads, not information, and dominate output size.
11
+ *
12
+ * @param transaction - The transaction to serialize
13
+ * @returns A new payload object; the transaction itself is not mutated
14
+ */
15
+ export declare function transactionToJson(transaction: Transaction): Promise<bkper.Transaction>;
16
+ /**
17
+ * Serializes a list of transactions for CLI output.
18
+ *
19
+ * Runs sequentially so an account missing from the book cache is fetched once
20
+ * and then served from cache, instead of one parallel request per transaction.
21
+ */
22
+ export declare function transactionsToJson(transactions: Transaction[]): Promise<bkper.Transaction[]>;
23
+ //# sourceMappingURL=transaction-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-json.d.ts","sourceRoot":"","sources":["../../../src/commands/transactions/transaction-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAkB5F;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACpC,YAAY,EAAE,WAAW,EAAE,GAC5B,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAM9B"}
@@ -0,0 +1,56 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ /**
11
+ * Serializes a transaction for CLI output.
12
+ *
13
+ * Keeps the bkper-api-types shape (so output can be piped back into
14
+ * `transaction create/update`) and all data fields, with two changes:
15
+ * - `creditAccount.name` / `debitAccount.name` are added, so the from/to flow
16
+ * is readable without a separate account lookup.
17
+ * - Inline agent logos (`agentLogo`, `agentLogoDark`) are dropped: they are
18
+ * image payloads, not information, and dominate output size.
19
+ *
20
+ * @param transaction - The transaction to serialize
21
+ * @returns A new payload object; the transaction itself is not mutated
22
+ */
23
+ export function transactionToJson(transaction) {
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ const json = Object.assign({}, transaction.json());
26
+ delete json.agentLogo;
27
+ delete json.agentLogoDark;
28
+ const [creditAccount, debitAccount] = yield Promise.all([
29
+ json.creditAccount ? transaction.getCreditAccount() : undefined,
30
+ json.debitAccount ? transaction.getDebitAccount() : undefined,
31
+ ]);
32
+ if (json.creditAccount && creditAccount) {
33
+ json.creditAccount = Object.assign(Object.assign({}, json.creditAccount), { name: creditAccount.getName() });
34
+ }
35
+ if (json.debitAccount && debitAccount) {
36
+ json.debitAccount = Object.assign(Object.assign({}, json.debitAccount), { name: debitAccount.getName() });
37
+ }
38
+ return json;
39
+ });
40
+ }
41
+ /**
42
+ * Serializes a list of transactions for CLI output.
43
+ *
44
+ * Runs sequentially so an account missing from the book cache is fetched once
45
+ * and then served from cache, instead of one parallel request per transaction.
46
+ */
47
+ export function transactionsToJson(transactions) {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ const result = [];
50
+ for (const transaction of transactions) {
51
+ result.push(yield transactionToJson(transaction));
52
+ }
53
+ return result;
54
+ });
55
+ }
56
+ //# sourceMappingURL=transaction-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-json.js","sourceRoot":"","sources":["../../../src/commands/transactions/transaction-json.ts"],"names":[],"mappings":";;;;;;;;;AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAgB,iBAAiB,CAAC,WAAwB;;QAC5D,MAAM,IAAI,qBAA2B,WAAW,CAAC,IAAI,EAAE,CAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,SAAS,CAAC;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;QAE1B,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS;YAC/D,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS;SAChE,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,aAAa,IAAI,aAAa,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,mCAAQ,IAAI,CAAC,aAAa,KAAE,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,GAAE,CAAC;QAClF,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,mCAAQ,IAAI,CAAC,YAAY,KAAE,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,GAAE,CAAC;QAC/E,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CAAA;AAED;;;;;GAKG;AACH,MAAM,UAAgB,kBAAkB,CACpC,YAA2B;;QAE3B,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;CAAA"}
@@ -6,10 +6,10 @@ This guide covers a server-side, non-streaming language response. It uses AI SDK
6
6
 
7
7
  ## Choose the kind of response
8
8
 
9
- - **A bounded yes/no, choice, or score?** Use a typed evaluation (Jev) at `POST /v1/evaluations`.
9
+ - **A bounded yes/no, choice, or score?** Use a typed evaluation at `POST /v1/evaluations`.
10
10
  - **Generated text or a custom JSON object?** Use a language model at `POST /v1/responses`. AI SDK is an option for this path.
11
11
 
12
- Pick a model of the corresponding `type` from the live [`GET /v1/models` catalog](https://ai.bkper.app/v1/models). The catalog also tells you which language models support strict structured output. AI SDK's **Open Responses provider** covers language responses, not Bkper's typed evaluation endpoint. For Jev, use HTTP or implement an AI SDK evaluation-model adapter for `experimental_evaluate`, as `bkper-agent` does. See [Typed evaluations](https://bkper.com/docs/ai/ai-gateway.md#typed-evaluations) and the [Merge Duplicates app](https://github.com/bkper/bkper-apps/tree/main/merge-duplicates) for a human-reviewed HTTP example.
12
+ Pick a model of the corresponding `type` from the live [`GET /v1/models` catalog](https://ai.bkper.app/v1/models). The catalog also tells you which language models support strict structured output. AI SDK's **Open Responses provider** covers language responses, not Bkper's typed evaluation endpoint. For evaluation models, use HTTP or implement an AI SDK evaluation-model adapter for `experimental_evaluate`, as `bkper-agent` does. See the [Typed Evaluations guide](https://bkper.com/docs/ai/evaluations.md) for requests, responses, decision thresholds, and errors, and the [Merge Duplicates app](https://github.com/bkper/bkper-apps/tree/main/merge-duplicates) for a human-reviewed HTTP example.
13
13
 
14
14
  ## Keep authentication in the platform
15
15
 
@@ -188,7 +188,6 @@ bkper app sync && bkper app deploy
188
188
 
189
189
  # Inspect a registered app by id
190
190
  bkper app get <appId>
191
- bkper app get <appId> --json
192
191
 
193
192
  # Deploy to preview environment (URL: https://{appId}-preview.bkper.app)
194
193
  bkper app deploy --preview
@@ -188,7 +188,7 @@ Upload local files to a book and optionally route them with properties.
188
188
  # List the first page of files in a book
189
189
  bkper file list -b abc123
190
190
 
191
- # Fetch the next page using the cursor shown in table output or JSON
191
+ # Fetch the next page using the cursor from the previous output
192
192
  bkper file list -b abc123 --limit 100 --cursor cursor_123
193
193
 
194
194
  # Upload a file to a book
@@ -258,9 +258,6 @@ bkper transaction list -b abc123 -q 'on:2025'
258
258
  # List transactions for a month (on:YYYY-MM)
259
259
  bkper transaction list -b abc123 -q 'on:2025-01'
260
260
 
261
- # List with custom properties included
262
- bkper transaction list -b abc123 -q 'account:Sales' -p
263
-
264
261
  # Fetch one page of transactions explicitly
265
262
  bkper transaction list -b abc123 -q 'on:2025' --limit 100
266
263
 
@@ -296,7 +293,6 @@ bkper transaction merge tx_123 tx_456 -b abc123
296
293
  - `transaction list -b <bookId> -q <query>` - List transactions matching a query (auto-paginates through all results unless `--limit` or `--cursor` is provided)
297
294
  - `--limit <number>` - Fetch one page with up to this many transactions
298
295
  - `--cursor <cursor>` - Cursor for fetching the next page
299
- - `-p, --properties` - Include custom properties in the output
300
296
  - `transaction create -b <bookId>` - Create a transaction
301
297
  - `--date <date>` - Transaction date
302
298
  - `--amount <amount>` - Transaction amount
@@ -336,11 +332,11 @@ Inspect book events and bot responses — useful for debugging automations and r
336
332
  # List recent events (one page, default limit 50)
337
333
  bkper event list -b abc123
338
334
 
339
- # List only events with error bot responses, as JSON (includes full botResponses)
340
- bkper event list -b abc123 --error --json
335
+ # List only events with error bot responses (includes full botResponses)
336
+ bkper event list -b abc123 --error
341
337
 
342
338
  # Filter by resource (transaction, account, or group id)
343
- bkper event list -b abc123 --resource tx_456 --json
339
+ bkper event list -b abc123 --resource tx_456
344
340
 
345
341
  # Filter by event type and date range
346
342
  bkper event list -b abc123 --type TRANSACTION_POSTED --after 2026-01-01T00:00:00Z
@@ -349,13 +345,13 @@ bkper event list -b abc123 --type TRANSACTION_POSTED --after 2026-01-01T00:00:00
349
345
  bkper event list -b abc123 --limit 50 --cursor cursor_123
350
346
 
351
347
  # Replay one bot response after inspecting an error
352
- bkper event replay evt_789 -b abc123 --agent-id tax-bot --json
348
+ bkper event replay evt_789 -b abc123 --agent-id tax-bot
353
349
  ```
354
350
 
355
351
  <details>
356
352
  <summary>Command reference</summary>
357
353
 
358
- - `event list -b <bookId>` - List one page of events in a book (includes bot responses in JSON)
354
+ - `event list -b <bookId>` - List one page of events in a book (includes bot responses)
359
355
  - `--after <date>` - Start date inclusive (RFC3339)
360
356
  - `--before <date>` - End date exclusive (RFC3339)
361
357
  - `--resource <resourceId>` - Filter by resource ID (Transaction, Account, or Group). When set, `--error` and `--type` are ignored by the API
@@ -365,7 +361,7 @@ bkper event replay evt_789 -b abc123 --agent-id tax-bot --json
365
361
  - `--cursor <cursor>` - Cursor for fetching the next page
366
362
  - `event replay <eventId> -b <bookId> --agent-id <agentId>` - Replay one bot response for an event (returns the updated event with bot responses)
367
363
 
368
- JSON output includes the full event payload, including nested `botResponses` (`agentId`, `type`, `message`, `createdAt`), for LLM-assisted debugging.
364
+ Output includes the full event payload, including nested `botResponses` (`agentId`, `type`, `message`, `createdAt`), for LLM-assisted debugging.
369
365
 
370
366
  </details>
371
367
 
@@ -474,53 +470,56 @@ bkper collection delete col_789
474
470
 
475
471
  ## Output Format
476
472
 
477
- All commands support three output formats via the `--format` global flag:
473
+ All data commands output **JSON only**. Results go to stdout; hints (such as the next-page command), warnings, and notices go to stderr, so stdout is always parseable.
478
474
 
479
- | Format | Flag | Best for |
480
- | ------ | -------------------------- | ------------------------------------------- |
481
- | Table | `--format table` (default) | Human reading in the terminal |
482
- | JSON | `--format json` | Programmatic access, cursors, single-item detail |
483
- | CSV | `--format csv` | LLM consumption, spreadsheets, list reports |
475
+ | Output | Shape |
476
+ | --------------------------------------------------- | ------------------------------------------------------- |
477
+ | Lists (`book list`, `transaction list`, batch writes, ...) | `{"items":[...]}`, plus `"cursor"` only when another page exists |
478
+ | Single items (`get`, `create`, `update`, ...) | One JSON object |
479
+ | Balances (`balance list`) | A 2D matrix: header row first, then one row per account or group |
484
480
 
485
481
  ```bash
486
- # Table output (default)
482
+ # List output: one record per line inside the envelope
487
483
  bkper account list -b abc123
484
+ # {"items":[
485
+ # {"id":"acc-abc","name":"Cash","type":"ASSET",...},
486
+ # {"id":"acc-def","name":"Revenue","type":"INCOMING",...}
487
+ # ]}
488
+ ```
488
489
 
489
- # JSON output
490
- bkper account list -b abc123 --format json
491
- # { "items": [...] }
490
+ **Layout:**
492
491
 
493
- # CSV output -- raw data, no truncation, RFC 4180
494
- bkper account list -b abc123 --format csv
495
- ```
492
+ - Lists and balance matrices put one record or row per line, so `head`, `grep`, and `wc -l` work on records.
493
+ - Single items are pretty-printed on an interactive terminal and compact (one line) otherwise.
496
494
 
497
- **JSON list output details:**
495
+ **Transactions** keep the [Bkper API Types](https://raw.githubusercontent.com/bkper/bkper-api-types/refs/heads/master/index.d.ts) shape, with `creditAccount.name` and `debitAccount.name` added so the from/to flow is readable without a separate account lookup. Custom properties are always included. Inline agent logo images are omitted.
498
496
 
499
- - Resource list commands return an object with an `items` array: `{ "items": [...] }`.
500
- - Paginated list commands include `cursor` only when another page is available: `{ "items": [...], "cursor": "..." }`.
501
- - Use `jq '.items[]'` to iterate list output.
497
+ **Balances** values are unformatted JSON numbers (never locale-formatted strings), dates are ISO `yyyy-MM-dd`, and account/group properties are included as extra columns. Transaction `amount` values are exact decimal strings.
502
498
 
503
- **CSV output details:**
499
+ **Reshape with jq** instead of output flags:
504
500
 
505
- - **RFC 4180 compliant** -- proper quoting, CRLF line endings, no truncation
506
- - **All metadata included** -- IDs, properties, hidden properties, URLs, and timestamps are enabled
507
- - **Raw values** -- dates stay in ISO format, numbers are unformatted (no locale formatting)
508
- - **Single-item commands** (e.g. `account get`, `transaction create`) fall back to JSON since CSV adds no value for non-tabular data
501
+ ```bash
502
+ # Iterate list items
503
+ bkper transaction list -b abc123 -q 'on:2025-01' | jq '.items[]'
509
504
 
510
- **LLM-first output guidance (important):**
505
+ # Pick columns
506
+ bkper transaction list -b abc123 -q 'on:2025-01' | \
507
+ jq '.items[] | {date, amount, from: .creditAccount.name, to: .debitAccount.name, description}'
511
508
 
512
- When command output will be loaded into an LLM context (chat, prompt, memory, or agent reasoning), prefer:
509
+ # Export to CSV
510
+ bkper transaction list -b abc123 -q 'on:2025-01' | \
511
+ jq -r '.items[] | [.date, .amount, .creditAccount.name, .debitAccount.name, .description] | @csv'
513
512
 
514
- - **`--format csv` for list commands** (`balance list`, `transaction list`, `account list`, etc.).
515
- - **`--format json` for single-item commands** (`get`, `create`, `update`), cursor pagination, and CLI-to-CLI pipelines.
513
+ # Balance matrix to CSV
514
+ bkper balance list -b abc123 -q 'on:2025-12-31' | jq -r '.[] | @csv'
516
515
 
517
- CSV is significantly more token-efficient than JSON for tabular data, and for wide balance outputs it can reduce token usage by up to **95%**.
516
+ # Read the next-page cursor
517
+ bkper transaction list -b abc123 -q 'on:2025' --limit 100 | jq -r '.cursor // empty'
518
+ ```
518
519
 
519
- **Quick rule:**
520
+ For accounting numbers, compute with a deterministic script or query rather than summing by eye. Balance values are JSON numbers, so extremely large values with many decimal places (beyond ~15 significant digits) can lose their last digits; use transaction `amount` strings when exact digits matter.
520
521
 
521
- - **LLM consumption of lists/reports** → CSV
522
- - **Programmatic processing / pipelines** → JSON
523
- - **Human terminal reading** → Table
522
+ `--json` and `--format json` are accepted for compatibility and have no effect. Table and CSV output formats were removed; any other `--format` value fails with a jq hint.
524
523
 
525
524
  ---
526
525
 
@@ -564,43 +563,46 @@ echo '[{"name":"Cash","type":"ASSET"}]' | \
564
563
  bkper account create -b abc123 -p "region=LATAM"
565
564
  ```
566
565
 
567
- **Batch output:** write commands output created or updated resources as a flat JSON array:
566
+ **Batch output:** write commands output created or updated resources in the same `{"items":[...]}` envelope as lists:
568
567
 
569
568
  ```bash
570
569
  bkper account create -b abc123 < accounts.json
571
- # Output: [{"id":"acc-abc","name":"Cash",...}, {"id":"acc-def","name":"Revenue",...}]
570
+ # {"items":[
571
+ # {"id":"acc-abc","name":"Cash",...},
572
+ # {"id":"acc-def","name":"Revenue",...}
573
+ # ]}
572
574
  ```
573
575
 
574
- List JSON output uses an `{ "items": [...] }` envelope, and stdin batch commands unwrap that envelope automatically for CLI-to-CLI pipes.
576
+ Stdin accepts a single object, an array, or the `{"items":[...]}` envelope, so list and batch output can be piped directly into another command.
575
577
 
576
578
  **Piping between commands:**
577
579
 
578
- For resources that support stdin creation, JSON output can be piped directly into create or update commands:
580
+ For resources that support stdin creation, output can be piped directly into create or update commands:
579
581
 
580
582
  ```bash
581
583
  # Copy all accounts from one book to another
582
- bkper account list -b $BOOK_A --format json | bkper account create -b $BOOK_B
584
+ bkper account list -b $BOOK_A | bkper account create -b $BOOK_B
583
585
 
584
586
  # Copy transactions matching a query
585
- bkper transaction list -b $BOOK_A -q 'after:2025-01-01' --format json | \
587
+ bkper transaction list -b $BOOK_A -q 'after:2025-01-01' | \
586
588
  bkper transaction create -b $BOOK_B
587
589
 
588
590
  # Clone accounts, then transactions
589
- bkper account list -b $SOURCE --format json | bkper account create -b $DEST
590
- bkper transaction list -b $SOURCE -q 'after:2025-01-01' --format json | \
591
+ bkper account list -b $SOURCE | bkper account create -b $DEST
592
+ bkper transaction list -b $SOURCE -q 'after:2025-01-01' | \
591
593
  bkper transaction create -b $DEST
592
594
 
593
595
  # Batch update: list transactions, modify, and pipe back to update
594
- bkper transaction list -b $BOOK -q 'after:2025-01-01' --format json | \
595
- jq '[.[] | .description = "Updated: " + .description]' | \
596
+ bkper transaction list -b $BOOK -q 'after:2025-01-01' | \
597
+ jq '[.items[] | .description = "Updated: " + .description]' | \
596
598
  bkper transaction update -b $BOOK
597
599
 
598
600
  # Batch update: add a property to all matching transactions
599
- bkper transaction list -b $BOOK -q 'account:Expenses' --format json | \
601
+ bkper transaction list -b $BOOK -q 'account:Expenses' | \
600
602
  bkper transaction update -b $BOOK -p "reviewed=true"
601
603
 
602
604
  # Batch update checked transactions
603
- bkper transaction list -b $BOOK -q 'is:checked after:2025-01-01' --format json | \
605
+ bkper transaction list -b $BOOK -q 'is:checked after:2025-01-01' | \
604
606
  bkper transaction update -b $BOOK --update-checked -p "migrated=true"
605
607
  ```
606
608
 
package/lib/docs/index.md CHANGED
@@ -7,7 +7,7 @@ For Bkper data, accounting, reporting, tax, or financial-flow tasks, read `core/
7
7
  For Bkper app implementation, refactoring, or code review, always read `apps/quality.md` alongside the task-specific references. After implementation, review the changed code against the guidelines before considering the work complete.
8
8
 
9
9
  - `core/core-concepts.md` — canonical Bkper data model: resources, movements, balances, accounts, groups, books, transactions, properties, and the zero-sum invariant.
10
- - `cli/data-management.md` — CLI reference for managing financial data and files: books, accounts, groups, files, transactions, per-account balance queries, query operators (on:, after:, before:, account:, group:), output formats (table/json/csv), human-review Bkper UI links, batch operations via stdin/piping, collections.
10
+ - `cli/data-management.md` — CLI reference for managing financial data and files: books, accounts, groups, files, transactions, per-account balance queries, query operators (on:, after:, before:, account:, group:), JSON output shapes and jq reshaping, human-review Bkper UI links, batch operations via stdin/piping, collections.
11
11
  - `cli/app-management.md` — CLI reference for building and deploying Bkper apps: init/git clone/credential helpers, dev/build/deploy workflow, app install/uninstall, secrets management, app logs, bkper.yaml configuration reference (identity, branding, events, menu integration, deployment).
12
12
  - `apps/overview.md` — Platform evaluation and capability overview: use when comparing managed Bkper hosting with self-managed infrastructure or clarifying platform responsibilities; use the task-specific app references for implementation.
13
13
  - `apps/ai.md` — Bkper AI in Platform apps: choose Jev typed evaluations or Open Responses language models, authenticate through app `/api/*` routes, discover model capabilities, validate output, and keep Book writes under deterministic application control.
@@ -1 +1 @@
1
- {"version":3,"file":"live-readme.d.ts","sourceRoot":"","sources":["../../src/docs-compliance/live-readme.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AA4DD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CActE;AAED,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,GACxB,mBAAmB,CAiCrB"}
1
+ {"version":3,"file":"live-readme.d.ts","sourceRoot":"","sources":["../../src/docs-compliance/live-readme.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AA4DD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CActE;AAED,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,GACxB,mBAAmB,CA6BrB"}
@@ -81,9 +81,6 @@ export function materializeCommand(command, config) {
81
81
  skipReason: `unresolved placeholders in command: ${materialized}`,
82
82
  };
83
83
  }
84
- if (!materialized.includes('--format ')) {
85
- materialized = `${materialized} --format csv`;
86
- }
87
84
  return { command: materialized };
88
85
  }
89
86
  //# sourceMappingURL=live-readme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"live-readme.js","sourceRoot":"","sources":["../../src/docs-compliance/live-readme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-readme.js","sourceRoot":"","sources":["../../src/docs-compliance/live-readme.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AA4BD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CA+F1E"}
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AA4BD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CA0G1E"}
@@ -67,6 +67,15 @@ export function evaluateReadmeCompliance(content) {
67
67
  message: 'README should not document stdin writable fields for `bkper.Group`.',
68
68
  });
69
69
  }
70
+ const legacyOutputFormatPattern = /--format(?:\s+|=)(?:table|csv)\b/g;
71
+ let legacyOutputFormatMatch;
72
+ while ((legacyOutputFormatMatch = legacyOutputFormatPattern.exec(content)) !== null) {
73
+ errors.push({
74
+ code: 'legacy-output-format-documented',
75
+ message: 'Found `--format table|csv`. CLI output is JSON only; reshape with jq instead.',
76
+ line: getLineNumber(content, legacyOutputFormatMatch.index),
77
+ });
78
+ }
70
79
  const internalReleaseDetailPattern = /release:(patch|minor|major)|Trusted Publisher|GitHub Actions|CI\/CD|publishing policy|publish(?:ing)?\s+is\s+handled|maintainer-only procedures/i;
71
80
  const internalReleaseDetailMatch = internalReleaseDetailPattern.exec(content);
72
81
  if (internalReleaseDetailMatch) {
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/docs-compliance/rules.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,3 @@
1
- export { formatTable, formatItem } from './table-formatter.js';
2
- export { formatCsv } from './csv-formatter.js';
3
- export { renderTable, renderItem, renderListResult } from './output.js';
4
- export type { OutputFormat, ListResult } from './output.js';
1
+ export { formatItem, formatList, formatMatrix, isInteractiveOutput, renderItem, renderList, renderMatrix, renderNotice, } from './output.js';
2
+ export type { ListResult } from './output.js';
5
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACV,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,GACf,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -1,4 +1,2 @@
1
- export { formatTable, formatItem } from './table-formatter.js';
2
- export { formatCsv } from './csv-formatter.js';
3
- export { renderTable, renderItem, renderListResult } from './output.js';
1
+ export { formatItem, formatList, formatMatrix, isInteractiveOutput, renderItem, renderList, renderMatrix, renderNotice, } from './output.js';
4
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACV,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,GACf,MAAM,aAAa,CAAC"}
@@ -1,37 +1,57 @@
1
1
  /**
2
- * Output format type for CLI rendering.
2
+ * JSON-only output rendering.
3
+ *
4
+ * Contract:
5
+ * - stdout carries only the JSON result, so it is always parseable (e.g. by jq).
6
+ * - Lists use a stable `{"items":[...]}` envelope, adding `"cursor"` only when a
7
+ * next page exists. Each record is compact on its own line.
8
+ * - Matrices (balance reports) are bare 2D arrays with one row per line.
9
+ * - Single items are pretty-printed only on an interactive terminal.
10
+ * - Hints, notices, and warnings go to stderr.
3
11
  */
4
- export type OutputFormat = 'table' | 'json' | 'csv';
5
12
  /**
6
- * Structured result from list commands, allowing cli.ts to render
7
- * without knowing how the data was built.
13
+ * Structured list result returned by list commands.
8
14
  */
9
- export type ListResult = {
10
- kind: 'json';
15
+ export interface ListResult {
11
16
  items: unknown[];
17
+ /** Cursor for the next page, present only when more results exist. */
12
18
  cursor?: string;
13
- } | {
14
- kind: 'matrix';
15
- matrix: unknown[][];
16
- footer?: string;
17
- };
19
+ /** Human/agent guidance (e.g. next-page command), written to stderr. */
20
+ hint?: string;
21
+ }
18
22
  /**
19
- * Renders a ListResult to stdout based on the active output format.
23
+ * Formats list items in the `{"items":[...]}` envelope, one record per line.
20
24
  */
21
- export declare function renderListResult(result: ListResult, format: OutputFormat): void;
25
+ export declare function formatList(items: unknown[], cursor?: string): string;
22
26
  /**
23
- * Renders a 2D matrix as a formatted table, JSON, or CSV.
24
- *
25
- * @param matrix - 2D array where row 0 is headers and rows 1+ are data
26
- * @param format - Output format: 'table' (default), 'json', or 'csv'
27
+ * Formats a 2D matrix as JSON, one row per line.
28
+ */
29
+ export declare function formatMatrix(matrix: unknown[][]): string;
30
+ /**
31
+ * Formats a single item as pretty (2-space) or compact JSON.
32
+ */
33
+ export declare function formatItem(item: object, pretty: boolean): string;
34
+ /**
35
+ * Whether stdout is an interactive terminal (a human is reading).
27
36
  */
28
- export declare function renderTable(matrix: unknown[][], format: OutputFormat): void;
37
+ export declare function isInteractiveOutput(): boolean;
29
38
  /**
30
- * Renders a single item as key-value pairs, JSON, or JSON (for CSV, since
31
- * single items are not tabular, CSV falls back to JSON).
39
+ * Renders a list result: JSON to stdout, hint to stderr.
40
+ */
41
+ export declare function renderList(result: ListResult): void;
42
+ /**
43
+ * Renders a 2D matrix as JSON to stdout.
44
+ */
45
+ export declare function renderMatrix(matrix: unknown[][]): void;
46
+ /**
47
+ * Renders a single item as JSON to stdout.
32
48
  *
33
49
  * @param item - Record to render
34
- * @param format - Output format: 'table' (default), 'json', or 'csv'
50
+ * @param pretty - Pretty-print; defaults to true only on an interactive terminal
51
+ */
52
+ export declare function renderItem(item: object, pretty?: boolean): void;
53
+ /**
54
+ * Renders a human-readable notice (e.g. success without a result) to stderr.
35
55
  */
36
- export declare function renderItem(item: object, format: OutputFormat): void;
56
+ export declare function renderNotice(message: string): void;
37
57
  //# sourceMappingURL=output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/render/output.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAEpD;;;GAGG;AACH,MAAM,MAAM,UAAU,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAU/E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAe3E;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAQnE"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/render/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AASD;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAKnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,UAAwB,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD"}