@tpitre/story-ui 2.6.1 → 2.7.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 (295) hide show
  1. package/README.md +36 -37
  2. package/dist/cli/deploy.d.ts +4 -3
  3. package/dist/cli/deploy.d.ts.map +1 -1
  4. package/dist/cli/deploy.js +542 -46
  5. package/dist/cli/index.js +17 -14
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/cli/setup.d.ts.map +1 -1
  8. package/dist/cli/setup.js +4 -110
  9. package/dist/cli/setup.js.map +1 -0
  10. package/dist/cloudflare-edge/src/mcp-session.js +462 -0
  11. package/dist/cloudflare-edge/src/types.js +4 -0
  12. package/dist/cloudflare-edge/src/worker.js +106 -0
  13. package/dist/cloudflare-pages/vite.config.js +14 -0
  14. package/dist/index.d.ts +13 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +12 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/mcp-server/index.js.map +1 -0
  19. package/dist/mcp-server/mcp-stdio-server.js.map +1 -0
  20. package/dist/mcp-server/routes/claude.js.map +1 -0
  21. package/dist/mcp-server/routes/components.js.map +1 -0
  22. package/dist/mcp-server/routes/generateStory.js.map +1 -0
  23. package/dist/mcp-server/routes/hybridStories.js.map +1 -0
  24. package/dist/mcp-server/routes/memoryStories.js.map +1 -0
  25. package/dist/mcp-server/routes/storySync.js.map +1 -0
  26. package/dist/mcp-server/routes/updateStory.js +246 -0
  27. package/dist/mcp-server/sessionManager.js.map +1 -0
  28. package/dist/playground/components/AIAssistant/AIAssistant.d.ts +6 -0
  29. package/dist/playground/components/AIAssistant/AIAssistant.d.ts.map +1 -0
  30. package/dist/playground/components/AIAssistant/AIAssistant.js +109 -0
  31. package/dist/playground/components/AIAssistant/AIAssistant.js.map +1 -0
  32. package/dist/playground/components/AIAssistant/AIAssistant.module.css +166 -0
  33. package/dist/playground/components/Canvas/Canvas.d.ts +9 -0
  34. package/dist/playground/components/Canvas/Canvas.d.ts.map +1 -0
  35. package/dist/playground/components/Canvas/Canvas.js +58 -0
  36. package/dist/playground/components/Canvas/Canvas.js.map +1 -0
  37. package/dist/playground/components/Canvas/Canvas.module.css +189 -0
  38. package/dist/playground/components/Canvas/CanvasWithDnd.d.ts +9 -0
  39. package/dist/playground/components/Canvas/CanvasWithDnd.d.ts.map +1 -0
  40. package/dist/playground/components/Canvas/CanvasWithDnd.js +158 -0
  41. package/dist/playground/components/Canvas/CanvasWithDnd.js.map +1 -0
  42. package/dist/playground/components/Canvas/ComponentRenderer.d.ts +15 -0
  43. package/dist/playground/components/Canvas/ComponentRenderer.d.ts.map +1 -0
  44. package/dist/playground/components/Canvas/ComponentRenderer.js +177 -0
  45. package/dist/playground/components/Canvas/ComponentRenderer.js.map +1 -0
  46. package/dist/playground/components/Canvas/DraggableComponent.d.ts +15 -0
  47. package/dist/playground/components/Canvas/DraggableComponent.d.ts.map +1 -0
  48. package/dist/playground/components/Canvas/DraggableComponent.js +49 -0
  49. package/dist/playground/components/Canvas/DraggableComponent.js.map +1 -0
  50. package/dist/playground/components/Canvas/index.d.ts +9 -0
  51. package/dist/playground/components/Canvas/index.d.ts.map +1 -0
  52. package/dist/playground/components/Canvas/index.js +5 -0
  53. package/dist/playground/components/Canvas/index.js.map +1 -0
  54. package/dist/playground/components/CodeView/CodeView.d.ts +12 -0
  55. package/dist/playground/components/CodeView/CodeView.d.ts.map +1 -0
  56. package/dist/playground/components/CodeView/CodeView.js +77 -0
  57. package/dist/playground/components/CodeView/CodeView.js.map +1 -0
  58. package/dist/playground/components/CodeView/CodeView.module.css +178 -0
  59. package/dist/playground/components/ComponentPalette/ComponentPalette.d.ts +17 -0
  60. package/dist/playground/components/ComponentPalette/ComponentPalette.d.ts.map +1 -0
  61. package/dist/playground/components/ComponentPalette/ComponentPalette.js +138 -0
  62. package/dist/playground/components/ComponentPalette/ComponentPalette.js.map +1 -0
  63. package/dist/playground/components/ComponentPalette/ComponentPalette.module.css +217 -0
  64. package/dist/playground/components/ComponentPalette/index.d.ts +3 -0
  65. package/dist/playground/components/ComponentPalette/index.d.ts.map +1 -0
  66. package/dist/playground/components/ComponentPalette/index.js +2 -0
  67. package/dist/playground/components/ComponentPalette/index.js.map +1 -0
  68. package/dist/playground/components/DropZone/DropZone.d.ts +17 -0
  69. package/dist/playground/components/DropZone/DropZone.d.ts.map +1 -0
  70. package/dist/playground/components/DropZone/DropZone.js +73 -0
  71. package/dist/playground/components/DropZone/DropZone.js.map +1 -0
  72. package/dist/playground/components/DropZone/DropZone.module.css +86 -0
  73. package/dist/playground/components/ExportDialog/ExportDialog.d.ts +10 -0
  74. package/dist/playground/components/ExportDialog/ExportDialog.d.ts.map +1 -0
  75. package/dist/playground/components/ExportDialog/ExportDialog.js +57 -0
  76. package/dist/playground/components/ExportDialog/ExportDialog.js.map +1 -0
  77. package/dist/playground/components/ExportDialog/ExportDialog.module.css +328 -0
  78. package/dist/playground/components/LayoutHelpers/LayoutHelpers.d.ts +134 -0
  79. package/dist/playground/components/LayoutHelpers/LayoutHelpers.d.ts.map +1 -0
  80. package/dist/playground/components/LayoutHelpers/LayoutHelpers.js +254 -0
  81. package/dist/playground/components/LayoutHelpers/LayoutHelpers.js.map +1 -0
  82. package/dist/playground/components/LayoutHelpers/index.d.ts +3 -0
  83. package/dist/playground/components/LayoutHelpers/index.d.ts.map +1 -0
  84. package/dist/playground/components/LayoutHelpers/index.js +2 -0
  85. package/dist/playground/components/LayoutHelpers/index.js.map +1 -0
  86. package/dist/playground/components/Playground/Playground.d.ts +10 -0
  87. package/dist/playground/components/Playground/Playground.d.ts.map +1 -0
  88. package/dist/playground/components/Playground/Playground.js +128 -0
  89. package/dist/playground/components/Playground/Playground.js.map +1 -0
  90. package/dist/playground/components/Playground/Playground.module.css +308 -0
  91. package/dist/playground/components/PropertiesPanel/PropertiesPanel.d.ts +10 -0
  92. package/dist/playground/components/PropertiesPanel/PropertiesPanel.d.ts.map +1 -0
  93. package/dist/playground/components/PropertiesPanel/PropertiesPanel.js +150 -0
  94. package/dist/playground/components/PropertiesPanel/PropertiesPanel.js.map +1 -0
  95. package/dist/playground/components/PropertiesPanel/PropertiesPanel.module.css +155 -0
  96. package/dist/playground/components/PropertiesPanel/index.d.ts +3 -0
  97. package/dist/playground/components/PropertiesPanel/index.d.ts.map +1 -0
  98. package/dist/playground/components/PropertiesPanel/index.js +2 -0
  99. package/dist/playground/components/PropertiesPanel/index.js.map +1 -0
  100. package/dist/playground/components/PropertyEditors/BooleanEditor.d.ts +12 -0
  101. package/dist/playground/components/PropertyEditors/BooleanEditor.d.ts.map +1 -0
  102. package/dist/playground/components/PropertyEditors/BooleanEditor.js +14 -0
  103. package/dist/playground/components/PropertyEditors/BooleanEditor.js.map +1 -0
  104. package/dist/playground/components/PropertyEditors/ColorEditor.d.ts +12 -0
  105. package/dist/playground/components/PropertyEditors/ColorEditor.d.ts.map +1 -0
  106. package/dist/playground/components/PropertyEditors/ColorEditor.js +62 -0
  107. package/dist/playground/components/PropertyEditors/ColorEditor.js.map +1 -0
  108. package/dist/playground/components/PropertyEditors/IconEditor.d.ts +12 -0
  109. package/dist/playground/components/PropertyEditors/IconEditor.d.ts.map +1 -0
  110. package/dist/playground/components/PropertyEditors/IconEditor.js +123 -0
  111. package/dist/playground/components/PropertyEditors/IconEditor.js.map +1 -0
  112. package/dist/playground/components/PropertyEditors/NumberEditor.d.ts +15 -0
  113. package/dist/playground/components/PropertyEditors/NumberEditor.d.ts.map +1 -0
  114. package/dist/playground/components/PropertyEditors/NumberEditor.js +46 -0
  115. package/dist/playground/components/PropertyEditors/NumberEditor.js.map +1 -0
  116. package/dist/playground/components/PropertyEditors/PropertyEditors.module.css +432 -0
  117. package/dist/playground/components/PropertyEditors/SelectEditor.d.ts +19 -0
  118. package/dist/playground/components/PropertyEditors/SelectEditor.d.ts.map +1 -0
  119. package/dist/playground/components/PropertyEditors/SelectEditor.js +17 -0
  120. package/dist/playground/components/PropertyEditors/SelectEditor.js.map +1 -0
  121. package/dist/playground/components/PropertyEditors/SpacingEditor.d.ts +19 -0
  122. package/dist/playground/components/PropertyEditors/SpacingEditor.d.ts.map +1 -0
  123. package/dist/playground/components/PropertyEditors/SpacingEditor.js +162 -0
  124. package/dist/playground/components/PropertyEditors/SpacingEditor.js.map +1 -0
  125. package/dist/playground/components/PropertyEditors/SpacingEditor.module.css +214 -0
  126. package/dist/playground/components/PropertyEditors/TextEditor.d.ts +14 -0
  127. package/dist/playground/components/PropertyEditors/TextEditor.d.ts.map +1 -0
  128. package/dist/playground/components/PropertyEditors/TextEditor.js +38 -0
  129. package/dist/playground/components/PropertyEditors/TextEditor.js.map +1 -0
  130. package/dist/playground/components/PropertyEditors/TokenEditor.d.ts +23 -0
  131. package/dist/playground/components/PropertyEditors/TokenEditor.d.ts.map +1 -0
  132. package/dist/playground/components/PropertyEditors/TokenEditor.js +50 -0
  133. package/dist/playground/components/PropertyEditors/TokenEditor.js.map +1 -0
  134. package/dist/playground/components/PropertyEditors/index.d.ts +20 -0
  135. package/dist/playground/components/PropertyEditors/index.d.ts.map +1 -0
  136. package/dist/playground/components/PropertyEditors/index.js +12 -0
  137. package/dist/playground/components/PropertyEditors/index.js.map +1 -0
  138. package/dist/playground/components/TreeView/TreeView.d.ts +10 -0
  139. package/dist/playground/components/TreeView/TreeView.d.ts.map +1 -0
  140. package/dist/playground/components/TreeView/TreeView.js +146 -0
  141. package/dist/playground/components/TreeView/TreeView.js.map +1 -0
  142. package/dist/playground/components/TreeView/TreeView.module.css +214 -0
  143. package/dist/playground/components/TreeView/index.d.ts +3 -0
  144. package/dist/playground/components/TreeView/index.d.ts.map +1 -0
  145. package/dist/playground/components/TreeView/index.js +2 -0
  146. package/dist/playground/components/TreeView/index.js.map +1 -0
  147. package/dist/playground/config/propertyDefinitions.d.ts +73 -0
  148. package/dist/playground/config/propertyDefinitions.d.ts.map +1 -0
  149. package/dist/playground/config/propertyDefinitions.js +809 -0
  150. package/dist/playground/config/propertyDefinitions.js.map +1 -0
  151. package/dist/playground/hooks/useKeyboardShortcuts.d.ts +38 -0
  152. package/dist/playground/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  153. package/dist/playground/hooks/useKeyboardShortcuts.js +191 -0
  154. package/dist/playground/hooks/useKeyboardShortcuts.js.map +1 -0
  155. package/dist/playground/index.d.ts +21 -0
  156. package/dist/playground/index.d.ts.map +1 -0
  157. package/dist/playground/index.js +23 -0
  158. package/dist/playground/index.js.map +1 -0
  159. package/dist/playground/services/CodeGenerator.d.ts +73 -0
  160. package/dist/playground/services/CodeGenerator.d.ts.map +1 -0
  161. package/dist/playground/services/CodeGenerator.js +359 -0
  162. package/dist/playground/services/CodeGenerator.js.map +1 -0
  163. package/dist/playground/services/DragDropManager.d.ts +95 -0
  164. package/dist/playground/services/DragDropManager.d.ts.map +1 -0
  165. package/dist/playground/services/DragDropManager.js +408 -0
  166. package/dist/playground/services/DragDropManager.js.map +1 -0
  167. package/dist/playground/services/StoryParser.d.ts +73 -0
  168. package/dist/playground/services/StoryParser.d.ts.map +1 -0
  169. package/dist/playground/services/StoryParser.js +419 -0
  170. package/dist/playground/services/StoryParser.js.map +1 -0
  171. package/dist/playground/store/playgroundStore.d.ts +86 -0
  172. package/dist/playground/store/playgroundStore.d.ts.map +1 -0
  173. package/dist/playground/store/playgroundStore.js +337 -0
  174. package/dist/playground/store/playgroundStore.js.map +1 -0
  175. package/dist/playground/stories/PlaygroundDragDrop.stories.d.ts +13 -0
  176. package/dist/playground/stories/PlaygroundDragDrop.stories.d.ts.map +1 -0
  177. package/dist/playground/stories/PlaygroundDragDrop.stories.js +227 -0
  178. package/dist/playground/stories/PlaygroundDragDrop.stories.js.map +1 -0
  179. package/dist/playground/stories/PlaygroundPhase4.stories.d.ts +13 -0
  180. package/dist/playground/stories/PlaygroundPhase4.stories.d.ts.map +1 -0
  181. package/dist/playground/stories/PlaygroundPhase4.stories.js +334 -0
  182. package/dist/playground/stories/PlaygroundPhase4.stories.js.map +1 -0
  183. package/dist/playground/stories/PlaygroundPhase5.stories.d.ts +14 -0
  184. package/dist/playground/stories/PlaygroundPhase5.stories.d.ts.map +1 -0
  185. package/dist/playground/stories/PlaygroundPhase5.stories.js +512 -0
  186. package/dist/playground/stories/PlaygroundPhase5.stories.js.map +1 -0
  187. package/dist/playground/stories/PlaygroundProperties.stories.d.ts +13 -0
  188. package/dist/playground/stories/PlaygroundProperties.stories.d.ts.map +1 -0
  189. package/dist/playground/stories/PlaygroundProperties.stories.js +342 -0
  190. package/dist/playground/stories/PlaygroundProperties.stories.js.map +1 -0
  191. package/dist/playground/types/index.d.ts +251 -0
  192. package/dist/playground/types/index.d.ts.map +1 -0
  193. package/dist/playground/types/index.js +5 -0
  194. package/dist/playground/types/index.js.map +1 -0
  195. package/dist/scripts/verify-framework-adapters.js +105 -0
  196. package/dist/story-generator/componentBlacklist.js.map +1 -0
  197. package/dist/story-generator/componentDiscovery.js.map +1 -0
  198. package/dist/story-generator/configLoader.js.map +1 -0
  199. package/dist/story-generator/considerationsLoader.js.map +1 -0
  200. package/dist/story-generator/documentation-sources.js.map +1 -0
  201. package/dist/story-generator/documentationLoader.js.map +1 -0
  202. package/dist/story-generator/dynamicPackageDiscovery.js.map +1 -0
  203. package/dist/story-generator/enhancedComponentDiscovery.d.ts.map +1 -1
  204. package/dist/story-generator/enhancedComponentDiscovery.js +4 -6
  205. package/dist/story-generator/enhancedComponentDiscovery.js.map +1 -0
  206. package/dist/story-generator/generateStory.js.map +1 -0
  207. package/dist/story-generator/gitignoreManager.js.map +1 -0
  208. package/dist/story-generator/inMemoryStoryService.js.map +1 -0
  209. package/dist/story-generator/llm-providers/settings-manager.js +4 -4
  210. package/dist/story-generator/logger.js.map +1 -0
  211. package/dist/story-generator/postProcessStory.js.map +1 -0
  212. package/dist/story-generator/productionGitignoreManager.d.ts.map +1 -1
  213. package/dist/story-generator/productionGitignoreManager.js +6 -0
  214. package/dist/story-generator/productionGitignoreManager.js.map +1 -0
  215. package/dist/story-generator/promptGenerator.js.map +1 -0
  216. package/dist/story-generator/providerPresets.d.ts +54 -0
  217. package/dist/story-generator/providerPresets.d.ts.map +1 -0
  218. package/dist/story-generator/providerPresets.js +214 -0
  219. package/dist/story-generator/storyHistory.js.map +1 -0
  220. package/dist/story-generator/storySync.js.map +1 -0
  221. package/dist/story-generator/storyTracker.js.map +1 -0
  222. package/dist/story-generator/storyValidator.js.map +1 -0
  223. package/dist/story-generator/test_validation.d.ts +2 -0
  224. package/dist/story-generator/test_validation.d.ts.map +1 -0
  225. package/dist/story-generator/test_validation.js +51 -0
  226. package/dist/story-generator/universalDesignSystemAdapter.js.map +1 -0
  227. package/dist/story-generator/urlRedirectService.js.map +1 -0
  228. package/dist/story-generator/validateStory.js.map +1 -0
  229. package/dist/story-ui.config.js.map +1 -0
  230. package/dist/story-ui.config.loader.d.ts +36 -0
  231. package/dist/story-ui.config.loader.d.ts.map +1 -0
  232. package/dist/story-ui.config.loader.js +205 -0
  233. package/dist/story-ui.config.loader.js.map +1 -0
  234. package/dist/temp/package/templates/StoryUI/StoryUIPanel.js +807 -0
  235. package/dist/temp/package/templates/StoryUI/StoryUIPanel.stories.js +37 -0
  236. package/dist/temp/package/templates/StoryUI/index.js +2 -0
  237. package/dist/templates/StoryUI/StoryUIPanel.js.map +1 -0
  238. package/dist/templates/StoryUI/StoryUIPanel.stories.js.map +1 -0
  239. package/dist/templates/StoryUI/index.js.map +1 -0
  240. package/dist/templates/StoryUI/manager.d.ts +14 -0
  241. package/dist/templates/StoryUI/manager.d.ts.map +1 -0
  242. package/dist/templates/production-app/src/App.d.ts +10 -0
  243. package/dist/templates/production-app/src/App.d.ts.map +1 -0
  244. package/dist/templates/production-app/src/App.js +653 -0
  245. package/dist/templates/production-app/src/LivePreviewRenderer.d.ts +24 -0
  246. package/dist/templates/production-app/src/LivePreviewRenderer.d.ts.map +1 -0
  247. package/dist/templates/production-app/src/LivePreviewRenderer.js +199 -0
  248. package/dist/templates/production-app/src/componentRegistry.d.ts +20 -0
  249. package/dist/templates/production-app/src/componentRegistry.d.ts.map +1 -0
  250. package/dist/templates/production-app/src/componentRegistry.js +316 -0
  251. package/dist/templates/production-app/src/main.d.ts +9 -0
  252. package/dist/templates/production-app/src/main.d.ts.map +1 -0
  253. package/dist/templates/production-app/src/main.js +18 -0
  254. package/dist/templates/production-app/vite.config.d.ts +3 -0
  255. package/dist/templates/production-app/vite.config.d.ts.map +1 -0
  256. package/dist/templates/production-app/vite.config.js +71 -0
  257. package/dist/test-storybooks/angular-material-storybook/src/main.js +66 -0
  258. package/dist/test-storybooks/chakra-storybook/vite.config.js +6 -0
  259. package/dist/test-storybooks/mantine-storybook/vite.config.js +93 -0
  260. package/dist/test-storybooks/web-components-shoelace/vite.config.js +9 -0
  261. package/dist/tsconfig.tsbuildinfo +1 -0
  262. package/dist/visual-builder/components/Canvas/Canvas.js +70 -0
  263. package/dist/visual-builder/components/Canvas/ComponentRenderer.js +545 -0
  264. package/dist/visual-builder/components/CodeExporter/CodeExporter.js +25 -0
  265. package/dist/visual-builder/components/CodeExporter/codeGenerator.js +99 -0
  266. package/dist/visual-builder/components/ComponentPalette/ComponentPalette.js +8 -0
  267. package/dist/visual-builder/components/ComponentPalette/ComponentPaletteItem.js +51 -0
  268. package/dist/visual-builder/components/EmbeddedVisualBuilder.js +107 -0
  269. package/dist/visual-builder/components/PropertyEditor/PropertyEditor.js +16 -0
  270. package/dist/visual-builder/components/PropertyEditor/PropertyForm.js +88 -0
  271. package/dist/visual-builder/components/PropertyEditor/SpacingControl.js +145 -0
  272. package/dist/visual-builder/components/PropertyEditor/SpacingEditor.js +32 -0
  273. package/dist/visual-builder/components/StoryManager/SaveOnlyManager.js +94 -0
  274. package/dist/visual-builder/components/StoryManager/StoryManager.js +68 -0
  275. package/dist/visual-builder/components/StoryManager/index.js +1 -0
  276. package/dist/visual-builder/components/VisualBuilder.js +256 -0
  277. package/dist/visual-builder/config/componentRegistry.js +1758 -0
  278. package/dist/visual-builder/decorators/VisualBuilderDecorator.js +184 -0
  279. package/dist/visual-builder/example-integration.js +59 -0
  280. package/dist/visual-builder/example.js +23 -0
  281. package/dist/visual-builder/hooks/useDragAndDrop.js +137 -0
  282. package/dist/visual-builder/hooks/useSelection.js +27 -0
  283. package/dist/visual-builder/index.js +7 -0
  284. package/dist/visual-builder/store/visualBuilderStore.js +305 -0
  285. package/dist/visual-builder/types/index.js +1 -0
  286. package/dist/visual-builder/utils/__tests__/storyFileUpdater.test.js +145 -0
  287. package/dist/visual-builder/utils/aiParser.js +336 -0
  288. package/dist/visual-builder/utils/componentTreeUtils.js +111 -0
  289. package/dist/visual-builder/utils/parserValidation.js +122 -0
  290. package/dist/visual-builder/utils/storyFileManager.js +73 -0
  291. package/dist/visual-builder/utils/storyFileUpdater.js +326 -0
  292. package/dist/visual-builder/utils/storyNameExtraction.test.js +211 -0
  293. package/dist/visual-builder/utils/storyPersistence.js +180 -0
  294. package/dist/visual-builder/utils/storyToBuilder.js +813 -0
  295. package/package.json +1 -1
