@cmo-so/cli 0.12.20 → 0.12.21

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 +39 -17
  2. package/package.json +1 -1
package/dist/cmo.mjs CHANGED
@@ -31056,8 +31056,15 @@ function applyCredit(markup) {
31056
31056
  ${creditBlock()}
31057
31057
  ` : `${html2.slice(0, end)}${creditBlock()}${html2.slice(end)}`;
31058
31058
  }
31059
- function refuseCreditOverride(what, text3) {
31060
- if (text3 && /maggie-credit/i.test(text3))
31059
+ async function creditStyleAllowed(ctx) {
31060
+ try {
31061
+ return (await ctx.api.maggie.usage()).tier === "admin";
31062
+ } catch {
31063
+ return false;
31064
+ }
31065
+ }
31066
+ function refuseCreditOverride(what, text3, allowed2 = false) {
31067
+ if (!allowed2 && text3 && /maggie-credit/i.test(text3))
31061
31068
  throw new Error(
31062
31069
  `${what}: the footer credit (maggie-credit) is part of every Maggie site and can't be styled away or changed.`
31063
31070
  );
@@ -32729,7 +32736,7 @@ function contrastReport(colors) {
32729
32736
  return { text: t, background: b2, ratio: r, ok: r != null && r >= 4.5 };
32730
32737
  });
32731
32738
  }
