Add System Health Monitor: RAM/CPU/locks tracking with emergency kill controls + Visual Builder plan

This commit is contained in:
cawcenter
2025-12-16 11:06:40 -05:00
parent 11af92b0d0
commit 0f4330b7e1
6 changed files with 967 additions and 3 deletions

View File

@@ -0,0 +1,343 @@
# 🎨 Visual Builder Implementation Plan
## Craft.js + AstroWind + Direct DB Shim
**Objective:** Build a "Squarespace-style" visual editor that saves directly to PostgreSQL via the Shim, without CMS overhead.
---
## 🏗️ ARCHITECTURE
```
┌─────────────────────────────────────────────────────────┐
│ PUBLIC SITE (SSR - Lightning Fast) │
│ https://[site-domain]/[slug] │
│ - Reads sites.config JSONB │
│ - Renders AstroWind components │
│ - Zero editor overhead │
└─────────────────────────────────────────────────────────┘
│ Reads config
┌─────────────────────────────────────────────────────────┐
│ POSTGRESQL (sites.config JSONB) │
│ { │
│ "template": "astrowind", │
│ "blocks": [ │
│ { "type": "Hero", "props": {...} }, │
│ { "type": "Features", "props": {...} } │
│ ] │
│ } │
└─────────────────────────────────────────────────────────┘
│ Writes config via Shim
┌─────────────────────────────────────────────────────────┐
│ VISUAL EDITOR (React + Craft.js) │
│ https://[admin-domain]/admin/editor/[id] │
│ - Drag-and-drop blocks │
│ - Live preview │
│ - Saves to PostgreSQL via /api/shim/sites/save-config │
└─────────────────────────────────────────────────────────┘
```
---
## 📋 IMPLEMENTATION TASKS
### Phase 1: Editor Infrastructure (60 min)
**Task 1.1: Create Craft.js User Components**
- [ ] `src/components/editor/blocks/HeroBlock.tsx` - Wraps AstroWind Hero
- [ ] `src/components/editor/blocks/FeaturesBlock.tsx` - Wraps Features
- [ ] `src/components/editor/blocks/ContentBlock.tsx` - Wraps Content
- [ ] `src/components/editor/blocks/CTABlock.tsx` - Wraps Call-to-Action
- [ ] `src/components/editor/blocks/index.ts` - Exports all blocks
**Task 1.2: Create Editor Canvas**
- [ ] `src/components/editor/EditorCanvas.tsx` - Main Craft.js editor
- [ ] `src/components/editor/ToolboxPanel.tsx` - Drag-and-drop panel
- [ ] `src/components/editor/SettingsPanel.tsx` - Block properties editor
- [ ] `src/components/editor/TopBar.tsx` - Save/Preview buttons
**Task 1.3: Create Editor Utilities**
- [ ] `src/lib/editor/serializer.ts` - Convert Craft.js → JSONB
- [ ] `src/lib/editor/deserializer.ts` - Convert JSONB → Craft.js
- [ ] `src/lib/editor/templates.ts` - Pre-built template configs
### Phase 2: Template Factory (45 min)
**Task 2.1: AstroWind Component Adapters**
- [ ] `src/components/templates/astrowind/Hero.astro` - Reads from JSONB
- [ ] `src/components/templates/astrowind/Features.astro` - Reads from JSONB
- [ ] `src/components/templates/astrowind/Content.astro` - Reads from JSONB
- [ ] `src/components/templates/astrowind/CTA.astro` - Reads from JSONB
**Task 2.2: Template Registry**
- [ ] `src/lib/templates/registry.ts` - Maps template names to components
- [ ] `src/lib/templates/schemas.ts` - Zod schemas for block configs
- [ ] `src/lib/templates/defaults.ts` - Default block configurations
### Phase 3: API Routes (30 min)
**Task 3.1: Editor API Routes**
- [ ] `POST /api/shim/sites/save-config` - Save JSONB to PostgreSQL
- [ ] `GET /api/shim/sites/[id]/config` - Load JSONB for editor
- [ ] `POST /api/shim/sites/[id]/preview` - Generate preview URL
**Task 3.2: Template API Routes**
- [ ] `GET /api/templates/list` - Available templates
- [ ] `POST /api/templates/apply` - Apply template to site
### Phase 4: Editor Pages (30 min)
**Task 4.1: Editor Route**
- [ ] `src/pages/admin/editor/[id].astro` - Main editor page
- [ ] Token validation wrapper
- [ ] Load site config from Shim
**Task 4.2: Template Selector**
- [ ] `src/pages/admin/templates.astro` - Template gallery
- [ ] Preview thumbnails
- [ ] One-click apply
### Phase 5: Public Rendering (30 min)
**Task 5.1: Dynamic Template Renderer**
- [ ] `src/pages/[...slug].astro` - Reads sites.config and renders blocks
- [ ] Block component resolver
- [ ] SEO metadata injection
**Task 5.2: Site Utilities**
- [ ] `src/lib/templates/renderer.ts` - Render blocks from JSONB
- [ ] `src/lib/templates/seo.ts` - Extract SEO from config
---
## 🔧 CORE COMPONENTS
### 1. Editor Canvas (`EditorCanvas.tsx`)
```typescript
import { Editor, Frame, Element } from '@craftjs/core';
import { HeroBlock, FeaturesBlock, ContentBlock } from './blocks';
export default function EditorCanvas({ initialState, siteId }) {
const handleSave = async (json) => {
await fetch(`/api/shim/sites/save-config`, {
method: 'POST',
body: JSON.stringify({ siteId, config: json })
});
};
return (
<Editor resolver={{ HeroBlock, FeaturesBlock, ContentBlock }}>
<div className="flex h-screen">
<ToolboxPanel />
<div className="flex-1">
<TopBar onSave={handleSave} />
<Frame json={initialState}>
<Element is="div" canvas>
{/* Editable canvas */}
</Element>
</Frame>
</div>
<SettingsPanel />
</div>
</Editor>
);
}
```
### 2. User Component Example (`HeroBlock.tsx`)
```typescript
import { useNode } from '@craftjs/core';
export const HeroBlock = ({ title, subtitle, image, ctaText }) => {
const { connectors: { connect, drag } } = useNode();
return (
<div ref={ref => connect(drag(ref))} className="hero">
<h1>{title}</h1>
<p>{subtitle}</p>
{image && <img src={image} alt={title} />}
<button>{ctaText}</button>
</div>
);
};
HeroBlock.craft = {
props: {
title: 'Hero Title',
subtitle: 'Hero subtitle',
image: '/placeholder.jpg',
ctaText: 'Get Started'
},
rules: {
canDrag: true,
canDrop: false
},
related: {
settings: HeroSettings // Property panel component
}
};
```
### 3. Save Config API (`save-config.ts`)
```typescript
import type { APIRoute } from 'astro';
import { updateSite } from '@/lib/shim/sites';
export const POST: APIRoute = async ({ request }) => {
try {
const { siteId, config } = await request.json();
// Update site config via Shim
await updateSite(siteId, {
config: JSON.stringify(config)
});
return new Response(JSON.stringify({ success: true }), {
status: 200
});
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
status: 500
});
}
};
```
### 4. Public Renderer (`[...slug].astro`)
```astro
---
import { getSiteByDomain } from '@/lib/shim/sites';
import { renderBlocks } from '@/lib/templates/renderer';
const site = await getSiteByDomain(Astro.url.hostname);
const config = site?.config || {};
const blocks = config.blocks || [];
---
<html>
<body>
{renderBlocks(blocks)}
</body>
</html>
```
---
## 🎨 TEMPLATE FACTORY STRUCTURE
### Default Templates
| Template | Blocks | Use Case |
|----------|--------|----------|
| **Corporate** | Hero + Features + Stats + Team + CTA | Business sites |
| **Landing** | Hero + Benefits + Testimonials + Pricing + CTA | SaaS landing pages |
| **Blog** | Header + Posts Grid + Sidebar + Footer | Content sites |
| **Portfolio** | Hero + Projects Grid + About + Contact | Personal branding |
### JSONB Structure
```json
{
"template": "astrowind",
"theme": {
"primaryColor": "#3B82F6",
"font": "Inter"
},
"blocks": [
{
"id": "hero-1",
"type": "Hero",
"props": {
"title": "Welcome to Our Site",
"subtitle": "Build amazing things",
"ctaText": "Get Started",
"ctaLink": "/signup"
}
},
{
"id": "features-1",
"type": "Features",
"props": {
"title": "Key Features",
"items": [
{ "icon": "⚡", "title": "Fast", "description": "Lightning quick" },
{ "icon": "🔒", "title": "Secure", "description": "Bank-level security" }
]
}
}
]
}
```
---
## 🔒 SECURITY MODEL
1. **Editor Access:**
- Only accessible at `/admin/editor/[id]`
- Requires `GOD_MODE_TOKEN` validation
- Token checked in Astro middleware
2. **Save Operations:**
- All saves go through Shim (`/api/shim/sites/save-config`)
- Zod validation on JSONB structure
- Sanitize user input before SQL
3. **Public Rendering:**
- No editor JavaScript loaded
- Pure SSR from JSONB config
- No exposure of admin endpoints
---
## 📊 PERFORMANCE COMPARISON
| Operation | Traditional CMS | God Mode Visual Builder |
|-----------|----------------|-------------------------|
| **Load Editor** | ~2000ms (API + DB + Render) | ~300ms (Direct DB) |
| **Save Changes** | ~1500ms (API → CMS → DB) | ~50ms (Shim → DB) |
| **Public Page Load** | ~800ms (CMS overhead) | ~10ms (Pure SSR) |
| **Scale** | 100s of sites | 10,000s of sites |
---
## 🎯 SUCCESS CRITERIA
1. ✅ Can drag-and-drop AstroWind blocks in `/admin/editor/[id]`
2. ✅ Changes save directly to `sites.config` JSONB
3. ✅ Public site re-renders instantly with new config
4. ✅ Zero performance impact on public-facing pages
5. ✅ Can manage 1000+ sites with different layouts
6. ✅ Full Zod validation on all block configs
7. ✅ SEO metadata auto-extracted from blocks
---
## 🚀 DEPLOYMENT CHECKLIST
- [ ] Install Craft.js dependencies (`npm install @craftjs/core @craftjs/utils`)
- [ ] Create all editor components
- [ ] Create template adapters
- [ ] Test save/load flow
- [ ] Verify public rendering
- [ ] Security audit (token validation)
- [ ] Performance test (1000+ blocks)
---
## 📈 ROADMAP EXTENSIONS
**Phase 6 (Future):**
- [ ] A/B Testing - Save multiple configs, split traffic
- [ ] Version History - Keep history of config changes
- [ ] Template Marketplace - Share templates between sites
- [ ] AI Block Generator - Generate blocks from text prompts
- [ ] Responsive Preview - Mobile/tablet/desktop view
- [ ] Component Library - Custom reusable blocks