Skip to content

v4.1 — agent-first CLI + WeChat-safe 白名单 sanitizer

Choose a tag to compare

@AAAAAnson AAAAAnson released this 17 Apr 12:20

亮点

🖥️ 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.mdmbeditor skill 直接打印给 agent 吞
  • 33 条 CLI 测试 + 1 条 CLI 驱动的端到端视觉零变形测试

🧼 WeChat-safe 白名单 sanitizer

针对"复制到公众号后台 vs /draft/add"渲染漂移的根因修复:

  • 正向属性白名单(~60 项,基于真实公众号稳定文档校准)
  • display 值约束:仅 block / inline / inline-block / none / table-*flex / grid 全部剥除
  • position 值约束:仅 relative / staticabsolute / 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 + /publish API 保留不变