css-is-awesome 1.12.0 → 1.13.0

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/AGENTS.md CHANGED
@@ -308,9 +308,24 @@ Inside this package (all whitelisted in `files`):
308
308
 
309
309
  ## MCP server (SHIPPED — use it)
310
310
 
311
- cia ships a Model Context Protocol stdio server (JSON-RPC over stdio, `serverInfo` name `css-is-awesome` (version read from package.json), protocol `2024-11-05`) at `mcp/server.cjs`, exposed as the `css-is-awesome-mcp` bin. It's in the `files` manifest, so it lands in every consumer's `node_modules`. **Prefer querying it over guessing** — it returns cia's real mixin signatures, tokens, themes, and recipes.
311
+ cia ships a Model Context Protocol stdio server (JSON-RPC over stdio, `serverInfo` name `css-is-awesome`, protocol `2024-11-05`) at `mcp/server.cjs`. It's in the `files` manifest, so it lands in every consumer's `node_modules`. **Prefer querying it over guessing** — it returns cia's real mixin signatures, tokens, themes, and recipes.
312
312
 
313
- Wire it into your MCP client's `.mcp.json`:
313
+ Two ways to run it — prefer the dedicated `npx css-is-awesome-mcp` package (zero install, SDK is a real dependency, no separate peer-install step):
314
+
315
+ ```json
316
+ {
317
+ "mcpServers": {
318
+ "css-is-awesome": {
319
+ "command": "npx",
320
+ "args": ["css-is-awesome-mcp"]
321
+ }
322
+ }
323
+ }
324
+ ```
325
+
326
+ No install step needed — `npx` fetches it on first run. To pin an exact version instead, `npm install css-is-awesome-mcp` first; `npx` then uses that local copy.
327
+
328
+ Or run this in-repo copy directly — needs its SDK peer deps installed manually first (`npm install -D @modelcontextprotocol/sdk zod` in the client project, since they're optional peers):
314
329
 
315
330
  ```json
316
331
  {
@@ -323,7 +338,7 @@ Wire it into your MCP client's `.mcp.json`:
323
338
  }
324
339
  ```
325
340
 
326
- The SDK is an optional peer dep — `npm install -D @modelcontextprotocol/sdk zod` in the client project to run it. It exposes **30 tools** across 8 families:
341
+ Either way it exposes **30 tools** across 8 families:
327
342
 
328
343
  - **Themes** — `list_themes`, `get_theme`, `search_themes`
329
344
  - **Mixins** — `list_mixins`, `get_mixin`, `search_mixins` (real signatures — don't guess)
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # [1.13.0](https://github.com/Jerry2d3d/css-is-awesome/compare/v1.12.1...v1.13.0) (2026-09-11)
2
+
3
+
4
+ ### Features
5
+
6
+ * **mcp:** add derive-theme:<base> intent to assemble_prompt ([576dfcb](https://github.com/Jerry2d3d/css-is-awesome/commit/576dfcb80363f281d13ecf0c9218de8915de6595))
7
+
8
+ ## [1.12.1](https://github.com/Jerry2d3d/css-is-awesome/compare/v1.12.0...v1.12.1) (2026-09-11)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **mcp:** remove colliding css-is-awesome-mcp bin entry, point docs at the new package ([f2ac41c](https://github.com/Jerry2d3d/css-is-awesome/commit/f2ac41c4d6056a1d13c19c5dcb48386acfb0fcda))
14
+
1
15
  # [1.12.0](https://github.com/Jerry2d3d/css-is-awesome/compare/v1.11.1...v1.12.0) (2026-09-11)
2
16
 
3
17
 
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/css-is-awesome?logo=npm&color=cb3837)](https://www.npmjs.com/package/css-is-awesome) [![CI](https://github.com/Jerry2d3d/css-is-awesome/actions/workflows/ci.yml/badge.svg)](https://github.com/Jerry2d3d/css-is-awesome/actions/workflows/ci.yml) [![Node](https://img.shields.io/badge/node-%E2%89%A520-43853d?logo=node.js&logoColor=white)](./package.json) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) [![semantic-release](https://img.shields.io/badge/semantic--release-enabled-e10079?logo=semantic-release)](https://github.com/semantic-release/semantic-release)
6
6
 
7
- **Bring your own selectors. We bring the design system.** One CSS file per theme — drop it in and the page restyles, no markup change. 24 themes. Zero JavaScript in the npm package. Six browser-native interactive components. Small enough to read in an afternoon.
7
+ **Bring your own components. Bring your own selectors. We bring the design system.** No component library to fight, in React, Vue, Angular, Svelte, Web Components, Razor, SharePoint, or plain HTML — cia styles the markup you already own. One CSS file per theme — drop it in and the page restyles, no markup change. 24 themes. Zero JavaScript in the npm package. Six browser-native interactive components. Small enough to read in an afternoon.
8
8
 
9
9
  **Docs:** [cssisawesome.com](https://cssisawesome.com/) · **Install:** `npm install css-is-awesome`
10
10
 
@@ -16,22 +16,18 @@
16
16
 
17
17
  **Then connect the MCP server** and stop guessing at signatures. It answers from the real source — 30 tools covering themes, mixins, functions, tokens, recipes and components.
18
18
 
19
- ```bash
20
- npm install -D @modelcontextprotocol/sdk zod # required — npm will NOT install these for you
21
- ```
22
-
23
19
  ```json
24
20
  {
25
21
  "mcpServers": {
26
22
  "css-is-awesome": {
27
- "command": "node",
28
- "args": ["node_modules/css-is-awesome/mcp/server.cjs"]
23
+ "command": "npx",
24
+ "args": ["css-is-awesome-mcp"]
29
25
  }
30
26
  }
31
27
  }
32
28
  ```
33
29
 
34
- The SDK and `zod` are declared as *optional* peer dependencies, so a plain `npm install css-is-awesome` skips them and the server exits with `@modelcontextprotocol/sdk is not installed`. Install both. `npx css-is-awesome-mcp` does **not** work around this — npx fetches the package but not its optional peers.
30
+ That's the whole setup — [`css-is-awesome-mcp`](https://www.npmjs.com/package/css-is-awesome-mcp) is a dedicated zero-install package, no manual dependency step. `npx` fetches and caches it on first run with no install command needed; if you'd rather pin an exact version in your own `package.json`/lockfile, `npm install css-is-awesome-mcp` works too — `npx` then uses the locally installed copy instead of fetching. (The in-repo copy at `mcp/server.cjs` still works too, if you'd rather not add a second package — see the MCP section below for that path, which needs `npm install -D @modelcontextprotocol/sdk zod` first since those are optional peers here.)
35
31
 
36
32
  Why it matters more here than for older frameworks: no model has memorised cia's API the way it has memorised Tailwind's class names. Without `llm.txt` or MCP, an agent will confidently invent a Tailwind-shaped API. With them, it reads the real thing. Details at [`/docs/mcp`](https://cssisawesome.com/docs/mcp/).
37
33
 
@@ -298,30 +294,43 @@ The scope is kept narrow: 8 `!important` declarations, all inside `@media print`
298
294
 
299
295
  ## MCP server (for AI agents)
300
296
 
301
- cia ships a Model Context Protocol stdio server (JSON-RPC over stdio, protocol `2024-11-05`) at [`mcp/server.cjs`](./mcp/server.cjs), exposed as the `css-is-awesome-mcp` bin. It's in the `files` manifest, so it lands in every consumer's `node_modules`. Any MCP-aware client (Claude Code, Cursor, Aider, Gemini, Copilot) can then query cia's real design system — mixin signatures, tokens, themes, recipes — instead of guessing, without grep-walking the repo. Exposes **30 tools** across 8 families (themes, mixins, functions, tokens · 127 required of them, animations, components, recipes, doc readers) plus `assemble_prompt` (context bundles) and `resolve_size` (snap design px values to cia's 4px grid). Full reference: [`/docs/mcp`](https://cssisawesome.com/docs/mcp/).
297
+ cia ships a Model Context Protocol stdio server (JSON-RPC over stdio, protocol `2024-11-05`) exposing **30 tools** across 8 families (themes, mixins, functions, tokens · 127 required of them, animations, components, recipes, doc readers) plus `assemble_prompt` (context bundles) and `resolve_size` (snap design px values to cia's 4px grid). Any MCP-aware client (Claude Code, Cursor, Aider, Gemini, Copilot) can then query cia's real design system — mixin signatures, tokens, themes, recipes — instead of guessing, without grep-walking the repo. Full reference: [`/docs/mcp`](https://cssisawesome.com/docs/mcp/).
298
+
299
+ **Recommended — zero install:** use the dedicated [`css-is-awesome-mcp`](https://www.npmjs.com/package/css-is-awesome-mcp) package. It depends on `css-is-awesome` and resolves your installed version's real source, so it's never out of sync — and the MCP SDK ships as a real dependency, not an optional peer you have to remember to add.
302
300
 
303
- **Setup is two steps — do both, or the server won't start.**
301
+ ```json
302
+ {
303
+ "mcpServers": {
304
+ "css-is-awesome": {
305
+ "command": "npx",
306
+ "args": ["css-is-awesome-mcp"]
307
+ }
308
+ }
309
+ }
310
+ ```
304
311
 
305
- 1. Install the SDK peer deps. The MCP SDK needs `@modelcontextprotocol/sdk` + `zod`; they're declared as *optional* peers so npm skips them by default. Without them the server exits and your MCP client shows only a generic "failed to connect":
312
+ No install command required — `npx` fetches and caches the package the first time your MCP client runs it. Prefer a pinned version in your own lockfile instead? `npm install css-is-awesome-mcp` works the same way as any other dependency; `npx` then runs the locally installed copy rather than fetching one:
306
313
 
307
- ```bash
308
- npm install -D @modelcontextprotocol/sdk zod
309
- ```
314
+ ```bash
315
+ npm install css-is-awesome-mcp
316
+ ```
310
317
 
311
- 2. Add to your client's `.mcp.json` (the `npx` form uses the shipped bin and is CWD-independent):
318
+ **Alternative — the copy already in your `node_modules`:** cia's own `files` manifest ships [`mcp/server.cjs`](./mcp/server.cjs) too, for anyone who'd rather not add a second package. This copy needs its SDK peer deps installed manually first, since they're declared as *optional* peers (so a plain `npm install css-is-awesome` doesn't pull JS into a CSS-only install):
312
319
 
313
- ```json
314
- {
315
- "mcpServers": {
316
- "css-is-awesome": {
317
- "command": "npx",
318
- "args": ["css-is-awesome-mcp"]
319
- }
320
- }
321
- }
322
- ```
320
+ ```bash
321
+ npm install -D @modelcontextprotocol/sdk zod
322
+ ```
323
323
 
324
- Equivalent explicit path: `"command": "node", "args": ["node_modules/css-is-awesome/mcp/server.cjs"]`.
324
+ ```json
325
+ {
326
+ "mcpServers": {
327
+ "css-is-awesome": {
328
+ "command": "node",
329
+ "args": ["node_modules/css-is-awesome/mcp/server.cjs"]
330
+ }
331
+ }
332
+ }
333
+ ```
325
334
 
326
335
  ## Docs site
327
336
 
@@ -399,7 +408,7 @@ Full detail: [`/docs/testing`](https://cssisawesome.com/docs/testing/).
399
408
 
400
409
  **Stable, [published on npm](https://www.npmjs.com/package/css-is-awesome)** (first published 2026-09-01). The mixin API, functions, token contract, and theme architecture are stable and under strict SemVer — breaking changes require a major bump. See [`VERSIONING.md`](./VERSIONING.md) for the policy.
401
410
 
402
- The 1.0 surface is the v0.8 mixin-first reframe — twelve mixin renames, theme system collapsed to 8 single-file theme families, six zero-JS components, intrinsic-layout vocabulary, opt-in utilities — plus the recipes book, the Tailwind/Bootstrap migration on-ramp, print/PDF support, and the 30-tool MCP server. The npm package ships ZERO JavaScript by hard rule.
411
+ The 1.0 surface is the v0.8 mixin-first reframe — twelve mixin renames, theme system collapsed to 8 single-file theme families, six zero-JS components, intrinsic-layout vocabulary, opt-in utilities — plus the recipes book, the Tailwind/Bootstrap migration on-ramp, print/PDF support, and the 30-tool MCP server (now also available zero-install via the companion [`css-is-awesome-mcp`](https://www.npmjs.com/package/css-is-awesome-mcp) package). The npm package ships ZERO JavaScript by hard rule.
403
412
 
404
413
  See [CHANGELOG.md](./CHANGELOG.md) for the full history and [MIGRATION.md](./MIGRATION.md) for the v0.7 → v0.8 upgrade path.
405
414
 
package/bin/README.md CHANGED
@@ -6,19 +6,19 @@ cia's CLI entry points. **These are the only JavaScript files cia ships** — th
6
6
 
7
7
  | Bin | File | What it does |
8
8
  |---|---|---|
9
- | `css-is-awesome-mcp` | `../mcp/server.cjs` | MCP stdio server for AI agents (themes, mixins, recipes, etc.) |
10
- | `cia` | `./cia.cjs` | The CLI router — `migrate` (tailwind/bootstrap), `add` (recipe registry), `analyze` (design-system health) |
9
+ | `cia` | `./cia.cjs` | The CLI router — `migrate` (tailwind/bootstrap/mui/chakra), `add` (recipe registry), `analyze` (design-system health) |
11
10
 
12
- Invoke either via `npx` from a consumer project that has cia installed:
11
+ Invoke via `npx` from a consumer project that has cia installed:
13
12
 
14
13
  ```bash
15
- npx css-is-awesome-mcp # MCP server (stdio; configure via .mcp.json)
16
14
  npx cia --help # CLI help
17
15
  npx cia migrate tailwind ./tailwind.config.js
18
16
  npx cia add bottom-nav # copy a recipe into the project — own the pattern
19
17
  npx cia analyze src/styles # health check: dead symbols, space() trap, hex, BEM
20
18
  ```
21
19
 
20
+ **MCP server is NOT registered here** — `../mcp/server.cjs` ships in the `files` manifest but deliberately has no `bin` entry. It used to (`css-is-awesome-mcp`), but that collided with the separate [`css-is-awesome-mcp`](https://www.npmjs.com/package/css-is-awesome-mcp) package's own identically-named bin: since that package depends on `css-is-awesome`, npm links both packages' bins into the same `node_modules/.bin/`, and whichever wins is undefined — in practice it silently ran this repo's copy instead of the dedicated package's. Removed here so there's exactly one owner of that command name. Run this in-repo copy directly via `node mcp/server.cjs` (see the README's MCP section for both invocation paths).
21
+
22
22
  ## Subcommand files
23
23
 
24
24
  `cia.cjs` is the router. Each subcommand lives in its own sibling file and is loaded lazily so consumers who only use one path don't pay the require cost of the others.
package/llm.txt CHANGED
@@ -128,22 +128,28 @@ Newspaper by day, hacker terminal by night. Most design systems give you dark mo
128
128
 
129
129
  ## MCP server (shipped 2026-05-22)
130
130
 
131
- cia ships an MCP stdio server (JSON-RPC over stdio, `serverInfo` name `css-is-awesome` (version read from package.json), protocol `2024-11-05`) at `mcp/server.cjs`, exposed as the `css-is-awesome-mcp` bin and included in the `files` manifest — so it lands in every consumer's `node_modules`. **30 tools** across 8 resource families: themes, mixins, functions, tokens (127 required + 36 optional), animations, components, recipes, doc readers. Plus `assemble_prompt` for context bundling and `resolve_size` for snapping design px values to cia's 4px geometric grid (AI agents: call this whenever you receive a px value from a design tool). Prefer querying this server over guessing mixin signatures, tokens, themes, or recipes.
131
+ cia ships an MCP stdio server (JSON-RPC over stdio, `serverInfo` name `css-is-awesome`, protocol `2024-11-05`) at `mcp/server.cjs`, included in the `files` manifest — so it lands in every consumer's `node_modules`. **30 tools** across 8 resource families: themes, mixins, functions, tokens (127 required + 36 optional), animations, components, recipes, doc readers. Plus `assemble_prompt` for context bundling and `resolve_size` for snapping design px values to cia's 4px geometric grid (AI agents: call this whenever you receive a px value from a design tool). Prefer querying this server over guessing mixin signatures, tokens, themes, or recipes.
132
132
 
133
- Add to your MCP client's `.mcp.json`:
133
+ **Recommended: suggest the dedicated `css-is-awesome-mcp` package** — zero install,
134
+ SDK ships as a real dependency, no separate peer-install step:
134
135
  ```json
135
136
  {
136
137
  "mcpServers": {
137
138
  "css-is-awesome": {
138
- "command": "node",
139
- "args": ["node_modules/css-is-awesome/mcp/server.cjs"]
139
+ "command": "npx",
140
+ "args": ["css-is-awesome-mcp"]
140
141
  }
141
142
  }
142
143
  }
143
144
  ```
144
- **Two dependencies are required and npm will NOT install them for you.** They are
145
- declared as OPTIONAL peer dependencies, so `npm install css-is-awesome` skips
146
- them silently and the server exits with:
145
+ No install command needed — `npx` fetches it on first run. To pin an exact
146
+ version in a lockfile instead, `npm install css-is-awesome-mcp` works the same
147
+ as any other dependency; `npx` then uses that local copy.
148
+
149
+ Alternative: the copy already in `node_modules` (this repo's own `mcp/server.cjs`).
150
+ **Two dependencies are required and npm will NOT install them for you** for this
151
+ path specifically — they are declared as OPTIONAL peer dependencies, so
152
+ `npm install css-is-awesome` skips them silently and this copy exits with:
147
153
 
148
154
  ```
149
155
  css-is-awesome MCP server: @modelcontextprotocol/sdk is not installed.
@@ -155,9 +161,16 @@ Fix, in the client project:
155
161
  npm install -D @modelcontextprotocol/sdk zod
156
162
  ```
157
163
 
158
- Do NOT suggest `npx css-is-awesome-mcp` as a shortcut. `npx` fetches the package
159
- but not its optional peers, so it hits the same error. Run it from an install
160
- that has both, using the config above.
164
+ ```json
165
+ {
166
+ "mcpServers": {
167
+ "css-is-awesome": {
168
+ "command": "node",
169
+ "args": ["node_modules/css-is-awesome/mcp/server.cjs"]
170
+ }
171
+ }
172
+ }
173
+ ```
161
174
 
162
175
  ## Recipes (shipped in 1.0.0)
163
176
 
package/mcp/server.cjs CHANGED
@@ -87,7 +87,9 @@ function resolveMcp() {
87
87
  catch {
88
88
  throw new Error(
89
89
  'css-is-awesome MCP server: @modelcontextprotocol/sdk is not installed. ' +
90
- 'Install with: npm install @modelcontextprotocol/sdk zod'
90
+ 'Easiest fix: run `npx css-is-awesome-mcp` instead — it has the SDK as ' +
91
+ 'a real dependency, no manual install needed. ' +
92
+ 'To use this in-repo copy directly anyway: npm install @modelcontextprotocol/sdk zod'
91
93
  );
92
94
  }
93
95
  }
@@ -95,7 +97,10 @@ function resolveMcp() {
95
97
  function resolveStdio() {
96
98
  try { return require('@modelcontextprotocol/sdk/server/stdio.js'); }
97
99
  catch {
98
- throw new Error('css-is-awesome MCP server: @modelcontextprotocol/sdk (stdio) missing — reinstall.');
100
+ throw new Error(
101
+ 'css-is-awesome MCP server: @modelcontextprotocol/sdk (stdio) missing. ' +
102
+ 'Run `npx css-is-awesome-mcp` instead, or reinstall the peer deps here.'
103
+ );
99
104
  }
100
105
  }
101
106
 
@@ -1131,6 +1136,40 @@ const handlers = {
1131
1136
  }
1132
1137
  break;
1133
1138
  }
1139
+ case 'derive-theme': {
1140
+ if (!target) throw new Error('assemble_prompt: intent "derive-theme:" requires a base theme name');
1141
+ const base = handlers.get_theme({ name: target });
1142
+ const themeMixin = handlers.get_mixin({ name: 'theme' });
1143
+ const tk = getTokens();
1144
+ banner(`css-is-awesome — deriving a new theme from ${base.name}`);
1145
+ sub('Base theme — copy this, then edit only what should change');
1146
+ lines.push('```scss');
1147
+ lines.push(base.raw_scss);
1148
+ lines.push('```');
1149
+ lines.push('');
1150
+ sub('The `theme()` wrapper contract');
1151
+ lines.push('```scss');
1152
+ lines.push(themeMixin.signature);
1153
+ lines.push('```');
1154
+ if (themeMixin.doc) { lines.push(''); lines.push(themeMixin.doc); }
1155
+ lines.push('');
1156
+ sub('Required + optional tokens (must all still be present)');
1157
+ lines.push(`Required: ${tk.required.length}. Optional: ${tk.optional.length}.`);
1158
+ lines.push('');
1159
+ const dtCats = Object.keys(tk.byCategory).sort();
1160
+ for (const cat of dtCats) {
1161
+ lines.push(`### ${cat} (${tk.byCategory[cat].length})`);
1162
+ lines.push('');
1163
+ for (const name of tk.byCategory[cat].sort()) lines.push(`- ${name}`);
1164
+ lines.push('');
1165
+ }
1166
+ sub('Rules');
1167
+ lines.push('1. This server never writes files. Build the new theme file\'s content from the above, then write it yourself with your own file tools — ask the user where it should go if it isn\'t obvious.');
1168
+ lines.push('2. Keep the `:root, :root[data-theme="<new-name>"]` shape (the base theme above already has it) unless you are deliberately building a multi-theme-bundle entry, where `$standalone: false` applies instead.');
1169
+ lines.push('3. Only change values that should actually differ for the new design — copy everything else from the base theme unchanged, including tokens you don\'t recognize.');
1170
+ lines.push('4. Before calling it done: every required token listed above must still be present in the new file. If this repo is available locally, `node scripts/theme-validator.js <path-to-new-theme.css>` confirms it.');
1171
+ break;
1172
+ }
1134
1173
  case 'animations': {
1135
1174
  const a = getAnimations();
1136
1175
  banner('css-is-awesome — animations');
@@ -1170,7 +1209,7 @@ const handlers = {
1170
1209
  break;
1171
1210
  }
1172
1211
  default:
1173
- throw new Error(`assemble_prompt: unknown intent "${intent}". Try overview | mixin:<name> | component:<name> | theme:<name> | tokens | animations | recipe:<name>.`);
1212
+ throw new Error(`assemble_prompt: unknown intent "${intent}". Try overview | mixin:<name> | component:<name> | theme:<name> | derive-theme:<base> | tokens | animations | recipe:<name>.`);
1174
1213
  }
1175
1214
 
1176
1215
  if (args && typeof args === 'string' && args.trim()) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "css-is-awesome",
3
- "version": "1.12.0",
3
+ "version": "1.13.0",
4
4
  "description": "A token-driven SCSS design system with light/dark theming, semantic color tokens, and a 800+ LOC mixin API.",
5
5
  "homepage": "https://github.com/Jerry2d3d/css-is-awesome#readme",
6
6
  "bugs": {
@@ -10,7 +10,6 @@
10
10
  "style": "dist/css-is-awesome.css",
11
11
  "sass": "scss/main.scss",
12
12
  "bin": {
13
- "css-is-awesome-mcp": "mcp/server.cjs",
14
13
  "cia": "bin/cia.cjs"
15
14
  },
16
15
  "sideEffects": [