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.
- package/package.json +1 -1
- package/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +1 -0
- package/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +1 -1
- package/packs/ai-engineering/skills/agent-budget/SKILL.md +2 -0
- package/packs/ai-engineering/skills/agent-budget/manifest.json +1 -1
- package/packs/ai-engineering/skills/agent-loop-design/SKILL.md +2 -0
- package/packs/ai-engineering/skills/agent-loop-design/manifest.json +1 -1
- package/packs/ai-engineering/skills/agent-threat-model/SKILL.md +2 -0
- package/packs/ai-engineering/skills/agent-threat-model/manifest.json +1 -1
- package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +1 -0
- package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +1 -1
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +4213 -0
- package/packs/ai-engineering/skills/subagent-design/SKILL.md +2 -0
- package/packs/ai-engineering/skills/subagent-design/manifest.json +1 -1
- package/packs/api-builder/skills/eval-harness-generator/evals/files/1/SKILL.md +31 -0
- package/packs/converters/skills/file-to-markdown/SKILL.md +2 -0
- package/packs/converters/skills/file-to-markdown/evals/files/1/northwind-q3.pptx +0 -0
- package/packs/converters/skills/file-to-markdown/evals/files/2/acme-contract-summary.pdf +93 -0
- package/packs/converters/skills/file-to-markdown/manifest.json +1 -1
- package/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +33 -2
- package/packs/converters/skills/md-to-docx/SKILL.md +2 -0
- package/packs/converters/skills/md-to-docx/evals/files/1/brand/brand.json +80 -0
- package/packs/converters/skills/md-to-docx/evals/files/1/brand/logo-white.png +0 -0
- package/packs/converters/skills/md-to-docx/evals/files/1/brand/logo.png +0 -0
- package/packs/converters/skills/md-to-docx/evals/files/1/brand/mark.png +0 -0
- package/packs/converters/skills/md-to-docx/evals/files/1/docs/vendor-onboarding.md +42 -0
- package/packs/converters/skills/md-to-docx/manifest.json +1 -1
- package/packs/converters/skills/md-to-docx/scripts/md_to_docx.py +3 -1
- package/packs/converters/skills/md-to-html/evals/files/1/brand/brand.json +80 -0
- 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 +35 -0
- package/packs/converters/skills/md-to-html/evals/files/1/img/dashboard.png +0 -0
- package/packs/converters/skills/md-to-xlsx/SKILL.md +2 -1
- package/packs/converters/skills/md-to-xlsx/evals/files/1/exports/northwind-invoices.csv +25 -0
- package/packs/converters/skills/md-to-xlsx/evals/files/2/reports/q3-ops-review.md +32 -0
- package/packs/converters/skills/md-to-xlsx/manifest.json +1 -1
- package/packs/converters/skills/md-to-xlsx/scripts/md_to_xlsx.py +18 -4
- package/packs/converters/skills/mermaid-render/SKILL.md +1 -0
- package/packs/converters/skills/mermaid-render/evals/files/1/docs/contoso-orders.md +23 -0
- package/packs/converters/skills/mermaid-render/manifest.json +1 -1
- package/packs/core/skills/brief-intake/SKILL.md +1 -0
- package/packs/core/skills/brief-intake/manifest.json +1 -1
- package/packs/core/skills/output-hygiene/SKILL.md +2 -0
- package/packs/core/skills/output-hygiene/manifest.json +1 -1
- package/packs/design/skills/brand-kit/evals/files/1/brand/northwind-logo-white.png +0 -0
- package/packs/design/skills/brand-kit/evals/files/1/brand/northwind-logo.png +0 -0
- package/packs/design/skills/deck-builder/SKILL.md +2 -0
- package/packs/design/skills/deck-builder/manifest.json +1 -1
- package/packs/design/skills/marketing-flyer/evals/files/1/brand/brand.json +80 -0
- 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/dev-team/skills/agents-md-generator/SKILL.md +4 -2
- package/packs/dev-team/skills/agents-md-generator/evals/files/1/.github/workflows/ci.yml +10 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/1/Makefile +5 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/1/alembic/versions/0001_create_bookings.py +10 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/1/booking/__init__.py +0 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/1/booking/app.py +8 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/1/pyproject.toml +11 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/1/tests/test_health.py +5 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/2/AGENTS.md +3 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/2/package.json +12 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/2/src/index.ts +1 -0
- package/packs/dev-team/skills/agents-md-generator/manifest.json +1 -1
- package/packs/dev-team/skills/agents-md-generator/templates/agents-md.md +2 -2
- package/packs/dev-team/skills/devils-advocate/SKILL.md +1 -0
- package/packs/dev-team/skills/devils-advocate/manifest.json +1 -1
- package/packs/dev-team/skills/pre-merge-review/SKILL.md +2 -0
- package/packs/dev-team/skills/pre-merge-review/manifest.json +1 -1
- package/packs/dev-team/skills/pre-merge-review/scripts/gate.py +4 -1
- package/packs/infra-as-code/skills/terraform-plan-review/evals/files/2/plan.json +133 -0
- package/packs/product-manager/skills/prfaq/SKILL.md +1 -0
- package/packs/product-manager/skills/prfaq/manifest.json +1 -1
- package/packs/product-manager/skills/strategy-analysis/SKILL.md +1 -1
- package/packs/product-manager/skills/strategy-analysis/manifest.json +1 -1
- package/packs/product-manager/skills/success-metrics/SKILL.md +2 -0
- package/packs/product-manager/skills/success-metrics/manifest.json +1 -1
- package/packs/product-manager/skills/user-journey-map/SKILL.md +1 -0
- package/packs/product-manager/skills/user-journey-map/manifest.json +1 -1
- package/packs/research/skills/research-plan/SKILL.md +2 -0
- package/packs/research/skills/research-plan/manifest.json +1 -1
- package/packs/skill-engineering/skills/skill-review/evals/files/1/skills/changelog-writer/SKILL.md +10 -0
- package/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/SKILL.md +12 -0
- package/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/references/tone.md +3 -0
- package/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/scripts/collect.py +6 -0
- package/packs/solution-architect/skills/adr-generator/SKILL.md +3 -2
- package/packs/solution-architect/skills/adr-generator/manifest.json +1 -1
- package/packs/solution-architect/skills/figma-diagrams/SKILL.md +1 -0
- package/packs/solution-architect/skills/figma-diagrams/manifest.json +1 -1
- package/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +3 -1
- package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/deploys.csv +49 -0
- package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/incidents.csv +7 -0
- package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/prs.csv +84 -0
- package/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +1 -1
- package/packs/sre-oncall/skills/postmortem-generator/SKILL.md +1 -0
- package/packs/sre-oncall/skills/postmortem-generator/manifest.json +1 -1
- package/packs/stakeholder-comms/skills/audience-profile/SKILL.md +1 -0
- package/packs/stakeholder-comms/skills/audience-profile/manifest.json +1 -1
- package/packs/stakeholder-comms/skills/decision-log/SKILL.md +1 -0
- package/packs/stakeholder-comms/skills/decision-log/manifest.json +1 -1
- package/packs/stakeholder-comms/skills/guide-builder/SKILL.md +1 -0
- package/packs/stakeholder-comms/skills/guide-builder/manifest.json +1 -1
- package/packs/trackers/skills/backlog-triage/SKILL.md +1 -0
- package/packs/trackers/skills/backlog-triage/evals/files/1/examples/northwind-backlog.csv +28 -0
- package/packs/trackers/skills/backlog-triage/evals/files/2/issues.json +6052 -0
- package/packs/trackers/skills/backlog-triage/manifest.json +1 -1
- package/packs/trackers/skills/team-status-report/SKILL.md +1 -0
- package/packs/trackers/skills/team-status-report/evals/files/1/examples/northwind-week-40.csv +16 -0
- package/packs/trackers/skills/team-status-report/evals/files/2/issues.json +1212 -0
- package/packs/trackers/skills/team-status-report/manifest.json +1 -1
- package/packs/trackers/skills/tracker-brief-sync/evals/files/1/examples/prd-guest-checkout.md +53 -0
- package/packs/trackers/skills/tracker-brief-sync/evals/files/2/examples/prd-guest-checkout.md +53 -0
- 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.
|
|
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.
|
|
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
|
|
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
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -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.
|
|
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.
|
|
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
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
+

|
|
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.
|
|
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": {
|