Saleor Django Migration Rules
saleor/saleor
Rules for writing Django migrations in Saleor that avoid long table locks and stay compatible with zero-downtime rolling deploys.
Comprehensive guide to PostgreSQL migrations - common errors, generated columns, full-text search, indexes, idempotent migrations, and best practices for database schema changes
$ npx skills add pr-pm/prpm --skill postgres-migrations -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install pr-pm/prpm postgres-migrations --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/pr-pm/prpm.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/postgres-migrations .claude/skills/postgres-migrations && rm -rf skills-srcUse ~/.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/
Install the "postgres-migrations" agent skill from https://github.com/pr-pm/prpm/tree/main/.claude/skills/postgres-migrations into .claude/skills/postgres-migrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "postgres-migrations", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/pr-pm/prpm/tree/main/.claude/skills/postgres-migrationsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add pr-pm/prpm --skill postgres-migrations -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install pr-pm/prpm postgres-migrations --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pr-pm/prpm.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/postgres-migrations .agents/skills/postgres-migrations && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "postgres-migrations" agent skill from https://github.com/pr-pm/prpm/tree/main/.claude/skills/postgres-migrations into .agents/skills/postgres-migrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "postgres-migrations", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add pr-pm/prpm --skill postgres-migrations -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install pr-pm/prpm postgres-migrations --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pr-pm/prpm.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/postgres-migrations .cursor/skills/postgres-migrations && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "postgres-migrations" agent skill from https://github.com/pr-pm/prpm/tree/main/.claude/skills/postgres-migrations into .cursor/skills/postgres-migrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "postgres-migrations", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/pr-pm/prpm.git --path .claude/skills/postgres-migrations--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add pr-pm/prpm --skill postgres-migrations -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install pr-pm/prpm postgres-migrations --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pr-pm/prpm.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/postgres-migrations .gemini/skills/postgres-migrations && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "postgres-migrations" agent skill from https://github.com/pr-pm/prpm/tree/main/.claude/skills/postgres-migrations into .gemini/skills/postgres-migrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "postgres-migrations", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install pr-pm/prpm postgres-migrationsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add pr-pm/prpm --skill postgres-migrations -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/pr-pm/prpm.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/postgres-migrations .github/skills/postgres-migrations && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "postgres-migrations" agent skill from https://github.com/pr-pm/prpm/tree/main/.claude/skills/postgres-migrations into .github/skills/postgres-migrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "postgres-migrations", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add pr-pm/prpm --skill postgres-migrations -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install pr-pm/prpm postgres-migrations --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pr-pm/prpm.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/postgres-migrations .opencode/skills/postgres-migrations && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "postgres-migrations" agent skill from https://github.com/pr-pm/prpm/tree/main/.claude/skills/postgres-migrations into .opencode/skills/postgres-migrations/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "postgres-migrations", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
postgres-migrationsComprehensive guide to PostgreSQL migrations - common errors, generated columns, full-text search, indexes, idempotent migrations, and best practices for database schema changes
Postgres Migrations is an agent skill from pr-pm/prpm. Comprehensive guide to PostgreSQL migrations - common errors, generated columns, full-text search, indexes, idempotent migrations, and best practices for database schema changes
Its SKILL.md is about 3.1k 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, covering Search implementation and Database schema design. It works with PostgreSQL. The repository describes itself as: The universal registry for AI coding tools. The licence is MIT.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 5f993e6. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
docker-composenpmFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
postgresql.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Postgres Migrations loads about 3.1k tokens when it runs. Until then it costs about 49 tokens; SKILL.md has 319 words of instructions outside code blocks.
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.
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.
The full file from pr-pm/prpm at commit 5f993e6, republished under its MIT licence (© pr-pm). 319 words, ~3,103 tokens.
.claude/skills/postgres-migrations/SKILL.md (or your agent's skills folder).Cause: Subquery in SELECT/CASE references columns from outer query that aren't in GROUP BY.
Solution: Use CTE (Common Table Expression) to separate aggregation from subqueries:
-- ❌ Bad - subquery references ungrouped p.id
SELECT
SPLIT_PART(p.id, '/', 1) as author,
COUNT(*) as count,
CASE WHEN EXISTS (
SELECT 1 FROM users WHERE username = SPLIT_PART(p.id, '/', 1)
) THEN TRUE ELSE FALSE END as claimed
FROM packages p
GROUP BY SPLIT_PART(p.id, '/', 1);
-- ✅ Good - use CTE to compute aggregates first
WITH author_stats AS (
SELECT
SPLIT_PART(p.id, '/', 1) as author,
COUNT(*) as count
FROM packages p
GROUP BY SPLIT_PART(p.id, '/', 1)
)
SELECT
author,
count,
EXISTS (SELECT 1 FROM users WHERE username = author_stats.author) as claimed
FROM author_stats;Cause: PostgreSQL requires functions in indexes/generated columns to be IMMUTABLE.
Problem Functions:
array_to_string() - marked STABLE, not IMMUTABLEto_char() - depends on timezone/locale settingsnow() - changes over timeSolution: Create IMMUTABLE wrapper functions:
-- Create IMMUTABLE wrapper for array_to_string
CREATE OR REPLACE FUNCTION immutable_array_to_string(text[], text)
RETURNS text AS $$
SELECT array_to_string($1, $2)
$$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE;
-- Use in generated column
ALTER TABLE packages
ADD COLUMN search_vector tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(name, '')), 'A') ||
setweight(to_tsvector('english', immutable_array_to_string(tags, ' ')), 'B')
) STORED;
-- Now you can index it
CREATE INDEX idx_search ON packages USING gin(search_vector);Cause: Extension not installed (e.g., pg_stat_statements, pg_trgm, uuid-ossp).
Solution: Make extension usage optional with error handling:
-- Try to create extension, ignore if unavailable
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pg_trgm') THEN
BEGIN
CREATE EXTENSION pg_trgm;
EXCEPTION
WHEN insufficient_privilege OR feature_not_supported THEN
RAISE NOTICE 'pg_trgm extension not available - skipping trigram indexes';
END;
END IF;
END $$;
-- Only create trigram indexes if extension exists
DO $$
BEGIN
IF EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pg_trgm') THEN
CREATE INDEX idx_name_trgm ON packages USING gin(name gin_trgm_ops);
END IF;
END $$;Always use IF (NOT) EXISTS to make migrations re-runnable:
-- Tables
CREATE TABLE IF NOT EXISTS users (...);
-- Columns
ALTER TABLE users ADD COLUMN IF NOT EXISTS email VARCHAR(255);
-- Indexes
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
-- Drop operations
DROP TABLE IF EXISTS old_table CASCADE;
DROP INDEX IF EXISTS old_index;
DROP VIEW IF EXISTS old_view CASCADE;
DROP FUNCTION IF EXISTS old_function(args);
-- Extensions
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";Issue: Table A references table B, table B references table A.
Solution: Create tables first without foreign keys, then add constraints:
-- Step 1: Create tables without foreign keys
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name VARCHAR(255)
);
CREATE TABLE posts (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
author_id UUID -- No FK constraint yet
);
-- Step 2: Add foreign key constraints
ALTER TABLE posts
ADD CONSTRAINT fk_posts_author
FOREIGN KEY (author_id) REFERENCES users(id);Rules:
-- ✅ Good - IMMUTABLE functions
ALTER TABLE packages
ADD COLUMN full_name TEXT
GENERATED ALWAYS AS (namespace || '/' || name) STORED;
-- ✅ Good - with COALESCE for nulls
ALTER TABLE packages
ADD COLUMN search_text TEXT
GENERATED ALWAYS AS (
coalesce(name, '') || ' ' || coalesce(description, '')
) STORED;
-- ❌ Bad - NOW() is not immutable
ALTER TABLE logs
ADD COLUMN year INTEGER
GENERATED ALWAYS AS (EXTRACT(YEAR FROM NOW())) STORED; -- ERROR
-- ✅ Good - use created_at column instead
ALTER TABLE logs
ADD COLUMN year INTEGER
GENERATED ALWAYS AS (EXTRACT(YEAR FROM created_at)) STORED;Best Practices:
-- Create with data
CREATE MATERIALIZED VIEW IF NOT EXISTS package_rankings AS
SELECT
id,
name,
total_downloads,
ROW_NUMBER() OVER (ORDER BY total_downloads DESC) as rank
FROM packages
WHERE visibility = 'public';
-- Create indexes on materialized views
CREATE INDEX IF NOT EXISTS idx_rankings_downloads
ON package_rankings(total_downloads DESC);
-- Refresh function
CREATE OR REPLACE FUNCTION refresh_rankings()
RETURNS void AS $$
BEGIN
REFRESH MATERIALIZED VIEW CONCURRENTLY package_rankings;
END;
$$ LANGUAGE plpgsql;
-- Schedule refresh (requires pg_cron extension)
-- SELECT cron.schedule('refresh-rankings', '0 * * * *', 'SELECT refresh_rankings()');Pattern: Use generated column + GIN index for best performance:
-- 1. Create immutable helper
CREATE OR REPLACE FUNCTION immutable_array_to_string(text[], text)
RETURNS text AS $$
SELECT array_to_string($1, $2)
$$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE;
-- 2. Add generated column
ALTER TABLE packages
ADD COLUMN search_vector tsvector
GENERATED ALWAYS AS (
setweight(to_tsvector('english', coalesce(name, '')), 'A') ||
setweight(to_tsvector('english', coalesce(description, '')), 'B') ||
setweight(to_tsvector('english', immutable_array_to_string(tags, ' ')), 'C')
) STORED;
-- 3. Create GIN index
CREATE INDEX idx_packages_search ON packages USING gin(search_vector);
-- 4. Query using the index
SELECT *
FROM packages
WHERE search_vector @@ websearch_to_tsquery('english', 'react hooks');Principles:
-- Query: WHERE type = 'agent' AND category = 'development' ORDER BY downloads DESC
CREATE INDEX idx_packages_type_category_downloads
ON packages(type, category, total_downloads DESC)
WHERE visibility = 'public';
-- Query: WHERE author = 'foo' AND deprecated = FALSE ORDER BY created_at DESC
CREATE INDEX idx_packages_author_active
ON packages(author_id, created_at DESC)
WHERE deprecated = FALSE AND visibility = 'public';
-- Partial index for common filter
CREATE INDEX idx_packages_verified
ON packages(verified, total_downloads DESC)
WHERE verified = TRUE AND visibility = 'public';Best Practice Template:
-- Migration XXX: Description
-- Brief explanation of what this migration does
-- ============================================
-- EXTENSIONS
-- ============================================
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
-- ============================================
-- TABLES
-- ============================================
CREATE TABLE IF NOT EXISTS table_name (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name VARCHAR(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- ============================================
-- INDEXES
-- ============================================
CREATE INDEX IF NOT EXISTS idx_table_name ON table_name(name);
-- ============================================
-- VIEWS
-- ============================================
CREATE OR REPLACE VIEW view_name AS
SELECT * FROM table_name WHERE active = true;
-- ============================================
-- FUNCTIONS
-- ============================================
CREATE OR REPLACE FUNCTION function_name()
RETURNS void AS $$
BEGIN
-- Function body
END;
$$ LANGUAGE plpgsql;
-- ============================================
-- TRIGGERS
-- ============================================
CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_update_timestamp
BEFORE UPDATE ON table_name
FOR EACH ROW
EXECUTE FUNCTION update_timestamp();
-- ============================================
-- COMMENTS
-- ============================================
COMMENT ON TABLE table_name IS 'Description of table purpose';
COMMENT ON COLUMN table_name.name IS 'Description of column';CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Apply to all tables that need it
CREATE TRIGGER trigger_users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION update_updated_at();ALTER TABLE packages ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITH TIME ZONE;
CREATE INDEX IF NOT EXISTS idx_packages_not_deleted
ON packages(id) WHERE deleted_at IS NULL;
-- View for active records
CREATE OR REPLACE VIEW active_packages AS
SELECT * FROM packages WHERE deleted_at IS NULL;-- Option 1: CHECK constraint (more flexible)
ALTER TABLE packages
ADD COLUMN status VARCHAR(50) DEFAULT 'active'
CHECK (status IN ('active', 'deprecated', 'archived'));
-- Option 2: ENUM type (more strict)
CREATE TYPE package_status AS ENUM ('active', 'deprecated', 'archived');
ALTER TABLE packages ADD COLUMN status package_status DEFAULT 'active';ALTER TABLE packages ADD COLUMN IF NOT EXISTS metadata JSONB DEFAULT '{}';
-- Index on JSONB keys
CREATE INDEX IF NOT EXISTS idx_packages_metadata_tags
ON packages USING gin((metadata->'tags'));
-- Index on specific JSON path
CREATE INDEX IF NOT EXISTS idx_packages_metadata_version
ON packages((metadata->>'version'));-- Update statistics after adding indexes or bulk data
ANALYZE packages;
ANALYZE VERBOSE packages; -- Show details-- Check if indexes are being used
EXPLAIN ANALYZE
SELECT * FROM packages WHERE type = 'agent' ORDER BY downloads DESC LIMIT 10;
-- Look for:
-- - "Index Scan" (good) vs "Seq Scan" (bad for large tables)
-- - High "cost" values
-- - Long "execution time"-- Clean up dead rows
VACUUM ANALYZE packages;
-- Full vacuum (locks table)
VACUUM FULL packages;# Run migration
npm run migrate
# Check for errors
docker-compose logs postgres
# Rollback if needed (manual)
# Connect to DB and DROP objects created by migration
# Verify
docker-compose exec postgres psql -U prpm -d prpm_registry -c "\d packages"
docker-compose exec postgres psql -U prpm -d prpm_registry -c "\di" # List indexes© pr-pm, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/postgres-migrations of pr-pm/prpm.
Open the folder on GitHubat commit 5f993e6
We found 2 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in pr-pm/prpm, which our catalogue first saw on October 7, 2026.
Postgres Migrations 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Postgres Migrations this skillpr-pm/prpm | 122 | 1 repos | ~3.1k | Automated safety check: Pass | MIT | |
| Saleor Django Migration Rulessaleor/saleor | 23k | — | ~1.6k | Automated safety check: Pass | BSD-3-Clause | |
| Neon Postgresusenotra/notra | 255 | — | ~4.1k | Automated safety check: Notes | AGPL-3.0 | |
| Postgres PatternsThibautBaissac/rails_ai_agents | 665 | 7 repos | ~922 | Automated safety check: Pass | MIT | |
| Postgresql Optimizationgithub/awesome-copilot | 40k | 2 repos | ~2.8k | Automated safety check: Pass | MIT | |
| Database DesignxenitV1/Antigravity-Workflows | 130 | 7 repos | ~378 | Automated safety check: Pass | MIT |
saleor/saleor
Rules for writing Django migrations in Saleor that avoid long table locks and stay compatible with zero-downtime rolling deploys.
usenotra/notra
Guides and best practices for working with Lakebase Postgres, the database behind Neon.
ThibautBaissac/rails_ai_agents
PostgreSQL database patterns for query optimization, schema design, indexing, and security.
github/awesome-copilot
PostgreSQL-specific development assistant focusing on unique PostgreSQL features, advanced data types, and PostgreSQL-exclusive capabilities.
xenitV1/Antigravity-Workflows
Database design principles and decision-making. An agent skill from xenitV1/Antigravity-Workflows.
davila7/claude-code-templates
Comprehensive PostgreSQL-specific table design reference covering data types, indexing, constraints, performance patterns, and advanced features
pr-pm/prpm
Reference for writing Claude Code agent files: location, frontmatter fields, validation limits, tool and model choices, and the required content format.
pr-pm/prpm
Covers how to build, configure and publish Claude Code hooks: event types, exit codes, JSON I/O, and PRPM packaging.
pr-pm/prpm
Shows how to write .claude/rules/ files correctly: paths frontmatter instead of globs, quoted glob patterns, global rules and conversion of Cursor rules.
pr-pm/prpm
Reference for writing portable Agent Skills packages, covering SKILL.md frontmatter limits, name rules, directory layout and where Codex CLI, GitHub Copilot and Amp look for skills.
pr-pm/prpm
A skill your agent uses when building custom Kiro AI agents or when user asks for agent configurations - provides JSON structure, tool configuration, prompt patterns, and security best practices for…
pr-pm/prpm
A skill your agent uses when creating OpenCode agents - provides markdown format with YAML frontmatter, mode/tools/permission configuration, and best practices for specialized AI assistants
Works with
Categories
Comprehensive guide to PostgreSQL migrations - common errors, generated columns, full-text search, indexes, idempotent migrations, and best practices for database schema changes. Postgres Migrations is an agent skill from pr-pm/prpm.
Postgres Migrations fits situations like: tasks that involve Search implementation; tasks that involve Database schema design.
Run `npx skills add pr-pm/prpm --skill postgres-migrations -a claude-code`. Or copy the skill folder (.claude/skills/postgres-migrations in pr-pm/prpm) into .claude/skills/postgres-migrations in your project. Claude Code loads it when a task matches its description.
Run `npx skills add pr-pm/prpm --skill postgres-migrations -a codex`. Or copy the skill folder (.claude/skills/postgres-migrations in pr-pm/prpm) into .agents/skills/postgres-migrations in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add pr-pm/prpm --skill postgres-migrations -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/postgres-migrations, .gemini/skills/postgres-migrations, .github/skills/postgres-migrations and .opencode/skills/postgres-migrations in your project.
Going by SKILL.md and its folder, Postgres Migrations needs the command-line tools its instructions call (docker-compose and npm). Our summary lists: Docker.
SKILL.md names 1 domain. As links in the text: postgresql.org. This is read from the text; nothing was executed.
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.
Postgres Migrations is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.1k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Postgres Migrations: Saleor Django Migration Rules (saleor/saleor, 23k stars), Neon Postgres (usenotra/notra, 255 stars), Postgres Patterns (ThibautBaissac/rails_ai_agents, 665 stars) and Postgresql Optimization (github/awesome-copilot, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
pr-pm (a GitHub organization) maintains it in pr-pm/prpm, which has 122 GitHub stars. The repository holds 35 skills in this directory. The repository was last updated on October 6, 2026.
Source: pr-pm/prpm on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.