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.
Files changed (213) hide show
  1. dcc_mcp_powerpoint-0.2.3/.github/workflows/ci.yml +30 -0
  2. dcc_mcp_powerpoint-0.2.3/.github/workflows/packaging.yml +64 -0
  3. dcc_mcp_powerpoint-0.2.3/.github/workflows/release.yml +162 -0
  4. dcc_mcp_powerpoint-0.2.3/.gitignore +16 -0
  5. dcc_mcp_powerpoint-0.2.3/.release-please-manifest.json +3 -0
  6. dcc_mcp_powerpoint-0.2.3/AGENTS.md +72 -0
  7. dcc_mcp_powerpoint-0.2.3/CHANGELOG.md +59 -0
  8. dcc_mcp_powerpoint-0.2.3/CONTRIBUTING.md +43 -0
  9. dcc_mcp_powerpoint-0.2.3/LICENSE +21 -0
  10. dcc_mcp_powerpoint-0.2.3/PKG-INFO +124 -0
  11. dcc_mcp_powerpoint-0.2.3/README.md +90 -0
  12. dcc_mcp_powerpoint-0.2.3/README_zh.md +32 -0
  13. dcc_mcp_powerpoint-0.2.3/docs/README.md +5 -0
  14. dcc_mcp_powerpoint-0.2.3/docs/adr/001-thin-adapter-over-office-core.md +27 -0
  15. dcc_mcp_powerpoint-0.2.3/docs/adr/002-skill-packs-live-in-repo.md +26 -0
  16. dcc_mcp_powerpoint-0.2.3/docs/adr/003-standalone-distribution.md +38 -0
  17. dcc_mcp_powerpoint-0.2.3/docs/adr/README.md +7 -0
  18. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/blender.png +0 -0
  19. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/cinema4d.png +0 -0
  20. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/houdini.png +0 -0
  21. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/katana.png +0 -0
  22. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/marmoset.png +0 -0
  23. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/max3ds.png +0 -0
  24. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/maya.png +0 -0
  25. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/nuke.png +0 -0
  26. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/photoshop.png +0 -0
  27. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/substance.png +0 -0
  28. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/unity.png +0 -0
  29. dcc_mcp_powerpoint-0.2.3/examples/assets/logos/unreal.png +0 -0
  30. dcc_mcp_powerpoint-0.2.3/examples/assets/showcase/blender-lookdev.png +0 -0
  31. dcc_mcp_powerpoint-0.2.3/examples/assets/showcase/hunyuan3d.png +0 -0
  32. dcc_mcp_powerpoint-0.2.3/examples/assets/showcase/marmoset-pbr-lookdev.png +0 -0
  33. dcc_mcp_powerpoint-0.2.3/examples/assets/showcase/zbrush-dragon.png +0 -0
  34. dcc_mcp_powerpoint-0.2.3/examples/capability_boundary_showcase.json +343 -0
  35. dcc_mcp_powerpoint-0.2.3/examples/dcc_mcp_framework_intro.json +265 -0
  36. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/README.md +65 -0
  37. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/draft-capability-boundary-showcase.pdf +0 -0
  38. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/draft-capability-boundary-showcase.pptx +0 -0
  39. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/patches/showcase-v2.patch.json +72 -0
  40. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-01.png +0 -0
  41. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-02.png +0 -0
  42. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-03.png +0 -0
  43. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-04.png +0 -0
  44. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-05.png +0 -0
  45. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-06.png +0 -0
  46. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-07.png +0 -0
  47. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-08.png +0 -0
  48. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-09.png +0 -0
  49. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-10.png +0 -0
  50. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-11.png +0 -0
  51. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-12.png +0 -0
  52. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-13.png +0 -0
  53. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-14.png +0 -0
  54. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-15.png +0 -0
  55. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-16.png +0 -0
  56. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/previews/slide-17.png +0 -0
  57. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/assigned-callout.pptx +0 -0
  58. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/footer-front.pptx +0 -0
  59. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/green-accent.pdf +0 -0
  60. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-01.png +0 -0
  61. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-02.png +0 -0
  62. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-03.png +0 -0
  63. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-04.png +0 -0
  64. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-05.png +0 -0
  65. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-06.png +0 -0
  66. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-07.png +0 -0
  67. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-08.png +0 -0
  68. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-09.png +0 -0
  69. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-10.png +0 -0
  70. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-11.png +0 -0
  71. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-12.png +0 -0
  72. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-13.png +0 -0
  73. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-14.png +0 -0
  74. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-15.png +0 -0
  75. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-16.png +0 -0
  76. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent/previews/slide-17.png +0 -0
  77. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/green-accent.pptx +0 -0
  78. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/host-compiled.pptx +0 -0
  79. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/no-decoration.pdf +0 -0
  80. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-01.png +0 -0
  81. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-02.png +0 -0
  82. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-03.png +0 -0
  83. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-04.png +0 -0
  84. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-05.png +0 -0
  85. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-06.png +0 -0
  86. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-07.png +0 -0
  87. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-08.png +0 -0
  88. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-09.png +0 -0
  89. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-10.png +0 -0
  90. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-11.png +0 -0
  91. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-12.png +0 -0
  92. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-13.png +0 -0
  93. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-14.png +0 -0
  94. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-15.png +0 -0
  95. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-16.png +0 -0
  96. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration/previews/slide-17.png +0 -0
  97. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/no-decoration.pptx +0 -0
  98. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/patched-v2.pdf +0 -0
  99. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-01.png +0 -0
  100. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-02.png +0 -0
  101. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-03.png +0 -0
  102. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-04.png +0 -0
  103. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-05.png +0 -0
  104. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-06.png +0 -0
  105. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-07.png +0 -0
  106. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-08.png +0 -0
  107. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-09.png +0 -0
  108. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-10.png +0 -0
  109. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-11.png +0 -0
  110. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-12.png +0 -0
  111. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-13.png +0 -0
  112. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-14.png +0 -0
  113. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-15.png +0 -0
  114. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-16.png +0 -0
  115. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-17.png +0 -0
  116. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2/previews/slide-18.png +0 -0
  117. dcc_mcp_powerpoint-0.2.3/examples/output/capability-boundary/variants/patched-v2.pptx +0 -0
  118. dcc_mcp_powerpoint-0.2.3/examples/output/draft-dcc-mcp-framework-intro.pdf +0 -0
  119. dcc_mcp_powerpoint-0.2.3/examples/output/draft-dcc-mcp-framework-intro.pptx +0 -0
  120. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-01.png +0 -0
  121. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-02.png +0 -0
  122. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-03.png +0 -0
  123. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-04.png +0 -0
  124. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-05.png +0 -0
  125. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-06.png +0 -0
  126. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-07.png +0 -0
  127. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-08.png +0 -0
  128. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-09.png +0 -0
  129. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-10.png +0 -0
  130. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-11.png +0 -0
  131. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-12.png +0 -0
  132. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-13.png +0 -0
  133. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-14.png +0 -0
  134. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-15.png +0 -0
  135. dcc_mcp_powerpoint-0.2.3/examples/output/previews/slide-16.png +0 -0
  136. dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/draft-review-dcc-mcp-framework.pdf +0 -0
  137. dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/draft-review-dcc-mcp-framework.pptx +0 -0
  138. dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/previews/slide-01.png +0 -0
  139. dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/previews/slide-02.png +0 -0
  140. dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/previews/slide-03.png +0 -0
  141. dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/previews/slide-04.png +0 -0
  142. dcc_mcp_powerpoint-0.2.3/examples/output/review-demo/previews/slide-05.png +0 -0
  143. dcc_mcp_powerpoint-0.2.3/examples/plugins/deck-stats/deck_stats.py +52 -0
  144. dcc_mcp_powerpoint-0.2.3/examples/plugins/deck-stats/plugin.json +20 -0
  145. dcc_mcp_powerpoint-0.2.3/examples/shots_manifest.demo.json +22 -0
  146. dcc_mcp_powerpoint-0.2.3/examples/shots_manifest.example.json +22 -0
  147. dcc_mcp_powerpoint-0.2.3/install.md +74 -0
  148. dcc_mcp_powerpoint-0.2.3/pyoxidizer.bzl +56 -0
  149. dcc_mcp_powerpoint-0.2.3/pyproject.toml +57 -0
  150. dcc_mcp_powerpoint-0.2.3/release-please-config.json +15 -0
  151. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/__init__.py +40 -0
  152. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/_standalone_entry.py +119 -0
  153. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/analyze.py +279 -0
  154. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/brand/__init__.py +30 -0
  155. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/brand/assets/dcc-mcp-logo-dark.png +0 -0
  156. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/brand/assets/dcc-mcp-logo-light.png +0 -0
  157. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/compiler.py +425 -0
  158. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/deck_ir.py +254 -0
  159. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/edits.py +377 -0
  160. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/host_client.py +216 -0
  161. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/layers.py +386 -0
  162. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/plugins.py +252 -0
  163. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/render.py +114 -0
  164. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/server_launcher.py +87 -0
  165. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/sidecar/__init__.py +5 -0
  166. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/sidecar/office_host.py +76 -0
  167. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/SKILL.md +101 -0
  168. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/learnings.md +93 -0
  169. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/references/RECIPES.md +150 -0
  170. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/analyze_deck.py +49 -0
  171. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/generate_deck.py +105 -0
  172. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/inventory_deck.py +83 -0
  173. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/render_deck.py +54 -0
  174. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/scripts/validate_deck.py +55 -0
  175. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-deck/tools.yaml +141 -0
  176. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-edit/SKILL.md +114 -0
  177. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-edit/metadata/depends.md +3 -0
  178. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-edit/scripts/edit_deck.py +76 -0
  179. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-edit/scripts/slide_tree.py +72 -0
  180. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-edit/tools.yaml +59 -0
  181. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/SKILL.md +79 -0
  182. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/scripts/layer_assign.py +103 -0
  183. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/scripts/layer_list.py +91 -0
  184. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/scripts/layer_recolor.py +98 -0
  185. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/scripts/layer_reorder.py +96 -0
  186. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/scripts/layer_set_visibility.py +96 -0
  187. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-layers/tools.yaml +190 -0
  188. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-plugins/SKILL.md +89 -0
  189. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-plugins/scripts/plugin_list.py +55 -0
  190. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-plugins/scripts/plugin_run.py +86 -0
  191. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-plugins/tools.yaml +58 -0
  192. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-review/SKILL.md +52 -0
  193. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-review/scripts/review_deck_from_renders.py +148 -0
  194. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/skills/powerpoint-review/tools.yaml +31 -0
  195. dcc_mcp_powerpoint-0.2.3/src/dcc_mcp_powerpoint/validate.py +60 -0
  196. dcc_mcp_powerpoint-0.2.3/tests/README.md +5 -0
  197. dcc_mcp_powerpoint-0.2.3/tests/__init__.py +0 -0
  198. dcc_mcp_powerpoint-0.2.3/tests/_tmphelper.py +27 -0
  199. dcc_mcp_powerpoint-0.2.3/tests/conftest.py +10 -0
  200. dcc_mcp_powerpoint-0.2.3/tests/test_analyze.py +89 -0
  201. dcc_mcp_powerpoint-0.2.3/tests/test_compiler.py +195 -0
  202. dcc_mcp_powerpoint-0.2.3/tests/test_deck_ir.py +82 -0
  203. dcc_mcp_powerpoint-0.2.3/tests/test_edits.py +194 -0
  204. dcc_mcp_powerpoint-0.2.3/tests/test_host_client.py +197 -0
  205. dcc_mcp_powerpoint-0.2.3/tests/test_layers.py +193 -0
  206. dcc_mcp_powerpoint-0.2.3/tests/test_new_skill_scripts.py +176 -0
  207. dcc_mcp_powerpoint-0.2.3/tests/test_plugins.py +186 -0
  208. dcc_mcp_powerpoint-0.2.3/tests/test_runtime_purity.py +36 -0
  209. dcc_mcp_powerpoint-0.2.3/tests/test_server_launcher.py +61 -0
  210. dcc_mcp_powerpoint-0.2.3/tests/test_skill_scripts.py +144 -0
  211. dcc_mcp_powerpoint-0.2.3/tests/test_validate.py +28 -0
  212. dcc_mcp_powerpoint-0.2.3/tests/test_version.py +45 -0
  213. 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,16 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .pytest_cache/
4
+ .ruff_cache/
5
+ .test-tmp/
6
+ .tmp*/
7
+ pytest_out.txt
8
+ .venv/
9
+ dist/
10
+ build/
11
+ vendor/
12
+ *.egg-info/
13
+ .coverage
14
+ htmlcov/
15
+ .idea/
16
+ .vscode/
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.2.3"
3
+ }
@@ -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