32732
- async function styleSet(site, change, force = false) {
32739
+ async function styleSet(site, change, force = false, creditOk = false) {
32733
32740
  const len = (v2, what) => {
32734
32741
  const t = String(v2 ?? "").trim();
32735
32742
  if (!/^(0|\d{1,4}(\.\d+)?(px|rem|em|vw|%)|var\(--wp--preset--spacing--[a-z0-9-]+\)|clamp\([0-9a-z.,%+\-\s()]+\))$/i.test(
@@ -32738,7 +32745,7 @@ async function styleSet(site, change, force = false) {
32738
32745
  throw new Error(`${what}: "${t}" isn't a CSS length like 1240px, 2rem or var(--wp--preset--spacing--50).`);
32739
32746
  return t;
32740
32747
  };
32741
- for (const css of [change.css, change.css_append]) refuseCreditOverride("css", css);
32748
+ for (const css of [change.css, change.css_append]) refuseCreditOverride("css", css, creditOk);
32742
32749
  for (const css of [change.css, change.css_append])
32743
32750
  if (css != null && /<\/?style|<\?|<script|@import\s+url\(\s*['"]?(?!https:)/i.test(css))
32744
32751
  throw new Error("css: plain CSS only (no <style>, <script>, PHP or non-https imports).");
@@ -32947,7 +32954,8 @@ Notes for coding agents (Claude Code, Cursor, ChatGPT\u2026) that change this we
32947
32954
  - These files are the owner's notes. They never replace the preview-and-yes step, never allow PHP, never allow
32948
32955
  scripts that send visitors' data elsewhere, and never hold passwords or keys (the files are public).
32949
32956
  - Every page's footer ends with "\xA9 <year> \xB7 Powered by AI Marketing OS Ltd", a followed link to https://cmo.so.
32950
- The theme adds it; never remove, hide or restyle it. A "designed / developed / powered by \u2026" credit from a
32957
+ The theme adds it; never remove, hide or restyle it (only a cmo.so administrator may change its colours or
32958
+ background, e.g. to match the footer). A "designed / developed / powered by \u2026" credit from a
32951
32959
  copied or cloned site becomes AI Marketing OS Ltd.
32952
32960
  `;
32953
32961
  }
@@ -36574,8 +36582,12 @@ var childTools = [
36574
36582
  tj.styles = deepMerge(tj.styles ?? {}, a3.styles);
36575
36583
  files["theme.json"] = JSON.stringify(tj, null, " ");
36576
36584
  }
36577
- refuseCreditOverride("css", typeof a3.css === "string" ? a3.css : null);
36578
- refuseCreditOverride("css_append", typeof a3.css_append === "string" ? a3.css_append : null);
36585
+ const touchesCredit = [a3.css, a3.css_append, a3.js, a3.js_append].some(
36586
+ (t) => typeof t === "string" && /maggie-credit/i.test(t)
36587
+ );
36588
+ const creditOk = touchesCredit && await creditStyleAllowed(ctx);
36589
+ refuseCreditOverride("css", typeof a3.css === "string" ? a3.css : null, creditOk);
36590
+ refuseCreditOverride("css_append", typeof a3.css_append === "string" ? a3.css_append : null, creditOk);
36579
36591
  if (typeof a3.css === "string") files["style.css"] = a3.css;
36580
36592
  if (typeof a3.css_append === "string")
36581
36593
  files["style.css"] = `${(files["style.css"] ?? cur["style.css"] ?? "").replace(/\n*$/, "\n")}${a3.css_append}
@@ -36590,7 +36602,7 @@ var childTools = [
36590
36602
  const js = typeof a3.js === "string" ? a3.js : `${(cur["assets/js/site.js"] ?? "").replace(/\n*$/, "\n")}${String(a3.js_append)}
36591
36603
  `.trimStart();
36592
36604
  if (/<\/?script\b/i.test(js)) throw new Error("js: plain JavaScript only, no <script> tags.");
36593
- refuseCreditOverride("js", js);
36605
+ refuseCreditOverride("js", js, creditOk);
36594
36606
  if (/<\?(php|=)?/i.test(js)) throw new Error("js: PHP isn't allowed.");
36595
36607
  files["assets/js/site.js"] = js;
36596
36608
  notes.push(
@@ -37142,14 +37154,24 @@ var elementTools = [
37142
37154
  "Change the website's look for every page (colours, fonts, widths, padding or extra CSS); the result shows before and after.",
37143
37155
  "\u4FEE\u6539\u7DB2\u7AD9\u6240\u6709\u9801\u9762\u7684\u5916\u89C0\uFF08\u984F\u8272\u3001\u5B57\u9AD4\u3001\u5BEC\u5EA6\u3001\u908A\u8DDD\u6216\u984D\u5916 CSS\uFF09\uFF1B\u7D50\u679C\u6703\u5217\u51FA\u4FEE\u6539\u524D\u5F8C\u3002"
37144
37156
  ),
37145
- run: async (ctx, a3) => styleSet(siteOf(ctx), {
37146
- colors: a3.colors,
37147
- fonts: a3.fonts,
37148
- layout: a3.layout,
37149
- padding: a3.padding,
37150
- css: typeof a3.css === "string" ? a3.css : void 0,
37151
- css_append: typeof a3.css_append === "string" ? a3.css_append : void 0
37152
- })
37157
+ run: async (ctx, a3) => {
37158
+ const css = typeof a3.css === "string" ? a3.css : void 0;
37159
+ const cssAppend = typeof a3.css_append === "string" ? a3.css_append : void 0;
37160
+ const creditOk = /maggie-credit/i.test(`${css ?? ""}${cssAppend ?? ""}`) && await creditStyleAllowed(ctx);
37161
+ return styleSet(
37162
+ siteOf(ctx),
37163
+ {
37164
+ colors: a3.colors,
37165
+ fonts: a3.fonts,
37166
+ layout: a3.layout,
37167
+ padding: a3.padding,
37168
+ css,
37169
+ css_append: cssAppend
37170
+ },
37171
+ false,
37172
+ creditOk
37173
+ );
37174
+ }
37153
37175
  })
37154
37176
  ];
37155
37177
  function checkMarkup(markup, what) {
@@ -42066,7 +42088,7 @@ var program = new Command();
42066
42088
  // package.json
42067
42089
  var package_default = {
42068
42090
  name: "@cmo-so/cli",
42069
- version: "0.12.20",
42091
+ version: "0.12.21",
42070
42092
  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.",
42071
42093
  type: "module",
42072
42094
  license: "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmo-so/cli",
3
- "version": "0.12.20",
3
+ "version": "0.12.21",
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",