关于 postgres-adopt
Postgres Adopt 是帮助 gbrain 操作者判断数据库引擎并迁移到 Postgres 的技能。它通过只读检测、迁移计划和确认步骤处理迁移,避免仅改配置导致数据分裂。
主要功能
- 01只读检测当前数据库引擎
- 02按优先级尝试 Postgres 初始化
- 03先规划再执行数据迁移
- 04迁移期间查看状态并恢复或回滚
- 05明确请求基础设施配置许可
适用场景
- 01检查 gbrain 当前使用的引擎
- 02为新安装选择 Postgres 或 PGLite
- 03将已有 PGLite 脑迁移到 Postgres
- 04查看并恢复进行中或中断的迁移
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ garrytan/ gbrain --skill postgres-adopt安装后在 Claude Code 中输入/postgres-adopt确认已加载。
附带文件routing-eval.jsonl
详细介绍
Postgres 采用
引擎是大脑的基础:PGLite 是零配置的起点, Postgres 则适用于并发、多机器访问和 1000+ 个页面。 此技能会回答“我当前使用的是哪种引擎?”,在运维人员希望使用 Postgres 时优先选择它,并安全迁移数据——绝不会通过切换配置来实现。
约定
此技能保证:
- 检测不依赖引擎且只读:即使数据库已关闭,
gbrain engine status --json也会返回结果(这正是此命令的目的)。 - 绝不会通过编辑配置来更改引擎。PGLite 大脑通过
gbrain migrate --to postgres(别名为--to supabase)迁移,从而升级:先规划(退出码为 3),仅在用户提供--yes --expect <plan_hash>时运行,验证每张表,然后切换路由。此技能会封装该流程,不会重新实现它。 - 目标 URL 绝不会出现在命令、记录或输出中:它存放在
GBRAIN_TARGET_URL中,每条命令都会使用--url-env GBRAIN_TARGET_URL。 - 资源配置需要明确同意:Docker 步骤需要
--allow-docker,在本地服务上创建数据库需要--allow-create-db。绝不会在无交互模式下修改运维人员未明确同意修改的基础设施。
步骤 1 — 检测
gbrain engine status --json
根据输出选择分支:
effective_engine: "postgres",且(可选的)--probe返回正常 → 报告状态正常,完成。effective_engine: "postgres",但探测失败 → 这是访问问题,而非采用问题:转至 db-repair。config_file_engine与effective_engine不同 → 环境变量 URL 覆盖了配置文件;告知运维人员哪个设置生效——依据是db_url_source(env:GBRAIN_DATABASE_URL/env:DATABASE_URL表示环境变量生效;若两个环境变量 URL 均已设置,或 cwd-.env 影子保护排除了其中一个,env.note也会触发)。thin_client: true→ 大脑位于远程服务上;引擎选择由该主机决定。停止。effective_engine: null(没有大脑)→ 步骤 2。effective_engine: "pglite"且有数据 → 步骤 3。- 输出包含
graduation区块,且其state不为none(进行中、中断、已升级或分叉)→ 步骤 4。
步骤 2 — 全新安装,优先使用 Postgres
gbrain init --prefer-postgres
按以下顺序尝试:环境变量 URL → Supabase Management API 发现(SUPABASE_ACCESS_TOKEN,多项目账户还需 SUPABASE_PROJECT_REF,连接字符串还需 SUPABASE_DB_PASSWORD)→ 本地 Postgres(仅当设置了 PGHOST/PGPORT/PGUSER/PGPASSWORD 或传入 --local-postgres 时)→ Docker → PGLite。每个不可用的步骤都会打印一行说明,然后继续尝试下一步;不会静默处理。
- 添加
--allow-docker(它会创建并管理一个重启后仍会保留的gbrain-postgres容器)或--allow-create-db(它会在本地服务上运行 CREATE DATABASE)之前,先征求运维人员的同意。 --json会报告{engine, ladder_rung, url_source}——转达最终采用了哪个步骤。- 如果最终使用 PGLite,这完全没问题:说明这一点,并指出只要他们愿意,之后随时可以使用下文的升级路径。
步骤 3 — 已有 PGLite 大脑:规划、询问、执行
完整参考:将 PGLite 大脑迁移到 Postgres。
- 目标 URL。 请用户将连接字符串放入环境变量,不要粘贴到对话中
(
read -rs GBRAIN_TARGET_URL && export GBRAIN_TARGET_URL)。在 Supabase 上使用 事务池化器;在仅支持 IPv4 的主机上,还要将GBRAIN_DIRECT_DATABASE_URL设为会话池化器。 - 规划。 此操作不会更改任何内容,并以退出码 3 退出,同时提供
confirmation_required文档:
转达gbrain migrate --to postgres --url-env GBRAIN_TARGET_URL --jsonuser_message、迁移内容、保留在此计算机上的内容、阻碍因素 和预估时间。然后停下并等待用户回复。对于有自身fix的阻碍因素,先解决 (若其说明为ask_user,则先询问)。 - 执行,在用户同意后。 使用文档中的
fix.command:gbrain migrate --to postgres --url-env GBRAIN_TARGET_URL --yes --expect <plan_hash>preview_changed表示计划已更改:返回步骤 2。对于数千个页面,在后台 运行,并轮询gbrain migrate --status --json。 - 报告。 转达运行输出中的目标 doctor 判定,说明现有令牌、
OAuth 客户端和本地写入程序仍然有效,提醒其他计算机需要后续执行
gbrain mcp expose,并且如果某个 serve 已交出大脑,则告知用户重启 MCP 客户端。
- 持有大脑的
gbrain serve会自行交出大脑;绝不要先要求用户将其停止。 如果没有此类进程,graduation_source_writer_held会指出需要停止的进程。 - 旧数据目录会保留为
<path>.graduated-<run_id>(doctor 的pglite_leftovers会报告它)。是否删除由用户决定。 gbrain doctor的pglite_scale检查会在页面数达到 1000 或更多时发出警告,并指向 规划命令——此警告就是此技能的触发信号。
步骤 4 — 正在进行的迁移
gbrain migrate --status --json
此操作为只读,并会根据当前状态指出下一条命令。退出码为 75 或迁移正在
进行时 → 等待并轮询。若迁移已中断 → 执行 gbrain migrate --resume
(如果用户想继续使用 PGLite,则执行 gbrain migrate --rollback-to-source)。每次拒绝都会指出
修复方法;恢复表见指南。
如果回滚会列出数据丢失,则只有在用户提供
--rollback-to-source --yes --expect <hash> 时才执行。
权衡(推荐时说明)
Postgres 在并发、多计算机访问和扩展能力方面更胜一筹。PGLite 保留
每回合引导钩子的使用方式(目前仅 PGLite 支持钩子注入——
docs/guides/bootstrap.md);在 Postgres 上,环境上下文则通过
每次会话的 MCP 和拉取协议传递。若操作者有多个并发 Agent、多台计算机,
或大脑包含 1000 个以上页面,建议使用 Postgres;
否则,PGLite 确实完全够用。
失败时
对于任何 gbrain 错误 code、退出码、[AGENT] 块或通知块,请遵循
Agent 操作者协议。此技能特有的情况:
effective_engine: "postgres",但探测失败:这是访问问题;运行gbrain engine status --probe,然后使用数据库修复技能。- 配置步骤(Docker、安装 Postgres)和迁移本身都需要用户明确同意;Docker 阶段需要
--allow-docker,迁移则需要用户查看计划后提供--yes --expect <plan_hash>。 - 按设计,
gbrain config set engine …会被拒绝:必须通过 migrate 流程切换引擎,绝不能通过编辑配置来切换。
反模式
- 绝不要执行
gbrain config set engine ...— 按设计,此操作会被拒绝;不迁移数据就切换引擎 会使大脑分散在两个存储中。 - 绝不要绕过 migrate 流程,将健康的 PGLite 大脑迁移到 Postgres。
- 用户查看计划之前,绝不要添加
--yes;除非计划列明将被清除的内容且用户已同意,否则绝不要使用--force。 - 绝不要将数据库 URL 或密码放在命令行中;请使用
--url-env GBRAIN_TARGET_URL。 - 未获得操作者明确同意,绝不要运行 Docker 阶段。
- 绝不要将
SUPABASE_ACCESS_TOKEN或密码粘贴到输出中或回显。
输出格式
检测报告用一行;变更报告用 2-4 行:
Engine: <pglite|postgres> (source: <db_url_source>) [probe: ok, 42ms]
Action: <none | init rung that won | migrate --to postgres result>
Next: <upgrade note, or "healthy — nothing to do">
gbrain engine status 的输出照原样引用(它已脱敏);如果执行了安装,则注明胜出的阶梯级别;迁移后,附上目标的 gbrain doctor 判定结果。