{"skill":{"slug":"ecosincronia-supabase","displayName":"Ecosincronia Supabase","summary":"Connect to Supabase for database operations, vector search, and storage. Use for storing data, running SQL queries, similarity search with pgvector, and mana...","description":"---\nname: supabase\ndescription: Connect to Supabase for database operations, vector search, and storage. Use for storing data, running SQL queries, similarity search with pgvector, and managing tables. Triggers on requests involving databases, vector stores, embeddings, or Supabase specifically.\nmetadata: {\"clawdbot\":{\"requires\":{\"env\":[\"SUPABASE_URL\",\"SUPABASE_SERVICE_KEY\"]}}}\n---\n\n# Supabase CLI\n\nInteract with Supabase projects: queries, CRUD, vector search, and table management.\n\n## Setup\n\n```bash\n# Required\nexport SUPABASE_URL=\"https://yourproject.supabase.co\"\nexport SUPABASE_SERVICE_KEY=\"eyJhbGciOiJIUzI1NiIs...\"\n\n# Optional: for management API\nexport SUPABASE_ACCESS_TOKEN=\"sbp_xxxxx\"\n```\n\n## Quick Commands\n\n```bash\n# SQL query\n{baseDir}/scripts/supabase.sh query \"SELECT * FROM users LIMIT 5\"\n\n# Insert data\n{baseDir}/scripts/supabase.sh insert users '{\"name\": \"John\", \"email\": \"john@example.com\"}'\n\n# Select with filters\n{baseDir}/scripts/supabase.sh select users --eq \"status:active\" --limit 10\n\n# Update\n{baseDir}/scripts/supabase.sh update users '{\"status\": \"inactive\"}' --eq \"id:123\"\n\n# Delete\n{baseDir}/scripts/supabase.sh delete users --eq \"id:123\"\n\n# Vector similarity search\n{baseDir}/scripts/supabase.sh vector-search documents \"search query\" --match-fn match_documents --limit 5\n\n# List tables\n{baseDir}/scripts/supabase.sh tables\n\n# Describe table\n{baseDir}/scripts/supabase.sh describe users\n```\n\n## Commands Reference\n\n### query - Run raw SQL\n\n```bash\n{baseDir}/scripts/supabase.sh query \"<SQL>\"\n\n# Examples\n{baseDir}/scripts/supabase.sh query \"SELECT COUNT(*) FROM users\"\n{baseDir}/scripts/supabase.sh query \"CREATE TABLE items (id serial primary key, name text)\"\n{baseDir}/scripts/supabase.sh query \"SELECT * FROM users WHERE created_at > '2024-01-01'\"\n```\n\n### select - Query table with filters\n\n```bash\n{baseDir}/scripts/supabase.sh select <table> [options]\n\nOptions:\n  --columns <cols>    Comma-separated columns (default: *)\n  --eq <col:val>      Equal filter (can use multiple)\n  --neq <col:val>     Not equal filter\n  --gt <col:val>      Greater than\n  --lt <col:val>      Less than\n  --like <col:val>    Pattern match (use % for wildcard)\n  --limit <n>         Limit results\n  --offset <n>        Offset results\n  --order <col>       Order by column\n  --desc              Descending order\n\n# Examples\n{baseDir}/scripts/supabase.sh select users --eq \"status:active\" --limit 10\n{baseDir}/scripts/supabase.sh select posts --columns \"id,title,created_at\" --order created_at --desc\n{baseDir}/scripts/supabase.sh select products --gt \"price:100\" --lt \"price:500\"\n```\n\n### insert - Insert row(s)\n\n```bash\n{baseDir}/scripts/supabase.sh insert <table> '<json>'\n\n# Single row\n{baseDir}/scripts/supabase.sh insert users '{\"name\": \"Alice\", \"email\": \"alice@test.com\"}'\n\n# Multiple rows\n{baseDir}/scripts/supabase.sh insert users '[{\"name\": \"Bob\"}, {\"name\": \"Carol\"}]'\n```\n\n### update - Update rows\n\n```bash\n{baseDir}/scripts/supabase.sh update <table> '<json>' --eq <col:val>\n\n# Example\n{baseDir}/scripts/supabase.sh update users '{\"status\": \"inactive\"}' --eq \"id:123\"\n{baseDir}/scripts/supabase.sh update posts '{\"published\": true}' --eq \"author_id:5\"\n```\n\n### upsert - Insert or update\n\n```bash\n{baseDir}/scripts/supabase.sh upsert <table> '<json>'\n\n# Example (requires unique constraint)\n{baseDir}/scripts/supabase.sh upsert users '{\"id\": 1, \"name\": \"Updated Name\"}'\n```\n\n### delete - Delete rows\n\n```bash\n{baseDir}/scripts/supabase.sh delete <table> --eq <col:val>\n\n# Example\n{baseDir}/scripts/supabase.sh delete sessions --lt \"expires_at:2024-01-01\"\n```\n\n### vector-search - Similarity search with pgvector\n\n```bash\n{baseDir}/scripts/supabase.sh vector-search <table> \"<query>\" [options]\n\nOptions:\n  --match-fn <name>     RPC function name (default: match_<table>)\n  --limit <n>           Number of results (default: 5)\n  --threshold <n>       Similarity threshold 0-1 (default: 0.5)\n  --embedding-model <m> Model for query embedding (default: uses OpenAI)\n\n# Example\n{baseDir}/scripts/supabase.sh vector-search documents \"How to set up authentication\" --limit 10\n\n# Requires a match function like:\n# CREATE FUNCTION match_documents(query_embedding vector(1536), match_threshold float, match_count int)\n```\n\n### tables - List all tables\n\n```bash\n{baseDir}/scripts/supabase.sh tables\n```\n\n### describe - Show table schema\n\n```bash\n{baseDir}/scripts/supabase.sh describe <table>\n```\n\n### rpc - Call stored procedure\n\n```bash\n{baseDir}/scripts/supabase.sh rpc <function_name> '<json_params>'\n\n# Example\n{baseDir}/scripts/supabase.sh rpc get_user_stats '{\"user_id\": 123}'\n```\n\n## Vector Search Setup\n\n### 1. Enable pgvector extension\n\n```sql\nCREATE EXTENSION IF NOT EXISTS vector;\n```\n\n### 2. Create table with embedding column\n\n```sql\nCREATE TABLE documents (\n  id bigserial PRIMARY KEY,\n  content text,\n  metadata jsonb,\n  embedding vector(1536)\n);\n```\n\n### 3. Create similarity search function\n\n```sql\nCREATE OR REPLACE FUNCTION match_documents(\n  query_embedding vector(1536),\n  match_threshold float DEFAULT 0.5,\n  match_count int DEFAULT 5\n)\nRETURNS TABLE (\n  id bigint,\n  content text,\n  metadata jsonb,\n  similarity float\n)\nLANGUAGE plpgsql\nAS $$\nBEGIN\n  RETURN QUERY\n  SELECT\n    documents.id,\n    documents.content,\n    documents.metadata,\n    1 - (documents.embedding <=> query_embedding) AS similarity\n  FROM documents\n  WHERE 1 - (documents.embedding <=> query_embedding) > match_threshold\n  ORDER BY documents.embedding <=> query_embedding\n  LIMIT match_count;\nEND;\n$$;\n```\n\n### 4. Create index for performance\n\n```sql\nCREATE INDEX ON documents \nUSING ivfflat (embedding vector_cosine_ops)\nWITH (lists = 100);\n```\n\n## Environment Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| SUPABASE_URL | Yes | Project URL (https://xxx.supabase.co) |\n| SUPABASE_SERVICE_KEY | Yes | Service role key (full access) |\n| SUPABASE_ANON_KEY | No | Anon key (restricted access) |\n| SUPABASE_ACCESS_TOKEN | No | Management API token |\n| OPENAI_API_KEY | No | For generating embeddings |\n\n## Notes\n\n- Service role key bypasses RLS (Row Level Security)\n- Use anon key for client-side/restricted access\n- Vector search requires pgvector extension\n- Embeddings default to OpenAI text-embedding-ada-002 (1536 dimensions)\n","topics":["Database","SQL"],"tags":{"latest":"1.0.1"},"stats":{"comments":0,"downloads":736,"installsAllTime":28,"installsCurrent":1,"stars":0,"versions":2},"createdAt":1773167232954,"updatedAt":1779077966775},"latestVersion":{"version":"1.0.1","createdAt":1773167356344,"changelog":"- Internal metadata updated (no user-facing changes).\n- All features and CLI behaviors remain unchanged.","license":"MIT-0"},"metadata":{"setup":[{"key":"SUPABASE_URL","required":true},{"key":"SUPABASE_SERVICE_KEY","required":true}],"os":null,"systems":null},"owner":{"handle":"ecosincronia","userId":"s177ngdexr9b3412fhy53mpf45884frh","displayName":"EcosincronIA","image":"https://avatars.githubusercontent.com/u/242621438?v=4"},"moderation":{"isSuspicious":false,"isMalwareBlocked":false,"verdict":"clean","reasonCodes":["review.llm_review"],"summary":"Review: review.llm_review","engineVersion":"v2.4.24","updatedAt":1780089832194}}