Agent skill

Postgresql

by speakeasy-api in speakeasy-api/gram

Rules when working with PostgreSQL database in Gram. An agent skill from speakeasy-api/gram.

AGPL-3.0Auto-check passedDatabases

Install Postgresql

skills CLI
$ npx skills add speakeasy-api/gram --skill postgresql -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install speakeasy-api/gram postgresql --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/postgresql .claude/skills/postgresql && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
postgresql
GitHub stars
272
Token cost
~3.4k tokens
SKILL.md length
1,841 words
Files
1
Skills in repo
39
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Rules when working with PostgreSQL database in Gram. An agent skill from speakeasy-api/gram.

  • Works in 4 steps: Edit server/database/schema.sql and run… → Append NOT VALID to each generated ADD… → Make -- atlas:txmode none the first line… → …
  • Databases work in your project
  • SKILL.md covers When to Apply, Rules, Schema design rules and Reviewing schema changes, plus 2 more sections
  • Calls mise

What it does

Postgresql is an agent skill from speakeasy-api/gram. Rules when working with PostgreSQL database in Gram

Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Databases. It works with PostgreSQL. The repository describes itself as: Securely scale AI usage across your organization. A single stack to Connect, Secure, Observe and Distribute agents, MCPs, and Skills within your company. The licence is AGPL-3.0.

When your agent uses it

  • Databases work in your project

Example prompts

  • “Use the postgresql skill to rule when working with PostgreSQL database in Gram. An agent skill from speakeasy-api/gram”
  • “/postgresql”

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Edit server/database/schema.sql and run mise run db:diff as usual.
  2. Append NOT VALID to each generated ADD CONSTRAINT clause in place, leaving Atlas's combined ALTER TABLE intact, then add one ALTER TABLE…
  3. Make -- atlas:txmode none the first line of the file. The two statements must not share a transaction: inside one transaction the ACCESS…
  4. Run mise run db:hash to re-hash atlas.sum. Until you do, every Atlas command fails on a checksum mismatch.

What it can do on your machine

Read from SKILL.md and the folder at commit ad78247. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • mise

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • atlasgo.io

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Postgresql loads about 3.4k tokens when it runs. Until then it costs about 16 tokens; SKILL.md has 1,841 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~16
When it runs · the whole SKILL.md, loaded when a task matches
~3.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from speakeasy-api/gram at commit ad78247, republished under its AGPL-3.0 licence (© speakeasy-api). 1,841 words, ~3,441 tokens.

