Romy Lite(青春版,git 存储版)
Romy(excel-undo)的脚本形式重实现:功能与完整版对齐(git 存储 + snap/ 解包工作树),去掉 -e 字符串命令与 Command 框架,JSON-only。纯 Python 标准库 + 系统 git,自包含可上传。完整版见 romy-rev skill。
- 脚本:
scripts/romy.py(本 skill 目录下,唯一依赖是系统 git) - 运行:
"C:\Users\gaoze\.workbuddy\binaries\python\versions\3.13.12\python.exe" scripts/romy.py -f <xlsx> <cmd> [args] - 存储: 同完整版——xlsx 旁建
.<basename>.romy/git 仓库,工作树snap/存解包后的 XML(core.xml 时间戳已归一化),.romy-meta.json记原始时间戳
命令(全部 stdout 只输出一个 JSON 对象)
| 命令 | 用法 | 说明 |
|---|---|---|
init |
-f a.xlsx init |
git init + 解包 snap/ + 首次 commit;repo 已存在则报错(exit 2) |
sync |
-f a.xlsx sync |
把最新 xlsx 重新解包进 snap/(永不 commit);返回 changed/count |
commit |
-f a.xlsx commit -m <msg> |
自动先 sync,再提交 snap/ 变更(add -u,不含 untracked);无变化幂等 changed:false;无 repo 自动 init |
log |
-f a.xlsx log [-n <N>] |
git log,默认 5 条,新→旧 |
diff |
-f a.xlsx diff -a <rev> -b <rev> |
两快照单元格级语义 diff + 非单元格分类 + 全表解析失败时降级 raw diff |
restore |
-f a.xlsx restore <rev> [-o <out>] |
还原某版:-o 写新文件;省略则覆盖原文件(要求当前文件与 HEAD 一致,否则拒绝) |
rev 支持:HEAD、HEAD~N、完整/短 hash(git rev-parse 语义)。
JSON 契约
- 退出码:
0成功/幂等 ·1用法错误 ·2运行时失败。非 0 时 stdout 仍是 JSON({"ok":false,"error":...,"hint":...}),以ok字段为准。 sync输出:{ok, changed, count, pending}。commit输出:{ok, changed, id?, msg}(changed:true 时带新 commit 短 hash)。log输出:{ok, count, commits:[{hash, short, timestamp, ts_iso, subject}]}。diff输出:{ok, a, b, cells_changed, sheets_changed, cells:[{sheet,ref,old,new}], degraded, failed_sheets, files:[{category,path,note}]};degraded:true时附raw_diff(git 原文)与error(失败表名)。restore输出:{ok, id, out, mode(overwrite|new), hash}。
Agent 解析指引(脚本把分析留给你)
- 判断是否实质改动: core.xml 时间戳已归一化,
commit的changed:false即真无变化;diff时docProps/core.xml不应出现在 entries(归一化后同字节)。 - 单元格变更: 直接用
cells(sheet 名、ref、old/new,中文原样)。files里的[style]/[struct]/[strings]/[meta]/[media]/[other]是结构/格式级改动,需 agent 展开快照 XML 分析。 - 解析失败:
failed_sheets非空表示该表 XML 无法解析(可能加密/损坏),其单元格未参与对比;degraded:true时全部表失败,只能看raw_diff或直接读snap/下的 XML。 - 回退流程: 覆盖 restore 被拒(脏)时,先
commit当前状态再 restore,或用-o导出新文件。restore 永不 commit,回退后如需留痕再commit。 - Commit 前先 sync 是设计:
commit内部自动 sync(xlsx 为唯一事实源),所以 diff 旧版本前无需手动 sync;只有显式sync才只解包不提交。
与完整版 romy-rev 的差异(注意)
- 命令集为 init/sync/commit/log/diff/restore,无
status、无help <cmd>子命令(help输出命令表);无-e/-g/-v全局参数。 - 输出一律 JSON(完整版有文本模式);
log固定结构化输出(完整版默认 raw git log)。 - 退出码只有 0/1/2(完整版 git 缺失时另有 3)。
- 行为细节与完整版一致:
init不覆盖已有 repo、commit幂等、覆盖 restore 的脏检测为递归 sha256 树比较(xlsx 解包 vs HEAD 快照)。
已知注意点
- Windows core.autocrlf=true 的坑(已修复): 实现 restore/dirty 检测时不能用
git archive(它导出文本会转 CRLF,导致字节级对比失配);本脚本用git ls-tree+git show逐文件取原始字节。 - 快照体积:每次 commit 是 xlsx 解包后的文件树(git 对象存储,自动去重相似内容)。