@cmo-so/cli 0.7.1 → 0.7.2

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 +70 -2
  2. package/package.json +1 -1
package/dist/cmo.mjs CHANGED
@@ -8089,6 +8089,18 @@ function domainApi(api2, domain) {
8089
8089
  body: JSON.stringify(r)
8090
8090
  }
8091
8091
  ),
8092
+ /** Competitors Maggie found with Google Search, waiting for the user to add or dismiss (docs/25). */
8093
+ competitorSuggestions: () => api2.request(
8094
+ `${base}/competitors/suggestions`
8095
+ ),
8096
+ /** Put a suggestion in the business profile's competitors. */
8097
+ addCompetitorSuggestion: (id) => post(
8098
+ `${base}/competitors/suggestions/${encodeURIComponent(id)}/add`
8099
+ ),
8100
+ /** Not a competitor: never suggested or read for ideas again. */
8101
+ dismissCompetitorSuggestion: (id) => post(`${base}/competitors/suggestions/${encodeURIComponent(id)}/dismiss`),
8102
+ /** Look for new competitors now (once a day; subscribed websites only, else 402). */
8103
+ refreshCompetitorSuggestions: () => post(`${base}/competitors/suggestions/refresh`),
8092
8104
  /** The last time posts delivered by API pull were found in the website's sitemap (gives them their address). */
8093
8105
  sitemapMatch: () => api2.request(`${base}/rewrites/sitemap-match`),
8094
8106
  /** Read the sitemap (found on its own when blank) and match API-pull posts to their live address. */
@@ -9644,6 +9656,60 @@ var brandTools = [
9644
9656
  return { competitors: out.competitors?.map((x) => x.name) };
9645
9657
  }
9646
9658
  }),
9659
+ tool({
9660
+ name: "competitor_suggestions_list",
9661
+ description: "Competitors Maggie found on the web (each website checked) that the user hasn't added to the profile or dismissed yet: name, website, one line, and how many ideas came from their site. Their sitemaps are already used for blog ideas while they wait.",
9662
+ parameters: none,
9663
+ group: "brand",
9664
+ need: { resource: "overview", level: "read" },
9665
+ risk: "R0",
9666
+ run: async (ctx) => {
9667
+ const out = await ws(ctx).competitorSuggestions();
9668
+ return {
9669
+ searched_at: out.searched_at,
9670
+ suggestions: out.items.map(({ id, name, website, description: description2, ideas_found }) => ({
9671
+ id,
9672
+ name,
9673
+ website,
9674
+ description: description2,
9675
+ ideas_found
9676
+ }))
9677
+ };
9678
+ }
9679
+ }),
9680
+ tool({
9681
+ name: "competitor_suggestion_add",
9682
+ description: "Add one of Maggie's competitor suggestions (id from competitor_suggestions_list) to the business profile.",
9683
+ parameters: { type: "object", properties: { id: { type: "string" } }, required: ["id"] },
9684
+ group: "brand",
9685
+ need: write2,
9686
+ risk: "W1",
9687
+ run: async (ctx, { id }) => {
9688
+ const out = await ws(ctx).addCompetitorSuggestion(id);
9689
+ return { competitors: out.competitors.map((c) => c.name) };
9690
+ }
9691
+ }),
9692
+ tool({
9693
+ name: "competitor_suggestion_dismiss",
9694
+ description: "Not a competitor after all: the suggestion is never made again and its site is no longer read for ideas.",
9695
+ parameters: { type: "object", properties: { id: { type: "string" } }, required: ["id"] },
9696
+ group: "brand",
9697
+ need: write2,
9698
+ risk: "W1",
9699
+ run: async (ctx, { id }) => ws(ctx).dismissCompetitorSuggestion(id)
9700
+ }),
9701
+ tool({
9702
+ 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.",
9704
+ parameters: none,
9705
+ group: "brand",
9706
+ need: write2,
9707
+ risk: "W1",
9708
+ run: async (ctx) => {
9709
+ const out = await ws(ctx).refreshCompetitorSuggestions();
9710
+ return { found: out.found, suggestions: out.items.map(({ id, name, website }) => ({ id, name, website })) };
9711
+ }
9712
+ }),
9647
9713
  tool({
9648
9714
  name: "brand_research_update",
9649
9715
  description: "Change the profile's market notes: market_research (text), additional_information (anything else Maggie should know) or the SWOT list (each {name: Strengths|Weaknesses|Opportunities|Threats, description}). A list replaces the whole list.",
@@ -15376,7 +15442,7 @@ var program = new Command();
15376
15442
  // package.json
15377
15443
  var package_default = {
15378
15444
  name: "@cmo-so/cli",
15379
- version: "0.7.1",
15445
+ version: "0.7.2",
15380
15446
  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.",
15381
15447
  type: "module",
15382
15448
  license: "MIT",
@@ -25607,12 +25673,14 @@ var OPEN_WORLD = /* @__PURE__ */ new Set([
25607
25673
  "social_video_add",
25608
25674
  "seo_audit_run",
25609
25675
  "ai_visibility_prompt_check",
25610
- "idea_add"
25676
+ "idea_add",
25677
+ "competitor_suggestions_find"
25611
25678
  ]);
25612
25679
  var OVERWRITES = /* @__PURE__ */ new Set([
25613
25680
  "ai_visibility_keywords_set",
25614
25681
  "brand_research_update",
25615
25682
  "brand_update",
25683
+ "competitor_suggestion_dismiss",
25616
25684
  "draft_rewrite",
25617
25685
  "draft_rewrite_save",
25618
25686
  "draft_update",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmo-so/cli",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
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",