skills/tier1-foundation/database-schema-generator/SKILL.md
Generate PostgreSQL/Supabase database schemas from natural language descriptions. Use when creating new databases, adding tables to existing projects, or designing data models. Includes RLS policies, TypeScript types, and migration files.
npx skillsauth add abcnuts/manus-skills database-schema-generatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
4 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate production-ready PostgreSQL/Supabase database schemas from natural language descriptions using AI.
This skill transforms natural language descriptions into complete, production-ready database schemas with:
python3 scripts/generate_schema.py "A blog with users, posts, and comments"
python3 scripts/generate_schema.py "E-commerce with products and orders" --output-format types
# Generate schema
python3 scripts/generate_schema.py "Task management app" --output-file schema.sql
# Validate
python3 scripts/validate_schema.py schema.sql
# Apply to Supabase
python3 scripts/apply_schema.py schema.sql --project-id YOUR_PROJECT_ID
Write a natural language description of what you need:
Simple:
"A blog with users, posts, and comments"
Detailed:
"A task management app with:
- Users with roles (admin, member)
- Projects that users can join
- Tasks within projects with assignees
- Comments on tasks
- File attachments on tasks"
Domain-Specific:
"An e-commerce platform with:
- Products with variants (size, color)
- Shopping cart
- Orders with line items
- Payment tracking
- Inventory management"
Run the generator:
python3 scripts/generate_schema.py "<your description>" --output-file schema.sql
Options:
--output-format sql - Raw SQL (default)--output-format supabase - Supabase SQL Editor format--output-format migration - Migration file format--output-format types - TypeScript types only--include-rls - Include RLS policies (default: true)--no-rls - Exclude RLS policies--include-seed - Include seed data--output-file <path> - Save to fileCheck for errors and best practices:
python3 scripts/validate_schema.py schema.sql
The validator checks:
Apply the schema to your Supabase database:
python3 scripts/apply_schema.py schema.sql --project-id YOUR_PROJECT_ID
Options:
--dry-run - Show what would be executed without running--confirm - Skip confirmation promptGenerate TypeScript types for your frontend:
python3 scripts/generate_schema.py "<description>" --output-format types --output-file types.ts
Description:
"A blog with users, posts, and comments"
Generated Schema (excerpt):
CREATE TABLE users (
id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
email TEXT UNIQUE NOT NULL,
full_name TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE posts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
title TEXT NOT NULL,
content TEXT,
status TEXT DEFAULT 'draft' CHECK (status IN ('draft', 'published')),
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE comments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
post_id UUID REFERENCES posts(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
content TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Indexes
CREATE INDEX idx_posts_user_id ON posts(user_id);
CREATE INDEX idx_comments_post_id ON comments(post_id);
-- RLS Policies
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can view published posts"
ON posts FOR SELECT
USING (status = 'published');
Description:
"E-commerce with products, orders, and customers"
Command:
python3 scripts/generate_schema.py "E-commerce with products, orders, and customers" \
--include-seed \
--output-file ecommerce_schema.sql
Description:
"A SaaS app with:
- Organizations (workspaces)
- Users belong to organizations with roles
- Projects within organizations
- Tasks within projects
- Billing and subscriptions per organization"
Command:
python3 scripts/generate_schema.py "A SaaS app with organizations, users with roles, projects, tasks, and billing" \
--output-format migration \
--output-file migrations/001_initial_schema.sql
Clean, executable PostgreSQL SQL:
CREATE TABLE users (...);
CREATE INDEX idx_users_email ON users(email);
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
Includes Supabase-specific header and extensions:
-- Supabase SQL Editor
-- Paste this into the Supabase SQL Editor and run
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE users (...);
Version-controlled migration file format:
-- Migration: E-commerce schema
-- Created: 2026-02-08 14:30:00
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE users (...);
Type-safe TypeScript interfaces:
export interface User {
id: string;
email: string;
full_name: string | null;
created_at: Date;
updated_at: Date;
}
export interface Post {
id: string;
user_id: string;
title: string;
content: string | null;
status: 'draft' | 'published';
created_at: Date;
updated_at: Date;
}
Use templates/base_schema.sql for common patterns:
Copy patterns from the template into your own schemas.
The generator follows these best practices automatically:
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
Why: Security, no collisions, client-side generation
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
Why: Audit trail, debugging, sorting
CREATE INDEX idx_posts_user_id ON posts(user_id);
Why: Join performance
status TEXT CHECK (status IN ('draft', 'published', 'archived'))
Why: Data validation at database level
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
Why: Security by default (Supabase requirement)
deleted_at TIMESTAMPTZ
Why: Data recovery, audit trail
user_id UUID REFERENCES users(id) ON DELETE CASCADE
Why: Data integrity, automatic cleanup
CREATE TABLE posts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
...
);
-- RLS: Users can only access their own posts
CREATE POLICY "Users can view own posts"
ON posts FOR SELECT
USING (auth.uid() = user_id);
CREATE TABLE post_tags (
post_id UUID REFERENCES posts(id) ON DELETE CASCADE,
tag_id UUID REFERENCES tags(id) ON DELETE CASCADE,
PRIMARY KEY (post_id, tag_id)
);
CREATE TABLE comments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
parent_id UUID REFERENCES comments(id) ON DELETE CASCADE,
...
);
status TEXT DEFAULT 'pending' CHECK (status IN ('pending', 'processing', 'completed', 'failed'))
The validator checks for:
Generate schema:
python3 scripts/generate_schema.py "..." --output-format supabase
Copy output
Paste into Supabase SQL Editor
Run
Generate schema:
python3 scripts/generate_schema.py "..." --output-file schema.sql
Apply to Supabase:
python3 scripts/apply_schema.py schema.sql --project-id YOUR_PROJECT_ID
Verify in Supabase dashboard
Solution: Run validator to identify specific errors:
python3 scripts/validate_schema.py schema.sql
Solution: Check Supabase project ID and MCP configuration:
manus-mcp-cli tool list --server supabase
Solution: Verify RLS is enabled:
ALTER TABLE your_table ENABLE ROW LEVEL SECURITY;
Solution: Ensure parent records exist before inserting child records, or use ON DELETE CASCADE.
For more control, modify the SYSTEM_PROMPT in scripts/generate_schema.py:
SYSTEM_PROMPT = """You are an expert database architect...
Additional requirements:
- Use JSONB for flexible data
- Add full-text search indexes
- Include audit triggers
"""
Generate new tables and merge with existing schema:
# Generate new tables
python3 scripts/generate_schema.py "Add notifications table" --output-file new_tables.sql
# Review and merge manually
cat existing_schema.sql new_tables.sql > combined_schema.sql
Generate initial schema:
python3 scripts/generate_schema.py "..." --output-format migration --output-file migrations/001_initial.sql
Apply to database:
python3 scripts/apply_schema.py migrations/001_initial.sql --project-id YOUR_PROJECT_ID
For changes, generate new migration:
python3 scripts/generate_schema.py "Add notifications" --output-format migration --output-file migrations/002_add_notifications.sql
references/schema_patterns.md - Common database patterns and best practicestemplates/base_schema.sql - Reusable schema patterns✅ Schema generates without errors
✅ Validation passes
✅ Schema applies to Supabase successfully
✅ RLS policies work as expected
✅ TypeScript types match database schema
✅ Indexes improve query performance
After generating your schema:
tools
Generate comprehensive demonstrations showing how to access projects and work across different environments (Manus terminals, personal computers, team collaboration). Use when users ask "how do I access this from another terminal/computer", "how do I share this with my team", "how do I get this on my Mac", or need clarification on Manus persistence vs GitHub usage.
development
Use when you have a spec or requirements for a multi-step task, before touching code
data-ai
Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always
development
Use when implementing any feature or bugfix, before writing implementation code