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.
- package/catalogue.json +7 -8
- package/model-routing.json +0 -16
- package/package.json +1 -1
- package/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +1 -1
- package/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +2 -2
- package/packs/converters/pack.json +3 -14
- package/packs/converters/skills/file-to-markdown/SKILL.md +28 -11
- package/packs/converters/skills/file-to-markdown/evals/evals.json +30 -0
- package/packs/converters/skills/file-to-markdown/evals/files/5/supplier_agreement_v3.docx +0 -0
- package/packs/converters/skills/file-to-markdown/evals/files/6/numbers.xlsx +0 -0
- package/packs/converters/skills/file-to-markdown/evals/files/6/offsite_q3.pptx +0 -0
- package/packs/converters/skills/file-to-markdown/examples/inputs/acme-brief.docx +0 -0
- package/packs/converters/skills/file-to-markdown/examples/inputs/northwind-roadmap.pptx +0 -0
- package/packs/converters/skills/file-to-markdown/examples/mixed-inputs.md +24 -16
- package/packs/converters/skills/file-to-markdown/manifest.json +2 -3
- package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +103 -10
- package/packs/converters/skills/md-to-confluence/SKILL.md +2 -2
- package/packs/converters/skills/md-to-confluence/manifest.json +2 -9
- package/packs/converters/skills/md-to-docx/SKILL.md +3 -4
- package/packs/converters/skills/md-to-docx/evals/evals.json +1 -1
- package/packs/converters/skills/md-to-docx/evals/files/1/brand/brand.json +1 -1
- package/packs/converters/skills/md-to-docx/manifest.json +4 -11
- package/packs/converters/skills/md-to-docx/reference.md +1 -1
- package/packs/converters/skills/md-to-docx/scripts/md_to_docx.py +1 -1
- package/packs/converters/skills/md-to-pptx/SKILL.md +3 -5
- package/packs/converters/skills/md-to-pptx/manifest.json +3 -16
- package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +1 -1
- package/packs/converters/skills/md-to-xlsx/SKILL.md +1 -1
- package/packs/converters/skills/md-to-xlsx/manifest.json +2 -2
- package/packs/core/skills/brief-intake/SKILL.md +2 -2
- package/packs/core/skills/brief-intake/manifest.json +2 -2
- package/packs/core/skills/brief-intake/templates/brief-deck.md +3 -3
- package/packs/core/skills/doc-critique/rubrics/deck.md +1 -1
- package/packs/design/pack.json +11 -21
- package/packs/design/skills/brand-kit/SKILL.md +6 -8
- package/packs/design/skills/brand-kit/manifest.json +3 -17
- package/packs/design/skills/brand-kit/templates/brand.json +1 -1
- package/packs/solution-architect/skills/interactive-diagram/SKILL.md +1 -1
- package/packs/solution-architect/skills/interactive-diagram/manifest.json +1 -2
- package/packs/stakeholder-comms/skills/audience-profile/SKILL.md +3 -3
- package/packs/stakeholder-comms/skills/audience-profile/manifest.json +2 -2
- package/packs/stakeholder-comms/skills/audience-profile/reference.md +1 -1
- package/packs/converters/skills/md-to-html/SKILL.md +0 -108
- package/packs/converters/skills/md-to-html/evals/eval_queries.json +0 -34
- package/packs/converters/skills/md-to-html/evals/evals.json +0 -44
- package/packs/converters/skills/md-to-html/evals/files/1/brand/brand.json +0 -80
- package/packs/converters/skills/md-to-html/evals/files/1/brand/logo-white.png +0 -0
- package/packs/converters/skills/md-to-html/evals/files/1/brand/logo.png +0 -0
- package/packs/converters/skills/md-to-html/evals/files/1/brand/mark.png +0 -0
- package/packs/converters/skills/md-to-html/evals/files/1/docs/q3-review.md +0 -35
- package/packs/converters/skills/md-to-html/evals/files/1/img/dashboard.png +0 -0
- package/packs/converters/skills/md-to-html/evals/files/2/brand.json +0 -13
- package/packs/converters/skills/md-to-html/evals/files/2/img/kick-net.png +0 -0
- package/packs/converters/skills/md-to-html/evals/files/2/river-survey-guide.md +0 -53
- package/packs/converters/skills/md-to-html/evals/files/3/nanas-lentil-soup.md +0 -21
- package/packs/converters/skills/md-to-html/evals/files/3/pot.png +0 -0
- package/packs/converters/skills/md-to-html/examples/inputs/chart.svg +0 -8
- package/packs/converters/skills/md-to-html/examples/inputs/ops-review.md +0 -48
- package/packs/converters/skills/md-to-html/examples/ops-review.md +0 -83
- package/packs/converters/skills/md-to-html/manifest.json +0 -43
- package/packs/converters/skills/md-to-html/reference.md +0 -70
- package/packs/converters/skills/md-to-html/scripts/md_to_html.py +0 -662
- package/packs/converters/skills/mermaid-render/SKILL.md +0 -117
- package/packs/converters/skills/mermaid-render/evals/eval_queries.json +0 -30
- package/packs/converters/skills/mermaid-render/evals/evals.json +0 -43
- package/packs/converters/skills/mermaid-render/evals/files/1/docs/contoso-orders.md +0 -23
- package/packs/converters/skills/mermaid-render/evals/files/2/dispensing-diagrams.md +0 -39
- package/packs/converters/skills/mermaid-render/examples/broken-diagrams.md +0 -147
- package/packs/converters/skills/mermaid-render/examples/inputs/broken-flowchart.mmd +0 -8
- package/packs/converters/skills/mermaid-render/examples/inputs/broken-sequence.mmd +0 -11
- package/packs/converters/skills/mermaid-render/examples/inputs/checkout-flow.mmd +0 -9
- package/packs/converters/skills/mermaid-render/examples/inputs/design-notes.md +0 -35
- package/packs/converters/skills/mermaid-render/examples/inputs/fixed-flowchart.mmd +0 -9
- package/packs/converters/skills/mermaid-render/examples/inputs/typo.mmd +0 -2
- package/packs/converters/skills/mermaid-render/manifest.json +0 -50
- package/packs/converters/skills/mermaid-render/reference.md +0 -70
- package/packs/converters/skills/mermaid-render/scripts/render_mermaid.py +0 -487
- package/packs/design/skills/deck-builder/SKILL.md +0 -209
- package/packs/design/skills/deck-builder/evals/eval_queries.json +0 -14
- package/packs/design/skills/deck-builder/evals/evals.json +0 -67
- package/packs/design/skills/deck-builder/evals/files/4/ashby-vale-board-notes.md +0 -36
- package/packs/design/skills/deck-builder/examples/exec-board-update.md +0 -108
- package/packs/design/skills/deck-builder/examples/templated-brand-deck.md +0 -148
- package/packs/design/skills/deck-builder/manifest.json +0 -18
- package/packs/design/skills/deck-builder/reference.md +0 -180
- package/packs/design/skills/deck-builder/requirements.txt +0 -3
- package/packs/design/skills/deck-builder/scripts/build_deck.py +0 -1144
- package/packs/design/skills/deck-builder/templates/deck-spec.json +0 -168
- package/packs/design/skills/deck-builder/templates/palettes.json +0 -59
- package/packs/design/skills/marketing-flyer/SKILL.md +0 -113
- package/packs/design/skills/marketing-flyer/evals/eval_queries.json +0 -30
- package/packs/design/skills/marketing-flyer/evals/evals.json +0 -45
- package/packs/design/skills/marketing-flyer/evals/files/1/brand/brand.json +0 -80
- package/packs/design/skills/marketing-flyer/evals/files/1/brand/logo-white.png +0 -0
- package/packs/design/skills/marketing-flyer/evals/files/1/brand/logo.png +0 -0
- package/packs/design/skills/marketing-flyer/evals/files/1/brand/mark.png +0 -0
- package/packs/design/skills/marketing-flyer/evals/files/2/brand.json +0 -14
- package/packs/design/skills/marketing-flyer/evals/files/2/larchfield-logo.svg +0 -4
- package/packs/design/skills/marketing-flyer/evals/files/2/manager-email.txt +0 -6
- package/packs/design/skills/marketing-flyer/evals/files/2/open-day-brief.md +0 -15
- package/packs/design/skills/marketing-flyer/examples/community-health-fair.md +0 -68
- package/packs/design/skills/marketing-flyer/manifest.json +0 -40
- package/packs/design/skills/marketing-flyer/reference.md +0 -54
- package/packs/design/skills/marketing-flyer/scripts/build_flyer.py +0 -332
- package/packs/design/skills/marketing-flyer/templates/flyer-spec.json +0 -26
package/catalogue.json
CHANGED
|
@@ -109,7 +109,6 @@
|
|
|
109
109
|
"skills": [
|
|
110
110
|
"audience-profile",
|
|
111
111
|
"slide-outliner",
|
|
112
|
-
"deck-builder",
|
|
113
112
|
"exec-summary",
|
|
114
113
|
"decision-log",
|
|
115
114
|
"guide-builder",
|
|
@@ -131,12 +130,10 @@
|
|
|
131
130
|
]
|
|
132
131
|
},
|
|
133
132
|
"create-on-brand-collateral": {
|
|
134
|
-
"for": "Marketers · designers · anyone making a deck
|
|
135
|
-
"description": "Make collateral that looks like it came from your team: capture the brand once, then build decks
|
|
133
|
+
"for": "Marketers · designers · anyone making a deck",
|
|
134
|
+
"description": "Make collateral that looks like it came from your team: capture the brand once, then build decks with your logo, colours and fonts.",
|
|
136
135
|
"skills": [
|
|
137
136
|
"brand-kit",
|
|
138
|
-
"deck-builder",
|
|
139
|
-
"marketing-flyer",
|
|
140
137
|
"slide-outliner"
|
|
141
138
|
]
|
|
142
139
|
},
|
|
@@ -149,9 +146,7 @@
|
|
|
149
146
|
"output-hygiene",
|
|
150
147
|
"file-to-markdown",
|
|
151
148
|
"md-to-docx",
|
|
152
|
-
"md-to-html",
|
|
153
149
|
"md-to-xlsx",
|
|
154
|
-
"mermaid-render",
|
|
155
150
|
"md-to-pptx",
|
|
156
151
|
"md-to-confluence"
|
|
157
152
|
]
|
|
@@ -218,6 +213,10 @@
|
|
|
218
213
|
"tech-comparison-matrix": { "in": "0.16.13", "why": "On evals it was never revised against, the agent without it did as well, and its weighted totals were wrong in 4 of 8 runs." },
|
|
219
214
|
"db-schema-design": { "in": "0.16.13", "why": "On evals it was never revised against, the agent without it met as many checks (73% against 71%) and got types, time zones and constraints right unprompted." },
|
|
220
215
|
"metric-definition": { "in": "0.16.13", "why": "On evals it was never revised against, the agent without it did everything the skill teaches unprompted and won 13 of 16 blind verdicts." },
|
|
221
|
-
"contribution-wizard": { "in": "0.16.13", "why": "It prescribed a skill layout this catalogue no longer uses and imposed it on other repos. To add a skill to skilldrop, follow AGENTS.md and run validate.py." }
|
|
216
|
+
"contribution-wizard": { "in": "0.16.13", "why": "It prescribed a skill layout this catalogue no longer uses and imposed it on other repos. To add a skill to skilldrop, follow AGENTS.md and run validate.py." },
|
|
217
|
+
"md-to-html": { "in": "1.2.0", "why": "On its held-out evals, in each of two trials and with both blind judges, the agent without it made the better page: the skill's script showed raw HTML as text and its security policy blocked embeds, and it adds no rule the agent breaks." },
|
|
218
|
+
"mermaid-render": { "in": "1.2.0", "why": "On its held-out evals, in each of two trials and with both blind judges, the agent without it fixed the same diagrams, ran the Mermaid CLI itself and said plainly what it had not rendered; the skill adds no rule it breaks." },
|
|
219
|
+
"marketing-flyer": { "in": "1.2.0", "why": "On its held-out evals, in each of two trials and with both blind judges, the agent without it built the whole flyer with placeholders where the skill stopped or used a generic template; it adds no rule the agent breaks." },
|
|
220
|
+
"deck-builder": { "in": "1.2.0", "why": "On its held-out evals the agent without it built the better deck in each of two trials; rebuilt rule-first, with its script able to run, it still lost on fresh evals (judges 2 and 1 of 4; 69% of checks against 81%).", "instead": "md-to-pptx" }
|
|
222
221
|
}
|
|
223
222
|
}
|
package/model-routing.json
CHANGED
|
@@ -234,10 +234,6 @@
|
|
|
234
234
|
"tier": "light",
|
|
235
235
|
"rationale": "Extracts decisions/owners/dates from notes. Pattern extraction; escalate on long transcripts via large-input rule."
|
|
236
236
|
},
|
|
237
|
-
"deck-builder": {
|
|
238
|
-
"tier": "standard",
|
|
239
|
-
"rationale": "Shapes content, maps a brand template's layouts, and runs a script. Judgment, not hard reasoning."
|
|
240
|
-
},
|
|
241
237
|
"delivery-metrics-report": {
|
|
242
238
|
"tier": "standard",
|
|
243
239
|
"rationale": "A stdlib script computes every number; the model maps columns, checks data quality and interprets weekly trends against fixed DORA definitions, which is bounded judgment."
|
|
@@ -335,10 +331,6 @@
|
|
|
335
331
|
"tier": "standard",
|
|
336
332
|
"rationale": "Methodology synthesis against a fixed decision tree and pitfall catalog. Grading-method and metric choices need judgment but are bounded; escalate via ambiguous-input on novel task types."
|
|
337
333
|
},
|
|
338
|
-
"marketing-flyer": {
|
|
339
|
-
"tier": "standard",
|
|
340
|
-
"rationale": "Writes short copy to fit and fills a spec for a deterministic builder. Bounded generation."
|
|
341
|
-
},
|
|
342
334
|
"mcp-pairing": {
|
|
343
335
|
"tier": "standard",
|
|
344
336
|
"rationale": "Matching a loop's stages to the context each needs and the narrowest access that provides it is bounded judgment over a short checklist."
|
|
@@ -351,10 +343,6 @@
|
|
|
351
343
|
"tier": "standard",
|
|
352
344
|
"rationale": "A stdlib script does the conversion; the model restructures the Markdown so it converts cleanly (heading levels, footnotes, HTML), reads each warning and explains the losses. Bounded editing, no open-ended generation."
|
|
353
345
|
},
|
|
354
|
-
"md-to-html": {
|
|
355
|
-
"tier": "light",
|
|
356
|
-
"rationale": "A deterministic stdlib script does the conversion; the model picks options, fixes a few unsupported Markdown constructs and relays the script's warnings. Little judgment."
|
|
357
|
-
},
|
|
358
346
|
"md-to-pptx": {
|
|
359
347
|
"tier": "light",
|
|
360
348
|
"rationale": "Mechanical conversion done by its script; the model only checks the outline maps to slides and reports what was dropped."
|
|
@@ -363,10 +351,6 @@
|
|
|
363
351
|
"tier": "standard",
|
|
364
352
|
"rationale": "A stdlib script types and writes the cells; the model shapes tables from the source (headings, units, one header row), decides whether formulas are safe to enable, and checks the per-sheet type counts against the data. Bounded, mostly mechanical judgment."
|
|
365
353
|
},
|
|
366
|
-
"mermaid-render": {
|
|
367
|
-
"tier": "standard",
|
|
368
|
-
"rationale": "The script lints and renders deterministically, but fixing a broken diagram means reading the author's intent and rewriting syntax without changing nodes, edges or labels, and knowing when to ask instead."
|
|
369
|
-
},
|
|
370
354
|
"migration-plan": {
|
|
371
355
|
"tier": "standard",
|
|
372
356
|
"rationale": "Phased plan synthesis with a strong template. Ordering judgment is bounded by the expand/migrate/contract pattern; escalate via ambiguous-input on contested, high-stakes cutovers."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skilldrop-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and reviews, installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Sanjay Ananthanarayan",
|
|
@@ -8,7 +8,7 @@ A small synthetic event log demonstrating the three views — including graceful
|
|
|
8
8
|
timestamp,user,tool,session_id,output_consumed,consumed_at,outcome
|
|
9
9
|
2026-05-19T09:14:23Z,alice@acme.example,claude-code,sess-001,1,2026-05-19T11:02:00Z,success
|
|
10
10
|
2026-05-19T09:14:55Z,alice@acme.example,claude-code,sess-001,1,2026-05-19T11:02:00Z,success
|
|
11
|
-
2026-05-19T09:18:02Z,alice@acme.example,
|
|
11
|
+
2026-05-19T09:18:02Z,alice@acme.example,slide-outliner,sess-001,1,2026-05-19T14:30:00Z,success
|
|
12
12
|
2026-05-19T10:01:11Z,bob@acme.example,cursor,sess-014,0,,success
|
|
13
13
|
2026-05-19T10:01:30Z,bob@acme.example,cursor,sess-015,0,,success
|
|
14
14
|
2026-05-19T10:02:11Z,bob@acme.example,cursor,sess-016,0,,success
|
|
@@ -8,7 +8,7 @@ Input to `ai-usage-report` is a CSV or JSONL file. Each row / each JSON object i
|
|
|
8
8
|
|---|---|---|
|
|
9
9
|
| `timestamp` | ISO 8601 datetime | e.g. `2026-05-21T14:32:11Z` |
|
|
10
10
|
| `user` | string | Stable identifier — email, handle, or employee ID. Use the same value for the same person across events. |
|
|
11
|
-
| `tool` | string | What was invoked — e.g. `claude-code`, `cursor`, `copilot`, or a specific skill name like `
|
|
11
|
+
| `tool` | string | What was invoked — e.g. `claude-code`, `cursor`, `copilot`, or a specific skill name like `slide-outliner` |
|
|
12
12
|
|
|
13
13
|
If any of these three is missing, the script exits with an error. They are the minimum needed to compute a volume report.
|
|
14
14
|
|
|
@@ -51,7 +51,7 @@ When a column is omitted, the report includes a *"Where signals are missing"* se
|
|
|
51
51
|
timestamp,user,tool,session_id,output_consumed,consumed_at,outcome
|
|
52
52
|
2026-05-21T09:14:23Z,alice@acme.example,claude-code,sess-001,1,2026-05-21T11:02:00Z,success
|
|
53
53
|
2026-05-21T09:14:55Z,alice@acme.example,claude-code,sess-001,1,2026-05-21T11:02:00Z,success
|
|
54
|
-
2026-05-21T09:18:02Z,alice@acme.example,
|
|
54
|
+
2026-05-21T09:18:02Z,alice@acme.example,slide-outliner,sess-001,1,2026-05-21T14:30:00Z,success
|
|
55
55
|
2026-05-21T10:01:11Z,bob@acme.example,cursor,sess-014,0,,success
|
|
56
56
|
2026-05-21T10:01:30Z,bob@acme.example,cursor,sess-014,0,,success
|
|
57
57
|
2026-05-21T14:22:08Z,carol@acme.example,claude-code,sess-029,1,2026-05-22T08:11:00Z,success
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"description": "Turn Markdown into Word, Excel and
|
|
2
|
+
"description": "Turn Markdown into Word, Excel, PowerPoint and Confluence files that people outside engineering can open, and turn their files back into Markdown. Standard-library Python scripts, with nothing to install.",
|
|
3
3
|
"display_name": "Converters",
|
|
4
|
-
"keywords": ["convert", "markdown", "word", "docx", "excel", "xlsx", "
|
|
4
|
+
"keywords": ["convert", "markdown", "word", "docx", "excel", "xlsx", "powerpoint", "confluence"],
|
|
5
5
|
"links": {
|
|
6
6
|
"documentation": "https://sananthanarayan.github.io/skilldrop/packs/converters/"
|
|
7
7
|
},
|
|
@@ -20,10 +20,9 @@
|
|
|
20
20
|
},
|
|
21
21
|
"requires": ["core"],
|
|
22
22
|
"journey": {
|
|
23
|
-
"when": "Your draft is in Markdown, but the people who need it work in Word, Excel or
|
|
23
|
+
"when": "Your draft is in Markdown, but the people who need it work in Word, Excel, PowerPoint or Confluence, or they sent you their files and you want to work on them as Markdown.",
|
|
24
24
|
"you_bring": [
|
|
25
25
|
"the Markdown draft, or the Word, PDF, Excel or HTML files you were sent",
|
|
26
|
-
"any Mermaid diagrams the draft contains",
|
|
27
26
|
"a brand.json from brand-kit, if the Word file should be in your brand",
|
|
28
27
|
"who it is for, and whether they edit it, calculate with it or only read it"
|
|
29
28
|
],
|
|
@@ -39,11 +38,6 @@
|
|
|
39
38
|
"you_do": "Run it on the finished draft before it leaves the team.",
|
|
40
39
|
"you_get": "The draft with invisible characters and generated-by trailers stripped, and machine-sounding lines flagged with rewrites."
|
|
41
40
|
},
|
|
42
|
-
{
|
|
43
|
-
"skill": "mermaid-render",
|
|
44
|
-
"you_do": "If the draft has Mermaid diagrams, render them.",
|
|
45
|
-
"you_get": "Each diagram checked for the errors that stop it rendering, then an SVG or PNG per diagram to embed in the Word or HTML version (PNG and SVG need mermaid-cli installed)."
|
|
46
|
-
},
|
|
47
41
|
{
|
|
48
42
|
"skill": "md-to-docx",
|
|
49
43
|
"you_do": "Convert the draft for readers who will edit or comment in Word.",
|
|
@@ -54,11 +48,6 @@
|
|
|
54
48
|
"skill": "md-to-xlsx",
|
|
55
49
|
"you_do": "Convert the tables for readers who will filter or total them.",
|
|
56
50
|
"you_get": "A .xlsx with one sheet per table, typed numbers, dates and percentages, and formulas off unless you ask."
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"skill": "md-to-html",
|
|
60
|
-
"you_do": "Convert the draft for readers who only need to read it in a browser.",
|
|
61
|
-
"you_get": "One self-contained, print-friendly HTML file with images embedded, so it still works when emailed."
|
|
62
51
|
}
|
|
63
52
|
],
|
|
64
53
|
"you_end_with": "The same content in the format each reader uses, with nothing dropped silently, and a Markdown source you can keep editing."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: file-to-markdown
|
|
3
|
-
description: Convert a Word document, PowerPoint deck, Excel workbook, web page, CSV, JSON, text file, email (.eml or Outlook .msg) or PDF into clean Markdown
|
|
3
|
+
description: Convert a Word document, PowerPoint deck, Excel workbook, web page, CSV, JSON, text file, email (.eml or Outlook .msg) or PDF into clean Markdown. It keeps headings, lists, tables, links, bold and italic, slide titles and speaker notes. It saves embedded images beside the Markdown and links them, shows tracked changes as pending rather than accepted, and reports everything else it dropped (charts, comments, formulas), so the content can be read, reviewed or fed to another skill. Use when the user hands over a .docx, .pptx, .xlsx, .html, .csv, .json, .eml, .msg or .pdf and says "read this", "turn this into markdown", "extract the text", or wants it critiqued or briefed.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# file-to-markdown
|
|
@@ -9,7 +9,7 @@ You turn the files people actually send (a Word draft, last quarter's deck, a bu
|
|
|
9
9
|
a saved web page) into Markdown an agent can read reliably. A stdlib script does the
|
|
10
10
|
extraction, so nothing needs installing except `pdftotext` for PDFs. The Markdown is rarely
|
|
11
11
|
the end product: it is the input to `doc-critique` (review it), `brief-intake` (structure it),
|
|
12
|
-
or a rewrite that goes back out through `md-to-docx
|
|
12
|
+
or a rewrite that goes back out through `md-to-docx`.
|
|
13
13
|
|
|
14
14
|
## How to respond
|
|
15
15
|
|
|
@@ -19,7 +19,7 @@ or a rewrite that goes back out through `md-to-docx` or `md-to-html`.
|
|
|
19
19
|
- **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".
|
|
20
20
|
- **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.
|
|
21
21
|
- **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.
|
|
22
|
-
- **For this skill:** Put the converted text in front of the user: write the file, and say what did not convert, with counts.
|
|
22
|
+
- **For this skill:** Put the converted text in front of the user: write the file, and say what did not convert, with counts. Never settle what the source leaves open: a tracked change stays pending, and a figure the source contradicts is not copied silently into something meant to be pasted.
|
|
23
23
|
|
|
24
24
|
1. **Ask once for anything missing.** Usually only the file is needed:
|
|
25
25
|
|
|
@@ -36,12 +36,14 @@ or a rewrite that goes back out through `md-to-docx` or `md-to-html`.
|
|
|
36
36
|
python3 scripts/to_markdown.py input.docx -o input.md
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
`-o -` writes to stdout. `--max-rows 200` caps each sheet of an `.xlsx`.
|
|
39
|
+
`-o -` writes to stdout. `--max-rows 200` caps each sheet of an `.xlsx`. Images embedded in a
|
|
40
|
+
`.docx` or `.pptx` are saved to `<name>-images/` beside the output and linked where they sat,
|
|
41
|
+
with their alt text; to stdout there is nowhere to save them, so they are counted as dropped.
|
|
40
42
|
|
|
41
43
|
| Input | What comes through |
|
|
42
44
|
|---|---|
|
|
43
|
-
| `.docx` | Headings by style (Title, Heading 1–6, outline level), bulleted and numbered lists with nesting, tables, bold, italic, hyperlinks |
|
|
44
|
-
| `.pptx` | One `## Slide N: title` section per slide, bullets with levels, tables, speaker notes as a quote |
|
|
45
|
+
| `.docx` | Headings by style (Title, Heading 1–6, outline level), bulleted and numbered lists with nesting, tables, bold, italic, hyperlinks, embedded images; tracked changes as `{++added++}` and `{--removed--}` |
|
|
46
|
+
| `.pptx` | One `## Slide N: title` section per slide, bullets with levels, tables, pictures, speaker notes as a quote |
|
|
45
47
|
| `.xlsx` | One table per sheet, shared strings, numbers as stored, dates as `YYYY-MM-DD`, cached formula values |
|
|
46
48
|
| `.html` | Headings, lists, tables, links, code blocks, quotes; scripts, styles and nav menus dropped |
|
|
47
49
|
| `.csv` / `.tsv` | One table, delimiter detected |
|
|
@@ -63,13 +65,24 @@ or a rewrite that goes back out through `md-to-docx` or `md-to-html`.
|
|
|
63
65
|
refuses and names the format to save as. On macOS, `textutil -convert docx file.doc`
|
|
64
66
|
handles `.doc` and `.rtf`, though it writes no heading styles, so check the levels.
|
|
65
67
|
|
|
66
|
-
5. **
|
|
67
|
-
`
|
|
68
|
-
|
|
68
|
+
5. **Keep pending changes pending.** A tracked insertion or deletion comes through in
|
|
69
|
+
CriticMarkup, `{++added++}` and `{--removed--}`, because nobody has accepted it yet. Say
|
|
70
|
+
how many there are and that they are pending. When a comment or the request settles one
|
|
71
|
+
("use 48, as Kim's comment says"), make that one edit and say so; leave the rest marked.
|
|
72
|
+
|
|
73
|
+
6. **Don't copy a contradiction into a deliverable.** When the source contradicts itself (a
|
|
74
|
+
total that doesn't add up, a figure stated two ways), say so with both numbers. If the
|
|
75
|
+
request is for something to paste or publish ("just the table"), leave the contradicted
|
|
76
|
+
cell or row out, or mark it, and say which in one line. A Markdown copy for reading keeps it
|
|
77
|
+
as stored, flagged.
|
|
78
|
+
|
|
79
|
+
7. **Report what was dropped, every time.** The script prints three kinds of line to stderr:
|
|
80
|
+
`converted …` (what was kept), `dropped …` (charts, comments, footnotes, formulas, headers
|
|
81
|
+
and footers, and images when there was nowhere to save them), and `note: …` (headings inferred from font size,
|
|
69
82
|
merged cells, truncated sheets). Put them at the top of the reply in plain words: "The
|
|
70
83
|
deck has 4 charts that are not in the Markdown; their numbers are missing from what I read."
|
|
71
84
|
|
|
72
|
-
|
|
85
|
+
8. **Then do the next step the user asked for.** When a critique or brief depends on a chart
|
|
73
86
|
or comment that was dropped, say so in that output too. Don't let it read as complete.
|
|
74
87
|
|
|
75
88
|
**Non-interactive runs** (subagent, CI, headless): convert with the defaults and prefix the
|
|
@@ -88,6 +101,9 @@ missing, emit `BLOCKED: need <the file | pdftotext on PATH>` and stop.
|
|
|
88
101
|
- **Nothing is added.** The Markdown holds only what the file holds: no summaries, no invented headings, no filled-in empty cells.
|
|
89
102
|
- **Speaker notes stay attached to their slide,** because that is often where the real argument is.
|
|
90
103
|
- **Numbers are copied as stored.** No rounding, no currency symbols added; dates converted only when the cell is formatted as a date.
|
|
104
|
+
- **Images come through as files.** An embedded image is saved and linked where it sat, with its alt text, not reduced to a caption.
|
|
105
|
+
- **Tracked changes stay pending.** They are marked, counted and said to be unaccepted; only one the user or a comment settles is applied, and the reply says so.
|
|
106
|
+
- **A contradiction isn't pasted silently.** Both figures are named, and a deliverable meant for pasting leaves it out or marks it.
|
|
91
107
|
- **Inferred structure is flagged.** When headings come from font size instead of styles, the reply says to check the levels.
|
|
92
108
|
|
|
93
109
|
## When to use this skill
|
|
@@ -100,7 +116,6 @@ missing, emit `BLOCKED: need <the file | pdftotext on PATH>` and stop.
|
|
|
100
116
|
## When NOT to use this skill
|
|
101
117
|
|
|
102
118
|
- ❌ Going the other way, Markdown to Word; use `md-to-docx`
|
|
103
|
-
- ❌ Markdown to a web page; use `md-to-html`
|
|
104
119
|
- ❌ Markdown tables into a workbook; use `md-to-xlsx`
|
|
105
120
|
- ❌ Messy notes, a Slack thread or a transcript that are already text; use `brief-intake` directly
|
|
106
121
|
- ❌ A document that is already Markdown and needs reviewing; use `doc-critique` directly
|
|
@@ -110,6 +125,8 @@ missing, emit `BLOCKED: need <the file | pdftotext on PATH>` and stop.
|
|
|
110
125
|
- ❌ **Summarising instead of converting.** The user asked for the document; give them the document, then summarise if asked.
|
|
111
126
|
- ❌ **Hiding the dropped list** below the Markdown, or leaving it out because "it's only images". A chart is often the slide's whole point.
|
|
112
127
|
- ❌ **Reading a PDF as raw bytes** when `pdftotext` is missing. Ask the user to install it or export the PDF to .docx.
|
|
128
|
+
- ❌ **Writing an unaccepted tracked change as the text.** It reads as agreed when it isn't.
|
|
129
|
+
- ❌ **Pasting a total you've just said is wrong** into the table the user will publish.
|
|
113
130
|
- ❌ **Treating inferred headings as fact.** A bold, large line in an unstyled document might be a pull quote.
|
|
114
131
|
- ❌ **Critiquing a deck from its Markdown** without saying the charts and images were not seen.
|
|
115
132
|
- ❌ **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.
|
|
@@ -49,6 +49,36 @@
|
|
|
49
49
|
"It does not invent varieties, numbers, donors or notes that are not in the file",
|
|
50
50
|
"The reply is the table plus at most a couple of short lines, with no long explanation, and it delivers without asking questions first"
|
|
51
51
|
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": 5,
|
|
55
|
+
"held_out": "2026-10-27",
|
|
56
|
+
"prompt": "Our procurement lead just forwarded supplier_agreement_v3.docx and it still has Legal's markup in it. Can you turn it into Markdown for our Confluence page, and tell me which bits haven't actually been agreed yet? Please don't accept anything on my behalf.",
|
|
57
|
+
"assertions": [
|
|
58
|
+
"Writes a Markdown file with 'Master Supply Agreement' as the top heading and the five numbered sections ('1. Payment terms' through '5. Price schedule') as subheadings. The three supplier obligations are a bulleted list, 'EUR 250,000' is bold and 'gross negligence' is italic.",
|
|
59
|
+
"Renders the price schedule as a Markdown table with the header Part number | Unit price | Minimum order quantity and the rows VP-110 / EUR 42.00 / 500 and VP-220 / EUR 57.50 / 250. Keeps 'supplier portal' as a Markdown link to https://supplier.example.com/terms.",
|
|
60
|
+
"Shows the payment-terms change as pending rather than accepted: the deleted '30' and the inserted '60' are both visible and marked as a proposed change by J. Okafor. It does not present the clause as simply 'payable within 60 days' as if it were agreed.",
|
|
61
|
+
"Shows the deleted sentence 'No termination fee applies.' (M. Lindqvist) as a pending deletion that is still visible and marked, not silently dropped. Shows the ISO 9001 obligation bullet as a pending insertion by J. Okafor, not as an agreed obligation.",
|
|
62
|
+
"Surfaces R. Achterberg's comment on the EUR 250,000 liability cap (asking to raise it to EUR 500,000, marked 'Not agreed yet') as an open item, either inline or in a notes or dropped-items list.",
|
|
63
|
+
"Answers the question directly with a short list of what is not yet agreed: exactly three tracked changes (30 to 60 days; the inserted ISO 9001 obligation; the deleted termination-fee sentence) and one open comment on the liability cap. It accepts or rejects none of them and leaves supplier_agreement_v3.docx unchanged.",
|
|
64
|
+
"Saves the embedded logo image as an image file next to the Markdown (for example in a sibling folder) and links it from the Markdown with a relative image link.",
|
|
65
|
+
"Invents nothing that is not in the document: no extra clauses, parties, prices, dates, authors or comments. Names, figures and the portal URL match the file exactly."
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": 6,
|
|
70
|
+
"held_out": "2026-10-27",
|
|
71
|
+
"prompt": "can u turn the offsite deck + numbers into md for the board pack. sarah says the notes are where the real story is. offsite_q3.pptx and numbers.xlsx, need it today thx",
|
|
72
|
+
"assertions": [
|
|
73
|
+
"Produces Markdown covering both files. The three slide titles 'Q3 Offsite: Where We Landed', 'Revenue by region' and 'APAC launch' appear in that order as headings, each with its bullets, and each slide's speaker notes are kept and clearly labelled as notes under the right slide.",
|
|
74
|
+
"Converts both worksheets, each identified by its name: Regions as a Markdown table (EMEA 120 / 110, North America 140 / 130, LATAM 160 / 150, Total row) and Assumptions (FX rate GBP/EUR 1.17; Source: Finance close 10 Oct 2026).",
|
|
75
|
+
"Reports that the bar chart on slide 2 is not reproduced as a chart, either as a dropped item or as a text summary. Any figures it gives for the chart are exactly the values cached in it (EMEA 120, North America 140, LATAM 160), and no chart values are made up.",
|
|
76
|
+
"Flags that the Regions Total in B5 is the formula =SUM(B2:B4) with a stored value of 410, while the three rows sum to 420 (120+140+160). It treats the total as stale or inconsistent rather than silently showing 410 or quietly correcting it to 420. The Plan total of 390 does match its rows.",
|
|
77
|
+
"Warns the user, beyond just copying the notes, that the slide 3 notes say the £250k APAC first-year target must not go into the board pack (finance hasn't signed it off; say 'target under review'). It neither leaves £250k in board-pack-ready output without a warning nor deletes it silently.",
|
|
78
|
+
"Relays the 'real story' from the slide 2 notes, since the user pointed to them: North America beat plan only because of the one-off Kestrel Sports order (£35k), and without it NA is at 105 against a plan of 130.",
|
|
79
|
+
"Invents nothing that is not in the files: no extra slides, regions, APAC actuals, prior-quarter LATAM figures, chart values or names beyond those present.",
|
|
80
|
+
"Is the right size for a rushed request. It delivers the Markdown file(s) straight away with a brief summary of the flagged issues, not a long essay or a rewritten board pack, and does not hold up the work with clarifying questions."
|
|
81
|
+
]
|
|
52
82
|
}
|
|
53
83
|
]
|
|
54
84
|
}
|
|
Binary file
|
|
Binary file
|
|
@@ -11,7 +11,7 @@ actually printed.
|
|
|
11
11
|
|
|
12
12
|
## `acme-brief.docx`
|
|
13
13
|
|
|
14
|
-
A Word brief with Title and Heading styles, bulleted and numbered lists, a hyperlink, a table, an image, a comment and a tracked change.
|
|
14
|
+
A Word brief with Title and Heading styles, bulleted and numbered lists, a hyperlink, a table, an image, a comment and a tracked change. It is in [`inputs/`](inputs/acme-brief.docx).
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
17
|
python3 scripts/to_markdown.py acme-brief.docx -o acme-brief.md
|
|
@@ -20,45 +20,51 @@ python3 scripts/to_markdown.py acme-brief.docx -o acme-brief.md
|
|
|
20
20
|
stderr:
|
|
21
21
|
|
|
22
22
|
```text
|
|
23
|
-
converted acme-brief.docx -> acme-brief.md: 4 headings, 5 list items, 1 tables
|
|
24
|
-
dropped (not in the Markdown): 1 comments
|
|
23
|
+
converted acme-brief.docx -> acme-brief.md: 4 headings, 5 list items, 1 images saved, 1 tables, 1 tracked deletions shown as {-- --}, 1 tracked insertions shown as {++ ++}
|
|
24
|
+
dropped (not in the Markdown): 1 comments
|
|
25
|
+
note: tracked changes are pending, not accepted: {++added++} and {--removed--} mark them. Accept or reject them in Word to settle the text
|
|
25
26
|
```
|
|
26
27
|
|
|
28
|
+
The image is saved as `acme-brief-images/image1.png` and linked where it sat. The tracked change
|
|
29
|
+
stays pending.
|
|
30
|
+
|
|
27
31
|
Markdown:
|
|
28
32
|
|
|
29
33
|
````markdown
|
|
30
34
|
# Acme migration brief
|
|
31
35
|
|
|
32
|
-
|
|
36
|
+
## Background
|
|
33
37
|
|
|
34
38
|
We are moving **three services** to the new platform, *starting in November*. See the [project page](https://acme.example/migration).
|
|
35
39
|
|
|
36
|
-
|
|
40
|
+
### Goals
|
|
37
41
|
|
|
38
42
|
- Cut hosting cost
|
|
39
43
|
- Retire the 2014 cluster
|
|
40
44
|
- Including the batch jobs
|
|
41
45
|
|
|
42
|
-
|
|
46
|
+
### Steps
|
|
43
47
|
|
|
44
48
|
1. Inventory services
|
|
45
49
|
2. Pilot with billing
|
|
46
50
|
|
|
47
51
|
Architecture sketch:
|
|
48
52
|
|
|
49
|
-
|
|
53
|
+

|
|
54
|
+
|
|
55
|
+
| **Risk** | **Owner** | **Due** |
|
|
50
56
|
|---|---|---|
|
|
51
57
|
| Vendor lock-in | Priya | 2026-11-01 |
|
|
52
58
|
| Data residency \| EU | Tom | 2026-12-15 |
|
|
53
59
|
|
|
54
60
|
Open question: who signs off the cutover?
|
|
55
61
|
|
|
56
|
-
Kept text new wording
|
|
62
|
+
Kept text {--old wording--}{++new wording++}
|
|
57
63
|
````
|
|
58
64
|
|
|
59
65
|
## `northwind-roadmap.pptx`
|
|
60
66
|
|
|
61
|
-
A three-slide deck with a title slide, bullets at two levels, a picture
|
|
67
|
+
A three-slide deck with a title slide, bullets at two levels, a picture and speaker notes on slide 2. It is in [`inputs/`](inputs/northwind-roadmap.pptx).
|
|
62
68
|
|
|
63
69
|
```bash
|
|
64
70
|
python3 scripts/to_markdown.py northwind-roadmap.pptx -o northwind-roadmap.md
|
|
@@ -67,8 +73,8 @@ python3 scripts/to_markdown.py northwind-roadmap.pptx -o northwind-roadmap.md
|
|
|
67
73
|
stderr:
|
|
68
74
|
|
|
69
75
|
```text
|
|
70
|
-
converted northwind-roadmap.pptx -> northwind-roadmap.md: 3 slides, 1 slides with speaker notes
|
|
71
|
-
dropped
|
|
76
|
+
converted northwind-roadmap.pptx -> northwind-roadmap.md: 3 slides, 1 images saved, 1 slides with speaker notes
|
|
77
|
+
dropped: nothing detected
|
|
72
78
|
```
|
|
73
79
|
|
|
74
80
|
Markdown:
|
|
@@ -84,6 +90,8 @@ Product review, 12 October
|
|
|
84
90
|
- Cut setup time from 3 days to 4 hours
|
|
85
91
|
- Usage-based billing
|
|
86
92
|
|
|
93
|
+

|
|
94
|
+
|
|
87
95
|
> **Speaker notes:** Mention the two pilot customers by segment, not by name.
|
|
88
96
|
>
|
|
89
97
|
> Pause for questions here.
|
|
@@ -241,7 +249,7 @@ Markdown:
|
|
|
241
249
|
|
|
242
250
|
## `ops-review.pdf`
|
|
243
251
|
|
|
244
|
-
A two-page PDF printed from Chrome
|
|
252
|
+
A two-page PDF printed from Chrome, from an HTML page of the same report, so it has a title,
|
|
245
253
|
a nested list, a table, a chart image, a Mermaid diagram kept as text, and a code block.
|
|
246
254
|
|
|
247
255
|
```bash
|
|
@@ -296,10 +304,10 @@ one page and continues on the next loses its header row to the previous page.
|
|
|
296
304
|
## What to tell the user (for the first three files)
|
|
297
305
|
|
|
298
306
|
> I converted all three. Before we review, here is what is **not** in the Markdown:
|
|
299
|
-
> - **Brief:** one
|
|
300
|
-
> change
|
|
301
|
-
>
|
|
302
|
-
>
|
|
307
|
+
> - **Brief:** one reviewer comment. Its image is saved beside the Markdown and linked. One
|
|
308
|
+
> tracked change is still pending ("old wording" deleted, "new wording" inserted), so it is
|
|
309
|
+
> marked, not accepted: say which way it should go.
|
|
310
|
+
> - **Deck:** nothing. Its picture is saved and linked, and slide 2's speaker notes are kept.
|
|
303
311
|
> - **Workbook:** the chart, and the two SUM formulas. Their last calculated values (16500 and
|
|
304
312
|
> 17250.5) are in the table, but the formulas themselves are not.
|
|
305
313
|
>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "file-to-markdown",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Convert a Word document, PowerPoint deck, Excel workbook, web page, CSV, JSON, text file, email (.eml or Outlook .msg) or PDF into clean Markdown
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Convert a Word document, PowerPoint deck, Excel workbook, web page, CSV, JSON, text file, email (.eml or Outlook .msg) or PDF into clean Markdown. It keeps headings, lists, tables, links, bold and italic, slide titles and speaker notes. It saves embedded images beside the Markdown and links them, shows tracked changes as pending rather than accepted, and reports everything else it dropped (charts, comments, formulas), so the content can be read, reviewed or fed to another skill. Use when the user hands over a .docx, .pptx, .xlsx, .html, .csv, .json, .eml, .msg or .pdf and says \"read this\", \"turn this into markdown\", \"extract the text\", or wants it critiqued or briefed.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
7
7
|
"npm": [],
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
"brief-intake",
|
|
16
16
|
"doc-critique",
|
|
17
17
|
"md-to-docx",
|
|
18
|
-
"md-to-html",
|
|
19
18
|
"md-to-xlsx"
|
|
20
19
|
],
|
|
21
20
|
"handoff": [
|