@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.
- package/README.md +36 -37
- package/dist/cli/deploy.d.ts +4 -3
- package/dist/cli/deploy.d.ts.map +1 -1
- package/dist/cli/deploy.js +542 -46
- package/dist/cli/index.js +17 -14
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +4 -110
- package/dist/cli/setup.js.map +1 -0
- package/dist/cloudflare-edge/src/mcp-session.js +462 -0
- package/dist/cloudflare-edge/src/types.js +4 -0
- package/dist/cloudflare-edge/src/worker.js +106 -0
- package/dist/cloudflare-pages/vite.config.js +14 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/mcp-server/mcp-stdio-server.js.map +1 -0
- package/dist/mcp-server/routes/claude.js.map +1 -0
- package/dist/mcp-server/routes/components.js.map +1 -0
- package/dist/mcp-server/routes/generateStory.js.map +1 -0
- package/dist/mcp-server/routes/hybridStories.js.map +1 -0
- package/dist/mcp-server/routes/memoryStories.js.map +1 -0
- package/dist/mcp-server/routes/storySync.js.map +1 -0
- package/dist/mcp-server/routes/updateStory.js +246 -0
- package/dist/mcp-server/sessionManager.js.map +1 -0
- package/dist/playground/components/AIAssistant/AIAssistant.d.ts +6 -0
- package/dist/playground/components/AIAssistant/AIAssistant.d.ts.map +1 -0
- package/dist/playground/components/AIAssistant/AIAssistant.js +109 -0
- package/dist/playground/components/AIAssistant/AIAssistant.js.map +1 -0
- package/dist/playground/components/AIAssistant/AIAssistant.module.css +166 -0
- package/dist/playground/components/Canvas/Canvas.d.ts +9 -0
- package/dist/playground/components/Canvas/Canvas.d.ts.map +1 -0
- package/dist/playground/components/Canvas/Canvas.js +58 -0
- package/dist/playground/components/Canvas/Canvas.js.map +1 -0
- package/dist/playground/components/Canvas/Canvas.module.css +189 -0
- package/dist/playground/components/Canvas/CanvasWithDnd.d.ts +9 -0
- package/dist/playground/components/Canvas/CanvasWithDnd.d.ts.map +1 -0
- package/dist/playground/components/Canvas/CanvasWithDnd.js +158 -0
- package/dist/playground/components/Canvas/CanvasWithDnd.js.map +1 -0
- package/dist/playground/components/Canvas/ComponentRenderer.d.ts +15 -0
- package/dist/playground/components/Canvas/ComponentRenderer.d.ts.map +1 -0
- package/dist/playground/components/Canvas/ComponentRenderer.js +177 -0
- package/dist/playground/components/Canvas/ComponentRenderer.js.map +1 -0
- package/dist/playground/components/Canvas/DraggableComponent.d.ts +15 -0
- package/dist/playground/components/Canvas/DraggableComponent.d.ts.map +1 -0
- package/dist/playground/components/Canvas/DraggableComponent.js +49 -0
- package/dist/playground/components/Canvas/DraggableComponent.js.map +1 -0
- package/dist/playground/components/Canvas/index.d.ts +9 -0
- package/dist/playground/components/Canvas/index.d.ts.map +1 -0
- package/dist/playground/components/Canvas/index.js +5 -0
- package/dist/playground/components/Canvas/index.js.map +1 -0
- package/dist/playground/components/CodeView/CodeView.d.ts +12 -0
- package/dist/playground/components/CodeView/CodeView.d.ts.map +1 -0
- package/dist/playground/components/CodeView/CodeView.js +77 -0
- package/dist/playground/components/CodeView/CodeView.js.map +1 -0
- package/dist/playground/components/CodeView/CodeView.module.css +178 -0
- package/dist/playground/components/ComponentPalette/ComponentPalette.d.ts +17 -0
- package/dist/playground/components/ComponentPalette/ComponentPalette.d.ts.map +1 -0
- package/dist/playground/components/ComponentPalette/ComponentPalette.js +138 -0
- package/dist/playground/components/ComponentPalette/ComponentPalette.js.map +1 -0
- package/dist/playground/components/ComponentPalette/ComponentPalette.module.css +217 -0
- package/dist/playground/components/ComponentPalette/index.d.ts +3 -0
- package/dist/playground/components/ComponentPalette/index.d.ts.map +1 -0
- package/dist/playground/components/ComponentPalette/index.js +2 -0
- package/dist/playground/components/ComponentPalette/index.js.map +1 -0
- package/dist/playground/components/DropZone/DropZone.d.ts +17 -0
- package/dist/playground/components/DropZone/DropZone.d.ts.map +1 -0
- package/dist/playground/components/DropZone/DropZone.js +73 -0
- package/dist/playground/components/DropZone/DropZone.js.map +1 -0
- package/dist/playground/components/DropZone/DropZone.module.css +86 -0
- package/dist/playground/components/ExportDialog/ExportDialog.d.ts +10 -0
- package/dist/playground/components/ExportDialog/ExportDialog.d.ts.map +1 -0
- package/dist/playground/components/ExportDialog/ExportDialog.js +57 -0
- package/dist/playground/components/ExportDialog/ExportDialog.js.map +1 -0
- package/dist/playground/components/ExportDialog/ExportDialog.module.css +328 -0
- package/dist/playground/components/LayoutHelpers/LayoutHelpers.d.ts +134 -0
- package/dist/playground/components/LayoutHelpers/LayoutHelpers.d.ts.map +1 -0
- package/dist/playground/components/LayoutHelpers/LayoutHelpers.js +254 -0
- package/dist/playground/components/LayoutHelpers/LayoutHelpers.js.map +1 -0
- package/dist/playground/components/LayoutHelpers/index.d.ts +3 -0
- package/dist/playground/components/LayoutHelpers/index.d.ts.map +1 -0
- package/dist/playground/components/LayoutHelpers/index.js +2 -0
- package/dist/playground/components/LayoutHelpers/index.js.map +1 -0
- package/dist/playground/components/Playground/Playground.d.ts +10 -0
- package/dist/playground/components/Playground/Playground.d.ts.map +1 -0
- package/dist/playground/components/Playground/Playground.js +128 -0
- package/dist/playground/components/Playground/Playground.js.map +1 -0
- package/dist/playground/components/Playground/Playground.module.css +308 -0
- package/dist/playground/components/PropertiesPanel/PropertiesPanel.d.ts +10 -0
- package/dist/playground/components/PropertiesPanel/PropertiesPanel.d.ts.map +1 -0
- package/dist/playground/components/PropertiesPanel/PropertiesPanel.js +150 -0
- package/dist/playground/components/PropertiesPanel/PropertiesPanel.js.map +1 -0
- package/dist/playground/components/PropertiesPanel/PropertiesPanel.module.css +155 -0
- package/dist/playground/components/PropertiesPanel/index.d.ts +3 -0
- package/dist/playground/components/PropertiesPanel/index.d.ts.map +1 -0
- package/dist/playground/components/PropertiesPanel/index.js +2 -0
- package/dist/playground/components/PropertiesPanel/index.js.map +1 -0
- package/dist/playground/components/PropertyEditors/BooleanEditor.d.ts +12 -0
- package/dist/playground/components/PropertyEditors/BooleanEditor.d.ts.map +1 -0
- package/dist/playground/components/PropertyEditors/BooleanEditor.js +14 -0
- package/dist/playground/components/PropertyEditors/BooleanEditor.js.map +1 -0
- package/dist/playground/components/PropertyEditors/ColorEditor.d.ts +12 -0
- package/dist/playground/components/PropertyEditors/ColorEditor.d.ts.map +1 -0
- package/dist/playground/components/PropertyEditors/ColorEditor.js +62 -0
- package/dist/playground/components/PropertyEditors/ColorEditor.js.map +1 -0
- package/dist/playground/components/PropertyEditors/IconEditor.d.ts +12 -0
- package/dist/playground/components/PropertyEditors/IconEditor.d.ts.map +1 -0
- package/dist/playground/components/PropertyEditors/IconEditor.js +123 -0
- package/dist/playground/components/PropertyEditors/IconEditor.js.map +1 -0
- package/dist/playground/components/PropertyEditors/NumberEditor.d.ts +15 -0
- package/dist/playground/components/PropertyEditors/NumberEditor.d.ts.map +1 -0
- package/dist/playground/components/PropertyEditors/NumberEditor.js +46 -0
- package/dist/playground/components/PropertyEditors/NumberEditor.js.map +1 -0
- package/dist/playground/components/PropertyEditors/PropertyEditors.module.css +432 -0
- package/dist/playground/components/PropertyEditors/SelectEditor.d.ts +19 -0
- package/dist/playground/components/PropertyEditors/SelectEditor.d.ts.map +1 -0
- package/dist/playground/components/PropertyEditors/SelectEditor.js +17 -0
- package/dist/playground/components/PropertyEditors/SelectEditor.js.map +1 -0
- package/dist/playground/components/PropertyEditors/SpacingEditor.d.ts +19 -0
- package/dist/playground/components/PropertyEditors/SpacingEditor.d.ts.map +1 -0
- package/dist/playground/components/PropertyEditors/SpacingEditor.js +162 -0
- package/dist/playground/components/PropertyEditors/SpacingEditor.js.map +1 -0
- package/dist/playground/components/PropertyEditors/SpacingEditor.module.css +214 -0
- package/dist/playground/components/PropertyEditors/TextEditor.d.ts +14 -0
- package/dist/playground/components/PropertyEditors/TextEditor.d.ts.map +1 -0
- package/dist/playground/components/PropertyEditors/TextEditor.js +38 -0
- package/dist/playground/components/PropertyEditors/TextEditor.js.map +1 -0
- package/dist/playground/components/PropertyEditors/TokenEditor.d.ts +23 -0
- package/dist/playground/components/PropertyEditors/TokenEditor.d.ts.map +1 -0
- package/dist/playground/components/PropertyEditors/TokenEditor.js +50 -0
- package/dist/playground/components/PropertyEditors/TokenEditor.js.map +1 -0
- package/dist/playground/components/PropertyEditors/index.d.ts +20 -0
- package/dist/playground/components/PropertyEditors/index.d.ts.map +1 -0
- package/dist/playground/components/PropertyEditors/index.js +12 -0
- package/dist/playground/components/PropertyEditors/index.js.map +1 -0
- package/dist/playground/components/TreeView/TreeView.d.ts +10 -0
- package/dist/playground/components/TreeView/TreeView.d.ts.map +1 -0
- package/dist/playground/components/TreeView/TreeView.js +146 -0
- package/dist/playground/components/TreeView/TreeView.js.map +1 -0
- package/dist/playground/components/TreeView/TreeView.module.css +214 -0
- package/dist/playground/components/TreeView/index.d.ts +3 -0
- package/dist/playground/components/TreeView/index.d.ts.map +1 -0
- package/dist/playground/components/TreeView/index.js +2 -0
- package/dist/playground/components/TreeView/index.js.map +1 -0
- package/dist/playground/config/propertyDefinitions.d.ts +73 -0
- package/dist/playground/config/propertyDefinitions.d.ts.map +1 -0
- package/dist/playground/config/propertyDefinitions.js +809 -0
- package/dist/playground/config/propertyDefinitions.js.map +1 -0
- package/dist/playground/hooks/useKeyboardShortcuts.d.ts +38 -0
- package/dist/playground/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/playground/hooks/useKeyboardShortcuts.js +191 -0
- package/dist/playground/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/playground/index.d.ts +21 -0
- package/dist/playground/index.d.ts.map +1 -0
- package/dist/playground/index.js +23 -0
- package/dist/playground/index.js.map +1 -0
- package/dist/playground/services/CodeGenerator.d.ts +73 -0
- package/dist/playground/services/CodeGenerator.d.ts.map +1 -0
- package/dist/playground/services/CodeGenerator.js +359 -0
- package/dist/playground/services/CodeGenerator.js.map +1 -0
- package/dist/playground/services/DragDropManager.d.ts +95 -0
- package/dist/playground/services/DragDropManager.d.ts.map +1 -0
- package/dist/playground/services/DragDropManager.js +408 -0
- package/dist/playground/services/DragDropManager.js.map +1 -0
- package/dist/playground/services/StoryParser.d.ts +73 -0
- package/dist/playground/services/StoryParser.d.ts.map +1 -0
- package/dist/playground/services/StoryParser.js +419 -0
- package/dist/playground/services/StoryParser.js.map +1 -0
- package/dist/playground/store/playgroundStore.d.ts +86 -0
- package/dist/playground/store/playgroundStore.d.ts.map +1 -0
- package/dist/playground/store/playgroundStore.js +337 -0
- package/dist/playground/store/playgroundStore.js.map +1 -0
- package/dist/playground/stories/PlaygroundDragDrop.stories.d.ts +13 -0
- package/dist/playground/stories/PlaygroundDragDrop.stories.d.ts.map +1 -0
- package/dist/playground/stories/PlaygroundDragDrop.stories.js +227 -0
- package/dist/playground/stories/PlaygroundDragDrop.stories.js.map +1 -0
- package/dist/playground/stories/PlaygroundPhase4.stories.d.ts +13 -0
- package/dist/playground/stories/PlaygroundPhase4.stories.d.ts.map +1 -0
- package/dist/playground/stories/PlaygroundPhase4.stories.js +334 -0
- package/dist/playground/stories/PlaygroundPhase4.stories.js.map +1 -0
- package/dist/playground/stories/PlaygroundPhase5.stories.d.ts +14 -0
- package/dist/playground/stories/PlaygroundPhase5.stories.d.ts.map +1 -0
- package/dist/playground/stories/PlaygroundPhase5.stories.js +512 -0
- package/dist/playground/stories/PlaygroundPhase5.stories.js.map +1 -0
- package/dist/playground/stories/PlaygroundProperties.stories.d.ts +13 -0
- package/dist/playground/stories/PlaygroundProperties.stories.d.ts.map +1 -0
- package/dist/playground/stories/PlaygroundProperties.stories.js +342 -0
- package/dist/playground/stories/PlaygroundProperties.stories.js.map +1 -0
- package/dist/playground/types/index.d.ts +251 -0
- package/dist/playground/types/index.d.ts.map +1 -0
- package/dist/playground/types/index.js +5 -0
- package/dist/playground/types/index.js.map +1 -0
- package/dist/scripts/verify-framework-adapters.js +105 -0
- package/dist/story-generator/componentBlacklist.js.map +1 -0
- package/dist/story-generator/componentDiscovery.js.map +1 -0
- package/dist/story-generator/configLoader.js.map +1 -0
- package/dist/story-generator/considerationsLoader.js.map +1 -0
- package/dist/story-generator/documentation-sources.js.map +1 -0
- package/dist/story-generator/documentationLoader.js.map +1 -0
- package/dist/story-generator/dynamicPackageDiscovery.js.map +1 -0
- package/dist/story-generator/enhancedComponentDiscovery.d.ts.map +1 -1
- package/dist/story-generator/enhancedComponentDiscovery.js +4 -6
- package/dist/story-generator/enhancedComponentDiscovery.js.map +1 -0
- package/dist/story-generator/generateStory.js.map +1 -0
- package/dist/story-generator/gitignoreManager.js.map +1 -0
- package/dist/story-generator/inMemoryStoryService.js.map +1 -0
- package/dist/story-generator/llm-providers/settings-manager.js +4 -4
- package/dist/story-generator/logger.js.map +1 -0
- package/dist/story-generator/postProcessStory.js.map +1 -0
- package/dist/story-generator/productionGitignoreManager.d.ts.map +1 -1
- package/dist/story-generator/productionGitignoreManager.js +6 -0
- package/dist/story-generator/productionGitignoreManager.js.map +1 -0
- package/dist/story-generator/promptGenerator.js.map +1 -0
- package/dist/story-generator/providerPresets.d.ts +54 -0
- package/dist/story-generator/providerPresets.d.ts.map +1 -0
- package/dist/story-generator/providerPresets.js +214 -0
- package/dist/story-generator/storyHistory.js.map +1 -0
- package/dist/story-generator/storySync.js.map +1 -0
- package/dist/story-generator/storyTracker.js.map +1 -0
- package/dist/story-generator/storyValidator.js.map +1 -0
- package/dist/story-generator/test_validation.d.ts +2 -0
- package/dist/story-generator/test_validation.d.ts.map +1 -0
- package/dist/story-generator/test_validation.js +51 -0
- package/dist/story-generator/universalDesignSystemAdapter.js.map +1 -0
- package/dist/story-generator/urlRedirectService.js.map +1 -0
- package/dist/story-generator/validateStory.js.map +1 -0
- package/dist/story-ui.config.js.map +1 -0
- package/dist/story-ui.config.loader.d.ts +36 -0
- package/dist/story-ui.config.loader.d.ts.map +1 -0
- package/dist/story-ui.config.loader.js +205 -0
- package/dist/story-ui.config.loader.js.map +1 -0
- package/dist/temp/package/templates/StoryUI/StoryUIPanel.js +807 -0
- package/dist/temp/package/templates/StoryUI/StoryUIPanel.stories.js +37 -0
- package/dist/temp/package/templates/StoryUI/index.js +2 -0
- package/dist/templates/StoryUI/StoryUIPanel.js.map +1 -0
- package/dist/templates/StoryUI/StoryUIPanel.stories.js.map +1 -0
- package/dist/templates/StoryUI/index.js.map +1 -0
- package/dist/templates/StoryUI/manager.d.ts +14 -0
- package/dist/templates/StoryUI/manager.d.ts.map +1 -0
- package/dist/templates/production-app/src/App.d.ts +10 -0
- package/dist/templates/production-app/src/App.d.ts.map +1 -0
- package/dist/templates/production-app/src/App.js +653 -0
- package/dist/templates/production-app/src/LivePreviewRenderer.d.ts +24 -0
- package/dist/templates/production-app/src/LivePreviewRenderer.d.ts.map +1 -0
- package/dist/templates/production-app/src/LivePreviewRenderer.js +199 -0
- package/dist/templates/production-app/src/componentRegistry.d.ts +20 -0
- package/dist/templates/production-app/src/componentRegistry.d.ts.map +1 -0
- package/dist/templates/production-app/src/componentRegistry.js +316 -0
- package/dist/templates/production-app/src/main.d.ts +9 -0
- package/dist/templates/production-app/src/main.d.ts.map +1 -0
- package/dist/templates/production-app/src/main.js +18 -0
- package/dist/templates/production-app/vite.config.d.ts +3 -0
- package/dist/templates/production-app/vite.config.d.ts.map +1 -0
- package/dist/templates/production-app/vite.config.js +71 -0
- package/dist/test-storybooks/angular-material-storybook/src/main.js +66 -0
- package/dist/test-storybooks/chakra-storybook/vite.config.js +6 -0
- package/dist/test-storybooks/mantine-storybook/vite.config.js +93 -0
- package/dist/test-storybooks/web-components-shoelace/vite.config.js +9 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/visual-builder/components/Canvas/Canvas.js +70 -0
- package/dist/visual-builder/components/Canvas/ComponentRenderer.js +545 -0
- package/dist/visual-builder/components/CodeExporter/CodeExporter.js +25 -0
- package/dist/visual-builder/components/CodeExporter/codeGenerator.js +99 -0
- package/dist/visual-builder/components/ComponentPalette/ComponentPalette.js +8 -0
- package/dist/visual-builder/components/ComponentPalette/ComponentPaletteItem.js +51 -0
- package/dist/visual-builder/components/EmbeddedVisualBuilder.js +107 -0
- package/dist/visual-builder/components/PropertyEditor/PropertyEditor.js +16 -0
- package/dist/visual-builder/components/PropertyEditor/PropertyForm.js +88 -0
- package/dist/visual-builder/components/PropertyEditor/SpacingControl.js +145 -0
- package/dist/visual-builder/components/PropertyEditor/SpacingEditor.js +32 -0
- package/dist/visual-builder/components/StoryManager/SaveOnlyManager.js +94 -0
- package/dist/visual-builder/components/StoryManager/StoryManager.js +68 -0
- package/dist/visual-builder/components/StoryManager/index.js +1 -0
- package/dist/visual-builder/components/VisualBuilder.js +256 -0
- package/dist/visual-builder/config/componentRegistry.js +1758 -0
- package/dist/visual-builder/decorators/VisualBuilderDecorator.js +184 -0
- package/dist/visual-builder/example-integration.js +59 -0
- package/dist/visual-builder/example.js +23 -0
- package/dist/visual-builder/hooks/useDragAndDrop.js +137 -0
- package/dist/visual-builder/hooks/useSelection.js +27 -0
- package/dist/visual-builder/index.js +7 -0
- package/dist/visual-builder/store/visualBuilderStore.js +305 -0
- package/dist/visual-builder/types/index.js +1 -0
- package/dist/visual-builder/utils/__tests__/storyFileUpdater.test.js +145 -0
- package/dist/visual-builder/utils/aiParser.js +336 -0
- package/dist/visual-builder/utils/componentTreeUtils.js +111 -0
- package/dist/visual-builder/utils/parserValidation.js +122 -0
- package/dist/visual-builder/utils/storyFileManager.js +73 -0
- package/dist/visual-builder/utils/storyFileUpdater.js +326 -0
- package/dist/visual-builder/utils/storyNameExtraction.test.js +211 -0
- package/dist/visual-builder/utils/storyPersistence.js +180 -0
- package/dist/visual-builder/utils/storyToBuilder.js +813 -0
- package/package.json +1 -1
package/dist/cli/deploy.js
CHANGED
|
@@ -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.
|
|
377
|
-
console.log('
|
|
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
|
|
815
|
+
// Write comprehensive documentation to a TypeScript file
|
|
383
816
|
const considerationsContent = `/**
|
|
384
|
-
* AI
|
|
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
|
-
*
|
|
387
|
-
*
|
|
388
|
-
*
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
397
|
-
|
|
398
|
-
|
|
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'), `
|
|
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
|
-
//
|
|
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
|
|
662
|
-
console.log('
|
|
663
|
-
console.log('
|
|
664
|
-
console.log('
|
|
665
|
-
console.log(' --
|
|
666
|
-
console.log('
|
|
667
|
-
console.log(' --platform <name>
|
|
668
|
-
console.log(' --
|
|
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(
|
|
673
|
-
console.log(' # Deploy
|
|
674
|
-
console.log(' npx story-ui deploy --
|
|
675
|
-
console.log(' # Deploy
|
|
676
|
-
console.log(' npx story-ui deploy --
|
|
677
|
-
console.log(' # Deploy
|
|
678
|
-
console.log(' npx story-ui deploy --
|
|
679
|
-
console.log(' #
|
|
680
|
-
console.log(' npx story-ui deploy --
|
|
681
|
-
console.log('
|
|
682
|
-
console.log('─'.repeat(
|
|
683
|
-
console.log('
|
|
684
|
-
console.log('
|
|
685
|
-
console.log('
|
|
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('
|
|
688
|
-
console.log('─'.repeat(
|
|
689
|
-
console.log(' --
|
|
690
|
-
console.log(' --
|
|
691
|
-
console.log('
|
|
692
|
-
console.log('
|
|
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 --
|
|
1190
|
+
console.log(' These Cloudflare Edge options are deprecated. Use --live instead.\n');
|
|
695
1191
|
}
|
|
696
1192
|
}
|