@cmo-so/cli 0.7.2 → 0.7.4

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/cmo.mjs +56 -4
  2. package/package.json +1 -1
package/dist/cmo.mjs CHANGED
@@ -7353,6 +7353,14 @@ function createApi({ baseUrl, session: session2, fetch: fetchImpl = globalThis.f
7353
7353
  apps: () => request("/v1/me/apps"),
7354
7354
  revokeApp: (grantId) => request(`/v1/me/apps/${encodeURIComponent(grantId)}`, { method: "DELETE" }),
7355
7355
  invoices: () => request("/v1/me/invoices"),
7356
+ /**
7357
+ * Take a website off your own list (archives your claim; reversible on ai.cmo.so). Nothing changes for
7358
+ * anyone else; a team member also leaves the team.
7359
+ */
7360
+ removeWebsite: (domain) => request(
7361
+ `/v1/me/websites/${encodeURIComponent(domain)}/remove`,
7362
+ { method: "POST" }
7363
+ ),
7356
7364
  /** Delete the account (only from the person's own sign-in). Websites stay, unclaimed; plans stop renewing. */
7357
7365
  delete: () => request("/v1/me/delete", {
7358
7366
  method: "POST",
@@ -7532,7 +7540,9 @@ function domainApi(api2, domain) {
7532
7540
  });
7533
7541
  return {
7534
7542
  summary: () => api2.request(base),
7535
- posts: (status, limit = 50) => api2.request(`${base}/posts?status=${status}&limit=${limit}`),
7543
+ posts: (status, limit = 50) => api2.request(
7544
+ `${base}/posts?status=${status}&limit=${limit}`
7545
+ ),
7536
7546
  post: (id) => api2.request(`${base}/posts/${encodeURIComponent(id)}`),
7537
7547
  updatePost: (id, changes) => api2.request(`${base}/posts/${encodeURIComponent(id)}`, {
7538
7548
  method: "PATCH",
@@ -7640,6 +7650,11 @@ function domainApi(api2, domain) {
7640
7650
  wordpressPlugin: () => api2.request(`${base}/wordpress-plugin`),
7641
7651
  // Writes (need autopilot write on the domain).
7642
7652
  addIdea: (input) => post(`${base}/ideas`, input),
7653
+ /**
7654
+ * Up to 100 ideas exactly as given (no AI, no generation used): they wait in the pool, not the plan, and count
7655
+ * toward the 100 waiting ideas a person may add. Duplicates (title or page) are skipped and listed.
7656
+ */
7657
+ addIdeas: (ideas2) => post(`${base}/ideas/bulk`, { ideas: ideas2 }),
7643
7658
  /** Ideas built on up to 10 photos (base64 JPEG). The server keeps no copy. */
7644
7659
  ideasFromPhotos: (photos, count, brief2 = "") => post(`${base}/ideas/from-photos`, { photos, count, brief: brief2 }),
7645
7660
  generateIdeas: (count, brief2 = "") => post(`${base}/ideas/generate`, { count, brief: brief2 }),
@@ -9256,8 +9271,10 @@ var blogTools = [
9256
9271
  const r = await ws(ctx).ideas(int(page, 1, 100, 1), 15, status === "discarded" ? "discarded" : "pending");
9257
9272
  return {
9258
9273
  total: r.total,
9274
+ // The real limits: the user's own waiting ideas (cap) and the plan (plan_max).
9259
9275
  cap: r.cap,
9260
9276
  added_by_you: r.added_by_you,
9277
+ plan_max: r.plan_max,
9261
9278
  items: r.items.map((i) => ({
9262
9279
  id: i.id,
9263
9280
  priority: i.priority,
@@ -9294,6 +9311,41 @@ var blogTools = [
9294
9311
  return ws(ctx).addIdea(url ? { url } : { text: text3 });
9295
9312
  }
9296
9313
  }),
9314
+ tool({
9315
+ name: "ideas_add_list",
9316
+ description: "Add up to 100 ideas exactly as given (a researched list): title, description, primary keyword, up to 5 more keywords, a benchmark URL (read as research, never linked), priority 1-10 and optionally one of the website's topics. No AI rewrites them and no generation is used; they wait in the idea pool, not the plan. Duplicates are skipped and listed; a person's own waiting ideas have a limit (ideas_list cap, 200 today).",
9317
+ parameters: {
9318
+ type: "object",
9319
+ properties: {
9320
+ ideas: {
9321
+ type: "array",
9322
+ items: {
9323
+ type: "object",
9324
+ properties: {
9325
+ title: { type: "string" },
9326
+ description: { type: "string" },
9327
+ keyword: { type: "string", description: "The primary keyword" },
9328
+ keywords: { type: "array", items: { type: "string" } },
9329
+ url: { type: "string", description: "A benchmark page" },
9330
+ priority: { type: "integer", minimum: 1, maximum: 10 },
9331
+ topic: { type: "string", description: "One of topics_list, if it fits" }
9332
+ },
9333
+ required: ["title"]
9334
+ }
9335
+ }
9336
+ },
9337
+ required: ["ideas"]
9338
+ },
9339
+ group: "blog",
9340
+ need: write,
9341
+ risk: "W1",
9342
+ run: async (ctx, { ideas: ideas2 }) => {
9343
+ if (!ideas2?.length) throw new Error("Give at least one idea.");
9344
+ if (ideas2.length > 100) throw new Error("Up to 100 ideas at a time.");
9345
+ const out = await ws(ctx).addIdeas(ideas2);
9346
+ return { added: out.added, skipped: out.skipped, room_left: out.room_left };
9347
+ }
9348
+ }),
9297
9349
  tool({
9298
9350
  name: "ideas_generate",
9299
9351
  description: "Let Maggie come up with new ideas (1\u201310) with AI, optionally about a theme.",
@@ -9365,7 +9417,7 @@ var blogTools = [
9365
9417
  }),
9366
9418
  tool({
9367
9419
  name: "idea_plan",
9368
- description: "Add a waiting idea to the end of the plan (the plan holds at most 10).",
9420
+ description: "Add a waiting idea to the end of the plan (the plan holds up to 100).",
9369
9421
  parameters: {
9370
9422
  type: "object",
9371
9423
  properties: {
@@ -9700,7 +9752,7 @@ var brandTools = [
9700
9752
  }),
9701
9753
  tool({
9702
9754
  name: "competitor_suggestions_find",
9703
- description: "Look for new competitors on the web now (once a day per website, subscribed websites only; Maggie also looks on her own about monthly). New ones come back as suggestions; nothing is added to the profile.",
9755
+ description: "Look for new competitors on the web now (once a day per website, subscribed websites only; Maggie also looks on her own once the website and its known competitors have no new pages left). New ones come back as suggestions; nothing is added to the profile.",
9704
9756
  parameters: none,
9705
9757
  group: "brand",
9706
9758
  need: write2,
@@ -15442,7 +15494,7 @@ var program = new Command();
15442
15494
  // package.json
15443
15495
  var package_default = {
15444
15496
  name: "@cmo-so/cli",
15445
- version: "0.7.2",
15497
+ version: "0.7.4",
15446
15498
  description: "CMO.so on the command line: your websites, ideas, blog posts, LinkedIn queue and results, plus a local MCP server for Claude Desktop, Cursor and other MCP clients.",
15447
15499
  type: "module",
15448
15500
  license: "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmo-so/cli",
3
- "version": "0.7.2",
3
+ "version": "0.7.4",
4
4
  "description": "CMO.so on the command line: your websites, ideas, blog posts, LinkedIn queue and results, plus a local MCP server for Claude Desktop, Cursor and other MCP clients.",
5
5
  "type": "module",
6
6
  "license": "MIT",