jaz-clio 4.25.0 → 4.25.1

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-api
3
- version: 4.25.0
3
+ version: 4.25.1
4
4
  description: Complete reference for the Jaz REST API — the accounting platform backend. Use this skill whenever building, modifying, debugging, or extending any code that calls the API — including API clients, integrations, data seeding, test data, or new endpoint work. Contains every field name, response shape, error, gotcha, and edge case discovered through live production testing.
5
5
  license: MIT
6
6
  compatibility: Requires Jaz API key (x-jk-api-key header). Works with Claude Code, Google Antigravity, OpenAI Codex, GitHub Copilot, Cursor, and any agent that reads markdown.
@@ -85,7 +85,7 @@ You are working with the **Jaz REST API** — the accounting platform backend. A
85
85
 
86
86
  ### Custom Fields
87
87
  35. **Do NOT send `appliesTo` on custom field POST** — causes "Invalid request body". Only send `name`, `type`, `printOnDocuments`.
88
- 35a. **Custom field values on transactions**: Set via `customFields: [{ customFieldName: "PO Number", actualValue: "PO-123" }]` on invoice/bill/customer-CN/supplier-CN create/update. NOT on journals, cash entries, or cash transfers. Read from GET responses in the same shape.
88
+ 35a. **Custom field values on transactions**: Set via `customFields: [{ customFieldName: "PO Number", actualValue: "PO-123" }]` on invoice/bill/customer-CN/supplier-CN/payment/item create/update. NOT on journals, cash entries, or cash transfers. Read from GET responses in the same shape.
89
89
  35b. **Custom field search**: `POST /custom-fields/search` with filter/sort/limit/offset. Filter by `customFieldName` (StringExpression), `datatypeCode` (StringExpression: TEXT, DATE, DROPDOWN).
90
90
  35c. **Custom field GET**: `GET /custom-fields/:resourceId` returns full definition including `applyToSales`, `applyToPurchase`, `applyToCreditNote`, `applyToPayment`, `printOnDocuments`, `listOptions`.
91
91
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-conversion
3
- version: 4.25.0
3
+ version: 4.25.1
4
4
  description: Accounting data conversion skill — migrates customer data from Xero, QuickBooks, Sage, MYOB, and Excel exports to Jaz. Covers config, quick, and full conversion workflows, Excel parsing, CoA/contact/tax/items mapping, clearing accounts, TTB, and TB verification.
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-jobs
3
- version: 4.25.0
3
+ version: 4.25.1
4
4
  description: 12 accounting jobs for SMB bookkeepers and accountants — month-end, quarter-end, and year-end close playbooks plus 9 ad-hoc operational jobs (bank recon, document collection, GST/VAT filing, payment runs, credit control, supplier recon, audit prep, fixed asset review, statutory filing). Jobs can have paired tools as nested subcommands (e.g., `clio jobs bank-recon match`, `clio jobs document-collection ingest`, `clio jobs statutory-filing sg-cs`). Paired with an interactive CLI blueprint generator (clio jobs).
5
5
  license: MIT
6
6
  compatibility: Works with Claude Code, Claude Cowork, Claude.ai, and any agent that reads markdown. For API payloads, load the jaz-api skill. For individual transaction patterns, load the jaz-recipes skill.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-recipes
3
- version: 4.25.0
3
+ version: 4.25.1
4
4
  description: 16 IFRS-compliant recipes for complex multi-step accounting in Jaz — prepaid amortization, deferred revenue, loan schedules, IFRS 16 leases, hire purchase, fixed deposits, asset disposal, FX revaluation, ECL provisioning, IAS 37 provisions, dividends, intercompany, and capital WIP. Each recipe includes journal entries, capsule structure, and verification steps. Paired with 13 financial calculators that produce execution-ready blueprints with workings.
5
5
  license: MIT
6
6
  compatibility: Works with Claude Code, Claude Cowork, Claude.ai, and any agent that reads markdown. For API payloads, load the jaz-api skill alongside this one.
