import { writeFileSync, mkdirSync } from 'fs'; import { join } from 'path'; const apps = [ { name: 'product-manager', title: 'Product Manager', icon: 'š¦', desc: 'Manage inventory and products' }, { name: 'inventory-manager', title: 'Inventory Manager', icon: 'š', desc: 'Track stock levels and transfers' }, { name: 'sales-terminal', title: 'Sales Terminal', icon: 'š³', desc: 'Quick POS sales interface' }, { name: 'customer-manager', title: 'Customer Manager', icon: 'š„', desc: 'Customer database and analytics' }, { name: 'order-manager', title: 'Order Manager', icon: 'š', desc: 'Purchase orders and receiving' }, { name: 'employee-manager', title: 'Employee Manager', icon: 'š¤', desc: 'Staff management and time tracking' }, { name: 'reports', title: 'Reports Viewer', icon: 'š', desc: 'Sales and performance reports' }, { name: 'category-manager', title: 'Category Manager', icon: 'šļø', desc: 'Product category hierarchy' }, { name: 'vendor-manager', title: 'Vendor Manager', icon: 'š¢', desc: 'Supplier management' }, { name: 'workorder-manager', title: 'Workorder Manager', icon: 'š§', desc: 'Service workorders' }, { name: 'register-manager', title: 'Register Manager', icon: 'š°', desc: 'POS register control' }, { name: 'transfer-manager', title: 'Transfer Manager', icon: 'š', desc: 'Inter-location transfers' }, { name: 'discount-manager', title: 'Discount Manager', icon: 'šļø', desc: 'Promotions and discounts' }, { name: 'analytics', title: 'Analytics Dashboard', icon: 'š', desc: 'Business intelligence' }, { name: 'quick-sale', title: 'Quick Sale', icon: 'ā”', desc: 'Fast checkout interface' }, { name: 'low-stock-alert', title: 'Low Stock Alerts', icon: 'ā ļø', desc: 'Inventory alerts' }, ]; const cssTemplate = `* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #0f0f0f; color: #e0e0e0; min-height: 100vh; } .app { max-width: 1400px; margin: 0 auto; padding: 2rem; } header { margin-bottom: 2rem; text-align: center; } header h1 { font-size: 2.5rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin-bottom: 0.5rem; } header p { color: #888; font-size: 1.1rem; } .content { background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); border: 1px solid #2a2a3e; border-radius: 12px; padding: 2rem; min-height: 400px; } .btn { padding: 0.8rem 1.5rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border: none; border-radius: 8px; color: white; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.3s; } .btn:hover { transform: scale(1.05); box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4); } table { width: 100%; border-collapse: collapse; margin-top: 1rem; } th, td { padding: 1rem; text-align: left; border-bottom: 1px solid #2a2a3e; } th { background: rgba(102, 126, 234, 0.1); color: #667eea; font-weight: 600; } input, select { width: 100%; padding: 0.8rem; background: #1a1a2e; border: 1px solid #2a2a3e; border-radius: 8px; color: #e0e0e0; font-size: 1rem; margin-bottom: 1rem; } input:focus, select:focus { outline: none; border-color: #667eea; } `; apps.forEach(app => { const dir = join(process.cwd(), 'src/ui', app.name); try { mkdirSync(dir, { recursive: true }); } catch {} const appTsx = `import { useState } from 'react'; import './app.css'; export default function ${app.title.replace(/\s+/g, '')}() { const [data, setData] = useState([]); return (
${app.desc}
MCP-powered ${app.title} - Coming soon!