skilldrop-cli 0.16.0 → 0.16.2

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 (115) hide show
  1. package/package.json +1 -1
  2. package/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +1 -0
  3. package/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +1 -1
  4. package/packs/ai-engineering/skills/agent-budget/SKILL.md +2 -0
  5. package/packs/ai-engineering/skills/agent-budget/manifest.json +1 -1
  6. package/packs/ai-engineering/skills/agent-loop-design/SKILL.md +2 -0
  7. package/packs/ai-engineering/skills/agent-loop-design/manifest.json +1 -1
  8. package/packs/ai-engineering/skills/agent-threat-model/SKILL.md +2 -0
  9. package/packs/ai-engineering/skills/agent-threat-model/manifest.json +1 -1
  10. package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +1 -0
  11. package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +1 -1
  12. package/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +4213 -0
  13. package/packs/ai-engineering/skills/subagent-design/SKILL.md +2 -0
  14. package/packs/ai-engineering/skills/subagent-design/manifest.json +1 -1
  15. package/packs/api-builder/skills/eval-harness-generator/evals/files/1/SKILL.md +31 -0
  16. package/packs/converters/skills/file-to-markdown/SKILL.md +2 -0
  17. package/packs/converters/skills/file-to-markdown/evals/files/1/northwind-q3.pptx +0 -0
  18. package/packs/converters/skills/file-to-markdown/evals/files/2/acme-contract-summary.pdf +93 -0
  19. package/packs/converters/skills/file-to-markdown/manifest.json +1 -1
  20. package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +33 -2
  21. package/packs/converters/skills/md-to-docx/SKILL.md +2 -0
  22. package/packs/converters/skills/md-to-docx/evals/files/1/brand/brand.json +80 -0
  23. package/packs/converters/skills/md-to-docx/evals/files/1/brand/logo-white.png +0 -0
  24. package/packs/converters/skills/md-to-docx/evals/files/1/brand/logo.png +0 -0
  25. package/packs/converters/skills/md-to-docx/evals/files/1/brand/mark.png +0 -0
  26. package/packs/converters/skills/md-to-docx/evals/files/1/docs/vendor-onboarding.md +42 -0
  27. package/packs/converters/skills/md-to-docx/manifest.json +1 -1
  28. package/packs/converters/skills/md-to-docx/scripts/md_to_docx.py +3 -1
  29. package/packs/converters/skills/md-to-html/evals/files/1/brand/brand.json +80 -0
  30. package/packs/converters/skills/md-to-html/evals/files/1/brand/logo-white.png +0 -0
  31. package/packs/converters/skills/md-to-html/evals/files/1/brand/logo.png +0 -0
  32. package/packs/converters/skills/md-to-html/evals/files/1/brand/mark.png +0 -0
  33. package/packs/converters/skills/md-to-html/evals/files/1/docs/q3-review.md +35 -0
  34. package/packs/converters/skills/md-to-html/evals/files/1/img/dashboard.png +0 -0
  35. package/packs/converters/skills/md-to-xlsx/SKILL.md +2 -1
  36. package/packs/converters/skills/md-to-xlsx/evals/files/1/exports/northwind-invoices.csv +25 -0
  37. package/packs/converters/skills/md-to-xlsx/evals/files/2/reports/q3-ops-review.md +32 -0
  38. package/packs/converters/skills/md-to-xlsx/manifest.json +1 -1
  39. package/packs/converters/skills/md-to-xlsx/scripts/md_to_xlsx.py +18 -4
  40. package/packs/converters/skills/mermaid-render/SKILL.md +1 -0
  41. package/packs/converters/skills/mermaid-render/evals/files/1/docs/contoso-orders.md +23 -0
  42. package/packs/converters/skills/mermaid-render/manifest.json +1 -1
  43. package/packs/core/skills/brief-intake/SKILL.md +1 -0
  44. package/packs/core/skills/brief-intake/manifest.json +1 -1
  45. package/packs/core/skills/output-hygiene/SKILL.md +2 -0
  46. package/packs/core/skills/output-hygiene/manifest.json +1 -1
  47. package/packs/design/skills/brand-kit/evals/files/1/brand/northwind-logo-white.png +0 -0
  48. package/packs/design/skills/brand-kit/evals/files/1/brand/northwind-logo.png +0 -0
  49. package/packs/design/skills/deck-builder/SKILL.md +2 -0
  50. package/packs/design/skills/deck-builder/manifest.json +1 -1
  51. package/packs/design/skills/marketing-flyer/evals/files/1/brand/brand.json +80 -0
  52. package/packs/design/skills/marketing-flyer/evals/files/1/brand/logo-white.png +0 -0
  53. package/packs/design/skills/marketing-flyer/evals/files/1/brand/logo.png +0 -0
  54. package/packs/design/skills/marketing-flyer/evals/files/1/brand/mark.png +0 -0
  55. package/packs/dev-team/skills/agents-md-generator/SKILL.md +4 -2
  56. package/packs/dev-team/skills/agents-md-generator/evals/files/1/.github/workflows/ci.yml +10 -0
  57. package/packs/dev-team/skills/agents-md-generator/evals/files/1/Makefile +5 -0
  58. package/packs/dev-team/skills/agents-md-generator/evals/files/1/alembic/versions/0001_create_bookings.py +10 -0
  59. package/packs/dev-team/skills/agents-md-generator/evals/files/1/booking/__init__.py +0 -0
  60. package/packs/dev-team/skills/agents-md-generator/evals/files/1/booking/app.py +8 -0
  61. package/packs/dev-team/skills/agents-md-generator/evals/files/1/pyproject.toml +11 -0
  62. package/packs/dev-team/skills/agents-md-generator/evals/files/1/tests/test_health.py +5 -0
  63. package/packs/dev-team/skills/agents-md-generator/evals/files/2/AGENTS.md +3 -0
  64. package/packs/dev-team/skills/agents-md-generator/evals/files/2/package.json +12 -0
  65. package/packs/dev-team/skills/agents-md-generator/evals/files/2/src/index.ts +1 -0
  66. package/packs/dev-team/skills/agents-md-generator/manifest.json +1 -1
  67. package/packs/dev-team/skills/agents-md-generator/templates/agents-md.md +2 -2
  68. package/packs/dev-team/skills/devils-advocate/SKILL.md +1 -0
  69. package/packs/dev-team/skills/devils-advocate/manifest.json +1 -1
  70. package/packs/dev-team/skills/pre-merge-review/SKILL.md +2 -0
  71. package/packs/dev-team/skills/pre-merge-review/manifest.json +1 -1
  72. package/packs/dev-team/skills/pre-merge-review/scripts/gate.py +4 -1
  73. package/packs/infra-as-code/skills/terraform-plan-review/evals/files/2/plan.json +133 -0
  74. package/packs/product-manager/skills/prfaq/SKILL.md +1 -0
  75. package/packs/product-manager/skills/prfaq/manifest.json +1 -1
  76. package/packs/product-manager/skills/strategy-analysis/SKILL.md +1 -1
  77. package/packs/product-manager/skills/strategy-analysis/manifest.json +1 -1
  78. package/packs/product-manager/skills/success-metrics/SKILL.md +2 -0
  79. package/packs/product-manager/skills/success-metrics/manifest.json +1 -1
  80. package/packs/product-manager/skills/user-journey-map/SKILL.md +1 -0
  81. package/packs/product-manager/skills/user-journey-map/manifest.json +1 -1
  82. package/packs/research/skills/research-plan/SKILL.md +2 -0
  83. package/packs/research/skills/research-plan/manifest.json +1 -1
  84. package/packs/skill-engineering/skills/skill-review/evals/files/1/skills/changelog-writer/SKILL.md +10 -0
  85. package/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/SKILL.md +12 -0
  86. package/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/references/tone.md +3 -0
  87. package/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/scripts/collect.py +6 -0
  88. package/packs/solution-architect/skills/adr-generator/SKILL.md +3 -2
  89. package/packs/solution-architect/skills/adr-generator/manifest.json +1 -1
  90. package/packs/solution-architect/skills/figma-diagrams/SKILL.md +1 -0
  91. package/packs/solution-architect/skills/figma-diagrams/manifest.json +1 -1
  92. package/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +3 -1
  93. package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/deploys.csv +49 -0
  94. package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/incidents.csv +7 -0
  95. package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/prs.csv +84 -0
  96. package/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +1 -1
  97. package/packs/sre-oncall/skills/postmortem-generator/SKILL.md +1 -0
  98. package/packs/sre-oncall/skills/postmortem-generator/manifest.json +1 -1
  99. package/packs/stakeholder-comms/skills/audience-profile/SKILL.md +1 -0
  100. package/packs/stakeholder-comms/skills/audience-profile/manifest.json +1 -1
  101. package/packs/stakeholder-comms/skills/decision-log/SKILL.md +1 -0
  102. package/packs/stakeholder-comms/skills/decision-log/manifest.json +1 -1
  103. package/packs/stakeholder-comms/skills/guide-builder/SKILL.md +1 -0
  104. package/packs/stakeholder-comms/skills/guide-builder/manifest.json +1 -1
  105. package/packs/trackers/skills/backlog-triage/SKILL.md +1 -0
  106. package/packs/trackers/skills/backlog-triage/evals/files/1/examples/northwind-backlog.csv +28 -0
  107. package/packs/trackers/skills/backlog-triage/evals/files/2/issues.json +6052 -0
  108. package/packs/trackers/skills/backlog-triage/manifest.json +1 -1
  109. package/packs/trackers/skills/team-status-report/SKILL.md +1 -0
  110. package/packs/trackers/skills/team-status-report/evals/files/1/examples/northwind-week-40.csv +16 -0
  111. package/packs/trackers/skills/team-status-report/evals/files/2/issues.json +1212 -0
  112. package/packs/trackers/skills/team-status-report/manifest.json +1 -1
  113. package/packs/trackers/skills/tracker-brief-sync/evals/files/1/examples/prd-guest-checkout.md +53 -0
  114. package/packs/trackers/skills/tracker-brief-sync/evals/files/2/examples/prd-guest-checkout.md +53 -0
  115. package/packs/trackers/skills/tracker-brief-sync/evals/files/2/examples/tracker-after-two-weeks.csv +30 -0
