关于 pythia-deploy
pythia-deploy 是用于执行有序数据库发布脚本的技能。它先预览并取得批准,再逐条快照、应用、验证和记录,遇到首个失败即停止。
主要功能
- 01按顺序逐条执行发布
- 02预览并通过令牌批准
- 03逐条快照、应用和验证
- 04失败记录与撤销指引
- 05拒绝隐藏包含文件及危险命令
适用场景
- 01发布前审查数据库变更
- 02按序执行多文件 SQL 发布
- 03修复失败步骤后恢复发布
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ thaildhe172591/ pythia --skill pythia-deploy安装后在 Claude Code 中输入/pythia-deploy确认已加载。
详细介绍
发布版本
开始时宣布:“正在使用 pythia-deploy — 先预览发布版本中的每条语句。”
**阶段:**询问 → 执行 — 按顺序排列的整组语句会先统一预览并获批,然后逐步运行
使用 sqlplus @release.sql 运行的发布脚本没有快照、没有预览、没有验证,也不会记录第 212 行失败前已执行的内容。
pythia deploy 会通过写入路径逐条运行同一个文件,因此发生故障时会安全停止,并准确列出已执行的内容以及如何撤销。
铁律
A RELEASE RUNS IN ORDER, AS PREVIEWED, AND STOPS AT THE FIRST BROKEN STEP
如何读取脚本
- SQL 中每个
;代表一条语句;PL/SQL 单元(CREATE ... PROCEDURE / FUNCTION / PACKAGE / TRIGGER / TYPE)在仅包含/的行结束。 字面值或注释中的;或/都属于文本。 - SQL*Plus 指令(
SET、PROMPT、SPOOL、SHOW ERRORS、WHENEVER、DEFINE、…)不会在数据库上运行任何内容:它们会被跳过并列出。 @file/@@file包含项会被拒绝——请改为列出这些文件; deploy 绝不会运行无人检查过的路径。- 以下内容会被拒绝,而非跳过:匿名
BEGIN ... END;块(与apply一样)、EXEC/HOST/CONNECT,以及ALTER SESSION— 它会悄然改变后续每条语句的运行方式,任何预览都无法呈现这一点。 - 文件按给定顺序运行。如果目录中的每个文件都带有编号(
1_、02_、10_、Flyway 的V3__),则按自然名称顺序运行;否则按每个文件创建的对象排序——表、索引、注释、类型、视图、规范、过程、程序体、触发器、授权、数据。预览会说明采用了哪种顺序。
工作流
- 整理需要按顺序运行的文件;对发布版本会更改的每个现有对象执行影响分析
(
pythia-impact)。 - 检查这组文件:
pythia lint <files>— 必须在预览前修复错误,而非之后修复。 - 预览:
pythia deploy <files>。不会写入任何内容。原样转达预览:每条语句的组、对象、更改行数、影响、! DESTRUCTIVE和 lint 行,以及差异。策略拒绝会在任何内容运行之前显示 — 转达给开发者,由开发者决定。 - 询问一次 — 预览会打印 deploy token(10 位十六进制)。开发者通过第一个可用渠道批准 — 使用文本原样为
pythia approve --card <token>的AskUserQuestion(Claude Code)、pythia_approve工具(Codex 启动时所在的环境)、或在其终端中运行pythia approve <token>;若某个渠道失败,则尝试下一个尚未询问的渠道。 - 运行:
pythia deploy <files> --confirm <token>— 使用相同的文件列表。每条语句都会经过快照 → 应用 → 验证,并拥有独立的日志条目。读取未经过管道处理的退出代码:0全部完成 ·1被拒绝(之后的内容均未运行)·3已写入但存在问题(在此处停止)。 - 报告每条语句的结果。若停止:已完成的内容会保留在数据库中(DDL 会自行提交);其余审批会被撤回;输出会按从最新到最早的顺序列出撤销命令、说明哪些已完成的语句没有撤销操作,以及给出用于恢复执行的
--from N。是继续修复还是还原,由开发者决定。
在覆盖每条语句的自动驾驶租约(pythia-autopilot)下,第 3 步会直接执行发布版本;如果有任何语句未被覆盖,则整个发布版本会退回预览模式,输出会说明具体是哪条语句及原因。
停止后重新运行
停止前的语句已写入数据库;CREATE TABLE、ALTER TABLE ADD 和插入操作不能运行两次。修复失败的语句,然后运行 pythia deploy <files> --from <N> — 为剩余部分重新预览并重新审批。若回填需要先前在同一发布版本中添加的列,则在 DDL 存在之前无法进行评估:先部署 DDL,再使用 --from 部署数据部分。
危险信号 — 如果发现自己有以下想法,请停下
| 想法 | 实际情况 |
|---|---|
| “在 sqlplus 里运行更快” | 没有快照、没有验证,也没有记录执行停在何处。钩子也会拒绝这种做法。 |
| “第 7 条语句失败了,跳过它继续执行” | 后续内容都是基于它编排的。停下并报告,让开发者决定。 |
| “这些包含项没问题,都是我写的” | 部署会运行列出并预览过的内容。请列出它们。 |
| “一次审批就涵盖了整个发布,所以我可以编辑文件后重新运行” | 令牌与预览过的内容绑定。编辑后 → 重新预览。 |
| “最后一条语句退出码为 3,其他都没问题” | 已写入,但存在问题。请报告为有问题,并附上撤销列表。 |
何时不应使用此技能
- 单个文件中的一条语句 →
pythia-apply。 - 设计发布内容中的表或包 →
pythia-table、pythia-package;此技能只负责部署它们。
评论
支持 Markdown