@stellisoft/stellify-mcp 0.1.16 → 0.1.18

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/dist/index.js CHANGED
@@ -91,6 +91,39 @@ const stellify = new StellifyClient({
91
91
  // - includes: Array of file UUIDs to import
92
92
  //
93
93
  // -----------------------------------------------------------------------------
94
+ // VUE COMPONENT + ROUTE PATTERN (for visual editing)
95
+ // -----------------------------------------------------------------------------
96
+ // When building Vue components, use TWO routes to enable visual editing:
97
+ //
98
+ // 1. TEMPLATE ROUTE - Holds the component's UI elements for editing
99
+ // - create_route: name='NotesTemplate', path='/notes-template', type='web'
100
+ // - html_to_elements: page=templateRouteUuid, elements='<div>...</div>'
101
+ // - Users can visually edit these elements in the route editor
102
+ //
103
+ // 2. DISPLAY ROUTE - The actual page that renders the component
104
+ // - create_route: name='Notes', path='/notes', type='web'
105
+ // - html_to_elements: page=displayRouteUuid, elements='<NotesApp />'
106
+ // - This embeds the Vue component on the page
107
+ //
108
+ // 3. VUE COMPONENT FILE - Links to template route elements
109
+ // - create_file: type='js', extension='vue', name='NotesApp'
110
+ // - save_file: template=[elementUuidsFromTemplateRoute]
111
+ //
112
+ // WHY THIS PATTERN?
113
+ // - Template elements need a route to be viewable/editable in the UI
114
+ // - The display route keeps the clean component embedding pattern
115
+ // - Component logic (methods, state) stays in the .vue file
116
+ //
117
+ // EXAMPLE WORKFLOW:
118
+ // 1. Create template route: '/notes-template' (for editing)
119
+ // 2. Create display route: '/notes' (for viewing)
120
+ // 3. html_to_elements on template route (creates editable elements)
121
+ // 4. html_to_elements on display route with '<NotesApp />'
122
+ // 5. create_file for NotesApp.vue
123
+ // 6. Add methods, statements, wire events
124
+ // 7. save_file with template pointing to template route's root element
125
+ //
126
+ // -----------------------------------------------------------------------------
94
127
  // ELEMENT EVENT HANDLERS (for frontend files)
95
128
  // -----------------------------------------------------------------------------
96
129
  // Elements can have these event properties (value is method UUID):
@@ -105,9 +138,137 @@ const stellify = new StellifyClient({
105
138
  // - mouseenter: Fires on mouse enter (@mouseenter)
106
139
  // - mouseleave: Fires on mouse leave (@mouseleave)
107
140
  //
141
+ // -----------------------------------------------------------------------------
142
+ // STELLIFY FRAMEWORK (frontend library for Vue/JS files)
143
+ // -----------------------------------------------------------------------------
144
+ // Stellify Framework is an AI-friendly frontend library with constrained APIs.
145
+ // Use these modules in Vue components for common frontend tasks.
146
+ //
147
+ // IMPORT PATTERN:
148
+ // import { Form, Http, Table } from 'stellify-framework'
149
+ //
150
+ // DATA & FORMS:
151
+ // Form.create({name:'',email:''}).validate({...}).store('/api/users')
152
+ // Table.create(data).addColumn('name').sort('name').paginate(10)
153
+ // List.create(items).add(item).remove(id).filter(fn).map(fn)
154
+ // Tree.create().setRoot(data).addChild(parentId,child).traverse(fn)
155
+ //
156
+ // NETWORK:
157
+ // Http.create('/api').withToken(t).get('/users').post('/users',data)
158
+ // Socket.create('wss://...').on('message',fn).connect().send(data)
159
+ // Auth.create('/api').login(creds).logout().getUser().isAuthenticated()
160
+ // Stream.create('/api/chat').onChunk(fn).onComplete(fn).post(data)
161
+ //
162
+ // GRAPHICS:
163
+ // Svg.create(800,600).rect(0,0,100,50).circle(50,50,20).text('Hi',10,10)
164
+ // Canvas.create(800,600).rect(0,0,100,50).circle(50,50,20).toDataURL()
165
+ // Graph.create().addNode('a').addNode('b').addEdge('a','b').layout('force')
166
+ // Scale.linear().domain([0,100]).range([0,500]).value(50) // returns 250
167
+ // Motion.tween(0,100,{duration:500}).onUpdate(fn).start()
168
+ //
169
+ // PLATFORM:
170
+ // Router.create().register('/users',component).navigate('/users')
171
+ // Storage.local().set('key',val).get('key').remove('key')
172
+ // Events.create().on('event',fn).emit('event',data)
173
+ // Clipboard.copy('text').paste()
174
+ // Notify.request().send('Title',{body:'Message'})
175
+ // Geo.getPosition().then(pos=>...).watchPosition(fn)
176
+ // Media.selectFile({accept:'image/*'}).resize(800,600).toBase64()
177
+ // DB.create('mydb').store({name:'items'}).open().put('items',obj)
178
+ // Worker.fromFunction(fn).run(data).terminate()
179
+ //
180
+ // AI & LANGUAGE:
181
+ // Speech.create().onResult(fn).listen({continuous:true})
182
+ // Speech.create().speak('Hello',{voice:'...'})
183
+ // Chat.create().addUser('Hi').addAssistant('Hello').getMessages()
184
+ // Embed.create().store('id',vector,meta).nearest(queryVec,5)
185
+ // Diff.lines(old,new) // [{type:'equal'|'insert'|'delete',value:'...'}]
186
+ //
187
+ // UTILITIES:
188
+ // Time.now().format('YYYY-MM-DD').add(7,'days').relative()
189
+ //
190
+ // KEY METHODS PER MODULE (max 7 each - AI-friendly constraint):
191
+ // Form: create,set,get,validate,store,update,delete
192
+ // Table: create,setData,addColumn,sort,filter,paginate
193
+ // Http: create,get,post,put,delete,withToken
194
+ // Stream: create,post,onChunk,onComplete,abort,getBuffer
195
+ // Speech: create,listen,speak,stopListening,getVoices,onResult
196
+ // Chat: create,addMessage,getHistory,clear,fork,truncate
197
+ // Embed: create,store,compare,nearest,search,toJSON
198
+ // Diff: chars,words,lines,apply,createPatch,similarity
199
+ //
108
200
  // =============================================================================
109
201
  // Define MCP tools
202
+ // Stellify Framework API - full method reference for AI code generation
203
+ const STELLIFY_FRAMEWORK_API = {
204
+ // Data & Forms
205
+ Form: ['create', 'set', 'get', 'getData', 'validate', 'isValid', 'getErrors', 'getError', 'reset', 'store', 'update', 'delete'],
206
+ Table: ['create', 'setData', 'addColumn', 'removeColumn', 'sort', 'filter', 'clearFilter', 'paginate', 'page', 'getData', 'getAllData', 'getColumns', 'getColumn', 'getTotalRows', 'getTotalPages', 'getCurrentPage', 'getPageSize', 'getSortKey', 'getSortDirection'],
207
+ List: ['create', 'from', 'range', 'add', 'remove', 'removeWhere', 'set', 'get', 'first', 'last', 'sort', 'sortBy', 'reverse', 'filter', 'find', 'findIndex', 'map', 'reduce', 'forEach', 'includes', 'indexOf', 'every', 'some', 'slice', 'take', 'skip', 'chunk', 'unique', 'uniqueBy', 'groupBy', 'flatten', 'concat', 'isEmpty', 'isNotEmpty', 'count', 'clear', 'toArray', 'toJSON', 'clone', 'sum', 'avg', 'min', 'max'],
208
+ Tree: ['create', 'setRoot', 'addChild', 'removeNode', 'getNode', 'getRoot', 'getChildren', 'getParent', 'getSiblings', 'getAncestors', 'getDescendants', 'getDepth', 'getPath', 'traverse', 'find', 'findAll', 'move', 'toArray', 'size'],
209
+ // Network
210
+ Http: ['create', 'get', 'post', 'put', 'patch', 'delete', 'withHeaders', 'withToken', 'withTimeout'],
211
+ Socket: ['create', 'connect', 'disconnect', 'send', 'sendEvent', 'on', 'off', 'once', 'isConnected', 'getState'],
212
+ Auth: ['create', 'login', 'logout', 'fetchUser', 'getUser', 'getToken', 'isAuthenticated', 'setToken', 'setUser', 'refresh', 'onAuthChange', 'offAuthChange', 'getAuthHeader'],
213
+ Stream: ['create', 'headers', 'withToken', 'onChunk', 'onComplete', 'onError', 'get', 'post', 'abort', 'getBuffer', 'getChunks', 'isStreaming', 'clear'],
214
+ // Graphics & Visualization
215
+ Svg: ['create', 'select', 'find', 'attr', 'attrs', 'getAttr', 'addClass', 'removeClass', 'text', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path', 'textElement', 'group', 'clear', 'remove', 'toString', 'toElement', 'getWidth', 'getHeight'],
216
+ Canvas: ['create', 'fromElement', 'fromSelector', 'size', 'getWidth', 'getHeight', 'style', 'save', 'restore', 'clear', 'fill', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'arc', 'path', 'text', 'measureText', 'drawImage', 'translate', 'rotate', 'scale', 'resetTransform', 'getPixel', 'setPixel', 'getImageData', 'putImageData', 'toDataURL', 'toBlob', 'getElement', 'getContext', 'appendTo'],
217
+ Graph: ['create', 'size', 'addNode', 'removeNode', 'addEdge', 'removeEdge', 'getNode', 'getNodes', 'getEdges', 'getEdgesWithPositions', 'getNeighbors', 'layout'],
218
+ Scale: ['linear', 'log', 'time', 'band', 'domain', 'range', 'getDomain', 'getRange', 'value', 'invert', 'ticks', 'clamp', 'padding', 'bandwidth'],
219
+ Axis: ['create', 'orientation', 'ticks', 'tickFormat', 'tickSize', 'getTicks', 'getOrientation', 'getTickSize', 'getRange', 'isHorizontal', 'isVertical'],
220
+ Motion: ['tween', 'spring', 'easing', 'onUpdate', 'onComplete', 'start', 'stop', 'isRunning', 'valueAt'],
221
+ // Platform APIs
222
+ Router: ['create', 'register', 'navigate', 'back', 'forward', 'getParams', 'getQuery', 'getCurrent', 'getState', 'onNavigate', 'offNavigate', 'start'],
223
+ Storage: ['local', 'session', 'set', 'get', 'remove', 'clear', 'has', 'keys', 'getAll', 'size'],
224
+ Events: ['create', 'on', 'off', 'once', 'emit', 'clear', 'listenerCount', 'eventNames'],
225
+ Clipboard: ['copy', 'paste', 'copyImage', 'copyHtml', 'isSupported', 'isWriteSupported'],
226
+ Notify: ['request', 'send', 'getPermission', 'isSupported', 'isGranted', 'isDenied'],
227
+ Geo: ['getPosition', 'watchPosition', 'stopWatching', 'stopAllWatching', 'isSupported', 'distance'],
228
+ Media: ['selectFile', 'selectFiles', 'capture', 'getMetadata', 'resize', 'toBase64', 'toArrayBuffer', 'toText', 'formatSize', 'isImage', 'isVideo', 'isAudio'],
229
+ DB: ['create', 'store', 'open', 'close', 'put', 'add', 'get', 'getAll', 'find', 'delete', 'clear', 'count', 'keys', 'update', 'batch', 'deleteDatabase', 'databases'],
230
+ Worker: ['create', 'fromFunction', 'fromCode', 'run', 'post', 'onMessage', 'onError', 'terminate', 'isRunning', 'getPendingCount'],
231
+ WorkerPool: ['create', 'fromFunction', 'run', 'map', 'terminate', 'getSize', 'getActiveCount', 'getQueueLength'],
232
+ // AI & Language
233
+ Speech: ['create', 'isSupported', 'listen', 'stopListening', 'onResult', 'onInterim', 'onEnd', 'onError', 'speak', 'stopSpeaking', 'pause', 'resume', 'getVoices', 'getVoicesByLanguage', 'isSpeaking', 'isListening'],
234
+ Chat: ['create', 'fromHistory', 'addMessage', 'addUser', 'addAssistant', 'addSystem', 'getMessage', 'getHistory', 'getMessages', 'getLastMessage', 'getLastUserMessage', 'getLastAssistantMessage', 'updateMessage', 'removeMessage', 'clear', 'clearAll', 'fork', 'truncate', 'count', 'countTokensEstimate', 'toJSON'],
235
+ Embed: ['create', 'store', 'storeMany', 'get', 'remove', 'clear', 'count', 'compare', 'nearest', 'search', 'cosineSimilarity', 'euclideanDistance', 'dotProduct', 'normalize', 'average', 'toJSON', 'fromJSON'],
236
+ Diff: ['chars', 'words', 'lines', 'apply', 'createPatch', 'distance', 'similarity', 'commonPrefix', 'commonSuffix'],
237
+ // Utilities
238
+ Time: ['now', 'create', 'parse', 'format', 'toISO', 'toDate', 'toTimestamp', 'toUnix', 'add', 'subtract', 'diff', 'isBefore', 'isAfter', 'isSame', 'isBetween', 'startOf', 'endOf', 'year', 'month', 'day', 'weekday', 'hour', 'minute', 'second', 'relative', 'clone'],
239
+ // Adapters
240
+ useStellify: ['(generic adapter for any module)'],
241
+ useForm: ['bind'],
242
+ useTable: ['(reactive table adapter)'],
243
+ };
110
244
  const tools = [
245
+ {
246
+ name: 'get_stellify_framework_api',
247
+ description: `Get the complete Stellify Framework API reference for Vue/JS development.
248
+
249
+ Returns all modules and their methods for AI-friendly frontend code generation.
250
+
251
+ Use this tool when you need to:
252
+ - Look up available methods for a Stellify module
253
+ - Verify method names before generating code
254
+ - Understand the full API surface
255
+
256
+ Example response:
257
+ {
258
+ "Form": ["create", "set", "get", "validate", "store", "update", "delete", ...],
259
+ "Http": ["create", "get", "post", "put", "delete", "withToken", ...],
260
+ ...
261
+ }`,
262
+ inputSchema: {
263
+ type: 'object',
264
+ properties: {
265
+ module: {
266
+ type: 'string',
267
+ description: 'Optional: specific module to get API for (e.g., "Form", "Http"). Omit to get all modules.',
268
+ },
269
+ },
270
+ },
271
+ },
111
272
  {
112
273
  name: 'get_project',
113
274
  description: `Get the active Stellify project for the authenticated user.
@@ -1134,25 +1295,6 @@ SECURITY: Code runs in a sandboxed environment with limited permissions.`,
1134
1295
  required: ['file', 'method'],
1135
1296
  },
1136
1297
  },
1137
- {
1138
- name: 'get_capabilities',
1139
- description: `List available system-level capabilities in the Stellify framework.
1140
-
1141
- Returns what's currently available for:
1142
- - Authentication (Sanctum, session, etc.)
1143
- - File storage (local, S3, etc.)
1144
- - Email/notifications
1145
- - Queues/jobs
1146
- - Caching
1147
- - Other installed packages and services
1148
-
1149
- Use this BEFORE attempting to build features that might require system capabilities.
1150
- If a capability you need is not listed, use request_capability to log it.`,
1151
- inputSchema: {
1152
- type: 'object',
1153
- properties: {},
1154
- },
1155
- },
1156
1298
  {
1157
1299
  name: 'request_capability',
1158
1300
  description: `Log a missing system-level capability request.
@@ -1312,7 +1454,7 @@ Examples of capabilities (packages you cannot write):
1312
1454
 
1313
1455
  **WORKFLOW:**
1314
1456
 
1315
- 1. When a user requests functionality that might need a package/library, call get_capabilities() FIRST.
1457
+ 1. When a user requests functionality that might need a package/library, check the capabilities list from get_project FIRST.
1316
1458
 
1317
1459
  2. If status is "available" → package is installed, proceed with business logic.
1318
1460
 
@@ -1359,16 +1501,42 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1359
1501
  }
1360
1502
  try {
1361
1503
  switch (name) {
1504
+ case 'get_stellify_framework_api': {
1505
+ const moduleName = args.module;
1506
+ let result;
1507
+ if (moduleName) {
1508
+ const moduleApi = STELLIFY_FRAMEWORK_API[moduleName];
1509
+ if (moduleApi) {
1510
+ result = { [moduleName]: moduleApi };
1511
+ }
1512
+ else {
1513
+ result = { error: `Module "${moduleName}" not found. Available: ${Object.keys(STELLIFY_FRAMEWORK_API).join(', ')}` };
1514
+ }
1515
+ }
1516
+ else {
1517
+ result = STELLIFY_FRAMEWORK_API;
1518
+ }
1519
+ return {
1520
+ content: [
1521
+ {
1522
+ type: 'text',
1523
+ text: JSON.stringify(result, null, 2),
1524
+ },
1525
+ ],
1526
+ };
1527
+ }
1362
1528
  case 'get_project': {
1363
1529
  const result = await stellify.getProject();
1530
+ const projectData = result.data || result;
1531
+ const projectMeta = projectData.project || {};
1364
1532
  return {
1365
1533
  content: [
1366
1534
  {
1367
1535
  type: 'text',
1368
1536
  text: JSON.stringify({
1369
1537
  success: true,
1370
- message: `Active project: "${result.data?.name || result.name}" (${result.data?.uuid || result.uuid})`,
1371
- project: result.data || result,
1538
+ message: `Active project: "${projectMeta.name || 'unknown'}" (${projectMeta.uuid || 'unknown'})`,
1539
+ project: projectData,
1372
1540
  }, null, 2),
1373
1541
  },
1374
1542
  ],
@@ -1830,21 +1998,6 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1830
1998
  ],
1831
1999
  };
1832
2000
  }
1833
- case 'get_capabilities': {
1834
- const result = await stellify.getCapabilities();
1835
- return {
1836
- content: [
1837
- {
1838
- type: 'text',
1839
- text: JSON.stringify({
1840
- success: true,
1841
- message: 'Available framework capabilities',
1842
- capabilities: result.data || result,
1843
- }, null, 2),
1844
- },
1845
- ],
1846
- };
1847
- }
1848
2001
  case 'request_capability': {
1849
2002
  const result = await stellify.requestCapability(args);
1850
2003
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stellisoft/stellify-mcp",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "mcpName": "io.github.MattStellisoft/stellify-mcp",
5
5
  "description": "MCP server for Stellify - AI-native code generation platform",
6
6
  "main": "dist/index.js",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/Stellify-Software-Ltd/stellify-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.1.2",
9
+ "version": "0.1.17",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@stellisoft/stellify-mcp",
14
- "version": "0.1.2",
14
+ "version": "0.1.17",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },