hive-skills 0.1.0

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 (238) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +235 -0
  3. package/assets/LICENSE +32 -0
  4. package/assets/THIRD_PARTY_NOTICES.md +72 -0
  5. package/assets/manifest.json +1290 -0
  6. package/assets/skills/authored/code-review/composable/BUNDLE.md +192 -0
  7. package/assets/skills/authored/code-review/composable/INDEX.md +13 -0
  8. package/assets/skills/authored/code-review/composable/VERSION +1 -0
  9. package/assets/skills/authored/code-review/composable/mini/01-review-method.md +34 -0
  10. package/assets/skills/authored/code-review/composable/mini/02-security-review.md +20 -0
  11. package/assets/skills/authored/code-review/composable/mini/03-correctness-bugs.md +19 -0
  12. package/assets/skills/authored/code-review/composable/mini/04-concurrency.md +16 -0
  13. package/assets/skills/authored/code-review/composable/mini/05-error-handling.md +12 -0
  14. package/assets/skills/authored/code-review/composable/mini/06-performance.md +11 -0
  15. package/assets/skills/authored/code-review/composable/mini/07-api-design.md +20 -0
  16. package/assets/skills/authored/code-review/composable/mini/08-missing-tests.md +25 -0
  17. package/assets/skills/authored/code-review/composable/mini/09-refactoring-and-communication.md +32 -0
  18. package/assets/skills/authored/data-analysis/composable/BUNDLE.md +186 -0
  19. package/assets/skills/authored/data-analysis/composable/INDEX.md +13 -0
  20. package/assets/skills/authored/data-analysis/composable/VERSION +1 -0
  21. package/assets/skills/authored/data-analysis/composable/mini/01-data-quality-profiling.md +26 -0
  22. package/assets/skills/authored/data-analysis/composable/mini/02-aggregation-pitfalls.md +21 -0
  23. package/assets/skills/authored/data-analysis/composable/mini/03-time-series.md +19 -0
  24. package/assets/skills/authored/data-analysis/composable/mini/04-segmentation.md +23 -0
  25. package/assets/skills/authored/data-analysis/composable/mini/05-discount-pricing.md +17 -0
  26. package/assets/skills/authored/data-analysis/composable/mini/06-insight-generation.md +25 -0
  27. package/assets/skills/authored/data-analysis/composable/mini/07-executive-writing.md +26 -0
  28. package/assets/skills/authored/data-analysis/composable/mini/08-recommendations.md +20 -0
  29. package/assets/skills/authored/data-analysis/composable/mini/09-reproducibility-assumptions.md +20 -0
  30. package/assets/skills/authored/financial-analysis/composable/BUNDLE.md +1293 -0
  31. package/assets/skills/authored/financial-analysis/composable/INDEX.md +17 -0
  32. package/assets/skills/authored/financial-analysis/composable/VERSION +1 -0
  33. package/assets/skills/authored/financial-analysis/composable/mini/00-core.md +69 -0
  34. package/assets/skills/authored/financial-analysis/composable/mini/01-profitability-efficiency-ratios.md +173 -0
  35. package/assets/skills/authored/financial-analysis/composable/mini/02-liquidity-leverage-ratios.md +120 -0
  36. package/assets/skills/authored/financial-analysis/composable/mini/03-valuation-ratios-interpretation.md +107 -0
  37. package/assets/skills/authored/financial-analysis/composable/mini/04-dcf-projection-wacc.md +122 -0
  38. package/assets/skills/authored/financial-analysis/composable/mini/05-dcf-terminal-value-sensitivity.md +75 -0
  39. package/assets/skills/authored/financial-analysis/composable/mini/06-comparables-precedents.md +78 -0
  40. package/assets/skills/authored/financial-analysis/composable/mini/07-budget-variance-analysis.md +47 -0
  41. package/assets/skills/authored/financial-analysis/composable/mini/08-driver-based-forecasting-scenarios.md +111 -0
  42. package/assets/skills/authored/financial-analysis/composable/mini/09-rolling-forecasts-accuracy.md +114 -0
  43. package/assets/skills/authored/financial-analysis/composable/mini/10-reporting-exec-summary.md +58 -0
  44. package/assets/skills/authored/financial-analysis/composable/mini/11-industry-adaptations.md +130 -0
  45. package/assets/skills/authored/financial-analysis/composable/mini/12-toolkit-scripts-io.md +102 -0
  46. package/assets/skills/authored/python-api/composable/BUNDLE.md +389 -0
  47. package/assets/skills/authored/python-api/composable/INDEX.md +13 -0
  48. package/assets/skills/authored/python-api/composable/VERSION +1 -0
  49. package/assets/skills/authored/python-api/composable/mini/01-project-structure.md +44 -0
  50. package/assets/skills/authored/python-api/composable/mini/02-routing-and-app.md +38 -0
  51. package/assets/skills/authored/python-api/composable/mini/03-pydantic-models.md +45 -0
  52. package/assets/skills/authored/python-api/composable/mini/04-validation-and-errors.md +59 -0
  53. package/assets/skills/authored/python-api/composable/mini/05-dependencies-and-auth.md +60 -0
  54. package/assets/skills/authored/python-api/composable/mini/06-pagination-filtering.md +44 -0
  55. package/assets/skills/authored/python-api/composable/mini/07-async-performance.md +30 -0
  56. package/assets/skills/authored/python-api/composable/mini/08-testing.md +45 -0
  57. package/assets/skills/authored/python-api/composable/mini/09-middleware-observability.md +29 -0
  58. package/assets/skills/authored/tech-writing/composable/BUNDLE.md +220 -0
  59. package/assets/skills/authored/tech-writing/composable/INDEX.md +12 -0
  60. package/assets/skills/authored/tech-writing/composable/VERSION +1 -0
  61. package/assets/skills/authored/tech-writing/composable/mini/01-audience-analysis.md +26 -0
  62. package/assets/skills/authored/tech-writing/composable/mini/02-document-types.md +27 -0
  63. package/assets/skills/authored/tech-writing/composable/mini/03-readme-quickstart-changelog.md +22 -0
  64. package/assets/skills/authored/tech-writing/composable/mini/04-information-architecture.md +21 -0
  65. package/assets/skills/authored/tech-writing/composable/mini/05-style-clarity.md +29 -0
  66. package/assets/skills/authored/tech-writing/composable/mini/06-breaking-changes-migrations.md +33 -0
  67. package/assets/skills/authored/tech-writing/composable/mini/07-troubleshooting-security.md +30 -0
  68. package/assets/skills/authored/tech-writing/composable/mini/08-faq-voice-tone.md +32 -0
  69. package/assets/skills/converted/claude-api/composable/BUNDLE.md +14996 -0
  70. package/assets/skills/converted/claude-api/composable/INDEX.md +98 -0
  71. package/assets/skills/converted/claude-api/composable/VERSION +1 -0
  72. package/assets/skills/converted/claude-api/composable/mini/00-core.md +235 -0
  73. package/assets/skills/converted/claude-api/composable/mini/01-model-api-quick-reference.md +258 -0
  74. package/assets/skills/converted/claude-api/composable/mini/02-common-pitfalls.md +42 -0
  75. package/assets/skills/converted/claude-api/composable/mini/10-models.md +135 -0
  76. package/assets/skills/converted/claude-api/composable/mini/11-platform-availability.md +96 -0
  77. package/assets/skills/converted/claude-api/composable/mini/12-claude-platform-on-aws.md +59 -0
  78. package/assets/skills/converted/claude-api/composable/mini/13-live-sources.md +143 -0
  79. package/assets/skills/converted/claude-api/composable/mini/14-error-codes.md +256 -0
  80. package/assets/skills/converted/claude-api/composable/mini/15-prompt-caching.md +223 -0
  81. package/assets/skills/converted/claude-api/composable/mini/16-token-counting.md +56 -0
  82. package/assets/skills/converted/claude-api/composable/mini/17-tool-use-concepts.md +444 -0
  83. package/assets/skills/converted/claude-api/composable/mini/18-agent-design.md +101 -0
  84. package/assets/skills/converted/claude-api/composable/mini/19-anthropic-cli.md +246 -0
  85. package/assets/skills/converted/claude-api/composable/mini/20-model-migration.md +1301 -0
  86. package/assets/skills/converted/claude-api/composable/mini/30-managed-agents-overview.md +71 -0
  87. package/assets/skills/converted/claude-api/composable/mini/31-managed-agents-core.md +278 -0
  88. package/assets/skills/converted/claude-api/composable/mini/32-managed-agents-environments.md +219 -0
  89. package/assets/skills/converted/claude-api/composable/mini/33-managed-agents-tools.md +366 -0
  90. package/assets/skills/converted/claude-api/composable/mini/34-managed-agents-events.md +252 -0
  91. package/assets/skills/converted/claude-api/composable/mini/35-managed-agents-outcomes.md +106 -0
  92. package/assets/skills/converted/claude-api/composable/mini/36-managed-agents-multiagent.md +101 -0
  93. package/assets/skills/converted/claude-api/composable/mini/37-managed-agents-webhooks.md +123 -0
  94. package/assets/skills/converted/claude-api/composable/mini/38-managed-agents-memory.md +197 -0
  95. package/assets/skills/converted/claude-api/composable/mini/39-managed-agents-scheduled-deployments.md +146 -0
  96. package/assets/skills/converted/claude-api/composable/mini/40-managed-agents-client-patterns.md +211 -0
  97. package/assets/skills/converted/claude-api/composable/mini/41-managed-agents-onboarding.md +82 -0
  98. package/assets/skills/converted/claude-api/composable/mini/42-managed-agents-api-reference.md +441 -0
  99. package/assets/skills/converted/claude-api/composable/mini/43-managed-agents-self-hosted-sandboxes.md +174 -0
  100. package/assets/skills/converted/claude-api/composable/mini/50-python-readme.md +564 -0
  101. package/assets/skills/converted/claude-api/composable/mini/51-python-tool-use.md +590 -0
  102. package/assets/skills/converted/claude-api/composable/mini/52-python-streaming-batches-files.md +549 -0
  103. package/assets/skills/converted/claude-api/composable/mini/53-python-managed-agents.md +335 -0
  104. package/assets/skills/converted/claude-api/composable/mini/55-typescript-readme.md +404 -0
  105. package/assets/skills/converted/claude-api/composable/mini/56-typescript-tool-use.md +548 -0
  106. package/assets/skills/converted/claude-api/composable/mini/57-typescript-streaming-batches-files.md +384 -0
  107. package/assets/skills/converted/claude-api/composable/mini/58-typescript-managed-agents.md +358 -0
  108. package/assets/skills/converted/claude-api/composable/mini/60-csharp-readme.md +361 -0
  109. package/assets/skills/converted/claude-api/composable/mini/61-csharp-tool-use.md +163 -0
  110. package/assets/skills/converted/claude-api/composable/mini/62-csharp-streaming-batches-files.md +64 -0
  111. package/assets/skills/converted/claude-api/composable/mini/65-go-readme.md +185 -0
  112. package/assets/skills/converted/claude-api/composable/mini/66-go-tool-use.md +219 -0
  113. package/assets/skills/converted/claude-api/composable/mini/67-go-streaming-files.md +63 -0
  114. package/assets/skills/converted/claude-api/composable/mini/68-go-managed-agents.md +564 -0
  115. package/assets/skills/converted/claude-api/composable/mini/70-java-readme.md +237 -0
  116. package/assets/skills/converted/claude-api/composable/mini/71-java-tool-use.md +227 -0
  117. package/assets/skills/converted/claude-api/composable/mini/72-java-streaming-files.md +49 -0
  118. package/assets/skills/converted/claude-api/composable/mini/73-java-managed-agents.md +443 -0
  119. package/assets/skills/converted/claude-api/composable/mini/75-php-readme.md +173 -0
  120. package/assets/skills/converted/claude-api/composable/mini/76-php-tool-use.md +252 -0
  121. package/assets/skills/converted/claude-api/composable/mini/77-php-streaming-batches-files.md +53 -0
  122. package/assets/skills/converted/claude-api/composable/mini/78-php-managed-agents.md +443 -0
  123. package/assets/skills/converted/claude-api/composable/mini/80-ruby-readme.md +133 -0
  124. package/assets/skills/converted/claude-api/composable/mini/81-ruby-tool-use-streaming.md +56 -0
  125. package/assets/skills/converted/claude-api/composable/mini/82-ruby-managed-agents.md +394 -0
  126. package/assets/skills/converted/claude-api/composable/mini/85-curl-examples.md +255 -0
  127. package/assets/skills/converted/claude-api/composable/mini/86-curl-managed-agents.md +340 -0
  128. package/assets/skills/converted/claude-api/composable/presets/csharp.md +1151 -0
  129. package/assets/skills/converted/claude-api/composable/presets/curl.md +1154 -0
  130. package/assets/skills/converted/claude-api/composable/presets/go.md +1598 -0
  131. package/assets/skills/converted/claude-api/composable/presets/java.md +1523 -0
  132. package/assets/skills/converted/claude-api/composable/presets/php.md +1488 -0
  133. package/assets/skills/converted/claude-api/composable/presets/python.md +2605 -0
  134. package/assets/skills/converted/claude-api/composable/presets/ruby.md +1146 -0
  135. package/assets/skills/converted/claude-api/composable/presets/shared.md +6478 -0
  136. package/assets/skills/converted/claude-api/composable/presets/typescript.md +2261 -0
  137. package/assets/skills/converted/docx/composable/BUNDLE.md +617 -0
  138. package/assets/skills/converted/docx/composable/INDEX.md +12 -0
  139. package/assets/skills/converted/docx/composable/VERSION +1 -0
  140. package/assets/skills/converted/docx/composable/mini/00-core.md +26 -0
  141. package/assets/skills/converted/docx/composable/mini/01-reading-converting.md +36 -0
  142. package/assets/skills/converted/docx/composable/mini/02-creating-setup-layout.md +85 -0
  143. package/assets/skills/converted/docx/composable/mini/03-creating-elements.md +257 -0
  144. package/assets/skills/converted/docx/composable/mini/04-editing-existing.md +57 -0
  145. package/assets/skills/converted/docx/composable/mini/05-xml-reference.md +128 -0
  146. package/assets/skills/converted/internal-comms/composable/BUNDLE.md +220 -0
  147. package/assets/skills/converted/internal-comms/composable/INDEX.md +11 -0
  148. package/assets/skills/converted/internal-comms/composable/VERSION +1 -0
  149. package/assets/skills/converted/internal-comms/composable/mini/00-core.md +30 -0
  150. package/assets/skills/converted/internal-comms/composable/mini/01-3p-updates.md +49 -0
  151. package/assets/skills/converted/internal-comms/composable/mini/02-company-newsletter.md +67 -0
  152. package/assets/skills/converted/internal-comms/composable/mini/03-faq-answers.md +32 -0
  153. package/assets/skills/converted/internal-comms/composable/mini/04-general-comms.md +18 -0
  154. package/assets/skills/converted/mcp-builder/composable/BUNDLE.md +2460 -0
  155. package/assets/skills/converted/mcp-builder/composable/INDEX.md +23 -0
  156. package/assets/skills/converted/mcp-builder/composable/VERSION +1 -0
  157. package/assets/skills/converted/mcp-builder/composable/mini/00-core.md +43 -0
  158. package/assets/skills/converted/mcp-builder/composable/mini/01-workflow-research-planning.md +54 -0
  159. package/assets/skills/converted/mcp-builder/composable/mini/02-implementation-process.md +78 -0
  160. package/assets/skills/converted/mcp-builder/composable/mini/03-naming-conventions.md +33 -0
  161. package/assets/skills/converted/mcp-builder/composable/mini/04-response-formats.md +21 -0
  162. package/assets/skills/converted/mcp-builder/composable/mini/05-pagination.md +24 -0
  163. package/assets/skills/converted/mcp-builder/composable/mini/06-transport.md +47 -0
  164. package/assets/skills/converted/mcp-builder/composable/mini/07-annotations.md +20 -0
  165. package/assets/skills/converted/mcp-builder/composable/mini/08-security.md +35 -0
  166. package/assets/skills/converted/mcp-builder/composable/mini/09-error-handling.md +32 -0
  167. package/assets/skills/converted/mcp-builder/composable/mini/10-testing-and-documentation.md +21 -0
  168. package/assets/skills/converted/mcp-builder/composable/mini/11-python-implementation.md +432 -0
  169. package/assets/skills/converted/mcp-builder/composable/mini/12-python-advanced-and-checklist.md +233 -0
  170. package/assets/skills/converted/mcp-builder/composable/mini/13-node-implementation.md +717 -0
  171. package/assets/skills/converted/mcp-builder/composable/mini/14-node-advanced-and-checklist.md +200 -0
  172. package/assets/skills/converted/mcp-builder/composable/mini/15-evaluation-design.md +200 -0
  173. package/assets/skills/converted/mcp-builder/composable/mini/16-evaluation-running.md +198 -0
  174. package/assets/skills/converted/mcp-builder/composable/presets/node-server.md +1381 -0
  175. package/assets/skills/converted/mcp-builder/composable/presets/python-server.md +1129 -0
  176. package/assets/skills/converted/pdf/composable/BUNDLE.md +1284 -0
  177. package/assets/skills/converted/pdf/composable/INDEX.md +14 -0
  178. package/assets/skills/converted/pdf/composable/VERSION +1 -0
  179. package/assets/skills/converted/pdf/composable/mini/00-core.md +46 -0
  180. package/assets/skills/converted/pdf/composable/mini/01-creation.md +176 -0
  181. package/assets/skills/converted/pdf/composable/mini/02-extraction.md +178 -0
  182. package/assets/skills/converted/pdf/composable/mini/03-merge-split-manipulate.md +240 -0
  183. package/assets/skills/converted/pdf/composable/mini/04-images-ocr.md +168 -0
  184. package/assets/skills/converted/pdf/composable/mini/05-encryption.md +51 -0
  185. package/assets/skills/converted/pdf/composable/mini/06-forms.md +300 -0
  186. package/assets/skills/converted/pdf/composable/mini/07-libraries-reference.md +89 -0
  187. package/assets/skills/converted/pptx/composable/BUNDLE.md +911 -0
  188. package/assets/skills/converted/pptx/composable/INDEX.md +12 -0
  189. package/assets/skills/converted/pptx/composable/VERSION +1 -0
  190. package/assets/skills/converted/pptx/composable/mini/00-core.md +37 -0
  191. package/assets/skills/converted/pptx/composable/mini/01-reading.md +37 -0
  192. package/assets/skills/converted/pptx/composable/mini/02-creating-from-scratch.md +422 -0
  193. package/assets/skills/converted/pptx/composable/mini/03-editing-templates.md +207 -0
  194. package/assets/skills/converted/pptx/composable/mini/04-design.md +89 -0
  195. package/assets/skills/converted/pptx/composable/mini/05-qa-and-rendering.md +91 -0
  196. package/assets/skills/converted/pptx/composable/presets/creating.md +659 -0
  197. package/assets/skills/converted/pptx/composable/presets/editing.md +485 -0
  198. package/assets/skills/converted/skill-creator/composable/BUNDLE.md +1681 -0
  199. package/assets/skills/converted/skill-creator/composable/INDEX.md +21 -0
  200. package/assets/skills/converted/skill-creator/composable/VERSION +1 -0
  201. package/assets/skills/converted/skill-creator/composable/mini/00-core.md +59 -0
  202. package/assets/skills/converted/skill-creator/composable/mini/01-creating-a-skill.md +27 -0
  203. package/assets/skills/converted/skill-creator/composable/mini/02-skill-writing-guide.md +71 -0
  204. package/assets/skills/converted/skill-creator/composable/mini/03-test-cases.md +21 -0
  205. package/assets/skills/converted/skill-creator/composable/mini/04-running-and-evaluating.md +128 -0
  206. package/assets/skills/converted/skill-creator/composable/mini/05-improving-the-skill.md +30 -0
  207. package/assets/skills/converted/skill-creator/composable/mini/06-blind-comparison.md +5 -0
  208. package/assets/skills/converted/skill-creator/composable/mini/07-description-optimization.md +74 -0
  209. package/assets/skills/converted/skill-creator/composable/mini/08-packaging.md +11 -0
  210. package/assets/skills/converted/skill-creator/composable/mini/09-environment-specific.md +38 -0
  211. package/assets/skills/converted/skill-creator/composable/mini/10-scripts-and-references.md +34 -0
  212. package/assets/skills/converted/skill-creator/composable/mini/11-json-schemas.md +414 -0
  213. package/assets/skills/converted/skill-creator/composable/mini/12-agent-grader.md +225 -0
  214. package/assets/skills/converted/skill-creator/composable/mini/13-agent-comparator.md +204 -0
  215. package/assets/skills/converted/skill-creator/composable/mini/14-agent-analyzer.md +276 -0
  216. package/assets/skills/converted/skill-creator/composable/presets/authoring.md +198 -0
  217. package/assets/skills/converted/skill-creator/composable/presets/evaluating.md +1334 -0
  218. package/assets/skills/converted/skill-creator/composable/presets/optimizing.md +160 -0
  219. package/assets/skills/converted/skill-creator/composable/presets.json +5 -0
  220. package/assets/skills/meta/ccs-skill-creator/composable/BUNDLE.md +465 -0
  221. package/assets/skills/meta/ccs-skill-creator/composable/INDEX.md +8 -0
  222. package/assets/skills/meta/ccs-skill-creator/composable/VERSION +1 -0
  223. package/assets/skills/meta/ccs-skill-creator/composable/mini/00-core.md +46 -0
  224. package/assets/skills/meta/ccs-skill-creator/composable/mini/01-create-new-skill.md +167 -0
  225. package/assets/skills/meta/ccs-skill-creator/composable/mini/02-convert-existing-skill.md +120 -0
  226. package/assets/skills/meta/ccs-skill-creator/composable/mini/03-review-and-maintain.md +112 -0
  227. package/assets/skills/sources/anthropic/PROVENANCE.md +3 -0
  228. package/assets/skills/sources/anthropic/claude-api/LICENSE.txt +202 -0
  229. package/assets/skills/sources/anthropic/docx/LICENSE.txt +30 -0
  230. package/assets/skills/sources/anthropic/internal-comms/LICENSE.txt +202 -0
  231. package/assets/skills/sources/anthropic/mcp-builder/LICENSE.txt +202 -0
  232. package/assets/skills/sources/anthropic/pdf/LICENSE.txt +30 -0
  233. package/assets/skills/sources/anthropic/pptx/LICENSE.txt +30 -0
  234. package/assets/skills/sources/anthropic/skill-creator/LICENSE.txt +202 -0
  235. package/assets/skills/sources/financial-analyst/PROVENANCE.md +1 -0
  236. package/assets/tools/hive.py +728 -0
  237. package/dist/cli.js +7494 -0
  238. package/package.json +40 -0
