skilldrop-cli 0.16.35 → 0.16.36

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 (212) hide show
  1. package/README.md +1 -0
  2. package/agents/README.md +4 -1
  3. package/agents/docs-reviewer.md +47 -0
  4. package/agents/finding-adjudicator.md +49 -0
  5. package/agents/test-reviewer.md +52 -0
  6. package/catalogue.json +17 -7
  7. package/model-routing.json +40 -0
  8. package/package.json +1 -1
  9. package/packs/ai-engineering/skills/agent-config-review/SKILL.md +116 -0
  10. package/packs/ai-engineering/skills/agent-config-review/evals/eval_queries.json +12 -0
  11. package/packs/ai-engineering/skills/agent-config-review/evals/evals.json +75 -0
  12. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/agents/db-migrator.md +8 -0
  13. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/agents/reviewer.md +9 -0
  14. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/settings.json +48 -0
  15. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.claude/settings.local.json +5 -0
  16. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/.mcp.json +22 -0
  17. package/packs/ai-engineering/skills/agent-config-review/evals/files/1/package.json +12 -0
  18. package/packs/ai-engineering/skills/agent-config-review/evals/files/2/.cursor/mcp.json +17 -0
  19. package/packs/ai-engineering/skills/agent-config-review/evals/files/2/config.toml +21 -0
  20. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/my-user-settings.json +11 -0
  21. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.claude/agents/release-notes.md +13 -0
  22. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.claude/settings.json +39 -0
  23. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/.mcp.json +18 -0
  24. package/packs/ai-engineering/skills/agent-config-review/evals/files/4/quillstack/package.json +14 -0
  25. package/packs/ai-engineering/skills/agent-config-review/evals/files/5/.github/workflows/codex-triage.yml +29 -0
  26. package/packs/ai-engineering/skills/agent-config-review/evals/files/5/AGENTS.md +16 -0
  27. package/packs/ai-engineering/skills/agent-config-review/evals/files/5/codex/config.toml +34 -0
  28. package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/.claude/settings.json +22 -0
  29. package/packs/ai-engineering/skills/agent-config-review/examples/inputs/tidewater-ingest/.mcp.json +9 -0
  30. package/packs/ai-engineering/skills/agent-config-review/examples/python-repo-tighten.md +81 -0
  31. package/packs/ai-engineering/skills/agent-config-review/manifest.json +60 -0
  32. package/packs/ai-engineering/skills/agent-config-review/reference.md +205 -0
  33. package/packs/ai-engineering/skills/agent-config-review/scripts/agent_config_scan.py +989 -0
  34. package/packs/ai-engineering/skills/agent-incident-response/SKILL.md +175 -0
  35. package/packs/ai-engineering/skills/agent-incident-response/evals/eval_queries.json +14 -0
  36. package/packs/ai-engineering/skills/agent-incident-response/evals/evals.json +107 -0
  37. package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/agent-session-excerpt.txt +11 -0
  38. package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/ci-build-log.txt +24 -0
  39. package/packs/ai-engineering/skills/agent-incident-response/evals/files/1/incident-notes.md +19 -0
  40. package/packs/ai-engineering/skills/agent-incident-response/evals/files/2/mcp-config.json +20 -0
  41. package/packs/ai-engineering/skills/agent-incident-response/evals/files/2/session-transcript.txt +8 -0
  42. package/packs/ai-engineering/skills/agent-incident-response/evals/files/4/agent-session.log +70 -0
  43. package/packs/ai-engineering/skills/agent-incident-response/evals/files/4/infra/staging-db.tf +25 -0
  44. package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/jobs/nightly-triage/job.yaml +19 -0
  45. package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/jobs/nightly-triage/run.log +13 -0
  46. package/packs/ai-engineering/skills/agent-incident-response/evals/files/5/usage-export-2026-10-20.csv +13 -0
  47. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/.mcp.json +20 -0
  48. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/git-log.txt +12 -0
  49. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/notesync-excerpt.txt +30 -0
  50. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/notesync.log +15 -0
  51. package/packs/ai-engineering/skills/agent-incident-response/evals/files/6/ssh-config.txt +16 -0
  52. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/.github/workflows/ci.yml +28 -0
  53. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/SECURITY.md +8 -0
  54. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/issue-479.md +35 -0
  55. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/package.json +15 -0
  56. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/pr-482.diff +20 -0
  57. package/packs/ai-engineering/skills/agent-incident-response/evals/files/7/run-log.txt +30 -0
  58. package/packs/ai-engineering/skills/agent-incident-response/examples/injected-issue-comment.md +57 -0
  59. package/packs/ai-engineering/skills/agent-incident-response/manifest.json +55 -0
  60. package/packs/ai-engineering/skills/agent-incident-response/reference.md +152 -0
  61. package/packs/ai-engineering/skills/agent-incident-response/scripts/find_secret_exposure.py +239 -0
  62. package/packs/ai-engineering/skills/agent-incident-response/scripts/usage_split.py +194 -0
  63. package/packs/converters/skills/file-to-markdown/SKILL.md +2 -1
  64. package/packs/converters/skills/file-to-markdown/evals/eval_queries.json +4 -0
  65. package/packs/converters/skills/file-to-markdown/manifest.json +2 -2
  66. package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +253 -3
  67. package/packs/converters/skills/md-to-confluence/SKILL.md +139 -0
  68. package/packs/converters/skills/md-to-confluence/evals/eval_queries.json +42 -0
  69. package/packs/converters/skills/md-to-confluence/evals/evals.json +89 -0
  70. package/packs/converters/skills/md-to-confluence/evals/files/1/img/latency-dashboard.png +0 -0
  71. package/packs/converters/skills/md-to-confluence/evals/files/1/payments-runbook.md +60 -0
  72. package/packs/converters/skills/md-to-confluence/evals/files/2/deploy-checklist.md +33 -0
  73. package/packs/converters/skills/md-to-confluence/evals/files/3/img/after/screen.png +0 -0
  74. package/packs/converters/skills/md-to-confluence/evals/files/3/img/before/screen.png +0 -0
  75. package/packs/converters/skills/md-to-confluence/evals/files/3/release-notes-4.2.md +49 -0
  76. package/packs/converters/skills/md-to-confluence/evals/files/4/docs/img/topology.png +0 -0
  77. package/packs/converters/skills/md-to-confluence/evals/files/4/docs/ingest-pipeline-design.md +65 -0
  78. package/packs/converters/skills/md-to-confluence/evals/files/5/support/troubleshooting-sso.md +57 -0
  79. package/packs/converters/skills/md-to-confluence/examples/inputs/img/queue-depth.png +0 -0
  80. package/packs/converters/skills/md-to-confluence/examples/inputs/queue-runbook.fixed.md +21 -0
  81. package/packs/converters/skills/md-to-confluence/examples/inputs/queue-runbook.md +21 -0
  82. package/packs/converters/skills/md-to-confluence/examples/queue-runbook.md +57 -0
  83. package/packs/converters/skills/md-to-confluence/manifest.json +52 -0
  84. package/packs/converters/skills/md-to-confluence/reference.md +92 -0
  85. package/packs/converters/skills/md-to-confluence/scripts/md_to_confluence.py +821 -0
  86. package/packs/converters/skills/md-to-pptx/SKILL.md +131 -0
  87. package/packs/converters/skills/md-to-pptx/evals/eval_queries.json +12 -0
  88. package/packs/converters/skills/md-to-pptx/evals/evals.json +84 -0
  89. package/packs/converters/skills/md-to-pptx/evals/files/1/img/defect-burndown.png +0 -0
  90. package/packs/converters/skills/md-to-pptx/evals/files/1/status-report.md +75 -0
  91. package/packs/converters/skills/md-to-pptx/evals/files/3/brand.json +12 -0
  92. package/packs/converters/skills/md-to-pptx/evals/files/3/night-shift-induction.md +53 -0
  93. package/packs/converters/skills/md-to-pptx/evals/files/4/charts/ontime.png +0 -0
  94. package/packs/converters/skills/md-to-pptx/evals/files/4/qbr-q3.md +85 -0
  95. package/packs/converters/skills/md-to-pptx/evals/files/5/vendor-sync-notes.md +28 -0
  96. package/packs/converters/skills/md-to-pptx/examples/support-weekly-input.md +48 -0
  97. package/packs/converters/skills/md-to-pptx/examples/support-weekly.md +75 -0
  98. package/packs/converters/skills/md-to-pptx/examples/tickets-by-week.png +0 -0
  99. package/packs/converters/skills/md-to-pptx/manifest.json +49 -0
  100. package/packs/converters/skills/md-to-pptx/reference.md +139 -0
  101. package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +1841 -0
  102. package/packs/dev-team/loops/modernize/LOOP.md +124 -0
  103. package/packs/dev-team/loops/modernize/evals/eval_queries.json +9 -0
  104. package/packs/dev-team/loops/modernize/evals/evals.json +27 -0
  105. package/packs/dev-team/loops/modernize/loop.json +60 -0
  106. package/packs/dev-team/skills/behaviour-equivalence/SKILL.md +155 -0
  107. package/packs/dev-team/skills/behaviour-equivalence/evals/eval_queries.json +11 -0
  108. package/packs/dev-team/skills/behaviour-equivalence/evals/evals.json +76 -0
  109. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/cases.jsonl +12 -0
  110. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/new.jsonl +12 -0
  111. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/notes.md +15 -0
  112. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/old.jsonl +12 -0
  113. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/old_rerun.jsonl +12 -0
  114. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/pricing_v1.py +45 -0
  115. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/pricing_v2.py +65 -0
  116. package/packs/dev-team/skills/behaviour-equivalence/evals/files/1/rules.json +10 -0
  117. package/packs/dev-team/skills/behaviour-equivalence/evals/files/3/diff-summary.txt +16 -0
  118. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/diff.txt +13 -0
  119. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/fee_calc_py2.py +16 -0
  120. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/fee_calc_py3.py +24 -0
  121. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/input.csv +13 -0
  122. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/new_output.csv +13 -0
  123. package/packs/dev-team/skills/behaviour-equivalence/evals/files/4/old_output.csv +13 -0
  124. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/TEAM_NOTES.md +19 -0
  125. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/normalisation.yaml +12 -0
  126. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/new_run.jsonl +8 -0
  127. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/old_run1.jsonl +8 -0
  128. package/packs/dev-team/skills/behaviour-equivalence/evals/files/5/recordings/old_run2.jsonl +8 -0
  129. package/packs/dev-team/skills/behaviour-equivalence/examples/delivery-date.md +78 -0
  130. package/packs/dev-team/skills/behaviour-equivalence/manifest.json +33 -0
  131. package/packs/dev-team/skills/behaviour-equivalence/reference.md +97 -0
  132. package/packs/dev-team/skills/behaviour-equivalence/scripts/golden_diff.py +524 -0
  133. package/packs/dev-team/skills/behaviour-equivalence/templates/accepted.json +10 -0
  134. package/packs/dev-team/skills/behaviour-equivalence/templates/rules.json +7 -0
  135. package/packs/frontend/pack.json +55 -0
  136. package/packs/frontend/skills/rendering-strategy/SKILL.md +149 -0
  137. package/packs/frontend/skills/rendering-strategy/evals/eval_queries.json +38 -0
  138. package/packs/frontend/skills/rendering-strategy/evals/evals.json +77 -0
  139. package/packs/frontend/skills/rendering-strategy/evals/files/1/fernhill-app.md +40 -0
  140. package/packs/frontend/skills/rendering-strategy/evals/files/3/routes.md +33 -0
  141. package/packs/frontend/skills/rendering-strategy/evals/files/4/build-notes.txt +5 -0
  142. package/packs/frontend/skills/rendering-strategy/evals/files/4/nuxt.config.ts +19 -0
  143. package/packs/frontend/skills/rendering-strategy/evals/files/4/pages/recipes/[slug].vue +37 -0
  144. package/packs/frontend/skills/rendering-strategy/evals/files/4/routes.md +15 -0
  145. package/packs/frontend/skills/rendering-strategy/evals/files/5/routes.txt +18 -0
  146. package/packs/frontend/skills/rendering-strategy/evals/files/5/src/hooks.server.ts +14 -0
  147. package/packs/frontend/skills/rendering-strategy/evals/files/5/src/routes/(marketing)/pricing/+page.server.ts +10 -0
  148. package/packs/frontend/skills/rendering-strategy/evals/files/5/src/routes/+layout.server.ts +10 -0
  149. package/packs/frontend/skills/rendering-strategy/evals/files/5/svelte.config.js +10 -0
  150. package/packs/frontend/skills/rendering-strategy/evals/files/5/traffic.md +18 -0
  151. package/packs/frontend/skills/rendering-strategy/examples/saas-site.md +42 -0
  152. package/packs/frontend/skills/rendering-strategy/manifest.json +50 -0
  153. package/packs/frontend/skills/rendering-strategy/reference.md +116 -0
  154. package/packs/frontend/skills/rendering-strategy/scripts/render_load.py +181 -0
  155. package/packs/frontend/skills/web-performance-review/SKILL.md +106 -0
  156. package/packs/frontend/skills/web-performance-review/evals/eval_queries.json +38 -0
  157. package/packs/frontend/skills/web-performance-review/evals/evals.json +76 -0
  158. package/packs/frontend/skills/web-performance-review/evals/files/1/psi.json +1065 -0
  159. package/packs/frontend/skills/web-performance-review/evals/files/2/after.json +359 -0
  160. package/packs/frontend/skills/web-performance-review/evals/files/2/before.json +375 -0
  161. package/packs/frontend/skills/web-performance-review/evals/files/4/psi-pdp-mobile-2026-10-19.json +171 -0
  162. package/packs/frontend/skills/web-performance-review/evals/files/4/rum-inp-attribution-oct14-19.csv +6 -0
  163. package/packs/frontend/skills/web-performance-review/evals/files/4/rum-inp-daily.csv +15 -0
  164. package/packs/frontend/skills/web-performance-review/evals/files/5/crux-home-phone.json +35 -0
  165. package/packs/frontend/skills/web-performance-review/evals/files/5/lighthouse-home-mobile.json +173 -0
  166. package/packs/frontend/skills/web-performance-review/examples/quayside-article-lhr.json +480 -0
  167. package/packs/frontend/skills/web-performance-review/examples/quayside-article.md +103 -0
  168. package/packs/frontend/skills/web-performance-review/manifest.json +48 -0
  169. package/packs/frontend/skills/web-performance-review/reference.md +105 -0
  170. package/packs/frontend/skills/web-performance-review/scripts/lh_summary.py +743 -0
  171. package/packs/product-manager/skills/lean-canvas/SKILL.md +162 -0
  172. package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +42 -0
  173. package/packs/product-manager/skills/lean-canvas/evals/evals.json +82 -0
  174. package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +54 -0
  175. package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +30 -0
  176. package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +44 -0
  177. package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +5 -0
  178. package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +40 -0
  179. package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +18 -0
  180. package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +72 -0
  181. package/packs/product-manager/skills/lean-canvas/manifest.json +34 -0
  182. package/packs/product-manager/skills/lean-canvas/reference.md +102 -0
  183. package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +211 -0
  184. package/packs/solution-architect/skills/api-contract-draft/SKILL.md +2 -2
  185. package/packs/solution-architect/skills/api-contract-draft/manifest.json +28 -6
  186. package/packs/solution-architect/skills/event-contract-draft/SKILL.md +167 -0
  187. package/packs/solution-architect/skills/event-contract-draft/evals/eval_queries.json +38 -0
  188. package/packs/solution-architect/skills/event-contract-draft/evals/evals.json +76 -0
  189. package/packs/solution-architect/skills/event-contract-draft/evals/files/1/order-events-brief.md +45 -0
  190. package/packs/solution-architect/skills/event-contract-draft/evals/files/4/NOTES.md +23 -0
  191. package/packs/solution-architect/skills/event-contract-draft/evals/files/4/schemas/shipment-update.json +40 -0
  192. package/packs/solution-architect/skills/event-contract-draft/evals/files/5/invoice.example.json +25 -0
  193. package/packs/solution-architect/skills/event-contract-draft/examples/order-service.asyncapi.json +246 -0
  194. package/packs/solution-architect/skills/event-contract-draft/examples/order-service.md +92 -0
  195. package/packs/solution-architect/skills/event-contract-draft/manifest.json +25 -0
  196. package/packs/solution-architect/skills/event-contract-draft/reference.md +113 -0
  197. package/packs/solution-architect/skills/event-contract-draft/scripts/check_asyncapi.py +502 -0
  198. package/packs/solution-architect/skills/event-contract-draft/templates/asyncapi-skeleton.json +144 -0
  199. package/packs/sre-oncall/skills/slo-spec/SKILL.md +161 -0
  200. package/packs/sre-oncall/skills/slo-spec/evals/eval_queries.json +38 -0
  201. package/packs/sre-oncall/skills/slo-spec/evals/evals.json +75 -0
  202. package/packs/sre-oncall/skills/slo-spec/evals/files/1/order-service.md +51 -0
  203. package/packs/sre-oncall/skills/slo-spec/evals/files/3/search-slo-status.md +30 -0
  204. package/packs/sre-oncall/skills/slo-spec/evals/files/4/alerts/payments-api.rules.yaml +16 -0
  205. package/packs/sre-oncall/skills/slo-spec/evals/files/4/docs/dependencies.md +8 -0
  206. package/packs/sre-oncall/skills/slo-spec/evals/files/4/metrics/summary-90d.md +51 -0
  207. package/packs/sre-oncall/skills/slo-spec/evals/files/5/ops-notes.md +34 -0
  208. package/packs/sre-oncall/skills/slo-spec/examples/ticket-booking.md +88 -0
  209. package/packs/sre-oncall/skills/slo-spec/manifest.json +34 -0
  210. package/packs/sre-oncall/skills/slo-spec/reference.md +113 -0
  211. package/packs/sre-oncall/skills/slo-spec/scripts/slo_math.py +449 -0
  212. package/packs/sre-oncall/skills/slo-spec/templates/slo-spec.md +35 -0
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "md-to-pptx",
3
+ "version": "0.1.0",
4
+ "description": "Turn an existing Markdown document (a status report, runbook, review or notes) into a PowerPoint deck (.pptx) that opens without a repair prompt, with nothing to install. Each heading becomes a slide, lists keep their nesting, tables become real PowerPoint tables, images are embedded, and comments become speaker notes. A section too long for one slide is split onto \"continued\" slides instead of shrinking the text, and the reply names every split, everything dropped, and any speaker note that would go out with the file. Use when the user says \"turn this markdown into slides\", \"make this report a PowerPoint\", \"convert the .md to pptx\", \"I need this as a deck for Thursday\", or \"export these notes to PowerPoint\".",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": {
7
+ "npm": [],
8
+ "pip": []
9
+ },
10
+ "env": {
11
+ "required": [],
12
+ "optional": []
13
+ },
14
+ "related": [
15
+ "brand-kit",
16
+ "deck-builder",
17
+ "file-to-markdown",
18
+ "md-to-docx",
19
+ "md-to-html",
20
+ "mermaid-render",
21
+ "slide-outliner"
22
+ ],
23
+ "handoff": [
24
+ {
25
+ "to": "mermaid-render",
26
+ "when": "the Markdown contains Mermaid diagram blocks",
27
+ "purpose": "Render each diagram to PNG so it is embedded on its slide instead of appearing as code.",
28
+ "fallback": "If mermaid-render is absent, leave the block as code, tell the user the diagram did not convert, and suggest exporting it to PNG from mermaid.live."
29
+ },
30
+ {
31
+ "to": "deck-builder",
32
+ "when": "the user wants the deck redesigned for an audience (charts, layouts, a narrative) rather than converted as written",
33
+ "purpose": "Design a persuasive deck from the content instead of mapping headings to slides.",
34
+ "fallback": "If deck-builder is absent, deliver the converted deck and say in one line that it follows the document's structure and has not been redesigned."
35
+ }
36
+ ],
37
+ "tags": [
38
+ "powerpoint",
39
+ "pptx",
40
+ "slides",
41
+ "markdown",
42
+ "convert"
43
+ ],
44
+ "permissions": {"network": [], "commands": [], "files": "named-paths", "notes": "Reads the Markdown file (or stdin), the images it names and an optional brand.json; writes only the .pptx path given with -o."},
45
+ "model": {
46
+ "tier": "light",
47
+ "rationale": "Mechanical conversion done by its script; the model only checks the outline maps to slides and reports what was dropped."
48
+ }
49
+ }
@@ -0,0 +1,139 @@
1
+ # md-to-pptx reference
2
+
3
+ How `scripts/md_to_pptx.py` maps Markdown to slides, so the output can be predicted and a
4
+ warning explained without reading the script.
5
+
6
+ ## What becomes what
7
+
8
+ | Markdown | In PowerPoint |
9
+ |---|---|
10
+ | `--title`, else the first `#` heading (when it is the first heading), else front matter `title:` | The title slide. Subtitle lines come from front matter `subtitle`, `author`, `presenter` and `date`, in that order, or from a single paragraph of 200 characters or fewer right under the `#` |
11
+ | Text between the `#` title and the first `##` (more than that one short paragraph) | A content slide titled with the deck title |
12
+ | `##` | A new slide on the *Title and Content* layout; the heading is the slide title |
13
+ | A later `#` with nothing under it before the next `##` | A section slide on the *Title Slide* layout |
14
+ | A later `#` with text under it | A content slide, like `##` |
15
+ | `###` to `######` | A bold line in the heading font and primary colour, kept with the item below it |
16
+ | `-` / `1.` lists, three levels | Bullets `•` `–` `◦`, numbers `1.` `a.` `i.`. A list starting at `3.` starts at 3. Level 4 and deeper are flattened to level 3, with a warning |
17
+ | `- [ ]`, `- [x]` | ☐ / ☒ before the item text |
18
+ | Paragraph | Body text, no bullet |
19
+ | `> quote` | Italic grey text, indented |
20
+ | Pipe table | A real table (`a:tbl`): shaded bold header row, banded rows, column alignment from the separator row |
21
+ | Fenced or indented code | A grey box in Consolas 14 pt, one paragraph per line |
22
+ | Local PNG / JPEG image | Embedded at its real size (from its DPI, 96 when none is stored), scaled down to fit and never up, centred, alt text kept as the picture description |
23
+ | `**bold**`, `*italic*`, `~~strike~~`, `` `code` `` | Bold, italic, strikethrough, Consolas |
24
+ | Links, `<https://…>`, bare URLs, `[text][ref]` | Clickable hyperlinks. `#heading-slug` jumps to the slide holding that heading |
25
+ | `---` | A new slide titled "<title> (continued)". Not reported as a split, because the author asked for it |
26
+ | `<!-- notes: ... -->` | Speaker notes for the slide the comment lands on. Several comments on one slide are joined |
27
+
28
+ **Why HTML comments for notes.** A comment is invisible when the Markdown is rendered, so it is
29
+ never content anyone meant the audience to read. A `Notes:` paragraph is ambiguous ("Notes:
30
+ figures exclude VAT"), so it stays on the slide and gets a warning. Put the comment right after
31
+ the heading to attach it to the first slide of a section that splits. One at the end lands on
32
+ the last continued slide.
33
+
34
+ ## Slide geometry and text sizes
35
+
36
+ 16:9 is 13.33 × 7.5 in; 4:3 is 10 × 7.5 in. Margins are 0.6 in at the sides. The title box sits
37
+ 0.35 to 1.35 in from the top; the body runs from 1.45 to 7.05 in.
38
+
39
+ | Text | Size | Left margin |
40
+ |---|---|---|
41
+ | Slide title | 32 pt bold, heading font | 0 |
42
+ | Paragraph, level 1 item | 20 pt | 0 / 0.375 in |
43
+ | Level 2 item | 18 pt | 0.75 in |
44
+ | Level 3 item | 16 pt | 1.1 in |
45
+ | Subheading (`###`) | 22 pt bold | 0 |
46
+ | Table cells, code | 14 pt | |
47
+
48
+ These are fixed. Nothing is shrunk to fit. The body placeholder carries `normAutofit` so a
49
+ user who edits the slide in PowerPoint gets PowerPoint's usual behaviour from then on.
50
+
51
+ ## How splitting decides
52
+
53
+ The script estimates each block's height: the number of wrapped lines, from the box width and
54
+ an average character width for the font (0.50 em for Calibri, Aptos and Segoe; 0.55 for Arial,
55
+ Georgia and most others; 0.60 for Verdana and Tahoma; 0.60 for code), times 1.2 × the font size,
56
+ plus the paragraph spacing. It packs blocks top to bottom into 96% of the body height and starts
57
+ a "(continued)" slide when the next block does not fit.
58
+
59
+ - **Text** splits between paragraphs or list items, never inside one. A subheading or a line
60
+ ending in `:` moves to the next slide with the item it introduces.
61
+ - **Tables** split between rows, with the header row repeated, at least two rows per slide, and
62
+ never one row left alone.
63
+ - **Code** splits between lines, at least three per slide, and never one or two left alone.
64
+ - **Images** shrink to the space left when at least 60% of their fitted size and 1.5 in remain;
65
+ otherwise they move to the next slide.
66
+ - **A single paragraph or table row taller than a slide** cannot split. It is placed alone and
67
+ overflows, with a warning: break it into bullets.
68
+ - **A slide title over two lines** gets a warning. Titles are not shrunk either.
69
+
70
+ The estimate is deliberately cautious, so a slide can end with spare space at the bottom. It
71
+ should not overflow. If one does in PowerPoint, the font substituted was wider than the brand
72
+ font: install the font, or add a `---` above the line where it should break.
73
+
74
+ ## Numbering
75
+
76
+ PowerPoint numbers list items itself, in order. The script carries the source's starting number
77
+ (`startAt`), keeps the count going across a continued slide, and keeps a run going past nested
78
+ items. A source that skips (`7.` then `9.`) shows `8.`, with a warning, because text that says
79
+ "go back to step 9" now points at a different step.
80
+
81
+ ## Brand
82
+
83
+ `--brand` reads these fields and ignores the rest. The file is the same `brand.json` that the
84
+ Word converter and brand-kit use.
85
+
86
+ | brand.json | Used for | Default |
87
+ |---|---|---|
88
+ | `fonts.heading.family` (or `fonts.heading` as a string) | Theme heading font: titles, subheadings | Calibri |
89
+ | `fonts.body.family` (or `fonts.body`) | Theme body font: text, tables | Calibri |
90
+ | `colors.primary` | Titles, subheadings, table header fill, bullet colour | `#1F3864` |
91
+ | `colors.accent` | The short rule under each slide title | `#2E75B6` |
92
+ | `colors.text` | Body text | `#222222` |
93
+
94
+ A colour that isn't a 6-digit hex code keeps the default, with a warning. A primary lighter
95
+ than 3:1 contrast on white puts titles in the text colour, with a warning. The header row text
96
+ is white or near-black, whichever reads better on the primary. Fonts are named in the theme,
97
+ not embedded: a machine without the font shows a substitute, so a web-only brand font falls
98
+ back on the presenter's laptop.
99
+
100
+ ## The package it writes
101
+
102
+ | Part | What it holds |
103
+ |---|---|
104
+ | `ppt/presentation.xml` | Slide list, slide size, notes size |
105
+ | `ppt/slideMasters/slideMaster1.xml` | Title and body placeholders, text styles for three list levels, the title rule |
106
+ | `ppt/slideLayouts/slideLayout1.xml`, `slideLayout2.xml` | *Title Slide* and *Title and Content* |
107
+ | `ppt/theme/theme1.xml` | Colours and fonts from the brand |
108
+ | `ppt/slides/slideN.xml` + `_rels` | Each slide, its images, hyperlinks and slide jumps |
109
+ | `ppt/notesMasters/notesMaster1.xml`, `ppt/theme/theme2.xml` | Only when a slide has notes |
110
+ | `ppt/notesSlides/notesSlideN.xml` + `_rels` | The notes for slide N |
111
+ | `ppt/media/imageN.png` / `.jpeg` | Embedded images, byte for byte, each stored once |
112
+ | `ppt/presProps.xml`, `viewProps.xml`, `tableStyles.xml` | Defaults PowerPoint expects |
113
+ | `docProps/core.xml`, `app.xml` | Title, created and modified time, slide and notes counts |
114
+
115
+ After writing, the script reopens the zip and checks that every XML part parses, every internal
116
+ relationship target exists, every `r:id` a part uses is defined, and every part has a content
117
+ type. A failure there exits 2 and is a bug in the script, not in the input.
118
+
119
+ ## What is dropped or changed, and why
120
+
121
+ | Construct | What happens | What to do instead |
122
+ |---|---|---|
123
+ | Raw HTML blocks, other HTML comments | Dropped | Rewrite as Markdown; HTML tables as pipe tables |
124
+ | Inline HTML tags | Tags removed, text kept; `<br>` becomes a line break | |
125
+ | Footnotes `[^1]` | Dropped | Fold the note into the sentence, or into the slide's notes |
126
+ | Mermaid blocks | Kept as code text | Render to PNG, then embed the image |
127
+ | Remote, missing, GIF, SVG, WebP images | Alt text in brackets instead | Download or convert to PNG next to the Markdown |
128
+ | An image inside a text paragraph | Placed below the paragraph | |
129
+ | An image inside a list item or table cell | Alt text instead | Move it to its own line |
130
+ | Code or a table inside a list item | Plain text in the item | Move it out of the list |
131
+ | Link to `#anchor` with no heading | Plain text | Fix the slug |
132
+ | Link to a local file | Kept as a link, with a warning | The file is not inside the deck; link a shared copy |
133
+ | YAML front matter | Not a slide | Its title fields go on the title slide |
134
+
135
+ ## Exit codes
136
+
137
+ `0` written (warnings may be printed); `1` bad input: file not found, not UTF-8, empty, binary,
138
+ output not ending in `.pptx`, output folder missing, or brand.json not a JSON object; `2` the
139
+ written file failed its own check.