busa-cli 0.95.1 → 0.96.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.
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { i as checkForUpdate, n as pkgVersion, r as runCli } from "./run-fBARIIox.js";
2
+ import { i as checkForUpdate, n as pkgVersion, r as runCli } from "./run-B3hHU9aE.js";
3
3
  //#region src/flush-stdio.ts
4
4
  /**
5
5
  * Wait for stdout/stderr to reach the other side before the process is torn down.
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as render, i as checkForUpdate, n as pkgVersion, r as runCli, t as HELP } from "./run-fBARIIox.js";
1
+ import { a as render, i as checkForUpdate, n as pkgVersion, r as runCli, t as HELP } from "./run-B3hHU9aE.js";
2
2
  import { DEFAULT_BASE_URL, createBusabaseClient, normalizeBaseUrl } from "busabase-sdk";
3
3
  export { DEFAULT_BASE_URL, HELP, checkForUpdate, createBusabaseClient, normalizeBaseUrl, pkgVersion, render, runCli };
@@ -635,6 +635,7 @@ const baseFieldChangeTask = {
635
635
  examples: [
636
636
  "busabase-cli bases field-change-request --base-id bas_1 --operation add --slug status --name Status --field-type select",
637
637
  "busabase-cli bases field-change-request --base-id bas_1 --operation update --field-id fld_1 --patch-json '{\"required\":true}'",
638
+ "busabase-cli bases field-change-request --base-id bas_1 --operation update --field-id fld_1 --patch-json '{\"help\":{\"description\":\"Actual customer acceptance date\",\"example\":\"2026-10-14\"}}'",
638
639
  "busabase-cli bases field-change-request --base-id bas_1 --operation reorder --field-ids fld_2 --field-ids fld_1"
639
640
  ],
640
641
  execute: async (client, input) => {
@@ -2195,7 +2196,7 @@ const nodeCreateTask = {
2195
2196
  "workspace",
2196
2197
  "public"
2197
2198
  ],
2198
- description: "Skill/Drive/AirApp only. Defaults to private."
2199
+ description: "Skill/Drive/AirApp only. Omit to follow the space default and parent folder, like any other node."
2199
2200
  },
2200
2201
  {
2201
2202
  name: "version",
@@ -6445,7 +6446,13 @@ const lookupRollupSchema = z.enum([
6445
6446
  "max",
6446
6447
  "concatenate"
6447
6448
  ]).default("values");
6449
+ /** Public, plain-text guidance. Examples are hints, never default record values. */
6450
+ const fieldHelpSchema = z.object({
6451
+ description: z.string().max(1e3).optional(),
6452
+ example: z.string().max(200).optional()
6453
+ });
6448
6454
  const fieldOptionsSchema = z.object({
6455
+ help: fieldHelpSchema.optional(),
6449
6456
  ai: z.object({
6450
6457
  model: z.string().optional(),
6451
6458
  prompt: z.string().optional(),
@@ -6476,7 +6483,18 @@ const fieldOptionsSchema = z.object({
6476
6483
  height: z.number().int().positive().max(1200).optional(),
6477
6484
  providers: z.array(z.string()).optional()
6478
6485
  }).optional(),
6479
- formula: z.object({ expression: z.string().min(1) }).optional(),
6486
+ formula: z.object({
6487
+ expression: z.string().min(1),
6488
+ format: z.enum([
6489
+ "auto",
6490
+ "number",
6491
+ "currency",
6492
+ "percent",
6493
+ "date"
6494
+ ]).optional(),
6495
+ precision: z.number().int().min(0).max(10).optional(),
6496
+ currency: z.string().regex(/^[A-Z]{3}$/).optional()
6497
+ }).optional(),
6480
6498
  inverseFieldId: z.string().optional(),
6481
6499
  lookup: z.object({
6482
6500
  relationFieldSlug: z.string().min(1).describe("Slug of a `relation` field on THIS Base — the hop to follow."),
@@ -6566,7 +6584,9 @@ const updateFieldChangeRequestInputSchema = z.object({
6566
6584
  patch: z.object({
6567
6585
  name: fieldNameSchema.optional(),
6568
6586
  required: z.boolean().optional(),
6569
- options: fieldOptionsSchema.optional(),
6587
+ options: fieldOptionsSchema.removeDefault().optional(),
6588
+ /** Applied against current options at merge time; null removes all guidance. */
6589
+ help: fieldHelpSchema.nullable().optional(),
6570
6590
  /**
6571
6591
  * Not a patch key — rejected on purpose, and the only key here that is.
6572
6592
  *
@@ -7102,7 +7122,7 @@ const changeRequestSchema = z.object({
7102
7122
  sourceAttribution: sourceAttributionSchema.nullable().optional(),
7103
7123
  sourceMeta: z.record(z.string(), z.unknown()),
7104
7124
  reviewPolicySnapshot: z.record(z.string(), z.unknown()),
7105
- mergeSummary: z.record(z.string(), z.unknown()),
7125
+ mergeSummary: z.record(z.string(), z.unknown()).describe("Filled in when the change request merges. `slugChanges` (present only when non-empty) lists items a restore brought back under a new slug because another item took the old one while they were in the Trash: `{ nodeId, nodeType, name, fromSlug, toSlug }`. Read the new slug from here instead of assuming the old one."),
7106
7126
  rejectedReason: z.string().nullable(),
7107
7127
  reviewedAt: z.string().nullable(),
7108
7128
  mergedAt: z.string().nullable(),
@@ -7872,6 +7892,7 @@ const PackageDocFrontmatterSchema = z.object({
7872
7892
  * so choice ids survive and record values referencing them need no remap.
7873
7893
  */
7874
7894
  const PackageFieldOptionsSchema = z.object({
7895
+ help: fieldHelpSchema.optional(),
7875
7896
  ai: z.object({
7876
7897
  model: z.string().optional(),
7877
7898
  prompt: z.string().optional(),
@@ -9647,7 +9668,7 @@ const applyAgentPrompts = async (client, nodeId, node, state) => {
9647
9668
  const agentPrompts = node.agentPrompts;
9648
9669
  if (!agentPrompts?.length) return;
9649
9670
  if (!nodeId) {
9650
- state.warnings.push(`"${node.slug}" installs as a change request, so its ${agentPrompts.length} agent prompt(s) were not applied. After merging it, run \`busabase-cli nodes set-agent-prompts\` for that node, or re-install with --auto-merge.`);
9671
+ state.warnings.push(`"${node.slug}" installs as a change request, so its ${agentPrompts.length} agent prompt(s) were not applied. After merging it, run \`busabase-cli nodes set-agent-prompts\` for that node, or re-install without asking for review (drop --require-review, or leave "Send the content for review first" off).`);
9651
9672
  return;
9652
9673
  }
9653
9674
  try {
@@ -10971,7 +10992,7 @@ const findPlanBlockers = (plan, autoMerge) => {
10971
10992
  const list = plan.collisions.filter((collision) => !collision.renamedTo).map((collision) => ` • ${collision.kind} "${collision.slug}" (${collision.path})`).join("\n");
10972
10993
  blockers.push(`Install would collide with content that already exists:\n${list}\n\nNothing was created. Re-run with --rename to install the colliding items under suffixed slugs (e.g. "-2"), or pick a different --into-folder.`);
10973
10994
  }
10974
- if (plan.requiresAutoMerge && !autoMerge) blockers.push("This package's records carry relation values, and a relation stores the ids of the records it points at — which only exist once the records are merged. Installing review-first would leave every relation empty.\n\nRe-run with --auto-merge to install it (this trusts the package author: records are created immediately instead of landing as change requests you review first).");
10995
+ if (plan.requiresAutoMerge && !autoMerge) blockers.push("This package's records carry relation values, and a relation stores the ids of the records it points at — which only exist once the records are merged. Installing review-first would leave every relation empty.\n\nInstall it without asking for review: drop --require-review, or leave \"Send the content for review first\" off in the dashboard. Records are then created immediately. A credential that can only propose changes cannot install this package; use one with write access to the space.");
10975
10996
  const unsatisfiable = findUnsatisfiableRequiredFields(plan);
10976
10997
  if (unsatisfiable.length > 0) blockers.push(`This package cannot satisfy its own required fields:\n${unsatisfiable.join("\n")}\n\nThe server rejects these while writing records, partway through the install. Re-export the package (export relaxes fields it cannot fill), or edit the Base definitions in the package to make them optional.`);
10977
10998
  return blockers;
@@ -12243,6 +12264,11 @@ const PROCEDURE_PERMISSION_POLICY = {
12243
12264
  "agents.connections.list": workspace("manage"),
12244
12265
  "agents.disconnect": workspace("manage"),
12245
12266
  "agents.deleteHistory": workspace("manage"),
12267
+ "agents.routerEnrollment.grants": workspace("manage"),
12268
+ "agents.routerEnrollment.mint": workspace("manage"),
12269
+ "agents.routerEnrollment.status": workspace("manage"),
12270
+ "agents.routerEnrollment.complete": workspace("manage"),
12271
+ "agents.routerEnrollment.cancel": workspace("manage"),
12246
12272
  "agents.sessions.list": workspace("manage"),
12247
12273
  "agents.sessions.listPaged": workspace("manage"),
12248
12274
  "agents.sessions.create": workspace("manage"),
@@ -12256,6 +12282,7 @@ const PROCEDURE_PERMISSION_POLICY = {
12256
12282
  "changeRequests.listPage": node("read"),
12257
12283
  "changeRequests.inboxSnapshot": node("read"),
12258
12284
  "changeRequests.counts": node("read"),
12285
+ "changeRequests.reviewCount": node("read"),
12259
12286
  "changeRequests.get": node("read"),
12260
12287
  "changeRequests.createPreviewLink": node("changeRequest"),
12261
12288
  "records.list": node("read"),
@@ -15878,7 +15905,8 @@ manual lands as a Skill node, its nodes are stamped as belonging to that app, it
15878
15905
  Base slugs are prefixed with the target folder so two templates cannot collide on
15879
15906
  a name like "settings", and its sample rows are merged so the app is not empty
15880
15907
  when you open it (--no-sample-records opts out). Its AirApp code and its Skill
15881
- still wait for your review.
15908
+ follow the same rule as other content: live if you can write, held for review
15909
+ with --require-review.
15882
15910
 
15883
15911
  If the URL is a repository that holds several packages rather than being one,
15884
15912
  install lists them and you pick with --skill <name>.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "busa-cli",
3
- "version": "0.95.1",
3
+ "version": "0.96.0",
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.95.1",
36
+ "busabase-sdk": "0.96.0",
37
37
  "commander": "^14.0.0",
38
38
  "qrcode": "^1.5.4",
39
39
  "tar-stream": "^3.1.7",