skilldrop-cli 1.1.3 → 1.2.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 (105) hide show
  1. package/catalogue.json +7 -8
  2. package/model-routing.json +0 -16
  3. package/package.json +1 -1
  4. package/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +1 -1
  5. package/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +2 -2
  6. package/packs/converters/pack.json +3 -14
  7. package/packs/converters/skills/file-to-markdown/SKILL.md +28 -11
  8. package/packs/converters/skills/file-to-markdown/evals/evals.json +30 -0
  9. package/packs/converters/skills/file-to-markdown/evals/files/5/supplier_agreement_v3.docx +0 -0
  10. package/packs/converters/skills/file-to-markdown/evals/files/6/numbers.xlsx +0 -0
  11. package/packs/converters/skills/file-to-markdown/evals/files/6/offsite_q3.pptx +0 -0
  12. package/packs/converters/skills/file-to-markdown/examples/inputs/acme-brief.docx +0 -0
  13. package/packs/converters/skills/file-to-markdown/examples/inputs/northwind-roadmap.pptx +0 -0
  14. package/packs/converters/skills/file-to-markdown/examples/mixed-inputs.md +24 -16
  15. package/packs/converters/skills/file-to-markdown/manifest.json +2 -3
  16. package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +103 -10
  17. package/packs/converters/skills/md-to-confluence/SKILL.md +2 -2
  18. package/packs/converters/skills/md-to-confluence/manifest.json +2 -9
  19. package/packs/converters/skills/md-to-docx/SKILL.md +3 -4
  20. package/packs/converters/skills/md-to-docx/evals/evals.json +1 -1
  21. package/packs/converters/skills/md-to-docx/evals/files/1/brand/brand.json +1 -1
  22. package/packs/converters/skills/md-to-docx/manifest.json +4 -11
  23. package/packs/converters/skills/md-to-docx/reference.md +1 -1
  24. package/packs/converters/skills/md-to-docx/scripts/md_to_docx.py +1 -1
  25. package/packs/converters/skills/md-to-pptx/SKILL.md +3 -5
  26. package/packs/converters/skills/md-to-pptx/manifest.json +3 -16
  27. package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +1 -1
  28. package/packs/converters/skills/md-to-xlsx/SKILL.md +1 -1
  29. package/packs/converters/skills/md-to-xlsx/manifest.json +2 -2
  30. package/packs/core/skills/brief-intake/SKILL.md +2 -2
  31. package/packs/core/skills/brief-intake/manifest.json +2 -2
  32. package/packs/core/skills/brief-intake/templates/brief-deck.md +3 -3
  33. package/packs/core/skills/doc-critique/rubrics/deck.md +1 -1
  34. package/packs/design/pack.json +11 -21
  35. package/packs/design/skills/brand-kit/SKILL.md +6 -8
  36. package/packs/design/skills/brand-kit/manifest.json +3 -17
  37. package/packs/design/skills/brand-kit/templates/brand.json +1 -1
  38. package/packs/solution-architect/skills/interactive-diagram/SKILL.md +1 -1
  39. package/packs/solution-architect/skills/interactive-diagram/manifest.json +1 -2
  40. package/packs/stakeholder-comms/skills/audience-profile/SKILL.md +3 -3
  41. package/packs/stakeholder-comms/skills/audience-profile/manifest.json +2 -2
  42. package/packs/stakeholder-comms/skills/audience-profile/reference.md +1 -1
  43. package/packs/converters/skills/md-to-html/SKILL.md +0 -108
  44. package/packs/converters/skills/md-to-html/evals/eval_queries.json +0 -34
  45. package/packs/converters/skills/md-to-html/evals/evals.json +0 -44
  46. package/packs/converters/skills/md-to-html/evals/files/1/brand/brand.json +0 -80
  47. package/packs/converters/skills/md-to-html/evals/files/1/brand/logo-white.png +0 -0
  48. package/packs/converters/skills/md-to-html/evals/files/1/brand/logo.png +0 -0
  49. package/packs/converters/skills/md-to-html/evals/files/1/brand/mark.png +0 -0
  50. package/packs/converters/skills/md-to-html/evals/files/1/docs/q3-review.md +0 -35
  51. package/packs/converters/skills/md-to-html/evals/files/1/img/dashboard.png +0 -0
  52. package/packs/converters/skills/md-to-html/evals/files/2/brand.json +0 -13
  53. package/packs/converters/skills/md-to-html/evals/files/2/img/kick-net.png +0 -0
  54. package/packs/converters/skills/md-to-html/evals/files/2/river-survey-guide.md +0 -53
  55. package/packs/converters/skills/md-to-html/evals/files/3/nanas-lentil-soup.md +0 -21
  56. package/packs/converters/skills/md-to-html/evals/files/3/pot.png +0 -0
  57. package/packs/converters/skills/md-to-html/examples/inputs/chart.svg +0 -8
  58. package/packs/converters/skills/md-to-html/examples/inputs/ops-review.md +0 -48
  59. package/packs/converters/skills/md-to-html/examples/ops-review.md +0 -83
  60. package/packs/converters/skills/md-to-html/manifest.json +0 -43
  61. package/packs/converters/skills/md-to-html/reference.md +0 -70
  62. package/packs/converters/skills/md-to-html/scripts/md_to_html.py +0 -662
  63. package/packs/converters/skills/mermaid-render/SKILL.md +0 -117
  64. package/packs/converters/skills/mermaid-render/evals/eval_queries.json +0 -30
  65. package/packs/converters/skills/mermaid-render/evals/evals.json +0 -43
  66. package/packs/converters/skills/mermaid-render/evals/files/1/docs/contoso-orders.md +0 -23
  67. package/packs/converters/skills/mermaid-render/evals/files/2/dispensing-diagrams.md +0 -39
  68. package/packs/converters/skills/mermaid-render/examples/broken-diagrams.md +0 -147
  69. package/packs/converters/skills/mermaid-render/examples/inputs/broken-flowchart.mmd +0 -8
  70. package/packs/converters/skills/mermaid-render/examples/inputs/broken-sequence.mmd +0 -11
  71. package/packs/converters/skills/mermaid-render/examples/inputs/checkout-flow.mmd +0 -9
  72. package/packs/converters/skills/mermaid-render/examples/inputs/design-notes.md +0 -35
  73. package/packs/converters/skills/mermaid-render/examples/inputs/fixed-flowchart.mmd +0 -9
  74. package/packs/converters/skills/mermaid-render/examples/inputs/typo.mmd +0 -2
  75. package/packs/converters/skills/mermaid-render/manifest.json +0 -50
  76. package/packs/converters/skills/mermaid-render/reference.md +0 -70
  77. package/packs/converters/skills/mermaid-render/scripts/render_mermaid.py +0 -487
  78. package/packs/design/skills/deck-builder/SKILL.md +0 -209
  79. package/packs/design/skills/deck-builder/evals/eval_queries.json +0 -14
  80. package/packs/design/skills/deck-builder/evals/evals.json +0 -67
  81. package/packs/design/skills/deck-builder/evals/files/4/ashby-vale-board-notes.md +0 -36
  82. package/packs/design/skills/deck-builder/examples/exec-board-update.md +0 -108
  83. package/packs/design/skills/deck-builder/examples/templated-brand-deck.md +0 -148
  84. package/packs/design/skills/deck-builder/manifest.json +0 -18
  85. package/packs/design/skills/deck-builder/reference.md +0 -180
  86. package/packs/design/skills/deck-builder/requirements.txt +0 -3
  87. package/packs/design/skills/deck-builder/scripts/build_deck.py +0 -1144
  88. package/packs/design/skills/deck-builder/templates/deck-spec.json +0 -168
  89. package/packs/design/skills/deck-builder/templates/palettes.json +0 -59
  90. package/packs/design/skills/marketing-flyer/SKILL.md +0 -113
  91. package/packs/design/skills/marketing-flyer/evals/eval_queries.json +0 -30
  92. package/packs/design/skills/marketing-flyer/evals/evals.json +0 -45
  93. package/packs/design/skills/marketing-flyer/evals/files/1/brand/brand.json +0 -80
  94. package/packs/design/skills/marketing-flyer/evals/files/1/brand/logo-white.png +0 -0
  95. package/packs/design/skills/marketing-flyer/evals/files/1/brand/logo.png +0 -0
  96. package/packs/design/skills/marketing-flyer/evals/files/1/brand/mark.png +0 -0
  97. package/packs/design/skills/marketing-flyer/evals/files/2/brand.json +0 -14
  98. package/packs/design/skills/marketing-flyer/evals/files/2/larchfield-logo.svg +0 -4
  99. package/packs/design/skills/marketing-flyer/evals/files/2/manager-email.txt +0 -6
  100. package/packs/design/skills/marketing-flyer/evals/files/2/open-day-brief.md +0 -15
  101. package/packs/design/skills/marketing-flyer/examples/community-health-fair.md +0 -68
  102. package/packs/design/skills/marketing-flyer/manifest.json +0 -40
  103. package/packs/design/skills/marketing-flyer/reference.md +0 -54
  104. package/packs/design/skills/marketing-flyer/scripts/build_flyer.py +0 -332
  105. package/packs/design/skills/marketing-flyer/templates/flyer-spec.json +0 -26