@@ -34,6 +34,410 @@ function isToolInstalled(tool) {
34
34
  return false;
35
35
  }
36
36
  }
37
+ /**
38
+ * Generate deployment files for live Storybook deployment
39
+ * This creates Dockerfile, start script, and platform configs
40
+ */
41
+ function generateLiveDeploymentFiles(projectDir, platform) {
42
+ console.log('📝 Generating deployment files...\n');
43
+ // 1. Create Dockerfile for running both servers
44
+ const dockerfilePath = path.join(projectDir, 'Dockerfile');
45
+ const dockerfile = `# Story UI Live Deployment
46
+ # Runs Storybook in dev mode with Story UI MCP server
47
+
48
+ FROM node:20-slim
49
+
50
+ WORKDIR /app
51
+
52
+ # Install dependencies
53
+ COPY package*.json ./
54
+ RUN npm install
55
+
56
+ # Copy project files
57
+ COPY . .
58
+
59
+ # Make start script executable
60
+ RUN chmod +x ./start-production.sh
61
+
62
+ # Expose ports: Storybook (6006) and MCP server (4005)
63
+ EXPOSE 6006 4005
64
+
65
+ # Start both servers
66
+ CMD ["./start-production.sh"]
67
+ `;
68
+ fs.writeFileSync(dockerfilePath, dockerfile);
69
+ console.log('✅ Created Dockerfile');
70
+ // 2. Create start script that runs both servers
71
+ const startScriptPath = path.join(projectDir, 'start-production.sh');
72
+ const startScript = `#!/bin/bash
73
+
74
+ # Story UI Live Production Start Script
75
+ # Runs Storybook in dev mode with Story UI MCP server
76
+
77
+ echo "🚀 Starting Story UI Live Environment..."
78
+
79
+ # Start Storybook dev server in background
80
+ echo "📖 Starting Storybook dev server on port 6006..."
81
+ npm run storybook -- --port 6006 --host 0.0.0.0 --ci --no-open &
82
+ STORYBOOK_PID=$!
83
+
84
+ # Wait a moment for Storybook to initialize
85
+ sleep 5
86
+
87
+ # Start Story UI MCP server in background
88
+ echo "🤖 Starting Story UI MCP server on port 4005..."
89
+ npx story-ui start --port 4005 &
90
+ MCP_PID=$!
91
+
92
+ echo ""
93
+ echo "✅ Story UI Live Environment is running!"
94
+ echo " 📖 Storybook: http://localhost:6006"
95
+ echo " 🤖 MCP Server: http://localhost:4005"
96
+ echo " 📡 MCP Endpoint: http://localhost:4005/mcp"
97
+ echo ""
98
+
99
+ # Wait for either process to exit
100
+ wait $STORYBOOK_PID $MCP_PID
101
+ `;
102
+ fs.writeFileSync(startScriptPath, startScript);
103
+ fs.chmodSync(startScriptPath, '755');
104
+ console.log('✅ Created start-production.sh');
105
+ // 3. Create platform-specific config
106
+ switch (platform) {
107
+ case 'railway':
108
+ createRailwayConfig(projectDir);
109
+ break;
110
+ case 'render':
111
+ createRenderConfig(projectDir);
112
+ break;
113
+ case 'fly':
114
+ createFlyConfig(projectDir);
115
+ break;
116
+ }
117
+ // 4. Create .dockerignore if it doesn't exist
118
+ const dockerignorePath = path.join(projectDir, '.dockerignore');
119
+ if (!fs.existsSync(dockerignorePath)) {
120
+ const dockerignore = `node_modules
121
+ .git
122
+ .gitignore
123
+ *.md
124
+ .DS_Store
125
+ storybook-static
126
+ dist
127
+ .env.local
128
+ `;
129
+ fs.writeFileSync(dockerignorePath, dockerignore);
130
+ console.log('✅ Created .dockerignore');
131
+ }
132
+ // 5. Update package.json to ensure story-ui is a dependency
133
+ const packageJsonPath = path.join(projectDir, 'package.json');
134
+ if (fs.existsSync(packageJsonPath)) {
135
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
136
+ // Add story-ui as a dependency if not present
137
+ if (!packageJson.dependencies?.['@tpitre/story-ui'] && !packageJson.devDependencies?.['@tpitre/story-ui']) {
138
+ packageJson.devDependencies = packageJson.devDependencies || {};
139
+ packageJson.devDependencies['@tpitre/story-ui'] = 'latest';
140
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
141
+ console.log('✅ Added @tpitre/story-ui to package.json');
142
+ }
143
+ }
144
+ }
145
+ function createRailwayConfig(projectDir) {
146
+ const railwayJsonPath = path.join(projectDir, 'railway.json');
147
+ const railwayJson = {
148
+ "$schema": "https://railway.app/railway.schema.json",
149
+ "build": {
150
+ "builder": "DOCKERFILE"
151
+ },
152
+ "deploy": {
153
+ "numReplicas": 1,
154
+ "restartPolicyType": "ON_FAILURE"
155
+ }
156
+ };
157
+ fs.writeFileSync(railwayJsonPath, JSON.stringify(railwayJson, null, 2));
158
+ console.log('✅ Created railway.json');
159
+ // Also create nixpacks.toml as alternative
160
+ const nixpacksPath = path.join(projectDir, 'nixpacks.toml');
161
+ const nixpacks = `[start]
162
+ cmd = "./start-production.sh"
163
+
164
+ [phases.install]
165
+ cmds = ["npm install"]
166
+
167
+ [phases.build]
168
+ cmds = []
169
+ `;
170
+ fs.writeFileSync(nixpacksPath, nixpacks);
171
+ console.log('✅ Created nixpacks.toml (Railway alternative)');
172
+ }
173
+ function createRenderConfig(projectDir) {
174
+ const renderYamlPath = path.join(projectDir, 'render.yaml');
175
+ const renderYaml = `services:
176
+ - type: web
177
+ name: story-ui-live
178
+ env: docker
179
+ dockerfilePath: ./Dockerfile
180
+ plan: starter
181
+ healthCheckPath: /
182
+ envVars:
183
+ - key: NODE_ENV
184
+ value: production
185
+ - key: ANTHROPIC_API_KEY
186
+ sync: false
187
+ - key: OPENAI_API_KEY
188
+ sync: false
189
+ - key: GEMINI_API_KEY
190
+ sync: false
191
+ `;
192
+ fs.writeFileSync(renderYamlPath, renderYaml);
193
+ console.log('✅ Created render.yaml');
194
+ }
195
+ function createFlyConfig(projectDir) {
196
+ const flyTomlPath = path.join(projectDir, 'fly.toml');
197
+ const projectName = path.basename(projectDir).toLowerCase().replace(/[^a-z0-9-]/g, '-');
198
+ const flyToml = `app = "${projectName}-story-ui"
199
+ primary_region = "sjc"
200
+
201
+ [build]
202
+ dockerfile = "Dockerfile"
203
+
204
+ [[services]]
205
+ internal_port = 6006
206
+ protocol = "tcp"
207
+
208
+ [[services.ports]]
209
+ handlers = ["http"]
210
+ port = 80
211
+
212
+ [[services.ports]]
213
+ handlers = ["tls", "http"]
214
+ port = 443
215
+
216
+ [[services]]
217
+ internal_port = 4005
218
+ protocol = "tcp"
219
+
220
+ [[services.ports]]
221
+ handlers = ["http"]
222
+ port = 4005
223
+
224
+ [env]
225
+ NODE_ENV = "production"
226
+ `;
227
+ fs.writeFileSync(flyTomlPath, flyToml);
228
+ console.log('✅ Created fly.toml');
229
+ }
230
+ /**
231
+ * Deploy live Storybook (dev mode) with MCP server to a cloud platform
232
+ * This is the RECOMMENDED approach for production Story UI deployment
233
+ */
234
+ async function deployLiveStorybook(options) {
235
+ console.log('\n🚀 Story UI Live Deployment');
236
+ console.log('═'.repeat(50));
237
+ console.log('This deploys your Storybook in DEV MODE with the MCP server.');
238
+ console.log('Works with ANY components - exactly like your local environment!\n');
239
+ const projectDir = process.cwd();
240
+ const platform = options.platform || 'railway';
241
+ // Validate project has Storybook
242
+ const packageJsonPath = path.join(projectDir, 'package.json');
243
+ if (!fs.existsSync(packageJsonPath)) {
244
+ console.error('❌ No package.json found. Run this from your Storybook project root.');
245
+ return { storybookUrl: null, mcpUrl: null };
246
+ }
247
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
248
+ const hasStorybook = packageJson.devDependencies?.storybook ||
249
+ packageJson.dependencies?.storybook ||
250
+ packageJson.devDependencies?.['@storybook/react'] ||
251
+ packageJson.dependencies?.['@storybook/react'];
252
+ if (!hasStorybook) {
253
+ console.error('❌ No Storybook found in package.json.');
254
+ console.log(' Make sure you have Storybook installed: npx storybook@latest init');
255
+ return { storybookUrl: null, mcpUrl: null };
256
+ }
257
+ // Generate deployment files
258
+ generateLiveDeploymentFiles(projectDir, platform);
259
+ if (options.dryRun) {
260
+ console.log('\n[DRY RUN] Deployment files generated. Would deploy to', platform);
261
+ console.log('[DRY RUN] To deploy manually:');
262
+ switch (platform) {
263
+ case 'railway':
264
+ console.log(' 1. railway login');
265
+ console.log(' 2. railway init');
266
+ console.log(' 3. railway up');
267
+ console.log(' 4. railway domain (to get URL)');
268
+ break;
269
+ case 'render':
270
+ console.log(' 1. Push to GitHub');
271
+ console.log(' 2. Create new Web Service on render.com');
272
+ console.log(' 3. Connect your repository');
273
+ break;
274
+ case 'fly':
275
+ console.log(' 1. fly auth login');
276
+ console.log(' 2. fly launch');
277
+ console.log(' 3. fly secrets set ANTHROPIC_API_KEY=...');
278
+ console.log(' 4. fly deploy');
279
+ break;
280
+ }
281
+ return { storybookUrl: 'https://dry-run.example.com', mcpUrl: 'https://dry-run.example.com:4005/mcp' };
282
+ }
283
+ // Actually deploy based on platform
284
+ console.log(`\n☁️ Deploying to ${platform}...`);
285
+ switch (platform) {
286
+ case 'railway':
287
+ return await deployLiveToRailway(projectDir);
288
+ case 'render':
289
+ return await deployLiveToRender(projectDir);
290
+ case 'fly':
291
+ return await deployLiveToFly(projectDir);
292
+ default:
293
+ console.error(`❌ Unknown platform: ${platform}`);
294
+ return { storybookUrl: null, mcpUrl: null };
295
+ }
296
+ }
297
+ async function deployLiveToRailway(projectDir) {
298
+ console.log('\n🚂 Deploying to Railway...\n');
299
+ if (!isToolInstalled('railway')) {
300
+ console.log('📦 Railway CLI not found. Installing...');
301
+ try {
302
+ execSync('npm install -g @railway/cli', { stdio: 'inherit' });
303
+ }
304
+ catch {
305
+ console.error('❌ Failed to install Railway CLI');
306
+ console.log(' Install manually: npm install -g @railway/cli');
307
+ return { storybookUrl: null, mcpUrl: null };
308
+ }
309
+ }
310
+ // Check if logged in
311
+ try {
312
+ execSync('railway whoami', { stdio: 'pipe' });
313
+ }
314
+ catch {
315
+ console.log('🔐 Not logged into Railway. Please login:');
316
+ execSync('railway login', { stdio: 'inherit' });
317
+ }
318
+ try {
319
+ // Check if project is linked
320
+ try {
321
+ execSync('railway status', { cwd: projectDir, stdio: 'pipe' });
322
+ console.log('✅ Railway project already linked');
323
+ }
324
+ catch {
325
+ console.log('📁 Creating new Railway project...');
326
+ execSync('railway init', { cwd: projectDir, stdio: 'inherit' });
327
+ }
328
+ // Set environment variables reminder
329
+ console.log('\n⚠️ Remember to set your API keys in Railway dashboard:');
330
+ console.log(' railway variables set ANTHROPIC_API_KEY=your-key');
331
+ console.log(' (or OPENAI_API_KEY, GEMINI_API_KEY)\n');
332
+ // Deploy
333
+ console.log('🚀 Deploying to Railway...');
334
+ const result = execSync('railway up --detach 2>&1', {
335
+ cwd: projectDir,
336
+ encoding: 'utf-8'
337
+ });
338
+ console.log(result);
339
+ // Get the deployment URL
340
+ console.log('\n📋 Getting deployment URL...');
341
+ try {
342
+ const urlResult = execSync('railway domain 2>&1', {
343
+ cwd: projectDir,
344
+ encoding: 'utf-8'
345
+ }).trim();
346
+ if (urlResult && !urlResult.includes('No domain')) {
347
+ const storybookUrl = `https://${urlResult}`;
348
+ const mcpUrl = `https://${urlResult}:4005/mcp`;
349
+ console.log(`\n✅ Deployment successful!`);
350
+ console.log(` 📖 Storybook: ${storybookUrl}`);
351
+ console.log(` 🤖 MCP Server: ${mcpUrl}`);
352
+ return { storybookUrl, mcpUrl };
353
+ }
354
+ }
355
+ catch {
356
+ console.log('⚠️ Could not get domain automatically.');
357
+ }
358
+ // Try to generate a domain
359
+ console.log('🌐 Generating Railway domain...');
360
+ execSync('railway domain', { cwd: projectDir, stdio: 'inherit' });
361
+ console.log('\n✅ Deployment submitted!');
362
+ console.log(' Run "railway domain" to get your deployment URL.');
363
+ return { storybookUrl: null, mcpUrl: null };
364
+ }
365
+ catch (error) {
366
+ console.error('❌ Railway deployment failed:', error.message);
367
+ return { storybookUrl: null, mcpUrl: null };
368
+ }
369
+ }
370
+ async function deployLiveToRender(projectDir) {
371
+ console.log('\n🎨 Render Deployment Instructions\n');
372
+ console.log('Render uses Git-based deployments. Follow these steps:\n');
373
+ console.log('1. Push your code to GitHub/GitLab');
374
+ console.log('2. Go to https://dashboard.render.com');
375
+ console.log('3. Click "New" → "Web Service"');
376
+ console.log('4. Connect your repository');
377
+ console.log('5. Render will auto-detect the Dockerfile');
378
+ console.log('6. Add your API keys as environment variables:');
379
+ console.log(' - ANTHROPIC_API_KEY');
380
+ console.log(' - OPENAI_API_KEY (optional)');
381
+ console.log(' - GEMINI_API_KEY (optional)');
382
+ console.log('\n📁 Deployment files have been created:');
383
+ console.log(' - Dockerfile');
384
+ console.log(' - render.yaml');
385
+ console.log(' - start-production.sh');
386
+ return { storybookUrl: null, mcpUrl: null };
387
+ }
388
+ async function deployLiveToFly(projectDir) {
389
+ console.log('\n🪁 Deploying to Fly.io...\n');
390
+ const flyCmd = isToolInstalled('flyctl') ? 'flyctl' : (isToolInstalled('fly') ? 'fly' : null);
391
+ if (!flyCmd) {
392
+ console.log('📦 Fly CLI not found. Installing...');
393
+ try {
394
+ execSync('curl -L https://fly.io/install.sh | sh', { stdio: 'inherit' });
395
+ }
396
+ catch {
397
+ console.error('❌ Failed to install Fly CLI');
398
+ console.log(' Install manually: https://fly.io/docs/hands-on/install-flyctl/');
399
+ return { storybookUrl: null, mcpUrl: null };
400
+ }
401
+ }
402
+ const cmd = flyCmd || 'fly';
403
+ try {
404
+ // Check if logged in
405
+ try {
406
+ execSync(`${cmd} auth whoami`, { stdio: 'pipe' });
407
+ }
408
+ catch {
409
+ console.log('🔐 Not logged into Fly.io. Please login:');
410
+ execSync(`${cmd} auth login`, { stdio: 'inherit' });
411
+ }
412
+ // Launch or deploy
413
+ try {
414
+ execSync(`${cmd} status`, { cwd: projectDir, stdio: 'pipe' });
415
+ console.log('🚀 Deploying to existing Fly app...');
416
+ execSync(`${cmd} deploy`, { cwd: projectDir, stdio: 'inherit' });
417
+ }
418
+ catch {
419
+ console.log('📁 Creating new Fly app...');
420
+ execSync(`${cmd} launch --no-deploy`, { cwd: projectDir, stdio: 'inherit' });
421
+ console.log('\n⚠️ Before deploying, set your secrets:');
422
+ console.log(` ${cmd} secrets set ANTHROPIC_API_KEY=your-key`);
423
+ console.log('\n Then run:');
424
+ console.log(` ${cmd} deploy`);
425
+ return { storybookUrl: null, mcpUrl: null };
426
+ }
427
+ // Get URL
428
+ const appName = path.basename(projectDir).toLowerCase().replace(/[^a-z0-9-]/g, '-') + '-story-ui';
429
+ const storybookUrl = `https://${appName}.fly.dev`;
430
+ const mcpUrl = `https://${appName}.fly.dev:4005/mcp`;
431
+ console.log(`\n✅ Deployment successful!`);
432
+ console.log(` 📖 Storybook: ${storybookUrl}`);
433
+ console.log(` 🤖 MCP Server: ${mcpUrl}`);
434
+ return { storybookUrl, mcpUrl };
435
+ }
436
+ catch (error) {
437
+ console.error('❌ Fly.io deployment failed:', error.message);
438
+ return { storybookUrl: null, mcpUrl: null };
439
+ }
440
+ }
37
441
  /**
38
442
  * Deploy backend to Railway
39
443
  */
