Contributing
Contributions are welcome, new drivers especially. This page is the short version. The full guide is CONTRIBUTING.md in the repository.
Before you start
- Read the Code of Conduct.
- Open an issue before a large change, and before you start a new driver, so we can agree on the scope first.
- Never commit real credentials: not in code, tests, fixtures or issues.
- Report security problems privately; see Security.
Build and test
tobira is a multi-module repository tied together by go.work. You need Go 1.26 or newer, and
Node 22 (through nvm) for the docs site.
make build # build cmd/tobira/tobira
make all # fmt, vet, check-deps, check-claims, test and lint, every module
make check-claims # check the README and docs against the code
make site-linkcheck # build this site and fail on a broken internal link
make demo # record the README's demo GIF with vhs
Integration tests
make all runs the unit tests, which need no database. Integration tests run with
go test -tags integration in a driver module and start real databases with testcontainers, so
they need Docker.
- Without a Docker daemon they stop at once with an error such as
start postgres container: Cannot connect to the Docker daemon. Start Docker Desktop, or another Docker-compatible runtime such as Colima or Podman. With a non-default socket, pointDOCKER_HOSTat it (for Colima,unix://$HOME/.colima/default/docker.sock). - Or leave them to CI, which runs the integration suite of every driver on Linux.
- SQLite and Cloudflare D1 need no container: all their tests run in
make all. The DuckDB plugin’s tests use an embedded DuckDB. - Some suites use large images: Snowflake builds a fakesnow image, pinecone-local is amd64 only and runs under emulation on Apple silicon, and Oracle’s image needs about 2.3 GB of disk.
Keep the docs in step
A feature appears in the README or on this site only once it exists and is tested.
make check-claims, part of make all, checks the docs against the code: the CLI reference
against the command tree, the drivers matrix against the registered drivers and their
capabilities, the driver count, the MCP tools and the ai: defaults. When you add a command, a
flag or a capability, update the CLI reference, the README and the agent skill in the
same commit.
Commits
Use Conventional Commits: fix: is a patch, feat: a minor
and feat!: or BREAKING CHANGE: a major release. Scopes are driver, drivertest, cli,
site and the plain driver name (postgres, sqlite, …).
Write a driver
Start from Write a driver and examples/custom-driver-module, or
examples/custom-driver-plugin for an external plugin. Every driver must pass the drivertest
conformance kit with Strict: true, and a new database is a new drivers/<name> module: the root
module never depends on a database SDK.