@@ -0,0 +1,659 @@
1
+ <!-- GENERATED by tools/hive.py compile — do not hand-edit. -->
2
+ # pptx — Compiled Skill Bundle — Preset: creating (v1.0.0)
3
+
4
+ All composable mini-skills for `pptx` concatenated in index order, frontmatter stripped. Regenerate with `tools/hive.py compile <skill-dir>` — do not edit by hand.
5
+
6
+ ---
7
+ <!-- module: 00-core.md -->
8
+
9
+ # Core: PPTX Skill
10
+
11
+ Always-loaded foundation for working with PowerPoint `.pptx` files. Load the focused minis (see INDEX) for reading, creating from scratch, editing templates, design, and QA.
12
+
13
+ ## When to use this skill
14
+
15
+ Use this skill any time a `.pptx` file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any `.pptx` file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions "deck," "slides," "presentation," or references a `.pptx` filename, regardless of what they plan to do with the content afterward. If a `.pptx` file needs to be opened, created, or touched, use this skill.
16
+
17
+ License: Proprietary. `skills/sources/anthropic/pptx/LICENSE.txt` has complete terms.
18
+
19
+ ## Quick Reference
20
+
21
+ | Task | Guide |
22
+ |------|-------|
23
+ | Read/analyze content | `python -m markitdown presentation.pptx` (see reading mini) |
24
+ | Edit or create from template | See editing-templates mini |
25
+ | Create from scratch | See creating-from-scratch mini |
26
+
27
+ ## Choosing an approach
28
+
29
+ - **Reading content**: extract text, get a visual overview, or inspect raw XML — see the reading mini.
30
+ - **Editing / creating from a template**: when using an existing presentation as a template — see the editing-templates mini.
31
+ - **Creating from scratch**: use when no template or reference presentation is available — see the creating-from-scratch mini.
32
+
33
+ Design guidance (palettes, layout, typography) and the required QA/verification process apply to both editing and creating — see the design and qa-and-rendering minis.
34
+
35
+ ## Scripts location
36
+
37
+ Helper scripts referenced throughout this skill (e.g. `scripts/thumbnail.py`, `scripts/office/unpack.py`, `scripts/add_slide.py`, `scripts/clean.py`, `scripts/office/pack.py`, `scripts/office/soffice.py`) are vendored in the source at `skills/sources/anthropic/pptx/scripts/`. Paths shown as `scripts/...` are relative to that vendored source directory.
38
+
39
+ ## Dependencies
40
+
41
+ - `pip install "markitdown[pptx]"` - text extraction
42
+ - `pip install Pillow` - thumbnail grids
43
+ - `npm install -g pptxgenjs` - creating from scratch
44
+ - LibreOffice (`soffice`) - PDF conversion (auto-configured for sandboxed environments via `scripts/office/soffice.py`)
45
+ - Poppler (`pdftoppm`) - PDF to images
46
+
47
+ ---
48
+ <!-- module: 02-creating-from-scratch.md -->
49
+
50
+ # Creating from Scratch (PptxGenJS)
51
+
52
+ Use when no template or reference presentation is available. This is the full PptxGenJS tutorial. Install: `npm install -g pptxgenjs`. Also read the design mini for palettes/layout and the qa-and-rendering mini for the required verification loop.
53
+
54
+ ## Setup & Basic Structure
55
+
56
+ ```javascript
57
+ const pptxgen = require("pptxgenjs");
58
+
59
+ let pres = new pptxgen();
60
+ pres.layout = 'LAYOUT_16x9'; // or 'LAYOUT_16x10', 'LAYOUT_4x3', 'LAYOUT_WIDE'
61
+ pres.author = 'Your Name';
62
+ pres.title = 'Presentation Title';
63
+
64
+ let slide = pres.addSlide();
65
+ slide.addText("Hello World!", { x: 0.5, y: 0.5, fontSize: 36, color: "363636" });
66
+
67
+ pres.writeFile({ fileName: "Presentation.pptx" });
68
+ ```
69
+
70
+ ## Layout Dimensions
71
+
72
+ Slide dimensions (coordinates in inches):
73
+ - `LAYOUT_16x9`: 10" × 5.625" (default)
74
+ - `LAYOUT_16x10`: 10" × 6.25"
75
+ - `LAYOUT_4x3`: 10" × 7.5"
76
+ - `LAYOUT_WIDE`: 13.3" × 7.5"
77
+
78
+ ---
79
+
80
+ ## Text & Formatting
81
+
82
+ ```javascript
83
+ // Basic text
84
+ slide.addText("Simple Text", {
85
+ x: 1, y: 1, w: 8, h: 2, fontSize: 24, fontFace: "Arial",
86
+ color: "363636", bold: true, align: "center", valign: "middle"
87
+ });
88
+
89
+ // Character spacing (use charSpacing, not letterSpacing which is silently ignored)
90
+ slide.addText("SPACED TEXT", { x: 1, y: 1, w: 8, h: 1, charSpacing: 6 });
91
+
92
+ // Rich text arrays
93
+ slide.addText([
94
+ { text: "Bold ", options: { bold: true } },
95
+ { text: "Italic ", options: { italic: true } }
96
+ ], { x: 1, y: 3, w: 8, h: 1 });
97
+
98
+ // Multi-line text (requires breakLine: true)
99
+ slide.addText([
100
+ { text: "Line 1", options: { breakLine: true } },
101
+ { text: "Line 2", options: { breakLine: true } },
102
+ { text: "Line 3" } // Last item doesn't need breakLine
103
+ ], { x: 0.5, y: 0.5, w: 8, h: 2 });
104
+
105
+ // Text box margin (internal padding)
106
+ slide.addText("Title", {
107
+ x: 0.5, y: 0.3, w: 9, h: 0.6,
108
+ margin: 0 // Use 0 when aligning text with other elements like shapes or icons
109
+ });
110
+ ```
111
+
112
+ **Tip:** Text boxes have internal margin by default. Set `margin: 0` when you need text to align precisely with shapes, lines, or icons at the same x-position.
113
+
114
+ ---
115
+
116
+ ## Lists & Bullets
117
+
118
+ ```javascript
119
+ // ✅ CORRECT: Multiple bullets
120
+ slide.addText([
121
+ { text: "First item", options: { bullet: true, breakLine: true } },
122
+ { text: "Second item", options: { bullet: true, breakLine: true } },
123
+ { text: "Third item", options: { bullet: true } }
124
+ ], { x: 0.5, y: 0.5, w: 8, h: 3 });
125
+
126
+ // ❌ WRONG: Never use unicode bullets
127
+ slide.addText("• First item", { ... }); // Creates double bullets
128
+
129
+ // Sub-items and numbered lists
130
+ { text: "Sub-item", options: { bullet: true, indentLevel: 1 } }
131
+ { text: "First", options: { bullet: { type: "number" }, breakLine: true } }
132
+ ```
133
+
134
+ ---
135
+
136
+ ## Shapes
137
+
138
+ ```javascript
139
+ slide.addShape(pres.shapes.RECTANGLE, {
140
+ x: 0.5, y: 0.8, w: 1.5, h: 3.0,
141
+ fill: { color: "FF0000" }, line: { color: "000000", width: 2 }
142
+ });
143
+
144
+ slide.addShape(pres.shapes.OVAL, { x: 4, y: 1, w: 2, h: 2, fill: { color: "0000FF" } });
145
+
146
+ slide.addShape(pres.shapes.LINE, {
147
+ x: 1, y: 3, w: 5, h: 0, line: { color: "FF0000", width: 3, dashType: "dash" }
148
+ });
149
+
150
+ // With transparency
151
+ slide.addShape(pres.shapes.RECTANGLE, {
152
+ x: 1, y: 1, w: 3, h: 2,
153
+ fill: { color: "0088CC", transparency: 50 }
154
+ });
155
+
156
+ // Rounded rectangle (rectRadius only works with ROUNDED_RECTANGLE, not RECTANGLE)
157
+ // ⚠️ Don't pair with rectangular accent overlays — they won't cover rounded corners. Use RECTANGLE instead.
158
+ slide.addShape(pres.shapes.ROUNDED_RECTANGLE, {
159
+ x: 1, y: 1, w: 3, h: 2,
160
+ fill: { color: "FFFFFF" }, rectRadius: 0.1
161
+ });
162
+
163
+ // With shadow
164
+ slide.addShape(pres.shapes.RECTANGLE, {
165
+ x: 1, y: 1, w: 3, h: 2,
166
+ fill: { color: "FFFFFF" },
167
+ shadow: { type: "outer", color: "000000", blur: 6, offset: 2, angle: 135, opacity: 0.15 }
168
+ });
169
+ ```
170
+
171
+ Shadow options:
172
+
173
+ | Property | Type | Range | Notes |
174
+ |----------|------|-------|-------|
175
+ | `type` | string | `"outer"`, `"inner"` | |
176
+ | `color` | string | 6-char hex (e.g. `"000000"`) | No `#` prefix, no 8-char hex — see Common Pitfalls |
177
+ | `blur` | number | 0-100 pt | |
178
+ | `offset` | number | 0-200 pt | **Must be non-negative** — negative values corrupt the file |
179
+ | `angle` | number | 0-359 degrees | Direction the shadow falls (135 = bottom-right, 270 = upward) |
180
+ | `opacity` | number | 0.0-1.0 | Use this for transparency, never encode in color string |
181
+
182
+ To cast a shadow upward (e.g. on a footer bar), use `angle: 270` with a positive offset — do **not** use a negative offset.
183
+
184
+ **Note**: Gradient fills are not natively supported. Use a gradient image as a background instead.
185
+
186
+ ---
187
+
188
+ ## Images
189
+
190
+ ### Image Sources
191
+
192
+ ```javascript
193
+ // From file path
194
+ slide.addImage({ path: "images/chart.png", x: 1, y: 1, w: 5, h: 3 });
195
+
196
+ // From URL
197
+ slide.addImage({ path: "https://example.com/image.jpg", x: 1, y: 1, w: 5, h: 3 });
198
+
199
+ // From base64 (faster, no file I/O)
200
+ slide.addImage({ data: "image/png;base64,iVBORw0KGgo...", x: 1, y: 1, w: 5, h: 3 });
201
+ ```
202
+
203
+ ### Image Options
204
+
205
+ ```javascript
206
+ slide.addImage({
207
+ path: "image.png",
208
+ x: 1, y: 1, w: 5, h: 3,
209
+ rotate: 45, // 0-359 degrees
210
+ rounding: true, // Circular crop
211
+ transparency: 50, // 0-100
212
+ flipH: true, // Horizontal flip
213
+ flipV: false, // Vertical flip
214
+ altText: "Description", // Accessibility
215
+ hyperlink: { url: "https://example.com" }
216
+ });
217
+ ```
218
+
219
+ ### Image Sizing Modes
220
+
221
+ ```javascript
222
+ // Contain - fit inside, preserve ratio
223
+ { sizing: { type: 'contain', w: 4, h: 3 } }
224
+
225
+ // Cover - fill area, preserve ratio (may crop)
226
+ { sizing: { type: 'cover', w: 4, h: 3 } }
227
+
228
+ // Crop - cut specific portion
229
+ { sizing: { type: 'crop', x: 0.5, y: 0.5, w: 2, h: 2 } }
230
+ ```
231
+
232
+ ### Calculate Dimensions (preserve aspect ratio)
233
+
234
+ ```javascript
235
+ const origWidth = 1978, origHeight = 923, maxHeight = 3.0;
236
+ const calcWidth = maxHeight * (origWidth / origHeight);
237
+ const centerX = (10 - calcWidth) / 2;
238
+
239
+ slide.addImage({ path: "image.png", x: centerX, y: 1.2, w: calcWidth, h: maxHeight });
240
+ ```
241
+
242
+ ### Supported Formats
243
+
244
+ - **Standard**: PNG, JPG, GIF (animated GIFs work in Microsoft 365)
245
+ - **SVG**: Works in modern PowerPoint/Microsoft 365
246
+
247
+ ---
248
+
249
+ ## Icons
250
+
251
+ Use react-icons to generate SVG icons, then rasterize to PNG for universal compatibility.
252
+
253
+ ### Setup
254
+
255
+ ```javascript
256
+ const React = require("react");
257
+ const ReactDOMServer = require("react-dom/server");
258
+ const sharp = require("sharp");
259
+ const { FaCheckCircle, FaChartLine } = require("react-icons/fa");
260
+
261
+ function renderIconSvg(IconComponent, color = "#000000", size = 256) {
262
+ return ReactDOMServer.renderToStaticMarkup(
263
+ React.createElement(IconComponent, { color, size: String(size) })
264
+ );
265
+ }
266
+
267
+ async function iconToBase64Png(IconComponent, color, size = 256) {
268
+ const svg = renderIconSvg(IconComponent, color, size);
269
+ const pngBuffer = await sharp(Buffer.from(svg)).png().toBuffer();
270
+ return "image/png;base64," + pngBuffer.toString("base64");
271
+ }
272
+ ```
273
+
274
+ ### Add Icon to Slide
275
+
276
+ ```javascript
277
+ const iconData = await iconToBase64Png(FaCheckCircle, "#4472C4", 256);
278
+
279
+ slide.addImage({
280
+ data: iconData,
281
+ x: 1, y: 1, w: 0.5, h: 0.5 // Size in inches
282
+ });
283
+ ```
284
+
285
+ **Note**: Use size 256 or higher for crisp icons. The size parameter controls the rasterization resolution, not the display size on the slide (which is set by `w` and `h` in inches).
286
+
287
+ ### Icon Libraries
288
+
289
+ Install: `npm install -g react-icons react react-dom sharp`
290
+
291
+ Popular icon sets in react-icons:
292
+ - `react-icons/fa` - Font Awesome
293
+ - `react-icons/md` - Material Design
294
+ - `react-icons/hi` - Heroicons
295
+ - `react-icons/bi` - Bootstrap Icons
296
+
297
+ ---
298
+
299
+ ## Slide Backgrounds
300
+
301
+ ```javascript
302
+ // Solid color
303
+ slide.background = { color: "F1F1F1" };
304
+
305
+ // Color with transparency
306
+ slide.background = { color: "FF3399", transparency: 50 };
307
+
308
+ // Image from URL
309
+ slide.background = { path: "https://example.com/bg.jpg" };
310
+
311
+ // Image from base64
312
+ slide.background = { data: "image/png;base64,iVBORw0KGgo..." };
313
+ ```
314
+
315
+ ---
316
+
317
+ ## Tables
318
+
319
+ ```javascript
320
+ slide.addTable([
321
+ ["Header 1", "Header 2"],
322
+ ["Cell 1", "Cell 2"]
323
+ ], {
324
+ x: 1, y: 1, w: 8, h: 2,
325
+ border: { pt: 1, color: "999999" }, fill: { color: "F1F1F1" }
326
+ });
327
+
328
+ // Advanced with merged cells
329
+ let tableData = [
330
+ [{ text: "Header", options: { fill: { color: "6699CC" }, color: "FFFFFF", bold: true } }, "Cell"],
331
+ [{ text: "Merged", options: { colspan: 2 } }]
332
+ ];
333
+ slide.addTable(tableData, { x: 1, y: 3.5, w: 8, colW: [4, 4] });
334
+ ```
335
+
336
+ ---
337
+
338
+ ## Charts
339
+
340
+ ```javascript
341
+ // Bar chart
342
+ slide.addChart(pres.charts.BAR, [{
343
+ name: "Sales", labels: ["Q1", "Q2", "Q3", "Q4"], values: [4500, 5500, 6200, 7100]
344
+ }], {
345
+ x: 0.5, y: 0.6, w: 6, h: 3, barDir: 'col',
346
+ showTitle: true, title: 'Quarterly Sales'
347
+ });
348
+
349
+ // Line chart
350
+ slide.addChart(pres.charts.LINE, [{
351
+ name: "Temp", labels: ["Jan", "Feb", "Mar"], values: [32, 35, 42]
352
+ }], { x: 0.5, y: 4, w: 6, h: 3, lineSize: 3, lineSmooth: true });
353
+
354
+ // Pie chart
355
+ slide.addChart(pres.charts.PIE, [{
356
+ name: "Share", labels: ["A", "B", "Other"], values: [35, 45, 20]
357
+ }], { x: 7, y: 1, w: 5, h: 4, showPercent: true });
358
+ ```
359
+
360
+ ### Better-Looking Charts
361
+
362
+ Default charts look dated. Apply these options for a modern, clean appearance:
363
+
364
+ ```javascript
365
+ slide.addChart(pres.charts.BAR, chartData, {
366
+ x: 0.5, y: 1, w: 9, h: 4, barDir: "col",
367
+
368
+ // Custom colors (match your presentation palette)
369
+ chartColors: ["0D9488", "14B8A6", "5EEAD4"],
370
+
371
+ // Clean background
372
+ chartArea: { fill: { color: "FFFFFF" }, roundedCorners: true },
373
+
374
+ // Muted axis labels
375
+ catAxisLabelColor: "64748B",
376
+ valAxisLabelColor: "64748B",
377
+
378
+ // Subtle grid (value axis only)
379
+ valGridLine: { color: "E2E8F0", size: 0.5 },
380
+ catGridLine: { style: "none" },
381
+
382
+ // Data labels on bars
383
+ showValue: true,
384
+ dataLabelPosition: "outEnd",
385
+ dataLabelColor: "1E293B",
386
+
387
+ // Hide legend for single series
388
+ showLegend: false,
389
+ });
390
+ ```
391
+
392
+ **Key styling options:**
393
+ - `chartColors: [...]` - hex colors for series/segments
394
+ - `chartArea: { fill, border, roundedCorners }` - chart background
395
+ - `catGridLine/valGridLine: { color, style, size }` - grid lines (`style: "none"` to hide)
396
+ - `lineSmooth: true` - curved lines (line charts)
397
+ - `legendPos: "r"` - legend position: "b", "t", "l", "r", "tr"
398
+
399
+ ---
400
+
401
+ ## Slide Masters
402
+
403
+ ```javascript
404
+ pres.defineSlideMaster({
405
+ title: 'TITLE_SLIDE', background: { color: '283A5E' },
406
+ objects: [{
407
+ placeholder: { options: { name: 'title', type: 'title', x: 1, y: 2, w: 8, h: 2 } }
408
+ }]
409
+ });
410
+
411
+ let titleSlide = pres.addSlide({ masterName: "TITLE_SLIDE" });
412
+ titleSlide.addText("My Title", { placeholder: "title" });
413
+ ```
414
+
415
+ ---
416
+
417
+ ## Common Pitfalls
418
+
419
+ ⚠️ These issues cause file corruption, visual bugs, or broken output. Avoid them.
420
+
421
+ 1. **NEVER use "#" with hex colors** - causes file corruption
422
+ ```javascript
423
+ color: "FF0000" // ✅ CORRECT
424
+ color: "#FF0000" // ❌ WRONG
425
+ ```
426
+
427
+ 2. **NEVER encode opacity in hex color strings** - 8-char colors (e.g., `"00000020"`) corrupt the file. Use the `opacity` property instead.
428
+ ```javascript
429
+ shadow: { type: "outer", blur: 6, offset: 2, color: "00000020" } // ❌ CORRUPTS FILE
430
+ shadow: { type: "outer", blur: 6, offset: 2, color: "000000", opacity: 0.12 } // ✅ CORRECT
431
+ ```
432
+
433
+ 3. **Use `bullet: true`** - NEVER unicode symbols like "•" (creates double bullets)
434
+
435
+ 4. **Use `breakLine: true`** between array items or text runs together
436
+
437
+ 5. **Avoid `lineSpacing` with bullets** - causes excessive gaps; use `paraSpaceAfter` instead
438
+
439
+ 6. **Each presentation needs fresh instance** - don't reuse `pptxgen()` objects
440
+
441
+ 7. **NEVER reuse option objects across calls** - PptxGenJS mutates objects in-place (e.g. converting shadow values to EMU). Sharing one object between multiple calls corrupts the second shape.
442
+ ```javascript
443
+ const shadow = { type: "outer", blur: 6, offset: 2, color: "000000", opacity: 0.15 };
444
+ slide.addShape(pres.shapes.RECTANGLE, { shadow, ... }); // ❌ second call gets already-converted values
445
+ slide.addShape(pres.shapes.RECTANGLE, { shadow, ... });
446
+
447
+ const makeShadow = () => ({ type: "outer", blur: 6, offset: 2, color: "000000", opacity: 0.15 });
448
+ slide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... }); // ✅ fresh object each time
449
+ slide.addShape(pres.shapes.RECTANGLE, { shadow: makeShadow(), ... });
450
+ ```
451
+
452
+ 8. **Don't use `ROUNDED_RECTANGLE` with accent borders** - rectangular overlay bars won't cover rounded corners. Use `RECTANGLE` instead.
453
+ ```javascript
454
+ // ❌ WRONG: Accent bar doesn't cover rounded corners
455
+ slide.addShape(pres.shapes.ROUNDED_RECTANGLE, { x: 1, y: 1, w: 3, h: 1.5, fill: { color: "FFFFFF" } });
456
+ slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 0.08, h: 1.5, fill: { color: "0891B2" } });
457
+
458
+ // ✅ CORRECT: Use RECTANGLE for clean alignment
459
+ slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 3, h: 1.5, fill: { color: "FFFFFF" } });
460
+ slide.addShape(pres.shapes.RECTANGLE, { x: 1, y: 1, w: 0.08, h: 1.5, fill: { color: "0891B2" } });
461
+ ```
462
+
463
+ ---
464
+
465
+ ## Quick Reference
466
+
467
+ - **Shapes**: RECTANGLE, OVAL, LINE, ROUNDED_RECTANGLE
468
+ - **Charts**: BAR, LINE, PIE, DOUGHNUT, SCATTER, BUBBLE, RADAR
469
+ - **Layouts**: LAYOUT_16x9 (10"×5.625"), LAYOUT_16x10, LAYOUT_4x3, LAYOUT_WIDE
470
+ - **Alignment**: "left", "center", "right"
471
+ - **Chart data labels**: "outEnd", "inEnd", "center"
472
+
473
+ ---
474
+ <!-- module: 04-design.md -->
475
+
476
+ # Design Ideas
477
+
478
+ Design guidance for making slides that look good. Applies to both creating from scratch and editing/templating. Consult before building each slide.
479
+
480
+ **Don't create boring slides.** Plain bullets on a white background won't impress anyone. Consider ideas from this list for each slide.
481
+
482
+ ## Before Starting
483
+
484
+ - **Pick a bold, content-informed color palette**: The palette should feel designed for THIS topic. If swapping your colors into a completely different presentation would still "work," you haven't made specific enough choices.
485
+ - **Dominance over equality**: One color should dominate (60-70% visual weight), with 1-2 supporting tones and one sharp accent. Never give all colors equal weight.
486
+ - **Dark/light contrast**: Dark backgrounds for title + conclusion slides, light for content ("sandwich" structure). Or commit to dark throughout for a premium feel.
487
+ - **Commit to a visual motif**: Pick ONE distinctive element and repeat it — rounded image frames, icons in colored circles, thick single-side borders. Carry it across every slide.
488
+
489
+ ## Color Palettes
490
+
491
+ Choose colors that match your topic — don't default to generic blue. Use these palettes as inspiration:
492
+
493
+ | Theme | Primary | Secondary | Accent |
494
+ |-------|---------|-----------|--------|
495
+ | **Midnight Executive** | `1E2761` (navy) | `CADCFC` (ice blue) | `FFFFFF` (white) |
496
+ | **Forest & Moss** | `2C5F2D` (forest) | `97BC62` (moss) | `F5F5F5` (cream) |
497
+ | **Coral Energy** | `F96167` (coral) | `F9E795` (gold) | `2F3C7E` (navy) |
498
+ | **Warm Terracotta** | `B85042` (terracotta) | `E7E8D1` (sand) | `A7BEAE` (sage) |
499
+ | **Ocean Gradient** | `065A82` (deep blue) | `1C7293` (teal) | `21295C` (midnight) |
500
+ | **Charcoal Minimal** | `36454F` (charcoal) | `F2F2F2` (off-white) | `212121` (black) |
501
+ | **Teal Trust** | `028090` (teal) | `00A896` (seafoam) | `02C39A` (mint) |
502
+ | **Berry & Cream** | `6D2E46` (berry) | `A26769` (dusty rose) | `ECE2D0` (cream) |
503
+ | **Sage Calm** | `84B59F` (sage) | `69A297` (eucalyptus) | `50808E` (slate) |
504
+ | **Cherry Bold** | `990011` (cherry) | `FCF6F5` (off-white) | `2F3C7E` (navy) |
505
+
506
+ ## For Each Slide
507
+
508
+ **Every slide needs a visual element** — image, chart, icon, or shape. Text-only slides are forgettable.
509
+
510
+ **Layout options:**
511
+ - Two-column (text left, illustration on right)
512
+ - Icon + text rows (icon in colored circle, bold header, description below)
513
+ - 2x2 or 2x3 grid (image on one side, grid of content blocks on other)
514
+ - Half-bleed image (full left or right side) with content overlay
515
+
516
+ **Data display:**
517
+ - Large stat callouts (big numbers 60-72pt with small labels below)
518
+ - Comparison columns (before/after, pros/cons, side-by-side options)
519
+ - Timeline or process flow (numbered steps, arrows)
520
+
521
+ **Visual polish:**
522
+ - Icons in small colored circles next to section headers
523
+ - Italic accent text for key stats or taglines
524
+
525
+ ## Typography
526
+
527
+ **Choose an interesting font pairing** — don't default to Arial. Pick a header font with personality and pair it with a clean body font.
528
+
529
+ | Header Font | Body Font |
530
+ |-------------|-----------|
531
+ | Georgia | Calibri |
532
+ | Arial Black | Arial |
533
+ | Calibri | Calibri Light |
534
+ | Cambria | Calibri |
535
+ | Trebuchet MS | Calibri |
536
+ | Impact | Arial |
537
+ | Palatino | Garamond |
538
+ | Consolas | Calibri |
539
+
540
+ | Element | Size |
541
+ |---------|------|
542
+ | Slide title | 36-44pt bold |
543
+ | Section header | 20-24pt bold |
544
+ | Body text | 14-16pt |
545
+ | Captions | 10-12pt muted |
546
+
547
+ ## Spacing
548
+
549
+ - 0.5" minimum margins
550
+ - 0.3-0.5" between content blocks
551
+ - Leave breathing room—don't fill every inch
552
+
553
+ ## Avoid (Common Mistakes)
554
+
555
+ - **Don't repeat the same layout** — vary columns, cards, and callouts across slides
556
+ - **Don't center body text** — left-align paragraphs and lists; center only titles
557
+ - **Don't skimp on size contrast** — titles need 36pt+ to stand out from 14-16pt body
558
+ - **Don't default to blue** — pick colors that reflect the specific topic
559
+ - **Don't mix spacing randomly** — choose 0.3" or 0.5" gaps and use consistently
560
+ - **Don't style one slide and leave the rest plain** — commit fully or keep it simple throughout
561
+ - **Don't create text-only slides** — add images, icons, charts, or visual elements; avoid plain title + bullets
562
+ - **Don't forget text box padding** — when aligning lines or shapes with text edges, set `margin: 0` on the text box or offset the shape to account for padding
563
+ - **Don't use low-contrast elements** — icons AND text need strong contrast against the background; avoid light text on light backgrounds or dark text on dark backgrounds
564
+ - **NEVER use accent lines under titles** — these are a hallmark of AI-generated slides; use whitespace or background color instead
565
+
566
+ ---
567
+ <!-- module: 05-qa-and-rendering.md -->
568
+
569
+ # QA & Rendering
570
+
571
+ The required verification process for any deck you create or edit, plus how to render slides to images for inspection. Do this before declaring any presentation done. Script paths (`scripts/...`) refer to the vendored source at `skills/sources/anthropic/pptx/scripts/`.
572
+
573
+ ## QA (Required)
574
+
575
+ **Assume there are problems. Your job is to find them.**
576
+
577
+ Your first render is almost never correct. Approach QA as a bug hunt, not a confirmation step. If you found zero issues on first inspection, you weren't looking hard enough.
578
+
579
+ ### Content QA
580
+
581
+ ```bash
582
+ python -m markitdown output.pptx
583
+ ```
584
+
585
+ Check for missing content, typos, wrong order.
586
+
587
+ **When using templates, check for leftover placeholder text:**
588
+
589
+ ```bash
590
+ python -m markitdown output.pptx | grep -iE "xxxx|lorem|ipsum|this.*(page|slide).*layout"
591
+ ```
592
+
593
+ If grep returns results, fix them before declaring success.
594
+
595
+ ### Visual QA
596
+
597
+ **⚠️ USE SUBAGENTS** — even for 2-3 slides. You've been staring at the code and will see what you expect, not what's there. Subagents have fresh eyes.
598
+
599
+ Convert slides to images (see Converting to Images below), then use this prompt:
600
+
601
+ ```
602
+ Visually inspect these slides. Assume there are issues — find them.
603
+
604
+ Look for:
605
+ - Overlapping elements (text through shapes, lines through words, stacked elements)
606
+ - Text overflow or cut off at edges/box boundaries
607
+ - Decorative lines positioned for single-line text but title wrapped to two lines
608
+ - Source citations or footers colliding with content above
609
+ - Elements too close (< 0.3" gaps) or cards/sections nearly touching
610
+ - Uneven gaps (large empty area in one place, cramped in another)
611
+ - Insufficient margin from slide edges (< 0.5")
612
+ - Columns or similar elements not aligned consistently
613
+ - Low-contrast text (e.g., light gray text on cream-colored background)
614
+ - Low-contrast icons (e.g., dark icons on dark backgrounds without a contrasting circle)
615
+ - Text boxes too narrow causing excessive wrapping
616
+ - Leftover placeholder content
617
+
618
+ For each slide, list issues or areas of concern, even if minor.
619
+
620
+ Read and analyze these images:
621
+ 1. /path/to/slide-01.jpg (Expected: [brief description])
622
+ 2. /path/to/slide-02.jpg (Expected: [brief description])
623
+
624
+ Report ALL issues found, including minor ones.
625
+ ```
626
+
627
+ ### Verification Loop
628
+
629
+ 1. Generate slides → Convert to images → Inspect
630
+ 2. **List issues found** (if none found, look again more critically)
631
+ 3. Fix issues
632
+ 4. **Re-verify affected slides** — one fix often creates another problem
633
+ 5. Repeat until a full pass reveals no new issues
634
+
635
+ **Do not declare success until you've completed at least one fix-and-verify cycle.**
636
+
637
+ ---
638
+
639
+ ## Converting to Images
640
+
641
+ Convert presentations to individual slide images for visual inspection:
642
+
643
+ ```bash
644
+ python scripts/office/soffice.py --headless --convert-to pdf output.pptx
645
+ pdftoppm -jpeg -r 150 output.pdf slide
646
+ ```
647
+
648
+ This creates `slide-01.jpg`, `slide-02.jpg`, etc.
649
+
650
+ To re-render specific slides after fixes:
651
+
652
+ ```bash
653
+ pdftoppm -jpeg -r 150 -f N -l N output.pdf slide-fixed
654
+ ```
655
+
656
+ ## Dependencies
657
+
658
+ - LibreOffice (`soffice`) - PDF conversion (auto-configured for sandboxed environments via `scripts/office/soffice.py`)
659
+ - Poppler (`pdftoppm`) - PDF to images