busa-cli 0.10.1 → 0.10.2

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.
@@ -234,11 +234,11 @@ var baseFieldChangeTask = {
234
234
  ...input.message ? { message: input.message } : {},
235
235
  ...input.submittedBy ? { submittedBy: input.submittedBy } : {}
236
236
  };
237
- const bases = client.bases;
238
237
  switch (input.operation) {
239
238
  case "add":
240
- return bases.createFieldChangeRequest({
239
+ return client.bases.fieldChangeRequest({
241
240
  ...common,
241
+ operation: "create",
242
242
  slug: input.slug,
243
243
  name: input.name,
244
244
  ...input.fieldType ? { type: input.fieldType } : {},
@@ -246,31 +246,36 @@ var baseFieldChangeTask = {
246
246
  ...input.options ? { options: input.options } : {}
247
247
  });
248
248
  case "update":
249
- return bases.updateFieldChangeRequest({
249
+ return client.bases.fieldChangeRequest({
250
250
  ...common,
251
+ operation: "update",
251
252
  fieldId: input.fieldId,
252
253
  patch: input.patch
253
254
  });
254
255
  case "delete":
255
- return bases.deleteFieldChangeRequest({
256
+ return client.bases.fieldChangeRequest({
256
257
  ...common,
258
+ operation: "delete",
257
259
  fieldId: input.fieldId
258
260
  });
259
261
  case "convert":
260
- return bases.convertFieldChangeRequest({
262
+ return client.bases.fieldChangeRequest({
261
263
  ...common,
264
+ operation: "convert",
262
265
  fieldId: input.fieldId,
263
266
  newType: input.newType,
264
267
  ...input.selectChoiceMode ? { selectChoiceMode: input.selectChoiceMode } : {}
265
268
  });
266
269
  case "reorder":
267
- return bases.reorderFieldsChangeRequest({
270
+ return client.bases.fieldChangeRequest({
268
271
  ...common,
272
+ operation: "reorder",
269
273
  fieldIds: input.fieldIds
270
274
  });
271
275
  default:
272
- return bases.restoreFieldChangeRequest({
276
+ return client.bases.fieldChangeRequest({
273
277
  ...common,
278
+ operation: "restore",
274
279
  fieldId: input.fieldId
275
280
  });
276
281
  }
@@ -313,7 +318,7 @@ var changeRequestQueryTask = {
313
318
  ],
314
319
  execute: async (client, input) => {
315
320
  if (input.countsOnly) return client.changeRequests.counts();
316
- return client.changeRequests.listPaged({
321
+ return client.changeRequests.list({
317
322
  ...input.status ? { status: input.status } : {},
318
323
  ...input.mine !== void 0 ? { mine: input.mine } : {},
319
324
  ...input.limit !== void 0 ? { limit: input.limit } : {},
@@ -403,11 +408,6 @@ var changeRequestMergeTask = {
403
408
 
404
409
  // ../../packages/busabase-contract/src/tasks/file-tree.ts
405
410
  var FILE_TREE_KINDS = ["skill", "drive", "airapp"];
406
- var NAMESPACE = {
407
- skill: "skills",
408
- drive: "drives",
409
- airapp: "airapps"
410
- };
411
411
  var kindParam = {
412
412
  name: "kind",
413
413
  kind: "enum",
@@ -452,7 +452,7 @@ var nodeListTask = {
452
452
  annotations: { readOnly: true, destructive: false },
453
453
  params: [kindParam],
454
454
  examples: ["busabase-cli nodes list-file-trees --kind skill"],
455
- execute: async (client, input) => client[NAMESPACE[resolveKind(input.kind)]].list()
455
+ execute: async (client, input) => client.fileTrees.list({ type: resolveKind(input.kind) })
456
456
  };
457
457
  var nodeGetTask = {
458
458
  name: "node_get_file_tree",
@@ -478,7 +478,7 @@ var nodeGetTask = {
478
478
  annotations: { readOnly: true, destructive: false },
479
479
  params: [kindParam, nodeIdParam],
480
480
  examples: ["busabase-cli nodes get-file-tree --kind airapp --node-id nod_123"],
481
- execute: async (client, input) => client[NAMESPACE[resolveKind(input.kind)]].get({ nodeId: input.nodeId })
481
+ execute: async (client, input) => client.fileTrees.get({ nodeId: input.nodeId, type: resolveKind(input.kind) })
482
482
  };
483
483
  var nodeListFilesTask = {
484
484
  name: "node_files_list",
@@ -504,7 +504,7 @@ var nodeListFilesTask = {
504
504
  annotations: { readOnly: true, destructive: false },
505
505
  params: [kindParam, nodeIdParam],
506
506
  examples: ["busabase-cli nodes files --kind drive --node-id nod_123"],
507
- execute: async (client, input) => client[NAMESPACE[resolveKind(input.kind)]].listFiles({ nodeId: input.nodeId })
507
+ execute: async (client, input) => client.fileTrees.listFiles({ nodeId: input.nodeId, type: resolveKind(input.kind) })
508
508
  };
509
509
  var nodeReadFileTask = {
510
510
  name: "node_file_read",
@@ -540,9 +540,10 @@ var nodeReadFileTask = {
540
540
  }
541
541
  ],
542
542
  examples: ["busabase-cli nodes read-file --kind skill --node-id nod_123 --file-path SKILL.md"],
543
- execute: async (client, input) => client[NAMESPACE[resolveKind(input.kind)]].readFile({
543
+ execute: async (client, input) => client.fileTrees.readFile({
544
544
  nodeId: input.nodeId,
545
- filePath: input.filePath
545
+ filePath: input.filePath,
546
+ type: resolveKind(input.kind)
546
547
  })
547
548
  };
548
549
  var nodeFilesChangeRequestTask = {
@@ -593,11 +594,12 @@ var nodeFilesChangeRequestTask = {
593
594
  }
594
595
  const payload = {
595
596
  nodeId: input.nodeId,
597
+ type: resolveKind(input.kind),
596
598
  operations: input.operations,
597
599
  ...input.message ? { message: input.message } : {},
598
600
  ...input.submittedBy ? { submittedBy: input.submittedBy } : {}
599
601
  };
600
- return client[NAMESPACE[resolveKind(input.kind)]].createChangeRequest(payload);
602
+ return client.fileTrees.createChangeRequest(payload);
601
603
  }
602
604
  };
603
605
 
@@ -655,15 +657,18 @@ var listArchivedTask = {
655
657
  "busabase-cli archived list --scope records --base-id bas_1 --limit 100"
656
658
  ],
657
659
  execute: async (client, input) => {
658
- if (input.scope === "nodes") return client.nodes.listArchived();
659
- if (input.scope === "bases") return client.bases.listArchived();
660
+ if (input.scope === "nodes") return client.nodes.list({ status: "archived" });
661
+ if (input.scope === "bases") return client.bases.list({ status: "archived" });
660
662
  if (!input.baseId) {
661
663
  throw new Error(`scope "${input.scope}" requires baseId.`);
662
664
  }
663
665
  if (input.scope === "fields") return client.bases.listDeletedFields({ baseId: input.baseId });
664
- if (input.scope === "views") return client.bases.listArchivedViews({ baseId: input.baseId });
665
- return client.bases.listArchivedRecordsPaged({
666
+ if (input.scope === "views") {
667
+ return client.bases.listViews({ baseId: input.baseId, status: "archived" });
668
+ }
669
+ return client.records.list({
666
670
  baseId: input.baseId,
671
+ status: "archived",
667
672
  ...input.limit !== void 0 ? { limit: input.limit } : {},
668
673
  ...input.cursor ? { cursor: input.cursor } : {}
669
674
  });
@@ -1237,14 +1242,15 @@ var nodeCreateTask = {
1237
1242
  if (FILE_TREE_TYPES.has(type)) {
1238
1243
  const payload = {
1239
1244
  ...common,
1245
+ // `type` is the contract's discriminator, so the narrowing has to be
1246
+ // explicit — `FILE_TREE_TYPES.has` doesn't narrow a plain string.
1247
+ type,
1240
1248
  ...Array.isArray(input.files) ? { files: input.files } : {},
1241
1249
  ...input.mergeMode ? { mergeMode: input.mergeMode } : {},
1242
1250
  ...input.visibility ? { visibility: input.visibility } : {},
1243
1251
  ...input.version ? { version: input.version } : {}
1244
1252
  };
1245
- if (type === "skill") return client.skills.create(payload);
1246
- if (type === "drive") return client.drives.create(payload);
1247
- return client.airapps.create(payload);
1253
+ return client.fileTrees.create(payload);
1248
1254
  }
1249
1255
  if (type === "doc") {
1250
1256
  const payload = { ...common, body: input.body ?? "" };
@@ -1321,20 +1327,20 @@ var recordChangeTask = {
1321
1327
  if (!input.fields || typeof input.fields !== "object") {
1322
1328
  throw new Error('operation "update" requires `fields` (an object keyed by field slug).');
1323
1329
  }
1324
- return client.records.updateChangeRequest({
1330
+ return client.records.changeRequest({
1325
1331
  ...common,
1332
+ operation: "update",
1326
1333
  fields: input.fields
1327
1334
  });
1328
1335
  }
1329
1336
  if (input.operation === "delete") {
1330
- return client.records.deleteChangeRequest({
1337
+ return client.records.changeRequest({
1331
1338
  ...common,
1339
+ operation: "delete",
1332
1340
  deleteMode: "archive"
1333
1341
  });
1334
1342
  }
1335
- return client.records.restoreChangeRequest(
1336
- common
1337
- );
1343
+ return client.records.changeRequest({ ...common, operation: "restore" });
1338
1344
  }
1339
1345
  };
1340
1346
 
@@ -1415,7 +1421,7 @@ var recordQueryTask = {
1415
1421
  input.baseId ? { baseId: input.baseId } : {}
1416
1422
  );
1417
1423
  }
1418
- return client.records.listPaged({
1424
+ return client.records.list({
1419
1425
  ...input.limit !== void 0 ? { limit: input.limit } : {},
1420
1426
  ...input.baseId ? { baseId: input.baseId } : {},
1421
1427
  ...input.cursor ? { cursor: input.cursor } : {},
@@ -1493,7 +1499,8 @@ var viewChangeTask = {
1493
1499
  if (!input.baseId || !input.name) {
1494
1500
  throw new Error('action "create" requires baseId and name.');
1495
1501
  }
1496
- return client.bases.createViewChangeRequest({
1502
+ return client.views.changeRequest({
1503
+ operation: "create",
1497
1504
  baseId: input.baseId,
1498
1505
  name: input.name,
1499
1506
  ...input.type ? { type: input.type } : {},
@@ -1505,19 +1512,16 @@ var viewChangeTask = {
1505
1512
  const target = { viewId: input.viewId, ...meta };
1506
1513
  if (input.action === "update") {
1507
1514
  if (!input.patch) throw new Error('action "update" requires patch.');
1508
- return client.views.updateChangeRequest({
1515
+ return client.views.changeRequest({
1516
+ operation: "update",
1509
1517
  ...target,
1510
1518
  ...input.patch
1511
1519
  });
1512
1520
  }
1513
1521
  if (input.action === "delete") {
1514
- return client.views.deleteChangeRequest(
1515
- target
1516
- );
1522
+ return client.views.changeRequest({ operation: "delete", ...target });
1517
1523
  }
1518
- return client.views.restoreChangeRequest(
1519
- target
1520
- );
1524
+ return client.views.changeRequest({ operation: "restore", ...target });
1521
1525
  }
1522
1526
  };
1523
1527
 
@@ -3393,6 +3397,15 @@ var restoreFieldChangeRequestInputSchema = z6.object({
3393
3397
  message: z6.string().optional(),
3394
3398
  submittedBy: z6.string().optional().default("local-editor")
3395
3399
  });
3400
+ var withBaseId = { baseId: z6.string().min(1) };
3401
+ var fieldChangeRequestInputSchema = z6.discriminatedUnion("operation", [
3402
+ createFieldChangeRequestInputSchema.extend({ operation: z6.literal("create"), ...withBaseId }),
3403
+ updateFieldChangeRequestInputSchema.extend({ operation: z6.literal("update"), ...withBaseId }),
3404
+ deleteFieldChangeRequestInputSchema.extend({ operation: z6.literal("delete"), ...withBaseId }),
3405
+ convertFieldChangeRequestInputSchema.extend({ operation: z6.literal("convert"), ...withBaseId }),
3406
+ reorderFieldsChangeRequestInputSchema.extend({ operation: z6.literal("reorder"), ...withBaseId }),
3407
+ restoreFieldChangeRequestInputSchema.extend({ operation: z6.literal("restore"), ...withBaseId })
3408
+ ]);
3396
3409
 
3397
3410
  // ../../packages/busabase-contract/src/domains/base/contract/view-schemas.ts
3398
3411
  import { z as z8 } from "zod";
@@ -3444,7 +3457,13 @@ var listNodesInputSchema = z7.object({
3444
3457
  parentId: z7.string().nullable().optional().describe("Node to start from. Omit or null to start from the space root."),
3445
3458
  depth: z7.coerce.number().int().min(1).max(5).optional().describe(
3446
3459
  "How many levels beneath the start point to eagerly include (default 2 once either field is set). Capped at 5."
3447
- )
3460
+ ),
3461
+ /**
3462
+ * `active` (default) walks the live tree. `archived` returns the flat set of
3463
+ * soft-archived nodes for the Trash view — no `parentId`/`depth` walk, since
3464
+ * archived nodes are shown as a list, not a tree.
3465
+ */
3466
+ status: z7.enum(["active", "archived"]).optional().default("active")
3448
3467
  }).optional();
3449
3468
  var isDescendantInputSchema = z7.object({
3450
3469
  nodeId: z7.string(),
@@ -3773,6 +3792,9 @@ var createCommentInputSchema = commentSubjectInputSchema.extend({
3773
3792
  var listInputSchema = z7.object({
3774
3793
  limit: z7.coerce.number().int().min(1).max(100).optional().default(50)
3775
3794
  }).optional().default({ limit: 50 });
3795
+ var listByStatusInputSchema = z7.object({
3796
+ status: z7.enum(["active", "archived"]).optional().default("active")
3797
+ });
3776
3798
  var listChangeRequestsPagedInputSchema = z7.object({
3777
3799
  limit: z7.coerce.number().int().min(1).max(100).optional().default(50),
3778
3800
  /** Opaque base64 cursor (`createdAt|id`) for keyset pagination. */
@@ -3949,6 +3971,24 @@ var restoreViewInputSchema = z8.object({
3949
3971
  message: z8.string().optional().default("Restore view"),
3950
3972
  submittedBy: z8.string().optional().default("local-producer")
3951
3973
  });
3974
+ var viewChangeRequestInputSchema = z8.discriminatedUnion("operation", [
3975
+ createViewInputSchema.extend({
3976
+ operation: z8.literal("create"),
3977
+ baseId: z8.string().min(1).describe("Base the new view belongs to.")
3978
+ }),
3979
+ updateViewInputSchema.extend({
3980
+ operation: z8.literal("update"),
3981
+ viewId: z8.string().min(1)
3982
+ }),
3983
+ deleteViewInputSchema.extend({
3984
+ operation: z8.literal("delete"),
3985
+ viewId: z8.string().min(1)
3986
+ }),
3987
+ restoreViewInputSchema.extend({
3988
+ operation: z8.literal("restore"),
3989
+ viewId: z8.string().min(1)
3990
+ })
3991
+ ]);
3952
3992
 
3953
3993
  // ../../packages/busabase-contract/src/domains/package/types.ts
3954
3994
  var PACKAGE_FORMAT = "busabase-package@1";
@@ -4292,7 +4332,8 @@ var applyInstall = async (client, plan, options) => {
4292
4332
  }
4293
4333
  const patched = resolveFieldIdOptions(field, base.node.slug, fieldIds, state.warnings);
4294
4334
  if (!patched) continue;
4295
- const changeRequest = await client.bases.updateFieldChangeRequest({
4335
+ const changeRequest = await client.bases.fieldChangeRequest({
4336
+ operation: "update",
4296
4337
  baseId: base.baseId,
4297
4338
  fieldId,
4298
4339
  patch: { options: patched },
@@ -4443,7 +4484,8 @@ var createBase = async (client, node, parentNodeId, options, state, bases, field
4443
4484
  bases.push({ node, baseId: result.id });
4444
4485
  indexFields(fieldIds, node.slug, result.fields);
4445
4486
  for (const view of node.base.views) {
4446
- const changeRequest = await client.bases.createViewChangeRequest({
4487
+ const changeRequest = await client.views.changeRequest({
4488
+ operation: "create",
4447
4489
  baseId: result.id,
4448
4490
  slug: view.slug,
4449
4491
  name: view.name,
@@ -4477,8 +4519,8 @@ var createFileTreeNode = async (client, node, parentNodeId, options, state) => {
4477
4519
  })
4478
4520
  );
4479
4521
  const files = uploaded.filter((entry) => entry !== void 0);
4480
- const api = node.type === "skill" ? client.skills : node.type === "airapp" ? client.airapps : client.drives;
4481
- const result = await api.create({
4522
+ const result = await client.fileTrees.create({
4523
+ type: node.type,
4482
4524
  parentNodeId,
4483
4525
  slug: node.slug,
4484
4526
  name: node.name,
@@ -4653,7 +4695,8 @@ var linkRelations = async (client, base, relationFieldSlugs, recordIdsByKey, opt
4653
4695
  if (!hasRelation) continue;
4654
4696
  const recordId = recordIdsByKey.get(record.key);
4655
4697
  if (!recordId) continue;
4656
- const changeRequest = await client.records.updateChangeRequest({
4698
+ const changeRequest = await client.records.changeRequest({
4699
+ operation: "update",
4657
4700
  recordId,
4658
4701
  fields: { ...toCreatableFields(base.node, record.fields), ...relationValues },
4659
4702
  message: `Link relations for ${base.node.slug}`,
@@ -4729,7 +4772,7 @@ var collectNode = async (client, source, options) => {
4729
4772
  case "skill":
4730
4773
  case "airapp":
4731
4774
  case "drive":
4732
- return collectFileTree(client, source, common, options);
4775
+ return collectFileTree(client, source, source.type, common, options);
4733
4776
  case "file":
4734
4777
  return collectFile(client, source, common, options);
4735
4778
  default:
@@ -4771,7 +4814,7 @@ var collectBase = async (client, source, common, options) => {
4771
4814
  };
4772
4815
  };
4773
4816
  var buildIndexes = async (client) => {
4774
- const bases = await client.bases.list();
4817
+ const bases = await client.bases.list({});
4775
4818
  const baseSlugById = /* @__PURE__ */ new Map();
4776
4819
  const fieldSlugById = /* @__PURE__ */ new Map();
4777
4820
  for (const base of bases) {
@@ -4858,7 +4901,7 @@ var collectRecords = async (client, baseId, fields, options) => {
4858
4901
  let droppedAttachments = 0;
4859
4902
  let cursor;
4860
4903
  do {
4861
- const page = await client.records.listPaged({ baseId, limit: 100, cursor });
4904
+ const page = await client.records.list({ baseId, limit: 100, cursor });
4862
4905
  for (const record of page.records) {
4863
4906
  if (record.status !== "active") continue;
4864
4907
  const values = {};
@@ -4884,12 +4927,15 @@ var collectRecords = async (client, baseId, fields, options) => {
4884
4927
  }
4885
4928
  return records.sort((a, b) => a.key.localeCompare(b.key, "en"));
4886
4929
  };
4887
- var collectFileTree = async (client, source, common, options) => {
4888
- const api = source.type === "skill" ? client.skills : source.type === "airapp" ? client.airapps : client.drives;
4889
- const listed = await api.listFiles({ nodeId: source.id });
4930
+ var collectFileTree = async (client, source, type, common, options) => {
4931
+ const listed = await client.fileTrees.listFiles({ nodeId: source.id, type });
4890
4932
  const files = [];
4891
4933
  for (const file of listed) {
4892
- const read = await api.readFile({ nodeId: source.id, filePath: file.path });
4934
+ const read = await client.fileTrees.readFile({
4935
+ nodeId: source.id,
4936
+ filePath: file.path,
4937
+ type
4938
+ });
4893
4939
  files.push({
4894
4940
  path: file.path,
4895
4941
  bytes: read.encoding === "url" ? await downloadBytes(read.content, file.path, options) : Buffer.from(read.content, "utf8")
@@ -5588,7 +5634,7 @@ var findTargetFolder = (nodes, slug) => {
5588
5634
  return roots.find((node) => node.slug === slug && node.type === "folder");
5589
5635
  };
5590
5636
  var resolveTargetState = async (client, targetFolderSlug) => {
5591
- const [nodes, bases] = await Promise.all([client.nodes.list(), client.bases.list()]);
5637
+ const [nodes, bases] = await Promise.all([client.nodes.list({}), client.bases.list({})]);
5592
5638
  return {
5593
5639
  targetFolder: findTargetFolder(nodes, targetFolderSlug),
5594
5640
  existingBaseSlugs: new Set(bases.map((base) => base.slug))
@@ -6381,10 +6427,17 @@ function classifyKind(inner) {
6381
6427
  function inputFields(inputSchema) {
6382
6428
  if (inputSchema === void 0) return [];
6383
6429
  const { inner } = unwrapSchema(inputSchema);
6384
- const shape = inner?.shape ?? (inner?.def?.type === "object" ? inner.def.shape : void 0);
6385
- if (!shape || typeof shape !== "object") {
6430
+ const shape = objectShape(inner);
6431
+ if (!shape) {
6386
6432
  return [{ key: "input", kind: "json", required: true, root: true }];
6387
6433
  }
6434
+ return fieldsFromShape(shape);
6435
+ }
6436
+ function objectShape(inner) {
6437
+ const shape = inner?.shape ?? (inner?.def?.type === "object" ? inner.def.shape : void 0);
6438
+ return shape && typeof shape === "object" ? shape : void 0;
6439
+ }
6440
+ function fieldsFromShape(shape) {
6388
6441
  const fields = [];
6389
6442
  for (const [key, sub] of Object.entries(shape)) {
6390
6443
  const { inner: unwrapped, optional } = unwrapSchema(sub);
@@ -6393,6 +6446,34 @@ function inputFields(inputSchema) {
6393
6446
  }
6394
6447
  return fields;
6395
6448
  }
6449
+ function unionVariants(inputSchema, discriminator = "operation") {
6450
+ if (inputSchema === void 0) return null;
6451
+ const { inner } = unwrapSchema(inputSchema);
6452
+ let unionNode = inner;
6453
+ let extraShape = {};
6454
+ if (inner?.def?.type === "intersection") {
6455
+ for (const side of [inner.def.left, inner.def.right]) {
6456
+ const { inner: sideInner } = unwrapSchema(side);
6457
+ const shape = objectShape(sideInner);
6458
+ if (shape) extraShape = { ...extraShape, ...shape };
6459
+ else unionNode = sideInner;
6460
+ }
6461
+ }
6462
+ const options = unionNode?.def?.options ?? unionNode?.options;
6463
+ if (!Array.isArray(options) || options.length === 0) return null;
6464
+ const variants = [];
6465
+ for (const option of options) {
6466
+ const { inner: optionInner } = unwrapSchema(option);
6467
+ const shape = objectShape(optionInner);
6468
+ if (!shape) return null;
6469
+ const { inner: discInner } = unwrapSchema(shape[discriminator]);
6470
+ const value = discInner?.def?.values?.[0] ?? discInner?.def?.value;
6471
+ if (typeof value !== "string") return null;
6472
+ const { [discriminator]: _pinned, ...rest } = shape;
6473
+ variants.push({ value, fields: fieldsFromShape({ ...rest, ...extraShape }) });
6474
+ }
6475
+ return variants;
6476
+ }
6396
6477
  var GENERATED_SKIP = /* @__PURE__ */ new Set([
6397
6478
  "search",
6398
6479
  // top-level `search`
@@ -6402,18 +6483,48 @@ var GENERATED_SKIP = /* @__PURE__ */ new Set([
6402
6483
  // `records by-field-text`
6403
6484
  "records.listChangeRequests",
6404
6485
  // `records change-requests`
6405
- "airapps.listFiles"
6406
- // `airapps files`
6486
+ // The `/file-trees` group is exposed by the task layer as `nodes
6487
+ // list-file-trees` / `get-file-tree` / `files` / `read-file` /
6488
+ // `files-change-request`, each taking `--kind` (see tasks/file-tree.ts).
6489
+ "fileTrees.list",
6490
+ "fileTrees.create",
6491
+ "fileTrees.get",
6492
+ "fileTrees.listFiles",
6493
+ "fileTrees.readFile",
6494
+ "fileTrees.createChangeRequest"
6407
6495
  ]);
6408
6496
  function registerGeneratedCommands(program, state) {
6409
6497
  const getGroup = (displayName, tag) => program.commands.find((c2) => c2.name() === displayName) ?? program.command(displayName).description(tag ?? `${displayName} endpoints`);
6410
6498
  const addLeaf = (parent, navPath, procKey, proc) => {
6411
6499
  const { route, inputSchema } = proc["~orpc"];
6412
- const name = [...navPath.slice(1), procKey].map(kebab).join("-");
6500
+ const baseName = [...navPath.slice(1), procKey].map(kebab).join("-");
6501
+ const variants = unionVariants(inputSchema);
6502
+ if (variants) {
6503
+ for (const variant of variants) {
6504
+ addOneLeaf(
6505
+ parent,
6506
+ navPath,
6507
+ procKey,
6508
+ proc,
6509
+ `${kebab(variant.value)}-${baseName}`,
6510
+ [
6511
+ { key: "operation", kind: "string", required: true, pinned: variant.value },
6512
+ ...variant.fields
6513
+ ],
6514
+ // The shared summary describes the merged endpoint; say which branch this is.
6515
+ `${route.summary ?? baseName} \u2014 operation "${variant.value}"`
6516
+ );
6517
+ }
6518
+ return;
6519
+ }
6520
+ addOneLeaf(parent, navPath, procKey, proc, baseName, inputFields(inputSchema));
6521
+ };
6522
+ const addOneLeaf = (parent, navPath, procKey, proc, name, fields, description) => {
6523
+ const { route } = proc["~orpc"];
6413
6524
  if (parent.commands.some((c2) => c2.name() === name || c2.aliases().includes(name))) return;
6414
- const fields = inputFields(inputSchema);
6415
- const leaf = parent.command(name).description(route.summary ?? `${route.method} ${route.path}`);
6525
+ const leaf = parent.command(name).description(description ?? route.summary ?? `${route.method} ${route.path}`);
6416
6526
  for (const f of fields) {
6527
+ if (f.pinned !== void 0) continue;
6417
6528
  const flag = `--${kebab(f.key)}`;
6418
6529
  if (GLOBAL_LONG_FLAGS.has(flag)) continue;
6419
6530
  if (f.kind === "boolean") {
@@ -6446,6 +6557,10 @@ OpenAPI: ${route.method} ${route.path}`);
6446
6557
  runAction(state, (client, opts) => {
6447
6558
  let input = {};
6448
6559
  for (const f of fields) {
6560
+ if (f.pinned !== void 0) {
6561
+ input[f.key] = f.pinned;
6562
+ continue;
6563
+ }
6449
6564
  if (GLOBAL_LONG_FLAGS.has(`--${kebab(f.key)}`)) continue;
6450
6565
  const optKey = f.kind === "json" ? `${f.key}Json` : f.key;
6451
6566
  const value = opts[optKey];
@@ -6677,11 +6792,21 @@ Examples:
6677
6792
  )
6678
6793
  );
6679
6794
  const bases = program.command("bases").description("Bases (structured tables)");
6680
- addGlobalFlags(bases.command("list")).description("List Bases in the active space").action(runAction(state, (client) => client.bases.list()));
6795
+ addGlobalFlags(bases.command("list")).description("List Bases in the active space").addOption(
6796
+ new Option2("--status <active|archived>", "live Bases (default) or archived ones").choices([
6797
+ "active",
6798
+ "archived"
6799
+ ])
6800
+ ).action(
6801
+ runAction(
6802
+ state,
6803
+ (client, opts) => client.bases.list({ status: opts.status ?? "active" })
6804
+ )
6805
+ );
6681
6806
  addGlobalFlags(bases.command("get")).description("Get one Base by slug").requiredOption("--slug <slug>", "Base slug").action(
6682
6807
  runAction(state, async (client, opts) => {
6683
6808
  const slug = opts.slug;
6684
- const found = (await client.bases.list()).find((base) => base.slug === slug);
6809
+ const found = (await client.bases.list({})).find((base) => base.slug === slug);
6685
6810
  if (!found) throw new Error(`no Base with slug "${slug}"`);
6686
6811
  return found;
6687
6812
  })
@@ -6728,7 +6853,8 @@ Examples:
6728
6853
  "No field patch supplied. Pass --name, --required, --options-json, or attachment option flags."
6729
6854
  );
6730
6855
  }
6731
- return client.bases.updateFieldChangeRequest({
6856
+ return client.bases.fieldChangeRequest({
6857
+ operation: "update",
6732
6858
  baseId: opts.baseId,
6733
6859
  fieldId: opts.fieldId,
6734
6860
  patch,
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCli
4
- } from "./chunk-NVBCCPMO.js";
4
+ } from "./chunk-DGRADZF2.js";
5
5
 
6
6
  // src/cli.ts
7
7
  process.exit(await runCli(process.argv.slice(2)));
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  HELP,
3
3
  render,
4
4
  runCli
5
- } from "./chunk-NVBCCPMO.js";
5
+ } from "./chunk-DGRADZF2.js";
6
6
 
7
7
  // src/index.ts
8
8
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "busa-cli",
3
- "version": "0.10.1",
3
+ "version": "0.10.2",
4
4
  "description": "Command-line client for the Busabase OpenAPI REST API. Talks to a local or remote `busabase server`. Short-name alias for busabase-cli.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/busabase/busabase/tree/main/apps/busabase-cli",
@@ -33,7 +33,7 @@
33
33
  "dependencies": {
34
34
  "@zip.js/zip.js": "^2.8.20",
35
35
  "busabase-package": "workspace:*",
36
- "busabase-sdk": "0.10.1",
36
+ "busabase-sdk": "0.10.2",
37
37
  "commander": "^14.0.0",
38
38
  "tar-stream": "^3.1.7",
39
39
  "yaml": "^2.9.0",