aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
643 lines (469 loc) • 13.2 kB
Markdown
# Task: Bootstrap Supabase Project
**Purpose**: Create standard Supabase project structure
**Elicit**: true
## Execution Modes
**Choose your execution mode:**
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
- Autonomous decision making with logging
- Minimal user interaction
- **Best for:** Simple, deterministic tasks
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
- Explicit decision checkpoints
- Educational explanations
- **Best for:** Learning, complex decisions
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
- Task analysis phase (identify all ambiguities)
- Zero ambiguity execution
- **Best for:** Ambiguous requirements, critical work
**Parameter:** `mode` (optional, default: `interactive`)
## Task Definition (AIOS Task Format V1.0)
```yaml
task: dbBootstrap()
responsible: Dara (Sage)
responsible_type: Agent
atomic_layer: Organism
inputs:
- field: query
type: string
source: User Input
required: true
validation: Valid SQL query
- field: params
type: object
source: User Input
required: false
validation: Query parameters
- field: connection
type: object
source: config
required: true
validation: Valid PostgreSQL connection via Supabase
outputs:
- field: query_result
type: array
destination: Memory
persisted: false
- field: records_affected
type: number
destination: Return value
persisted: false
- field: execution_time
type: number
destination: Memory
persisted: false
```
## Pre-Conditions
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
**Checklist:**
```yaml
pre-conditions:
- [ ] Database connection established; query syntax valid
tipo: pre-condition
blocker: true
validação: |
Check database connection established; query syntax valid
error_message: "Pre-condition failed: Database connection established; query syntax valid"
```
## Post-Conditions
**Purpose:** Validate execution success AFTER task completes
**Checklist:**
```yaml
post-conditions:
- [ ] Query executed; results returned; transaction committed
tipo: post-condition
blocker: true
validação: |
Verify query executed; results returned; transaction committed
error_message: "Post-condition failed: Query executed; results returned; transaction committed"
```
## Acceptance Criteria
**Purpose:** Definitive pass/fail criteria for task completion
**Checklist:**
```yaml
acceptance-criteria:
- [ ] Data persisted correctly; constraints respected; no orphaned data
tipo: acceptance-criterion
blocker: true
validação: |
Assert data persisted correctly; constraints respected; no orphaned data
error_message: "Acceptance criterion not met: Data persisted correctly; constraints respected; no orphaned data"
```
## Tools
**External/shared resources used by this task:**
- **Tool:** supabase
- **Purpose:** PostgreSQL database connection via Supabase client
- **Source:** @supabase/supabase-js
- **Tool:** query-validator
- **Purpose:** SQL query syntax validation
- **Source:** .aios-core/utils/db-query-validator.js
## Scripts
**Agent-specific code for this task:**
- **Script:** db-query.js
- **Purpose:** Execute PostgreSQL queries with error handling via Supabase
- **Language:** JavaScript
- **Location:** .aios-core/scripts/db-query.js
## Error Handling
**Strategy:** retry
**Common Errors:**
1. **Error:** Connection Failed
- **Cause:** Unable to connect to Neo4j database
- **Resolution:** Check connection string, credentials, network
- **Recovery:** Retry with exponential backoff (max 3 attempts)
2. **Error:** Query Syntax Error
- **Cause:** Invalid Cypher query syntax
- **Resolution:** Validate query syntax before execution
- **Recovery:** Return detailed syntax error, suggest fix
3. **Error:** Transaction Rollback
- **Cause:** Query violates constraints or timeout
- **Resolution:** Review query logic and constraints
- **Recovery:** Automatic rollback, preserve data integrity
## Performance
**Expected Metrics:**
```yaml
duration_expected: 5-15 min (estimated)
cost_estimated: $0.003-0.010
token_usage: ~3,000-10,000 tokens
```
**Optimization Notes:**
- Break into smaller workflows; implement checkpointing; use async processing where possible
## Metadata
```yaml
story: N/A
version: 1.0.0
dependencies:
- N/A
tags:
- database
- infrastructure
updated_at: 2025-11-17
```
## Process
### 1. Confirm Project Setup
Ask user:
**Project name**: (e.g., "mmos-platform")
**Include starter templates?**
1. Minimal - Directories only
2. Standard - Directories + READMEs + config
3. Full - Everything + baseline schema example
### 2. Create Directory Structure
```bash
mkdir -p supabase/{migrations,seeds,tests,rollback,snapshots,docs}
echo "✓ Created directories:
supabase/migrations/ - Schema migrations
supabase/seeds/ - Seed data
supabase/tests/ - Smoke tests
supabase/rollback/ - Rollback scripts
supabase/snapshots/ - Schema snapshots
supabase/docs/ - Documentation"
```
### 3. Create Core Files
#### supabase/migrations/README.md
```markdown
# Migrations
## Naming: YYYYMMDDHHMMSS_description.sql
Example: 20251026120000_baseline_schema.sql
## Order (within each file):
1. Extensions
2. Tables + Constraints
3. Functions
4. Triggers
5. RLS (enable + policies)
6. Views
## Workflow:
*verify-order migration.sql # Check order
*dry-run migration.sql # Test
*snapshot pre_migration # Create rollback point
*apply-migration migration.sql # Apply
*smoke-test # Validate
```
#### supabase/seeds/README.md
```markdown
# Seeds
## Naming: YYYYMMDDHHMMSS_description_seed.sql
## Types:
- Required: Data app needs to function
- Test: Sample data for development
- Reference: Lookup tables (countries, categories)
## Idempotent pattern:
INSERT INTO table (id, name) VALUES (1, 'value')
ON CONFLICT (id) DO NOTHING;
```
#### supabase/tests/README.md
```markdown
# Tests
## Smoke tests (post-migration validation):
- Tables exist
- RLS enabled
- Policies installed
- Functions callable
- Basic queries work
## Run: *smoke-test
```
#### supabase/rollback/README.md
```markdown
# Rollback
## Snapshots (automatic):
Created by *apply-migration and *snapshot commands
Located in: ../snapshots/
## Manual rollback scripts:
Write explicit undo operations for complex migrations
Example: YYYYMMDDHHMMSS_rollback_description.sql
```
#### supabase/.gitignore
```gitignore
# Local dev
.env
.env.local
.branches
.temp
# OS
.DS_Store
Thumbs.db
# Optional: Snapshots (if too large for git)
# snapshots/*.sql
```
### 4. Generate config.toml (if Standard or Full)
```toml
# Supabase Local Development Config
[api]
enabled = true
port = 54321
[db]
port = 54322
shadow_port = 54320
major_version = 15
[db.pooler]
enabled = true
port = 54329
pool_mode = "transaction"
[studio]
enabled = true
port = 54323
[auth]
enabled = true
site_url = "http://localhost:3000"
# See: https://supabase.com/docs/guides/cli/config
```
### 5. Create Baseline Schema (if Full option)
#### supabase/migrations/00000000000000_baseline.sql
```sql
-- Baseline Schema
-- Run after: supabase init
BEGIN;
-- Extensions
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
-- Example table (customize for your project)
CREATE TABLE IF NOT EXISTS public.profiles (
id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
username TEXT UNIQUE,
full_name TEXT,
avatar_url TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Updated_at trigger
CREATE OR REPLACE FUNCTION public.handle_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER set_updated_at
BEFORE UPDATE ON public.profiles
FOR EACH ROW
EXECUTE FUNCTION public.handle_updated_at();
-- RLS
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can view own profile"
ON public.profiles FOR SELECT
TO authenticated
USING (auth.uid() = id);
CREATE POLICY "Users can update own profile"
ON public.profiles FOR UPDATE
TO authenticated
USING (auth.uid() = id)
WITH CHECK (auth.uid() = id);
-- Grants
GRANT USAGE ON SCHEMA public TO authenticated, anon;
GRANT SELECT, INSERT, UPDATE ON public.profiles TO authenticated;
COMMIT;
```
### 6. Create Initial Smoke Test
#### supabase/tests/smoke_test.sql
```sql
-- Basic smoke test
SET client_min_messages = warning;
\echo 'Checking tables...'
SELECT COUNT(*) AS tables FROM information_schema.tables
WHERE table_schema='public';
\echo 'Checking RLS...'
SELECT COUNT(*) AS rls_enabled FROM pg_tables
WHERE schemaname='public' AND rowsecurity=true;
\echo 'Checking policies...'
SELECT COUNT(*) AS policies FROM pg_policies
WHERE schemaname='public';
\echo '✓ Smoke test complete'
```
### 7. Create Migration Log
#### supabase/docs/migration-log.md
```markdown
# Migration Log
## Format:
### Version X.Y.Z - Description (Date)
- Migration: filename.sql
- Status: ✅ Success / ❌ Failed / ⏪ Rolled Back
- Changes: What changed
- Rollback: How to undo
## Baseline (Initial)
- Migration: 00000000000000_baseline.sql
- Status: ⏳ Pending
- Changes: Initial project structure
- Rollback: N/A (baseline)
```
## Success Output
```
✅ Supabase Project Bootstrapped
Structure created:
supabase/
├── migrations/ (migration files)
├── seeds/ (seed data)
├── tests/ (smoke tests)
├── rollback/ (rollback scripts)
├── snapshots/ (schema snapshots)
├── docs/ (documentation)
├── config.toml (local config)
└── .gitignore
Next steps:
1. Set SUPABASE_DB_URL in .env
2. *env-check - Validate setup
3. *apply-migration supabase/migrations/00000000000000_baseline.sql
4. *smoke-test - Validate baseline
5. *snapshot baseline - Create initial snapshot
Documentation:
- supabase/migrations/README.md
- supabase/docs/migration-log.md
```
## Environment Setup
Create `.env` file in project root:
```bash
# Supabase Database Connection
# Get from: https://app.supabase.com/project/_/settings/database
# Pooler (recommended for migrations)
SUPABASE_DB_URL="postgresql://postgres.[PASSWORD]@[PROJECT-REF].supabase.co:6543/postgres?sslmode=require"
# Direct (for backups/analysis)
# SUPABASE_DB_URL="postgresql://postgres.[PASSWORD]@[PROJECT-REF].supabase.co:5432/postgres?sslmode=require"
```
**Security**:
- ✅ Added to .gitignore
- ✅ Use pooler (port 6543)
- ✅ Require SSL
## Project Options
### Minimal (Directories Only)
```
supabase/
├── migrations/
├── seeds/
├── tests/
├── rollback/
├── snapshots/
└── docs/
```
**Use for**: Existing projects, simple setups
### Standard (+ READMEs + Config)
```
+ README.md files
+ config.toml
+ .gitignore
+ migration-log.md
```
**Use for**: New projects, team environments
### Full (+ Baseline Schema)
```
+ baseline.sql migration
+ smoke_test.sql
+ Example profiles table
+ RLS policies
```
**Use for**: Greenfield projects, learning
## Integration with Existing Projects
If `supabase/` already exists:
```bash
# Backup existing
mv supabase supabase.backup
# Bootstrap new
# Merge as needed
cp supabase.backup/migrations/* supabase/migrations/
```
## Customization
### For Your Project
Replace baseline.sql with your tables:
- Copy schema from existing DB
- Or design with: `*create-schema`
- Then create migration file
### Team Standards
Edit READMEs to add:
- Team-specific naming conventions
- Required reviewers for migrations
- Deployment procedures
- Contact information
### CI/CD Integration
Add to pipeline:
```yaml
# .github/workflows/db-test.yml
- name: Run smoke tests
run: |
/db-sage
*smoke-test
```
## Next Steps After Bootstrap
1. **Environment**: Set SUPABASE_DB_URL
2. **Validate**: `*env-check`
3. **Design**: `*create-schema` (or use existing)
4. **Migrate**: `*apply-migration baseline.sql`
5. **Test**: `*smoke-test`
6. **Snapshot**: `*snapshot baseline`
7. **Document**: Update migration-log.md
## Common Issues
### "Directory already exists"
**Problem**: supabase/ folder exists
**Options**:
1. Backup and replace (recommended)
2. Merge manually
3. Choose different directory
### "No permission to create directories"
**Problem**: Insufficient file permissions
**Fix**: Check you're in project root with write access
### "Config conflicts with existing Supabase project"
**Problem**: Already using Supabase CLI
**Solution**: Bootstrap is compatible with Supabase CLI
- Keep existing config
- Use bootstrap for organization only
## Related Commands
- `*create-schema` - Design schema interactively
- `*apply-migration {path}` - Run first migration
- `*smoke-test` - Validate setup
- `*snapshot baseline` - Create initial snapshot
- `*env-check` - Validate environment