@@ -254,17 +254,20 @@ export function registerBillsCommand(program) {
254
254
  .option('--method <method>', 'Payment method (BANK_TRANSFER, CASH, CHEQUE, etc.)', 'BANK_TRANSFER')
255
255
  .option('--ref <reference>', 'Payment reference')
256
256
  .option('--draft', 'Save as draft instead of finalizing')
257
+ .option('--custom-fields <json>', 'Custom field values as JSON array')
257
258
  .option('--input <file>', 'Read full payment body from JSON file (or pipe via stdin)')
258
259
  .option('--api-key <key>', 'API key (overrides stored/env)')
259
260
  .option('--json', 'Output as JSON')
260
261
  .action((resourceId, opts) => apiAction(async (client) => {
261
262
  const body = readBodyInput(opts);
263
+ const customFields = opts.customFields ? parseCustomFields(opts.customFields) : undefined;
262
264
  let res;
263
265
  if (body) {
264
266
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- user-provided JSON, API validates
265
267
  res = await createBillPayment(client, resourceId, {
266
268
  ...body,
267
269
  saveAsDraft: body.saveAsDraft ?? (opts.draft ?? false),
270
+ customFields: body.customFields ?? customFields,
268
271
  });
269
272
  }
270
273
  else {
@@ -287,6 +290,7 @@ export function registerBillsCommand(program) {
287
290
  paymentMethod: opts.method,
288
291
  reference: opts.ref ?? '',
289
292
  saveAsDraft: opts.draft ?? false,
293
+ customFields,
290
294
  });
291
295
  }
292
296
  if (opts.json) {
@@ -256,17 +256,20 @@ export function registerInvoicesCommand(program) {
256
256
  .option('--method <method>', 'Payment method (BANK_TRANSFER, CASH, CHEQUE, etc.)', 'BANK_TRANSFER')
257
257
  .option('--ref <reference>', 'Payment reference')
258
258
  .option('--draft', 'Save as draft instead of finalizing')
259
+ .option('--custom-fields <json>', 'Custom field values as JSON array')
259
260
  .option('--input <file>', 'Read full payment body from JSON file (or pipe via stdin)')
260
261
  .option('--api-key <key>', 'API key (overrides stored/env)')
261
262
  .option('--json', 'Output as JSON')
262
263
  .action((resourceId, opts) => apiAction(async (client) => {
263
264
  const body = readBodyInput(opts);
265
+ const customFields = opts.customFields ? parseCustomFields(opts.customFields) : undefined;
264
266
  let res;
265
267
  if (body) {
266
268
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- user-provided JSON, API validates
267
269
  res = await createInvoicePayment(client, resourceId, {
268
270
  ...body,
269
271
  saveAsDraft: body.saveAsDraft ?? (opts.draft ?? false),
272
+ customFields: body.customFields ?? customFields,
270
273
  });
271
274
  }
272
275
  else {
@@ -289,6 +292,7 @@ export function registerInvoicesCommand(program) {
289
292
  paymentMethod: opts.method,
290
293
  reference: opts.ref ?? '',
291
294
  saveAsDraft: opts.draft ?? false,
295
+ customFields,
292
296
  });
293
297
  }
294
298
  if (opts.json) {
@@ -2,7 +2,7 @@ import chalk from 'chalk';
2
2
  import { listItems, getItem, searchItems, createItem, updateItem, deleteItem, } from '../core/api/items.js';
3
3
  import { apiAction } from './api-action.js';
4
4
  import { outputList } from './output.js';
5
- import { parsePositiveInt, parseNonNegativeInt, parseMoney, readBodyInput, requireFields } from './parsers.js';
5
+ import { parsePositiveInt, parseNonNegativeInt, parseMoney, readBodyInput, requireFields, parseCustomFields } from './parsers.js';
6
6
  import { paginatedFetch } from './pagination.js';
7
7
  import { formatId } from './format-helpers.js';
8
8
  const ITEMS_COLUMNS = [
@@ -101,6 +101,7 @@ export function registerItemsCommand(program) {
101
101
  .option('--purchase-account <resourceId>', 'Purchase account resourceId')
102
102
  .option('--sale-tax <resourceId>', 'Sale tax profile resourceId')
103
103
  .option('--purchase-tax <resourceId>', 'Purchase tax profile resourceId')
104
+ .option('--custom-fields <json>', 'Custom field values as JSON array: [{"customFieldName":"PO Number","actualValue":"PO-123"}]')
104
105
  .option('--input <file>', 'Read full request body from JSON file (or pipe via stdin)')
105
106
  .option('--api-key <key>', 'API key (overrides stored/env)')
106
107
  .option('--format <type>', 'Output format: table, json, csv, yaml')
@@ -117,6 +118,7 @@ export function registerItemsCommand(program) {
117
118
  { flag: '--name', key: 'name' },
118
119
  { flag: '--code', key: 'code' },
119
120
  ]);
121
+ const customFields = opts.customFields ? parseCustomFields(opts.customFields) : undefined;
120
122
  res = await createItem(client, {
121
123
  internalName: opts.name,
122
124
  itemCode: opts.code,
@@ -128,6 +130,7 @@ export function registerItemsCommand(program) {
128
130
  purchaseAccountResourceId: opts.purchaseAccount,
129
131
  saleTaxProfileResourceId: opts.saleTax,
130
132
  purchaseTaxProfileResourceId: opts.purchaseTax,
133
+ customFields,
131
134
  });
132
135
  }
133
136
  if (opts.json) {
@@ -147,6 +150,7 @@ export function registerItemsCommand(program) {
147
150
  .option('--sale-price <n>', 'New sale price', parseMoney)
148
151
  .option('--purchase-price <n>', 'New purchase price', parseMoney)
149
152
  .option('--status <status>', 'Status (ACTIVE/INACTIVE)')
153
+ .option('--custom-fields <json>', 'Custom field values as JSON array')
150
154
  .option('--input <file>', 'Read full update body from JSON file (or pipe via stdin)')
151
155
  .option('--api-key <key>', 'API key (overrides stored/env)')
152
156
  .option('--format <type>', 'Output format: table, json, csv, yaml')
@@ -169,6 +173,8 @@ export function registerItemsCommand(program) {
169
173
  data.purchasePrice = opts.purchasePrice;
170
174
  if (opts.status !== undefined)
171
175
  data.status = opts.status;
176
+ if (opts.customFields)
177
+ data.customFields = parseCustomFields(opts.customFields);
172
178
  }
173
179
  const res = await updateItem(client, resourceId, data);
174
180
  if (opts.json) {
@@ -417,6 +417,7 @@ export const TOOL_DEFINITIONS = [
417
417
  enum: ['CASH', 'BANK_TRANSFER', 'CREDIT_CARD', 'CHEQUE', 'E_WALLET', 'OTHER'],
418
418
  description: 'Payment method (default BANK_TRANSFER)',
419
419
  },
420
+ customFields: CUSTOM_FIELDS_PARAM,
420
421
  },
421
422
  required: ['resourceId', 'paymentAmount', 'accountResourceId', 'valueDate'],
422
423
  group: 'invoices',
@@ -439,6 +440,7 @@ export const TOOL_DEFINITIONS = [
439
440
  reference: input.reference ?? '',
440
441
  paymentMethod: (input.paymentMethod ?? 'BANK_TRANSFER'),
441
442
  saveAsDraft: false,
443
+ customFields: input.customFields, // eslint-disable-line @typescript-eslint/no-explicit-any
442
444
  });
443
445
  },
444
446
  },
@@ -603,6 +605,7 @@ export const TOOL_DEFINITIONS = [
603
605
  valueDate: { type: 'string' },
604
606
  reference: { type: 'string' },
605
607
  paymentMethod: { type: 'string' },
608
+ customFields: CUSTOM_FIELDS_PARAM,
606
609
  },
607
610
  required: ['resourceId', 'paymentAmount', 'accountResourceId', 'valueDate'],
608
611
  group: 'bills',
@@ -625,6 +628,7 @@ export const TOOL_DEFINITIONS = [
625
628
  reference: input.reference ?? '',
626
629
  paymentMethod: (input.paymentMethod ?? 'BANK_TRANSFER'),
627
630
  saveAsDraft: false,
631
+ customFields: input.customFields, // eslint-disable-line @typescript-eslint/no-explicit-any
628
632
  });
629
633
  },
630
634
  },
@@ -904,6 +908,7 @@ export const TOOL_DEFINITIONS = [
904
908
  purchasePrice: { type: 'number', description: 'Default purchase price' },
905
909
  saleAccountResourceId: { type: 'string', description: 'Revenue account for sales' },
906
910
  purchaseAccountResourceId: { type: 'string', description: 'Expense account for purchases' },
911
+ customFields: CUSTOM_FIELDS_PARAM,
907
912
  },
908
913
  required: ['itemCode', 'internalName'],
909
914
  group: 'items',
@@ -920,6 +925,7 @@ export const TOOL_DEFINITIONS = [
920
925
  salePrice: { type: 'number' },
921
926
  purchasePrice: { type: 'number' },
922
927
  status: { type: 'string', enum: ['ACTIVE', 'INACTIVE'] },
928
+ customFields: CUSTOM_FIELDS_PARAM,
923
929
  },
924
930
  required: ['resourceId'],
925
931
  group: 'items',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jaz-clio",
3
- "version": "4.25.0",
3
+ "version": "4.25.1",
4
4
  "description": "Clio — Command Line Interface Orchestrator for Jaz AI.",
5
5
  "type": "module",
6
6
  "bin": {