v4.1 — agent-first CLI + WeChat-safe 白名单 sanitizer
亮点
🖥️ Agent-first mbeditor CLI(对齐 CLI-Anything 理念)
pip install -e ./backend得到可执行的mbeditor- 默认 direct 模式:直接读写本地
data/文件 + 调用服务函数,不需要跑 FastAPI - HTTP 模式:
--mode http走/api/v1后端代理,共享 token / 缓存 - 命令组:
article / doc / image / render / publish / config / skill / info - 稳定输出 envelope:
{ok, action, message, data};--json --compact出 JSONL - 退出码约定:0 成功 / 1 执行错误 / 2 用法错误
- 随包
SKILL.md,mbeditor skill直接打印给 agent 吞 - 33 条 CLI 测试 + 1 条 CLI 驱动的端到端视觉零变形测试
🧼 WeChat-safe 白名单 sanitizer
针对"复制到公众号后台 vs /draft/add"渲染漂移的根因修复:
- 正向属性白名单(~60 项,基于真实公众号稳定文档校准)
- display 值约束:仅
block / inline / inline-block / none / table-*;flex / grid全部剥除 - position 值约束:仅
relative / static;absolute / fixed触发display:none - 去掉
!important/ flex 族 / grid 族 /float/clear/cursor/user-select/pointer-events/will-change - 保留
linear-gradient / box-shadow / letter-spacing / opacity / vertical-align等所有公众号真支持的视觉属性 - 按钮
<a>自动转<table><tr><td>结构
📖 附带示范文章 docs/cli/examples/demo_article.json —— 用新格式重写的 7-block 推文,25 个属性全部在白名单内,零漂样板。
🎨 真 Playwright raster 工作器
RasterRenderer发布时无 uploader 直接抛错,杜绝 data: URL 进草稿SvgRenderer发布时拒绝<image>的远程 href(含xlink:href)- 缓存 / 失败恢复 / 本地图片内联边界测试齐全
🧱 MBDoc stage 完成
heading / paragraph / markdown / html / image / svg / raster七种 block 全部有真渲染器publish.py剥离成路由层,transform 下沉到publish_adapter / legacy_render_pipeline / media_uploader / wechat_publisher等服务- 新增
document_projector:legacy Article ↔ MBDoc 桥接 /api/v1/mbdoc新增/project/article/{id}//render//publish端点
🧪 前端 block-native bridge 编辑器
- 新增
features/editor/模块,projected-block 编辑 + session 状态 - Lazy-loaded Monaco / Markdown 编辑器壳
- Vite chunk 切分:monaco / markdown-vendor / tiptap / react-vendor / lucide
- Editor chunk 降到约 62 KB
测试
- backend: 210 passed / 1 pre-existing xfail
- CLI: 33 passed
- WeChat-safe sanitizer: 26 passed
- 示范文章白名单守护: 7 passed
- 端到端 CLI-driven 视觉零漂移: 1 passed(diff = 0 px)
升级提示
- 如果你曾经在文章里依赖
display:flex/display:grid/position:absolute/animation/transform等做版式,它们现在会被 sanitizer 剥除。请用display:inline-block+vertical-align:middle做横排布局(参考docs/cli/examples/demo_article.json) - WeChat 凭据配置仍在
data/config.json,向后兼容 - 老的
/articles+/publishAPI 保留不变