v0.2.10 to v0.2.11

2 added, 2 removed. Audit A to A.

---
name: double6-ppt-cli
- version: 0.2.10
+ version: 0.2.11
description: 基于 ppt-master 与 iOfficeAI/OfficeCLI 两个开源项目,生成、套用模板、读取、检查和闭环修复原生 PPTX;“可编辑”重点指保留原生对象与稳定身份,方便 Agent 多轮定位、修改和复查。适用于从 Markdown、文本、结构化材料与本地授权图片制作演示文稿,复用常规 PPTX 模板,或质检和受限修复已有 PPTX;不负责 PDF/DOCX 内容解析、联网搜图、图片式 PPT、HTML slides、TTS 或视频。
metadata:
openclaw:
homepage: https://github.com/double6-ai/double6-skills/tree/main/skills/double6-ppt-cli
emoji: "📊"
requires:
anyBins:
- python3
- python
- py
---
- # Double6 PPT CLI 0.2.10
+ # Double6 PPT CLI 0.2.11
> 安装说明:从 [GitHub / skills.sh](https://github.com/double6-ai/double6-skills/tree/main/skills/double6-ppt-cli) 安装可获得完整 vendored PPT Master。ClawHub 包因网关体积限制省略了 `pptx_animation_presets.json` 与 `presetShapeDefinitions.xml`;需要原生 SVG 生成完整能力时,请改用 GitHub 安装。
## 平台边界(不要误解为「必须 macOS」)
| 能力 | 是否需要 macOS / Microsoft PowerPoint |
|---|---|
| 安装 skill、`doctor`、bootstrap OfficeCLI | **否**。只要 Python 3 + npm(bootstrap 时) |
| generate / template-fill / postflight 编译与 inspect | **否** |
| `--verify-tier portable` 验证与交付 | **否**。OfficeCLI 校验/改字探针;可选 LibreOffice 渲染 |
| `--verify-tier native` / auto 且环境有 PowerPoint | **是(当前实现)**。依赖 macOS `osascript` + Microsoft PowerPoint.app 做原生 roundtrip |
非 Mac / 无 PowerPoint 时请显式使用 `--verify-tier portable`,不要强制 native。下面大量路径与 `/private/tmp`、PowerPoint 容器说明,只约束 **macOS native 档**。
## 项目定位与开源依赖
本 Skill 使用了两个开源项目,并在其上增加 Double6 的集成代码、工作流约束、状态记录和质量门:
- [ppt-master](https://github.com/hugohe3/ppt-master) `v4.8.0`(MIT):精简内核随 Skill 一同提供,承担原生生成、模板分析与模板填充能力。
- [iOfficeAI/OfficeCLI](https://github.com/iOfficeAI/OfficeCLI) `v1.0.144`(Apache-2.0):作为固定版本的外部运行依赖,承担 PPTX 结构读取、检查、确定性操作和 portable 验证;其二进制不包含在 Skill 包内。
本 Skill 所说的“可编辑 PPTX”,重点是方便 Agent 多轮编辑。输出保留原生 DrawingML 对象,并通过稳定对象身份、inspection map、补丁计划、前后 package diff 和验证回执,让 Agent 能在后续轮次定位同一对象、继续修改并重新检查。文件也可以在 PowerPoint 中人工编辑;当前可编辑性验收主要衡量 Agent 重复编辑的可靠性。
默认闭环是:`模板分析/原生创作 → 生成副本 → inspect → 确定性修复 → 验证(native PowerPoint 或 portable OfficeCLI) → 可选视觉复核 → finalize`。`issues=0`、OOXML validate 或预览非空都不能替代视觉结论。
## 开始前
1. 运行 `python scripts/d6ppt.py doctor --json --mode <generate|postflight|template-fill> --verify-tier <auto|native|portable>`。doctor 会按目标模式和档位报告能力;PowerPoint 缺失只会阻断 native 档。
2. OfficeCLI **bootstrap 固定安装 pin `1.0.144`**;运行时接受 pin 与更新的 **1.x**(同 major)。非 pin 版本 doctor 报 `warn` 并提示风险,可继续使用;需要对齐时执行 `bootstrap --runtime-dir <path> --yes` 重新装 pin。major ≠ 1 或低于最低兼容版才 fail。只有用户授权后才运行 bootstrap,禁止全局安装。ppt-master 以 vendored BOM 为准。
3. Microsoft PowerPoint 与 `osascript` 是 **native 档**必需验证目标。PowerPoint 已打开其它演示文稿时返回 `powerpoint_busy`,绝不强关用户文件。
4. 本机没有 PowerPoint、`osascript` 不可用,或系统拒绝辅助访问(error `-1719`)时,`verify` 默认自动降级为 **portable 档**:OOXML + OfficeCLI 校验与改字探针,可选 LibreOffice 渲染。用 `--verify-tier native` 强制要求 PowerPoint;用 `--verify-tier portable` 跳过 PowerPoint。
5. LibreOffice 在 portable 档可作渲染事实源;在 native 档仅 `verify --compatibility libreoffice` 时做附加兼容性检查,不能替代 PowerPoint。LO Save As 常重编号 DrawingML ID/丢自定义名;text/notes/visual/edit-probe 通过而 identity 漂移时记为 `pass_with_warnings`。
6. macOS 上 auto/native 运行目录必须位于用户可直接访问的项目目录,禁止放在 `/private/tmp`;显式 portable 档不调用 PowerPoint,可在隔离临时目录运行。普通用户目录并不自动向 PowerPoint 开放递归访问,PowerPoint 仍不得直接打开 run/cleanroom 文件。
7. `inspect` 不调用 Chrome/Chromium 预览,避免隔离 profile 触发钥匙串弹窗。native 档视觉事实源由 PowerPoint 导出产生;portable 档可由 LibreOffice 渲染补齐。
8. 交给 PowerPoint 打开的所有副本必须先进入真实系统账户的 `/Users/<account>/Library/Containers/com.microsoft.Powerpoint/Data/tmp/d6ppt/`。真实 home 由系统账户数据库解析,禁止依赖隔离 `$HOME` / `Path.home()`;run 与证据只通过普通文件复制读写。
9. roundtrip、另存、重开、改字、移动、保存、持久化核验与 PDF 导出合并为一次 PowerPoint 批处理会话。禁止让 PowerPoint 打开 `process/tmp/opencode/diag` 或其它诊断文件,也不得代用户点击文件访问授权。
## 三种模式
### 原生生成
`init --mode generate --source <content> --design <neutral|academic|business|training> --verify-tier <auto|native|portable> --out <run>` 会生成 `spec_lock.md`、`design_spec.md`、`svg_output/` 与语义清单示例。填完草稿并按 [authoring-contract.md](references/authoring-contract.md) 准备稳定对象身份,再依次 `compile → inspect → repair → verify → finalize`。设计包提供颜色、字号与工作结构,不会替 Agent 自动完成版式;需要复用现成版式时使用 template-fill。
### 模板填充
1. `init --mode template-fill --source <organized-content> --template <template.pptx> [--contract <content-contract.json>] --out <run>`。
2. `template-analyze --run <run>` 提取主题、母版、版式、逻辑页和递归对象画像,并生成计划草稿。
3. 用户确认要替换的图片先用 `template-asset-import --run <run> --asset <image.png|jpg> --name <safe-name>` 冻结到 run;不得让计划引用可变的外部路径。
4. 编辑计划:每个选中模板页的每个对象必须标为 `keep_design`、`replace_content`、`update_navigation`、`remove_sample`、`preserve_attribution` 或 `manual_review`。图片替换还必须在根级 `image_edits` 中写明 `plan_slide`、唯一 `source_object_id`、冻结 `asset_name`/SHA、对象 fingerprint 与 `user_confirmed: true`。带内部跳转的导航必须用根级 `navigation_targets` 把确认标签映射到逻辑输出页,并用 `navigation_source_targets` 覆盖底板、首页图标等其它实际点击区;旧模板跳转指向未选源页时必须在 check-plan 阶段报告,不能拖到 Apply。未知、未处置、无动作映射或未确认图片都会阻断。
5. `template-check-plan --run <run> --plan <plan.json>`。结构化 source 含 `slides[]` 时,内容槽默认执行严格同页来源检查:逐字或抽取可由同页源字段证明时自动通过;不能证明的扩写必须用 `content_binding.mode=user_confirmed_paraphrase` 绑定 `source_refs` 并取得用户确认。跨页借文、无来源扩写和伪造 page number 阻断 Apply。报告无 error 后仍必须把具体计划交给用户确认;只有 `status=confirmed` 才能 `template-apply`。
6. Apply 使用 vendored PPT Master Fill Native,不把模板转成 SVG;图片只重定向目标 slide 上已确认 picture 的私有关系,不改模板、母版、布局、几何、裁切或其它共享图片。确认导航在一次性 vendor 输入副本中移除旧跳转,生成后按 `navigation_targets` 重建到逻辑输出页;当前章节取不晚于当前页的最近章节起始页。只有每页能从原模板证明唯一的“1 个选中样式 + 重复未选中样式”时,才把原模板的底板与文字样式移到当前章节;样式不唯一则 fail closed。原模板不改。输出画像和回执保留模板/内容/输出/图片 SHA、来源对象映射、导航链接、选中态与 package diff。
7. Apply 后先运行 `package-clean --run <run>`,再 `inspect`。它只移除未被 presentation/custom show/可见 slide 引用的非逻辑 slide parts、相应 content-type override,以及未被 XML 使用的 slide-jump relationship;不可达 slide 之间即使形成循环也可整体清理。任何仍有外部入边的非逻辑 slide 保留并转人工复核,media、master、layout、theme、notes 与 live slide XML 永不由该命令删除或改写。
### 已有 PPTX 质检与修复
`init --mode postflight --source <deck.pptx> [--template <template.pptx>] [--contract <content-contract.json>] --out <run>`。`inspect` 会生成稳定 inspection map,并报告 OfficeCLI 问题、小字、空白与结构漂移。业务专属的残留文字、数字显示、模板角色和非逻辑页示例标记必须由 content contract 声明,通用检查器不内置某个案例的词、导航标签或数字。`patch-plan` 只纳入确定性叶子操作;图片必须用 `--confirm-finding <id>` 单独确认。然后运行 `patch` 并重新 `inspect`。
## 视觉策略
- 默认需要视觉检查。声明可用:`visual-policy --capability available --decision perform`;PowerPoint(native)或 LibreOffice(portable)导出逐页图片后,由视觉模型检查并用 `visual-review` 写 SHA 绑定回执。`render_manifest.json` 同时绑定当前 PPTX、档位、渲染器、PDF、逐页 PNG 与 contact sheet;任一文件变化都会使视觉回执失效。
- 能力未知或不可用时返回 `visual_review_decision_required`,先询问是否切换视觉模型。
- 用户拒绝、没有视觉模型或明确跳过时,运行 `visual-policy --capability <unknown|unavailable> --decision waive --reason <user_declined_switch|no_visual_model|user_requested_skip> --user-ack`。
- 有效豁免不阻断交付,但最终只能是 `pass_with_warnings`,并明确写“未进行模型视觉质量检查”。PPTX SHA 改变后旧复核和旧豁免失效。没有裸 `--skip`。
- portable 档未渲染出逐页页面时,必须用户视觉豁免或切换到可渲染环境,不得假装视觉已通过。
## 安全边界
- 原文件永不覆盖;所有修改只写 run 副本并保留前后 package diff。
- 自动修复只限唯一稳定叶子路径、当前 SHA、DrawingML ID/type、内容指纹、finding、来源对象与理由全部匹配的 `set_property` / `remove_leaf`。
- 业务语义文本不会仅因“像公式”成为可删除模板残留;只有 content contract 或模板对象身份与媒体 SHA 明确证明后,才可进入对应处置。
- 不自动删除母版、版式、组合对象、共享关系或语义图片;不做模糊删除、大面积重排、审美重做和跨页扩散。
- `package-clean` 不是通用 OOXML 垃圾回收器:只处理已证明未使用的 slide 关系和不可达非逻辑 slide;仍被 live XML、自定义放映或其它保留 part 引用的对象 fail closed。
- 补丁后必须证明未点名页文本、母版、版式、主题和备注未变。失败即 `patch_scope_violation`。
- schema 1.0 仅做内存兼容读取,禁止回写历史证据。
详细合同见 [delivery-gates.md](references/delivery-gates.md)、[repair-policy.md](references/repair-policy.md)、[machine-contracts.md](references/machine-contracts.md)、[licenses-and-upstreams.md](references/licenses-and-upstreams.md) 与 [test-report-and-verification-tiers.md](references/test-report-and-verification-tiers.md)(native/portable 双档说明与完整测试报告)。
- WPS 当前不是验证档;`wpscli ppt2pdf` 仅作诊断导出(常限用户目录可读路径),`ppt2photo` 可能要求会员。**不得**声称「WPS 已验证」。
- OfficeCLI pin 为 `1.0.144`;若 `~/.officecli` 自动升级导致行为异常,可 `bootstrap` 重新装 pin,或接受 1.x 兼容风险继续使用。