@symbo.ls/mcp 1.0.24 → 1.0.26

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/README.md CHANGED
@@ -105,16 +105,50 @@ No API keys required for documentation tools. Project management tools require a
105
105
  pip install symbols-mcp
106
106
  ```
107
107
 
108
- Or with `uv`:
108
+ Or with `uv` (no install needed):
109
109
 
110
110
  ```bash
111
111
  uvx symbols-mcp
112
112
  ```
113
113
 
114
+ Or via npm:
115
+
116
+ ```bash
117
+ npx @symbo.ls/mcp
118
+ ```
119
+
114
120
  ## Configuration
115
121
 
116
- Add to your MCP client config (e.g. `mcp.json`):
122
+ ### Recommended (auto-updates on every launch)
117
123
 
124
+ ```json
125
+ {
126
+ "mcpServers": {
127
+ "symbols": {
128
+ "command": "uvx",
129
+ "args": ["--refresh", "symbols-mcp"]
130
+ }
131
+ }
132
+ }
133
+ ```
134
+
135
+ The `--refresh` flag checks PyPI for a newer version each time the server starts. Adds ~1-2s to startup but ensures you always have the latest rules and documentation.
136
+
137
+ ### Alternative configs
138
+
139
+ **npm (also auto-updates):**
140
+ ```json
141
+ {
142
+ "mcpServers": {
143
+ "symbols": {
144
+ "command": "npx",
145
+ "args": ["-y", "@symbo.ls/mcp"]
146
+ }
147
+ }
148
+ }
149
+ ```
150
+
151
+ **Pinned version (manual updates):**
118
152
  ```json
