@brainbase-labs/cli 0.11.1 → 0.13.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.
Files changed (2) hide show
  1. package/dist/index.js +192 -50
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -29449,7 +29449,7 @@ function padStart(s, n) {
29449
29449
  // package.json
29450
29450
  var package_default = {
29451
29451
  name: "@brainbase-labs/cli",
29452
- version: "0.11.1",
29452
+ version: "0.13.1",
29453
29453
  description: "Pack, share, and install agent templates across harnesses (Claude Code, Codex, ...).",
29454
29454
  type: "module",
29455
29455
  bin: {
@@ -51152,8 +51152,10 @@ var PlaybookContentSchema = exports_external.object({
51152
51152
  message: "playbook content must set either `file` or `text`"
51153
51153
  });
51154
51154
  var PlaybookSchema = exports_external.object({
51155
+ id: exports_external.string().optional(),
51155
51156
  title: exports_external.string().min(1),
51156
51157
  description: exports_external.string().optional(),
51158
+ icon: exports_external.string().optional(),
51157
51159
  content: PlaybookContentSchema
51158
51160
  });
51159
51161
  var SkillEntrySchema = exports_external.object({
@@ -51171,7 +51173,8 @@ var McpEntrySchema = exports_external.object({
51171
51173
  var CapabilitiesSchema = exports_external.object({
51172
51174
  memory: exports_external.boolean().optional(),
51173
51175
  browser: exports_external.boolean().optional(),
51174
- slack: exports_external.boolean().optional()
51176
+ slack: exports_external.boolean().optional(),
51177
+ meeting: exports_external.boolean().optional()
51175
51178
  });
51176
51179
  var AgentManifestSchema = exports_external.object({
51177
51180
  schema: exports_external.literal(1),
@@ -51278,7 +51281,60 @@ function resolvePlaybookContent(cwd2, entry) {
51278
51281
  return null;
51279
51282
  }
51280
51283
  function slugifyPlaybookTitle(title) {
51281
- return title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60) || "playbook";
51284
+ return title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60).replace(/^-+|-+$/g, "") || "playbook";
51285
+ }
51286
+ function playbookYamlScalar(value) {
51287
+ const safe = value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, " ").trim();
51288
+ return `"${safe}"`;
51289
+ }
51290
+ function assemblePlaybookWireBody(entry, body) {
51291
+ const lines = ["---", `title: ${playbookYamlScalar(entry.title)}`];
51292
+ if (entry.description) {
51293
+ lines.push(`description: ${playbookYamlScalar(entry.description)}`);
51294
+ }
51295
+ if (entry.icon) {
51296
+ lines.push(`icon: ${playbookYamlScalar(entry.icon)}`);
51297
+ }
51298
+ lines.push("---", "", "");
51299
+ return lines.join(`
51300
+ `) + body.replace(/^\n+/, "").trimEnd() + `
51301
+ `;
51302
+ }
51303
+ function assignPlaybookSlugs(titles) {
51304
+ const used = new Set;
51305
+ return titles.map((t) => {
51306
+ const base2 = slugifyPlaybookTitle(t);
51307
+ let slug = base2;
51308
+ let n = 1;
51309
+ while (used.has(slug)) {
51310
+ n += 1;
51311
+ slug = `${base2}-${n}`;
51312
+ }
51313
+ used.add(slug);
51314
+ return slug;
51315
+ });
51316
+ }
51317
+ function backfillPlaybookIds(playbooks, cloudComponents) {
51318
+ const idBySlug = new Map;
51319
+ for (const c2 of cloudComponents) {
51320
+ if (c2.type !== "playbook")
51321
+ continue;
51322
+ const id = c2.meta?.playbook_id;
51323
+ if (typeof id === "string" && id)
51324
+ idBySlug.set(c2.slug, id);
51325
+ }
51326
+ const slugs = assignPlaybookSlugs(playbooks.map((e2) => e2.title));
51327
+ let changed = false;
51328
+ const next = playbooks.map((entry, i) => {
51329
+ if (entry.id)
51330
+ return entry;
51331
+ const id = idBySlug.get(slugs[i]);
51332
+ if (!id)
51333
+ return entry;
51334
+ changed = true;
51335
+ return { id, ...entry };
51336
+ });
51337
+ return { playbooks: changed ? next : playbooks, changed };
51282
51338
  }
51283
51339
 
51284
51340
  // src/core/link.ts
@@ -51327,7 +51383,7 @@ var SyncedComponentSchema = exports_external.object({
51327
51383
  });
51328
51384
  var AgentMetaSnapshotSchema = exports_external.object({
51329
51385
  name: exports_external.string(),
51330
- tagline: exports_external.string().optional(),
51386
+ tagline: exports_external.string().nullish().transform((v3) => v3 ?? undefined),
51331
51387
  entrypoint: exports_external.string().optional()
51332
51388
  });
51333
51389
  var SyncStateSchema = exports_external.object({
@@ -52069,6 +52125,39 @@ function buildSlackMcpComponent(scope) {
52069
52125
  };
52070
52126
  }
52071
52127
 
52128
+ // src/core/meeting-mcp.ts
52129
+ var DEFAULT_MEETING_MCP_BASE = "https://meeting.mcp.brainbaselabs.com";
52130
+ var MEETING_MCP_SLUG = "brainbase-meeting";
52131
+ function meetingMcpBaseUrl() {
52132
+ const envOverride = process.env.BRAINBASE_MEETING_MCP_URL;
52133
+ if (envOverride)
52134
+ return envOverride.replace(/\/+$/, "");
52135
+ return DEFAULT_MEETING_MCP_BASE;
52136
+ }
52137
+ function meetingMcpUrl() {
52138
+ return `${meetingMcpBaseUrl()}/t/\${BRAINBASE_THREAD_ID}/mcp`;
52139
+ }
52140
+ function meetingMcpPayload() {
52141
+ return {
52142
+ url: meetingMcpUrl(),
52143
+ headers: {
52144
+ Authorization: "Bearer ${BRAINBASE_TOKEN}"
52145
+ }
52146
+ };
52147
+ }
52148
+ function buildMeetingMcpComponent(scope) {
52149
+ return {
52150
+ type: "mcp",
52151
+ slug: MEETING_MCP_SLUG,
52152
+ scope,
52153
+ rootDir: "",
52154
+ description: "This agent's Meeting connector (join calls, read transcripts, manage " + "recordings and notes). Scoped to this agent only.",
52155
+ meta: { mcp: meetingMcpPayload() },
52156
+ payload: meetingMcpPayload(),
52157
+ checksum: "builtin:brainbase-meeting:v1"
52158
+ };
52159
+ }
52160
+
52072
52161
  // src/core/browser-mcp.ts
52073
52162
  var DEFAULT_BROWSER_MCP_BASE = "https://brainbase-browser-mcp.onrender.com";
52074
52163
  var BROWSER_MCP_SLUG = "brainbase-browser";
@@ -52107,7 +52196,8 @@ function capabilitiesFromAgent(agent) {
52107
52196
  return {
52108
52197
  memory: agent.memory_enabled !== false,
52109
52198
  browser: agent.browser_enabled !== false,
52110
- slack: agent.slack_connected === true
52199
+ slack: agent.slack_connected === true,
52200
+ meeting: agent.meeting_connected === true
52111
52201
  };
52112
52202
  }
52113
52203
  function capabilitiesFromManifest(manifest) {
@@ -52115,7 +52205,8 @@ function capabilitiesFromManifest(manifest) {
52115
52205
  return {
52116
52206
  memory: c2.memory !== false,
52117
52207
  browser: c2.browser !== false,
52118
- slack: c2.slack === true
52208
+ slack: c2.slack === true,
52209
+ meeting: c2.meeting === true
52119
52210
  };
52120
52211
  }
52121
52212
  function resolveBuiltinMcps(input) {
@@ -52124,7 +52215,8 @@ function resolveBuiltinMcps(input) {
52124
52215
  { slug: ORCHESTRATION_MCP_SLUG, enabled: true, build: buildOrchestrationMcpComponent },
52125
52216
  { slug: MEMORY_MCP_SLUG, enabled: caps.memory, build: buildMemoryMcpComponent },
52126
52217
  { slug: BROWSER_MCP_SLUG, enabled: caps.browser, build: buildBrowserMcpComponent },
52127
- { slug: SLACK_MCP_SLUG, enabled: caps.slack, build: buildSlackMcpComponent }
52218
+ { slug: SLACK_MCP_SLUG, enabled: caps.slack, build: buildSlackMcpComponent },
52219
+ { slug: MEETING_MCP_SLUG, enabled: caps.meeting, build: buildMeetingMcpComponent }
52128
52220
  ];
52129
52221
  const install = [];
52130
52222
  const removeSlugs = [];
@@ -52604,34 +52696,25 @@ function readLocalComponents(cwd2, manifest) {
52604
52696
  hash: hashMcpEntry(entry)
52605
52697
  });
52606
52698
  }
52607
- for (const entry of manifest.playbooks ?? []) {
52699
+ const pbEntries = manifest.playbooks ?? [];
52700
+ const pbSlugs = assignPlaybookSlugs(pbEntries.map((e2) => e2.title));
52701
+ for (let i = 0;i < pbEntries.length; i++) {
52702
+ const entry = pbEntries[i];
52703
+ const slug = pbSlugs[i];
52608
52704
  const body = resolvePlaybookContent(cwd2, entry);
52609
52705
  if (body === null) {
52610
- out.push({
52611
- type: "playbook",
52612
- slug: slugifyPlaybookTitle(entry.title),
52613
- hash: null
52614
- });
52706
+ out.push({ type: "playbook", slug, hash: null });
52615
52707
  continue;
52616
52708
  }
52617
- const wireBody = /^---\s*\n/.test(body) ? body : `---
52618
- title: ${jsonOrPlain(entry.title)}` + (entry.description ? `
52619
- description: ${jsonOrPlain(entry.description)}` : "") + `
52620
- ---
52621
- ${body.replace(/^\n+/, "")}`;
52709
+ const wireBody = assemblePlaybookWireBody(entry, body);
52622
52710
  out.push({
52623
52711
  type: "playbook",
52624
- slug: slugifyPlaybookTitle(entry.title),
52712
+ slug,
52625
52713
  hash: componentHashFromFileHashes([hashString(wireBody)])
52626
52714
  });
52627
52715
  }
52628
52716
  return out;
52629
52717
  }
52630
- function jsonOrPlain(s3) {
52631
- if (!/[\n":#&*!|>'%@`{}[\]]/.test(s3) && s3.trim() === s3 && s3 !== "")
52632
- return s3;
52633
- return JSON.stringify(s3);
52634
- }
52635
52718
  function threeWayDiff(input) {
52636
52719
  const lockMap = new Map;
52637
52720
  for (const c2 of input.lock)
@@ -53154,7 +53237,7 @@ function materializePlaybooks(cwd2, cloud, toInstall, keepLocal, existingManifes
53154
53237
  if (!raw.trim())
53155
53238
  continue;
53156
53239
  const { body } = stripFrontmatter(raw);
53157
- const existing = existingManifest?.playbooks?.find((p2) => slugifyForCompare(p2.title) === c2.slug);
53240
+ const existing = existingManifest?.playbooks?.find((p2) => slugifyPlaybookTitle(p2.title) === c2.slug);
53158
53241
  if (existing?.content?.text !== undefined)
53159
53242
  continue;
53160
53243
  const targetRel = existing?.content?.file ?? path48.join(DEFAULT_PLAYBOOKS_DIR, `${c2.slug}.md`);
@@ -53163,9 +53246,6 @@ function materializePlaybooks(cwd2, cloud, toInstall, keepLocal, existingManifes
53163
53246
  fs45.writeFileSync(target, body, "utf8");
53164
53247
  }
53165
53248
  }
53166
- function slugifyForCompare(s3) {
53167
- return s3.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60) || "playbook";
53168
- }
53169
53249
  function stripFrontmatter(raw) {
53170
53250
  const m3 = /^---\s*\n([\s\S]*?)\n---\s*\n?/.exec(raw);
53171
53251
  if (!m3)
@@ -53218,15 +53298,18 @@ function mergeManifest(cwd2, prev, cloud, cloudAgent, harness) {
53218
53298
  const playbooks = cloud.components.filter((c2) => c2.type === "playbook").map((c2) => {
53219
53299
  const raw = c2.files[0]?.content ?? "";
53220
53300
  const { frontmatter } = stripFrontmatter(raw);
53221
- const local = prev?.playbooks?.find((pb) => slugifyForCompare(pb.title) === c2.slug);
53301
+ const local = prev?.playbooks?.find((pb) => slugifyPlaybookTitle(pb.title) === c2.slug);
53222
53302
  const title = local?.title ?? (typeof frontmatter.title === "string" && frontmatter.title || c2.slug);
53223
53303
  const description = local?.description ?? (typeof frontmatter.description === "string" ? frontmatter.description : undefined);
53224
53304
  const content = local?.content?.text !== undefined ? { text: local.content.text } : {
53225
53305
  file: local?.content?.file ?? path48.join(DEFAULT_PLAYBOOKS_DIR, `${c2.slug}.md`)
53226
53306
  };
53307
+ const pbMeta = c2.meta ?? {};
53227
53308
  return {
53309
+ ...typeof pbMeta.playbook_id === "string" && pbMeta.playbook_id ? { id: pbMeta.playbook_id } : {},
53228
53310
  title,
53229
53311
  ...description ? { description } : {},
53312
+ ...typeof pbMeta.icon === "string" && pbMeta.icon ? { icon: pbMeta.icon } : {},
53230
53313
  content
53231
53314
  };
53232
53315
  });
@@ -53261,7 +53344,12 @@ function mergeManifest(cwd2, prev, cloud, cloudAgent, harness) {
53261
53344
  playbooks,
53262
53345
  skills,
53263
53346
  mcp,
53264
- capabilities: { memory: caps.memory, browser: caps.browser, slack: caps.slack }
53347
+ capabilities: {
53348
+ memory: caps.memory,
53349
+ browser: caps.browser,
53350
+ slack: caps.slack,
53351
+ meeting: caps.meeting
53352
+ }
53265
53353
  };
53266
53354
  }
53267
53355
  function materializeEntrypoint(cwd2, cloudEntrypoint, prev) {
@@ -53515,6 +53603,46 @@ async function buildOutgoingComponents(cwd2, manifest, cloud, resolvedVersions)
53515
53603
  }
53516
53604
  });
53517
53605
  }
53606
+ const playbookEntries = manifest.playbooks ?? [];
53607
+ const playbookSlugs = assignPlaybookSlugs(playbookEntries.map((e2) => e2.title));
53608
+ for (let i = 0;i < playbookEntries.length; i++) {
53609
+ const entry = playbookEntries[i];
53610
+ const slug = playbookSlugs[i];
53611
+ if (entry.content.text !== undefined && entry.content.file !== undefined) {
53612
+ f2.error(`Playbook ${import_picocolors26.default.bold(entry.title)} sets both ${import_picocolors26.default.cyan("text")} and ${import_picocolors26.default.cyan("file")} — pick one.`);
53613
+ return null;
53614
+ }
53615
+ const body = resolvePlaybookContent(cwd2, entry);
53616
+ if (body === null) {
53617
+ if (entry.content.file) {
53618
+ f2.error(`Playbook ${import_picocolors26.default.bold(entry.title)} content file ${import_picocolors26.default.bold(entry.content.file)} not found.`);
53619
+ } else {
53620
+ f2.error(`Playbook ${import_picocolors26.default.bold(entry.title)} content is empty.`);
53621
+ }
53622
+ return null;
53623
+ }
53624
+ const wireBody = assemblePlaybookWireBody(entry, body);
53625
+ const fileName = `${slug}.md`;
53626
+ const fileHash2 = hashString(wireBody);
53627
+ const file = {
53628
+ path: fileName,
53629
+ content: wireBody,
53630
+ hash: fileHash2
53631
+ };
53632
+ out.push({
53633
+ type: "playbook",
53634
+ slug,
53635
+ description: entry.description,
53636
+ hash: componentHashFromFileHashes([fileHash2]),
53637
+ files: [file],
53638
+ meta: {
53639
+ title: entry.title,
53640
+ ...entry.description ? { description: entry.description } : {},
53641
+ ...entry.icon ? { icon: entry.icon } : {},
53642
+ ...entry.id ? { playbook_id: entry.id } : {}
53643
+ }
53644
+ });
53645
+ }
53518
53646
  for (const entry of manifest.mcp ?? []) {
53519
53647
  if (!entry.url && !entry.command) {
53520
53648
  f2.error(`MCP ${import_picocolors26.default.bold(entry.name)} needs either ${import_picocolors26.default.cyan("url")} or ${import_picocolors26.default.cyan("command")}.`);
@@ -53739,16 +53867,21 @@ async function runAgentPush(cwd2, args) {
53739
53867
  return;
53740
53868
  }
53741
53869
  }
53870
+ const localPlaybooks = manifest.playbooks ?? [];
53871
+ const localPlaybookSlugs = assignPlaybookSlugs(localPlaybooks.map((entry) => entry.title));
53872
+ const idlessLocalSlugs = new Set(localPlaybooks.flatMap((entry, i) => entry.id ? [] : [localPlaybookSlugs[i]]));
53873
+ const preIdSchemaSlugs = cloud.components.filter((c2) => c2.type === "playbook").filter((c2) => {
53874
+ const id = c2.meta?.playbook_id;
53875
+ return typeof id === "string" && id && !localPlaybooks.some((p2) => p2.id === id) && idlessLocalSlugs.has(c2.slug);
53876
+ }).map((c2) => c2.slug);
53877
+ if (preIdSchemaSlugs.length > 0) {
53878
+ f2.error(`Playbook ${preIdSchemaSlugs.length === 1 ? "entry" : "entries"} ${preIdSchemaSlugs.map((s3) => import_picocolors27.default.bold(s3)).join(", ")} in ${import_picocolors27.default.bold("brainbase.agent.yaml")} ${preIdSchemaSlugs.length === 1 ? "is" : "are"} missing ${import_picocolors27.default.cyan("id:")}. Run ${import_picocolors27.default.bold("brainbase agent pull")} first to sync playbook ids, then push.`);
53879
+ return;
53880
+ }
53742
53881
  const toSend = [];
53743
53882
  const conflicts = [];
53744
53883
  const upstreamOnly = [];
53745
- const unpushablePlaybooks = [];
53746
53884
  for (const r2 of rows) {
53747
- const localish = r2.status === "modified-local" || r2.status === "added-only-local" || r2.status === "removed-local" || r2.status === "modified-both";
53748
- if (r2.type === "playbook" && localish) {
53749
- unpushablePlaybooks.push(r2);
53750
- continue;
53751
- }
53752
53885
  switch (r2.status) {
53753
53886
  case "modified-local":
53754
53887
  case "added-only-local":
@@ -53765,9 +53898,6 @@ async function runAgentPush(cwd2, args) {
53765
53898
  break;
53766
53899
  }
53767
53900
  }
53768
- if (unpushablePlaybooks.length > 0) {
53769
- f2.warn(`Local playbook change${unpushablePlaybooks.length === 1 ? "" : "s"} can't be pushed yet (the server doesn't accept playbooks) — edit playbooks in the UI instead: ${unpushablePlaybooks.map((r2) => import_picocolors27.default.bold(r2.slug)).join(", ")}`);
53770
- }
53771
53901
  if (!meta.localChanged && !entrypointChanged && toSend.length === 0 && conflicts.length === 0) {
53772
53902
  f2.info("Nothing to push — local is in sync with the cloud.");
53773
53903
  return;
@@ -53860,7 +53990,8 @@ async function runAgentPush(cwd2, args) {
53860
53990
  try {
53861
53991
  updatedCloud = await api.pushAgentManifest(agentId, {
53862
53992
  components: outgoing,
53863
- base_revision: cloud.revision
53993
+ base_revision: cloud.revision,
53994
+ reconcile_playbooks: true
53864
53995
  });
53865
53996
  pushSpinner.stop(`Pushed. New revision ${updatedCloud.revision}.`);
53866
53997
  } catch (err) {
@@ -53872,6 +54003,11 @@ async function runAgentPush(cwd2, args) {
53872
54003
  }
53873
54004
  return handleApiError3(err);
53874
54005
  }
54006
+ const backfill = backfillPlaybookIds(manifest.playbooks ?? [], updatedCloud.components);
54007
+ if (backfill.changed) {
54008
+ manifest.playbooks = backfill.playbooks;
54009
+ writeManifest(cwd2, manifest);
54010
+ }
53875
54011
  const existing = readLink(cwd2);
53876
54012
  if (existing) {
53877
54013
  writeLink(cwd2, {
@@ -53882,8 +54018,6 @@ async function runAgentPush(cwd2, args) {
53882
54018
  }
53883
54019
  const localHashByKey = new Map;
53884
54020
  for (const lc of localComponents) {
53885
- if (lc.type === "playbook")
53886
- continue;
53887
54021
  if (lc.hash)
53888
54022
  localHashByKey.set(`${lc.type}/${lc.slug}`, lc.hash);
53889
54023
  }
@@ -54409,10 +54543,7 @@ async function runAgentCreate(cwd2, args) {
54409
54543
  writeLink(cwd2, link2);
54410
54544
  manifest = readManifest(cwd2);
54411
54545
  let updatedCloud = null;
54412
- if ((manifest.playbooks ?? []).length > 0) {
54413
- f2.info(`Playbooks aren't pushable yet — skipping ${manifest.playbooks.length}. Create playbooks in the UI instead.`);
54414
- }
54415
- const hasContent = !!manifest.instructions || manifest.skills.length > 0 || (manifest.mcp ?? []).length > 0;
54546
+ const hasContent = !!manifest.instructions || manifest.skills.length > 0 || (manifest.mcp ?? []).length > 0 || (manifest.playbooks ?? []).length > 0;
54416
54547
  if (hasContent) {
54417
54548
  const outgoing = await buildOutgoingComponents(cwd2, manifest, null);
54418
54549
  if (outgoing === null) {
@@ -54423,7 +54554,8 @@ async function runAgentCreate(cwd2, args) {
54423
54554
  try {
54424
54555
  updatedCloud = await api.pushAgentManifest(agent.id, {
54425
54556
  components: outgoing,
54426
- base_revision: 0
54557
+ base_revision: 0,
54558
+ reconcile_playbooks: true
54427
54559
  });
54428
54560
  pushSpinner.stop(`Pushed at revision ${updatedCloud.revision}.`);
54429
54561
  } catch (err) {
@@ -54437,6 +54569,11 @@ async function runAgentCreate(cwd2, args) {
54437
54569
  }
54438
54570
  }
54439
54571
  if (updatedCloud) {
54572
+ const backfill = backfillPlaybookIds(manifest.playbooks ?? [], updatedCloud.components);
54573
+ if (backfill.changed) {
54574
+ manifest.playbooks = backfill.playbooks;
54575
+ writeManifest(cwd2, manifest);
54576
+ }
54440
54577
  const localHashByKey = new Map;
54441
54578
  for (const lc of readLocalComponents(cwd2, manifest)) {
54442
54579
  if (lc.hash)
@@ -54877,7 +55014,7 @@ function printHelp() {
54877
55014
  out.push("");
54878
55015
  out.push(` ${import_picocolors32.default.cyan("create")} ${import_picocolors32.default.dim("claim an unclaimed brainbase.agent.yaml and create the cloud agent")}`);
54879
55016
  out.push(` ${import_picocolors32.default.cyan("pull")} ${import_picocolors32.default.dim("[<id>]")} ${import_picocolors32.default.dim("apply cloud changes into this folder — pass <id> to switch (--force to override); --run-entrypoint to also execute the agent entrypoint")}`);
54880
- out.push(` ${import_picocolors32.default.cyan("push")} ${import_picocolors32.default.dim("send local changes to the cloud")}`);
55017
+ out.push(` ${import_picocolors32.default.cyan("push")} ${import_picocolors32.default.dim("send local changes to the cloud — instructions, playbooks, skills, MCPs, entrypoint")}`);
54881
55018
  out.push(` ${import_picocolors32.default.cyan("unpack")} ${import_picocolors32.default.dim("install the claimed agent into a harness layout (--harness to override)")}`);
54882
55019
  out.push(` ${import_picocolors32.default.cyan("status")} ${import_picocolors32.default.dim("show what would push and what would pull")}`);
54883
55020
  out.push(` ${import_picocolors32.default.cyan("env")} ${import_picocolors32.default.dim('print export statements — use with `eval "$(brainbase agent env)"`')}`);
@@ -55253,7 +55390,12 @@ function buildManifestFromCloud(cloud, agent) {
55253
55390
  playbooks: [],
55254
55391
  skills,
55255
55392
  mcp,
55256
- capabilities: { memory: caps.memory, browser: caps.browser, slack: caps.slack }
55393
+ capabilities: {
55394
+ memory: caps.memory,
55395
+ browser: caps.browser,
55396
+ slack: caps.slack,
55397
+ meeting: caps.meeting
55398
+ }
55257
55399
  };
55258
55400
  }
55259
55401
  async function pullAgentSecrets(cwd2, agentId) {
@@ -56810,7 +56952,7 @@ function help() {
56810
56952
  out.push("");
56811
56953
  out.push(` ${import_picocolors41.default.cyan("agent create")} ${import_picocolors41.default.dim("claim an unclaimed brainbase.agent.yaml and create the cloud agent")}`);
56812
56954
  out.push(` ${import_picocolors41.default.cyan("agent pull")} ${import_picocolors41.default.dim("[<id>]")} ${import_picocolors41.default.dim("bring cloud changes into this folder (--force to override; --run-entrypoint to also execute the agent entrypoint)")}`);
56813
- out.push(` ${import_picocolors41.default.cyan("agent push")} ${import_picocolors41.default.dim("send local changes to the cloud")}`);
56955
+ out.push(` ${import_picocolors41.default.cyan("agent push")} ${import_picocolors41.default.dim("send local changes to the cloud — instructions, playbooks, skills, MCPs, entrypoint")}`);
56814
56956
  out.push(` ${import_picocolors41.default.cyan("agent unpack")} ${import_picocolors41.default.dim("install the claimed agent into a harness layout")}`);
56815
56957
  out.push(` ${import_picocolors41.default.cyan("link")} ${import_picocolors41.default.dim("attach this folder to an existing agent")}`);
56816
56958
  out.push(` ${import_picocolors41.default.cyan("agent status")} ${import_picocolors41.default.dim("show what would pull and what would push")}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brainbase-labs/cli",
3
- "version": "0.11.1",
3
+ "version": "0.13.1",
4
4
  "description": "Pack, share, and install agent templates across harnesses (Claude Code, Codex, ...).",
5
5
  "type": "module",
6
6
  "bin": {