@symbo.ls/mcp 1.0.11 → 1.0.14

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.
@@ -1,12 +1,12 @@
1
- # Symbols Project Structure & Setup
1
+ # Symbols Project Structure
2
2
 
3
- Environment-agnostic folder structure for the Symbols platform. Generates independent files without JS module preloading, enabling seamless rendering across VSCode, file structure, Symbols platform, server rendering, and browsers.
3
+ Follow this environment-agnostic folder structure for the Symbols platform. Generate independent files without JS module preloading. Files must render seamlessly across VSCode, file structure, Symbols platform, server rendering, and browsers.
4
4
 
5
5
  ---
6
6
 
7
7
  ## Core Principle
8
8
 
9
- **NO JavaScript imports/exports for component usage.** Components are registered once in their folders and reused through a declarative object tree. No build step required.
9
+ Do NOT use JavaScript imports/exports for component usage. Register components once in their folders and reuse them through a declarative object tree. No build step is required.
10
10
 
11
11
  ---
12
12
 
@@ -21,11 +21,11 @@ smbls/
21
21
  ├── vars.js # export default { APP_VERSION: '1.0.0', ... }
22
22
 
23
23
  ├── components/
24
- │ ├── index.js # export * from './Foo.js' FLAT re-exports only
24
+ │ ├── index.js # export * from './Foo.js' FLAT re-exports only
25
25
  │ └── Navbar.js # export const Navbar = { ... }
26
26
 
27
27
  ├── pages/
28
- │ ├── index.js # import-based registry — ONLY file with imports allowed
28
+ │ ├── index.js # Import-based registry — ONLY file with imports allowed
29
29
  │ └── main.js # export const main = { extends: 'Page', ... }
30
30
 
31
31
  ├── functions/
@@ -37,24 +37,28 @@ smbls/
37
37
  │ └── formatDate.js # export const formatDate = function(date) { ... }
38
38
 
39
39
  ├── designSystem/
40
- │ ├── index.js # export default { COLOR, THEME, FONT, ... }
41
- │ ├── COLOR.js # export default { blue: '#0474f2', ... }
42
- │ ├── THEME.js # export default { dialog: { ... }, ... }
43
- │ └── TYPOGRAPHY.js # export default { base: 16, ratio: 1.25, ... }
40
+ │ ├── index.js # export default { color, theme, font, ... }
41
+ │ ├── color.js # export default { blue: '#0474f2', ... }
42
+ │ ├── theme.js # export default { dialog: { ... }, ... }
43
+ │ └── typography.js # export default { base: 16, ratio: 1.25, ... }
44
44
 
45
45
  └── state/ # (alternative to state.js)
46
46
  ├── index.js # export default { user: {}, metrics: [], ... }
47
47
  └── metrics.js # export default [{ title: 'Status', ... }]
48
48
  ```
49
49
 
50
+ Each folder is described below. Follow these rules strictly when creating or modifying files.
51
+
50
52
  ---
51
53
 
52
- ## 1. Components (`components/`)
54
+ ## Components (`components/`)
55
+
56
+ Create one named export per file, PascalCase, matching the filename exactly.
53
57
 
54
58
  ```js
55
59
  // components/Header.js
