Skip to main content
skill CX Codex

surrealkit — Claude Code skill: SurrealDB schema migrations

A skill that teaches your agent to drive SurrealKit, the CLI for syncing SurrealDB schemas, planning migrations and generating types.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add surrealdb/agent-skills --skill surrealkit -a claude-code
Open on GitHub

What surrealkit does

SurrealKit keeps a SurrealDB database in step with your .surql schema files. In development you run surrealkit sync and the database is reconciled to whatever the files say. Shared and production databases go through surrealkit rollout, which plans, executes and rolls back migrations in stages.

The skill maps out the whole command set: init scaffolds a project from a template, check analyses SurrealQL without touching a database, typegen introspects a live database and emits JSON or TypeScript types, test runs declarative TOML suites for schemas, permissions and API endpoints. Template variables use ${VAR_NAME} tokens, and settings resolve in a fixed order — [target.<name>] in surrealkit.toml, then CLI flags, environment variables, .env, defaults.

One thing to check before you upgrade: the DATABASE_* aliases are gone in 1.0. Setting one without its SURREALDB_* replacement is a hard error rather than a quiet fallback, so .env files and CI configs need updating. Embedded engines such as surrealkv:// skip authentication, but they take an exclusive lock, which means stopping the application before running the CLI against one. Building from source needs a C compiler and cmake.

What it helps with

  • scaffold a new SurrealDB project from a template
  • reconcile a dev database with the current schema files
  • plan and roll back a production migration
  • check SurrealQL statically without a database
  • emit TypeScript types from a live schema

Example prompts for the agent

  • Scaffold a new SurrealDB project with surrealkit init
  • Sync the schema to my dev database with surrealkit sync
  • Plan a rollout for this migration and show the rollback steps

How to install surrealkit

1Skills CLI (Vercel)

npx skills add surrealdb/agent-skills --skill surrealkit -a claude-code

2Manually: put the files in place

~/.claude/skills/surrealkit/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/surrealkit/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about surrealkit

How do I install surrealkit in Claude?

Run npx skills add surrealdb/agent-skills --skill surrealkit -a claude-code. The skill lands in ~/.claude/skills/surrealkit/SKILL.md.

What does surrealkit do?

It teaches an agent to work with SurrealKit: scaffolding projects, syncing schemas, planning and rolling back migrations, static SurrealQL checks, type generation and TOML test suites.

What do I need before using the skill?

The SurrealKit CLI itself. cargo binstall surrealkit is the quickest route; building from source needs a C compiler and cmake.

Source text

SKILL.md · MIT
---
name: surrealkit
description: "Use SurrealKit, SurrealDB's schema-management and migration CLI, to scaffold projects from templates, sync schema in development, plan and execute production rollouts (with rollback), statically check SurrealQL without a database, generate JSON/TypeScript types, and write declarative TOML test suites for schemas, permissions, and API endpoints. Use this skill whenever users set up, migrate, type, check, or test a SurrealDB schema with SurrealKit."
metadata:
  author: surrealdb
  version: "0.2.0"
---

# SurrealKit