119
153
  {
120
154
  "mcpServers": {
@@ -126,6 +160,19 @@ Add to your MCP client config (e.g. `mcp.json`):
126
160
  }
127
161
  ```
128
162
 
163
+ ### Manual update
164
+
165
+ ```bash
166
+ # pip
167
+ pip install --upgrade symbols-mcp
168
+
169
+ # uv (clear cache and re-run)
170
+ uv cache clean symbols-mcp && uvx symbols-mcp
171
+
172
+ # npm
173
+ npm update -g @symbo.ls/mcp
174
+ ```
175
+
129
176
  ### Transport modes
130
177
 
131
178
  By default, the server runs over **stdio**. For SSE transport:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symbo.ls/mcp",
3
- "version": "1.0.24",
3
+ "version": "1.0.26",
4
4
  "description": "Symbols.app MCP — docs, code generation, publishing, CLI/SDK reference",
5
5
  "mcpName": "io.github.symbo-ls/symbols-mcp",
6
6
  "files": [
@@ -6,8 +6,6 @@ Follow this protocol exactly. Execute each phase in order. Do not skip steps.
6
6
 
7
7
  ## 1. Install the MCP Server
8
8
 
9
- Run the following command to install:
10
-
11
9
  ```bash
12
10
  pip install symbols-mcp
13
11
  ```
@@ -16,14 +14,14 @@ pip install symbols-mcp
16
14
 
17
15
  ## 2. Configure the MCP Server
18
16
 
19
- Add this configuration to your MCP settings:
17
+ Add this configuration to your MCP settings (uses `--refresh` to auto-update on every launch):
20
18
 
21
19
  ```json
22
20
  {
23
21
  "mcpServers": {
24
22
  "symbols": {
25
23
  "command": "uvx",
26
- "args": ["symbols-mcp"]
24
+ "args": ["--refresh", "symbols-mcp"]
27
25
  }
28
26
  }
29
27
  }
@@ -298,3 +298,33 @@ Dropdown: {
298
298
  ```
299
299
 
300
300
  Use `show` only for elements that should be fully removed from layout with no animation. For modals, dropdowns, tooltips, drawers — always use the opacity pattern.
301
+
302
+ ---
303
+
304
+ ## 17. CSS selectors — nest media and pseudo, never chain into one string
305
+
306
+ ```js
307
+ // ❌ WRONG — chained selector string
308
+ '@dark :hover': { background: 'blue' }
309
+ '@mobileL :focus': { outline: 'none' }
310
+
311
+ // ✅ CORRECT — nested objects
312
+ '@dark': { ':hover': { background: 'blue' } }
313
+ '@mobileL': { ':focus': { outline: 'none' } }
314
+ ```
315
+
316
+ ---
317
+
318
+ ## 18. Colors — define once, shade with modifiers, not Tailwind-style palettes
319
+
320
+ ```js
321
+ // ❌ WRONG — multiple shade definitions
322
+ color: {
323
+ blue50: '#eff6ff', blue100: '#dbeafe', blue200: '#bfdbfe',
324
+ blue300: '#93c5fd', blue400: '#60a5fa', blue500: '#3b82f6',
325
+ }
326
+
327
+ // ✅ CORRECT — single base, use modifiers in components
328
+ color: { blue: '#0474f2' }
329
+ // Then: 'blue.7' (opacity), 'blue+20' (lighten), 'blue-30' (darken)
330
+ ```
@@ -64,7 +64,7 @@ export default {
64
64
  }
65
65
  ```
66
66
 
67
- **Note:** Array values like `['--gray 1 -168', '--gray 1 +168']` are `[@dark, @light]` theme pairs. Use semantic names (`title`, `caption`, `paragraph`, `disabled`, `line`) for text colors.
67
+ **Note:** Array values are `[@dark, @light]` theme pairs. Format: `'--colorName opacity tone'` where `--` is the color reference prefix, opacity is 0-1, and tone is `+N`/`-N` (RGB delta) or `=N` (HSL lightness %). Use semantic names (`title`, `caption`, `paragraph`, `disabled`, `line`) for text colors.
68
68
 
69
69
  ---
70
70
 
@@ -53,28 +53,63 @@ Card: {
53
53
 
54
54
  ### Adaptive semantic colors
55
55
 
56
- Array syntax `[darkValue, lightValue]` with relative tone shifts from gray:
56
+ Array syntax `[darkValue, lightValue]` — values prefixed with `--` are resolved as color references using space-separated format: `'--colorName opacity tone'`.
57
+
58
+ The `--` prefix tells the parser to resolve the value as a color reference (strip `--`, split by space, look up the color, apply opacity and tone). This is NOT a CSS variable — it's the Symbols color reference syntax.
59
+
60
+ ```js
61
+ title: ['--gray 1 -168', '--gray 1 +168'],
62
+ // ↑name ↑alpha ↑tone
63
+ // Dark: gray at full opacity, darkened 168 RGB
64
+ // Light: gray at full opacity, lightened 168 RGB
65
+ ```
57
66
 
58
67
  | Token | Dark | Light | Use |
59
68
  |---|---|---|---|
60
- | `title` | near-white (+168) | near-black (-168) | Primary text |
61
- | `caption` | mid-gray (+68) | mid-gray (-68) | Secondary/meta |
62
- | `paragraph` | lighter-gray (+42) | darker-gray (-42) | Body copy |
63
- | `disabled` | dimmer-gray (+26) | dimmer-gray (-26) | Disabled state |
64
- | `line` | subtle-gray (+16) | subtle-gray (-16) | Borders/dividers |
69
+ | `title` | `'--gray 1 -168'` | `'--gray 1 +168'` | Primary text |
70
+ | `caption` | `'--gray 1 -68'` | `'--gray 1 +68'` | Secondary/meta |
71
+ | `paragraph` | `'--gray 1 -42'` | `'--gray 1 +42'` | Body copy |
72
+ | `disabled` | `'--gray 1 -26'` | `'--gray 1 +26'` | Disabled state |
73
+ | `line` | `'--gray 1 -16'` | `'--gray 1 +16'` | Borders/dividers |
65
74
 
66
- ### Color modifier syntax (dot-notation)
75
+ ### Color modifier syntax — the Symbols shading system
67
76
 
68
- Dot = opacity. `+`/`-` = relative tone shift. `=` = absolute lightness.
77
+ **Define each color ONCE as a single base value.** Generate all shades dynamically using modifiers — never define multiple shade variants of the same color (no `blue100`, `blue200`, `blue300` etc.).
69
78
 
70
- ```
71
- 'gray.95-68' // 95% opacity, darkened 68 steps
72
- 'gray+168' // full opacity, lightened 168 steps
73
- 'white-78' // white darkened 78 steps
74
- 'primary.5' // primary at 50% opacity
75
- 'primary+5' // shifted tone
76
- 'gray=90' // absolute 90% lightness
77
- 'gray.5+15' // 50% opacity + 15 lighter
79
+ | Modifier | Syntax | Example | Effect |
80
+ |----------|--------|---------|--------|
81
+ | Opacity | `.XX` | `'blue.7'` | 70% opacity (0.7) |
82
+ | Lighten | `+N` | `'gray+50'` | Add N to each RGB channel (0-255) |
83
+ | Darken | `-N` | `'gray-68'` | Subtract N from each RGB channel |
84
+ | Absolute | `=N` | `'gray=90'` | Set HSL lightness to N% |
85
+ | Combined | `.XX+N` | `'gray.85+8'` | 85% opacity + lighten by 8 RGB |
86
+
87
+ ```js
88
+ // ✅ CORRECT — one base color, shades via modifiers
89
+ color: {
90
+ blue: '#0474f2',
91
+ gray: '#4e4e50',
92
+ }
93
+
94
+ // Use in components:
95
+ background: 'blue' // base
96
+ background: 'blue.8' // 80% opacity
97
+ background: 'blue+20' // lightened
98
+ background: 'blue-30' // darkened
99
+ color: 'gray.5+15' // 50% opacity + 15 lighter
100
+ borderColor: 'gray+100' // light gray border
101
+
102
+ // ❌ WRONG — Tailwind-style shade palette (DO NOT DO THIS)
103
+ color: {
104
+ blue50: '#eff6ff',
105
+ blue100: '#dbeafe',
106
+ blue200: '#bfdbfe',
107
+ blue300: '#93c5fd',
108
+ blue400: '#60a5fa',
109
+ blue500: '#3b82f6',
110
+ blue600: '#2563eb',
111
+ // ... redundant — just use 'blue+N' / 'blue-N' modifiers
112
+ }
78
113
  ```
79
114
 
80
115
  Opacity rules:
@@ -250,18 +285,32 @@ Title: { fontWeight: 700 }
250
285
 
251
286
  Golden Ratio scale (1.618 default). Applies to `padding`, `margin`, `gap`, `width`, `height`, `boxSize`, `borderRadius`/`round`, `inset`, `top`, `left`, `right`, `bottom`, etc.
252
287
 
253
- | Token | Approx value | Use |
288
+ ### Token stepping system
289
+
290
+ Each letter is a major step. Sub-numbers are minor increments between letters. The sequence flows continuously — each sub-step is one tone increase:
291
+
292
+ ```
293
+ ... X < X1 < X2 < Z < Z1 < Z2 < A < A1 < A2 < A3 < B < B1 < B2 < B3 < C ...
294
+ ```
295
+
296
+ How many sub-steps exist between letters depends on the range — smaller ranges (W, X) have only 1-2 sub-steps, larger ranges (A, B, C) have up to 3.
297
+
298
+ **To increase slightly:** go up one sub-step (e.g. `A` → `A1`, or `B2` → `B3`)
299
+ **To increase moderately:** go up one letter (e.g. `A` → `B`)
300
+ **To decrease:** reverse direction (e.g. `B` → `A3`, or `A` → `Z2`)
301
+
302
+ | Token range | Approx px | Use |
254
303
  |---|---|---|
255
- | `W`-`W2` | 2-4 px | Micro gaps, offsets |
256
- | `X`-`X2` | 4-6 px | Icon padding, tight gaps |
257
- | `Z`-`Z2` | 10-16 px | Compact padding |
258
- | `A`-`A2` | 16-26 px | Default padding, gutters |
259
- | `B`-`B2` | 26-42 px | Section padding |
260
- | `C`-`C2` | 42-68 px | Container padding, avatar sizes |
261
- | `D`-`D2` | 68-110 px | Large sections |
262
- | `E`-`F` | 110-178 px | Hero padding, max-widths |
263
-
264
- Sub-sequence rules: `W` and `X` only have `W`, `W1`, `W2` and `X`, `X1`, `X2`. Sub-tokens like `W4`, `X4` do NOT exist. Sub-steps `3` and `4` (e.g. `A3`, `A4`, `B3`, `B4`) only appear from `A` and above.
304
+ | `W`-`W2` | 2-4 | Micro gaps, offsets |
305
+ | `X`-`X2` | 4-6 | Icon padding, tight gaps |
306
+ | `Z`-`Z2` | 10-16 | Compact padding |
307
+ | `A`-`A3` | 16-26 | Default padding, gutters |
308
+ | `B`-`B3` | 26-42 | Section padding |
309
+ | `C`-`C3` | 42-68 | Container padding, avatar sizes |
310
+ | `D`-`D3` | 68-110 | Large sections |
311
+ | `E`-`F` | 110-178 | Hero padding, max-widths |
312
+
313
+ Typography tokens use the same letter system for `fontSize`.
265
314
 
266
315
  ### Shorthand spacing
267
316
 
@@ -1213,3 +1213,42 @@ When creating new apps, always base the design system on the default template at
1213
1213
 
1214
1214
  Never use font sizes smaller than what the default template defines. The default template enforces recommended, readable sizing for all new projects.
1215
1215
 
1216
+ ---
1217
+
1218
+ ## Rule 45 — Define each color ONCE — use modifier syntax for shades, not Tailwind-style palettes
1219
+
1220
+ Never define multiple shade variants of the same color (`blue100`, `blue200`, `blue300`). Define one base value and use the Symbols shading system: `.XX` (opacity), `+N` (lighten), `-N` (darken), `=N` (absolute lightness).
1221
+
1222
+ ```js
1223
+ // ✅ CORRECT — single base, shades via modifiers in components
1224
+ color: { blue: '#0474f2' }
1225
+ // → 'blue', 'blue.7', 'blue+20', 'blue-30', 'blue.5+15'
1226
+
1227
+ // ❌ WRONG — Tailwind-style shade palette
1228
+ color: { blue50: '#eff6ff', blue100: '#dbeafe', blue200: '#bfdbfe', blue300: '#93c5fd' }
1229
+ ```
1230
+
1231
+ ---
1232
+
1233
+ ## Rule 44 — Never chain CSS selectors — use nesting instead
1234
+
1235
+ Media queries (`@dark`, `@mobileL`) and pseudo-classes (`:hover`, `:active`) must be nested as separate objects, never chained into a single key string.
1236
+
1237
+ ```js
1238
+ // ❌ WRONG — chained selector string
1239
+ Button: {
1240
+ '@dark :hover': { background: 'blue' },
1241
+ '@mobileL :active': { opacity: '0.5' },
1242
+ }
1243
+
1244
+ // ✅ CORRECT — nested objects
1245
+ Button: {
1246
+ '@dark': {
1247
+ ':hover': { background: 'blue' },
1248
+ },
1249
+ '@mobileL': {
1250
+ ':active': { opacity: '0.5' },
1251
+ },
1252
+ }
1253
+ ```
1254
+