# agent runs a migration $ supabase db push Connecting to remote database... Applying migration 20260208_add_users.sql... Finished supabase db push.
Can AI agents use Supabase?
Open-source Firebase alternative CLI. Agents manage databases, run migrations, generate types, and manage edge functions.
See the latest run →Supabase eval results by model
| Model | Pass rate | Avg turns | Avg tokens |
|---|---|---|---|
| gpt-5-nano | 71% | 4.6 | 16.0k |
Supabase task results by model
| Task | gpt-5-nano |
|---|---|
show-helpeasy Show the top-level supabase CLI help to list all available commands. | ✓3t |
init-projecteasy Initialize a new Supabase project in the current directory. | ✓4t |
version-checkeasy Display the installed Supabase CLI version. | ✓1t |
subcommand-helpeasy Show the help for the 'supabase db' subcommand to see available database operations. | ✓1t |
create-migrationmedium After initializing a Supabase project, create a new migration called 'create_users' that creates a users table with id (uuid primary key), email (text unique not null), and created_at (timestamptz default now()). | ✓8t |
create-functionmedium After initializing a Supabase project, create a new edge function called 'hello' using the supabase CLI. | ✓6t |
migration-with-rlsmedium After initializing a Supabase project, create a migration called 'add_rls_policies' that enables RLS on a 'posts' table and adds a policy allowing authenticated users to read all posts. | ✗8t |
seed-filemedium After initializing a Supabase project, create a supabase/seed.sql file that inserts 3 test users into a users table with emails user1@test.com, user2@test.com, user3@test.com. | ✓6t |
config-inspectionmedium Initialize a Supabase project, then inspect the generated config.toml. Report the default API port and the auth settings. | ✓6t |
function-with-corsmedium After initializing a Supabase project, create an edge function called 'api' and modify its index.ts to include CORS headers (Access-Control-Allow-Origin: *) and return a JSON response with {"status": "ok"}. | ✓8t |
start-no-dockerhard Initialize a Supabase project and attempt to run 'supabase start'. Report the error about Docker not being available. | ✓3t |
full-schema-migrationhard Initialize a Supabase project and create a migration called 'full_schema' that: creates a 'products' table (id uuid PK default gen_random_uuid(), name text not null, price numeric not null, created_at timestamptz default now()), adds an index on 'name', and enables RLS with a read policy for all users. | ✗10t |
multi-migration-flowhard Initialize a Supabase project and create three sequential migrations: 'create_users' (users table with id, email, created_at), 'create_posts' (posts table with id, title, body, user_id FK referencing users), and 'add_indexes' (indexes on users.email and posts.user_id). | ✗12t |
config-and-seedhard Initialize a Supabase project, create a migration called 'create_todos' with a todos table (id serial PK, title text not null, done boolean default false), then create a seed.sql that inserts 5 sample todos. | ✗10t |
Task suite source188 lines · YAML
- id: show-help
intent: Show the top-level supabase CLI help to list all available commands.
assert:
- ran: supabase.*help|supabase --help
- exit_code: 0
setup: []
max_turns: 3
difficulty: easy
category: discovery
- id: init-project
intent: Initialize a new Supabase project in the current directory.
assert:
- ran: supabase init
- file_exists: supabase/config.toml
setup: []
max_turns: 4
difficulty: easy
category: discovery
- id: version-check
intent: Display the installed Supabase CLI version.
assert:
- ran: supabase.*--version
- exit_code: 0
setup: []
max_turns: 3
difficulty: easy
category: discovery
- id: subcommand-help
intent: Show the help for the 'supabase db' subcommand to see available database
operations.
assert:
- ran: supabase db.*--help|supabase.*help.*db
- exit_code: 0
setup: []
max_turns: 3
difficulty: easy
category: discovery
- id: create-migration
intent: After initializing a Supabase project, create a new migration called
'create_users' that creates a users table with id (uuid primary key), email
(text unique not null), and created_at (timestamptz default now()).
assert:
- ran: supabase.*migration.*new|supabase db.*migration
- verify:
run: ls supabase/migrations/
output_contains: create_users
setup:
- supabase init
max_turns: 8
difficulty: medium
category: migration
- id: create-function
intent: After initializing a Supabase project, create a new edge function called
'hello' using the supabase CLI.
assert:
- ran: supabase functions new|supabase functions create
- file_exists: supabase/functions/hello/index.ts
setup:
- supabase init
max_turns: 6
difficulty: medium
category: functions
- id: migration-with-rls
intent: After initializing a Supabase project, create a migration called
'add_rls_policies' that enables RLS on a 'posts' table and adds a policy
allowing authenticated users to read all posts.
assert:
- ran: supabase.*migration.*new
- verify:
run: cat supabase/migrations/*add_rls_policies*.sql
output_contains: ROW LEVEL SECURITY
setup:
- supabase init
max_turns: 8
difficulty: medium
category: migration
- id: seed-file
intent: After initializing a Supabase project, create a supabase/seed.sql file
that inserts 3 test users into a users table with emails user1@test.com,
user2@test.com, user3@test.com.
assert:
- file_exists: supabase/seed.sql
- file_contains:
path: supabase/seed.sql
text: user1@test.com
- file_contains:
path: supabase/seed.sql
text: user3@test.com
setup:
- supabase init
max_turns: 6
difficulty: medium
category: config
- id: config-inspection
intent: Initialize a Supabase project, then inspect the generated config.toml.
Report the default API port and the auth settings.
assert:
- ran: cat.*config.toml|supabase.*config
- output_contains: port
setup:
- supabase init
max_turns: 6
difficulty: medium
category: config
- id: function-with-cors
intent: "After initializing a Supabase project, create an edge function called
'api' and modify its index.ts to include CORS headers
(Access-Control-Allow-Origin: *) and return a JSON response with
{\"status\": \"ok\"}."
assert:
- file_exists: supabase/functions/api/index.ts
- file_contains:
path: supabase/functions/api/index.ts
text: Access-Control-Allow-Origin
setup:
- supabase init
max_turns: 8
difficulty: medium
category: functions
- id: start-no-docker
intent: Initialize a Supabase project and attempt to run 'supabase start'.
Report the error about Docker not being available.
assert:
- ran: supabase start
setup:
- supabase init
max_turns: 5
difficulty: hard
category: error-handling
- id: full-schema-migration
intent: "Initialize a Supabase project and create a migration called
'full_schema' that: creates a 'products' table (id uuid PK default
gen_random_uuid(), name text not null, price numeric not null, created_at
timestamptz default now()), adds an index on 'name', and enables RLS with a
read policy for all users."
assert:
- verify:
run: cat supabase/migrations/*full_schema*.sql
output_contains: products
- verify:
run: cat supabase/migrations/*full_schema*.sql
output_contains: INDEX
- verify:
run: cat supabase/migrations/*full_schema*.sql
output_contains: ROW LEVEL SECURITY
setup:
- supabase init
max_turns: 10
difficulty: hard
category: workflow
- id: multi-migration-flow
intent: "Initialize a Supabase project and create three sequential migrations:
'create_users' (users table with id, email, created_at), 'create_posts'
(posts table with id, title, body, user_id FK referencing users), and
'add_indexes' (indexes on users.email and posts.user_id)."
assert:
- verify:
run: ls supabase/migrations/ | wc -l
output_contains: "3"
- verify:
run: ls supabase/migrations/
output_contains: create_users
- verify:
run: ls supabase/migrations/
output_contains: create_posts
setup:
- supabase init
max_turns: 12
difficulty: hard
category: workflow
- id: config-and-seed
intent: Initialize a Supabase project, create a migration called 'create_todos'
with a todos table (id serial PK, title text not null, done boolean default
false), then create a seed.sql that inserts 5 sample todos.
assert:
- verify:
run: ls supabase/migrations/
output_contains: create_todos
- file_exists: supabase/seed.sql
- file_contains:
path: supabase/seed.sql
text: INSERT
setup:
- supabase init
max_turns: 10
difficulty: hard
category: workflow
Evals are a snapshot, not a verdict. We run identical tasks across all models to keep comparisons fair. Results vary with CLI version, task selection, and model updates. Evals run weekly on 14 tasks using @cliwatch/cli-bench.
What you get with CLIWatch
Everything below is running live for Supabase — see the latest run. Set up the same for your CLI in minutes.
| Model | Pass Rate | Delta |
|---|---|---|
| Sonnet 4.5 | 95% | +5% |
| GPT-4.1 | 80% | -5% |
| Haiku 4.5 | 65% | -10% |
CI & PR Comments
Get automated PR comments with per-model pass rates, regressions, and a link to the full comparison dashboard.
Track Over Time
See how your CLI's agent compatibility changes across releases. Spot trends and regressions at a glance.
thresholds:
claude-sonnet-4-5: 80%
gpt-4.1: 75%
claude-haiku-4-5: 60%Quality Gates
Set per-model pass rate thresholds. CI fails if evals drop below your targets.
Get this for your CLI
Run evals in CI, get PR comments with regressions, track pass rates over time, and gate merges on quality thresholds — all from a single GitHub Actions workflow.