@@ -373,29 +777,89 @@ async function deployProductionApp(backendUrl, projectName, dryRun) {
373
777
  // Generate the component registry in the user's project context
374
778
  process.chdir(userCwd);
375
779
  await generateComponentRegistry(registryOutputPath);
376
- // 2.5. Generate AI considerations from story-ui-considerations.md (if exists)
377
- console.log('📝 Loading AI considerations...');
780
+ // 2.5. Load ALL design system documentation (story-ui-docs/ AND story-ui-considerations.md)
781
+ console.log('📚 Loading design system documentation...');
782
+ // First, try the full documentation directory (story-ui-docs/)
783
+ const { DocumentationLoader } = await import('../story-generator/documentationLoader.js');
784
+ const docLoader = new DocumentationLoader(userCwd);
785
+ let fullDocumentation = '';
786
+ let documentationTokens = {};
787
+ let documentationPatterns = {};
788
+ let hasFullDocs = false;
789
+ if (docLoader.hasDocumentation()) {
790
+ console.log('📂 Found story-ui-docs/ directory, loading all documentation...');
791
+ const docs = await docLoader.loadDocumentation();
792
+ fullDocumentation = docLoader.formatForPrompt(docs);
793
+ documentationTokens = docs.tokens;
794
+ documentationPatterns = docs.patterns;
795
+ hasFullDocs = true;
796
+ console.log(` ✅ Loaded ${docs.guidelines.length} guidelines, ${Object.keys(docs.tokens).length} token categories, ${Object.keys(docs.patterns).length} patterns`);
797
+ }
798
+ // Also load legacy considerations file (story-ui-considerations.md)
378
799
  const { loadConsiderations, considerationsToPrompt } = await import('../story-generator/considerationsLoader.js');
379
800
  const considerations = loadConsiderations(); // Auto-finds in common locations
380
801
  const considerationsPrompt = considerations ? considerationsToPrompt(considerations) : '';
802
+ // Combine both sources - full docs take priority, considerations supplement
803
+ let combinedDocumentation = '';
804
+ if (fullDocumentation) {
805
+ combinedDocumentation = fullDocumentation;
806
+ if (considerationsPrompt) {
807
+ // Add considerations as supplementary rules
808
+ combinedDocumentation += '\n\n📋 ADDITIONAL DESIGN SYSTEM RULES:\n' + considerationsPrompt;
809
+ }
810
+ }
811
+ else if (considerationsPrompt) {
812
+ combinedDocumentation = considerationsPrompt;
813
+ }
381
814
  const considerationsOutputPath = path.join(buildDir, 'src/considerations.ts');
382
- // Write considerations to a TypeScript file
815
+ // Write comprehensive documentation to a TypeScript file
383
816
  const considerationsContent = `/**
384
- * AI Considerations - Auto-generated from story-ui-considerations.md
817
+ * AI Design System Documentation - Auto-generated
818
+ *
819
+ * This file contains ALL design system documentation for the AI:
820
+ * - Guidelines from story-ui-docs/ directory
821
+ * - Design tokens (colors, spacing, typography, etc.)
822
+ * - Component-specific documentation
823
+ * - Layout patterns
824
+ * - Accessibility rules
825
+ * - Legacy considerations from story-ui-considerations.md
385
826
  *
386
- * This file contains design-system-specific instructions for the AI
387
- * when generating components. Edit story-ui-considerations.md in your
388
- * project root to customize these rules.
827
+ * To customize:
828
+ * 1. Create a story-ui-docs/ directory with markdown/JSON files
829
+ * 2. And/or edit story-ui-considerations.md in your project root
389
830
  */
390
831
 
391
- export const aiConsiderations = ${JSON.stringify(considerationsPrompt, null, 2)};
832
+ export const aiConsiderations = ${JSON.stringify(combinedDocumentation, null, 2)};
833
+
834
+ export const hasConsiderations = ${(hasFullDocs || considerations) ? 'true' : 'false'};
835
+
836
+ // Design tokens for programmatic access (if needed)
837
+ export const designTokens = ${JSON.stringify(documentationTokens, null, 2)};
838
+
839
+ // Design patterns for programmatic access (if needed)
840
+ export const designPatterns = ${JSON.stringify(documentationPatterns, null, 2)};
392
841
 
393
- export const hasConsiderations = ${considerations ? 'true' : 'false'};
842
+ // Source information
843
+ export const documentationSource = {
844
+ hasFullDocs: ${hasFullDocs},
845
+ hasLegacyConsiderations: ${considerations ? 'true' : 'false'},
846
+ libraryName: ${JSON.stringify(considerations?.libraryName || null)}
847
+ };
394
848
  `;
395
849
  fs.writeFileSync(considerationsOutputPath, considerationsContent);
396
- console.log(considerations
397
- ? `✅ Loaded AI considerations for: ${considerations.libraryName || 'your component library'}`
398
- : '⚠️ No story-ui-considerations.md found - using default prompts');
850
+ if (hasFullDocs && considerations) {
851
+ console.log(`✅ Loaded full documentation + considerations for: ${considerations.libraryName || 'your component library'}`);
852
+ }
853
+ else if (hasFullDocs) {
854
+ console.log('✅ Loaded full documentation from story-ui-docs/');
855
+ }
856
+ else if (considerations) {
857
+ console.log(`✅ Loaded considerations for: ${considerations.libraryName || 'your component library'}`);
858
+ }
859
+ else {
860
+ console.log('⚠️ No documentation found - using default prompts');
861
+ console.log(' Create story-ui-docs/ directory or story-ui-considerations.md for better results');
862
+ }
399
863
  process.chdir(buildDir);
400
864
  // 3. Install dependencies
401
865
  console.log('📦 Installing dependencies...');
@@ -427,7 +891,7 @@ export const hasConsiderations = ${considerations ? 'true' : 'false'};
427
891
  execSync('npm install', { cwd: buildDir, stdio: 'inherit' });
428
892
  // 4. Create .env file with backend URL
429
893
  console.log('⚙️ Configuring backend URL...');
430
- fs.writeFileSync(path.join(buildDir, '.env'), `VITE_BACKEND_URL=${backendUrl}\nVITE_APP_TITLE=Story UI\n`);
894
+ fs.writeFileSync(path.join(buildDir, '.env'), `VITE_STORY_UI_SERVER=${backendUrl}\nVITE_APP_TITLE=Story UI\n`);
431
895
  // 5. Build the app
432
896
  console.log('🔨 Building production app...');
433
897
  execSync('npm run build', { cwd: buildDir, stdio: 'inherit' });
@@ -600,7 +1064,32 @@ export async function deployCommand(options) {
600
1064
  await legacyEdgeDeployment(options);
601
1065
  return;
602
1066
  }
603
- // New recommended deployment flow
1067
+ // NEW RECOMMENDED: Live Storybook deployment
1068
+ // Runs Storybook in dev mode with MCP server - works with ANY components
1069
+ if (options.live) {
1070
+ const result = await deployLiveStorybook(options);
1071
+ if (result.storybookUrl || result.mcpUrl) {
1072
+ console.log('\n' + '═'.repeat(60));
1073
+ console.log('📋 LIVE DEPLOYMENT SUMMARY');
1074
+ console.log('═'.repeat(60));
1075
+ if (result.storybookUrl) {
1076
+ console.log(`\n📖 Storybook (Live Dev Mode): ${result.storybookUrl}`);
1077
+ console.log(' This runs in dev mode - Story UI can generate & hot-reload stories!');
1078
+ }
1079
+ if (result.mcpUrl) {
1080
+ console.log(`\n🤖 MCP Server: ${result.mcpUrl}`);
1081
+ console.log(' Connect Claude Desktop with:');
1082
+ console.log(` claude mcp add --transport http story-ui ${result.mcpUrl}`);
1083
+ }
1084
+ console.log('\n✅ This is the EXACT same experience as local development!');
1085
+ console.log(' - Works with ANY components (custom, Tailwind, multiple libraries)');
1086
+ console.log(' - Generated stories are hot-reloaded instantly');
1087
+ console.log(' - MCP server accessible from anywhere');
1088
+ console.log('\n' + '═'.repeat(60));
1089
+ }
1090
+ return;
1091
+ }
1092
+ // Legacy deployment flows
604
1093
  let backendUrl = options.backendUrl || null;
605
1094
  let frontendUrl = null;
606
1095
  let appUrl = null;
@@ -657,40 +1146,47 @@ export async function deployCommand(options) {
657
1146
  printSummary(backendUrl, frontendUrl, appUrl);
658
1147
  }
659
1148
  // Show help if no flags provided
660
- if (!options.backend && !options.frontend && !options.app && !options.edge && !options.pages && !options.all && !options.init) {
661
- console.log('Story UI Deployment - Deploy your component library as a production app\n');
662
- console.log('RECOMMENDED APPROACH (Lovable/Bolt-style App):');
663
- console.log(''.repeat(50));
664
- console.log(' --backend Deploy MCP server backend');
665
- console.log(' --app Deploy standalone production app (RECOMMENDED)');
666
- console.log(' Builds a Lovable/Bolt-style UI with your components');
667
- console.log(' --platform <name> Backend platform: railway (default), render, fly');
668
- console.log(' --backend-url <url> Use existing backend URL');
669
- console.log(' --project-name <name> Project name prefix (default: story-ui)');
670
- console.log(' --dry-run Show what would be deployed\n');
1149
+ if (!options.backend && !options.frontend && !options.app && !options.live && !options.edge && !options.pages && !options.all && !options.init) {
1150
+ console.log('Story UI Deployment - Deploy your Storybook with AI story generation\n');
1151
+ console.log('═'.repeat(60));
1152
+ console.log(' RECOMMENDED: Live Storybook Deployment');
1153
+ console.log(''.repeat(60));
1154
+ console.log(' --live Deploy Storybook in DEV MODE with MCP server');
1155
+ console.log(' Works with ANY components - exactly like local dev!');
1156
+ console.log(' --platform <name> Platform: railway (default), render, fly');
1157
+ console.log(' --dry-run Generate deployment files only\n');
671
1158
  console.log('EXAMPLES:');
672
- console.log('─'.repeat(50));
673
- console.log(' # Deploy everything (recommended)');
674
- console.log(' npx story-ui deploy --backend --app\n');
675
- console.log(' # Deploy backend only to Railway');
676
- console.log(' npx story-ui deploy --backend --platform=railway\n');
677
- console.log(' # Deploy app with existing backend');
678
- console.log(' npx story-ui deploy --app --backend-url=https://your-api.railway.app\n');
679
- console.log(' # Custom project name');
680
- console.log(' npx story-ui deploy --backend --app --project-name=my-design-system\n');
681
- console.log('ENVIRONMENT VARIABLES (set on backend platform):');
682
- console.log('─'.repeat(50));
683
- console.log(' CLAUDE_API_KEY - Anthropic API key');
684
- console.log(' OPENAI_API_KEY - OpenAI API key');
685
- console.log(' GEMINI_API_KEY - Google Gemini API key');
1159
+ console.log('─'.repeat(60));
1160
+ console.log(' # Deploy your Storybook to Railway (recommended)');
1161
+ console.log(' npx story-ui deploy --live\n');
1162
+ console.log(' # Deploy to Render');
1163
+ console.log(' npx story-ui deploy --live --platform=render\n');
1164
+ console.log(' # Deploy to Fly.io');
1165
+ console.log(' npx story-ui deploy --live --platform=fly\n');
1166
+ console.log(' # Just generate deployment files (no actual deploy)');
1167
+ console.log(' npx story-ui deploy --live --dry-run\n');
1168
+ console.log('WHY --live IS RECOMMENDED:');
1169
+ console.log('─'.repeat(60));
1170
+ console.log(' - Works with ANY components (custom, Tailwind, multiple libraries)');
1171
+ console.log(' - Exactly the same experience as local development');
1172
+ console.log(' - Story UI writes stories to disk, Storybook hot-reloads them');
1173
+ console.log(' - MCP server accessible from Claude Desktop anywhere');
1174
+ console.log(' - No design system lock-in - completely agnostic\n');
1175
+ console.log('ENVIRONMENT VARIABLES (set on your platform):');
1176
+ console.log('─'.repeat(60));
1177
+ console.log(' ANTHROPIC_API_KEY - Claude API key (recommended)');
1178
+ console.log(' OPENAI_API_KEY - OpenAI API key (optional)');
1179
+ console.log(' GEMINI_API_KEY - Google Gemini API key (optional)');
686
1180
  console.log(' (Set at least one of these)\n');
687
- console.log('LEGACY OPTIONS (Storybook-based frontend):');
688
- console.log('─'.repeat(50));
689
- console.log(' --frontend Deploy Storybook frontend (use --app instead)');
690
- console.log(' --storybook-dir <dir> Path to Storybook project\n');
691
- console.log('DEPRECATED OPTIONS (Cloudflare Edge approach):');
692
- console.log(''.repeat(50));
1181
+ console.log('ALTERNATIVE APPROACHES (for specific use cases):');
1182
+ console.log('─'.repeat(60));
1183
+ console.log(' --backend Deploy only the MCP server backend');
1184
+ console.log(' --app Deploy standalone production app (static)');
1185
+ console.log(' --frontend Deploy Storybook static build');
1186
+ console.log(' --backend-url <url> Use existing backend URL\n');
1187
+ console.log('DEPRECATED:');
1188
+ console.log('─'.repeat(60));
693
1189
  console.log(' --init, --edge, --pages, --all');
694
- console.log(' These are deprecated. Use --backend and --app instead.\n');
1190
+ console.log(' These Cloudflare Edge options are deprecated. Use --live instead.\n');
695
1191
  }
696
1192
  }