@cmo-so/cli 0.7.5 → 0.7.6
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 +45 -16
- package/package.json +1 -1
package/dist/cmo.mjs
CHANGED
|
@@ -7469,11 +7469,12 @@ function createApi({ baseUrl, session: session2, fetch: fetchImpl = globalThis.f
|
|
|
7469
7469
|
return request(`/v1/skills?${qs}`);
|
|
7470
7470
|
},
|
|
7471
7471
|
get: (id) => request(`/v1/skills/${encodeURIComponent(id)}`),
|
|
7472
|
-
/**
|
|
7473
|
-
react: (id, kind, on2 = true) => request(
|
|
7474
|
-
|
|
7475
|
-
|
|
7476
|
-
|
|
7472
|
+
/** Vote on or save a skill (on: false undoes it). "like" is an upvote. */
|
|
7473
|
+
react: (id, kind, on2 = true) => request(`/v1/skills/${encodeURIComponent(id)}/react`, {
|
|
7474
|
+
method: "POST",
|
|
7475
|
+
headers: { "Content-Type": "application/json" },
|
|
7476
|
+
body: JSON.stringify({ kind, on: on2 })
|
|
7477
|
+
}),
|
|
7477
7478
|
saved: () => request("/v1/skills/saved"),
|
|
7478
7479
|
/** Suggest an open-source GitHub repo; Maggie researches it (3 a day). */
|
|
7479
7480
|
submit: (repoUrl, note) => request("/v1/skills/submissions", {
|
|
@@ -8334,6 +8335,10 @@ var confirmCopy = {
|
|
|
8334
8335
|
en: (a) => `Remove the call-to-action for ${q(a.target_keyword)}.`,
|
|
8335
8336
|
"zh-Hant": (a) => `\u522A\u9664 ${q(a.target_keyword)} \u7684\u884C\u52D5\u547C\u7C72\u3002`
|
|
8336
8337
|
},
|
|
8338
|
+
internal_links_set: {
|
|
8339
|
+
en: (a) => Number(a.count) ? `Link each new post to ${a.count} of your latest articles.` : "Stop linking new posts to your other articles.",
|
|
8340
|
+
"zh-Hant": (a) => Number(a.count) ? `\u6BCF\u7BC7\u65B0\u6587\u7AE0\u9023\u7D50\u5230\u4F60\u6700\u65B0\u7684 ${a.count} \u7BC7\u6587\u7AE0\u3002` : "\u65B0\u6587\u7AE0\u4E0D\u518D\u9023\u7D50\u5230\u4F60\u7684\u5176\u4ED6\u6587\u7AE0\u3002"
|
|
8341
|
+
},
|
|
8337
8342
|
testimonial_upsert: {
|
|
8338
8343
|
en: (a) => `Save the testimonial from ${a.name}${a.use_in_posts ? " and use testimonials in posts" : ""}.`,
|
|
8339
8344
|
"zh-Hant": (a) => `\u5132\u5B58 ${a.name} \u7684\u5BA2\u6236\u8A55\u50F9${a.use_in_posts ? "\uFF0C\u4E26\u5728\u6587\u7AE0\u88E1\u4F7F\u7528\u8A55\u50F9" : ""}\u3002`
|
|
@@ -8582,8 +8587,8 @@ var confirmCopy = {
|
|
|
8582
8587
|
},
|
|
8583
8588
|
// ---------------------------------------------------------- Marketing skills (docs/26)
|
|
8584
8589
|
skill_like: {
|
|
8585
|
-
en: (a) => `${a.undo ? "Take back your
|
|
8586
|
-
"zh-Hant": (a) => `${a.undo ? "\
|
|
8590
|
+
en: (a) => `${a.undo ? "Take back your upvote on" : "Upvote"} the skill ${q(a.skill_id)} on cmo.so.`,
|
|
8591
|
+
"zh-Hant": (a) => `${a.undo ? "\u6536\u56DE\u5C0D" : "\u5728 cmo.so \u6295\u7968\u652F\u6301"}\u6280\u80FD ${q(a.skill_id)}${a.undo ? " \u7684\u652F\u6301\u7968" : ""}\u3002`
|
|
8587
8592
|
},
|
|
8588
8593
|
skill_save: {
|
|
8589
8594
|
en: (a) => `${a.undo ? "Remove" : "Save"} the skill ${q(a.skill_id)} ${a.undo ? "from" : "to"} your saved skills.`,
|
|
@@ -9611,6 +9616,24 @@ var brandTools = [
|
|
|
9611
9616
|
return { ctas: out.ctas?.map((c) => c.target_keyword) };
|
|
9612
9617
|
}
|
|
9613
9618
|
}),
|
|
9619
|
+
tool({
|
|
9620
|
+
name: "internal_links_set",
|
|
9621
|
+
description: "Set how many of the website's own latest articles each new post links to (internal cross-links, picked for the topic; separate from CTAs). 0 turns it off, max 10, default 3.",
|
|
9622
|
+
parameters: {
|
|
9623
|
+
type: "object",
|
|
9624
|
+
properties: { count: { type: "integer", minimum: 0, maximum: 10 } },
|
|
9625
|
+
required: ["count"]
|
|
9626
|
+
},
|
|
9627
|
+
group: "brand",
|
|
9628
|
+
need: write2,
|
|
9629
|
+
risk: "W1",
|
|
9630
|
+
run: async (ctx, { count }) => {
|
|
9631
|
+
const n = Math.round(Number(count));
|
|
9632
|
+
if (!Number.isFinite(n) || n < 0 || n > 10) throw new Error("count must be 0 to 10.");
|
|
9633
|
+
const out = await ws(ctx).updateBrand({ internal_links: { count: n } });
|
|
9634
|
+
return { internal_links: out.internal_links ?? { count: n } };
|
|
9635
|
+
}
|
|
9636
|
+
}),
|
|
9614
9637
|
tool({
|
|
9615
9638
|
name: "testimonial_upsert",
|
|
9616
9639
|
description: "Add a customer testimonial, or change the one from the same person. Only real quotes the user gives (or examples they asked for). use_in_posts turns testimonials on in posts.",
|
|
@@ -10689,7 +10712,7 @@ var ID = { type: "string", description: "The skill id, like cmo-ad-creative" };
|
|
|
10689
10712
|
var skillTools = [
|
|
10690
10713
|
tool({
|
|
10691
10714
|
name: "skills_search",
|
|
10692
|
-
description: "Search cmo.so's open library of marketing skills (step-by-step methods an AI agent follows, free and MIT licensed): returns matching skills with their summary,
|
|
10715
|
+
description: "Search cmo.so's open library of marketing skills (step-by-step methods an AI agent follows, free and MIT licensed): returns matching skills with their summary, vote score and page. Use it when the user asks how to do a marketing job, wants a playbook or template, or asks which skills exist. Empty query: the most useful ones and the categories.",
|
|
10693
10716
|
parameters: {
|
|
10694
10717
|
type: "object",
|
|
10695
10718
|
properties: {
|
|
@@ -10713,7 +10736,13 @@ var skillTools = [
|
|
|
10713
10736
|
return {
|
|
10714
10737
|
total_in_library: r.total,
|
|
10715
10738
|
...a.query ? {} : { categories: r.categories.map((c) => `${c.id} (${c.count})`) },
|
|
10716
|
-
skills: r.skills.map((s) => ({
|
|
10739
|
+
skills: r.skills.map((s) => ({
|
|
10740
|
+
id: s.id,
|
|
10741
|
+
name: s.name,
|
|
10742
|
+
summary: s.summary,
|
|
10743
|
+
score: s.score ?? s.likes,
|
|
10744
|
+
page: s.url
|
|
10745
|
+
}))
|
|
10717
10746
|
};
|
|
10718
10747
|
}
|
|
10719
10748
|
}),
|
|
@@ -10732,7 +10761,7 @@ var skillTools = [
|
|
|
10732
10761
|
name: s.name,
|
|
10733
10762
|
summary: s.summary,
|
|
10734
10763
|
page: s.url,
|
|
10735
|
-
|
|
10764
|
+
score: s.score ?? s.likes,
|
|
10736
10765
|
saves: s.saves,
|
|
10737
10766
|
uses_tools: s.mcp_tools,
|
|
10738
10767
|
pairs_with: s.pairs_with,
|
|
@@ -10744,10 +10773,10 @@ var skillTools = [
|
|
|
10744
10773
|
}),
|
|
10745
10774
|
tool({
|
|
10746
10775
|
name: "skill_like",
|
|
10747
|
-
description: "
|
|
10776
|
+
description: "Upvote a skill in the cmo.so library for the user (or take the upvote back with undo). Votes help the library decide what to keep improving. Only when the user asks.",
|
|
10748
10777
|
parameters: {
|
|
10749
10778
|
type: "object",
|
|
10750
|
-
properties: { skill_id: ID, undo: { type: "boolean", description: "true takes the
|
|
10779
|
+
properties: { skill_id: ID, undo: { type: "boolean", description: "true takes the upvote back" } },
|
|
10751
10780
|
required: ["skill_id"]
|
|
10752
10781
|
},
|
|
10753
10782
|
group: "account",
|
|
@@ -10756,12 +10785,12 @@ var skillTools = [
|
|
|
10756
10785
|
idempotent: true,
|
|
10757
10786
|
run: async (ctx, a) => {
|
|
10758
10787
|
const r = await ctx.api.skills.react(String(a.skill_id), "like", !a.undo);
|
|
10759
|
-
return { skill_id: r.item,
|
|
10788
|
+
return { skill_id: r.item, upvoted: r.liked, score: r.counts.score ?? r.counts.likes };
|
|
10760
10789
|
}
|
|
10761
10790
|
}),
|
|
10762
10791
|
tool({
|
|
10763
10792
|
name: "skill_save",
|
|
10764
|
-
description: "Save a skill to the user's saved skills on cmo.so (or remove it with undo), to find it again at cmo.so/skills
|
|
10793
|
+
description: "Save a skill to the user's saved skills on cmo.so (or remove it with undo), to find it again under Saved at cmo.so/skills or with skills_saved_list.",
|
|
10765
10794
|
parameters: {
|
|
10766
10795
|
type: "object",
|
|
10767
10796
|
properties: { skill_id: ID, undo: { type: "boolean", description: "true removes it from saved" } },
|
|
@@ -10794,7 +10823,7 @@ var skillTools = [
|
|
|
10794
10823
|
}),
|
|
10795
10824
|
tool({
|
|
10796
10825
|
name: "skill_submit",
|
|
10797
|
-
description: "Suggest a public open-source GitHub repo for cmo.so's skill library. Maggie researches it within minutes and decides: add a new skill, improve an existing one, keep it as a candidate that needs 10
|
|
10826
|
+
description: "Suggest a public open-source GitHub repo for cmo.so's skill library. Maggie researches it within minutes and decides: add a new skill, improve an existing one, keep it as a candidate that needs a vote score of 10 in 30 days, or decline (licence first: permissive licences can be adapted, copyleft only inspires, no licence is declined). 3 suggestions a day. Follow up with skill_submissions_list.",
|
|
10798
10827
|
parameters: {
|
|
10799
10828
|
type: "object",
|
|
10800
10829
|
properties: {
|
|
@@ -15682,7 +15711,7 @@ var program = new Command();
|
|
|
15682
15711
|
// package.json
|
|
15683
15712
|
var package_default = {
|
|
15684
15713
|
name: "@cmo-so/cli",
|
|
15685
|
-
version: "0.7.
|
|
15714
|
+
version: "0.7.6",
|
|
15686
15715
|
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.",
|
|
15687
15716
|
type: "module",
|
|
15688
15717
|
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.6",
|
|
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",
|