@@ -1,209 +0,0 @@
1
- ---
2
- name: deck-builder
3
- description: Generate a real PowerPoint (.pptx) file from content, audience, and either a brand template or a color palette — with charts, tables and images, not only bullets. Slide count, density and layout are tuned to the audience: execs, boards, technical reviewers, sales prospects, investors, internal teams. Use when the user wants an actual editable .pptx rather than an outline, wants their corporate template or brand colours applied, or says "build the deck", "make it a pptx", "use our template".
4
- ---
5
-
6
- # deck-builder
7
-
8
- This skill produces an **actual editable `.pptx` file**, not an outline. It runs `python-pptx`
9
- to materialise slides — either on a brand template's own masters and layouts, or on the skill's
10
- built-in design in the user's brand: their colours, logo and fonts.
11
-
12
- It pairs with three others:
13
- - **[`brand-kit`](../brand-kit/SKILL.md)** — captures the brand once as a `brand.json` this skill reads, so nobody answers the brand questions for every deck
14
- - **[`audience-profile`](../../../stakeholder-comms/skills/audience-profile/SKILL.md)** — decides how dense, how many, which sections
15
- - **[`slide-outliner`](../slide-outliner/SKILL.md)** — drafts per-slide content before this skill builds it
16
-
17
- For a single fast pipeline, run all three in order: profile → outline → build.
18
-
19
- ## How to respond
20
-
21
- **Four rules come before the steps and outrank them:**
22
-
23
- - **Answer what was asked, first.** Open with the answer, the decision or the artifact, in plain words. Scores, matrices, frameworks and tags come after it, and anything that doesn't change the answer is cut.
24
- - **Use only what you were given.** Don't add facts, names, numbers, incidents, history, steps or sections the input doesn't contain. What you need and don't have is left out of the artifact and listed once at the end under "To confirm".
25
- - **Deliver from what you have.** When the request gives you something to work on, state your assumptions in a line and produce the result. When it gives you nothing to work on, ask for it in one or two plain sentences and say what you will do once you have it.
26
- - **Write for someone who has never heard of this skill.** No skill names, no paths or scripts from this folder, no internal terms, and nothing about how the run was set up. A next step is one plain sentence at the end that describes the work.
27
- - **For this skill:** Read "the deck" as an existing file: look for it, and if it isn't there, ask for it along with any content that is missing. Don't announce audience, format or palette choices before there is content to put on slides.
28
-
29
- ### 1. Run the setup block — once
30
-
31
- Ask everything in **one** message, with defaults already chosen, so the user can answer with a
32
- single line or say "go". Never trickle out four separate questions, and never generate a deck
33
- with the design silently defaulted.
34
-
35
- > Before I build, confirm these — reply "go" to take the defaults:
36
- > 1. **Audience** — `exec` · `board` · `technical` · `sales` · `internal` · `investor` · `partner` · `customer`
37
- > 2. **Format** — live presentation / read-ahead / async share, **how many minutes**, and **16:9** (default) or **4:3**
38
- > 3. **Brand** — the deck should look like it came from your team. Send any of:
39
- > - a **`brand.json`** from brand-kit, which covers everything below in one file;
40
- > - a **template**: path to a corporate `.pptx` / `.potx`, and the deck inherits its masters, fonts, colours, logo and slide size;
41
- > - your **logo** as a PNG (and a white version for dark slides), **brand colours** as hex values for `primary` / `secondary` / `accent` / `background` / `text`, and your **heading and body fonts**;
42
- > - or, with no brand, a named **palette**: `corporate-blue` (default for B2B) · `monochrome` · `vibrant` · `dark-mode` · `editorial` · `forest` · `sunset`
43
- > 4. **Anything to embed** — numbers to chart, a table, diagram PNGs
44
-
45
- Rules for reading the answers:
46
-
47
- - **Content is the one hard input.** If the user supplied only a topic, stop and ask for the
48
- material. Inventing the content is the easiest way to produce a bad deck.
49
- - **A free-form audience maps to the closest archetype** — "VP of Eng and their staff at a
50
- partner" → `technical`, stated out loud. Mixed audience → the least technical archetype, with
51
- the rest served by appendix slides.
52
- - **Time sets slide count**, not the other way round: 1.5–2 minutes per slide live. 30 minutes →
53
- 12–15 slides including cover and close.
54
- - **A partial brand palette gets completed**, using the rules in
55
- [`reference.md`](reference.md#color-palette-principles) — say which roles were filled in.
56
- - **Template beats palette** for chrome; the palette still colours charts, tables, big numbers
57
- and quote bars, so ask for brand hexes even when a template is supplied.
58
- - **Brand material beats a named palette.** If the user sent a logo or brand colours, never fall
59
- back to `corporate-blue`. If they have brand material but no `brand.json`, suggest running
60
- `brand-kit` first, so the next deck and any flyer match this one.
61
- - **Logos must be PNG or JPG.** PowerPoint can't place SVG or EPS: ask for a PNG export, and
62
- never build with the logo silently missing.
63
-
64
- **Non-interactive runs** (subagent, CI, headless): audience, format, time and palette degrade to
65
- `[assumption]` lines stated at the top of the response — default `exec`, live, 16:9,
66
- `corporate-blue`, or the `brand.json` when one is in the input. Never invent a logo or brand colour. Missing *content* does not degrade: emit `BLOCKED: need deck content
67
- (outline, doc, or point list)` and build nothing.
68
-
69
- ### 2. Plan the slide list against the audience archetype
70
-
71
- | Audience | Slide count | Density | Required sections |
72
- |---|---|---|---|
73
- | `exec` | 6–10 | Low — 3 bullets max | Ask • TL;DR • Business impact • Risks • Ask (closing) |
74
- | `board` | 8–12 | Low — big numbers | Cover • TL;DR • Strategic context • Financials • Risks • Ask |
75
- | `technical` | 12–20 | High — detail welcome | Context • Goals • Proposal (3–5) • Alternatives • Risks • Rollout |
76
- | `sales` | 8–12 | Story arc, visual | Hook • Pain • Solution • Proof • Pricing • Close |
77
- | `internal` | 5–10 | Mixed | Context • Proposal • Discussion topics • Action items |
78
- | `investor` | 10–15 | Polished, narrative | Problem • Market • Product • Traction • Team • Ask |
79
-
80
- Full archetype spec: [`audience-profile`](../../../stakeholder-comms/skills/audience-profile/SKILL.md). Slide-count budgets per
81
- format and time: [`reference.md`](reference.md#slide-count-budgets).
82
-
83
- ### 3. Build a deck spec
84
-
85
- A JSON document — full schema, with every layout and the template block, in
86
- [`templates/deck-spec.json`](templates/deck-spec.json):
87
-
88
- ```json
89
- {
90
- "title": "ProjectX Migration — Board Update",
91
- "audience": "board",
92
- "aspect": "16:9",
93
- "template": "./brand/acme-master.potx",
94
- "layout_map": { "title": "Title Slide", "content": "Title and Content" },
95
- "palette": { "primary": "#1A2A6C", "accent": "#FDBB2D" },
96
- "brand": "./brand/brand.json",
97
- "slides": [
98
- { "layout": "title", "title": "...", "subtitle": "...", "presenter": "...", "date": "..." },
99
- { "layout": "content", "title": "...", "bullets": ["..."], "notes": "..." },
100
- { "layout": "chart", "title": "...", "takeaway": "...", "chart": { "type": "column", "categories": ["..."], "series": [{ "name": "...", "values": [1, 2] }] }, "source": "..." },
101
- { "layout": "table", "title": "...", "columns": ["..."], "rows": [["..."]] },
102
- { "layout": "image", "title": "...", "image": "./diagram.png", "position": "right", "bullets": ["..."] },
103
- { "layout": "big_number", "title": "...", "number": "$24M", "caption": "ARR at risk" },
104
- { "layout": "closing", "title": "Approval requested", "subtitle": "..." }
105
- ]
106
- }
107
- ```
108
-
109
- Ten layouts: `title`, `section`, `content`, `two_column`, `big_number`, `quote`, `image`,
110
- `table`, `chart`, `closing`. Most slides are `content`; `chart`, `table` and `big_number` carry
111
- the evidence; `quote` and `image` break the rhythm. Which content shape earns which layout:
112
- [`reference.md`](reference.md#layout--content-matching).
113
-
114
- Every slide gets a `notes` field. Slide numbers appear automatically past 10 slides — override
115
- with `"slide_numbers": false`.
116
-
117
- ### 4. Build from the user's template when there is one
118
-
119
- A corporate template is the difference between a deck that gets presented and one that gets
120
- rebuilt by hand. When the user names one:
121
-
122
- ```bash
123
- # Claude Code — list the template's layouts first
124
- python3 "${CLAUDE_SKILL_DIR}/scripts/build_deck.py" --list-layouts ~/brand/acme-master.potx
125
-
126
- # Other IDEs (from the skill folder)
127
- python3 scripts/build_deck.py --list-layouts ~/brand/acme-master.potx
128
- ```
129
-
130
- Map each logical layout to one of the printed names in `layout_map`, then build. The template's
131
- masters, theme fonts, colours, logos and slide size are inherited; any sample slides it ships
132
- with are dropped. A logical layout left out of the map falls back to the skill's built-in
133
- design on the template's blank layout — acceptable for `big_number` or `quote`, wrong for
134
- `title` and `content`, which is where the branding shows.
135
-
136
- `.potx` and `.pptx` both work. Templates carry no charts or tables of their own, so those are
137
- drawn into whatever content region the mapped layout defines.
138
-
139
- ### 5. Run the build script
140
-
141
- ```bash
142
- # Claude Code
143
- python3 "${CLAUDE_SKILL_DIR}/scripts/build_deck.py" /tmp/deck-spec.json -o ./out/deck.pptx
144
-
145
- # Other IDEs (from the skill folder)
146
- cd path/to/deck-builder && python3 scripts/build_deck.py /tmp/deck-spec.json -o ./out/deck.pptx
147
- ```
148
-
149
- Add `--brand ./brand/brand.json` to build in the user's brand (or set `"brand"` in the spec).
150
- The brand fills whatever the spec leaves out: palette colours, the template, logo files and
151
- fonts. On the built-in design the logo goes on every slide: large on the cover, small in the
152
- lower-left corner elsewhere, and the on-dark version on dark section and closing slides. The
153
- brand's heading and body fonts are applied to titles, text, tables and charts. A template
154
- already carries its own logo and fonts, so they come from the template instead.
155
-
156
- Add `--strict` to fail the build on a missing or unreadable image instead of drawing a
157
- placeholder box — use it in CI, not in a conversation.
158
-
159
- **Read the warnings.** The script degrades rather than crashing: a missing image, a short data
160
- series, an unresolvable template layout each produce a warning and a visible fallback. Report
161
- every warning to the user with the file path; never present a deck with an unexplained
162
- placeholder box in it.
163
-
164
- ### 6. Recommend the refinement pass
165
-
166
- A generated deck is a strong first draft. Always tell the user to:
167
-
168
- - Review the speaker notes — the agent wrote them, and they get read aloud
169
- - Replace any placeholder box with the real diagram
170
- - Do one audience pass: read every slide title in order, does the *narrative* land for that audience?
171
- - Run [`doc-critique`](../../../core/skills/doc-critique/SKILL.md) against the deck rubric before it goes out
172
-
173
- ## Useful references
174
-
175
- - [`reference.md`](reference.md) — palette principles, layout-vs-content matching, chart and table rules, density and slide-count budgets
176
- - [`templates/deck-spec.json`](templates/deck-spec.json) — full JSON schema with every layout and the template block
177
- - [`templates/palettes.json`](templates/palettes.json) — the seven presets
178
- - [`examples/exec-board-update.md`](examples/exec-board-update.md) — worked example: brief → spec → deck
179
- - [`examples/templated-brand-deck.md`](examples/templated-brand-deck.md) — worked example: corporate `.potx` → layout map → deck
180
- - [`scripts/build_deck.py`](scripts/build_deck.py) — the generator (don't edit unless adding a layout)
181
-
182
- ## Quality bar
183
-
184
- - **Design is chosen by the user, never silently defaulted** — a `brand.json`, a template, brand colours and logo, or a named palette, confirmed in the setup block.
185
- - **The user's brand shows on every slide** — their logo (PNG) and colours, and their fonts when they gave them. A deck built from brand material that comes out in `corporate-blue` has failed.
186
- - **A supplied template is actually inherited** — `layout_map` covers `title`, `section`, `content` and `closing` at minimum. A branded deck rendered on the blank layout has thrown away the branding.
187
- - **Title slide isn't blank** — real title, subtitle, presenter, date.
188
- - **Numbers are charted, not bulleted** — three or more comparable figures belong in a `chart` or a `table`, not a bullet list.
189
- - **Every chart and table cites its `source`** and uses only figures from the user's material.
190
- - **Bullet density matches audience** — `exec`, *3 bullets max*, period. `technical`, up to 6 when the content needs it.
191
- - **Speaker notes on every slide** — even one sentence.
192
- - **Section dividers used sparingly** — at most one every 4–5 content slides.
193
- - **Zero unexplained warnings** — every warning the script emits is fixed or reported to the user.
194
- - **Colour is consistent** — palette roles only, no stray colours; text-on-background contrast ≥ 4.5:1.
195
-
196
- ## Anti-patterns to avoid
197
-
198
- - ❌ Ignoring a template the user already named, or asking for a palette after they supplied one. The template is the answer to "what should this look like".
199
- - ❌ Asking for brand colours when a `brand.json` was supplied, or building without the logo because it was an SVG. Ask for a PNG export instead.
200
- - ❌ Mapping every logical layout onto the template's one title-and-bullets layout. That is a branded deck that still looks generated.
201
- - ❌ Generating without confirming audience. The same content for execs and engineers is a different deck.
202
- - ❌ Inventing a statistic to fill a `big_number`, or a series to fill a chart. No source, no chart.
203
- - ❌ A table with 20 rows. Over ~12 it is an appendix or a spreadsheet, not a slide.
204
- - ❌ Passing an SVG or EMF diagram to `image` — `python-pptx` reads raster only. Convert to PNG first.
205
- - ❌ Shipping the deck with a grey placeholder box still in it because the warning went unread.
206
- - ❌ Defaulting to bullets when a `big_number`, `chart`, `quote` or `two_column` would land harder.
207
- - ❌ More than ~20 slides for any audience. If the point needs 21, the deck is the wrong format.
208
- - ❌ **Showing the machinery.** The reply and the artifact are for the person who asked. Don't mention this skill, its files, templates, caps or internal terms, or that the run is non-interactive. Name another skill once, at the end, as a suggested next step, never inside the artifact.
209
- - ❌ **A bare `BLOCKED` line.** Keep the `BLOCKED: need <X>` line, then write for a person: what is missing in plain words, what you will produce once you have it, and anything the request already lets you say.
@@ -1,14 +0,0 @@
1
- [
2
- { "query": "Build me a PowerPoint from this content", "should_trigger": true },
3
- { "query": "Generate a .pptx deck for this exec presentation", "should_trigger": true },
4
- { "query": "Turn this into actual slides I can present, with our brand colors", "should_trigger": true },
5
- { "query": "I need a real deck file, not an outline", "should_trigger": true },
6
- { "query": "Build the deck on our corporate template — marketing rejects anything else", "should_trigger": true },
7
- { "query": "Use our .potx master for this QBR deck", "should_trigger": true },
8
- { "query": "Put these quarterly numbers on a slide as a chart", "should_trigger": true },
9
- { "query": "Just outline the slides — I'll build the deck myself", "should_trigger": false },
10
- { "query": "Write a one-page summary for executives", "should_trigger": false },
11
- { "query": "Which audience archetype should I target and what are its rules?", "should_trigger": false },
12
- { "query": "Critique the deck I already made", "should_trigger": false },
13
- { "query": "Extract the text out of this existing .pptx so I can email it", "should_trigger": false }
14
- ]
@@ -1,67 +0,0 @@
1
- {
2
- "skill_name": "deck-builder",
3
- "evals": [
4
- {
5
- "id": 1,
6
- "prompt": "Build a .pptx from this content for an exec audience, using our brand palette (navy/white).",
7
- "assertions": [
8
- "A real .pptx file is produced, not an outline",
9
- "Audience, format and design are confirmed in a single setup block rather than as a trickle of separate questions",
10
- "The title slide carries a real title, subtitle, presenter, and date — never left blank",
11
- "Section dividers appear sparingly, at most one every 4-5 content slides",
12
- "Big-number layouts use only numbers the user supplied; no statistic is invented for emphasis",
13
- "Bullet density matches the stated audience rather than a fixed default",
14
- "The requested palette is applied rather than the default theme"
15
- ]
16
- },
17
- {
18
- "id": 2,
19
- "prompt": "Build the Q3 QBR deck on our corporate template at ~/brand/acme-master.potx — 25 minutes, live, partner audience.",
20
- "assertions": [
21
- "The template's layouts are listed with --list-layouts before the spec is written, rather than layout names being guessed",
22
- "The spec sets `template` and a `layout_map` covering at least title, section, content and closing",
23
- "A palette is still collected, because the template does not colour charts, tables or big numbers",
24
- "`aspect` is not fought with — the template's own slide size is accepted and stated",
25
- "Slide count is derived from the 25-minute budget at roughly 2 minutes per slide"
26
- ]
27
- },
28
- {
29
- "id": 3,
30
- "prompt": "Here are our renewal rates for the last three quarters (88%, 91%, 94%) and the SLA table from the contract. Put them in the deck.",
31
- "assertions": [
32
- "The three comparable figures become a `chart` slide, not a bullet list",
33
- "The chart carries a `takeaway` sentence and a `source`",
34
- "The SLA data becomes a `table` slide rather than aligned bullets",
35
- "No figure appears that the user did not supply",
36
- "Any build warning (missing image, short series) is reported to the user with its path rather than left in the file"
37
- ]
38
- },
39
- {
40
- "id": 4,
41
- "held_out": "2026-10-18",
42
- "prompt": "Build the November board deck from ashby-vale-board-notes.md as a PowerPoint and save it as ashby-vale-board-nov.pptx. Everything you need should be in the notes.",
43
- "assertions": [
44
- "Writes ashby-vale-board-nov.pptx, a valid PowerPoint file with no more than 6 slides",
45
- "It states the decision the board is asked to make (approve drawing £250,000 from the loan facility to start Tanner's Yard in January 2027) clearly, not buried in a later bullet",
46
- "It notices the notes disagree on how many Furlong Close homes are let (14 versus 12 of 14) and does not put either figure on a slide as settled without flagging it",
47
- "It notices the net surplus (£89,650) does not match the lines above it (£85,650) and does not present the stated total as checked fact without flagging it",
48
- "It does not make up five years of arrears data: it shows only 2024 to 2026 and tells the user the five-year trend the treasurer asked for cannot be drawn from the notes",
49
- "At least some of the figures (finance or arrears) appear as a chart or table in the deck, as the notes ask, rather than only as bullet text",
50
- "It does not invent figures, names, dates or achievements that are not in the notes"
51
- ]
52
- },
53
- {
54
- "id": 5,
55
- "held_out": "2026-10-18",
56
- "prompt": "need a powerpoint for the PTA meeting on thursday about the playground fundraiser. 3 slides max. we've raised £2,340 so far out of the £5,000 target, the bake sale did best, and we still want to do a sponsored walk in spring but haven't picked a date. can you do it?",
57
- "assertions": [
58
- "Writes a .pptx file with no more than 3 slides",
59
- "The figures are right: £2,340 raised of a £5,000 target, and any figure it works out is correct (£2,660 still to raise, about 47%)",
60
- "It says the bake sale did best without making up how much it raised or what other events raised",
61
- "The sponsored walk is shown as planned for spring with the date still to be decided; no date is invented",
62
- "It does not invent other facts such as the school's name, people's names, numbers of families or deadlines",
63
- "It delivers the file without asking questions first, and the reply is short and in plain words"
64
- ]
65
- }
66
- ]
67
- }
@@ -1,36 +0,0 @@
1
- # Ashby Vale Community Land Trust: notes for the November board
2
-
3
- Board meets Thursday 26 November 2026. **6 slides maximum**, the chair is strict about this.
4
- The board likes to see numbers as charts or tables, not paragraphs.
5
- Use our colours: deep green #24553A, stone #E8E1D3, terracotta #B5562F.
6
-
7
- ## Homes
8
- - Phase 1 at Furlong Close: 14 homes completed and let (as of 31 October).
9
- - Phase 2 at Tanner's Yard (9 homes): planning approved in September, build not started.
10
-
11
- ## Lettings officer update
12
- 12 of the 14 Furlong Close homes are let. Two are awaiting tenants after the first nominees withdrew.
13
-
14
- ## Finance (year to 31 October)
15
-
16
- | Line | £ |
17
- |---|---:|
18
- | Rent income | 96,400 |
19
- | Grant (Vale Housing Fund) | 40,000 |
20
- | Maintenance | -18,250 |
21
- | Loan interest | -22,700 |
22
- | Admin and insurance | -9,800 |
23
- | **Net surplus** | **89,650** |
24
-
25
- ## Rent arrears (% of rent due, at 31 October)
26
-
27
- | Year | Arrears |
28
- |---|---:|
29
- | 2024 | 2.1% |
30
- | 2025 | 3.4% |
31
- | 2026 | 4.8% |
32
-
33
- The treasurer has asked for a five-year arrears trend chart.
34
-
35
- ## Decision needed
36
- Board to approve drawing £250,000 from the Vale Housing Fund loan facility so the Tanner's Yard build can start in January 2027.
@@ -1,108 +0,0 @@
1
- # Example: Quarterly board update for a migration project
2
-
3
- **Prompt the user gave:** *"Build me a board update deck for our migration project. We're 60% through, on track for Q1 close, $2.4M annualised infra savings so far, but we discovered two services need a schema rewrite and we now have a multi-region regulatory requirement. We're asking for a $620k budget overrun. Use corporate-blue palette."*
4
-
5
- ## Step 1 — Audience archetype lookup
6
-
7
- Board update → use `audience-profile.board` archetype:
8
-
9
- - **Slide count target:** 8–12
10
- - **Bullet density:** ≤ 3 bullets/slide, ≤ 6 words/bullet
11
- - **Required sections:** Cover, TL;DR, Strategic context, Financials, Risks, Ask
12
- - **Tone:** Outcomes-led, business-first, big numbers welcome
13
- - **Layouts to favour:** `big_number` (for the $2.4M and the $620k), `quote` (for credibility), `two_column` (for scope changes)
14
-
15
- ## Step 2 — Build the deck spec
16
-
17
- ```json
18
- {
19
- "title": "ProjectX Migration — Board Update",
20
- "audience": "board",
21
- "palette": "corporate-blue",
22
-
23
- "slides": [
24
- {
25
- "layout": "title",
26
- "title": "ProjectX Migration",
27
- "subtitle": "Board update — Q3 FY26",
28
- "presenter": "John Doe",
29
- "date": "2026-09-15",
30
- "notes": "Open with: 'We're 60% through, on track, and asking for an overrun. Here's why it's still a good deal.'"
31
- },
32
- {
33
- "layout": "content",
34
- "title": "60% complete, zero customer incidents, on track for Q1 close",
35
- "bullets": [
36
- "8 of 14 services cut over",
37
- "p99 latency down 22% on migrated services",
38
- "Two services moved to phase 3 — schema rewrite"
39
- ],
40
- "notes": "Lead with zero incidents. Boards remember that more than any other number on this slide."
41
- },
42
- {
43
- "layout": "big_number",
44
- "title": "Annualised infra savings already realised",
45
- "number": "$2.4M",
46
- "caption": "From the 8 migrated services. Projected $5.8M at completion.",
47
- "notes": "Pause. Let the number land. Don't rush to the next slide."
48
- },
49
- {
50
- "layout": "two_column",
51
- "title": "What changed since the original plan",
52
- "left": {
53
- "title": "Original scope",
54
- "bullets": ["14 services migrated", "Single-region active", "Legacy DB decommissioned"]
55
- },
56
- "right": {
57
- "title": "Discovered in flight",
58
- "bullets": ["Schema rewrite for 2 services", "Multi-region (EU regulator)", "Auth refactor coupling"]
59
- },
60
- "notes": "Multi-region is a regulator change, not a planning miss. Say so explicitly."
61
- },
62
- {
63
- "layout": "quote",
64
- "quote": "The migration went smoother than any I've seen in 20 years.",
65
- "attribution": "VP Engineering, post phase-2 cut-over",
66
- "notes": "Optional, but de-risks the perception that we're behind."
67
- },
68
- {
69
- "layout": "content",
70
- "title": "Top 3 risks for the remaining 40%",
71
- "bullets": [
72
- "Schema rewrite: 6 weeks, dry-runs underway",
73
- "Auth refactor coupling: increases coordination overhead",
74
- "Holiday freeze: -4 calendar weeks"
75
- ],
76
- "notes": "Don't soften the risks. Boards trust presenters who name them."
77
- },
78
- {
79
- "layout": "big_number",
80
- "title": "Budget overrun we're requesting",
81
- "number": "$620k",
82
- "caption": "Covers schema rewrite + multi-region buildout. Payback: < 8 months.",
83
- "notes": "Position the overrun against the $5.8M projected savings — net positive within the same fiscal year."
84
- },
85
- {
86
- "layout": "closing",
87
- "title": "Approval requested: $620k FY26 budget overrun",
88
- "subtitle": "Decision needed by 2026-10-01 to keep Q1 close",
89
- "notes": "Land here. Take questions. Don't add a thank-you slide."
90
- }
91
- ]
92
- }
93
- ```
94
-
95
- ## Step 3 — Generate
96
-
97
- ```bash
98
- python3 scripts/build_deck.py /tmp/board-update.json -o ./out/board-update.pptx
99
- ```
100
-
101
- ## Step 4 — Hand-off to the user
102
-
103
- > Generated `out/board-update.pptx` — 8 slides, corporate-blue palette. Two notes before you present:
104
- >
105
- > 1. **Verify the speaker notes** — I wrote them based on the content you gave me. Read through and adjust your phrasing.
106
- > 2. **Replace the slide 5 quote** — I used a placeholder attribution. If you have the actual quote (and clearance to use it), paste it in slide 5.
107
- >
108
- > Want me to also produce an exec-summary one-pager from the same content?
@@ -1,148 +0,0 @@
1
- # Example: Q3 partner QBR on the company's own PowerPoint template
2
-
3
- **Prompt the user gave:** *"Make the Q3 QBR deck for Northwind. Use our corporate template at
4
- `~/brand/acme-master.potx` — it's mandatory, marketing rejects anything else. 25 minutes, live,
5
- with the partner's CTO and two of their architects in the room. Renewal rate went 88 → 91 → 94%
6
- over the last three quarters, ticket volume is down 31%, and we want to land the co-sell
7
- expansion ask. Brand colours are #0B3D6B and #E8A33D."*
8
-
9
- ## Step 1 — Setup block, answered in one pass
10
-
11
- | Input | Value | How it was resolved |
12
- |---|---|---|
13
- | Content | Renewal trend, ticket volume, expansion ask | Supplied |
14
- | Audience | `partner` | Stated ("partner's CTO and architects") |
15
- | Format | Live, 25 min → 12–14 slides | Stated; slide count derived at ~2 min/slide |
16
- | Aspect | From the template | `aspect` ignored — the `.potx` is 16:9 |
17
- | Design | `~/brand/acme-master.potx` + brand hexes | Template for chrome, palette for charts |
18
- | Embeds | Renewal trend (chart), SLA table | Three comparable figures ⇒ chart, not bullets |
19
-
20
- The palette is still collected: the template does not colour charts, tables or big numbers.
21
- `primary: #0B3D6B`, `accent: #E8A33D`; `secondary`, `background` and `text` derived per
22
- [`reference.md`](../reference.md#color-palette-principles) and called out to the user.
23
-
24
- ## Step 2 — Read the template's layouts before writing the spec
25
-
26
- ```bash
27
- python3 "${CLAUDE_SKILL_DIR}/scripts/build_deck.py" --list-layouts ~/brand/acme-master.potx
28
- ```
29
-
30
- ```
31
- acme-master.potx — slide size 13.33in x 7.50in
32
- [0] Acme Cover
33
- [1] Acme Section Break
34
- [2] Acme Title and Body
35
- [3] Acme Two Column
36
- [4] Acme Statement
37
- [5] Acme Full Bleed Image
38
- [6] Blank
39
- ```
40
-
41
- The names are the template's, not PowerPoint's defaults — which is exactly why the map is read
42
- from the file rather than guessed.
43
-
44
- ## Step 3 — The deck spec
45
-
46
- ```json
47
- {
48
- "title": "Northwind QBR — Q3 FY26",
49
- "audience": "partner",
50
- "template": "~/brand/acme-master.potx",
51
- "layout_map": {
52
- "title": "Acme Cover",
53
- "section": "Acme Section Break",
54
- "content": "Acme Title and Body",
55
- "two_column": "Acme Two Column",
56
- "big_number": "Acme Statement",
57
- "quote": "Acme Statement",
58
- "chart": "Acme Statement",
59
- "table": "Acme Statement",
60
- "image": "Acme Full Bleed Image",
61
- "closing": "Acme Statement"
62
- },
63
- "palette": {
64
- "primary": "#0B3D6B",
65
- "secondary": "#4A6E94",
66
- "accent": "#E8A33D",
67
- "background": "#FFFFFF",
68
- "text": "#222222"
69
- },
70
- "slides": [
71
- {
72
- "layout": "title",
73
- "title": "Northwind × Acme — Q3 business review",
74
- "subtitle": "Renewals, service quality, and the FY27 co-sell ask",
75
- "presenter": "Jane Roe, Partner Director",
76
- "date": "2026-09-30",
77
- "notes": "Thank them for the quarter before the first slide. Name the ask now so it isn't a surprise at slide 12."
78
- },
79
- {
80
- "layout": "chart",
81
- "title": "Renewal rate has climbed every quarter this year",
82
- "takeaway": "Three consecutive quarters of improvement — the joint success plan is what changed.",
83
- "chart": {
84
- "type": "line",
85
- "categories": ["Q1 FY26", "Q2 FY26", "Q3 FY26"],
86
- "series": [{ "name": "Renewal rate (%)", "values": [88, 91, 94] }],
87
- "number_format": "0\"%\""
88
- },
89
- "source": "Northwind CS dashboard, 30 Sep 2026",
90
- "notes": "Let them claim the win — ask their CTO what drove Q2. The answer is usually the thing to double down on in FY27."
91
- },
92
- {
93
- "layout": "big_number",
94
- "title": "Support load is down as adoption is up",
95
- "number": "-31%",
96
- "caption": "Ticket volume vs. Q3 FY25, on 2.4× the seat count",
97
- "notes": "The pairing is the point: more users, fewer tickets. Pause after saying it."
98
- },
99
- {
100
- "layout": "table",
101
- "title": "SLA performance against contract",
102
- "columns": ["Metric", "Contracted", "Q3 actual", "Status"],
103
- "rows": [
104
- ["Availability", "99.9%", "99.97%", "Met"],
105
- ["P1 response", "15 min", "9 min", "Met"],
106
- ["P1 resolution", "4 hrs", "3h 10m", "Met"],
107
- ["Change failure", "< 5%", "6.2%", "Missed"]
108
- ],
109
- "caption": "Change-failure remediation plan on the next slide.",
110
- "notes": "Do not skip the missed row. Naming it before they do is what makes the other three credible."
111
- },
112
- {
113
- "layout": "closing",
114
- "title": "Ask: co-sell motion for FY27, two named accounts each",
115
- "subtitle": "Kick-off 15 Oct, joint pipeline review monthly",
116
- "notes": "Land on the ask. Get the kick-off date agreed in the room, not in follow-up email."
117
- }
118
- ]
119
- }
120
- ```
121
-
122
- *(Abridged — the full deck is 13 slides; the four above are the ones that show the new layouts.)*
123
-
124
- ## Step 4 — Build
125
-
126
- ```bash
127
- python3 "${CLAUDE_SKILL_DIR}/scripts/build_deck.py" /tmp/northwind-qbr.json -o ./out/northwind-qbr.pptx
128
- ```
129
-
130
- ```
131
- template: dropped 2 sample slide(s), kept masters and layouts
132
- wrote ./out/northwind-qbr.pptx (13 slides, template)
133
- ```
134
-
135
- No warnings, so nothing to report. Had the SLA table's diagram been an `.svg`, the build would
136
- have drawn a placeholder box and warned — which gets reported to the user with the path, not
137
- quietly shipped.
138
-
139
- ## What the template bought
140
-
141
- | Without the template | With it |
142
- |---|---|
143
- | Calibri, generated-looking cover | Acme's typeface, cover, and logo on every slide |
144
- | Palette-coloured title bars | The master's own chrome |
145
- | Marketing sends it back | Passes brand review unchanged |
146
-
147
- The palette still did real work: the line chart, the `-31%`, and the table header are brand
148
- colours because `palette` was collected *alongside* the template, not instead of it.
@@ -1,18 +0,0 @@
1
- {
2
- "name": "deck-builder",
3
- "version": "0.3.4",
4
- "description": "Generate a real PowerPoint (.pptx) file from content, audience, and either a brand template or a color palette — with charts, tables and images, not only bullets. Slide count, density and layout are tuned to the audience: execs, boards, technical reviewers, sales prospects, investors, internal teams. Use when the user wants an actual editable .pptx rather than an outline, wants their corporate template or brand colours applied, or says \"build the deck\", \"make it a pptx\", \"use our template\".",
5
- "entrypoint": "SKILL.md",
6
- "deps": {
7
- "npm": [],
8
- "pip": ["python-pptx==1.0.2"]
9
- },
10
- "env": { "required": [], "optional": [] },
11
- "related": ["brand-kit", "audience-profile", "slide-outliner", "doc-critique"],
12
- "install": {
13
- "pip": "python3 -m pip install -r requirements.txt"
14
- },
15
- "tags": ["powerpoint", "pptx", "deck", "presentation", "template", "charts", "stakeholder-communication"],
16
- "permissions": {"network": [], "commands": [], "files": "named-paths", "notes": "Needs the python-pptx package (declared in deps)."},
17
- "model": { "tier": "standard", "rationale": "Shapes content, maps a brand template's layouts, and runs a script. Judgment, not hard reasoning." }
18
- }