@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.
- package/dist/cmo.mjs +56 -4
- 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(
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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",
|