@@ -65,3 +65,5 @@ Produces an **orchestration plan**: which subagents exist, what each one alone i
65
65
  - ❌ **Unbounded depth.** Subagents spawning subagents until nobody can say who decided what or spent which tokens.
66
66
  - ❌ **Barrier by aesthetics.** Synchronizing stages because the diagram looks cleaner — pay wall-clock only for a named cross-item dependency.
67
67
  - ❌ **Verifier-free fleets.** Ten generators and no refuter ships ten agents' worth of plausible-but-wrong at fleet speed.
68
+ - ❌ **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.
69
+ - ❌ **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,6 +1,6 @@
1
1
  {
2
2
  "name": "subagent-design",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Decompose a task into an orchestrator and subagents — one-mission role cards with typed output contracts, a topology (pipeline / parallel / judge panel) chosen with a reason, context-isolation rationale, and a verification stage that is never a generator. Use when the user wants to fan work out across multiple agents, design a multi-agent workflow or orchestration, or asks \"should this be one agent or several\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: vendor-risk-screen
3
+ description: Screen a vendor's security questionnaire and emit PROCEED, REVISE or BLOCKED with the evidence for each finding. Use when procurement asks whether a vendor can be onboarded, or when a completed security questionnaire needs a go/no-go. Do NOT use to write the questionnaire or to negotiate contract terms.
4
+ ---
5
+
6
+ # vendor-risk-screen
7
+
8
+ Read a completed vendor security questionnaire and return one verdict.
9
+
10
+ ## Workflow
11
+
12
+ 1. Read the questionnaire. Work only from what it states.
13
+ 2. Check the hard requirements: a SOC 2 Type II report or an equivalent (ISO 27001 certificate) dated within 12 months; encryption at rest and in transit; a named security contact; a breach-notification commitment.
14
+ 3. Emit the verdict:
15
+ - `PROCEED`: every hard requirement is met with evidence quoted from the questionnaire.
16
+ - `REVISE`: a requirement is unanswered or the evidence is out of date. List what the vendor must supply.
17
+ - `BLOCKED`: the vendor states it has no SOC 2 report or equivalent, or the questionnaire is missing.
18
+ 4. List each finding with the question it came from.
19
+
20
+ Non-interactive runs: with no questionnaire, emit `BLOCKED: need the completed questionnaire`.
21
+
22
+ ## Quality bar
23
+
24
+ - Never pass a vendor that has no SOC 2 report or equivalent.
25
+ - Never invent a certification that is not in the questionnaire.
26
+ - Every finding quotes the answer it rests on.
27
+
28
+ ## Anti-patterns to avoid
29
+
30
+ - ❌ Treating "in progress" as holding the certification.
31
+ - ❌ Passing on the vendor's reputation instead of its answers.
@@ -99,3 +99,5 @@ missing, emit `BLOCKED: need <the file | pdftotext on PATH>` and stop.
99
99
  - ❌ **Reading a PDF as raw bytes** when `pdftotext` is missing. Ask the user to install it or export the PDF to .docx.
100
100
  - ❌ **Treating inferred headings as fact.** A bold, large line in an unstyled document might be a pull quote.
101
101
  - ❌ **Critiquing a deck from its Markdown** without saying the charts and images were not seen.
102
+ - ❌ **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.
103
+ - ❌ **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.
@@ -0,0 +1,93 @@
1
+ %PDF-1.3
2
+ %���� ReportLab Generated PDF document (opensource)
3
+ 1 0 obj
4
+ <<
5
+ /F1 2 0 R /F2 3 0 R
6
+ >>
7
+ endobj
8
+ 2 0 obj
9
+ <<
10
+ /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
11
+ >>
12
+ endobj
13
+ 3 0 obj
14
+ <<
15
+ /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
16
+ >>
17
+ endobj
18
+ 4 0 obj
19
+ <<
20
+ /Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
21
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
22
+ >> /Rotate 0 /Trans <<
23
+
24
+ >>
25
+ /Type /Page
26
+ >>
27
+ endobj
28
+ 5 0 obj
29
+ <<
30
+ /Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
31
+ /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
32
+ >> /Rotate 0 /Trans <<
33
+
34
+ >>
35
+ /Type /Page
36
+ >>
37
+ endobj
38
+ 6 0 obj
39
+ <<
40
+ /PageMode /UseNone /Pages 8 0 R /Type /Catalog
41
+ >>
42
+ endobj
43
+ 7 0 obj
44
+ <<
45
+ /Author (anonymous) /CreationDate (D:20261001184656-04'00') /Creator (anonymous) /Keywords () /ModDate (D:20261001184656-04'00') /Producer (ReportLab PDF Library - \(opensource\))
46
+ /Subject (unspecified) /Title (untitled) /Trapped /False
47
+ >>
48
+ endobj
49
+ 8 0 obj
50
+ <<
51
+ /Count 2 /Kids [ 4 0 R 5 0 R ] /Type /Pages
52
+ >>
53
+ endobj
54
+ 9 0 obj
55
+ <<
56
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 357
57
+ >>
58
+ stream
59
+ Gat=fcV=Qc&B=0eMXTIh9iD)E[G@;j)\8f#L)6N;=Vk#0!SXDhmjpBIM[(4#A24S.q.;lYn;q4"*Up"I1RF11\q@(2(%a#Jor.X#A6o,>M>Hbc,N<&"'[R>V&$7'=Kt(jD#+qZ)1Xai7'+\0kT?u1;-KgPGH2@iQT%*r7Is6,H3o3QSQ;W@!+;hl1,/i:*/R'l=f"%FN?W8m7#rG*&5ZMc.AtRGhi&G0XG3"r'TnKGlTJLP[cY:aT+fF?^+g>B]8Mc+o]3niHYlPL_R@):@,/,/bSNQ;a\q/Psi(UR2\e'WME%Gbif9?nqi$3hJpoljNQjKk<+^mq^:<5SL\>>lLB'.D:eqDEeY\To7~>endstream
60
+ endobj
61
+ 10 0 obj
62
+ <<
63
+ /Filter [ /ASCII85Decode /FlateDecode ] /Length 326
64
+ >>
65
+ stream
66
+ Gat=f]5E6T'Sc?E`P5Bc$kuW.$<n^^;muN+>W<!j?sC'*b1l[KTXILK7(s("o(S]5"`donh<b=b-(`ut6ikt.PZ\<<_OK>WGQC[<Gb#SaENp\\"n*FO_SZWS7CRr4()k(8j;6n+%u0Tu@:&rL<->TXY'\'!<?E!Q8+iiO*R>2[3ih`-aJ2`[R8/$$f#/`D5,[uE;VLK-ob!dIZR/M$&qca'5]8de([Tf`EJ'r5P<kA(Zr'\)dsuN[3.%Pc6`iY>UJp>p%qFYR@F[m%C>trC+O)PQ46`k[gaLdI-OMET*OGi[!9\(DFq3ia8@J$>L#"]=Y*RE~>endstream
67
+ endobj
68
+ xref
69
+ 0 11
70
+ 0000000000 65535 f
71
+ 0000000061 00000 n
72
+ 0000000102 00000 n
73
+ 0000000209 00000 n
74
+ 0000000321 00000 n
75
+ 0000000514 00000 n
76
+ 0000000708 00000 n
77
+ 0000000776 00000 n
78
+ 0000001037 00000 n
79
+ 0000001102 00000 n
80
+ 0000001549 00000 n
81
+ trailer
82
+ <<
83
+ /ID
84
+ [<7983528689757fefa7437d75e3d55037><7983528689757fefa7437d75e3d55037>]
85
+ % ReportLab generated PDF document -- digest (opensource)
86
+
87
+ /Info 7 0 R
88
+ /Root 6 0 R
89
+ /Size 11
90
+ >>
91
+ startxref
92
+ 1966
93
+ %%EOF
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "file-to-markdown",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Convert a Word document, PowerPoint deck, Excel workbook, web page, CSV, JSON, text file or PDF into clean Markdown that keeps headings, lists, tables, links, bold and italic, slide titles and speaker notes, and reports everything it dropped (images, charts, comments, formulas, tracked changes), 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 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": {
@@ -56,6 +56,7 @@ class Report:
56
56
  def md_escape(text):
57
57
  text = text.replace("\\", "\\\\")
58
58
  text = re.sub(r"([*_`\[\]])", r"\\\1", text)
59
+ text = re.sub(r"<(?=[A-Za-z/!])", r"\\<", text) # literal <tag> text must not read as raw HTML
59
60
  return text
60
61
 
61
62
 
@@ -330,7 +331,7 @@ def docx_to_md(path, rep):
330
331
  if tcpr is not None and tcpr.find(W + "gridSpan") is not None:
331
332
  row.extend([""] * (int(tcpr.find(W + "gridSpan").get(W + "val", "1")) - 1))
332
333
  rows.append(row)
333
- if any(tbl.iter(W + "tbl")) and len(list(tbl.iter(W + "tbl"))) > 1:
334
+ if len(list(tbl.iter(W + "tbl"))) > 1:
334
335
  rep.notes.append("a nested table was flattened into its parent cell")
335
336
  rep.keep("tables")
336
337
  return md_table(rows)
@@ -339,6 +340,19 @@ def docx_to_md(path, rep):
339
340
  return "".join((n.text or "") if n.tag == W + "t" else "\t" for n in p.iter()
340
341
  if n.tag in (W + "t", W + "tab"))
341
342
 
343
+ def style_name(p):
344
+ ppr = p.find(W + "pPr")
345
+ ps = ppr.find(W + "pStyle") if ppr is not None else None
346
+ if ps is None:
347
+ return ""
348
+ sid = ps.get(W + "val", "")
349
+ return styles.get(sid, (sid.lower(), None))[0]
350
+
351
+ def code_text(p):
352
+ """Text of a code paragraph: line breaks and tabs kept, no inline formatting or escaping."""
353
+ return "".join((n.text or "") if n.tag == W + "t" else "\t" if n.tag == W + "tab" else "\n"
354
+ for n in p.iter() if n.tag in (W + "t", W + "tab", W + "br", W + "cr"))
355
+
342
356
  def run_size(p):
343
357
  """(largest font size in half-points, every text run bold?) for unstyled documents."""
344
358
  sizes, bold = [0], True
@@ -402,7 +416,19 @@ def docx_to_md(path, rep):
402
416
  if not text:
403
417
  prev_list = False if not li else prev_list
404
418
  continue
405
- if lvl:
419
+ sname = "" if lvl or li else style_name(el)
420
+ if re.match(r"(source ?code|code|html preformatted|preformatted text|macro text)$", sname):
421
+ # one code block may be one paragraph with line breaks or a run of one-line paragraphs
422
+ if blocks and blocks[-1][0] == "code":
423
+ blocks[-1] = ("code", blocks[-1][1] + "\n" + code_text(el))
424
+ else:
425
+ blocks.append(("code", code_text(el)))
426
+ rep.keep("code blocks")
427
+ prev_list = False
428
+ elif "quote" in sname or sname == "block text":
429
+ blocks.append(("block", "> " + text.replace("\n", "\n> ")))
430
+ prev_list = False
431
+ elif lvl:
406
432
  rep.keep("headings")
407
433
  blocks.append(("block", "#" * lvl + " " + text.replace(" \n", " ")))
408
434
  prev_list = False
@@ -439,6 +465,11 @@ def docx_to_md(path, rep):
439
465
  for k, (kind, text) in enumerate(blocks):
440
466
  if k and not (kind == "list" and blocks[k - 1][0] == "list"):
441
467
  out.append("")
468
+ if kind == "code":
469
+ fence = "```"
470
+ while fence in text:
471
+ fence += "`"
472
+ text = fence + "\n" + text + "\n" + fence
442
473
  out.append(text)
443
474
  return "\n".join(out) + "\n"
444
475
 
@@ -120,3 +120,5 @@ or page size uses the defaults, with an `[assumption]` line at the top of your r
120
120
  - ❌ **Pasting HTML tables into the Markdown.** They are dropped. Rewrite them as pipe tables.
121
121
  - ❌ **Editing the facts while restructuring.** Changing a heading level is formatting; rounding "3.4 hours" to "about 3 hours" is not.
122
122
  - ❌ **Converting a Markdown file of slide bullets.** One-line bullets under headings make a thin document. If it's a talk, it's a deck.
123
+ - ❌ **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.
124
+ - ❌ **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.
@@ -0,0 +1,80 @@
1
+ {
2
+ "$comment": "brand-kit output. deck-builder and marketing-flyer read this file; any field left out is asked for or defaulted by them. Paths are relative to this file. Every value carries where it came from in `sources`.",
3
+ "name": "Northwind Health",
4
+ "tagline": "Care that comes to you",
5
+ "logo": {
6
+ "primary": "logo.png",
7
+ "on_dark": "logo-white.png",
8
+ "mark": "mark.png",
9
+ "notes": "Keep clear space equal to the height of the N on every side. Never place the full-colour logo on the green."
10
+ },
11
+ "colors": {
12
+ "primary": "#0E5A46",
13
+ "secondary": "#3D7F6B",
14
+ "accent": "#F2A541",
15
+ "background": "#FFFFFF",
16
+ "text": "#1F2A28",
17
+ "extra": [
18
+ {
19
+ "name": "Mist",
20
+ "hex": "#E8F1EE",
21
+ "use": "panel backgrounds"
22
+ }
23
+ ]
24
+ },
25
+ "fonts": {
26
+ "heading": {
27
+ "family": "Georgia",
28
+ "fallback": "serif",
29
+ "weight": 700
30
+ },
31
+ "body": {
32
+ "family": "Arial",
33
+ "fallback": "sans-serif",
34
+ "weight": 400
35
+ }
36
+ },
37
+ "voice": {
38
+ "tone": "Warm, plain, confident. Short sentences.",
39
+ "use": [
40
+ "members",
41
+ "care team",
42
+ "near you"
43
+ ],
44
+ "avoid": [
45
+ "patients",
46
+ "cutting-edge",
47
+ "solutions"
48
+ ]
49
+ },
50
+ "imagery": {
51
+ "style": "Real people in daylight, community settings, no stock handshakes.",
52
+ "do": [
53
+ "natural light",
54
+ "diverse ages"
55
+ ],
56
+ "dont": [
57
+ "clinical close-ups",
58
+ "illustrated icons as hero images"
59
+ ]
60
+ },
61
+ "templates": {
62
+ "pptx": "northwind-master.potx"
63
+ },
64
+ "contact": {
65
+ "website": "northwindhealth.example",
66
+ "email": "hello@northwindhealth.example",
67
+ "phone": "",
68
+ "address": ""
69
+ },
70
+ "legal": {
71
+ "footer": "\u00a9 2026 Northwind Health",
72
+ "disclaimer": ""
73
+ },
74
+ "sources": {
75
+ "colors": "brand guidelines PDF, page 4 [explicit]",
76
+ "fonts": "brand guidelines PDF, page 6 [explicit]",
77
+ "voice": "website About page [inferred]",
78
+ "logo": "files supplied by the user [explicit]"
79
+ }
80
+ }
@@ -0,0 +1,42 @@
1
+ # Vendor onboarding policy
2
+
3
+ Northwind Health onboards a vendor only after the checks below are complete.[^1]
4
+
5
+ ## Scope
6
+
7
+ This policy covers every supplier paid more than $1,000 in a year, including software subscriptions.
8
+
9
+ ## Approval process
10
+
11
+ 1. The requester opens a vendor request.
12
+ 1. Attach the quote.
13
+ 2. Name the budget owner.
14
+ 2. Security reviews the vendor questionnaire.
15
+ 1. A vendor that handles member data needs a SOC 2 Type II report.
16
+ 3. Finance approves within the limits below.
17
+ 4. Legal signs the contract.
18
+
19
+ ## Approval limits
20
+
21
+ | Role | Limit | Second approver |
22
+ |:-----|------:|:----------------|
23
+ | Team lead | $5,000 | none |
24
+ | Director | $50,000 | Finance partner |
25
+ | CFO | unlimited | CEO above $500,000 |
26
+
27
+ ## Approval path
28
+
29
+ ```mermaid
30
+ flowchart TD
31
+ A[Request opened] --> B{Handles member data?}
32
+ B -->|Yes| C[Security review]
33
+ B -->|No| D[Finance approval]
34
+ C --> D
35
+ D --> E[Legal signs]
36
+ ```
37
+
38
+ ## Exceptions
39
+
40
+ An emergency purchase under $5,000 may be approved after the fact within **five working days**.
41
+
42
+ [^1]: Finance policy FIN-012, section 4.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "md-to-docx",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Turn a Markdown draft into a Word document (.docx) that someone outside engineering can open, edit and track changes in, with real Heading styles so the navigation pane and table of contents work, live hyperlinks, numbered and bulleted lists, tables, code blocks, embedded images and optional brand fonts and colours, and a warning for everything that could not be carried over. Use when the user wants a Markdown file as a Word doc, says \"send this as a .docx\", \"convert to Word\", \"legal needs it in Word\", or \"make this editable for the client\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -34,6 +34,8 @@ WARNINGS = []
34
34
 
35
35
  def warn(line, msg):
36
36
  where = "line %d: " % line if line else ""
37
+ if where + msg in WARNINGS: # a big table repeats one warning per cell; say it once
38
+ return
37
39
  WARNINGS.append(where + msg)
38
40
  print("WARN %s%s" % (where, msg), file=sys.stderr)
39
41
 
@@ -942,7 +944,7 @@ class Doc(object):
942
944
 
943
945
 
944
946
  def static_parts(title):
945
- now = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
947
+ now = datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
946
948
  ct = ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n'
947
949
  '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">'
948
950
  '<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>'
@@ -0,0 +1,80 @@
1
+ {
2
+ "$comment": "brand-kit output. deck-builder and marketing-flyer read this file; any field left out is asked for or defaulted by them. Paths are relative to this file. Every value carries where it came from in `sources`.",
3
+ "name": "Northwind Health",
4
+ "tagline": "Care that comes to you",
5
+ "logo": {
6
+ "primary": "logo.png",
7
+ "on_dark": "logo-white.png",
8
+ "mark": "mark.png",
9
+ "notes": "Keep clear space equal to the height of the N on every side. Never place the full-colour logo on the green."
10
+ },
11
+ "colors": {
12
+ "primary": "#0E5A46",
13
+ "secondary": "#3D7F6B",
14
+ "accent": "#F2A541",
15
+ "background": "#FFFFFF",
16
+ "text": "#1F2A28",
17
+ "extra": [
18
+ {
19
+ "name": "Mist",
20
+ "hex": "#E8F1EE",
21
+ "use": "panel backgrounds"
22
+ }
23
+ ]
24
+ },
25
+ "fonts": {
26
+ "heading": {
27
+ "family": "Georgia",
28
+ "fallback": "serif",
29
+ "weight": 700
30
+ },
31
+ "body": {
32
+ "family": "Arial",
33
+ "fallback": "sans-serif",
34
+ "weight": 400
35
+ }
36
+ },
37
+ "voice": {
38
+ "tone": "Warm, plain, confident. Short sentences.",
39
+ "use": [
40
+ "members",
41
+ "care team",
42
+ "near you"
43
+ ],
44
+ "avoid": [
45
+ "patients",
46
+ "cutting-edge",
47
+ "solutions"
48
+ ]
49
+ },
50
+ "imagery": {
51
+ "style": "Real people in daylight, community settings, no stock handshakes.",
52
+ "do": [
53
+ "natural light",
54
+ "diverse ages"
55
+ ],
56
+ "dont": [
57
+ "clinical close-ups",
58
+ "illustrated icons as hero images"
59
+ ]
60
+ },
61
+ "templates": {
62
+ "pptx": "northwind-master.potx"
63
+ },
64
+ "contact": {
65
+ "website": "northwindhealth.example",
66
+ "email": "hello@northwindhealth.example",
67
+ "phone": "",
68
+ "address": ""
69
+ },
70
+ "legal": {
71
+ "footer": "\u00a9 2026 Northwind Health",
72
+ "disclaimer": ""
73
+ },
74
+ "sources": {
75
+ "colors": "brand guidelines PDF, page 4 [explicit]",
76
+ "fonts": "brand guidelines PDF, page 6 [explicit]",
77
+ "voice": "website About page [inferred]",
78
+ "logo": "files supplied by the user [explicit]"
79
+ }
80
+ }
@@ -0,0 +1,35 @@
1
+ # Northwind Health operations review, Q3
2
+
3
+ Prepared for the ops committee. Figures cover 1 July to 30 September.
4
+
5
+ ## Summary
6
+
7
+ Appointment wait time fell and the no-show rate held steady. The call centre missed its answer-time target in August.
8
+
9
+ ## Results
10
+
11
+ | Measure | Q2 | Q3 | Target |
12
+ |:--------|---:|---:|-------:|
13
+ | Median wait for an appointment (days) | 9 | 6 | 7 |
14
+ | No-show rate | 8.4% | 8.1% | 8.0% |
15
+ | Calls answered within 60 seconds | 82% | 76% | 80% |
16
+ | Member satisfaction (out of 5) | 4.2 | 4.4 | 4.3 |
17
+
18
+ ## Dashboard
19
+
20
+ ![Q3 operations dashboard](../img/dashboard.png)
21
+
22
+ ## How a referral moves
23
+
24
+ ```mermaid
25
+ flowchart LR
26
+ A[Referral received] --> B{Complete?}
27
+ B -->|Yes| C[Booked]
28
+ B -->|No| D[Returned to referrer]
29
+ D --> A
30
+ ```
31
+
32
+ ## Next quarter
33
+
34
+ - Add two call-centre shifts on Mondays.
35
+ - Pilot text reminders at the Riverside clinic.
@@ -78,7 +78,8 @@ nothing. Formulas stay off unless the request says otherwise, noted as an `[assu
78
78
  | Anything else, including `n/a`, `1.234,50`, `30/09/2026` | Text |
79
79
 
80
80
  In Markdown cells, `**bold**`, `` `code` ``, links and images are reduced to their text, and
81
- `<br>` becomes a line break inside a wrapped cell. JSON numbers and booleans keep their type.
81
+ `<br>` becomes a line break inside a wrapped cell. JSON numbers and booleans keep their type,
82
+ except integers over 15 digits, which become text.
82
83
  JSON strings stay text except ISO dates, because whoever produced the JSON chose a string.
83
84
 
84
85
  ## Useful references in this skill
@@ -0,0 +1,25 @@
1
+ Invoice ID;Customer;Amount;Due date;Paid;Notes
2
+ 000731;Northwind Health;$199.99;2026-10-01;FALSE;
3
+ 000732;Fabrikam Clinics;$199.99;2026-11-06;TRUE;Net 30
4
+ 000733;Contoso Labs;$48,000.00;2026-12-11;TRUE;=SUM(C2:C9) please check
5
+ 000734;Adatum Care;$12,400.00;2026-10-16;FALSE;Second reminder sent
6
+ 000735;Tailspin Dental;$2,315.75;2026-11-21;TRUE;=HYPERLINK("http://pay.example","pay here")
7
+ 000736;Northwind Health;$48,000.00;2026-12-26;TRUE;
8
+ 000737;Fabrikam Clinics;$860.50;2026-10-03;FALSE;Disputed line 3
9
+ 000738;Contoso Labs;$199.99;2026-11-08;TRUE;=cmd|'/c calc'!A1
10
+ 000739;Adatum Care;$860.50;2026-12-13;TRUE;PO 4471
11
+ 000740;Tailspin Dental;$860.50;2026-10-18;FALSE;
12
+ 000741;Northwind Health;$2,315.75;2026-11-23;TRUE;
13
+ 000742;Fabrikam Clinics;$860.50;2026-12-28;TRUE;Net 30
14
+ 000743;Contoso Labs;$199.99;2026-10-05;FALSE;=SUM(C2:C9) please check
15
+ 000744;Adatum Care;$2,315.75;2026-11-10;TRUE;Second reminder sent
16
+ 000745;Tailspin Dental;$7,250.00;2026-12-15;TRUE;=HYPERLINK("http://pay.example","pay here")
17
+ 000746;Northwind Health;$12,400.00;2026-10-20;FALSE;
18
+ 000747;Fabrikam Clinics;$7,250.00;2026-11-25;TRUE;Disputed line 3
19
+ 000748;Contoso Labs;$860.50;2026-12-02;TRUE;=cmd|'/c calc'!A1
20
+ 000749;Adatum Care;$2,315.75;2026-10-07;FALSE;PO 4471
21
+ 000750;Tailspin Dental;$48,000.00;2026-11-12;TRUE;
22
+ 000751;Northwind Health;$12,400.00;2026-12-17;TRUE;
23
+ 000752;Fabrikam Clinics;$860.50;2026-10-22;FALSE;Net 30
24
+ 000753;Contoso Labs;$2,315.75;2026-11-27;TRUE;=SUM(C2:C9) please check
25
+ 000754;Adatum Care;$7,250.00;2026-12-04;TRUE;Second reminder sent
@@ -0,0 +1,32 @@
1
+ # Q3 ops review
2
+
3
+ ## Results
4
+
5
+ | Region | Tickets | Resolved | SLA met |
6
+ |:--|--:|--:|--:|
7
+ | North | 1,240 | 1,198 | 96.6% |
8
+ | South | 980 | 941 | 93.1% |
9
+ | East | 1,512 | 1,377 | 91.0% |
10
+ | West | 644 | 640 | 99.4% |
11
+
12
+ | Site ID | Site | Opened | Headcount |
13
+ |:--|:--|:--|--:|
14
+ | 00412 | Riverside | 2019-03-04 | 42 |
15
+ | 00077 | Hilltop | 2021-11-15 | 18 |
16
+ | 01250 | Harbour | 2024-06-01 | 27 |
17
+
18
+ ### Incidents by severity: P1 / P2 / P3 (Jul–Sep, all regions)
19
+
20
+ | Month | P1 | P2 | P3 |
21
+ |:--|--:|--:|--:|
22
+ | July | 1 | 6 | 31 |
23
+ | August | 3 | 9 | 28 |
24
+ | September | 0 | 4 | 35 |
25
+
26
+ ## Costs
27
+
28
+ | Item | Budget | Actual | Over budget |
29
+ |:--|--:|--:|:--|
30
+ | Overtime | $18,000 | $22,450 | true |
31
+ | Contractors | $40,000 | $36,200 | false |
32
+ | Tooling | $9,500 | $9,500 | false |
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "md-to-xlsx",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Turn the tables in a Markdown file, a CSV or a JSON array into an Excel workbook (.xlsx) that finance, ops or a client can sort, filter and sum, with one sheet per table named from its heading, real numbers, percentages, currency and dates instead of text, a bold frozen header row with filters, sensible column widths, and formulas left inert unless asked for. Use when the user wants a spreadsheet from Markdown tables or data, says \"put this in Excel\", \"convert the CSV to xlsx\", \"give finance a spreadsheet\", or \"turn this JSON into a sheet\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {