@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.
Files changed (2) hide show
  1. package/dist/cmo.mjs +45 -16
  2. 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
- /** Like or save a skill (on: false undoes it). */
7473
- react: (id, kind, on2 = true) => request(
7474
- `/v1/skills/${encodeURIComponent(id)}/react`,
7475
- { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ kind, on: on2 }) }
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 like on" : "Like"} the skill ${q(a.skill_id)} on cmo.so.`,
8586
- "zh-Hant": (a) => `${a.undo ? "\u53D6\u6D88\u5C0D" : "\u5728 cmo.so \u8B9A"}\u6280\u80FD ${q(a.skill_id)}${a.undo ? " \u7684\u8B9A" : ""}\u3002`
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, likes 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.",
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) => ({ id: s.id, name: s.name, summary: s.summary, likes: s.likes, page: s.url }))
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
- likes: s.likes,
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: "Like a skill in the cmo.so library for the user (or take the like back with undo). Likes help the library decide what to keep improving. Only when the user asks.",
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 like back" } },
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, liked: r.liked, likes: r.counts.likes };
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/saved or with skills_saved_list.",
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 likes 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.",
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.5",
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.5",
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",