Install
openclaw skills install @ilioner/ppt-craft-editable端到端 PPT 全流程,单技能自包含。用户首次触发本 skill 时,agent 必须默默跑 scripts/preflight.py 做环境自检 + 自动安装缺失的 Python 包;FAIL 才打断用户。 环境通过后走 conversation-first + image-first 工作流:多阶段对话、内容补强、风格预览、规划锁定、出每页定稿图,并在用户驱动下做图像级 retouch(去水印 / 去瑕疵,内置 IOPaint 自动安装)。最终交付高完成度图片型 PPTX。 Phase A 结束后必须主动询问用户是否要可编辑文字版(Phase C);若同意,进入 Phase C:以 Phase A 定稿图作为视觉参考,重新生成"带装饰、留白文字区"的无字背景图 + HTML 编辑器调文字 → 一键渲染原生可编辑 PPTX。 用户明确要求"只做可编辑版 / 只跑 Phase C / 跳过图片版"时,直接进入 Phase C-only 模式,不执行 Phase A 的任何生成、预览、review、retouch。 ★ 当对话中出现 ===PPT-CRAFT-EDITABLE / DECK FROM EDITOR===、旧标记 ===PPT-IMAGE-FIRST-EDITABLE / DECK FROM EDITOR=== 或 ===DECK JSON BEGIN/END=== 标记时,agent 必须立刻把标记之间的 JSON 原样写入 phaseC/deck.json 并跑 scripts/json_to_pptx.py 渲染,不解读不修改不追问。 当用户需要做汇报 / 答辩 / 路演 / 提案 PPT,或只丢一个主题想要完整成品时使用。
openclaw skills install @ilioner/ppt-craft-editable这是本 skill 最高优先级的规则,覆盖一切其他规则。
用户首次说要做 PPT、首次触发本 skill 时,agent 不需要问用户,直接默默跑:
python3 scripts/preflight.py
preflight.py 会:
doctor.py 做完整体检(字体 / 磁盘 / 网络 / IOPaint 状态 / skill 完整性)| 类别 | preflight 会自动做 | 不会做(请求用户处理) |
|---|---|---|
| Python 包 | ✅ pip install python-pptx pillow numpy opencv-python | — |
| Python 版本 | — | ❌ 不替用户装新 Python(动用户系统太危险) |
| 系统字体 | — | ❌ 跨平台不一致 + 需要 sudo |
| IOPaint | — | ❌ 那是 ~3GB / 5-10 分钟的活,只在 Stage 5.5 真正用到时再装 |
| 磁盘空间 | ✅ 早期就查并按三档处理(见下) | ❌ 不会自动清磁盘 |
| imagegen 通道 | — | ❌ 那是 agent harness 的事,preflight 探不到 |
preflight 在装任何东西之前就先查磁盘。这一项很重要——磁盘满会导致 pip 装包到一半失败、生成图片时写盘失败、IOPaint 模型下载失败,错误信息往往很难懂。
| 磁盘剩余 | preflight 行为 | agent 该怎么说 |
|---|---|---|
| < 0.5 GB | 直接 ❌ 退码 1 阻塞 | 念给用户:"您的磁盘只剩 X GB,连基础依赖都装不下。请清理出至少 4 GB 后再用本 skill。可以删的常见目录:下载目录、回收站、~/.cache、不用的 Docker 镜像。" |
| 0.5 – 2 GB | ⚠️ 警告但继续 | 装包前告诉用户:"您的磁盘只剩 X GB,能装但很紧张。如果后面要修瑕疵(用 IOPaint),还要再 3GB。建议现在清出更多空间。" |
| 2 – 4 GB | ✅ 通过 + 提示 IOPaint 需要 3GB | 一笔带过 |
| ≥ 4 GB | ✅ 通过 | 不用特别提 |
如果 agent 在 Phase A / Phase C 跑到一半看到 No space left on device、OSError: [Errno 28]、Could not write file 这类错误,立刻停下告诉用户磁盘满了,别重试浪费 imagegen 调用。
| preflight 退出码 | 屏幕上看到 | agent 怎么办 |
|---|---|---|
| 0 | 末尾"✅ 环境就绪" | 简短报告"环境就绪",进入 Stage 1(不要再问用户) |
| 0 + 中间有⚠️ | 末尾"✅ 环境就绪"但 doctor 段有 WARN | 同上 + 顺带提一句"有 N 个可选项缺失,影响 XXX,要不要现在修?" |
| 1 | 末尾"❌ 自检仍有阻塞项" | 必须停,把 FAIL 项和修复命令念给用户听 |
后续轮次只要环境没变,不需要重跑——浪费时间。
如果 preflight 真的在装包(首次场景,可能 2-5 分钟),agent 在等待之前应当告诉用户:
第一次使用,正在自动安装 4 个 Python 依赖包(python-pptx / Pillow / numpy / opencv-python)。 首次安装可能需要 2-5 分钟,OpenCV 单独就 ~100MB,期间终端会看起来在卡,请稍等。 装完会自动继续,您不用做任何操作。
这样用户不会以为卡死了去 Ctrl+C。
preflight 和 doctor 都无法直接探测 agent harness 的 imagegen 通道。所以在 Stage 2 出第一张真实预览之前,agent 还要再做一次"出图通道可用性测试":用最小 prompt 出一张极小尺寸的图,确认通道通。这一步失败不算 preflight 失败,但必须停在 Stage 2 之前,告诉用户出图通道不可用、不能继续。
Phase A 流程中必须有两次让用户在浏览器里看 HTML——这是这条 skill 区别于"只在对话里贴图说说"的根本动作。 agent 在长对话里很容易忘记打开壳子,所以下面这两个动作是硬门禁,跑漏了视同 Phase A 没做完:
| 门禁 | 时机 | 必须打开的文件 | 注入命令 |
|---|---|---|---|
| G-Preview | Stage 2 风格预览出图后、用户做"风格确认"前 | phaseA/previews/preview_filled.html | python3 scripts/inject_shell_images.py preview --shell assets/preview_shell/index.html --data phaseA/previews/preview_data.json --out phaseA/previews/preview_filled.html |
| G-Review | Stage 5 全页定稿图出来后、用户做"终图批准"前 | phaseA/review/review_filled.html | python3 scripts/inject_shell_images.py review --shell assets/review_shell/index.html --data phaseA/review/review_data.json --out phaseA/review/review_filled.html |
| G-Candidate(条件触发) | Stage 4 用户选了"多候选 picker"模式时 | phaseA/candidates/picker_filled.html | python3 scripts/inject_shell_images.py candidate --shell assets/candidate_picker_shell/index.html --data phaseA/candidates/candidate_data.json --out phaseA/candidates/picker_filled.html |
*_filled.html 已生成在上表列的精确路径open / xdg-open / start 主动为用户打开它(失败再退路径)<filename>,请在里面确认 / 选图 / 给反馈"assets/preview_shell/index.html 或 assets/review_shell/index.html(裸壳,里面是占位 SVG / 示例数据)—— 必须打开 *_filled.htmlbuild_*.py 当成"已经注入" —— build_*.py 只还原模板不注入数据,跑完图还是占位design_spec.md —— 风格没经过浏览器确认,规划文件作废只在三件事都成立时才允许跳过"自动打开"动作:
open / xdg-open / start 都报错*_filled.html 的绝对路径给到用户,提示他自己双击打开即使浏览器打不开,注入步骤本身不能跳(*_filled.html 仍然必须生成)。
当用户明确说出以下任一意图时,默认进入 Phase C-only:
slide_outline.md,并同步写一份同内容的 ppt大纲.md 方便用户查找;等用户确认后才进 C0/C1。若用户已有完整内容稿且页面结构清晰,可由 agent 直接梳理给用户确认,不需要反复追问细节design_spec.md / slide_blueprint.md / deck.json,先收齐再进 C1-C6phaseC/c0/deck.json、phaseC/c0/editor.html、phaseC/c0/preview/slide_*.png;让用户确认视觉基准后再批量生成全套背景design_spec.md、slide_blueprint.md、spec_lock.mddesign_spec.md 是视觉基准,不依赖 Phase A 成品图;它必须锁定明暗、色彩角色、字体气质、背景材质、装饰语言、留白规则和页面类型语法slide_blueprint.md 决定每页哪些元素进入背景、哪些内容必须保持为可编辑 TextBoxspec_lock.md 必须写清:背景只承载氛围、结构、装饰和非编辑性视觉元素;标题、正文、数字、日期、署名等后期可能改的内容必须进入 deck.json.text_boxesslide_outline.md / ppt大纲.md 以及 phaseC/c0/ 三类预览产物必须真实存在把两套互补能力融成一个 skill:
[用户的模糊需求]
│
▼
┌── Phase A(默认主路径)─────────────────┐
│ Stage 1 Intake + 需求确认 │
│ Stage 1.25 content_report.md │
│ Stage 1.4 ★ 页大纲确认门禁 │
│ slide_outline.md → 用户确认 │
│ Stage 1.5 风格边界(3 个短问题) │
│ Stage 2 多套风格预览(首/目/正) │
│ Stage 2.5 风格 refinement │
│ Stage 2.75 风格反演 + 风格确认 │
│ Stage 3 design_spec / │
│ slide_blueprint / │
│ spec_lock + 生成前确认 │
│ Stage 4 全页定稿图 │
│ Stage 5 review + 用户批准 │
│ Stage 5.5 ★ retouch(可选,用户驱动) │
└──────────────┬──────────────────────────┘
│
▼ 交付:图片型 PPTX + 全页定稿图 + 规划文档
│
┌───────────┴───────────┐
│ ★ 必须主动询问用户 ★ │
│ "PPT 已交付。是否需要 │
│ 可编辑文字版(Phase C)│
│ ——文字能在 PPT 里直接 │
│ 改?这会参考定稿图重生 │
│ 成无字背景,可能有细微 │
│ 差异; │
│ 每页约 2 张 imagegen。" │
└─────────┬─────────────┘
│
用户同意 → 进 Phase C
│
▼
┌── Phase C(可编辑文字版)─────────────────┐
│ C0 Phase C-only 轻量预览门禁(条件触发)│
│ C1 双轨生成背景 │
│ (完整稿 → imagegen 擦字稿) │
│ C2 detect_reserved_zones 校验 │
│ C3 写 deck.json │
│ C4 inject_editor_deck.py 注入编辑器 │
│ C5 ★ 统一编辑 + 背景反馈门禁(必跑) │
│ 文字模式 改字 / 拖框 / 调样式 │
│ 背景反馈模式 矩形/画笔/注释点 + 意见 │
│ → 导出包贴回(含可选 BG REVIEW 段) │
│ → 有 BG REVIEW: 修背景 → 重出编辑器 │
│ → 无 BG REVIEW: 进 C6 │
│ C6 校验 deck.json → 渲染 PPTX │
└──────────────┬──────────────────────────┘
▼
[追加交付:文字可编辑 PPTX + deck.json + backgrounds/]
content_report.md(用户没给完整内容稿时)slide_outline.md(Stage 1.4 页大纲确认,用户已批准)design_spec.md / slide_blueprint.md / spec_lock.mdphaseA/slides/NN-*.png.pptx(高完成度视觉稿,用于汇报/展示——这是默认终交付物)phaseA/imagegen-manifest.jsonphaseC/backgrounds/NN.png(+ 第 1 稿 NN-full.png 备查)phaseC/deck.json(单一真相源,编辑器 / 渲染器共同消费)phaseC/NN-zones.json + phaseC/NN-zones.report.json.pptx(背景 = Picture,文字 = 真 TextBox,跨平台稳定)phaseC/preview/slide_NN.png 近似对照图PPT 主题 / 粗略目标 / 零散材料 / 已有报告稿;可选锚点(受众、页数、身份锚点、用途场景、参考图、风格倾向)。
默认 16:9。Phase A 与 Phase C 全程必须同一比例,禁止中途切换。
Phase A 全部交付完成后,必须主动询问一次用户是否要走 Phase C。这是这条 skill 的硬约束。
图片版 PPT 已经做好了:
- 图片型 PPTX:
<path>- 全 N 页定稿图:
<path>- 规划文档:
<paths>现在的成品是图片版,每页是一整张图——好处是视觉密度最高、跨平台不会跑版;缺点是文字不能在 PowerPoint 里直接改。
如果您后续可能要改文字(比如换日期、换名字、换关键数字、改标题措辞),我可以继续走 Phase C 给您出一份文字可编辑版:
- 参考当前定稿图重新生成无字背景(保留整体风格和装饰,预留文字区;不是从原图里精确抠字,可能有细微差异)
- 文字作为独立图层,在浏览器编辑器里调
- 一键渲染成原生可编辑 PPTX
- 大致成本:每页约 2 张 imagegen(背景完整稿 + 擦字稿),N 页约 X 次调用
要不要进 Phase C?(不需要也可以,图片版本身就能直接拿去汇报)
references/phaseC/workflow.md 跑 C1-C6Phase C editor.html 里用户点”导出 / 继续生成”后会得到一段带 sentinel 的”指令包”,现在有两种格式:
格式 A(只有文字改动,没有背景反馈)
===PPT-CRAFT-EDITABLE / DECK FROM EDITOR===
...
===DECK JSON BEGIN===
{ ... 完整 deck.json ... }
===DECK JSON END===
格式 B(文字改动 + 背景反馈,同一次导出)
===PPT-CRAFT-EDITABLE / DECK FROM EDITOR===
...
===DECK JSON BEGIN===
{ ... 完整 deck.json ... }
===DECK JSON END===
===PHASEC BACKGROUND REVIEW BEGIN===
{ ... phasec-background-review-v1 ... }
===PHASEC BACKGROUND REVIEW END===
格式 A(只有 DECK JSON)→ 直接渲染
===DECK JSON BEGIN/END=== 之间内容原样写入 phaseC/deck.json(覆盖旧版)python3 scripts/json_to_pptx.py phaseC/deck.json -o phaseC/edited.pptx --preview-dir phaseC/previewphaseC/edited.pptx 路径告诉用户,结束格式 B(还有 PHASEC BACKGROUND REVIEW)→ 先修背景,再重开编辑器
===DECK JSON BEGIN/END=== 之间内容写入 phaseC/deck.json(保留文字改动)===PHASEC BACKGROUND REVIEW BEGIN/END=== 里的 pages[],按 requested_action + page_comment / markup 修 phaseC/backgrounds/*.png:
retouch-local → IOPaint 局部修补当前背景regenerate-background → 以反馈为依据重生成该页背景adjust-text-zones → 调整背景留白区,必要时同步 phaseC/*-zones.json;文字框位置等后续在编辑器里调approved → 该页背景通过,不修scripts/inject_editor_deck.py(用刚保存的 deck.json + 新背景)editor.html 让用户再确认一次,不要直接渲染 PPTX不变的规则(格式 A / B 共同遵守)
phasec-background-review-v1 段当成 Phase A review 去跑 render_review_markup.pydeck.json.text_boxes(绕过背景问题)当 Phase C 编辑器打开时,agent 应明确告诉用户:
编辑器已打开。
- 改完文字后:点右上角 ”导出 / 继续生成” → 复制整段(带
===标记)→ 粘贴回对话框,我会直接渲染 PPTX- 发现背景要改:点 ”🖊 背景反馈” 切换到标注模式,对背景框选/画笔/写意见,然后同样导出整段贴回来,我会先修背景再重新打开编辑器给你确认
两件事可以同时做:先在文字模式调好字,再切到背景反馈模式标注,最后统一导出一次即可。
phaseC/deck.json 并渲染,但提醒下次复制整段| 用户场景 | 路径 |
|---|---|
| 只要好看的视觉稿、做完汇报就结束 | Phase A(默认) |
| 没明确点名,只丢主题、要完整成品 | Phase A(默认) |
| Phase A 出图有水印 / 小瑕疵想擦掉 | Phase A + Stage 5.5 retouch |
| Phase A 完成后用户说要可编辑 | Phase A → Phase C(按上面"主动询问"规则) |
| 用户一开始就说"要可编辑 / 后期改字" | Phase C-only(先补最小输入,再跑 C1-C6) |
| 用户明确说"只做可编辑版 / 跳过图片版" | Phase C-only |
按需读,不要一上来全读:
| 何时读 | 文件 |
|---|---|
| ★ 用户首次触发本 skill(agent 默默跑) | scripts/preflight.py(自动装 pip 包 + 调 doctor;不需要问用户) |
| 单纯环境检查(不动用户系统) | scripts/doctor.py(不会自动装东西,纯报告) |
| 路由 / 决定本技能怎么跑(必读) | 本 SKILL.md |
| 跑 Phase A 总流程 | references/phaseA/workflow.md |
| Phase A intake / 对话框架 | references/phaseA/conversation_framework.md |
| Phase A 出风格预览、候选选图、review 页面 | references/phaseA/preview-flow.md |
| Phase A 三个壳子的图片/数据注入(必读) | references/phaseA/shell-injection.md |
| Phase A 风格提案卡 / V1-V8 内部 | references/phaseA/style-system.md |
| Stage 5.5 retouch(去水印 / IOPaint / ImageMagick 兜底) | references/phaseA/retouch.md |
写 content_report.md | templates/content_report_reference.md |
写 slide_outline.md(Stage 1.4 页大纲) | templates/slide_outline_reference.md |
写 design_spec.md | templates/design_spec_reference.md |
写 slide_blueprint.md | templates/slide_blueprint_reference.md |
写 spec_lock.md | templates/spec_lock_reference.md |
| Phase C 总流程(用户同意进 Phase C 时) | references/phaseC/workflow.md |
| 端到端运行手册 + 失败排错 | references/pipeline.md |
Phase A 必须使用以下 3 个本技能自带的 HTML 壳子,不要替换或自造同类页面:
assets/preview_shell/index.html — 风格预览比较(Stage 2)assets/candidate_picker_shell/index.html — 多候选选图(Stage 4 多候选模式)assets/review_shell/index.html — 评审与返修(Stage 5)Phase C 增加一个:
assets/editor_shell/index.html — 文字编辑器(C4-C5)⚠️ 四个壳子的
index.html默认是空架子 / 示例数据:preview_shell 的 9 张图是写死的 SVG 占位图;candidate / review / editor 都带示例数据。真正使用之前必须显式注入真实数据,否则用户打开页面看到的会是占位。统一注入命令(强制):
bash # Stage 2 风格预览 python3 scripts/inject_shell_images.py preview \ --shell assets/preview_shell/index.html \ --data preview_data.json \ --out phaseA/previews/preview_filled.html # Stage 4 多候选选图 python3 scripts/inject_shell_images.py candidate \ --shell assets/candidate_picker_shell/index.html \ --data candidate_data.json \ --out phaseA/candidates/picker_filled.html # Stage 5 评审 python3 scripts/inject_shell_images.py review \ --shell assets/review_shell/index.html \ --data review_data.json \ --out phaseA/review/review_filled.html # Phase C 文字编辑器 python3 scripts/inject_editor_deck.py \ --shell assets/editor_shell/index.html \ --deck phaseC/deck.json \ --out phaseC/editor.html
- 各 data JSON 的 schema 见对应脚本顶部 docstring。
- 打开时必须打开
*_filled.html/editor.html,不要打开assets/.../index.html原模板。- 默认保留相对路径,配合 HTML 与背景图同目录使用;要打包分发再加
--inline把图片 base64 嵌入 HTML,或加--file-url改成绝对file://。editor.html默认应与phaseC/backgrounds/旁置,避免把背景内嵌成 7MB+ 的单文件。build_*.py三个脚本只是把壳子从内嵌 base64 还原成index.html,它们不注入真实数据,不要把 build 和 inject 搞混。
按 references/phaseA/workflow.md 跑完所有 Stage。这里只列死规则。
user_provided / inferred / needs_confirmation;不擅自编造未授权事实、数据、引用、机构结论。assets/preview_shell/index.html、assets/candidate_picker_shell/index.html、assets/review_shell/index.html。打开前必须先用 scripts/inject_shell_images.py 把真实图注入到 *_filled.html,不要直接打开壳子原模板。slide_blueprint.md 不能在风格反演确认之前写。需求确认content_report.md(除非用户已给完整稿)slide_outline.md,逐页列出将要出现在 PPT 上的可见文字 + claim_status,贴摘要给用户,等用户确认后才进 Stage 1.5preview_shell;可选 Stage 2.5 refinement;必跑 Stage 2.75 风格反演确认 → 风格确认design_spec.md → slide_blueprint.md → spec_lock.md → 生成前确认candidate_picker_shell)出齐全页定稿图review_shell 做评审;不通过则用 scripts/render_review_markup.py 渲染标注图 + 文本反馈再喂回去返修references/phaseA/retouch.mdPhase A 出图被叠加了工具水印(典型如 Qoder 的 "Qoder AI生成")、或某页角落有想擦掉的小瑕疵时,默认提供以下两个工具:
# 工具 1:批量去固定位置的角落水印(最省事,适合工具水印)
python3 scripts/remove_corner_watermark.py phaseA/slides/ -o phaseA/slides_clean/ --batch
# 工具 2:IOPaint 手工 inpaint(任意位置 / 复杂背景;效果最强)
# 首次自动调 setup_iopaint.py 装 IOPaint + LaMa(约 5–10 分钟、~3GB)
python3 scripts/launch_iopaint.py --slides-dir phaseA/slides
关键性质(agent 必须遵守):
~/.cache/ppt-craft-editable/.lama-installed,二次启动秒开。remove_corner_watermark.py / ImageMagick 矩形遮罩)。python3 scripts/launch_iopaint.py --slides-dir phaseC/backgrounds。完整工具说明、操作流程、何时该用 / 不该用,详见 references/phaseA/retouch.md。
仅当用户在 Phase A 交付后的"主动询问"中同意进入时才执行。完整流程在 references/phaseC/workflow.md,这里只列死规则。
view_image Phase A 定稿图,再调 imagegen,prompt 写"以刚刚显示的这张图片作为唯一编辑目标"。不要只写本地路径。scripts/detect_reserved_zones.py 校验。不合规 → 重出 / IOPaint 局部擦。🖊 背景反馈 模式里完成;本 skill 不再提供独立背景审计壳子。json_to_pptx.py 会自动调用 scripts/validate_deck_json.py;若缺 background、坐标越界、颜色格式错误或背景路径不可访问,必须先修 deck.json,不要猜补。scripts/json_to_pptx.py 顶部。不在集合里会有警告,跨平台可能掉 fallback。可用:PingFang SC / Microsoft YaHei / Hiragino Sans GB / Arial / Helvetica 等系统字体。font_size_pt,不要算像素。file:// / data::编辑器导出的 deck 可能带这些形式,json_to_pptx.py 必须直接兼容。inject_editor_deck.py 默认保留相对路径,editor.html 与 phaseC/backgrounds/ 放同一目录;只有明确需要时才用 --inline。scripts/detect_reserved_zones.py 校验预留区phaseC/deck.json(每页 background + text_boxes 初稿)scripts/inject_editor_deck.py 注入编辑器,生成 editor.html🖊 背景反馈 切换):矩形/画笔/注释点标注背景要改的位置scripts/json_to_pptx.py 渲染 → 可编辑 PPTXscripts/)# ─── Stage 0:用户首次触发,agent 默默跑(无需问用户)──────
python3 scripts/preflight.py
# 自动安装缺失的 4 个 pip 包(首次 2-5 分钟),装完调 doctor
# 退出码 0 = 可继续;退出码 1 = 有不可自动修的项目,让用户处理
# 单纯想看环境状态(不动用户系统)
python3 scripts/doctor.py
# ─── 基础依赖(preflight 失败时手动装的兜底方案)─────────
pip3 install python-pptx pillow numpy opencv-python
# ─── Phase A ───────────────────────────────────────────────
# 把真实图注入工作流壳子(每个 Stage 出图后必跑)
python3 scripts/inject_shell_images.py preview --shell assets/preview_shell/index.html --data preview_data.json --out phaseA/previews/preview_filled.html
python3 scripts/inject_shell_images.py candidate --shell assets/candidate_picker_shell/index.html --data candidate_data.json --out phaseA/candidates/picker_filled.html
python3 scripts/inject_shell_images.py review --shell assets/review_shell/index.html --data review_data.json --out phaseA/review/review_filled.html
# review markup 渲染(用户在 review_shell 给的坐标标注 → 标注图)
python3 scripts/render_review_markup.py <review.json> --out-dir <dir>
# ─── Stage 5.5 Retouch(用户驱动,可选)────────────────────
# 批量去角落水印
python3 scripts/remove_corner_watermark.py phaseA/slides/ -o phaseA/slides_clean/ --batch
# IOPaint:首次自动装环境 + 下 LaMa(5–10 分钟、~3GB),之后秒开
python3 scripts/launch_iopaint.py --slides-dir phaseA/slides
# Phase C 也可以用(擦字稿不合规时局部涂抹)
python3 scripts/launch_iopaint.py --slides-dir phaseC/backgrounds
# 单独管理 IOPaint
python3 scripts/setup_iopaint.py --check-only # 检查
python3 scripts/setup_iopaint.py # 装
python3 scripts/setup_iopaint.py --reinstall # 强制重装
# ─── Phase C(用户同意可编辑后才跑)─────────────────────────
# C2 校验擦字稿的预留区是否真的留白
python3 scripts/detect_reserved_zones.py phaseC/backgrounds/01.png phaseC/01-zones.json --report phaseC/01-zones.report.json
# C4 把 deck.json 注入编辑器壳子(C5 用户在里面调文字 + 提背景反馈)
python3 scripts/inject_editor_deck.py \
--shell assets/editor_shell/index.html \
--deck phaseC/deck.json \
--out phaseC/editor.html
# C6 deck.json → 可编辑 PPTX(+ 可选 PIL 近似预览图)
python3 scripts/validate_deck_json.py phaseC/deck.json
python3 scripts/json_to_pptx.py phaseC/deck.json -o phaseC/<topic>.pptx --preview-dir phaseC/preview
<topic-slug>/
├── content_report.md # 仅当 Stage 1.25 生成
├── slide_outline.md # Stage 1.4 页大纲确认门禁(必有)
├── design_spec.md
├── slide_blueprint.md
├── spec_lock.md
│
├── phaseA/ # Phase A 产物(默认交付)
│ ├── previews/ # 各阶段风格预览(保留备查)
│ ├── candidates/ # 多候选模式时使用
│ ├── slides/NN-*.png # 评审通过的终图
│ ├── slides_clean/ # Stage 5.5 retouch 后的图(可选)
│ ├── review/ # 评审产物
│ ├── imagegen-manifest.json
│ └── <topic>-image-deck.pptx # 图片型 PPTX
│
└── phaseC/ # Phase C 产物(用户同意才出现)
├── backgrounds/
│ ├── NN-full.png # 第 1 稿(完整稿,备查)
│ └── NN.png # 第 2 稿(擦字稿,实际背景)
├── NN-zones.json # 每页预留区声明
├── NN-zones.report.json # 校验报告
├── deck.json # 单一真相源
├── editor.html # 注入后的编辑器
├── preview/slide_NN.png # PIL 近似预览图(可选)
└── <topic>-editable.pptx # 文字可编辑 PPTX
外置缓存(IOPaint 用,不在本目录里):
~/.cache/ppt-craft-editable/
├── venv/ # IOPaint 专属 venv
├── .lama-installed # 安装标记 + 元数据
└── setup.log # 安装日志
把整个 ppt-craft-editable/ 复制到 agent 的 skills 目录即可。完全自包含,不依赖其他外部 skill。
# Codex
cp -R ppt-craft-editable "${CODEX_HOME:-$HOME/.codex}/skills/ppt-craft-editable"
Python 依赖(基础):
pip3 install python-pptx pillow numpy opencv-python
Stage 5.5 IOPaint 是用户首次触发时自动安装:
~/.cache/ppt-craft-editable/venv/,不污染系统图像生成路径:依赖运行环境内可用的 imagegen 通道(Codex 用内置 imagegen / GPT Image 2)。如果运行时不可用,必须停在该 Stage 并向用户说明阻塞原因,不允许用 PIL/SVG/Canvas/PPT shapes 兜底。
本技能起源于:
ppt-image-first(Phase A 工作流、references、templates、assets 部分原型) — Linux.do 社区编排层、Stage 5.5 retouch 工具链、IOPaint 自动安装与启动器、Phase C 全套(双轨生成 + detect_reserved_zones + HTML 编辑器 + json_to_pptx 渲染器)—— 本 skill 自有。商用时请同时标明上述来源。