Repository navigation
v0.1.8 — revert 回退 / --verify-fast / --strict / xlim v4 / check 真实文字尺寸
[0.1.8] — 2026-10-10
这一版把"布局调完能不能确定落地"这条链路补齐了:新增
revert回退、
--verify-fast快速档、--strict严格档、轴范围xlim/ylim(参数 schema v4)、
check按真实渲染尺寸查文字,并修掉了--json输出编码与元组/带符号写法
原位写回等 6 个真 bug。测试:七套件 +pytest -q25 项全绿(GBK 与 UTF-8 环境各跑一遍),
12 项反向验证全部命中;两个模型家族的独立只读审阅共 10 条发现全部修复。
修复
--json成功路径的 stdout 不是 UTF-8:check/describe/apply --json/schema
原先用print(),在管道被捕获时按本地编码(中国 Windows 上是 cp936/GBK)输出;JSON 里
只要有一个中文(check的msg、schema的description),按 UTF-8 解码的 agent / MCP
客户端 / CI 就会直接崩。现在统一走 fd 级 UTF-8 写出(与失败路径fail_json一致)。- 顶层兜底
guard_json_main在异常路径上失效:messages.py用了sys却没 import,
写出结构化 JSON 之后就在sys.stderr.write上抛NameError,把本该打印的人话提示、
MPLTWEAK_DEBUG的 traceback 和return 1全部吃掉(用户看到的是与真实故障无关的 traceback)。 - 元组/带符号写法的原位写回:原先只认列表字面量与
ast.Constant,于是
add_axes((-0.01, ...))(元组)和set_xlim(-0.01, 1.01)(负号在 AST 里是UnaryOp)
会被静默丢进"未原位应用"——用户看到的是"拖了没反应"。 --json的style字段在写回时永远是null:写回路径没设style,导致apply永远走
"已插入调整块"那条消息分支,"原位修改 N 处"永远打不出来,agent 也判断不了这次是哪种写回。
(只读预览--json里style现在填请求的模式:auto表示"逐图待定"——预览阶段还没决定
这张图会不会退到块。)
新增
- 布局引擎冲突检测(
layoutwarn.py):静态扫描脚本,命中
constrained_layout=True/layout='constrained'|'compressed'/set_constrained_layout/
set_layout_engine/rcParams['figure.constrained_layout.use']/rcParams['figure.autolayout']
时给出带行号的提示与修复建议(launch开窗前、apply写回时、check的layout_engine字段)。
原因:布局引擎在每次绘制时重算轴位置,写回/拖拽的位置会被它覆盖,而旧行为只表现为一句
"验证不一致",指不到病因。 mpltweak revert <脚本> [--write]:回退到上次写回之前(默认只预览)。用现成的
.tweak_params/<脚本>.tweak.bak,自身也可逆(覆盖前把当前版本留成<脚本>.revert.bak),
恢复是字节级原样复制(BOM / 换行 / 编码不动)。check按真实渲染尺寸查文字:绘制一次后用Text.get_window_extent()量外框 ——
超出画布 = 问题(客观可判定),文字互相压住 = 提示;同轴超长刻度标签按
"沿刻度方向的重叠比例"判"太密"。纯几何框查不出这类问题。--no-text可退回纯几何口径。- 轴范围
xlim/ylim(参数 schema v4):describe采集(只在脚本显式固定过时才记,
autoscale 不记),apply原位改写set_xlim(a, b)/set_xlim((a, b))/set_xlim(xmin=, xmax=)
三种写法,--style block的调整块也会带上,写回后由语义验证比对范围是否真的等于参数。 check轴范围不统一提示:多面板里 ≥60% 面板共享同一范围、另有少数不同 → 提示
(各自为政的多面板图不报)。--verify-fast快速验证档:只做语法静态检查(写坏当场回滚),不重跑脚本;
--json标verify_mode=fast+verified=null,人读输出原话说清"不保证能跑通、也不保证布局正确"。--strict:check --strict把布局引擎冲突升级为问题(rc=1,接 CI);
apply --write --strict在冲突时拒绝写回(--allow-layout-conflict可放行)。- 轴网格身份
cell:参数里记录每个轴调图时的网格格位[行数, 列数, 起始行, 起始列],
写回后回比 —— 脚本改动导致轴序漂移时,语义验证会指名道姓地失败并回滚
(而不是默默把位置套到别的面板上);调整块注释里也带出这份身份。 tests/test_hygiene.py(宽兜底棘轮 + 消息表 GBK 可编码 + 新模块登记)、
tests/test_suites.py(pytest 包装)、tools/audit_exceptions.py(宽兜底清单与可窄化提示)。CHANGELOG.md(本文件)。
文档
CONTRIBUTING.md:改正 Qt 依赖描述([qt]extra,不是默认依赖);补 pytest 路线、
"加一套测试要改哪四处"、宽兜底棘轮与可窄化清单的用法。- README(中/英):新增
revert/--verify-fast/--strict三节;「不适用场景」;
「原位改数字 vs 插入调整块」(--style auto的逐图判定、跨轮混用与彻底统一的正确做法);
参数文件示例补xlim/ylim/cell并升到 v4;check一行写清新增检查项。
测试:七套件 ALL PASS;pytest -q 25 passed(GBK 控制台与 UTF-8 两种环境各跑一遍);12 项反向验证全部命中;两个模型家族的独立只读审阅共 10 条发现全部修复。