sunpeak 0.10.7 → 0.11.1

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 (103) hide show
  1. package/README.md +44 -19
  2. package/bin/commands/dev.mjs +173 -12
  3. package/bin/sunpeak.js +3 -11
  4. package/dist/chatgpt/index.cjs +1 -1
  5. package/dist/chatgpt/index.js +1 -1
  6. package/dist/index.cjs +1 -1
  7. package/dist/index.js +2 -2
  8. package/dist/mcp/entry.cjs +1 -1
  9. package/dist/mcp/entry.js +1 -1
  10. package/dist/mcp/favicon.d.ts +2 -0
  11. package/dist/mcp/index.cjs +3 -1
  12. package/dist/mcp/index.cjs.map +1 -1
  13. package/dist/mcp/index.d.ts +1 -0
  14. package/dist/mcp/index.js +3 -1
  15. package/dist/{server-BLKltt88.js → server-BI9Y531R.js} +31 -3
  16. package/dist/{server-BLKltt88.js.map → server-BI9Y531R.js.map} +1 -1
  17. package/dist/{server-D_oRdZjX.cjs → server-CcLDAGBE.cjs} +31 -3
  18. package/dist/{server-D_oRdZjX.cjs.map → server-CcLDAGBE.cjs.map} +1 -1
  19. package/dist/{simulator-url-B6DZi3vV.cjs → simulator-url-CYMOGoB1.cjs} +5 -5
  20. package/dist/{simulator-url-B6DZi3vV.cjs.map → simulator-url-CYMOGoB1.cjs.map} +1 -1
  21. package/dist/{simulator-url-izFV6mji.js → simulator-url-DG79-dU3.js} +4 -4
  22. package/dist/{simulator-url-izFV6mji.js.map → simulator-url-DG79-dU3.js.map} +1 -1
  23. package/package.json +1 -1
  24. package/template/README.md +6 -7
  25. package/template/_gitignore +4 -0
  26. package/template/dist/albums/albums.json +1 -1
  27. package/template/dist/carousel/carousel.json +1 -1
  28. package/template/dist/map/map.json +1 -1
  29. package/template/dist/review/review.json +1 -1
  30. package/template/index.html +0 -1
  31. package/template/node_modules/.vite/deps/@openai_apps-sdk-ui_components_Button.js +7 -7
  32. package/template/node_modules/.vite/deps/@openai_apps-sdk-ui_components_SegmentedControl.js +1 -1
  33. package/template/node_modules/.vite/deps/@openai_apps-sdk-ui_components_Select.js +7 -7
  34. package/template/node_modules/.vite/deps/_metadata.json +33 -33
  35. package/template/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  36. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Avatar.js +96 -0
  37. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Avatar.js.map +7 -0
  38. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Button.js +625 -0
  39. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Button.js.map +7 -0
  40. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Checkbox.js +33 -0
  41. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Checkbox.js.map +7 -0
  42. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Icon.js +1498 -0
  43. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Icon.js.map +7 -0
  44. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Input.js +13 -0
  45. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Input.js.map +7 -0
  46. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_SegmentedControl.js +103 -0
  47. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_SegmentedControl.js.map +7 -0
  48. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Select.js +3680 -0
  49. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Select.js.map +7 -0
  50. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Textarea.js +95 -0
  51. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_components_Textarea.js.map +7 -0
  52. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_theme.js +45 -0
  53. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/@openai_apps-sdk-ui_theme.js.map +7 -0
  54. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-2UDYPUBJ.js +15201 -0
  55. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-2UDYPUBJ.js.map +7 -0
  56. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-6QVG4F2X.js +93 -0
  57. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-6QVG4F2X.js.map +7 -0
  58. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-BUOVMFCD.js +1004 -0
  59. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-BUOVMFCD.js.map +7 -0
  60. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-CNYJBM5F.js +21 -0
  61. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-CNYJBM5F.js.map +7 -0
  62. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-EGRHWZRV.js +1 -0
  63. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-EGRHWZRV.js.map +7 -0
  64. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-ILHRZGIS.js +46 -0
  65. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-ILHRZGIS.js.map +7 -0
  66. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-JAGHY6H6.js +231 -0
  67. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-JAGHY6H6.js.map +7 -0
  68. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-JGVISENQ.js +292 -0
  69. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-JGVISENQ.js.map +7 -0
  70. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-P5LK4A7U.js +112 -0
  71. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-P5LK4A7U.js.map +7 -0
  72. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-QPJAV452.js +13 -0
  73. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-QPJAV452.js.map +7 -0
  74. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-RYYR2YMB.js +111 -0
  75. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-RYYR2YMB.js.map +7 -0
  76. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-UM3ZGDFR.js +4480 -0
  77. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-UM3ZGDFR.js.map +7 -0
  78. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-XZTIOEPG.js +280 -0
  79. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/chunk-XZTIOEPG.js.map +7 -0
  80. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/clsx.js +10 -0
  81. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/clsx.js.map +7 -0
  82. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/embla-carousel-react.js +1712 -0
  83. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/embla-carousel-react.js.map +7 -0
  84. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/embla-carousel-wheel-gestures.js +589 -0
  85. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/embla-carousel-wheel-gestures.js.map +7 -0
  86. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/mapbox-gl.js +32835 -0
  87. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/mapbox-gl.js.map +7 -0
  88. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/package.json +3 -0
  89. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/react-dom.js +7 -0
  90. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/react-dom.js.map +7 -0
  91. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/react-dom_client.js +20217 -0
  92. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/react-dom_client.js.map +7 -0
  93. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/react.js +6 -0
  94. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/react.js.map +7 -0
  95. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/react_jsx-dev-runtime.js +278 -0
  96. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/react_jsx-dev-runtime.js.map +7 -0
  97. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/react_jsx-runtime.js +7 -0
  98. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/react_jsx-runtime.js.map +7 -0
  99. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/tailwind-merge.js +3095 -0
  100. package/template/node_modules/.vite-mcp/deps_temp_c8c8077a/tailwind-merge.js.map +7 -0
  101. package/template/package.json +0 -1
  102. package/bin/commands/mcp.mjs +0 -244
  103. package/template/public/favicon.ico +0 -0