A skill for driving [SurrealKit](https://github.com/surrealdb/surrealkit), SurrealDB's schema-management and migration CLI. Written against **SurrealKit 1.0** (currently `1.0.0-beta.3`).

SurrealKit keeps a SurrealDB database in sync with `.surql` schema files. It provides two complementary workflows — a fast declarative **sync** for development and controlled, phased **rollouts** for shared and production databases — plus seeding, static analysis, type generation, and a declarative testing framework.

## When to use this skill

Reference these guidelines when:

- Scaffolding a new SurrealDB project (`surrealkit init`) or authoring templates
- Applying schema changes in development (`surrealkit sync`)
- Planning, executing, or rolling back production migrations (`surrealkit rollout`)
- Adopting SurrealKit on a database that already exists (`surrealkit rollout baseline`)
- Splitting a schema into independently tracked modules, or applying it to several databases
- Statically checking SurrealQL against the schema without a database (`surrealkit check`)
- Generating JSON or TypeScript types from a live schema (`surrealkit typegen`)
- Writing or running declarative tests for schemas, permissions, or API endpoints (`surrealkit test`)

This skill covers the SurrealKit tool itself. To write the actual schema, seed, and query statements that go in `.surql` files, use the **surrealql** skill.

## Installation

| Method | Command |
| --- | --- |
| `cargo binstall` (recommended) | `cargo binstall surrealkit` |
| Cargo (from source) | `cargo install surrealkit` |
| Docker | `docker pull ghcr.io/surrealdb/surrealkit:latest` |
| Prebuilt tarball | [GitHub Releases](https://github.com/surrealdb/surrealkit/releases) |

Building from source needs a C compiler and `cmake`. Static analysis is on by default and adds `tree-sitter` (~7.5 MiB, ~100s of build time); drop it with `cargo install surrealkit --no-default-features --features kv-mem,cli` — that binary has no `check`, `generate`, or `watch`. Prebuilt binaries and `cargo binstall` always include analysis.

The Docker image is distroless (~25 MB, uid 65532) and exits on completion, which suits "apply schema then run tests" pipelines in Docker Compose alongside SurrealDB.

## Command map

| Command | Purpose | Reference |
| --- | --- | --- |
| `surrealkit init` | Scaffold a project from a template, selecting optional features | [init-templates.md](references/init-templates.md) |
| `surrealkit sync` | Declaratively reconcile the database to your schema files (dev) | [sync-rollouts.md](references/sync-rollouts.md) |
| `surrealkit rollout <sub>` | Plan, stage, complete, roll back, and repair migrations (shared/prod) | [sync-rollouts.md](references/sync-rollouts.md) |
| `surrealkit seed [--force]` | Run seeding files in `database/seed/` (idempotent, hash-tracked) | [sync-rollouts.md](references/sync-rollouts.md) |
| `surrealkit check` | Statically analyse the project's SurrealQL — no database contacted | [static-analysis.md](references/static-analysis.md) |
| `surrealkit generate` / `watch` | Emit / continuously refresh a typed client for embedded queries | [static-analysis.md](references/static-analysis.md) |
| `surrealkit typegen` | Introspect a live DB and emit JSON / TypeScript types | [typegen.md](references/typegen.md) |
| `surrealkit test` | Run declarative TOML test suites | [testing.md](references/testing.md) |
| `surrealkit apply <path>` | Apply a single `.surql` file directly | — |
| `surrealkit setup` | Run `database/setup.surql` (SurrealKit's own metadata tables) | — |
| `surrealkit status` | Show sync/rollout state | — |

Run `surrealkit <command> --help` to confirm available flags for an installed version.

## Connection & config

Global flags work on every command and resolve in this order (highest wins):
**`[target.<name>]` in `surrealkit.toml` > CLI flags > system env vars > `.env` file > defaults**.

```bash
surrealkit --host http://localhost:8000 --ns my_ns --db my_db \
  --user root --pass root --auth-level root sync
```

| Flag | Env var | Default |
| --- | --- | --- |
| `--host` | `SURREALDB_HOST` | `http://localhost:8000` |
| `--ns` | `SURREALDB_NAMESPACE` | `db` |
| `--db` | `SURREALDB_NAME` | `test` |
| `--user` | `SURREALDB_USER` | `root` |
| `--pass` | `SURREALDB_PASSWORD` | `root` |
| `--auth-level` | `SURREALDB_AUTH_LEVEL` | `root` (`root` / `namespace`\|`ns` / `database`\|`db` / `none`) |
| `--folder` | `SURREALDB_FOLDER` | `./database` |
| `--connect-timeout-secs` | `SURREALDB_CONNECT_TIMEOUT_SECS` | `30` (`0` waits indefinitely) |
| `--query-timeout-secs` | `SURREALDB_QUERY_TIMEOUT_SECS` | unset (a rollout step's SQL waits indefinitely) |

> **The `DATABASE_*` aliases were removed in 1.0.** Setting one without its `SURREALDB_*` replacement is a hard error, not a silent fallback. Update `.env` files and CI when upgrading.

Selection flags are also global: `-s/--schema <name>`, `-t/--target <name>`, `--all`, `--keep-going`, `--no-deps` — see [modules-targets.md](references/modules-targets.md).

The project root holds `surrealkit.toml` with `[variables]`, `[typegen]`, `[analyze]`, `[schema.*]`, and `[target.*]` sections.

### Embedded databases

Point `--host` at an embedded endpoint to manage an in-process datastore; authentication is skipped automatically.

```bash
surrealkit --host surrealkv://./data --ns my_ns --db my_db sync
```

Schemes: `surrealkv://`, `rocksdb://`, `speedb://`, `mem://`, `file://`, `tikv://`. `--auth-level none` forces the no-signin path on any endpoint. The **prebuilt CLI bundles only the in-memory engine** — for on-disk engines build with `--features kv-surrealkv` (or `kv-rocksdb`, or `embedded`). Embedded engines take an exclusive lock, so stop the application before running the CLI against one; to manage schema from inside an application at startup, use the library instead.

## Template variables

Use `${VAR_NAME}` tokens in any `.surql` file (schema, seed, or rollout SQL). Names are case-insensitive. Values resolve in order (highest wins):

1. `--var KEY=VALUE` CLI flag (repeatable)
2. `SURREALKIT_VAR_<KEY>` environment variable
3. `[variables]` section in `surrealkit.toml`

```toml
# surrealkit.toml
[variables]
schema_prefix = "myapp"
talent_username = "talent_rw"
```

```bash
surrealkit sync --var schema_prefix=acme --var talent_username=talent_rw
```

- An **undefined variable is a hard error** — SurrealKit never silently skips it or leaves the token in the SQL.
- Escape a literal `${...}` by doubling the dollar sign: `$${literal}`.
- Substitution is textual, so `${VAR}` inside a SurrealQL string literal is also replaced.
- Substitution runs on `sync`, `seed`, `apply`, and `rollout start/complete/rollback`. It does **not** run on `rollout plan/baseline/status/lint` (no user SQL executes there).

## Project layout

`surrealkit init` creates a `database/` directory (override the root with `--folder` / `SURREALDB_FOLDER`):

```
database/
├── schema/                     # Schema definitions (.surql) — the default module, the source of truth
├── modules/<name>/schema/      # Additional schema modules, when declared in surrealkit.toml
├── rollouts/                   # Generated rollout manifests (.toml)
├── snapshots/                  # Drift tracking — what `rollout plan` diffs against
│   ├── schema_snapshot.json
│   └── catalog_snapshot.json
├── seed/                       # Seeding files (.surql)
├── tests/
│   ├── suites/                 # Test suites (.toml)
│   ├── fixtures/               # Test fixture data (.surql)
│   └── config.toml             # Global test config
└── setup.surql                 # One-time setup script (SurrealKit's own metadata tables)
surrealkit.toml                 # Project config
```

SurrealKit tracks its own state in three metadata tables on your database: `__entity` (file hashes and per-definition records), `__rollout` (rollout run state), and `__seed` (seed-file hashes).

## Rules & conventions

- **Sync vs rollout:** use `sync` for local, preview, and other disposable databases where it is safe to match files immediately; use `rollout` for shared/production databases that need review, staged execution, rollback, or operator-controlled cutover.
- Schema files are the source of truth. `sync` creates, updates, and prunes SurrealKit-managed objects to match the schema directory.
- Schema files should contain `DEFINE`/`REMOVE` statements. Allow other statements (`INSERT`, `UPDATE`, `CREATE`) only with `--allow-all-statements`, which disables catalog entity tracking.
- **`rollout plan` diffs against `database/snapshots/`, not the live database, and `sync` never writes snapshots.** Adopting rollouts after a period of sync-only work needs a `rollout baseline` first, or the first plan proposes every file you have.
- Commit the generated manifest *and* the refreshed snapshots together; reverting a plan means reverting both.
- Store SurrealQL in files with the `.surql` extension. Validate and format generated SurrealQL with the tools described in the **surrealql** skill (`surreal validate`, `npx @surrealdb/surql-fmt`), and gate it in CI with `surrealkit check`.
- SurrealKit is young and evolving; confirm command surfaces against `surrealkit --help` and the [README](https://github.com/surrealdb/surrealkit).

## Using SurrealKit as a Rust library

The `surrealkit` crate runs sync, seed, and rollouts from inside an application — useful for applying schema at startup, or for embedded engines the CLI cannot hold a lock on.

```toml
[dependencies]
surrealkit = { version = "1.0.0-beta.3", default-features = false, features = ["kv-mem"] }
```

- `default = ["kv-mem", "cli"]`; library consumers drop `cli` to shed `clap`, `inquire`, `rustls`, and `tempfile`.
- `embed_schema!` and `embed_seed!` compile the schema and seed files into the binary, so no filesystem is needed at runtime.
- `Sync` is a builder for runtime control; `Rollout` no longer writes to disk as of 1.0.
- Progress is emitted through the [`log`](https://docs.rs/log) facade; without a logger the library is silent.

Full API reference: [`crates/surrealkit/README.md`](https://github.com/surrealdb/surrealkit/blob/main/crates/surrealkit/README.md). Upgrade notes: [`MIGRATING.md`](https://github.com/surrealdb/surrealkit/blob/main/MIGRATING.md).

## References

- Project scaffolding and templates — [references/init-templates.md](references/init-templates.md)
- Development sync, production rollouts, and seeding — [references/sync-rollouts.md](references/sync-rollouts.md)
- Schema modules and database targets — [references/modules-targets.md](references/modules-targets.md)
- Static analysis (`check` / `generate` / `watch`) — [references/static-analysis.md](references/static-analysis.md)
- Type generation (JSON and TypeScript) — [references/typegen.md](references/typegen.md)
- Declarative testing framework — [references/testing.md](references/testing.md)

© surrealdb · MIT · surrealdb/agent-skills

Similar skills

All skills for Data and databases →

From the same set5

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor