@rovela-ai/sdk 0.19.3 → 0.19.5
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/dist/admin/server/admin-session.d.ts.map +1 -1
- package/dist/admin/server/admin-session.js +7 -0
- package/dist/admin/server/admin-session.js.map +1 -1
- package/dist/auth/server/customer-session.d.ts.map +1 -1
- package/dist/auth/server/customer-session.js +5 -0
- package/dist/auth/server/customer-session.js.map +1 -1
- package/dist/checkout/server/checkout-customer.d.ts.map +1 -1
- package/dist/checkout/server/checkout-customer.js +5 -0
- package/dist/checkout/server/checkout-customer.js.map +1 -1
- package/docs/changelog/README.md +53 -0
- package/docs/changelog/epoch-01-chrome-consent.md +63 -0
- package/docs/changelog/epoch-02-platform-commerce.md +108 -0
- package/docs/changelog/epoch-03-i18n-files.md +72 -0
- package/docs/changelog/epoch-04-emails.md +65 -0
- package/docs/changelog/epoch-05-admin-experience.md +98 -0
- package/docs/changelog/epoch-06-mobile-integrity.md +72 -0
- package/docs/design/admin-ledger-visual-universe.html +1961 -0
- package/docs/design/admin-sidebar-and-band.html +542 -0
- package/package.json +3 -1
- package/templates/store-template/.claude/skills/add-section/SKILL.md +438 -0
- package/templates/store-template/.claude/skills/build-feature/SKILL.md +201 -0
- package/templates/store-template/.claude/skills/customize-theme/SKILL.md +167 -0
- package/templates/store-template/.claude/skills/debug-errors/SKILL.md +68 -0
- package/templates/store-template/.claude/skills/frontend-design/SKILL.md +176 -0
- package/templates/store-template/.claude/skills/generate-images/SKILL.md +115 -0
- package/templates/store-template/.claude/skills/manage-products/SKILL.md +187 -0
- package/templates/store-template/.claude/skills/override-sdk-component/SKILL.md +154 -0
- package/templates/store-template/.env.example +50 -0
- package/templates/store-template/.mcp.json +8 -0
- package/templates/store-template/.rovela/blueprint.example.json +190 -0
- package/templates/store-template/CLAUDE.md +14 -0
- package/templates/store-template/app/LayoutContent.tsx +106 -0
- package/templates/store-template/app/[...path]/page.tsx +79 -0
- package/templates/store-template/app/account/addresses/page.tsx +45 -0
- package/templates/store-template/app/account/layout.tsx +17 -0
- package/templates/store-template/app/account/orders/[id]/invoice/page.tsx +277 -0
- package/templates/store-template/app/account/orders/[id]/page.tsx +725 -0
- package/templates/store-template/app/account/orders/page.tsx +153 -0
- package/templates/store-template/app/account/page.tsx +184 -0
- package/templates/store-template/app/account/profile/page.tsx +434 -0
- package/templates/store-template/app/admin/(dashboard)/account/page.tsx +16 -0
- package/templates/store-template/app/admin/(dashboard)/analytics/events/page.tsx +14 -0
- package/templates/store-template/app/admin/(dashboard)/analytics/layout.tsx +48 -0
- package/templates/store-template/app/admin/(dashboard)/analytics/page.tsx +15 -0
- package/templates/store-template/app/admin/(dashboard)/analytics/visitors/page.tsx +14 -0
- package/templates/store-template/app/admin/(dashboard)/categories/[id]/page.tsx +38 -0
- package/templates/store-template/app/admin/(dashboard)/categories/new/page.tsx +35 -0
- package/templates/store-template/app/admin/(dashboard)/categories/page.tsx +223 -0
- package/templates/store-template/app/admin/(dashboard)/customers/[id]/page.tsx +26 -0
- package/templates/store-template/app/admin/(dashboard)/customers/page.tsx +33 -0
- package/templates/store-template/app/admin/(dashboard)/discounts/page.tsx +16 -0
- package/templates/store-template/app/admin/(dashboard)/emails/page.tsx +16 -0
- package/templates/store-template/app/admin/(dashboard)/files/page.tsx +16 -0
- package/templates/store-template/app/admin/(dashboard)/layout.tsx +44 -0
- package/templates/store-template/app/admin/(dashboard)/loading.tsx +88 -0
- package/templates/store-template/app/admin/(dashboard)/locations/page.tsx +16 -0
- package/templates/store-template/app/admin/(dashboard)/orders/[id]/page.tsx +66 -0
- package/templates/store-template/app/admin/(dashboard)/orders/page.tsx +26 -0
- package/templates/store-template/app/admin/(dashboard)/page.tsx +146 -0
- package/templates/store-template/app/admin/(dashboard)/payments/page.tsx +15 -0
- package/templates/store-template/app/admin/(dashboard)/products/[id]/page.tsx +38 -0
- package/templates/store-template/app/admin/(dashboard)/products/new/page.tsx +35 -0
- package/templates/store-template/app/admin/(dashboard)/products/page.tsx +31 -0
- package/templates/store-template/app/admin/(dashboard)/settings/page.tsx +46 -0
- package/templates/store-template/app/admin/(dashboard)/shipping/page.tsx +15 -0
- package/templates/store-template/app/admin/(dashboard)/tax/page.tsx +15 -0
- package/templates/store-template/app/admin/(dashboard)/users/[id]/page.tsx +114 -0
- package/templates/store-template/app/admin/(dashboard)/users/page.tsx +16 -0
- package/templates/store-template/app/admin/accept-invite/page.tsx +36 -0
- package/templates/store-template/app/admin/forgot-password/page.tsx +13 -0
- package/templates/store-template/app/admin/layout.tsx +47 -0
- package/templates/store-template/app/admin/login/page.tsx +528 -0
- package/templates/store-template/app/admin/reset-password/page.tsx +36 -0
- package/templates/store-template/app/api/account/addresses/[id]/route.ts +10 -0
- package/templates/store-template/app/api/account/addresses/route.ts +10 -0
- package/templates/store-template/app/api/account/change-password/route.ts +107 -0
- package/templates/store-template/app/api/account/orders/[id]/refund/route.ts +11 -0
- package/templates/store-template/app/api/account/orders/[id]/return/route.ts +14 -0
- package/templates/store-template/app/api/account/orders/[id]/route.ts +42 -0
- package/templates/store-template/app/api/account/orders/route.ts +29 -0
- package/templates/store-template/app/api/account/profile/route.ts +165 -0
- package/templates/store-template/app/api/admin/accept-invite/route.ts +11 -0
- package/templates/store-template/app/api/admin/analytics/events/route.ts +9 -0
- package/templates/store-template/app/api/admin/analytics/route.ts +10 -0
- package/templates/store-template/app/api/admin/analytics/visitors/route.ts +9 -0
- package/templates/store-template/app/api/admin/branding/favicon/route.ts +9 -0
- package/templates/store-template/app/api/admin/branding/logo/route.ts +9 -0
- package/templates/store-template/app/api/admin/categories/[id]/route.ts +9 -0
- package/templates/store-template/app/api/admin/categories/route.ts +9 -0
- package/templates/store-template/app/api/admin/check/route.ts +10 -0
- package/templates/store-template/app/api/admin/customer-groups/[id]/route.ts +10 -0
- package/templates/store-template/app/api/admin/customer-groups/route.ts +10 -0
- package/templates/store-template/app/api/admin/customers/[id]/addresses/[addressId]/route.ts +15 -0
- package/templates/store-template/app/api/admin/customers/[id]/addresses/route.ts +15 -0
- package/templates/store-template/app/api/admin/customers/[id]/route.ts +11 -0
- package/templates/store-template/app/api/admin/customers/bulk/route.ts +8 -0
- package/templates/store-template/app/api/admin/customers/route.ts +9 -0
- package/templates/store-template/app/api/admin/discounts/[id]/route.ts +11 -0
- package/templates/store-template/app/api/admin/discounts/route.ts +10 -0
- package/templates/store-template/app/api/admin/emails/preview/route.ts +4 -0
- package/templates/store-template/app/api/admin/emails/route.ts +5 -0
- package/templates/store-template/app/api/admin/emails/test/route.ts +4 -0
- package/templates/store-template/app/api/admin/files/route.ts +8 -0
- package/templates/store-template/app/api/admin/forgot-password/route.ts +7 -0
- package/templates/store-template/app/api/admin/linked-customer/route.ts +11 -0
- package/templates/store-template/app/api/admin/locations/[id]/route.ts +10 -0
- package/templates/store-template/app/api/admin/locations/route.ts +10 -0
- package/templates/store-template/app/api/admin/me/password/route.ts +13 -0
- package/templates/store-template/app/api/admin/me/route.ts +11 -0
- package/templates/store-template/app/api/admin/orders/[id]/refund/route.ts +7 -0
- package/templates/store-template/app/api/admin/orders/[id]/return/approve/route.ts +7 -0
- package/templates/store-template/app/api/admin/orders/[id]/return/reject/route.ts +7 -0
- package/templates/store-template/app/api/admin/orders/[id]/route.ts +9 -0
- package/templates/store-template/app/api/admin/orders/[id]/ship-with-shippo/route.ts +6 -0
- package/templates/store-template/app/api/admin/orders/[id]/shippo-rates/route.ts +6 -0
- package/templates/store-template/app/api/admin/orders/bulk/route.ts +8 -0
- package/templates/store-template/app/api/admin/orders/route.ts +9 -0
- package/templates/store-template/app/api/admin/payment-methods/[id]/route.ts +10 -0
- package/templates/store-template/app/api/admin/payment-methods/route.ts +10 -0
- package/templates/store-template/app/api/admin/products/[id]/route.ts +9 -0
- package/templates/store-template/app/api/admin/products/bulk/route.ts +9 -0
- package/templates/store-template/app/api/admin/products/route.ts +9 -0
- package/templates/store-template/app/api/admin/products/stats/route.ts +10 -0
- package/templates/store-template/app/api/admin/reset-password/route.ts +10 -0
- package/templates/store-template/app/api/admin/settings/route.ts +11 -0
- package/templates/store-template/app/api/admin/setup/route.ts +10 -0
- package/templates/store-template/app/api/admin/setup-guide/manual-mark/route.ts +13 -0
- package/templates/store-template/app/api/admin/setup-guide/route.ts +10 -0
- package/templates/store-template/app/api/admin/shipping/carriers/[id]/route.ts +9 -0
- package/templates/store-template/app/api/admin/shipping/carriers/route.ts +9 -0
- package/templates/store-template/app/api/admin/shipping/rates/[id]/route.ts +9 -0
- package/templates/store-template/app/api/admin/shipping/rates/route.ts +9 -0
- package/templates/store-template/app/api/admin/shipping/shippo/api-key/route.ts +1 -0
- package/templates/store-template/app/api/admin/shipping/shippo/validate/route.ts +1 -0
- package/templates/store-template/app/api/admin/shipping/zones/[id]/route.ts +9 -0
- package/templates/store-template/app/api/admin/shipping/zones/route.ts +9 -0
- package/templates/store-template/app/api/admin/stats/route.ts +9 -0
- package/templates/store-template/app/api/admin/stripe-status/route.ts +1 -0
- package/templates/store-template/app/api/admin/tax-zones/[id]/route.ts +7 -0
- package/templates/store-template/app/api/admin/tax-zones/route.ts +7 -0
- package/templates/store-template/app/api/admin/users/[id]/route.ts +14 -0
- package/templates/store-template/app/api/admin/users/route.ts +12 -0
- package/templates/store-template/app/api/admin-auth/[...nextauth]/route.ts +17 -0
- package/templates/store-template/app/api/analytics/track/route.ts +12 -0
- package/templates/store-template/app/api/auth/[...nextauth]/route.ts +19 -0
- package/templates/store-template/app/api/auth/forgot-password/route.ts +9 -0
- package/templates/store-template/app/api/auth/register/route.ts +9 -0
- package/templates/store-template/app/api/auth/resend-verification/route.ts +9 -0
- package/templates/store-template/app/api/auth/reset-password/route.ts +10 -0
- package/templates/store-template/app/api/auth/verify-email/route.ts +10 -0
- package/templates/store-template/app/api/categories/route.ts +10 -0
- package/templates/store-template/app/api/checkout/countries/route.ts +7 -0
- package/templates/store-template/app/api/checkout/discount/route.ts +9 -0
- package/templates/store-template/app/api/checkout/manual/route.ts +10 -0
- package/templates/store-template/app/api/checkout/payment-methods/route.ts +8 -0
- package/templates/store-template/app/api/checkout/pickup-locations/route.ts +8 -0
- package/templates/store-template/app/api/checkout/route.ts +10 -0
- package/templates/store-template/app/api/checkout/shipping/route.ts +21 -0
- package/templates/store-template/app/api/checkout/status/route.ts +10 -0
- package/templates/store-template/app/api/contact/route.ts +164 -0
- package/templates/store-template/app/api/media/presign/route.ts +7 -0
- package/templates/store-template/app/api/media/route.ts +7 -0
- package/templates/store-template/app/api/products/[slug]/route.ts +10 -0
- package/templates/store-template/app/api/products/route.ts +10 -0
- package/templates/store-template/app/api/store/settings/route.ts +12 -0
- package/templates/store-template/app/api/webhooks/stripe/route.ts +63 -0
- package/templates/store-template/app/auth/forgot-password/page.tsx +38 -0
- package/templates/store-template/app/auth/layout.tsx +17 -0
- package/templates/store-template/app/auth/reset-password/page.tsx +81 -0
- package/templates/store-template/app/auth/signin/page.tsx +62 -0
- package/templates/store-template/app/auth/signup/page.tsx +38 -0
- package/templates/store-template/app/auth/verify-email/page.tsx +185 -0
- package/templates/store-template/app/cart/page.tsx +137 -0
- package/templates/store-template/app/checkout/page.tsx +88 -0
- package/templates/store-template/app/checkout/success/page.tsx +50 -0
- package/templates/store-template/app/contact/layout.tsx +24 -0
- package/templates/store-template/app/contact/page.tsx +321 -0
- package/templates/store-template/app/faq/page.tsx +153 -0
- package/templates/store-template/app/globals.css +99 -0
- package/templates/store-template/app/layout.tsx +269 -0
- package/templates/store-template/app/not-found.tsx +35 -0
- package/templates/store-template/app/page.tsx +23 -0
- package/templates/store-template/app/privacy/page.tsx +281 -0
- package/templates/store-template/app/products/[slug]/ProductDetailClient.tsx +179 -0
- package/templates/store-template/app/products/[slug]/page.tsx +149 -0
- package/templates/store-template/app/products/layout.tsx +26 -0
- package/templates/store-template/app/products/page.tsx +102 -0
- package/templates/store-template/app/robots.ts +25 -0
- package/templates/store-template/app/sitemap.ts +76 -0
- package/templates/store-template/app/terms/page.tsx +313 -0
- package/templates/store-template/components/PathSyncBridge.tsx +61 -0
- package/templates/store-template/components/Providers.tsx +37 -0
- package/templates/store-template/components/layout/Footer.tsx +150 -0
- package/templates/store-template/components/layout/Header.tsx +162 -0
- package/templates/store-template/components/sections/.gitkeep +7 -0
- package/templates/store-template/components/sections/CTA.tsx +51 -0
- package/templates/store-template/components/sections/Features.tsx +91 -0
- package/templates/store-template/components/sections/Hero.tsx +85 -0
- package/templates/store-template/eslint.config.mjs +18 -0
- package/templates/store-template/lib/store-config.ts +77 -0
- package/templates/store-template/lib/store-policy.ts +68 -0
- package/templates/store-template/lib/utils.ts +21 -0
- package/templates/store-template/next-env.d.ts +6 -0
- package/templates/store-template/next.config.js +105 -0
- package/templates/store-template/package.json +32 -0
- package/templates/store-template/postcss.config.js +6 -0
- package/templates/store-template/proxy.ts +150 -0
- package/templates/store-template/public/rovela-logo.png +0 -0
- package/templates/store-template/tailwind.config.ts +74 -0
- package/templates/store-template/tsconfig.json +41 -0
- 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,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)
|