@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.
- package/dist/index.js +192 -50
- 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.
|
|
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().
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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) =>
|
|
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) =>
|
|
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: {
|
|
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
|
-
|
|
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: {
|
|
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")}`);
|