@rovela-ai/sdk 0.19.4 → 0.19.6

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 (236) hide show
  1. package/dist/admin/components/AdminPageHeader.d.ts.map +1 -1
  2. package/dist/admin/components/AdminPageHeader.js +9 -2
  3. package/dist/admin/components/AdminPageHeader.js.map +1 -1
  4. package/dist/admin/components/AdminUserMenu.d.ts.map +1 -1
  5. package/dist/admin/components/AdminUserMenu.js +2 -1
  6. package/dist/admin/components/AdminUserMenu.js.map +1 -1
  7. package/dist/admin/components/CustomerDetails.d.ts.map +1 -1
  8. package/dist/admin/components/CustomerDetails.js +2 -1
  9. package/dist/admin/components/CustomerDetails.js.map +1 -1
  10. package/dist/admin/components/EmailsManager.d.ts.map +1 -1
  11. package/dist/admin/components/EmailsManager.js +2 -1
  12. package/dist/admin/components/EmailsManager.js.map +1 -1
  13. package/dist/admin/components/LowStockAlert.d.ts.map +1 -1
  14. package/dist/admin/components/LowStockAlert.js +3 -2
  15. package/dist/admin/components/LowStockAlert.js.map +1 -1
  16. package/dist/admin/components/OrderDetails.d.ts.map +1 -1
  17. package/dist/admin/components/OrderDetails.js +2 -1
  18. package/dist/admin/components/OrderDetails.js.map +1 -1
  19. package/dist/admin/components/ProductTable.d.ts.map +1 -1
  20. package/dist/admin/components/ProductTable.js +4 -3
  21. package/dist/admin/components/ProductTable.js.map +1 -1
  22. package/dist/admin/components/RecentOrders.d.ts.map +1 -1
  23. package/dist/admin/components/RecentOrders.js +2 -1
  24. package/dist/admin/components/RecentOrders.js.map +1 -1
  25. package/dist/admin/components/SEOPreview.d.ts +2 -8
  26. package/dist/admin/components/SEOPreview.d.ts.map +1 -1
  27. package/dist/admin/components/SEOPreview.js +32 -5
  28. package/dist/admin/components/SEOPreview.js.map +1 -1
  29. package/dist/admin/components/SecondaryMetricsRow.d.ts.map +1 -1
  30. package/dist/admin/components/SecondaryMetricsRow.js +3 -2
  31. package/dist/admin/components/SecondaryMetricsRow.js.map +1 -1
  32. package/dist/admin/components/StatsCards.d.ts.map +1 -1
  33. package/dist/admin/components/StatsCards.js +2 -1
  34. package/dist/admin/components/StatsCards.js.map +1 -1
  35. package/docs/changelog/README.md +53 -0
  36. package/docs/changelog/epoch-01-chrome-consent.md +63 -0
  37. package/docs/changelog/epoch-02-platform-commerce.md +108 -0
  38. package/docs/changelog/epoch-03-i18n-files.md +72 -0
  39. package/docs/changelog/epoch-04-emails.md +65 -0
  40. package/docs/changelog/epoch-05-admin-experience.md +98 -0
  41. package/docs/changelog/epoch-06-mobile-integrity.md +92 -0
  42. package/docs/design/admin-ledger-visual-universe.html +1961 -0
  43. package/docs/design/admin-sidebar-and-band.html +542 -0
  44. package/package.json +3 -1
  45. package/templates/store-template/.claude/skills/add-section/SKILL.md +438 -0
  46. package/templates/store-template/.claude/skills/build-feature/SKILL.md +201 -0
  47. package/templates/store-template/.claude/skills/customize-theme/SKILL.md +167 -0
  48. package/templates/store-template/.claude/skills/debug-errors/SKILL.md +68 -0
  49. package/templates/store-template/.claude/skills/frontend-design/SKILL.md +176 -0
  50. package/templates/store-template/.claude/skills/generate-images/SKILL.md +115 -0
  51. package/templates/store-template/.claude/skills/manage-products/SKILL.md +187 -0
  52. package/templates/store-template/.claude/skills/override-sdk-component/SKILL.md +154 -0
  53. package/templates/store-template/.env.example +50 -0
  54. package/templates/store-template/.mcp.json +8 -0
  55. package/templates/store-template/.rovela/blueprint.example.json +190 -0
  56. package/templates/store-template/CLAUDE.md +14 -0
  57. package/templates/store-template/app/LayoutContent.tsx +106 -0
  58. package/templates/store-template/app/[...path]/page.tsx +79 -0
  59. package/templates/store-template/app/account/addresses/page.tsx +45 -0
  60. package/templates/store-template/app/account/layout.tsx +17 -0
  61. package/templates/store-template/app/account/orders/[id]/invoice/page.tsx +277 -0
  62. package/templates/store-template/app/account/orders/[id]/page.tsx +725 -0
  63. package/templates/store-template/app/account/orders/page.tsx +153 -0
  64. package/templates/store-template/app/account/page.tsx +184 -0
  65. package/templates/store-template/app/account/profile/page.tsx +434 -0
  66. package/templates/store-template/app/admin/(dashboard)/account/page.tsx +16 -0
  67. package/templates/store-template/app/admin/(dashboard)/analytics/events/page.tsx +14 -0
  68. package/templates/store-template/app/admin/(dashboard)/analytics/layout.tsx +48 -0
  69. package/templates/store-template/app/admin/(dashboard)/analytics/page.tsx +15 -0
  70. package/templates/store-template/app/admin/(dashboard)/analytics/visitors/page.tsx +14 -0
  71. package/templates/store-template/app/admin/(dashboard)/categories/[id]/page.tsx +38 -0
  72. package/templates/store-template/app/admin/(dashboard)/categories/new/page.tsx +35 -0
  73. package/templates/store-template/app/admin/(dashboard)/categories/page.tsx +223 -0
  74. package/templates/store-template/app/admin/(dashboard)/customers/[id]/page.tsx +26 -0
  75. package/templates/store-template/app/admin/(dashboard)/customers/page.tsx +33 -0
  76. package/templates/store-template/app/admin/(dashboard)/discounts/page.tsx +16 -0
  77. package/templates/store-template/app/admin/(dashboard)/emails/page.tsx +16 -0
  78. package/templates/store-template/app/admin/(dashboard)/files/page.tsx +16 -0
  79. package/templates/store-template/app/admin/(dashboard)/layout.tsx +44 -0
  80. package/templates/store-template/app/admin/(dashboard)/loading.tsx +88 -0
  81. package/templates/store-template/app/admin/(dashboard)/locations/page.tsx +16 -0
  82. package/templates/store-template/app/admin/(dashboard)/orders/[id]/page.tsx +66 -0
  83. package/templates/store-template/app/admin/(dashboard)/orders/page.tsx +26 -0
  84. package/templates/store-template/app/admin/(dashboard)/page.tsx +146 -0
  85. package/templates/store-template/app/admin/(dashboard)/payments/page.tsx +15 -0
  86. package/templates/store-template/app/admin/(dashboard)/products/[id]/page.tsx +38 -0
  87. package/templates/store-template/app/admin/(dashboard)/products/new/page.tsx +35 -0
  88. package/templates/store-template/app/admin/(dashboard)/products/page.tsx +31 -0
  89. package/templates/store-template/app/admin/(dashboard)/settings/page.tsx +46 -0
  90. package/templates/store-template/app/admin/(dashboard)/shipping/page.tsx +15 -0
  91. package/templates/store-template/app/admin/(dashboard)/tax/page.tsx +15 -0
  92. package/templates/store-template/app/admin/(dashboard)/users/[id]/page.tsx +114 -0
  93. package/templates/store-template/app/admin/(dashboard)/users/page.tsx +16 -0
  94. package/templates/store-template/app/admin/accept-invite/page.tsx +36 -0
  95. package/templates/store-template/app/admin/forgot-password/page.tsx +13 -0
  96. package/templates/store-template/app/admin/layout.tsx +47 -0
  97. package/templates/store-template/app/admin/login/page.tsx +528 -0
  98. package/templates/store-template/app/admin/reset-password/page.tsx +36 -0
  99. package/templates/store-template/app/api/account/addresses/[id]/route.ts +10 -0
  100. package/templates/store-template/app/api/account/addresses/route.ts +10 -0
  101. package/templates/store-template/app/api/account/change-password/route.ts +107 -0
  102. package/templates/store-template/app/api/account/orders/[id]/refund/route.ts +11 -0
  103. package/templates/store-template/app/api/account/orders/[id]/return/route.ts +14 -0
  104. package/templates/store-template/app/api/account/orders/[id]/route.ts +42 -0
  105. package/templates/store-template/app/api/account/orders/route.ts +29 -0
  106. package/templates/store-template/app/api/account/profile/route.ts +165 -0
  107. package/templates/store-template/app/api/admin/accept-invite/route.ts +11 -0
  108. package/templates/store-template/app/api/admin/analytics/events/route.ts +9 -0
  109. package/templates/store-template/app/api/admin/analytics/route.ts +10 -0
  110. package/templates/store-template/app/api/admin/analytics/visitors/route.ts +9 -0
  111. package/templates/store-template/app/api/admin/branding/favicon/route.ts +9 -0
  112. package/templates/store-template/app/api/admin/branding/logo/route.ts +9 -0
  113. package/templates/store-template/app/api/admin/categories/[id]/route.ts +9 -0
  114. package/templates/store-template/app/api/admin/categories/route.ts +9 -0
  115. package/templates/store-template/app/api/admin/check/route.ts +10 -0
  116. package/templates/store-template/app/api/admin/customer-groups/[id]/route.ts +10 -0
  117. package/templates/store-template/app/api/admin/customer-groups/route.ts +10 -0
  118. package/templates/store-template/app/api/admin/customers/[id]/addresses/[addressId]/route.ts +15 -0
  119. package/templates/store-template/app/api/admin/customers/[id]/addresses/route.ts +15 -0
  120. package/templates/store-template/app/api/admin/customers/[id]/route.ts +11 -0
  121. package/templates/store-template/app/api/admin/customers/bulk/route.ts +8 -0
  122. package/templates/store-template/app/api/admin/customers/route.ts +9 -0
  123. package/templates/store-template/app/api/admin/discounts/[id]/route.ts +11 -0
  124. package/templates/store-template/app/api/admin/discounts/route.ts +10 -0
  125. package/templates/store-template/app/api/admin/emails/preview/route.ts +4 -0
  126. package/templates/store-template/app/api/admin/emails/route.ts +5 -0
  127. package/templates/store-template/app/api/admin/emails/test/route.ts +4 -0
  128. package/templates/store-template/app/api/admin/files/route.ts +8 -0
  129. package/templates/store-template/app/api/admin/forgot-password/route.ts +7 -0
  130. package/templates/store-template/app/api/admin/linked-customer/route.ts +11 -0
  131. package/templates/store-template/app/api/admin/locations/[id]/route.ts +10 -0
  132. package/templates/store-template/app/api/admin/locations/route.ts +10 -0
  133. package/templates/store-template/app/api/admin/me/password/route.ts +13 -0
  134. package/templates/store-template/app/api/admin/me/route.ts +11 -0
  135. package/templates/store-template/app/api/admin/orders/[id]/refund/route.ts +7 -0
  136. package/templates/store-template/app/api/admin/orders/[id]/return/approve/route.ts +7 -0
  137. package/templates/store-template/app/api/admin/orders/[id]/return/reject/route.ts +7 -0
  138. package/templates/store-template/app/api/admin/orders/[id]/route.ts +9 -0
  139. package/templates/store-template/app/api/admin/orders/[id]/ship-with-shippo/route.ts +6 -0
  140. package/templates/store-template/app/api/admin/orders/[id]/shippo-rates/route.ts +6 -0
  141. package/templates/store-template/app/api/admin/orders/bulk/route.ts +8 -0
  142. package/templates/store-template/app/api/admin/orders/route.ts +9 -0
  143. package/templates/store-template/app/api/admin/payment-methods/[id]/route.ts +10 -0
  144. package/templates/store-template/app/api/admin/payment-methods/route.ts +10 -0
  145. package/templates/store-template/app/api/admin/products/[id]/route.ts +9 -0
  146. package/templates/store-template/app/api/admin/products/bulk/route.ts +9 -0
  147. package/templates/store-template/app/api/admin/products/route.ts +9 -0
  148. package/templates/store-template/app/api/admin/products/stats/route.ts +10 -0
  149. package/templates/store-template/app/api/admin/reset-password/route.ts +10 -0
  150. package/templates/store-template/app/api/admin/settings/route.ts +11 -0
  151. package/templates/store-template/app/api/admin/setup/route.ts +10 -0
  152. package/templates/store-template/app/api/admin/setup-guide/manual-mark/route.ts +13 -0
  153. package/templates/store-template/app/api/admin/setup-guide/route.ts +10 -0
  154. package/templates/store-template/app/api/admin/shipping/carriers/[id]/route.ts +9 -0
  155. package/templates/store-template/app/api/admin/shipping/carriers/route.ts +9 -0
  156. package/templates/store-template/app/api/admin/shipping/rates/[id]/route.ts +9 -0
  157. package/templates/store-template/app/api/admin/shipping/rates/route.ts +9 -0
  158. package/templates/store-template/app/api/admin/shipping/shippo/api-key/route.ts +1 -0
  159. package/templates/store-template/app/api/admin/shipping/shippo/validate/route.ts +1 -0
  160. package/templates/store-template/app/api/admin/shipping/zones/[id]/route.ts +9 -0
  161. package/templates/store-template/app/api/admin/shipping/zones/route.ts +9 -0
  162. package/templates/store-template/app/api/admin/stats/route.ts +9 -0
  163. package/templates/store-template/app/api/admin/stripe-status/route.ts +1 -0
  164. package/templates/store-template/app/api/admin/tax-zones/[id]/route.ts +7 -0
  165. package/templates/store-template/app/api/admin/tax-zones/route.ts +7 -0
  166. package/templates/store-template/app/api/admin/users/[id]/route.ts +14 -0
  167. package/templates/store-template/app/api/admin/users/route.ts +12 -0
  168. package/templates/store-template/app/api/admin-auth/[...nextauth]/route.ts +17 -0
  169. package/templates/store-template/app/api/analytics/track/route.ts +12 -0
  170. package/templates/store-template/app/api/auth/[...nextauth]/route.ts +19 -0
  171. package/templates/store-template/app/api/auth/forgot-password/route.ts +9 -0
  172. package/templates/store-template/app/api/auth/register/route.ts +9 -0
  173. package/templates/store-template/app/api/auth/resend-verification/route.ts +9 -0
  174. package/templates/store-template/app/api/auth/reset-password/route.ts +10 -0
  175. package/templates/store-template/app/api/auth/verify-email/route.ts +10 -0
  176. package/templates/store-template/app/api/categories/route.ts +10 -0
  177. package/templates/store-template/app/api/checkout/countries/route.ts +7 -0
  178. package/templates/store-template/app/api/checkout/discount/route.ts +9 -0
  179. package/templates/store-template/app/api/checkout/manual/route.ts +10 -0
  180. package/templates/store-template/app/api/checkout/payment-methods/route.ts +8 -0
  181. package/templates/store-template/app/api/checkout/pickup-locations/route.ts +8 -0
  182. package/templates/store-template/app/api/checkout/route.ts +10 -0
  183. package/templates/store-template/app/api/checkout/shipping/route.ts +21 -0
  184. package/templates/store-template/app/api/checkout/status/route.ts +10 -0
  185. package/templates/store-template/app/api/contact/route.ts +164 -0
  186. package/templates/store-template/app/api/media/presign/route.ts +7 -0
  187. package/templates/store-template/app/api/media/route.ts +7 -0
  188. package/templates/store-template/app/api/products/[slug]/route.ts +10 -0
  189. package/templates/store-template/app/api/products/route.ts +10 -0
  190. package/templates/store-template/app/api/store/settings/route.ts +12 -0
  191. package/templates/store-template/app/api/webhooks/stripe/route.ts +63 -0
  192. package/templates/store-template/app/auth/forgot-password/page.tsx +38 -0
  193. package/templates/store-template/app/auth/layout.tsx +17 -0
  194. package/templates/store-template/app/auth/reset-password/page.tsx +81 -0
  195. package/templates/store-template/app/auth/signin/page.tsx +62 -0
  196. package/templates/store-template/app/auth/signup/page.tsx +38 -0
  197. package/templates/store-template/app/auth/verify-email/page.tsx +185 -0
  198. package/templates/store-template/app/cart/page.tsx +137 -0
  199. package/templates/store-template/app/checkout/page.tsx +88 -0
  200. package/templates/store-template/app/checkout/success/page.tsx +50 -0
  201. package/templates/store-template/app/contact/layout.tsx +24 -0
  202. package/templates/store-template/app/contact/page.tsx +321 -0
  203. package/templates/store-template/app/faq/page.tsx +153 -0
  204. package/templates/store-template/app/globals.css +99 -0
  205. package/templates/store-template/app/layout.tsx +269 -0
  206. package/templates/store-template/app/not-found.tsx +35 -0
  207. package/templates/store-template/app/page.tsx +23 -0
  208. package/templates/store-template/app/privacy/page.tsx +281 -0
  209. package/templates/store-template/app/products/[slug]/ProductDetailClient.tsx +179 -0
  210. package/templates/store-template/app/products/[slug]/page.tsx +149 -0
  211. package/templates/store-template/app/products/layout.tsx +26 -0
  212. package/templates/store-template/app/products/page.tsx +102 -0
  213. package/templates/store-template/app/robots.ts +25 -0
  214. package/templates/store-template/app/sitemap.ts +76 -0
  215. package/templates/store-template/app/terms/page.tsx +313 -0
  216. package/templates/store-template/components/PathSyncBridge.tsx +61 -0
  217. package/templates/store-template/components/Providers.tsx +37 -0
  218. package/templates/store-template/components/layout/Footer.tsx +150 -0
  219. package/templates/store-template/components/layout/Header.tsx +162 -0
  220. package/templates/store-template/components/sections/.gitkeep +7 -0
  221. package/templates/store-template/components/sections/CTA.tsx +51 -0
  222. package/templates/store-template/components/sections/Features.tsx +91 -0
  223. package/templates/store-template/components/sections/Hero.tsx +85 -0
  224. package/templates/store-template/eslint.config.mjs +18 -0
  225. package/templates/store-template/lib/store-config.ts +77 -0
  226. package/templates/store-template/lib/store-policy.ts +68 -0
  227. package/templates/store-template/lib/utils.ts +21 -0
  228. package/templates/store-template/next-env.d.ts +6 -0
  229. package/templates/store-template/next.config.js +105 -0
  230. package/templates/store-template/package.json +32 -0
  231. package/templates/store-template/postcss.config.js +6 -0
  232. package/templates/store-template/proxy.ts +150 -0
  233. package/templates/store-template/public/rovela-logo.png +0 -0
  234. package/templates/store-template/tailwind.config.ts +74 -0
  235. package/templates/store-template/tsconfig.json +41 -0
  236. package/templates/store-template/types/next-auth.d.ts +32 -0
