Skip to content

[docs/feature] 提議擴充 che-pptx-mcp + Swift 腳本工作流;references/ 放 python-pptx 當參考 #90

Description

@kiki830621

Problem

Original request:
「可以再 macdoc 裡面提議可以做 che-pptx-mcp 與 swift 腳本的使用方式嗎?現在用 python 是不是其實難控制,但可以再那裡的 references 參考 python 套件」
— Source: 使用者對話(建構 gukai 專案 spondylodiscitis_taoyuan_6min.pptx 過程中觀察到的痛點)

Type

feature / docs(提案文件;實作工具留給後續 issue 拆分)

Motivation

實際痛點來自最近用 python-pptx 建一份 8 張投影片的醫院模板簡報(顧凱鈞 spondylodiscitis 報告):

  • 字級、圖片 box、placeholder 座標改一輪就要 rebuild → 開 Keynote → export PDF → 讀圖確認,iteration 成本高
  • python-pptx 的 placeholder API 是「讀到的 XML 原封不動」,沒有 model layer;要調圖片 aspect / box 得自己算 EMU
  • Python 跟 Keynote 的字體渲染不一致(macOS 只能靠 Keynote / PowerPoint export 才能看到真實結果)
  • 與此對照,che-word-mcp (146 tools, v1.17) 在 docx 上的體驗是「tool call 即改即生效、可直接在 session 內 finalize」

che-pptx-mcp 目前是 v0.1.0、約 45 tools(見 mcp/che-pptx-mcp/Sources/ChePPTXMCP/Server.swift),底下的 packages/pptx-swift 已經有 Models / IO / Errors 結構,距離「pptx 版的 che-word-mcp」只差工具覆蓋度與高層 API。

Proposal

1. 擴充 che-pptx-mcp 往 che-word-mcp 的成熟度靠攏

che-word-mcp 的 Dual-Mode(source_path direct / doc_id session)同一條路走,重點補齊以下工具族:

Layout / Geometry(最痛的一塊)

  • `set_placeholder_geometry(doc_id, slide_idx, ph_idx, left_cm, top_cm, width_cm, height_cm)` — 用 cm 不用 EMU
  • `place_picture_at(doc_id, slide_idx, img_path, left_cm, top_cm, width_cm, height_cm, fit: "contain"|"cover"|"stretch")` — 預設 contain + aspect-match
  • `fit_picture_to_native_aspect(doc_id, slide_idx, img_path, anchor: "left"|"right"|"center", max_width_cm, max_height_cm)` — 自動照原生 aspect 算 box(Python 版現在得自己寫)

Text runs(bullet 加粗/變色/改字級)

  • `add_rich_bullet(doc_id, slide_idx, ph_idx, segments: [(text, bold?, color?, size?)])`
  • `set_run_style(doc_id, slide_idx, shape_id, run_idx, ...)`

Template handling

  • `list_slide_masters` / `list_slide_layouts` / `add_slide_from_layout(master_idx, layout_idx)`
  • `delete_all_slides_preserve_masters` — 從模板只保留版型常用操作
  • `copy_slide_from(source_path, slide_idx)`

Notes / presenter

  • `set_notes(doc_id, slide_idx, text)` / `get_notes(...)`
  • `export_notes_markdown(source_path)` — 對照 che-word-mcp 的 `export_markdown`

Export / preview

  • `export_pdf(doc_id, output_path)` — 透過 Keynote AppleScript 或 LibreOffice
  • `render_slide_png(doc_id, slide_idx, output_path, dpi)` — 給 LLM 回饋 loop

2. Swift 腳本 (macdoc/scripts/) 的使用方式文件化

提議在 `scripts/` 下加 `pptx/` 子目錄,放常見 workflow 的範例腳本:

  • `build-from-template.swift` — 從模板建簡報的樣板(對標 gukai 用的 `build_taoyuan_slides.py`)
  • `figures-to-aspect-boxes.swift` — 讀圖片算出每張投影片的最佳 box 尺寸
  • `sync-notes-from-markdown.swift` — 從 .md 講稿批次寫入備忘稿

