苏帕福吉
抖出并同步您的Supabase环境.
SupaForge比较两个Supabase项目(编外项目和项目,例如) 一切构成一个项目, 不只是计划。 它每报告 并让目标匹配源。 依赖状态运行的修复 在一次交易中,可以在丢弃的副本中证明 任何变化 通过一个单一的项目,它会快照,恢复并克隆它.
- 整个工程. 它涵盖计划, RLS, 存储, 认证,边函数, cron, webhoks, Realtime, 队列, 分区集, Vault, 扩展, 赠款, 参考数据和移徙历史.
- 默认安全. 每个字都需要
--apply和任何损失 数据或打开访问权限也需要--allow-destructive失败的应用程序 目标保持原样. - 生产意识. 每道修补都说明它对一个活的数据库所做的: 锁定它持有的和在哪个桌子上, 无论它可能重写表格或扫描 每行,是否不能在交易中运行.
- 证相可证.
--prove排练迁移并拒绝应用 那不会复制源头 或者会失去行. - 随便. 它与Supabase Cloud合作,自办堆栈,平地 PostgreSQL目标,CI管道和AI代理(MCP).
由 阿卡尔。 。 。 .
快开始
npm install -g @akal/supaforge
supaforge init # create supaforge.config.json
supaforge diff # what has drifted?
supaforge diff --detail # with the SQL
supaforge diff --apply # fix the target
所有先写预览. 添加 --apply 让它发生.
安装
| 无 | npm install -g @akal/supaforge,或运行它与 npx @akal/supaforge |
| 土生土长 | brew install akalsoftware/tap/supaforge |
| 夹克 | docker run --rm -v "$PWD:/work" ghcr.io/akalsoftware/supaforge diff |
| GitHub 动作 | akalsoftware/supaforge-action 看到了吗 中情局 |
| VS 代码及其分叉 | SupaForge扩展:命令,以及编辑器代理的MCP服务器. 每个 释放 把它当作一个 .vsix |
| 光标, VS 代码, Claude | 单击安装 MCP 服务器 — 见 MCP 磁共振 |
它需要20号节点或更新。 DBDiff,它的Diff引擎, 随它而来作为一个
用于您的平台的本地二进制, 所以没有其他可安装的 。 这个
Docker 图像不需要任何东西, 并携带 PostgreSQL 客户端工具
--prove 用户; 通过连接字符串 -e,然后在
/work。 。 。 .
比较一下
| 检查 | 内容 | 固定为 |
|---|---|---|
| 司马 | @dbdiff/cli: 你拥有的每一个计划 | SQL 组合键 |
| 参考数据 | 表格行数 checks.data.tables | SQL 组合键 |
| RLS政策 | pg_policies,按含义比较,而不是文本 | SQL 组合键 |
| RLS覆盖 | 目标中含有 RLS 的表格(仅指目标) | SQL, 选入 |
| 边缘函数 | 管理 API、 Studio 或函数目录 | 部署指挥 |
| 存储 | Buckets 及其政策( 对象从未复制) | API 和 SQL 数据 |
| 认证配置 | 管理 API 或 Gotrue 自动托管 | API(主办) |
| 连续任务 | cron.job | SQL 组合键 |
| 队列 | Supabase 队列( Q)pgmq.meta),通过 pgmq 创建并投放 | SQL 组合键 |
| 分区集 | pg partman 注册 (part_config页:1 create_parent | SQL 组合键 |
| 网络呼号 | 触发器呼叫 supabase_functions.http_request | SQL 组合键 |
| 实时 | 出版物和政策 realtime.messages | SQL 组合键 |
| 默认 | 秘密名称和描述( 无法读取值) | 要运行的命令 |
| 扩展 | pg_extension | SQL 组合键 |
| 移徙历史 | 本地移民档案 supabase_migrations (仅指目标) | SQL, 选入 |
| 作用和赠款 | 自定义角色,并授予表格、视图、序列和功能,包括: anon, (中文(简体) ), authenticated, (中文(简体) ), service_role | SQL 组合键 |
计划检查包括表格、列、密钥、索引、分区、视图、,
实现视图、函数、汇总、触发、事件触发、规则、,
序列、元素、复合和范围类型、域、铸造、扩展
统计、文本搜索配置和词典、外国服务器、,
用户映射和外国表格、政策、默认权限、复制
身份、统计目标、扩展和评论。 更名的一栏,
表格或序列被重新命名,保留其行,而不是下放和
再次创建。 它运行在每一个计划 除了Supabase自己的(auth, (中文(简体) ),
storage,等等) 和那些在 ignoreSchemas中
扩展属于它,而不是比较。 那种东西 它不会
比较,如操作员类,在检查下命名,以便您可以查看
在他们手边,他们不被认为是漂移的.
一个无法运行的支票,比如没有API的证书,就这么说和为什么. 从来不报作净道.
图标
supaforge init Create a config interactively
supaforge diff Report drift (alias: hukam)
supaforge sync Alias for diff --apply
supaforge snapshot --apply Capture an environment's structure and configuration
supaforge restore --apply Rebuild a database from a snapshot or migrations
supaforge clone --apply Copy a remote database to a local one
supaforge migrate create Write a migration file from the current drift
supaforge migrate list Local migrations, applied and pending
supaforge migrate run --apply Run pending migrations
supaforge migrate baseline --apply Mark migrations applied without running them
supaforge report Recent runs, from a local log
supaforge mcp MCP server for AI agents
supaforge help <command> Every flag, e.g. help diff
有用 diff 旗帜 :
| 旗帜 | 对 |
|---|---|
--check=rls 编号 : --skip=storage | 一张支票,或者除了一些--skip 重复) |
--tables=orders,items 编号 : --exclude-tables='*_log' | 范围和数据检查 |
--only=<id,...> | 只应用这些发现(ID来自 --json, 允许使用 globs) |
--dry-run | 按他们运行的顺序打印修正,不运行 |
--prove | 先排练丢弃副本上的修补 |
--source-dir <dir> | 比较 schema 文件目录( 如 supabase/schemas) 目标而不是源数据库 |
--allow-destructive | 还应用滴和删除 |
--apply-posture | 还应用只检查对象的校正 |
--no-transaction | 通过固定应用修复, 保持什么工作 |
--no-snapshot | 自行读取每个查询. 默认每个数据库都读作一个瞬间,所以在扫描运行被所有数据库或无数据库看到时做了更改 pg_dump,其读取的内容将一直锁定,直到扫描结束 |
--json 编号 : --ci | 机器可读输出; CI 说明和退出代码 |
安全应用修正
- 先预想.
diff, (中文(简体) ),snapshot, (中文(简体) ),restore, (中文(简体) ),clone财务报告和审定财务报表migrate run没有写什么--apply。 。 。 . - 破坏修复需要第二面旗帜. 丢弃计划、表格或
列,删除或切换行,并删除 RLS 策略
但跳过直到您添加
--allow-destructive。 。 。 .migrate run使用同样的 有门. - 抚养令. 修复按依附顺序运行:在 触发它们,在它们索引前的列,最后下降。 变化 对象必须被丢弃和再创建是单一的固定.
- 一个交易. 如果修复失败, 整个设定会回滚和目标 不变。 固定目标无法控制,因为它需要扩展或 a 目标缺少的Supabase计划, 与原因无关, 其余的 仍然适用.
--prove。 。 。 . 修复在目标结构的副本上重放, 在目标自己的服务器上, 应用程序运行的方式, 有 各表行的样本。 除非结果相符,否则不应用 源头和行都活下来了 如果证据不能证明的话 就什么也不能应用 运行。 它也命名了重写修正的表格。 更改副本无法保存, 例如 cron 任务( pg cron lives in one database each server), 列出为 未证实.
supaforge diff --dry-run # the plan, in order
supaforge diff --apply --prove # rehearse, then apply
supaforge diff --apply --only='schema-create-*'
姿势检查
RLS的覆盖范围和移民历史 仅看目标,所以他们报告
同样的发现 无论你对 diff。 他们被分开了
(单位:千美元)Posture score),除非通过,否则不要设置退出代码
--fail-on-posture,其修正仅适用于 --apply-posture,或
当您为支票命名时, 如 --check=rls-coverage --apply应用
盲目地将目标远离源头.
抓图、恢复和克隆
supaforge snapshot --env=prod --apply # capture
supaforge snapshot --env=prod --migration --apply # and write what changed since the last one
supaforge restore --env=local --from-snapshot=latest --apply
supaforge clone --env=prod --apply # local copy, data included
一个快照记录了一个项目的架构和配置: schema, RLS
策略, cron, webhooks, 扩展, 存储, 认证, 边缘函数,
参考数据、实时、地壳名称和赠款. 这不是一个
备份. 它无一行可走 checks.data.tables,没有存储文件.
它的图案被写成 SQL 由 pg_dump,它至少必须像
服务器; 如果没有一个, 快照仍然可以被分解但不能恢复,以及
snapshot 出口1,除非 --allow-schema-json-only 说够了.
restore --from-snapshot 显示后 :
| 已恢复 | 页:1 |
|---|---|
| 扩展、计划、 RLS 政策、 cron 工作、网点、实时出版物、赠款 | 作为SQL,按依赖顺序排列. 首先创建政策或授权名称 |
| 储存政策和桶 | 当目标存在时,会创建 Bucket 行 storage schema; 文件从未是 |
| 参考数据 | 这行 checks.data.tables父母在孩子出生之前, 序列移动过恢复的id |
它不能放回认证配置, 边缘函数( 用
supabase functions deploy),或Vault秘密值. 每个都命名于
输出.
- 目标. 还原为一个交易并期望一个空数据库 .
--force清除快照本身的图谋 首先(从来不是Supabase的)和 把触发器和政策放回去 取决于它是什么 清除。 似乎比 目标允许在交易开始前这样说;--no-transaction照原样行事. - Plain PostgreSQL (英语). 恢复为平原 PostgreSQL 工作. 什么无法
已跳过并命名 :
auth.users一个网棍, 服务器不会发送扩展, 以及需要它的一切. - 退出代码. 一号出口漏了东西 也一样 拒绝逃跑.
- 贾森.
--json仅打印 JSON,用于预览.
clone 将远程数据库复制到本地服务器 pg_dump 财务报告和审定财务报表
pg_restore (单位:千美元)--schema-only )),以出行为后. 本地扩展
服务器已首先安装 。 无法修复的物体列表为
事业。 之后的配置 target 点在克隆,所以赤裸裸
diff --apply 而不是写在遥控器上.
移徙
supaforge migrate create --name=add_orders # from the drift between source and target
supaforge migrate run --env=prod # preview
supaforge migrate run --env=prod --apply
- 档案与历史. 文件存在于
supabase/migrations(一组)checks.migrations.dir以改变它。 应用版本录入supabase_migrations.schema_migrationsSupabase CLI的桌子. - 破坏说法.
migrate create列出它所写的,以及migrate run需求--allow-destructive运行他们. - 历史表权限. 在自办的堆栈上,历史表可以
属于管理角色。 SupaForge 然后说
GRANT相反,需要 以光准错误失败. - 没有跟踪记录的项目.
checks.migrations.mode决定 移民史如何报告:auto(一注当无 跟踪,warn或者说ignore。 。 。 .
配置
{
"environments": {
"dev": { "dbUrl": "$DEV_DATABASE_URL", "projectRef": "abc123", "accessToken": "$SUPABASE_ACCESS_TOKEN" },
"prod": { "dbUrl": "$PROD_DATABASE_URL", "projectRef": "xyz789", "accessToken": "$SUPABASE_ACCESS_TOKEN" }
},
"source": "dev",
"target": "prod",
"checks": {
"data": { "tables": ["plans", "feature_flags"] },
"exclude": ["edge-functions"]
}
}
| 外地 | 含义 |
|---|---|
dbUrl | PostgreSQL 连接字符串 . $VAR 财务报告和审定财务报表 ${VAR} 从环境读取 |
projectRef, (中文(简体) ), accessToken | 启用管理 API 检查( 自动, 边缘函数) |
apiUrl | 自动托管的 API 网关, 代替 projectRef |
studioUrl, (中文(简体) ), functionsPath | 自备的边缘函数从 |
source, (中文(简体) ), target | 比较一下:来源是事实,目标得到固定 |
ignoreSchemas | 你们自己留下的石刻 |
checks.data.tables | 比较并取景的表格 |
checks.exclude | 检查永不运行( 与 --skip(中文(简体) ) |
checks.tables, (中文(简体) ), checks.excludeTables | 计划和数据检查的默认范围 |
checks.migrations.dir, (中文(简体) ), checks.migrations.mode | 移民的住址和历史记录 |
- 每个环境.
checks.exclude财务报告和审定财务报表checks.schema.timeout还可以 被设定在环境上,并在目标时应用. .env文档..env文件已装入 Next.js 方式 :.env.{NODE_ENV}.local, (中文(简体) ),.env.local, (中文(简体) ),.env.{NODE_ENV}, (中文(简体) ),.env数值 在环境中已经赢了.- 单一数据库. 包含单一环境的配置和没有
source编号 :target没事 使用snapshot, (中文(简体) ),clone财务报告和审定财务报表restore。 。 。 .
| 环境变量 | 默认 | 目的 |
|---|---|---|
SUPAFORGE_DBDIFF_TIMEOUT | 600 | 在计划或数据 diff 放弃前秒 |
SUPAFORGE_DBDIFF_MEMORY | 1G | 内存限制 @dbdiff/cli (单位:千美元)2G, (中文(简体) ), -1 无) |
SUPAFORGE_CONNECT_TIMEOUT | 15 | 等待连接的秒数 |
SUPAFORGE_CHECK_CONCURRENCY | 4 | 检查一次运行。 把它放在紧身泳池后面 |
SUPAFORGE_PROVE_ROWS | 1000 | 每个表格的行 --prove 副本以检查它们的生存; 0 仅检查结构 |
SUPAFORGE_PG_BIN | —— 说 | PostgreSQL 客户端工具目录(pg_dump, (中文(简体) ), psql),前面使用 PATH 用于服务器比工具更新 PATH |
自办基地
设定 apiUrl 到网关 accessToken 到服务作用键。 全体
检查运行.
- 边缘函数 . 自我托管的边缘没有管理端点
职能,如此确定
studioUrl(Studio的港口,不是网关的)或functionsPath(挂载函数目录). 两者可以混在一起 跨越环境。 工作室的功能 API 是未经认证的,所以不要 公开曝光. - Auth 配置 . 自动托管时, 认证配置会从 Gotrue 的设置中读取 端点,它携带的密钥较少,无法被写入. 改变 而是部署的环境.
抖动克隆
本地克隆为平原PostgreSQL. 存储、 认证、 边缘函数、 断层, 实时和Supabase的角色没有什么可比较的,所以跳过那些 检查 :
{ "checks": { "exclude": ["storage", "auth", "edge-functions", "vault", "realtime", "roles"] } }
如果源头是克隆人 而目标不是, diff 警告说 --apply
将克隆人的形状, 包括缺失,推向目标.
CI 和退出代码
这个 GitHub 动作 运行
diff --ci 并在工作页上增加漂移摘要:
- uses: akalsoftware/supaforge-action@v1
env:
DEV_DATABASE_URL: ${{ secrets.DEV_DATABASE_URL }}
PROD_DATABASE_URL: ${{ secrets.PROD_DATABASE_URL }}
任何地方,运行CLI:
npx @akal/supaforge diff --ci
| 代码 | 含义 |
|---|---|
0 | 做了什么要求,包括当没有做 |
1 | 发现漂泊,拒绝行动, 或某事失败或被排除在外 |
2 | 无法运行: 使用错误, 或是下 --ci 无法完成的支票 |
--ci 默认在关键漂移时失败 。 设定阈值为
--fail-on=warning 或者说 --fail-on=any。 。 。 .
MCP(大赦国际代理人)
SupaForge 作为 MCP 服务器运行, 因此您编辑器中的 AI 代理可以扫描 漂来修去 在写东西之前问你.
-
克劳德桌面: 下载您的平台的扩展名 (单位:千美元)
supaforge-<version>-<platform>.mcpb从 最新发布 打开它 它需要您的项目目录 . -
克劳德代码: 安装插件, 添加 MCP 服务器和技能 安全应用修正:
/plugin marketplace add akalsoftware/claude-plugins /plugin install supaforge@akalsoftware或只添加服务器 :
claude mcp add supaforge -- npx -y @akal/supaforge mcp -
任何其他客户端数字 :
{ "mcpServers": { "supaforge": { "command": "npx", "args": ["-y", "@akal/supaforge", "mcp", "--project", "/path/to/project"] } } }
它列在 MCP 书记官处
作为 io.github.akalsoftware/supaforge。 。 。 .
服务器会曝光这些工具 :
| 工具 | 它会做什么 | 注释 |
|---|---|---|
list_environments | 配置中的环境,没有他们的资质 | 只读 |
diff | 所有区别,与计划 sync 将会运行 | 只读 |
get_check_result | 最后一次检查的结果 diff 或者说 sync | 只读 |
sync | 执行目标计划; prove: true 先在拷贝上排练 | 破坏性 |
create_migration | 将漂移写入迁移文件 migrate create 已经 | 写入文件 |
take_snapshot | 抓图环境到本地文件 | 写入文件 |
diff 财务报告和审定财务报表 sync 同样的争论,所以计划 代理显示你
计划运行。 除非
allowDestructive 已经设定.
写着 supaforge.config.json 在给出的目录中 --project (或
一个开始,拒绝 configPath 客户端,除非开始
与 --allow-config-path。 。 。 .
钩子
import { HookBus, scan, createDefaultRegistry, loadConfig } from '@akal/supaforge'
const bus = new HookBus()
bus.on('supaforge.check.after', ({ check, result }) => {
if (result.status === 'drifted') console.log(`Drift in ${check}`)
})
await scan(createDefaultRegistry(), { config: await loadConfig() }, bus)
发展
cd packages/cli
npm install
npm test # unit tests
npm run lint # type-check
./bin/dev.js diff # run from source
| 套间 | 命令 | 需求 |
|---|---|---|
| 一体化 | npm run test:integration | 达克或波德曼 |
| 数据库 e2e | npm run test:e2e | 达克或波德曼 |
| 假设 | npx vitest run -c vitest.scenarios.config.ts | 达克或波德曼, pg_dump |
| Supabase e2e 软件 | npm run test:e2e:supabase | 基地CLI |
| 释放候选人 | scripts/test-release-candidates.sh --dbdiff ../DBDiff --pg-conformance ../pg-conformance | 波德曼还是多克 |
发行- 候选人创建 DBDiff 二进制和 npm 软件包 从本地的退机方式中安装 SupaForge 以对抗他们 作为用户, 运行每一个套房 上面的安装。 测试 跨越三个项目,在其中任何一个项目之前 释放.
假想套房迁移 每一个案件在
@akal/pg-conformance 两者均包含
前进方向 它检查结果 与实体本身的状态甲骨文和
反对 --prove。 。 。 .
许可证
麻省理工学院