@@ -1,244 +0,0 @@
1
- #!/usr/bin/env node
2
- import { existsSync, readFileSync, readdirSync } from 'fs';
3
- import { join, dirname, resolve, basename } from 'path';
4
- import { createRequire } from 'module';
5
- import { pathToFileURL } from 'url';
6
-
7
- /**
8
- * Import a module from the project's node_modules using ESM resolution
9
- */
10
- async function importFromProject(require, moduleName) {
11
- const resolvedPath = require.resolve(moduleName);
12
-
13
- // Walk up to find package.json
14
- let pkgDir = dirname(resolvedPath);
15
- let pkg;
16
- while (pkgDir !== dirname(pkgDir)) {
17
- try {
18
- const pkgJsonPath = join(pkgDir, 'package.json');
19
- pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
20
- if (pkg.name === moduleName || moduleName.startsWith(pkg.name + '/')) {
21
- break;
22
- }
23
- } catch {
24
- // No package.json at this level, keep looking
25
- }
26
- pkgDir = dirname(pkgDir);
27
- }
28
-
29
- if (!pkg) {
30
- return import(resolvedPath);
31
- }
32
-
33
- // Determine ESM entry
34
- let entry = pkg.main || 'index.js';
35
- if (pkg.exports) {
36
- const exp = pkg.exports['.'] || pkg.exports;
37
- if (typeof exp === 'string') {
38
- entry = exp;
39
- } else if (exp.import) {
40
- entry = typeof exp.import === 'string' ? exp.import : exp.import.default;
41
- } else if (exp.default) {
42
- entry = exp.default;
43
- }
44
- } else if (pkg.module) {
45
- entry = pkg.module;
46
- }
47
-
48
- const entryPath = join(pkgDir, entry);
49
- return import(pathToFileURL(entryPath).href);
50
- }
51
-
52
- /**
53
- * Discover simulations from src/resources directories
54
- */
55
- function discoverSimulations(projectRoot) {
56
- const resourcesDir = join(projectRoot, 'src/resources');
57
- const resourceDirs = readdirSync(resourcesDir, { withFileTypes: true }).filter((entry) =>
58
- entry.isDirectory()
59
- );
60
-
61
- const simulations = [];
62
-
63
- for (const entry of resourceDirs) {
64
- const resourceKey = entry.name;
65
- const resourceDir = join(resourcesDir, resourceKey);
66
- const resourcePath = join(resourceDir, `${resourceKey}-resource.json`);
67
-
68
- if (!existsSync(resourcePath)) {
69
- continue;
70
- }
71
-
72
- const resource = JSON.parse(readFileSync(resourcePath, 'utf-8'));
73
-
74
- const dirFiles = readdirSync(resourceDir);
75
- for (const file of dirFiles) {
76
- if (file.endsWith('-simulation.json')) {
77
- const simulationKey = file.replace(/-simulation\.json$/, '');
78
- const simulationPath = join(resourceDir, file);
79
- const simulation = JSON.parse(readFileSync(simulationPath, 'utf-8'));
80
-
81
- simulations.push({
82
- ...simulation,
83
- name: simulationKey,
84
- distPath: join(projectRoot, `dist/${resourceKey}/${resourceKey}.js`),
85
- srcPath: `/src/resources/${resourceKey}/${resourceKey}-resource.tsx`,
86
- resource,
87
- });
88
- }
89
- }
90
- }
91
-
92
- return simulations;
93
- }
94
-
95
- /**
96
- * Start the MCP server with Vite HMR
97
- *
98
- * Architecture:
99
- * 1. Vite dev server runs in middleware mode on the same port
100
- * 2. MCP resources return HTML that loads from Vite
101
- * 3. Vite handles all HMR natively - no custom WebSocket needed
102
- */
103
- export async function mcp(projectRoot = process.cwd(), args = []) {
104
- // Check for package.json
105
- const pkgJsonPath = join(projectRoot, 'package.json');
106
- if (!existsSync(pkgJsonPath)) {
107
- console.error('Error: No package.json found in current directory');
108
- console.error('Make sure you are in a Sunpeak project directory');
109
- process.exit(1);
110
- }
111
-
112
- // Check for --no-vite flag (production mode)
113
- const noVite = args.includes('--no-vite');
114
-
115
- const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
116
- const require = createRequire(join(projectRoot, 'package.json'));
117
-
118
- // Discover simulations
119
- const simulations = discoverSimulations(projectRoot);
120
- if (simulations.length === 0) {
121
- console.error('Error: No simulations found in src/resources/');
122
- process.exit(1);
123
- }
124
-
125
- console.log(`Found ${simulations.length} simulation(s)`);
126
-
127
- let viteServer = null;
128
-
129
- if (!noVite) {
130
- console.log('Starting Vite dev server for HMR...\n');
131
-
132
- // Import vite and plugins from the project's node_modules
133
- const vite = await importFromProject(require, 'vite');
134
- const reactPlugin = await importFromProject(require, '@vitejs/plugin-react');
135
- const react = reactPlugin.default;
136
- const tailwindPlugin = await importFromProject(require, '@tailwindcss/vite');
137
- const tailwindcss = tailwindPlugin.default;
138
-
139
- // Check if we're in the sunpeak workspace (directory is named "template")
140
- const isTemplate = basename(projectRoot) === 'template';
141
- const parentSrc = resolve(projectRoot, '../src');
142
-
143
- // Virtual entry module plugin for consistent React resolution
144
- // This ensures React/ReactDOM imports in the entry module resolve to the same
145
- // pre-bundled versions as the component imports
146
- const sunpeakEntryPlugin = () => ({
147
- name: 'sunpeak-entry',
148
- resolveId(id) {
149
- if (id.startsWith('virtual:sunpeak-entry')) {
150
- return id;
151
- }
152
- },
153
- load(id) {
154
- if (id.startsWith('virtual:sunpeak-entry')) {
155
- const url = new URL(id.replace('virtual:sunpeak-entry', 'http://x'));
156
- const srcPath = url.searchParams.get('src');
157
- const componentName = url.searchParams.get('component');
158
-
159
- if (!srcPath || !componentName) {
160
- return 'console.error("Missing src or component param");';
161
- }
162
-
163
- return `
164
- import { createElement } from 'react';
165
- import { createRoot } from 'react-dom/client';
166
- import * as ResourceModule from '${srcPath}';
167
-
168
- const Component = ResourceModule.default || ResourceModule['${componentName}'];
169
- if (!Component) {
170
- document.getElementById('root').innerHTML = '<pre style="color:red;padding:16px">Component not found: ${componentName}\\nExports: ' + Object.keys(ResourceModule).join(', ') + '</pre>';
171
- } else {
172
- createRoot(document.getElementById('root')).render(createElement(Component));
173
- }
174
- `;
175
- }
176
- },
177
- });
178
-
179
- // Create Vite dev server in middleware mode (matching skybridge's approach)
180
- viteServer = await vite.createServer({
181
- root: projectRoot,
182
- plugins: [react(), tailwindcss(), sunpeakEntryPlugin()],
183
- resolve: {
184
- alias: {
185
- // In workspace dev mode, use local sunpeak source
186
- ...(isTemplate && {
187
- sunpeak: parentSrc,
188
- }),
189
- },
190
- },
191
- server: {
192
- middlewareMode: true,
193
- // Allow all hosts for tunnel services (ngrok, cloudflared, etc.)
194
- allowedHosts: true,
195
- // Don't override HMR - let Vite handle it (like skybridge)
196
- },
197
- optimizeDeps: {
198
- include: ['react', 'react-dom/client'],
199
- },
200
- appType: 'custom',
201
- });
202
- } else {
203
- console.log('Starting MCP server (production mode, no HMR)...\n');
204
- }
205
-
206
- // Import runMCPServer from sunpeak/mcp
207
- // Use direct import with file URL for workspace compatibility
208
- const sunpeakMcpPath = join(require.resolve('sunpeak').replace(/dist\/index\.(c)?js$/, ''), 'dist/mcp/index.js');
209
- const sunpeakMcp = await import(pathToFileURL(sunpeakMcpPath).href);
210
- const { runMCPServer } = sunpeakMcp;
211
-
212
- // Start MCP server with Vite integration
213
- runMCPServer({
214
- name: pkg.name || 'Sunpeak',
215
- version: pkg.version || '0.1.0',
216
- simulations,
217
- port: 6766,
218
- viteServer,
219
- });
220
-
221
- // Handle signals
222
- process.on('SIGINT', async () => {
223
- if (viteServer) {
224
- await viteServer.close();
225
- }
226
- process.exit(0);
227
- });
228
-
229
- process.on('SIGTERM', async () => {
230
- if (viteServer) {
231
- await viteServer.close();
232
- }
233
- process.exit(0);
234
- });
235
- }
236
-
237
- // Allow running directly
238
- if (import.meta.url === `file://${process.argv[1]}`) {
239
- const args = process.argv.slice(2);
240
- mcp(process.cwd(), args).catch(error => {
241
- console.error('Error:', error.message);
242
- process.exit(1);
243
- });
244
- }
Binary file