Download SKILL.mdSave it as .claude/skills/postgresql/SKILL.md (or your agent's skills folder).
name
postgresql
description
Rules when working with PostgreSQL database in Gram

PostgreSQL Best Practices

Comprehensive guidelines when working with PostgreSQL database to build Gram which include rules for schema design, database migration and application logic. All rules are kept in a rules folder with names of each rule outlined below (e.g. rules/<rule-name>.md).

When to Apply

Reference these guidelines when:

  • Creating database migrations
  • Writing queries used in application code especially with SQLc
  • Updating existing database schemas
  • Creating pull requests that involve database changes

Rules

  • Code Formatting and Comments:

    • Maintain consistent code formatting using a tool like pgformatter or similar.
    • Use clear and concise comments to explain complex logic and intentions. Update comments regularly to avoid confusion.
    • Use inline comments sparingly; prefer block comments for detailed explanations.
    • Write comments in plain, easy-to-follow English.
    • Add a space after line comments (-- a comment); do not add a space for commented-out code (--raise notice).
    • Keep comments up-to-date; incorrect comments are worse than no comments.
  • Naming Conventions:

    • Use snake_case for identifiers (e.g., user_id, customer_name).
    • Use plural nouns for table names (e.g., customers, products).
    • Use consistent naming conventions for functions, procedures, and triggers.
    • Choose descriptive and meaningful names for all database objects.
  • Data Integrity and Data Types:

    • Use appropriate data types for columns to ensure data integrity (e.g., INTEGER, VARCHAR, TIMESTAMP).
    • Use constraints (e.g., NOT NULL, FOREIGN KEY) to enforce data integrity but not for UNIQUE-ness — that is enforced with unique indexes.
    • Do not use CHECK constraints for pure enumeration / value validation (e.g. CHECK (status IN ('active', 'inactive'))). Validate allowed values in application code, where they can evolve without a migration. Exception: keep CHECKs that are structural to the Class Table Inheritance (CTI) pattern, e.g. pinning a subtype's discriminator (CHECK (provider = 'aws_kms')) so the composite foreign key back to the supertype enforces 1:1 semantics.
    • Define primary keys for all tables.
    • Use foreign keys to establish relationships between tables.
    • Utilize domains to enforce data type constraints reusable across multiple columns.
    • All foreign keys constraints must ALWAYS specify an ON DELETE SET NULL clause.
  • Indexing:

    • Create indexes on columns frequently used in WHERE clauses and JOIN conditions.
    • Avoid over-indexing, as it can slow down write operations.
    • Consider using partial indexes for specific query patterns.
    • Use appropriate index types (e.g., B-tree, Hash, GIN, GiST) based on the data and query requirements.
    • When a unique key exists mainly to be a foreign-key target (e.g. a composite (organization_id, id) key that a tenant-scoped child composite-FKs to for tenancy pinning), declare it as a CREATE UNIQUE INDEX, not a table-level UNIQUE constraint. Postgres accepts a non-partial, plain-column unique index as an FK target. This matters when adding the key to an existing table: ALTER TABLE ... ADD CONSTRAINT ... UNIQUE takes an ACCESS EXCLUSIVE lock and builds the index synchronously, whereas a CREATE UNIQUE INDEX (which Atlas automatically emits as CONCURRENTLY per its concurrent_index policy) does not. Trade-off: a concurrent index makes the migration non-transactional (Atlas emits -- atlas:txmode none for you), so keep such migrations minimal.
    • Adding a CHECK or FOREIGN KEY constraint to an existing table takes an ACCESS EXCLUSIVE lock while Postgres scans every existing row, blocking reads and writes for the duration. Atlas reports this as lint PG305 (CHECK) or PG306 (FOREIGN KEY) but has no diff policy that avoids it, so the online-safe two-step form has to be hand-written: see the NOT VALID recipe under Database migrations.
  • Schema evolution:

    • Use expand-contract pattern instead of removing existing columns from a schema. Introduce new columns instead when appropriate.
    • ALWAYS call out when making a backwards incompatible schema change.
    • Suggest running mise db:diff <migration-name> after making schema changes to generate a migration file. Replace <migration-name> with a clear snake-case migration id such as users-add-email-column.
    • If you need to undo a migration then run: 1. mise run db:reset 2. mise run db:migrate to re-run all migrations from the beginning.
<relevant-tasks>
  • mise run db:diff <name-of-migrations>: Create a database migration
  • mise run db:reset: Drop the database and re-create it. No migrations applied at this point.
  • mise run db:migrate: Run all pending database migrations. If you have just reset the database, this will run all migrations from the beginning.
</relevant-tasks>

Schema design rules

Multi-tenancy by project

When creating any tables, add a non-nullable column named project_id of type uuid with a foreign key constraint to the projects table. If appropriate to the nature and usage patterns of the table also include organization_id TEXT NOT NULL column.

Change tracking

All tables should have created_at and updated_at columns:

sql
create table if not exists example (
  -- ...
  created_at timestamptz not null default clock_timestamp(),
  updated_at timestamptz not null default clock_timestamp() on update clock_timestamp(),
  -- ...
);
Always soft delete

A nullable deleted_at column may be added to tables to perform soft deletes:

sql
create table if not exists example (
  -- ...
  deleted_at timestamptz,
  deleted boolean not null generated always as (deleted_at is not null) stored,
  -- ...
);

Deleting rows with DELETE FROM table is not strongly discouraged. Instead, use:

sql
UPDATE example SET deleted_at = clock_timestamp() WHERE id = ?;
File structure

server/database/schema.sql is DDL only — no DO, ALTER, or other procedural blocks. Declare tables in dependency order so every FOREIGN KEY resolves inline; if a target is declared later, move it up.

Constraint naming

All constraints should be named with this format:

{tablename}_{columnname(s)}_{suffix}

Where suffix is:

  • key for a unique constraint
  • fkey for a foreign key constraint
  • idx for any other kind of index
  • check for a check constraint
  • excl for an exclusion constraint
  • seq for an sequences

Reviewing schema changes

Backwards compatibity

Ensure that all schema changes are designed for backwards compatibility.

These are examples of terrible practices to avoid:

  • Adding a non-nullable column to an existing table.
  • Removing a column from a table.
  • Changing the data type of an existing column.
  • Renaming an existing column.
  • Changing the meaning or usage of an existing column.
  • Adding unique constraints or indexes to existing columns without considering the impact on existing data and queries.

Instead, strongly consider these better alternatives:

  • Adding nullable columns to existing tables.
  • Deprecating columns by making them nullable.
  • Using expand-contract pattern for evolving schemas without causing outages.
Show full SKILL.md (943 more words)Show less

Database migrations

These rules apply any time you touch server/migrations/, atlas.sum, or server/database/schema.sql. They are non-negotiable.

Gram uses Atlas in versioned mode. Two file kinds are involved, and they are not the same thing:

  • server/database/schema.sql is the SDL — the declarative, desired-state schema. This is the file you edit.
  • server/migrations/*.sql are the DDL diff Atlas generates from that schema. Running mise db:diff <name> computes the delta (e.g. ALTER TABLE ... ADD COLUMN ...), writes a new timestamped migration file, and updates atlas.sum.

Rules:

  • Migrations ship in their own PR. No application/business-logic code, no backfills, no unrelated changes alongside. Shipping migrations with business logic risks outages — the server can query a schema that has not rolled out yet — and makes the PR hard to revert.

  • Migration files and atlas.sum are produced only by the Atlas CLI (mise run db:diff). Never hand-edit, rename, or rehash them. There is exactly one sanctioned exception: the NOT VALID constraint pattern in the last rule below.

  • Migration files contain only DDL — never DML. Backfills and other data manipulation (INSERT / UPDATE / DELETE) do not belong in a migration file. Data migrations live in application code, not migrations.

  • Follow expand-contract. Never drop a column or table in the same migration that adds others. If a column is unwanted, mark it nullable with a comment and leave it for a later contract migration; sticking around for a few days is fine.

  • Never run agents (or any tooling) against dev or prod databases. Local databases only.

  • Out-of-order timestamps: if mise lint:migrations (or CI) reports a migration timestamp at or before the latest on main, do NOT rename the file. Delete the offending migration on your branch, rebase/merge main, then re-run mise db:diff <name> so the migration is regenerated on top with a fresh timestamp.

  • Migration merge conflicts: never resolve them by hand. Delete your migrations, rebase/merge main, then re-run mise db:diff so your changes are recreated on top.

  • Adding a CHECK or FOREIGN KEY constraint to an existing table triggers Atlas lint PG305 / PG306: the plain ADD CONSTRAINT scans the whole table under an ACCESS EXCLUSIVE lock, blocking reads and writes for the duration of the scan. Both are warnings and do not fail CI. Whether to avoid the scan is a question of table size and nothing else. A constraint over a column added in the same migration still triggers the same scan, it just cannot fail (unless that column has a DEFAULT, in which case existing rows are checked against the default value). For small or empty tables, accept the warning and say so in the PR description. For large or hot tables, use the two-step NOT VALID pattern:

    1. Edit server/database/schema.sql and run mise run db:diff <name> as usual.
    2. Append NOT VALID to each generated ADD CONSTRAINT clause in place, leaving Atlas's combined ALTER TABLE intact, then add one ALTER TABLE ... VALIDATE CONSTRAINT ...; statement per constraint after it. Do not break the generated ALTER TABLE into separate statements: each statement takes its own ACCESS EXCLUSIVE lock, and splitting a paired DROP CONSTRAINT / ADD CONSTRAINT opens a window where the table has no constraint at all.
    3. Make -- atlas:txmode none the first line of the file. The two statements must not share a transaction: inside one transaction the ACCESS EXCLUSIVE lock taken by the ADD is held until commit, so the validation scan runs under the full lock anyway and the split gains nothing. mise lint:migrations enforces this directive.
    4. Run mise run db:hash to re-hash atlas.sum. Until you do, every Atlas command fails on a checksum mismatch.
    sql
    -- atlas:txmode none
    
    -- Atlas generates:
    --   ALTER TABLE "t" ADD CONSTRAINT "t_x_check" CHECK (...), ADD COLUMN "y" text NULL;
    ALTER TABLE "t" ADD CONSTRAINT "t_x_check" CHECK (...) NOT VALID, ADD COLUMN "y" text NULL;
    ALTER TABLE "t" VALIDATE CONSTRAINT "t_x_check";

    The end state is identical to the one-step form, so later mise run db:diff runs see no drift (CI verifies this). VALIDATE CONSTRAINT scans under SHARE UPDATE EXCLUSIVE, which allows concurrent reads and writes.

    Three things the pattern does not buy you:

    • NOT VALID does not mean unenforced. It skips the scan of existing rows only. Every subsequent INSERT and UPDATE is checked immediately, including updates to rows that already violate the constraint. Because migrations ship ahead of application code, only add a constraint that currently deployed code already satisfies.
    • A failed validation is expensive to recover from. Production applies migrations through the Atlas Operator, and agents may never touch dev or prod databases, so a failed VALIDATE blocks every later migration until someone repairs the data by hand. Confirm there are no violating rows before shipping instead of planning to fix them afterwards.
    • Regenerating the migration silently reverts the edit. The out-of-order and merge-conflict rules above both regenerate the file, which brings back the plain one-step form. Re-apply steps 2 through 4 every time you regenerate.

    A constraint declared inside a brand-new CREATE TABLE does not trigger PG305 / PG306 and needs no change.

Writing queries with SQLc

All SQLc queries live in **/queries.sql files in the codebase. This is an important convention to maintain.

When writing SQLc queries, follow these guidelines:

  • Use descriptive names for queries and parameters.
  • Write clear and efficient SQL queries that follow best practices for performance and readability.
  • Consume the corresponding database schema to understand what tables, columns, relationships and indexes exist.
  • CRITICAL: No matter the query, it MUST ALWAYS be scoped to a project_id to explicitly limit the scope of writes.
<relevant-tasks>
  • mise run infra:start: bring up the local Postgres/ClickHouse/etc containers — required before running sqlc, since sqlc connects to the database to type-check queries.
  • mise run gen:sqlc-server: generates Go code from SQLc queries (requires the local database from mise run infra:start).
</relevant-tasks>

© speakeasy-api, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/postgresql of speakeasy-api/gram.

Open the folder on GitHubat commit ad78247

Compare with similar skills

Postgresql next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Postgresql compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Postgresql this skillspeakeasy-api/gram272—~3.4kAutomated safety check: PassAGPL-3.0
Backend Test WorkerCorrectRoadH/OpenTickly306—~1.3kAutomated safety check: PassAGPL-3.0
Ef Core Migrationsjihadkhawaja/Egroo178—~673Automated safety check: PassApache-2.0
Add Oliphaunt Extensionf0rr0/oliphaunt105—~1.4kAutomated safety check: PassMIT
Diagnose Cloud SessionFreakStudioCN/mpy-hardware-extension132—~809Automated safety check: NotesCustom licence
DB AdminEliasOulkadi/shokunin114—~2kAutomated safety check: NotesMIT

Similar skills

  • Backend Test Worker

    CorrectRoadH/OpenTickly

    Build and verify real-Postgres Go tests and thin transport smoke for tracking behavior.

    306 GitHub stars~1.3k tokensUpdated 6 days ago
    DatabasesAuto-check passed
  • Ef Core Migrations

    jihadkhawaja/Egroo

    Handle EF Core schema changes in Egroo. An agent skill from jihadkhawaja/Egroo.

    178 GitHub stars~673 tokensUpdated 6 mo ago
    DatabasesAuto-check passed
  • Add, update, or remove an Oliphaunt PostgreSQL contrib or external extension, including source pins, build recipes, target support, SDK metadata, release products, carrier identities, and package…

    105 GitHub stars~1.4k tokensUpdated today
    DatabasesAuto-check passed
  • Diagnose Cloud Session

    FreakStudioCN/mpy-hardware-extension

    用户报告 Blockless 扩展在云端实测时出问题(卡死/灰屏/跳步/构建失败),但本地复现不了、日志不在本地文件里时,用这个从云端托管数据库拉真实 session 定位症状与根因 / Use when a user reports an in-product Blockless bug from live cloud-backend testing and the real session…

    132 GitHub stars~809 tokensUpdated 10 days ago
    DatabasesAuto-check: notes
  • DB Admin

    EliasOulkadi/shokunin

    PostgreSQL database administration — backup/restore (pgdump, PITR, WAL archiving), health monitoring (connections, bloat, cache hit ratio, dead tuples), connection pooling (PgBouncer), replication…

    114 GitHub stars~2k tokensUpdated 3 days ago
    DatabasesAuto-check: notes
  • Postgresql Table Design

    ynulihao/AgentSkillOS

    Design a PostgreSQL-specific schema. An agent skill from ynulihao/AgentSkillOS.

    617 GitHub starsUsed in 15 repos~4k tokens
    DatabasesAuto-check passed

More from speakeasy-api/gram

All 39 skills in this repo
  • Gram Playwright CLI

    speakeasy-api/gram

    A skill your agent uses when automating the Gram dashboard in a browser, capturing screenshots, inspecting pages.

    272 GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Transactional Email

    speakeasy-api/gram

    A skill your agent uses when adding, changing, restyling, reviewing, validating, or previewing a Gram/Speakeasy transactional email, in Go or in LMX/MJML — a template<name.go, a TemplateKey…

    272 GitHub stars~4.7k tokensUpdated today
    Auto-check passed
  • Admin Shadcn

    speakeasy-api/gram

    A skill your agent uses when adding, changing, or styling UI in client/admin (the Gram admin dashboard) that touches shadcn/ui — a button, dialog, table, sidebar, badge, select, tabs, tooltip, card…

    272 GitHub stars~1k tokensUpdated today
    Auto-check passed
  • A skill your agent uses when adding, editing, reviewing, testing, or locating a reviewed skill distributed with the Platform MCP plugin; triggers include "Platform MCP skill", "platformmcpskills"…

    272 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Clickhouse

    speakeasy-api/gram

    A skill your agent uses when changing or reviewing Gram ClickHouse schemas, migrations, queries, inserts, access principals, bootstrap SQL, Cloud compatibility, partial migration failures, or…

    272 GitHub stars~3.2k tokensUpdated today
    Auto-check passed
  • Feature Flag

    speakeasy-api/gram

    A skill your agent uses when gating a feature behind a flag, dogfooding or gradually rolling out a change, choosing between productfeatures and PostHog feature flags, adding or checking a product…

    272 GitHub stars~2.6k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Postgresql

What does Postgresql do?

Rules when working with PostgreSQL database in Gram. An agent skill from speakeasy-api/gram. Postgresql is an agent skill from speakeasy-api/gram.

When should I use Postgresql?

Postgresql fits situations like: databases work in your project.

How do I install Postgresql in Claude Code?

Run `npx skills add speakeasy-api/gram --skill postgresql -a claude-code`. Or copy the skill folder (.agents/skills/postgresql in speakeasy-api/gram) into .claude/skills/postgresql in your project. Claude Code loads it when a task matches its description.

How do I install Postgresql in Codex?

Run `npx skills add speakeasy-api/gram --skill postgresql -a codex`. Or copy the skill folder (.agents/skills/postgresql in speakeasy-api/gram) into .agents/skills/postgresql in your project. Codex loads it when a task matches its description.

Can I use Postgresql in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add speakeasy-api/gram --skill postgresql -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/postgresql, .gemini/skills/postgresql, .github/skills/postgresql and .opencode/skills/postgresql in your project.

What does Postgresql need to run?

Going by SKILL.md and its folder, Postgresql needs the command-line tools its instructions call (mise).

Does Postgresql access the network?

SKILL.md names 1 domain. As links in the text: atlasgo.io. This is read from the text; nothing was executed.

Is Postgresql safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Postgresql use?

Postgresql is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Postgresql use?

About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Postgresql?

Skills that share tags, products or a category with Postgresql: Backend Test Worker (CorrectRoadH/OpenTickly, 306 stars), Ef Core Migrations (jihadkhawaja/Egroo, 178 stars), Add Oliphaunt Extension (f0rr0/oliphaunt, 105 stars) and Diagnose Cloud Session (FreakStudioCN/mpy-hardware-extension, 132 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Postgresql?

speakeasy-api (a GitHub organization) maintains it in speakeasy-api/gram, which has 272 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 8, 2026.

Source: speakeasy-api/gram on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.