56
60
  export const Header = {
57
- extends: 'Flex',
61
+ flow: 'x',
58
62
  minWidth: 'G2',
59
63
  padding: 'A',
60
64
 
@@ -63,25 +67,28 @@ export const Header = {
63
67
  }
64
68
  ```
65
69
 
66
- Rules:
67
- - Named export matching filename (PascalCase)
68
- - Component name MUST match filename
69
- - No imports from other project files reference by key name in tree
70
- - Props use design system tokens (`minWidth: 'G2'`, `padding: 'A'`)
70
+ **Rules:**
71
+ - Use a named export matching the filename (PascalCase).
72
+ - Never import from other project files — reference by key name in the tree.
73
+ - Use design system tokens for props (`minWidth: 'G2'`, `padding: 'A'`).
74
+
75
+ Use `export *` only in `components/index.js`. Never use `export * as`.
71
76
 
72
77
  ```js
73
- // components/index.js — use export * ONLY, never export * as
78
+ // components/index.js
74
79
  export * from './Header.js'
75
80
  export * from './Navbar.js'
76
- // NEVER: export * as Header from './Header.js'
81
+ // NEVER: export * as Header from './Header.js'
77
82
  ```
78
83
 
79
84
  ---
80
85
 
81
- ## 2. Pages (`pages/`)
86
+ ## Pages (`pages/`)
87
+
88
+ Create files as shown. Use dash-case filenames and camelCase exports. Always extend from `'Page'`.
82
89
 
83
90
  ```js
84
- // pages/dashboard.js — dash-case filename, camelCase export
91
+ // pages/dashboard.js
85
92
  export const dashboard = {
86
93
  extends: 'Page',
87
94
  width: '100%',
@@ -97,13 +104,15 @@ export const dashboard = {
97
104
  }
98
105
  ```
99
106
 
100
- Rules:
101
- - Filenames: **dash-case** (`add-network.js`, `edit-node.js`)
102
- - Exports: **camelCase** (`export const addNetwork`)
103
- - Always extend from `'Page'`
107
+ **Rules:**
108
+ - Filenames: dash-case (`add-network.js`, `edit-node.js`).
109
+ - Exports: camelCase (`export const addNetwork`).
110
+ - Always extend from `'Page'`.
111
+
112
+ Register routes in `pages/index.js` — the only file where imports are allowed:
104
113
 
105
114
  ```js
106
- // pages/index.js — only file where imports are allowed
115
+ // pages/index.js
107
116
  import { main } from './main.js'
108
117
  import { dashboard } from './dashboard.js'
109
118
 
@@ -115,7 +124,9 @@ export default {
115
124
 
116
125
  ---
117
126
 
118
- ## 3. Functions (`functions/`)
127
+ ## Functions (`functions/`)
128
+
129
+ Create pure, standalone utilities with a named export matching the filename (camelCase). Do not import other project files.
119
130
 
120
131
  ```js
121
132
  // functions/parseNetworkRow.js
@@ -124,13 +135,10 @@ export const parseNetworkRow = function parseNetworkRow(data) {
124
135
  }
125
136
  ```
126
137
 
127
- Rules:
128
- - Named export matching filename (camelCase)
129
- - Pure, standalone utilities — no imports of other project files
130
- - Called via `el.call('functionName', ...args)` from event handlers
138
+ Call functions from event handlers via `el.call()`:
131
139
 
132
140
  ```js
133
- // In component
141
+ // In a component
134
142
  Button: { onClick: (e, el) => el.call('parseNetworkRow', data) }
135
143
  ```
136
144
 
@@ -138,7 +146,9 @@ Button: { onClick: (e, el) => el.call('parseNetworkRow', data) }
138
146
 
139
147
  ---
140
148
 
141
- ## 4. Methods (`methods/`)
149
+ ## Methods (`methods/`)
150
+
151
+ Create utility methods that extend element behavior. Register once; they become reusable across all components.
142
152
 
143
153
  ```js
144
154
  // methods/formatDate.js
@@ -147,36 +157,36 @@ export const formatDate = function(date) {
147
157
  }
148
158
  ```
149
159
 
150
- Rules:
151
- - Utility methods that extend element behavior
152
- - Registered once, reused across all components
153
-
154
160
  ---
155
161
 
156
- ## 5. Design System (`designSystem/`)
162
+ ## Design System (`designSystem/`)
163
+
164
+ Define tokens in separate files. Aggregate them in `index.js`.
157
165
 
158
166
  ```js
159
- // designSystem/COLOR.js
167
+ // designSystem/color.js
160
168
  export default {
161
169
  black: '#000',
162
170
  white: '#fff',
163
171
  primary: '#0066cc',
164
172
  }
165
173
 
166
- // designSystem/SPACING.js
174
+ // designSystem/spacing.js
167
175
  export default { base: 16, ratio: 1.618 }
168
176
 
169
177
  // designSystem/index.js
170
- import COLOR from './COLOR.js'
171
- import THEME from './THEME.js'
172
- export default { COLOR, THEME }
178
+ import color from './color.js'
179
+ import theme from './theme.js'
180
+ export default { color, theme }
173
181
  ```
174
182
 
175
- See `DESIGN_SYSTEM.md` for full token reference.
183
+ See `DESIGN_SYSTEM.md` for the full token reference.
176
184
 
177
185
  ---
178
186
 
179
- ## 6. State (`state.js` or `state/index.js`)
187
+ ## State (`state.js` or `state/index.js`)
188
+
189
+ Declare pure data structures only. Do not include logic or methods. Keep all initial state in a single file with no cross-imports.
180
190
 
181
191
  ```js
182
192
  // state.js
@@ -188,14 +198,13 @@ export default {
188
198
  }
189
199
  ```
190
200
 
191
- Rules:
192
- - Pure data structures only — no logic, no methods
193
- - All initial state inline in a single file (no cross-imports)
194
- - Accessed and updated via `state.propertyName` or `state.update({})`
201
+ Access and update state via `state.propertyName` or `state.update({})`.
195
202
 
196
203
  ---
197
204
 
198
- ## 7. Dependencies (`dependencies.js`)
205
+ ## Dependencies (`dependencies.js`)
206
+
207
+ Map npm package names to exact version numbers. Do not use `^` or `~`. Do not preload modules — import on demand via dynamic `import()`.
199
208
 
200
209
  ```js
201
210
  export default {
@@ -205,12 +214,8 @@ export default {
205
214
  }
206
215
  ```
207
216
 
208
- Rules:
209
- - Maps npm package names to **exact** version numbers (no `^` or `~`)
210
- - No module preloading — packages imported on-demand via dynamic `import()`
211
- - Keeps structure resolvable without a build step
212
-
213
217
  Dynamic import pattern:
218
+
214
219
  ```js
215
220
  onClick: async (e, el) => {
216
221
  const { Chart } = await import('chart.js')
@@ -220,7 +225,9 @@ onClick: async (e, el) => {
220
225
 
221
226
  ---
222
227
 
223
- ## 8. Config (`config.js`)
228
+ ## Config (`config.js`)
229
+
230
+ Control runtime behavior and rendering flags:
224
231
 
225
232
  ```js
226
233
  export default {
@@ -235,13 +242,11 @@ export default {
235
242
  }
236
243
  ```
237
244
 
238
- Controls runtime behavior and rendering flags.
239
-
240
245
  ---
241
246
 
242
247
  ## Root `index.js`
243
248
 
244
- The root entry file wires everything together:
249
+ Wire everything together in the root entry file:
245
250
 
246
251
  ```js
247
252
  export * as components from './components/index.js'
@@ -269,90 +274,81 @@ next/
269
274
  └── rita/, bazaar/, ... # consumer apps
270
275
  ```
271
276
 
272
- All packages version-locked at the same version across the monorepo. Consumer apps depend on `"smbls": "3.x.x"` (workspace-resolved).
277
+ All packages are version-locked at the same version across the monorepo. Consumer apps depend on `"smbls": "3.x.x"` (workspace-resolved).
273
278
 
274
279
  ---
275
280
 
276
281
  ## CLI Setup
277
282
 
278
- ### Installation
283
+ ### Install
279
284
 
280
285
  ```bash
281
286
  npm i -g @symbo.ls/cli
282
287
  ```
283
288
 
284
- ### Create a new project
289
+ ### Create a Project
285
290
 
286
- ```bash
287
- # Local-only (fastest)
288
- smbls create <project-name>
289
- cd <project-name>
290
- npm start
291
-
292
- # Platform-linked (collaboration + remote preview)
293
- smbls project create <project-name> --create-new
294
- cd <project-name>
295
- npm start
296
- ```
291
+ | Goal | Command |
292
+ |------|---------|
293
+ | Local-only (fastest) | `smbls create <project-name> && cd <project-name> && npm start` |
294
+ | Platform-linked (collaboration + remote preview) | `smbls project create <project-name> --create-new && cd <project-name> && npm start` |
297
295
 
298
296
  ### Authentication
299
297
 
300
- ```bash
301
- smbls login --check # check login status
302
- smbls login # sign in
303
- smbls servers # list servers
304
- smbls servers --select # switch server
305
- ```
298
+ | Command | Action |
299
+ |---------|--------|
300
+ | `smbls login --check` | Check login status |
301
+ | `smbls login` | Sign in |
302
+ | `smbls servers` | List servers |
303
+ | `smbls servers --select` | Switch server |
306
304
 
307
305
  ### Sync & Collaboration
308
306
 
309
- ```bash
310
- smbls push # upload local → platform
311
- smbls fetch --update # download platform → local
312
- smbls sync # two-way sync (interactive conflict handling)
313
- smbls collab # live collaboration watch mode (separate terminal)
314
- ```
307
+ | Command | Action |
308
+ |---------|--------|
309
+ | `smbls push` | Upload local to platform |
310
+ | `smbls fetch --update` | Download platform to local |
311
+ | `smbls sync` | Two-way sync (interactive conflict handling) |
312
+ | `smbls collab` | Live collaboration watch mode (run in separate terminal) |
315
313
 
316
314
  ### File Management
317
315
 
318
- ```bash
319
- smbls files list
320
- smbls files upload
321
- smbls files download
322
- smbls files rm
323
- ```
316
+ | Command | Action |
317
+ |---------|--------|
318
+ | `smbls files list` | List files |
319
+ | `smbls files upload` | Upload files |
320
+ | `smbls files download` | Download files |
321
+ | `smbls files rm` | Remove files |
324
322
 
325
323
  ### Linking an Existing Platform Project
326
324
 
327
- ```bash
328
- smbls project link . # interactive picker
329
- smbls project link . --key <key>.symbo.ls # non-interactive
330
- smbls project link . --id <projectId>
331
- ```
325
+ | Command | Action |
326
+ |---------|--------|
327
+ | `smbls project link .` | Interactive picker |
328
+ | `smbls project link . --key <key>.symbo.ls` | Non-interactive, by key |
329
+ | `smbls project link . --id <projectId>` | Non-interactive, by ID |
332
330
 
333
331
  ### Shell Auto-completion
334
332
 
335
- ```bash
336
- smbls completion zsh --install
337
- smbls completion bash --install
338
- ```
333
+ | Command | Action |
334
+ |---------|--------|
335
+ | `smbls completion zsh --install` | Install zsh completions |
336
+ | `smbls completion bash --install` | Install bash completions |
339
337
 
340
338
  ---
341
339
 
342
340
  ## Remote Preview URLs
343
341
 
344
- After linking and pushing a project, the preview URLs follow this pattern:
342
+ After linking and pushing a project, access previews at these URLs:
345
343
 
346
- ```
347
- Preview: https://<app>.<user>.preview.symbo.ls/
348
- Dev env: https://dev.<app>.<user>.preview.symbo.ls/
349
- With path: https://<app>.<user>.preview.symbo.ls/<subpath>
350
- ```
344
+ | Type | URL Pattern |
345
+ |------|-------------|
346
+ | Preview | `https://<app>.<user>.preview.symbo.ls/` |
347
+ | Dev environment | `https://dev.<app>.<user>.preview.symbo.ls/` |
348
+ | With subpath | `https://<app>.<user>.preview.symbo.ls/<subpath>` |
351
349
 
352
- Where:
353
350
  - `<user>` — Symbols username or org
354
351
  - `<app>` — project identifier
355
- - `<env>` — optional environment (`dev`, `stage`, etc.)
356
352
 
357
353
  Example for user `nikoloza`, project `my-app`:
358
354
  ```
@@ -364,13 +360,13 @@ https://dev.my-app.nikoloza.preview.symbo.ls/
364
360
 
365
361
  ## AI Integration
366
362
 
367
- To instruct an AI coding assistant to follow project conventions:
363
+ Instruct an AI coding assistant to follow project conventions with:
368
364
 
369
365
  ```
370
366
  Use instructions from all .md files in the /docs folder
371
367
  ```
372
368
 
373
- Best tools for Symbols development: Claude Code > Cursor > Copilot
369
+ Recommended tools for Symbols development: Claude Code > Cursor > Copilot.
374
370
 
375
371
  Workflows that work best with AI assistance:
376
372
  - Extending existing Symbols apps
@@ -381,15 +377,17 @@ Workflows that work best with AI assistance:
381
377
 
382
378
  ## Troubleshooting
383
379
 
384
- | Problem | Fix |
385
- | ----------------------------- | -------------------------------------------- |
386
- | Auth required / access denied | `smbls login` |
387
- | Missing project key | Check `symbols.json` or `smbls project link .` |
388
- | Need verbose output | Add `--verbose` to any command |
389
- | CLI not found | `npm i -g @symbo.ls/cli` |
380
+ | Problem | Fix |
381
+ |---------|-----|
382
+ | Auth required / access denied | Run `smbls login` |
383
+ | Missing project key | Check `symbols.json` or run `smbls project link .` |
384
+ | Need verbose output | Add `--verbose` to any command |
385
+ | CLI not found | Run `npm i -g @symbo.ls/cli` |
390
386
  | Build fails on new pkg method | Add method to `METHODS` in `keys.js` AND `set.js` |
391
387
 
392
- ### Build order for monorepo changes
388
+ ---
389
+
390
+ ## Build Order
393
391
 
394
392
  When changing smbls source, rebuild in dependency order:
395
393