dcc-mcp-powerpoint 0.2.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dcc_mcp_powerpoint-0.2.3/.github/workflows/ci.yml +30 -0
- dcc_mcp_powerpoint-0.2.3/.github/workflows/packaging.yml +64 -0
- dcc_mcp_powerpoint-0.2.3/.github/workflows/release.yml +162 -0
- dcc_mcp_powerpoint-0.2.3/.gitignore +16 -0
- dcc_mcp_powerpoint-0.2.3/.release-please-manifest.json +3 -0
- dcc_mcp_powerpoint-0.2.3/AGENTS.md +72 -0
- dcc_mcp_powerpoint-0.2.3/CHANGELOG.md +59 -0
- dcc_mcp_powerpoint-0.2.3/CONTRIBUTING.md +43 -0
- dcc_mcp_powerpoint-0.2.3/LICENSE +21 -0
- dcc_mcp_powerpoint-0.2.3/PKG-INFO +124 -0
- dcc_mcp_powerpoint-0.2.3/README.md +90 -0
- dcc_mcp_powerpoint-0.2.3/README_zh.md +32 -0
- dcc_mcp_powerpoint-0.2.3/docs/README.md +5 -0
- dcc_mcp_powerpoint-0.2.3/docs/adr/001-thin-adapter-over-office-core.md +27 -0
- dcc_mcp_powerpoint-0.2.3/docs/adr/002-skill-packs-live-in-repo.md +26 -0
- dcc_mcp_powerpoint-0.2.3/docs/adr/003-standalone-distribution.md +38 -0
- dcc_mcp_powerpoint-0.2.3/docs/adr/README.md +7 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/blender.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/cinema4d.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/houdini.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/katana.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/marmoset.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/max3ds.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/maya.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/nuke.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/photoshop.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/substance.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/unity.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/logos/unreal.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/showcase/blender-lookdev.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/showcase/hunyuan3d.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/showcase/marmoset-pbr-lookdev.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/assets/showcase/zbrush-dragon.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/capability_boundary_showcase.json +343 -0
- dcc_mcp_powerpoint-0.2.3/examples/dcc_mcp_framework_intro.json +265 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/README.md +65 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/draft-capability-boundary-showcase.pdf +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/draft-capability-boundary-showcase.pptx +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/patches/showcase-v2.patch.json +72 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-01.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-02.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-03.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-04.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-05.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-06.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-07.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-08.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-09.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-10.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-11.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-12.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-13.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-14.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-15.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-16.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-17.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/assigned-callout.pptx +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/footer-front.pptx +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/green-accent.pdf +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-01.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-02.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-03.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-04.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-05.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-06.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-07.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-08.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-09.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-10.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-11.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-12.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-13.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-14.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-15.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-16.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-17.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent.pptx +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/host-compiled.pptx +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/no-decoration.pdf +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-01.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-02.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-03.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-04.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-05.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-06.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-07.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-08.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-09.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-10.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-11.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-12.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-13.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-14.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-15.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-16.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-17.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration.pptx +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/patched-v2.pdf +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-01.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-02.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-03.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-04.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-05.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-06.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-07.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-08.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-09.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-10.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-11.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-12.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-13.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-14.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-15.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-16.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-17.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-18.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2.pptx +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/draft-dcc-mcp-framework-intro.pdf +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/draft-dcc-mcp-framework-intro.pptx +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-01.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-02.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-03.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-04.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-05.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-06.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-07.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-08.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-09.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-10.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-11.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-12.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-13.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-14.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-15.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-16.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/draft-review-dcc-mcp-framework.pdf +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/draft-review-dcc-mcp-framework.pptx +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/previews/slide-01.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/previews/slide-02.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/previews/slide-03.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/previews/slide-04.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/previews/slide-05.png +0 -0
- dcc_mcp_powerpoint-0.2.3/examples/plugins/deck-stats/deck_stats.py +52 -0
- dcc_mcp_powerpoint-0.2.3/examples/plugins/deck-stats/plugin.json +20 -0
- dcc_mcp_powerpoint-0.2.3/examples/shots_manifest.demo.json +22 -0
- dcc_mcp_powerpoint-0.2.3/examples/shots_manifest.example.json +22 -0
- dcc_mcp_powerpoint-0.2.3/install.md +74 -0
- dcc_mcp_powerpoint-0.2.3/pyoxidizer.bzl +56 -0
- dcc_mcp_powerpoint-0.2.3/pyproject.toml +57 -0
- dcc_mcp_powerpoint-0.2.3/release-please-config.json +15 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/__init__.py +40 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/_standalone_entry.py +119 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/analyze.py +279 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/brand/__init__.py +30 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/brand/assets/dcc-mcp-logo-dark.png +0 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/brand/assets/dcc-mcp-logo-light.png +0 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/compiler.py +425 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/deck_ir.py +254 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/edits.py +377 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/host_client.py +216 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/layers.py +386 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/plugins.py +252 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/render.py +114 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/server_launcher.py +87 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/sidecar/__init__.py +5 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/sidecar/office_host.py +76 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/SKILL.md +101 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/learnings.md +93 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/references/RECIPES.md +150 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/analyze_deck.py +49 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/generate_deck.py +105 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/inventory_deck.py +83 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/render_deck.py +54 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/validate_deck.py +55 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/tools.yaml +141 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-edit/SKILL.md +114 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-edit/metadata/depends.md +3 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-edit/scripts/edit_deck.py +76 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-edit/scripts/slide_tree.py +72 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-edit/tools.yaml +59 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/SKILL.md +79 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/scripts/layer_assign.py +103 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/scripts/layer_list.py +91 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/scripts/layer_recolor.py +98 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/scripts/layer_reorder.py +96 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/scripts/layer_set_visibility.py +96 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/tools.yaml +190 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-plugins/SKILL.md +89 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-plugins/scripts/plugin_list.py +55 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-plugins/scripts/plugin_run.py +86 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-plugins/tools.yaml +58 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-review/SKILL.md +52 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-review/scripts/review_deck_from_renders.py +148 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-review/tools.yaml +31 -0
- dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/validate.py +60 -0
- dcc_mcp_powerpoint-0.2.3/tests/README.md +5 -0
- dcc_mcp_powerpoint-0.2.3/tests/__init__.py +0 -0
- dcc_mcp_powerpoint-0.2.3/tests/_tmphelper.py +27 -0
- dcc_mcp_powerpoint-0.2.3/tests/conftest.py +10 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_analyze.py +89 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_compiler.py +195 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_deck_ir.py +82 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_edits.py +194 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_host_client.py +197 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_layers.py +193 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_new_skill_scripts.py +176 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_plugins.py +186 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_runtime_purity.py +36 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_server_launcher.py +61 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_skill_scripts.py +144 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_validate.py +28 -0
- dcc_mcp_powerpoint-0.2.3/tests/test_version.py +45 -0
- dcc_mcp_powerpoint-0.2.3/tools/build_binary.py +76 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
python:
|
|
13
|
+
runs-on: windows-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.11"
|
|
19
|
+
- name: Install
|
|
20
|
+
run: python -m pip install -e ".[dev]"
|
|
21
|
+
- name: Ruff
|
|
22
|
+
run: ruff check src tests
|
|
23
|
+
- name: Skill lint (official dcc-mcp-cli validator)
|
|
24
|
+
shell: pwsh
|
|
25
|
+
run: |
|
|
26
|
+
# dcc-mcp-cli ships through the dcc-mcp-core release train, not pip.
|
|
27
|
+
Invoke-WebRequest -Uri "https://github.com/dcc-mcp/dcc-mcp-core/releases/download/v0.20.6/dcc-mcp-cli-windows-x86_64.exe" -OutFile "$env:RUNNER_TEMP\dcc-mcp-cli.exe"
|
|
28
|
+
& "$env:RUNNER_TEMP\dcc-mcp-cli.exe" lint src/dcc_mcp_powerpoint/skills --warnings-as-errors --non-interactive
|
|
29
|
+
- name: Pytest
|
|
30
|
+
run: pytest -q
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
name: Packaging
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
paths:
|
|
6
|
+
- "pyoxidizer.bzl"
|
|
7
|
+
- "tools/**"
|
|
8
|
+
- "src/dcc_mcp_powerpoint/_standalone_entry.py"
|
|
9
|
+
- "src/dcc_mcp_powerpoint/server_launcher.py"
|
|
10
|
+
- "src/dcc_mcp_powerpoint/host_client.py"
|
|
11
|
+
- "pyproject.toml"
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
standalone:
|
|
19
|
+
runs-on: windows-latest
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
- uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.12"
|
|
25
|
+
- uses: actions/setup-dotnet@v4
|
|
26
|
+
with:
|
|
27
|
+
dotnet-version: "8.0.x"
|
|
28
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
29
|
+
|
|
30
|
+
# Pinned host-source ref: the dependency build (dcc-office-host) is
|
|
31
|
+
# produced by dcc-mcp-office's Publish Host workflow; we build it here
|
|
32
|
+
# from the pinned source so packaging stays reproducible. Bump this ref
|
|
33
|
+
# when the office dependency changes; switch to downloading the
|
|
34
|
+
# published artifact once dcc-mcp-office cuts releases.
|
|
35
|
+
- name: Checkout dcc-mcp-office (host source)
|
|
36
|
+
uses: actions/checkout@v4
|
|
37
|
+
with:
|
|
38
|
+
repository: dcc-mcp/dcc-mcp-office
|
|
39
|
+
ref: b1004bfb61d4af727d5f5bdd8bc1b4e10c88c7dd
|
|
40
|
+
path: _office
|
|
41
|
+
|
|
42
|
+
- name: Install PyOxidizer
|
|
43
|
+
run: python -m pip install pyoxidizer
|
|
44
|
+
|
|
45
|
+
- name: Build standalone (host publish + pyoxidizer)
|
|
46
|
+
run: python tools/build_binary.py --host-source _office
|
|
47
|
+
|
|
48
|
+
- name: Smoke test — version + compile via bundled host
|
|
49
|
+
shell: pwsh
|
|
50
|
+
run: |
|
|
51
|
+
Get-ChildItem dist/binary | Select-Object -First 5 Name, Length
|
|
52
|
+
$exe = Join-Path $env:GITHUB_WORKSPACE "dist/binary/dcc-mcp-powerpoint.exe"
|
|
53
|
+
if (-not (Test-Path $exe)) { Write-Error "standalone exe missing: $exe"; exit 1 }
|
|
54
|
+
& $exe --version
|
|
55
|
+
$smoke = Join-Path $env:GITHUB_WORKSPACE "dist/smoke.pptx"
|
|
56
|
+
& $exe compile --input examples/dcc_mcp_framework_intro.json --output $smoke
|
|
57
|
+
if (-not (Test-Path $smoke)) { Write-Error "compile produced no output"; exit 1 }
|
|
58
|
+
& $exe inspect --input $smoke
|
|
59
|
+
|
|
60
|
+
- name: Upload standalone artifact
|
|
61
|
+
uses: actions/upload-artifact@v4
|
|
62
|
+
with:
|
|
63
|
+
name: dcc-mcp-powerpoint-windows-x64
|
|
64
|
+
path: dist/binary
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Automated releases via release-please (conventional commits), mirroring
|
|
4
|
+
# dcc-mcp-office's release flow.
|
|
5
|
+
#
|
|
6
|
+
# Every push to main runs release-please, which keeps a release PR up to date.
|
|
7
|
+
# When that PR is merged, release-please creates the GitHub release and tag;
|
|
8
|
+
# this workflow then rebuilds the standalone binary and attaches it, so
|
|
9
|
+
# downstream consumers always have a versioned, CI-verified
|
|
10
|
+
# dcc-mcp-powerpoint.exe to consume.
|
|
11
|
+
|
|
12
|
+
on:
|
|
13
|
+
push:
|
|
14
|
+
branches: [main]
|
|
15
|
+
workflow_dispatch:
|
|
16
|
+
inputs:
|
|
17
|
+
tag_name:
|
|
18
|
+
description: "Tag to attach assets to (optional; used to re-attach after a failed publish)"
|
|
19
|
+
required: false
|
|
20
|
+
default: ""
|
|
21
|
+
|
|
22
|
+
permissions:
|
|
23
|
+
contents: write
|
|
24
|
+
pull-requests: write
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
release-please:
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
outputs:
|
|
30
|
+
release_created: ${{ steps.release.outputs.release_created }}
|
|
31
|
+
tag_name: ${{ steps.release.outputs.tag_name }}
|
|
32
|
+
steps:
|
|
33
|
+
- uses: googleapis/release-please-action@v4
|
|
34
|
+
id: release
|
|
35
|
+
with:
|
|
36
|
+
# A PAT (user-owned) is required: PRs opened with the default
|
|
37
|
+
# GITHUB_TOKEN do not trigger pull_request workflows, so CI would
|
|
38
|
+
# never run on release PRs.
|
|
39
|
+
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
|
|
40
|
+
config-file: release-please-config.json
|
|
41
|
+
manifest-file: .release-please-manifest.json
|
|
42
|
+
|
|
43
|
+
publish-release-assets:
|
|
44
|
+
needs: release-please
|
|
45
|
+
if: needs.release-please.outputs.release_created == 'true' || github.event_name == 'workflow_dispatch'
|
|
46
|
+
runs-on: windows-latest
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/checkout@v4
|
|
49
|
+
|
|
50
|
+
- uses: actions/setup-python@v5
|
|
51
|
+
with:
|
|
52
|
+
python-version: "3.12"
|
|
53
|
+
- uses: actions/setup-dotnet@v4
|
|
54
|
+
with:
|
|
55
|
+
dotnet-version: "8.0.x"
|
|
56
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
57
|
+
|
|
58
|
+
# Pinned host-source ref: the dependency build (dcc-office-host) is
|
|
59
|
+
# produced by dcc-mcp-office's Release workflow; we build it here from
|
|
60
|
+
# the pinned source so packaging stays reproducible. Bump this ref when
|
|
61
|
+
# the office dependency changes; switch to downloading the published
|
|
62
|
+
# artifact once dcc-mcp-office cuts releases.
|
|
63
|
+
- name: Checkout dcc-mcp-office (host source)
|
|
64
|
+
uses: actions/checkout@v4
|
|
65
|
+
with:
|
|
66
|
+
repository: dcc-mcp/dcc-mcp-office
|
|
67
|
+
ref: b1004bfb61d4af727d5f5bdd8bc1b4e10c88c7dd
|
|
68
|
+
path: _office
|
|
69
|
+
|
|
70
|
+
- name: Install PyOxidizer
|
|
71
|
+
run: python -m pip install pyoxidizer
|
|
72
|
+
|
|
73
|
+
- name: Build standalone (host publish + pyoxidizer)
|
|
74
|
+
run: python tools/build_binary.py --host-source _office
|
|
75
|
+
|
|
76
|
+
- name: Smoke test — version + compile via bundled host
|
|
77
|
+
shell: pwsh
|
|
78
|
+
run: |
|
|
79
|
+
Get-ChildItem dist/binary | Select-Object -First 5 Name, Length
|
|
80
|
+
$exe = Join-Path $env:GITHUB_WORKSPACE "dist/binary/dcc-mcp-powerpoint.exe"
|
|
81
|
+
if (-not (Test-Path $exe)) { Write-Error "standalone exe missing: $exe"; exit 1 }
|
|
82
|
+
& $exe --version
|
|
83
|
+
$smoke = Join-Path $env:GITHUB_WORKSPACE "dist/smoke.pptx"
|
|
84
|
+
& $exe compile --input examples/dcc_mcp_framework_intro.json --output $smoke
|
|
85
|
+
if (-not (Test-Path $smoke)) { Write-Error "compile produced no output"; exit 1 }
|
|
86
|
+
& $exe inspect --input $smoke
|
|
87
|
+
|
|
88
|
+
- name: Upload standalone artifacts to the GitHub release
|
|
89
|
+
shell: pwsh
|
|
90
|
+
env:
|
|
91
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
92
|
+
# Tag from the release job, or the manual dispatch input when
|
|
93
|
+
# re-attaching assets to an existing release.
|
|
94
|
+
TARGET_TAG: ${{ needs.release-please.outputs.tag_name || github.event.inputs.tag_name }}
|
|
95
|
+
run: |
|
|
96
|
+
$tag = $env:TARGET_TAG
|
|
97
|
+
if (-not $tag) { Write-Error "no target tag"; exit 1 }
|
|
98
|
+
$bundle = Join-Path $env:GITHUB_WORKSPACE "dist/dcc-mcp-powerpoint-windows-x64.zip"
|
|
99
|
+
Compress-Archive -Path "$env:GITHUB_WORKSPACE/dist/binary/*" -DestinationPath $bundle -Force
|
|
100
|
+
$digest = (Get-FileHash -Algorithm SHA256 -LiteralPath $bundle).Hash.ToLowerInvariant()
|
|
101
|
+
$checksum = "$bundle.sha256"
|
|
102
|
+
$assetName = [IO.Path]::GetFileName($bundle)
|
|
103
|
+
[IO.File]::WriteAllText($checksum, "$digest $assetName`n", [Text.UTF8Encoding]::new($false))
|
|
104
|
+
gh release upload $tag $bundle $checksum --clobber --repo dcc-mcp/dcc-mcp-powerpoint
|
|
105
|
+
|
|
106
|
+
publish-pypi:
|
|
107
|
+
name: Publish to PyPI
|
|
108
|
+
runs-on: ubuntu-latest
|
|
109
|
+
needs: [release-please]
|
|
110
|
+
if: needs.release-please.outputs.release_created == 'true'
|
|
111
|
+
environment:
|
|
112
|
+
name: pypi
|
|
113
|
+
url: https://pypi.org/p/dcc-mcp-powerpoint
|
|
114
|
+
permissions:
|
|
115
|
+
contents: read
|
|
116
|
+
id-token: write
|
|
117
|
+
env:
|
|
118
|
+
RELEASE_TAG: ${{ needs.release-please.outputs.tag_name }}
|
|
119
|
+
steps:
|
|
120
|
+
- uses: actions/checkout@v6
|
|
121
|
+
with:
|
|
122
|
+
ref: ${{ needs.release-please.outputs.tag_name }}
|
|
123
|
+
fetch-depth: 0
|
|
124
|
+
persist-credentials: false
|
|
125
|
+
- name: Verify release identity and version
|
|
126
|
+
env:
|
|
127
|
+
EXPECTED_VERSION: ${{ needs.release-please.outputs.tag_name }}
|
|
128
|
+
shell: bash
|
|
129
|
+
run: |
|
|
130
|
+
set -euo pipefail
|
|
131
|
+
[[ "$RELEASE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]] || {
|
|
132
|
+
echo "Release target must be a canonical vMAJOR.MINOR.PATCH tag." >&2
|
|
133
|
+
exit 1
|
|
134
|
+
}
|
|
135
|
+
export EXPECTED_VERSION="${RELEASE_TAG#v}"
|
|
136
|
+
python - <<'PY'
|
|
137
|
+
import json
|
|
138
|
+
import os
|
|
139
|
+
import re
|
|
140
|
+
from pathlib import Path
|
|
141
|
+
|
|
142
|
+
expected = os.environ["EXPECTED_VERSION"]
|
|
143
|
+
manifest = json.loads(Path(".release-please-manifest.json").read_text(encoding="utf-8"))["."]
|
|
144
|
+
source = Path("pyproject.toml").read_text(encoding="utf-8")
|
|
145
|
+
match = re.search(r'^version = "([0-9]+\.[0-9]+\.[0-9]+)"', source, re.MULTILINE)
|
|
146
|
+
if match is None or manifest != expected or match.group(1) != expected:
|
|
147
|
+
raise SystemExit("Checked-out package version does not match the release target.")
|
|
148
|
+
PY
|
|
149
|
+
|
|
150
|
+
- uses: actions/setup-python@v6
|
|
151
|
+
with:
|
|
152
|
+
python-version: "3.12"
|
|
153
|
+
- name: Build package
|
|
154
|
+
run: |
|
|
155
|
+
python -m pip install --upgrade pip build twine
|
|
156
|
+
python -m build
|
|
157
|
+
python -m twine check dist/*
|
|
158
|
+
- name: Publish to PyPI with trusted publishing
|
|
159
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
160
|
+
with:
|
|
161
|
+
verbose: true
|
|
162
|
+
print-hash: true
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# AGENTS.md — dcc-mcp-PowerPoint Agent Navigation Map
|
|
2
|
+
|
|
3
|
+
> Progressive disclosure: this file is a **map**, not an encyclopedia.
|
|
4
|
+
|
|
5
|
+
## 30-Second Summary
|
|
6
|
+
|
|
7
|
+
`dcc-mcp-PowerPoint` is the **thin PowerPoint adapter** over
|
|
8
|
+
`dcc-mcp-office`. It owns PowerPoint application semantics only: deck
|
|
9
|
+
generation, slide composition, review decks, PowerPoint skill packs and the
|
|
10
|
+
office-host launcher. Shared machinery (protocol, IR envelope, C# COM
|
|
11
|
+
runtime, Open XML worker, jobs, security policy) comes from
|
|
12
|
+
`dcc-mcp-office` + `dcc-mcp-core`.
|
|
13
|
+
|
|
14
|
+
**Current status:** M1 capability live — deck pipeline runs end-to-end
|
|
15
|
+
(Deck IR → Open XML compile → COM render → PDF/previews → validation),
|
|
16
|
+
skill scripts executable via the gateway. The shared C# host remains the
|
|
17
|
+
production COM path (dcc-mcp-office M1).
|
|
18
|
+
|
|
19
|
+
## Repo Map
|
|
20
|
+
|
|
21
|
+
| Path | What it is |
|
|
22
|
+
|---|---|
|
|
23
|
+
| `src/dcc_mcp_powerpoint/` | adapter package |
|
|
24
|
+
| `src/dcc_mcp_powerpoint/deck_ir.py` | Deck IR contract (mirrors dcc-mcp-office-ir) |
|
|
25
|
+
| `src/dcc_mcp_powerpoint/compiler.py` | Open XML compiler: semantic-layout registry → PPTX (layer-tagged) |
|
|
26
|
+
| `src/dcc_mcp_powerpoint/render.py` | COM renderer: `DispatchEx` dedicated instance → PDF + PNGs |
|
|
27
|
+
| `src/dcc_mcp_powerpoint/validate.py` | structural + artifact validation reports |
|
|
28
|
+
| `src/dcc_mcp_powerpoint/layers.py` | opt-in smart layers: `::layer=` name tags, visibility/z-order/recolor/assign |
|
|
29
|
+
| `src/dcc_mcp_powerpoint/edits.py` | opt-in ppt-patch/1.0 engine: text/images/slides/layers, all-or-nothing |
|
|
30
|
+
| `src/dcc_mcp_powerpoint/plugins.py` | stdlib-only plugin registry: discover/validate/run (subprocess contract) |
|
|
31
|
+
| `src/dcc_mcp_powerpoint/sidecar/office_host.py` | launcher: locate/verify/start `office-host.exe --app=powerpoint` |
|
|
32
|
+
| `src/dcc_mcp_powerpoint/skills/powerpoint-deck/` | SKILL.md + tools.yaml + scripts (generate/validate/render) + RECIPES |
|
|
33
|
+
| `src/dcc_mcp_powerpoint/skills/powerpoint-edit/` | slide_tree + edit_deck (depends: powerpoint-deck) |
|
|
34
|
+
| `src/dcc_mcp_powerpoint/skills/powerpoint-layers/` | layer list/visibility/reorder/recolor/assign |
|
|
35
|
+
| `src/dcc_mcp_powerpoint/skills/powerpoint-plugins/` | plugin_list + plugin_run |
|
|
36
|
+
| `src/dcc_mcp_powerpoint/skills/powerpoint-review/` | `review_deck_from_renders` skill |
|
|
37
|
+
| `examples/` | framework-intro Deck IR + generated PPTX/PDF/previews |
|
|
38
|
+
| `tests/` | pytest (COM only via subprocess boundary) |
|
|
39
|
+
| `docs/adr/` | adapter-level decisions |
|
|
40
|
+
|
|
41
|
+
## Upstream Dependencies
|
|
42
|
+
|
|
43
|
+
- `dcc-mcp-core` (pip) — gateway, skills runtime, sidecar lifecycle.
|
|
44
|
+
- `dcc-mcp-office` — Rust crates (`dcc-mcp-office-protocol`,
|
|
45
|
+
`dcc-mcp-office-ir`, `dcc-mcp-office-tools`, `dcc-mcp-office-security`)
|
|
46
|
+
+ the `office-host` C# binaries distributed via
|
|
47
|
+
`dcc-mcp-release-artifacts`.
|
|
48
|
+
- `dcc-mcp-computer-use` — UIA/visual fallback is reused, not rebuilt.
|
|
49
|
+
|
|
50
|
+
## Capabilities owned here (proposal §11.2)
|
|
51
|
+
|
|
52
|
+
- `powerpoint.deck.generate` — requirement → outline → template/layout →
|
|
53
|
+
Deck IR → Open XML compile → COM finalize → previews → validation loop.
|
|
54
|
+
- `powerpoint.slide.compose` — compose one slide from semantic layout +
|
|
55
|
+
content blocks.
|
|
56
|
+
- `powerpoint.slide.render` — render slides to PNG previews.
|
|
57
|
+
- `powerpoint.animation.apply` / `powerpoint.slideshow.control` — later.
|
|
58
|
+
|
|
59
|
+
## Test
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
pip install -e .[dev]
|
|
63
|
+
pytest
|
|
64
|
+
ruff check src tests
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Engineering agreement: [CONTRIBUTING.md](./CONTRIBUTING.md) (plus the shared
|
|
68
|
+
rules in `dcc-mcp-office/CONTRIBUTING.md`).
|
|
69
|
+
|
|
70
|
+
Golden files / visual snapshots for PowerPoint live in
|
|
71
|
+
`dcc-mcp-office/tests/` (shared matrix); this repo adds PowerPoint-specific
|
|
72
|
+
cases as they land.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.2.3](https://github.com/dcc-mcp/dcc-mcp-powerpoint/compare/v0.2.2...v0.2.3) (2026-09-25)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* keep packaging smoke inside workspace ([1167952](https://github.com/dcc-mcp/dcc-mcp-powerpoint/commit/11679521ac1be018ac5a272335d33b5814302014))
|
|
9
|
+
* keep release smoke inside workspace ([64dce7d](https://github.com/dcc-mcp/dcc-mcp-powerpoint/commit/64dce7d4d3e7f0236bf70a0a6843e26f98ab8a88))
|
|
10
|
+
* parse Office host notification frames ([f4bf726](https://github.com/dcc-mcp/dcc-mcp-powerpoint/commit/f4bf7268fbf098a8953ba2b9b73d3254f6a46847))
|
|
11
|
+
* restore PowerPoint adapter registration ([348a902](https://github.com/dcc-mcp/dcc-mcp-powerpoint/commit/348a902a38c683e36a8b63b5a8ae7f002ad79f15))
|
|
12
|
+
* use a materialized Office brand template ([388499c](https://github.com/dcc-mcp/dcc-mcp-powerpoint/commit/388499ccd06c8858f927fdf0191df4070c8c4821))
|
|
13
|
+
|
|
14
|
+
## [0.2.2](https://github.com/dcc-mcp/dcc-mcp-powerpoint/compare/v0.2.1...v0.2.2) (2026-08-17)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* upload only the two standalone artifacts (exe + bundled host), not the whole dist tree ([a946a24](https://github.com/dcc-mcp/dcc-mcp-powerpoint/commit/a946a24f9891b5eb3bc5eb176dc14f68d687ed0d))
|
|
20
|
+
|
|
21
|
+
## [0.2.1](https://github.com/dcc-mcp/dcc-mcp-powerpoint/compare/v0.2.0...v0.2.1) (2026-08-17)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Features
|
|
25
|
+
|
|
26
|
+
* integrate dcc-office-host v0.2.0 capability surface ([#15](https://github.com/dcc-mcp/dcc-mcp-powerpoint/issues/15)) ([c2d06d8](https://github.com/dcc-mcp/dcc-mcp-powerpoint/commit/c2d06d8ec9976f02d05eabfe1751f6a3f1365b45))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Bug Fixes
|
|
30
|
+
|
|
31
|
+
* correct workflow expression syntax (literal backslashes broke the token reference) ([77adc36](https://github.com/dcc-mcp/dcc-mcp-powerpoint/commit/77adc3631e41d079a796ea9ec368c58eda6e2f6d))
|
|
32
|
+
|
|
33
|
+
## [0.2.0] - 2026-08-16
|
|
34
|
+
|
|
35
|
+
First release of the PowerPoint adapter over the dcc-mcp-office core.
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
|
|
39
|
+
- Deck pipeline: IR → Open XML host compile → inspect (deck/slide/shape/notes
|
|
40
|
+
structure), official brand identity, 16-slide showcase deck,
|
|
41
|
+
capability-boundary showcase with patch variants.
|
|
42
|
+
- Smart layers API: list / assign / reorder / recolor / visibility.
|
|
43
|
+
- Deck patch engine: edit-deck operations with failing-operation index
|
|
44
|
+
reporting.
|
|
45
|
+
- Plugin registry with a deck-stats example plugin.
|
|
46
|
+
- Skill packs: powerpoint-deck, powerpoint-edit, powerpoint-layers,
|
|
47
|
+
powerpoint-plugins, powerpoint-review (official lint gate in CI).
|
|
48
|
+
- Standalone distribution via PyOxidizer (dcc-mcp-powerpoint.exe), built
|
|
49
|
+
against the pinned dcc-office-host source.
|
|
50
|
+
|
|
51
|
+
### Changed
|
|
52
|
+
|
|
53
|
+
- Host client drives the office-rpc JSON-RPC surface over stdio.
|
|
54
|
+
- Confined-environment stdio fixes; per-script font slot; self-implemented
|
|
55
|
+
issue analyzer per the dependency policy.
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
|
|
59
|
+
- Skill script contract compliance.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# CONTRIBUTING — dcc-mcp-PowerPoint
|
|
2
|
+
|
|
3
|
+
Thin adapter over `dcc-mcp-office`: PowerPoint semantics only. The shared
|
|
4
|
+
engineering agreement (first principles, contract-first, SOLID, Clean
|
|
5
|
+
Architecture, no code smells) lives in
|
|
6
|
+
`dcc-mcp-office/CONTRIBUTING.md` and applies here unchanged.
|
|
7
|
+
|
|
8
|
+
Python-specific rules:
|
|
9
|
+
|
|
10
|
+
- Typed public API (`from __future__ import annotations`), dataclasses for
|
|
11
|
+
configuration, no mutable defaults.
|
|
12
|
+
- `__init__.py` imports only the public surface — no side effects, no
|
|
13
|
+
COM/process spawning at import time.
|
|
14
|
+
- The launcher never kills a user-started POWERPNT.EXE (proposal §8.3).
|
|
15
|
+
- Contract constants (pipe prefix, app name, protocol version) must match
|
|
16
|
+
`dcc-mcp-office-protocol`; a test pins them (`tests/test_version.py`).
|
|
17
|
+
|
|
18
|
+
## Dependency policy (2026-08-16)
|
|
19
|
+
|
|
20
|
+
- **Python runtime: stdlib only** (zipfile / xml.etree / json / dataclasses /
|
|
21
|
+
subprocess / ctypes). No python-pptx, no Pillow, no pywin32 at runtime.
|
|
22
|
+
- Heavy interfaces live in **our own C# host** (`dcc-mcp-office`): the Open
|
|
23
|
+
XML worker and the COM renderer. Python talks to it over the office-rpc
|
|
24
|
+
contract (subprocess stdin/stdout JSON-RPC first, named pipe per proposal
|
|
25
|
+
§12 later).
|
|
26
|
+
- python-pptx / Pillow / pywin32 are **dev/test-only** (test oracle,
|
|
27
|
+
fixtures, experiments) — package modules never import them at runtime;
|
|
28
|
+
current exceptions (analyze/inventory readers) migrate to the C# host.
|
|
29
|
+
- The C# host adds **no non-Microsoft NuGet dependencies**: OOXML via
|
|
30
|
+
in-box System.IO.Packaging + LINQ to XML (net8.0-windows), COM via BCL
|
|
31
|
+
interop.
|
|
32
|
+
- Third-party assets (templates, fonts, showcase imagery) enter the repo
|
|
33
|
+
only after license verification and self-hosting — never fetched from
|
|
34
|
+
external sources at build or runtime.
|
|
35
|
+
|
|
36
|
+
Gates:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
ruff check src tests
|
|
40
|
+
pytest
|
|
41
|
+
python -m py_compile src/dcc_mcp_powerpoint
|
|
42
|
+
dcc-mcp-cli lint src/dcc_mcp_powerpoint/skills --warnings-as-errors --non-interactive
|
|
43
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Hal
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: dcc-mcp-powerpoint
|
|
3
|
+
Version: 0.2.3
|
|
4
|
+
Summary: PowerPoint adapter for the DCC-MCP ecosystem — deck generation, slide composition and review decks over the dcc-mcp-office runtime
|
|
5
|
+
Project-URL: Homepage, https://github.com/dcc-mcp/dcc-mcp-PowerPoint
|
|
6
|
+
Author-email: Long Hao <hal.long@outlook.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Keywords: ai,dcc,llm,mcp,model-context-protocol,office,powerpoint
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Topic :: Multimedia :: Graphics :: Presentation
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Requires-Python: >=3.9
|
|
21
|
+
Requires-Dist: dcc-mcp-core<1.0.0,>=0.18.2
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: build; extra == 'dev'
|
|
24
|
+
Requires-Dist: hatchling; extra == 'dev'
|
|
25
|
+
Requires-Dist: pillow>=10.0; extra == 'dev'
|
|
26
|
+
Requires-Dist: pytest-cov>=4.0; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
28
|
+
Requires-Dist: python-pptx>=1.0; extra == 'dev'
|
|
29
|
+
Requires-Dist: pywin32>=306; (sys_platform == 'win32') and extra == 'dev'
|
|
30
|
+
Requires-Dist: ruff>=0.8.0; extra == 'dev'
|
|
31
|
+
Provides-Extra: sidecar
|
|
32
|
+
Requires-Dist: dcc-mcp-server>=0.17.43; extra == 'sidecar'
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
34
|
+
|
|
35
|
+
# dcc-mcp-PowerPoint
|
|
36
|
+
|
|
37
|
+
PowerPoint adapter for the DCC-MCP ecosystem — the **application layer** over
|
|
38
|
+
[dcc-mcp-office](https://github.com/dcc-mcp/dcc-mcp-office): deck generation
|
|
39
|
+
from structured content, slide composition, review decks from DCC renders,
|
|
40
|
+
batch PDF conversion and text replacement (via the shared core), previews and
|
|
41
|
+
visual validation.
|
|
42
|
+
|
|
43
|
+
**Status:** M1 + M2 authoring live. The designed pipeline runs end-to-end:
|
|
44
|
+
Deck IR (`office-ir/1.0`) → Open XML compile (python-pptx) → desktop COM
|
|
45
|
+
render (PowerPoint `DispatchEx`, dedicated instance) → PDF + per-slide PNG
|
|
46
|
+
previews → structural validation. On top of generation, M2 adds structured
|
|
47
|
+
deck modification (ppt-patch/1.0), smart semantic layers and a plugin
|
|
48
|
+
registry — see the skill packs below. Skill scripts are executable through
|
|
49
|
+
the dcc-mcp gateway (`DCC_MCP_POWERPOINT_SKILL_PATHS`). The shared C# host
|
|
50
|
+
in `dcc-mcp-office` remains the production COM path (M1 there).
|
|
51
|
+
|
|
52
|
+
## Design (two-layer sidecar)
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
Agent → dcc-mcp-gateway (Rust, dcc-mcp-core)
|
|
56
|
+
→ dcc-mcp-server sidecar (lifecycle: RFC #998)
|
|
57
|
+
→ office-host.exe --app=powerpoint (C#, dcc-mcp-office)
|
|
58
|
+
→ POWERPNT.EXE (COM, interactive user session)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
- Gateway + sidecar lifecycle: existing `dcc-mcp-core` machinery.
|
|
62
|
+
- `office-host`: shared C# runtime from `dcc-mcp-office`
|
|
63
|
+
(download/verify/launch via `dcc-mcp-release-artifacts`).
|
|
64
|
+
- This repo owns: PowerPoint IR semantics, `powerpoint.deck.generate` /
|
|
65
|
+
`powerpoint.slide.compose` / `powerpoint.slide.render`, template
|
|
66
|
+
registry entries, and the PowerPoint skill packs.
|
|
67
|
+
|
|
68
|
+
## Skill packs
|
|
69
|
+
|
|
70
|
+
- `powerpoint-deck` — generate an editable deck from structured content
|
|
71
|
+
(template → semantic layouts → IR → Open XML → COM finalize → previews →
|
|
72
|
+
validation loop; proposal §15.3/§15.4). Generated decks are tagged with
|
|
73
|
+
six semantic layers (background/decoration/header/content/accent/footer).
|
|
74
|
+
- `powerpoint-edit` — modify existing decks with a structured patch
|
|
75
|
+
document (ppt-patch/1.0): text, notes, pictures, fills/lines, visibility,
|
|
76
|
+
shape deletion, slide add/delete/move (new slides compile from Deck IR
|
|
77
|
+
layouts) and layer assignment. All-or-nothing saves.
|
|
78
|
+
- `powerpoint-layers` — smart semantic layers over shapes (native
|
|
79
|
+
`::layer=<name>` name tags): list, show/hide, restack z-order
|
|
80
|
+
(front/back/above/below) and recolor per layer.
|
|
81
|
+
- `powerpoint-plugins` — discover and invoke user-installed plugins
|
|
82
|
+
(plugin.json manifest + stdin-JSON script contract, subprocess isolation,
|
|
83
|
+
timeout caps).
|
|
84
|
+
- `powerpoint-review` — `dcc.review-deck-from-renders`: build review decks
|
|
85
|
+
from Maya/Houdini/Blender/Unreal renders + shot/asset metadata
|
|
86
|
+
(proposal §15.7).
|
|
87
|
+
|
|
88
|
+
## Capability-boundary showcase
|
|
89
|
+
|
|
90
|
+
`examples/capability_boundary_showcase.json` is a 17-slide deck that walks
|
|
91
|
+
every semantic layout and the M2 capability surfaces: generation (IR → Open
|
|
92
|
+
XML → COM render → validation), smart layers (list / visibility / recolor /
|
|
93
|
+
reorder / assign), the patch engine (7-operation ppt-patch/1.0 with
|
|
94
|
+
all-or-nothing saves) and the plugin registry (deck-stats demo plugin in
|
|
95
|
+
`examples/plugins/`). See
|
|
96
|
+
`examples/output/capability-boundary/README.md` for the full runbook and
|
|
97
|
+
artifact map.
|
|
98
|
+
|
|
99
|
+
## Agent usage (via dcc-mcp-cli / gateway)
|
|
100
|
+
|
|
101
|
+
1. Start the registered adapter (the launcher binds the bundled skill packs
|
|
102
|
+
and script runtime to the official `dcc-mcp-server`):
|
|
103
|
+
`dcc-mcp-powerpoint serve`
|
|
104
|
+
2. Run a skill script directly (gateway `execute_script` contract —
|
|
105
|
+
stdin JSON or CLI flags):
|
|
106
|
+
```bash
|
|
107
|
+
python src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/generate_deck.py \
|
|
108
|
+
--input examples/dcc_mcp_framework_intro.json --out out
|
|
109
|
+
```
|
|
110
|
+
3. Validate the packs with the official linter:
|
|
111
|
+
```bash
|
|
112
|
+
dcc-mcp-cli lint src/dcc_mcp_powerpoint/skills --warnings-as-errors --non-interactive
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Development
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
pip install -e .[dev,sidecar]
|
|
119
|
+
pytest
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## License
|
|
123
|
+
|
|
124
|
+
MIT
|