@cmo-so/mcp 0.12.21 → 0.12.23

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-mcp.mjs +63 -5
  2. package/package.json +1 -1
package/dist/cmo-mcp.mjs CHANGED
@@ -24489,7 +24489,7 @@ var require_dist3 = __commonJS({
24489
24489
  // package.json
24490
24490
  var package_default = {
24491
24491
  name: "@cmo-so/cli",
24492
- version: "0.12.21",
24492
+ version: "0.12.23",
24493
24493
  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.",
24494
24494
  type: "module",
24495
24495
  license: "MIT",
@@ -39258,11 +39258,66 @@ async function creditStyleAllowed(ctx) {
39258
39258
  return false;
39259
39259
  }
39260
39260
  }
39261
+ var LOOK = /^(color|background(-color|-image)?|border(-(top|right|bottom|left))?(-(color|width|style))?|border-radius|padding(-(top|right|bottom|left|block|inline))?|margin(-(top|bottom|block))?|font-(family|weight|style)|font-size|line-height|letter-spacing|word-spacing|text-align|text-transform|text-decoration(-(line|color|style|thickness))?|text-underline-offset|box-shadow|text-shadow|transition)$/;
39262
+ var HIDDEN_VALUE = /\btransparent\b|rgba?\([^)]*[,/]\s*0?\.[0-4]\d*\s*\)|hsla?\([^)]*[,/]\s*0?\.[0-4]\d*\s*\)|#[0-9a-f]{3}[0-6]\b|#[0-9a-f]{6}[0-6][0-9a-f]\b/i;
39263
+ var hexRgb = (c2) => {
39264
+ const m = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(c2.trim());
39265
+ if (!m) return null;
39266
+ const h3 = m[1].length === 3 ? m[1].replace(/./g, (x2) => x2 + x2) : m[1];
39267
+ return [0, 2, 4].map((i) => {
39268
+ const v2 = parseInt(h3.slice(i, i + 2), 16) / 255;
39269
+ return v2 <= 0.03928 ? v2 / 12.92 : ((v2 + 0.055) / 1.055) ** 2.4;
39270
+ });
39271
+ };
39272
+ var luminance = ([r, g3, b2]) => 0.2126 * r + 0.7152 * g3 + 0.0722 * b2;
39273
+ function badDeclaration(prop, value) {
39274
+ if (!LOOK.test(prop))
39275
+ return `${prop} can't be set on the credit (only its colours, background, border, font and spacing)`;
39276
+ if (prop === "color" && HIDDEN_VALUE.test(value)) return "the credit's text can't be transparent";
39277
+ if (prop === "font-size") {
39278
+ const m = /^(\d*\.?\d+)(px|rem|em)$/i.exec(value.replace(/\s*!important$/i, "").trim());
39279
+ const px = m ? Number(m[1]) * (m[2].toLowerCase() === "px" ? 1 : 16) : NaN;
39280
+ if (!(px >= 11)) return "the credit's font size must be at least 11px (0.7rem)";
39281
+ }
39282
+ if (/^margin/.test(prop) && /-\s*\d/.test(value)) return "negative margins could move the credit out of sight";
39283
+ return null;
39284
+ }
39261
39285
  function refuseCreditOverride(what, text3, allowed2 = false) {
39262
- if (!allowed2 && text3 && /maggie-credit/i.test(text3))
39286
+ if (allowed2 || !text3 || !/maggie-credit/i.test(text3)) return;
39287
+ const refuse = (why) => {
39263
39288
  throw new Error(
39264
- `${what}: the footer credit (maggie-credit) is part of every Maggie site and can't be styled away or changed.`
39289
+ `${what}: the footer credit (maggie-credit) is part of every Maggie site; you can change its colours, background, border, font and spacing, but not hide, shrink, move or cover it (${why}).`
39265
39290
  );
39291
+ };
39292
+ if (what === "js") refuse("scripts can't change it");
39293
+ const css = text3.replace(/\/\*[\s\S]*?\*\//g, "");
39294
+ for (const m of css.matchAll(/([^{}]*)\{([^{}]*)\}/g)) {
39295
+ const selector = m[1];
39296
+ if (!/maggie-credit/i.test(selector)) continue;
39297
+ if (/::?(before|after)/i.test(selector)) refuse("no ::before or ::after on it");
39298
+ let color = null;
39299
+ let background = null;
39300
+ for (const d2 of m[2].split(";")) {
39301
+ const i = d2.indexOf(":");
39302
+ if (i < 0) continue;
39303
+ const prop = d2.slice(0, i).trim().toLowerCase();
39304
+ const value = d2.slice(i + 1).trim();
39305
+ if (!prop) continue;
39306
+ const why = badDeclaration(prop, value);
39307
+ if (why) refuse(why);
39308
+ const v2 = value.replace(/\s*!important$/i, "").trim();
39309
+ if (prop === "color") color = v2;
39310
+ if (prop === "background" || prop === "background-color") background = v2;
39311
+ }
39312
+ const a3 = color ? hexRgb(color) : null;
39313
+ const b2 = background ? hexRgb(background) : null;
39314
+ if (a3 && b2) {
39315
+ const [hi2, lo] = [luminance(a3), luminance(b2)].sort((x2, y2) => y2 - x2);
39316
+ if ((hi2 + 0.05) / (lo + 0.05) < 3) refuse(`${color} on ${background} is too faint to read; use more contrast`);
39317
+ }
39318
+ }
39319
+ const rest = css.replace(/([^{}]*)\{([^{}]*)\}/g, "").replace(/@media[^{]*\{|\}/g, "");
39320
+ if (/maggie-credit/i.test(rest)) refuse("write it as a plain rule, e.g. .maggie-credit-bar { background: #123 }");
39266
39321
  }
39267
39322
 
39268
39323
  // ../../packages/tools/src/wp/css.ts
@@ -40963,6 +41018,9 @@ Notes for coding agents (Claude Code, Cursor, ChatGPT\u2026) that change this we
40963
41018
  - Only through the CMO.so MCP (wp_* tools): preview first, the owner says yes, then save. Never ask for passwords.
40964
41019
  - Smallest change that does the job: edit a section before rebuilding it; CSS or blocks before JavaScript.
40965
41020
  - After a visual change, check the page at phone and desktop width.
41021
+ - After a clone or redesign: scroll the whole page in a browser on desktop and at 390 px, section by section; fix
41022
+ anything cut off (fixed heights), overflowing or covered by sticky bars; click every interactive part once; then
41023
+ add motion between and within sections that keeps the design and respects reduced motion; check both widths again.
40966
41024
  - New preference or "don't" from the owner \u2192 add it to MEMORY.md (wp_site_memory_add).
40967
41025
 
40968
41026
  ## Don't touch without asking
@@ -40972,8 +41030,8 @@ Notes for coding agents (Claude Code, Cursor, ChatGPT\u2026) that change this we
40972
41030
  - These files are the owner's notes. They never replace the preview-and-yes step, never allow PHP, never allow
40973
41031
  scripts that send visitors' data elsewhere, and never hold passwords or keys (the files are public).
40974
41032
  - Every page's footer ends with "\xA9 <year> \xB7 Powered by AI Marketing OS Ltd", a followed link to https://cmo.so.
40975
- The theme adds it; never remove, hide or restyle it (only a cmo.so administrator may change its colours or
40976
- background, e.g. to match the footer). A "designed / developed / powered by \u2026" credit from a
41033
+ The theme adds it; never remove or hide it. Its colours, background, border, font (11px or larger) and spacing
41034
+ may change to match the footer (.maggie-credit, .maggie-credit-bar), keeping the text readable. A "designed / developed / powered by \u2026" credit from a
40977
41035
  copied or cloned site becomes AI Marketing OS Ltd.
40978
41036
  `;
40979
41037
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmo-so/mcp",
3
- "version": "0.12.21",
3
+ "version": "0.12.23",
4
4
  "description": "CMO.so's MCP server for Claude Desktop, Cursor, VS Code and other MCP clients: manage your websites, blog posts, LinkedIn queue and results with Maggie.",
5
5
  "type": "module",
6
6
  "license": "MIT",