@@ -0,0 +1,187 @@
1
+ ---
2
+ name: manage-products
3
+ description: Use when the user asks about products, inventory, orders, customers, or any database operation. Covers postgres-mcp queries, table schemas, and JSONB patterns.
4
+ ---
5
+
6
+ # Database & Product Management
7
+
8
+ ## MCP Tools
9
+
10
+ | Tool | Purpose |
11
+ |------|---------|
12
+ | `execute_sql` | Run SELECT, INSERT, UPDATE, DELETE queries |
13
+ | `list_objects` | View all tables in the database |
14
+ | `get_object_details` | Get column definitions for a table |
15
+
16
+ Usage: `nextjs_call` with `port="3000"` and `toolName="execute_sql"`
17
+
18
+ ## Workflow
19
+
20
+ 1. Use `list_objects` to see available tables
21
+ 2. Use `get_object_details` to understand table columns
22
+ 3. Test SELECT queries before running mutations
23
+ 4. Always use `RETURNING *` for INSERT/UPDATE
24
+ 5. Handle errors gracefully in the UI
25
+
26
+ ## Core Tables
27
+
28
+ | Table | Key Columns |
29
+ |-------|-------------|
30
+ | `products` | id, name, slug, price, status (`draft`/`active`/`archived`), categoryId, hasVariants, images (JSONB string[]), videos (JSONB string[]), metafields (JSONB key/label/value/type), translations (JSONB per-locale name/description) |
31
+ | `product_variants` | id, productId (CASCADE), sku, name, price, inventory, attributes (JSONB), image, video |
32
+ | `categories` | id, name, slug, parentId (self-ref), order, translations (JSONB) |
33
+ | `orders` | id, customerId, email, status, total, currency (ISO snapshot — display orders in THIS currency), refundAmount, returnReason, shippingAddress (JSONB) |
34
+ | `order_items` | id, orderId (CASCADE), productId, variantId, name, price, quantity |
35
+ | `customers` | id, email (unique), name, passwordHash, phone, groupId, locale, stripeCustomerId, emailVerified |
36
+ | `store_settings` | id, storeName, storeEmail, storeCurrency, storeTimezone, storeCountry, defaultLocale, enabledLocales, taxIncludedInPrices, shippingMode |
37
+
38
+ **Money contract (load-bearing)**: `price`, `total` etc. are DECIMAL CURRENCY UNITS — `29.99`, NEVER cents (`2999`). No ×100/÷100 anywhere except the Stripe API boundary. On multilingual stores (`enabled_locales`), catalog content can carry per-locale `translations` — when editing names/descriptions, keep every enabled locale in sync (CLAUDE.md §5.5).
39
+
40
+ ## Order Status Flow
41
+
42
+ ```
43
+ pending → paid → shipped → delivered
44
+ ↘ cancelled
45
+ ↘ refunded
46
+ ↘ return_requested
47
+ ```
48
+
49
+ ## Common Queries
50
+
51
+ ```sql
52
+ -- Get active products
53
+ SELECT * FROM products WHERE status = 'active'
54
+
55
+ -- Get product with variants
56
+ SELECT p.*, json_agg(pv.*) as variants
57
+ FROM products p
58
+ LEFT JOIN product_variants pv ON pv.product_id = p.id
59
+ WHERE p.slug = 'product-slug' GROUP BY p.id
60
+
61
+ -- Update product price (DECIMAL currency units — 29.99, never cents)
62
+ UPDATE products SET price = 29.99 WHERE id = 'uuid' RETURNING *
63
+
64
+ -- Add a product
65
+ INSERT INTO products (name, slug, price, status, description)
66
+ VALUES ('Product Name', 'product-name', 29.99, 'active', 'Description')
67
+ RETURNING *
68
+
69
+ -- Update order status
70
+ UPDATE orders SET status = 'shipped', updated_at = NOW() WHERE id = 'uuid' RETURNING *
71
+
72
+ -- Get store stats
73
+ SELECT COUNT(*) as total, SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active
74
+ FROM products
75
+ ```
76
+
77
+ ## JSONB Patterns
78
+
79
+ ### Product Media (Images & Videos)
80
+ ```sql
81
+ -- Both images and videos are stored as JSONB arrays of plain URL strings.
82
+ -- The storefront detects video vs image at render time by URL extension
83
+ -- (`.mp4` / `.webm` / `.mov` → <video>, otherwise <img>).
84
+
85
+ UPDATE products
86
+ SET images = '["https://.../shirt-front.webp", "https://.../shirt-back.webp"]'::jsonb,
87
+ videos = '["https://.../shirt-demo.mp4"]'::jsonb
88
+ WHERE id = 'uuid' RETURNING *
89
+
90
+ -- Query products with their primary image
91
+ SELECT id, name, images->>0 AS main_image FROM products
92
+
93
+ -- Variant-specific image (swatch) and video (optional demo)
94
+ UPDATE product_variants
95
+ SET image = 'https://.../red-swatch.webp',
96
+ video = 'https://.../red-demo.mp4'
97
+ WHERE id = 'uuid' RETURNING *
98
+ ```
99
+
100
+ ### Variant Attributes
101
+ ```sql
102
+ -- Attributes stored as JSONB object
103
+ INSERT INTO product_variants (product_id, name, sku, price, inventory, attributes)
104
+ VALUES ('uuid', 'Large / Blue', 'SKU-LG-BL', 2999, 50, '{"size": "Large", "color": "Blue"}'::jsonb)
105
+ RETURNING *
106
+ ```
107
+
108
+ ## Full product creation recipe (single-call from a feature card)
109
+
110
+ When a feature card asks you to create one product (e.g. "Create a product"
111
+ card), follow this exact recipe so the row is consistent with every other
112
+ product in the catalog. The card passes `name`, `price`, `description?`,
113
+ `hasVariants`, and the R2 image URL in `<inputs>`. You provide everything
114
+ else from defaults.
115
+
116
+ ```sql
117
+ -- 1. Pick or create a category (prefer existing).
118
+ SELECT id, name, slug FROM categories;
119
+ -- If nothing fits:
120
+ -- INSERT INTO categories (name, slug) VALUES ('Apparel', 'apparel') RETURNING id, slug;
121
+
122
+ -- 2. INSERT the product. Required defaults:
123
+ -- status='active', has_variants=<from inputs>, inventory=100,
124
+ -- track_inventory=true, images=JSONB array with the R2 URL.
125
+ INSERT INTO products (
126
+ name, slug, description, price, status, has_variants,
127
+ inventory, track_inventory, images, category_id
128
+ ) VALUES (
129
+ 'Single Origin Espresso',
130
+ 'single-origin-espresso', -- lowercase-kebab from name
131
+ '...2-3 sentence brand-voice description...',
132
+ 29.99,
133
+ 'active',
134
+ false,
135
+ 100,
136
+ true,
137
+ '["https://r2.../stores/{id}/generated/products/...webp"]'::jsonb,
138
+ '<category_id>'
139
+ ) RETURNING id, slug;
140
+
141
+ -- 3. Default variant (required even when has_variants=false — the cart
142
+ -- needs SOMETHING addable to it).
143
+ INSERT INTO product_variants (
144
+ product_id, name, sku, price, inventory, attributes
145
+ ) VALUES (
146
+ '<product_id from step 2>',
147
+ 'Default',
148
+ 'single-origin-espresso-default', -- slug-default
149
+ 29.99,
150
+ 100,
151
+ '{}'::jsonb
152
+ ) RETURNING id;
153
+
154
+ -- 4. If has_variants=true, INSERT a sensible scaffold instead of the default.
155
+ -- Examples by product type:
156
+ -- - Apparel: name in (S, M, L), attributes {"size": "S"} etc.
157
+ -- - Footwear: name in (38, 39, 40, 41, 42), attributes {"size": "40"}
158
+ -- - Anything else: 2 sensible color/size presets you infer from the name.
159
+ -- Each variant: same price as the parent, inventory split evenly,
160
+ -- sku = slug-{lowercased attribute value}.
161
+ ```
162
+
163
+ ### Slug rules
164
+
165
+ - Lowercase, kebab-case, ASCII only
166
+ - Strip punctuation other than hyphens
167
+ - Truncate to 60 chars
168
+ - Must be unique against `products.slug` — append `-2`, `-3`, etc. if collision
169
+
170
+ ### Description fallback
171
+
172
+ If the card didn't supply a description, write 2-3 sentences that match the
173
+ store's brand voice (read CLAUDE.md `<brand_voice>` if present). Specifics over
174
+ fluff — never "high-quality product for discerning customers".
175
+
176
+ ### After insert
177
+
178
+ Verify the product is reachable: the storefront serves `/products/<slug>`
179
+ once the row is `status='active'`. A quick `SELECT slug FROM products WHERE
180
+ id = $1` then `curl localhost:3000/products/<slug>` confirms.
181
+
182
+ ## Safety Rules
183
+
184
+ - Use `status = 'archived'` instead of DELETE for products (preserves order history)
185
+ - Always verify WHERE clauses before UPDATE/DELETE
186
+ - Handle NULL `customer_id` for guest checkout orders
187
+ - Test SELECT first, then mutate
@@ -0,0 +1,154 @@
1
+ ---
2
+ name: override-sdk-component
3
+ description: Use when the user wants to customize cart, checkout, auth, product, or any SDK component behavior. Covers the copy-and-modify pattern for @rovela-ai/sdk components.
4
+ ---
5
+
6
+ # Override SDK Components
7
+
8
+ ## Why Override (Not Edit)
9
+
10
+ Only `/app` directory is deployed to Vercel — `node_modules` is rebuilt from `package.json`.
11
+ Changes to files inside `node_modules/@rovela-ai/sdk/` will be lost on deployment.
12
+
13
+ ## Step-by-Step Process
14
+
15
+ ### 1. Find the SDK Source
16
+
17
+ Read the component source from `node_modules/@rovela-ai/sdk/dist/`:
18
+
19
+ ```bash
20
+ # Example: find CartIcon source
21
+ cat node_modules/@rovela-ai/sdk/dist/cart/components/CartIcon.js
22
+ ```
23
+
24
+ ### 2. Create Your Override
25
+
26
+ Copy the component logic into `/app/components/`:
27
+
28
+ ```tsx
29
+ // /app/components/CartIcon.tsx
30
+ 'use client';
31
+
32
+ // Copy SDK component code here, then modify
33
+ export default function CartIcon() {
34
+ // Your customized version
35
+ }
36
+ ```
37
+
38
+ ### 3. Update Imports
39
+
40
+ Replace SDK imports with your local version wherever it's used:
41
+
42
+ ```tsx
43
+ // Before
44
+ import { CartIcon } from '@rovela-ai/sdk/cart';
45
+
46
+ // After
47
+ import CartIcon from '@/components/CartIcon';
48
+ ```
49
+
50
+ ### 4. Verify
51
+
52
+ Run error check (get_errors) to confirm no TypeScript issues.
53
+
54
+ ## Customization Pattern — variants, NOT inline overrides
55
+
56
+ When the override needs visual customization (different colors, sizes, shadows, hover states), add a new `cva` variant to the component file. Do NOT inline-override with raw classes at call sites.
57
+
58
+ ### ✅ Correct — new variant inside the component
59
+
60
+ ```tsx
61
+ // /app/components/AddToCartButton.tsx
62
+ import { cva } from 'class-variance-authority';
63
+
64
+ const addToCartVariants = cva(
65
+ "inline-flex items-center justify-center rounded-md font-medium transition-[var(--transition-smooth)]",
66
+ {
67
+ variants: {
68
+ variant: {
69
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
70
+ hero: "bg-[var(--gradient-primary)] text-primary-foreground shadow-[var(--shadow-elegant)] hover:shadow-[var(--shadow-glow)]",
71
+ editorial: "bg-transparent border border-foreground/20 text-foreground hover:bg-foreground hover:text-background",
72
+ outline: "border border-border bg-background hover:bg-muted",
73
+ },
74
+ size: {
75
+ default: "h-10 px-4",
76
+ sm: "h-9 px-3 text-sm",
77
+ lg: "h-12 px-6 text-base",
78
+ },
79
+ },
80
+ defaultVariants: { variant: "default", size: "default" },
81
+ },
82
+ );
83
+
84
+ export function AddToCartButton({ variant, size, ...props }) {
85
+ return <button className={addToCartVariants({ variant, size })} {...props} />;
86
+ }
87
+ ```
88
+
89
+ ```tsx
90
+ // At the call site — pick a variant, no raw classes
91
+ <AddToCartButton variant="hero">Shop now</AddToCartButton>
92
+ <AddToCartButton variant="editorial" size="lg">Browse collection</AddToCartButton>
93
+ ```
94
+
95
+ ### ❌ Wrong — inline overrides bypass the design system
96
+
97
+ ```tsx
98
+ // Don't do this — the design system loses its grip on the component
99
+ <AddToCartButton className="bg-primary/90 hover:bg-primary text-white px-6 shadow-xl">
100
+ Shop now
101
+ </AddToCartButton>
102
+ ```
103
+
104
+ Inline overrides rot. Variants compose. When the merchant later asks "make all the hero CTAs feel more premium," you update one variant in one file; with inline overrides, you'd hunt every call site.
105
+
106
+ ### Brand-expression tokens in variants
107
+
108
+ Use the platform-shipped brand-expression CSS variables (--gradient-primary, --shadow-elegant, --shadow-glow, --transition-smooth — see the `customize-theme` skill for the full scaffold) in your variants. They keep customizations brand-tinted instead of generic.
109
+
110
+ ## Available SDK Components by Module
111
+
112
+ ### Products (7 components)
113
+ `ProductCard`, `ProductGrid`, `ProductDetails`, `VariantSelector`, `ProductGallery`, `ProductSearch`, `ProductSort`
114
+
115
+ Import: `@rovela-ai/sdk/products`
116
+
117
+ ### Cart (6 components)
118
+ `CartDrawer`, `CartItem`, `CartSummary`, `CartIcon`, `AddToCartButton`, `QuantitySelector`
119
+
120
+ Import: `@rovela-ai/sdk/cart`
121
+
122
+ ### Checkout (6 components)
123
+ `CheckoutButton`, `CheckoutFlow`, `CheckoutSuccess`, `OrderSummary`, `ShippingForm`, `ShippingOptions`
124
+
125
+ Import: `@rovela-ai/sdk/checkout`
126
+
127
+ ### Auth (7 components)
128
+ `SignInForm`, `SignUpForm`, `ForgotPasswordForm`, `ResetPasswordForm`, `VerifyEmailNotice`, `UserMenu`, `AuthGuard`
129
+
130
+ Import: `@rovela-ai/sdk/auth`
131
+
132
+ ### Media (3 components)
133
+ `ImageUpload`, `DropZone`, `useUpload`
134
+
135
+ Import: `@rovela-ai/sdk/media`
136
+
137
+ ### Other modules (rarely overridden)
138
+ The SDK has 11 modules total. Also available: `core` (StoreSettingsProvider, i18n `useT`/`LocaleLink`, cookie consent), `analytics` (AnalyticsProvider + admin views), `emails` (templates + the merchant-editable layer — edited at `/admin/emails`, not by overriding components), `admin` (the dashboard kit — admin components are NOT candidates for copy-and-modify overrides; custom admin pages compose the kit per CLAUDE.md §7.6 instead), `shipping`, `theme`.
139
+
140
+ ## Common Overrides
141
+
142
+ | What to Customize | SDK Component | Override Location |
143
+ |-------------------|---------------|-------------------|
144
+ | Cart icon badge style | `CartIcon` | `/app/components/CartIcon.tsx` |
145
+ | Product card layout | `ProductCard` | `/app/components/ProductCard.tsx` |
146
+ | Add-to-cart animation | `AddToCartButton` | `/app/components/AddToCartButton.tsx` |
147
+ | Checkout form fields | `ShippingForm` | `/app/components/ShippingForm.tsx` |
148
+ | Sign-in page design | `SignInForm` | `/app/components/SignInForm.tsx` |
149
+
150
+ ## Important
151
+
152
+ - Keep the same props interface as the SDK component for drop-in replacement
153
+ - SDK hooks (`useCart`, `useAuth`, `useStoreSettings`) work in your overridden components
154
+ - Don't override Provider components (`CartProvider`, `StoreSettingsProvider`) — wrap or configure them instead
@@ -0,0 +1,50 @@
1
+ # =============================================================================
2
+ # Store Template Environment Variables
3
+ # =============================================================================
4
+ # Copy this file to .env.local and fill in the values
5
+
6
+ # =============================================================================
7
+ # Database (Neon PostgreSQL - unique per store via Neon branches)
8
+ # =============================================================================
9
+ DATABASE_URL="postgresql://user:password@host/database?sslmode=require"
10
+
11
+ # =============================================================================
12
+ # Authentication (NextAuth.js)
13
+ # =============================================================================
14
+ NEXTAUTH_SECRET="generate-a-secure-secret-here"
15
+ NEXTAUTH_URL="http://localhost:3000"
16
+
17
+ # =============================================================================
18
+ # Stripe Payments
19
+ # =============================================================================
20
+ # Platform credentials (from Rovela)
21
+ STRIPE_SECRET_KEY="sk_test_..."
22
+ NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="pk_test_..."
23
+ STRIPE_WEBHOOK_SECRET="whsec_..."
24
+
25
+ # Per-store connected account (set by platform)
26
+ STRIPE_CONNECTED_ACCOUNT_ID="acct_..."
27
+
28
+ # Optional: Platform fee percentage (default: 5)
29
+ STRIPE_PLATFORM_FEE_PERCENT="5"
30
+
31
+ # =============================================================================
32
+ # Email (Resend)
33
+ # =============================================================================
34
+ RESEND_API_KEY="re_..."
35
+ RESEND_FROM_EMAIL="store@yourdomain.com"
36
+
37
+ # Store branding and configuration
38
+ STORE_NAME="My Store"
39
+ STORE_CURRENCY="usd"
40
+ STORE_OWNER_EMAIL="owner@yourdomain.com"
41
+ SUPPORT_EMAIL="support@yourdomain.com"
42
+
43
+ # Optional branding for emails (future feature)
44
+ STORE_LOGO_URL="https://..."
45
+ STORE_ADDRESS="123 Main St, City, State 12345"
46
+
47
+ # =============================================================================
48
+ # Application URL
49
+ # =============================================================================
50
+ NEXT_PUBLIC_APP_URL="http://localhost:3000"
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "next-devtools": {
4
+ "command": "npx",
5
+ "args": ["-y", "next-devtools-mcp@latest"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,190 @@
1
+ {
2
+ "version": "3.0.0",
3
+
4
+ "store": {
5
+ "id": "00000000-0000-0000-0000-000000000000",
6
+ "name": "Example Store",
7
+ "slug": "example-store",
8
+ "description": "An example e-commerce store built with Rovela SDK",
9
+ "productType": "physical",
10
+ "businessStage": "startup",
11
+ "currency": "USD",
12
+ "locale": "en-US"
13
+ },
14
+
15
+ "theme": {
16
+ "inspiration": "stripe",
17
+ "personality": { "x": 0.2, "y": 0 },
18
+ "colors": {
19
+ "primary": {
20
+ "50": "#eff6ff",
21
+ "100": "#dbeafe",
22
+ "200": "#bfdbfe",
23
+ "300": "#93c5fd",
24
+ "400": "#60a5fa",
25
+ "500": "#3b82f6",
26
+ "600": "#2563eb",
27
+ "700": "#1d4ed8",
28
+ "800": "#1e40af",
29
+ "900": "#1e3a8a",
30
+ "950": "#172554"
31
+ },
32
+ "secondary": {
33
+ "50": "#f8fafc",
34
+ "100": "#f1f5f9",
35
+ "200": "#e2e8f0",
36
+ "300": "#cbd5e1",
37
+ "400": "#94a3b8",
38
+ "500": "#64748b",
39
+ "600": "#475569",
40
+ "700": "#334155",
41
+ "800": "#1e293b",
42
+ "900": "#0f172a",
43
+ "950": "#020617"
44
+ },
45
+ "accent": {
46
+ "50": "#faf5ff",
47
+ "100": "#f3e8ff",
48
+ "200": "#e9d5ff",
49
+ "300": "#d8b4fe",
50
+ "400": "#c084fc",
51
+ "500": "#a855f7",
52
+ "600": "#9333ea",
53
+ "700": "#7e22ce",
54
+ "800": "#6b21a8",
55
+ "900": "#581c87",
56
+ "950": "#3b0764"
57
+ },
58
+ "neutral": {
59
+ "50": "#fafafa",
60
+ "100": "#f4f4f5",
61
+ "200": "#e4e4e7",
62
+ "300": "#d4d4d8",
63
+ "400": "#a1a1aa",
64
+ "500": "#71717a",
65
+ "600": "#52525b",
66
+ "700": "#3f3f46",
67
+ "800": "#27272a",
68
+ "900": "#18181b",
69
+ "950": "#09090b"
70
+ },
71
+ "semantic": {
72
+ "success": "#22c55e",
73
+ "error": "#ef4444",
74
+ "warning": "#f59e0b",
75
+ "info": "#3b82f6"
76
+ }
77
+ },
78
+ "typography": {
79
+ "heading": { "name": "Inter", "weights": [500, 600, 700], "fallback": ["system-ui", "sans-serif"] },
80
+ "body": { "name": "Inter", "weights": [400, 500], "fallback": ["system-ui", "sans-serif"] },
81
+ "mono": { "name": "JetBrains Mono", "weights": [400], "fallback": ["monospace"] }
82
+ },
83
+ "spacing": "balanced",
84
+ "borderRadius": "rounded",
85
+ "animation": "smooth"
86
+ },
87
+
88
+ "brand": {
89
+ "tagline": "Your tagline here",
90
+ "uniqueValue": "Your unique value proposition",
91
+ "targetAudience": "Your target audience description",
92
+ "voice": {
93
+ "tone": ["professional", "friendly"],
94
+ "personality": ["trustworthy", "innovative"],
95
+ "vocabulary": {
96
+ "preferred": ["quality", "value", "service"],
97
+ "avoid": ["cheap", "basic"]
98
+ }
99
+ },
100
+ "imagery": {
101
+ "style": "photography",
102
+ "subjects": ["products", "lifestyle"],
103
+ "treatments": ["natural lighting", "clean backgrounds"],
104
+ "avoid": ["cluttered", "low quality"]
105
+ }
106
+ },
107
+
108
+ "homepage": {
109
+ "hero": {
110
+ "headline": "Welcome to Example Store",
111
+ "subheadline": "Discover amazing products for your everyday needs",
112
+ "cta": { "text": "Shop Now", "link": "/products" },
113
+ "imageQuery": "modern ecommerce shopping lifestyle",
114
+ "imageUrl": "https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=1080",
115
+ "layout": "center"
116
+ },
117
+ "features": {
118
+ "title": "Why Choose Us",
119
+ "subtitle": "We're committed to providing the best experience",
120
+ "items": [
121
+ {
122
+ "icon": "Truck",
123
+ "title": "Fast Shipping",
124
+ "description": "Get your orders delivered quickly and reliably"
125
+ },
126
+ {
127
+ "icon": "Shield",
128
+ "title": "Secure Payments",
129
+ "description": "Your transactions are protected with industry-standard security"
130
+ },
131
+ {
132
+ "icon": "HeadphonesIcon",
133
+ "title": "24/7 Support",
134
+ "description": "Our team is here to help whenever you need us"
135
+ }
136
+ ]
137
+ },
138
+ "cta": {
139
+ "headline": "Ready to Get Started?",
140
+ "description": "Join thousands of satisfied customers today",
141
+ "buttonText": "Browse Products",
142
+ "buttonLink": "/products"
143
+ }
144
+ },
145
+
146
+ "modules": {
147
+ "auth": {
148
+ "enabled": true,
149
+ "guestCheckout": true,
150
+ "customerAccounts": true
151
+ },
152
+ "products": {
153
+ "hasVariants": true,
154
+ "trackInventory": true
155
+ },
156
+ "orders": {
157
+ "processing": "instant",
158
+ "returnPolicy": "30-days",
159
+ "refundType": "full"
160
+ },
161
+ "shipping": {
162
+ "method": "carrier",
163
+ "rates": "flat",
164
+ "processingTime": "1-2-days"
165
+ },
166
+ "payments": {
167
+ "provider": "stripe",
168
+ "currency": "USD",
169
+ "taxHandling": "checkout"
170
+ },
171
+ "emails": {
172
+ "templates": ["order-confirmation", "shipping-update", "welcome", "password-reset"]
173
+ }
174
+ },
175
+
176
+ "seo": {
177
+ "title": "Example Store - Quality Products",
178
+ "description": "Shop amazing products at Example Store. Fast shipping, secure payments, and excellent customer service.",
179
+ "keywords": ["ecommerce", "online store", "shopping"]
180
+ },
181
+
182
+ "metadata": {
183
+ "blueprintVersion": "3.0.0",
184
+ "questionnaireId": "00000000-0000-0000-0000-000000000000",
185
+ "sdkVersion": "@rovela-ai/sdk@0.1.0",
186
+ "generatedBy": "example",
187
+ "generatedAt": "2025-11-29T00:00:00.000Z",
188
+ "confidence": 1.0
189
+ }
190
+ }
@@ -0,0 +1,14 @@
1
+ # Claude Agent Instructions
2
+
3
+ > **Note:** This file is a placeholder. During sandbox initialization, it gets replaced with
4
+ > project-specific instructions generated from the blueprint and questionnaire.
5
+
6
+ If you're seeing this message, the sandbox may not have been properly initialized.
7
+ Check that `/app/.rovela/blueprint.json` exists and contains valid blueprint data.
8
+
9
+ The actual instructions include:
10
+ - Store-specific configuration from blueprint
11
+ - Homepage section content to implement
12
+ - Theme and brand guidelines
13
+ - SDK usage documentation
14
+ - MCP tools reference (postgres-mcp, next-devtools, mcp-r2)