並在 `CONVERSIONS.md` 或新建 `PPTX.md` 文件記錄:

  • 何時用 MCP tool / 何時用腳本
  • 字體 / 尺寸單位 (cm vs EMU vs Pt) 的 convention

3. references/ 放 python-pptx 當參考實作

macdoc 的 `references/` 目前只有 `swift-argument-parser` 跟 `textutil-manpage.txt`。提議加入:

  • `references/python-pptx/` — clone scanny/python-pptx 作為 API design 對照(不是 runtime 依賴,純看它的 Model 抽象、placeholder 操作、圖片插入等處理方式)
  • `references/python-docx/` — 同上,跟 che-word-mcp 對照

動機:Swift-native 版本要決定哪些 API 要抽高、哪些要攤平,成熟的 Python 套件是現成的 reference design。

Expected

  • `che-pptx-mcp` 工具數接近 `che-word-mcp`(目標 80+ tools,涵蓋 geometry / text / template / notes / export)
  • Swift 腳本有明確 entry point 與範例,跟 MCP tool 的使用界線清楚
  • `references/python-pptx` 作為設計決策的對照資料

Actual (現況)

  • `che-pptx-mcp` v0.1.0,~45 tools,缺 geometry-by-cm / rich runs / export 等高頻需求
  • `scripts/` 只有 `build-metallib.sh`,沒有 pptx workflow 範例
  • `references/` 沒有 python-pptx 可對照

Impact

  • 免去「改字級 → rebuild → Keynote export → 讀 PDF」的 Python iteration 成本
  • 讓 gukai 類型的「論文 → 醫院模板簡報」這種 workflow 在 macdoc 生態內一站解決
  • che-pptx-mcp 朝著跟 che-word-mcp 一樣成熟的方向演進,兩個 MCP 的 API 風格對齊更好維護

Priority

P2(排程 / 本季內規劃)— 現況 Python 能 work-around,但痛點真實;建議按工具族拆成多個子 issues 逐步推進。

Next Steps Suggested

此 issue 作為 umbrella proposal。實作時建議拆成:

  1. 補 geometry 工具族
  2. 補 text runs / rich bullets
  3. 補 notes / export
  4. Swift scripts + 文件
  5. references/ 加入 python-pptx

每一個各開子 issue 再跑 idd-diagnose / idd-implement。

Current Status

Phase: verified
Last updated: 2026-04-22 by idd-diagnose (batch)


Current Status

Phase: in-progress (umbrella — slice 1 proposed)
Last updated: 2026-06-12 by /spectra-discuss + /spectra-propose

Partition (locked at 2026-06-12 discuss)

  • Slice 1 — pptx-geometry-tools (Spectra change proposed + parked 2026-06-12; run /spectra-apply pptx-geometry-tools to start): cm-denominated geometry — pptx-swift metric module + 3 che-pptx-mcp tools (set_placeholder_geometry, place_picture_at, fit_picture_to_native_aspect) + python-pptx reference row. Revives PR Propose che-pptx geometry tools #95 scope. No Edit-algebra dependency.
  • Slice 2 — pptx-edit-isomorphism-foundation: PPTX Edit-algebra foundation mirroring macdoc#99. Opens when slice 3 is scheduled (it's the real driver — replayable typed edits for scripting). Not before.
  • Slice 3 — mpptx scripting (.mpptx per extension-first-dsl registered table): Swift 腳本工作流. Consumes slice 2.

Tracker #104 pointer-closes against slice 1 (done 2026-06-12).

Key Decisions

Scope Changes

Blocking

  • Awaiting /spectra-discuss to partition scope — done 2026-06-12 (3-slice partition above).
  • PR Propose che-pptx geometry tools #95 review/merge — superseded (closed without merge 2026-05-25).

Commits

  • (none for this issue yet)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions