designlang 12.3.0 → 12.7.1

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.
@@ -1,15 +1,15 @@
1
1
  {
2
- "name": "design-extract",
2
+ "name": "designlang",
3
3
  "owner": {
4
4
  "name": "Manavarya Singh",
5
5
  "url": "https://github.com/Manavarya09"
6
6
  },
7
7
  "plugins": [
8
8
  {
9
- "name": "design-extract",
9
+ "name": "designlang",
10
10
  "source": "./",
11
- "description": "Extract the complete design language from any website colors, typography, spacing, shadows, components, and more. Outputs AI-optimized markdown, W3C design tokens, Tailwind config, and CSS variables.",
12
- "version": "1.0.0",
11
+ "description": "Seven slash commands wrapping the designlang CLI: /extract (full design language \u2192 DTCG, Tailwind, Figma), /grade (shareable HTML report card + SVG badge), /battle (head-to-head graded comparison), /remix (restyle in 6 vocabularies \u2014 brutalist, swiss, art-deco, cyberpunk, soft-ui, editorial), /pack (one downloadable design-system bundle), /theme-swap (OKLCH-correct recolour around a new brand primary), /brand (full editorial brand-guidelines book \u2014 13 chapters, hand-off-ready).",
12
+ "version": "12.7.1",
13
13
  "author": {
14
14
  "name": "Manavarya Singh"
15
15
  },
@@ -17,12 +17,20 @@
17
17
  "tags": [
18
18
  "design-system",
19
19
  "design-tokens",
20
- "css",
20
+ "dtcg",
21
21
  "tailwind",
22
+ "shadcn",
23
+ "figma",
22
24
  "typography",
23
25
  "colors",
24
- "web-scraping"
26
+ "motion",
27
+ "grade",
28
+ "battle",
29
+ "remix",
30
+ "pack",
31
+ "mcp",
32
+ "playwright"
25
33
  ]
26
34
  }
27
35
  ]
28
- }
36
+ }
@@ -1,24 +1,35 @@
1
1
  {
2
- "name": "design-extract",
3
- "description": "Extract the complete design language from any website. Produces W3C design tokens, AI-optimized markdown, Tailwind config, and CSS custom properties.",
4
- "version": "1.0.0",
2
+ "name": "designlang",
3
+ "description": "Extract any website's design language and ship it. Seven slash commands \u2014 /extract, /grade, /battle, /remix, /pack, /theme-swap, /brand \u2014 wrap the designlang CLI to pull DTCG tokens, Tailwind/shadcn/Figma vars, motion + voice, generate shareable graded report cards, head-to-head battle pages, six-vocabulary remixes, downloadable design-system bundles, OKLCH-correct theme recolouring, and full editorial brand-guidelines books.",
4
+ "version": "12.7.1",
5
5
  "author": {
6
6
  "name": "Manavarya Singh",
7
7
  "url": "https://github.com/Manavarya09"
8
8
  },
9
- "homepage": "https://github.com/Manavarya09/design-extract",
9
+ "homepage": "https://designlang.app",
10
10
  "repository": "https://github.com/Manavarya09/design-extract",
11
11
  "license": "MIT",
12
12
  "keywords": [
13
13
  "design-system",
14
14
  "design-tokens",
15
15
  "design-language",
16
- "css",
16
+ "dtcg",
17
17
  "tailwind",
18
+ "shadcn",
19
+ "figma-variables",
20
+ "css",
18
21
  "playwright",
19
22
  "extraction",
20
23
  "colors",
21
- "typography"
24
+ "typography",
25
+ "motion",
26
+ "grade",
27
+ "battle",
28
+ "remix",
29
+ "pack",
30
+ "claude-plugin",
31
+ "mcp"
22
32
  ],
23
- "skills": "./skills/"
24
- }
33
+ "skills": "./skills/",
34
+ "commands": "./commands/"
35
+ }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,235 @@
1
1
  # Changelog
2
2
 
3
+ ## [12.7.1] — 2026-05-09
4
+
5
+ **Brand book — visual polish pass.**
6
+
7
+ The v12.7.0 brand book had a real-data deficit: the cover used a generic
8
+ grade-coloured accent strip, every section opened with a philosophical
9
+ lede ("the felt pace of an interface", "form follows feeling"), and
10
+ components were a metadata table instead of a real mock. This pass
11
+ replaces all of that with the extracted values themselves.
12
+
13
+ Changes:
14
+
15
+ - **Cover** now leads with the brand's actual primary as a full-bleed
16
+ band (auto-detected, falls back through secondary/accent/most-used).
17
+ Asymmetric layout — band + label + hex above, host name in massive
18
+ serif below.
19
+ - **Lede paragraphs replaced with one-line data summaries.**
20
+ "1 primary · 1 secondary · 1 accent · 27 neutrals · 88 total" instead
21
+ of "Brand colours carry meaning. Neutrals carry structure."
22
+ - **Type specimen** now uses real headlines extracted from the site's
23
+ voice (`design.voice.sampleHeadings`). Falls back to a single neutral
24
+ pangram only when those are absent. The recycled aphorisms ("quiet
25
+ authority of restraint", "form follows feeling") are gone.
26
+ - **Colour chapter** — primary at full-width hero card, secondary +
27
+ accent at half-width below, neutrals as a flush horizontal strip,
28
+ full palette grid below. Hex labels render *inside* the swatch in
29
+ high-contrast text (auto black/white).
30
+ - **Components chapter** — renders an actual primary + secondary
31
+ button using the extracted brand colour and radius, plus a card
32
+ mockup using extracted surface + text colours. Metadata table moved
33
+ below the visual mock.
34
+ - **Accessibility chapter** — failing pairs render as actual stacked
35
+ colour blocks (foreground text on background with ratio inline),
36
+ not a pure table. Big score number on top.
37
+ - **Tokens chapter** — code blocks now have a header bar with the
38
+ language label and target filename.
39
+ - **"How to use"** trimmed from six rules of thumb to four punchy
40
+ ones, drops the "rule of thumb" framing.
41
+ - **Layout** — section padding moved into the wrap (no more gutter
42
+ around the hero band), TOC now sits on a tinted sub-paper background,
43
+ chapter headers are thinner with a bottom rule.
44
+
45
+ Same 13 chapters, same public API. No breaking changes.
46
+
47
+ 378/378 tests pass (one assertion updated for the new lowercase
48
+ "Brand guidelines" cover label).
49
+
50
+ ## [12.7.0] — 2026-05-09
51
+
52
+ **Brand book — full editorial design-guidelines document for any URL.**
53
+
54
+ \`designlang brand <url>\` produces a self-contained, print-ready HTML
55
+ "brand guidelines book" that documents every dimension of an extracted
56
+ design system. Cover, table of contents, 13 chapters: about, logo,
57
+ colour, typography, spacing, shape, iconography, motion, components,
58
+ voice, accessibility, tokens, how-to-use. Editorial layout, dark-mode
59
+ toggle, smooth-scroll TOC, drop-in code blocks per stack.
60
+
61
+ \`\`\`bash
62
+ npx designlang brand stripe.com
63
+ \`\`\`
64
+
65
+ \`\`\`
66
+ Brand book · 54 tokens · 3 fonts · grade B · https://stripe.com
67
+ ✓ stripe-com.brand.html
68
+ ✓ stripe-com.brand.md
69
+ ✓ stripe-com.brand.json
70
+ \`\`\`
71
+
72
+ ### Why this is different from \`pack\`, \`grade\`, and \`design-language.md\`
73
+
74
+ | Output | Audience | Format |
75
+ |---|---|---|
76
+ | \`pack\` (v12.4) | Devs picking up a design system | Directory of files (tokens, components, Storybook, starter) |
77
+ | \`grade\` (v12.1) | Audit / share | Single audit page with score + verdict |
78
+ | \`design-language.md\` | LLMs | AI-optimized markdown (data-dense) |
79
+ | **\`brand\` (v12.7)** | **Designers + handoff** | **Editorial brand-guidelines book — readable, print-ready, hand-off-ready** |
80
+
81
+ ### Added
82
+
83
+ - New CLI command: \`designlang brand <url> [-o] [-n] [--format] [--open]\`.
84
+ - New formatter \`src/formatters/brand-book.js\` exporting \`formatBrandBook\`
85
+ (HTML book) and \`formatBrandBookMarkdown\` (terse markdown summary).
86
+ - 13 chapters with editorial typography (Instrument Serif display + Inter
87
+ body), generous whitespace, smooth-scroll anchors, dark-mode toggle,
88
+ print stylesheet with page breaks at chapter boundaries.
89
+ - Per-colour section: large swatch + HEX/RGB/HSL/usage grid for brand
90
+ colours, mini-grid for neutrals + full palette.
91
+ - Per-token section: drop-in code blocks for CSS variables, Tailwind
92
+ config, with cross-reference to \`pack\` for the full bundle.
93
+ - Closing "How to use" chapter with six rules of thumb (hierarchy of
94
+ brand colour, two-family discipline, snap-to-scale spacing, tight
95
+ radius set, motion as feedback, accessibility as hard constraint).
96
+ - 7 new tests covering chapter coverage, host/colour/font rendering,
97
+ XSS escaping, sparse-design fallback, and mixed-shape component
98
+ anatomy (the bug that broke the first integration — slots / variants
99
+ arrive as objects, strings, or arrays from the extractor).
100
+
101
+ ### Plugin
102
+
103
+ \`/brand\` is the 7th slash command in the Claude Code plugin
104
+ (\`/extract\`, \`/grade\`, \`/battle\`, \`/remix\`, \`/pack\`, \`/theme-swap\`,
105
+ \`/brand\`). \`.claude-plugin/plugin.json\` and \`marketplace.json\`
106
+ bumped to 12.7.0.
107
+
108
+ ## [12.6.0] — 2026-05-06
109
+
110
+ **Theme-swap — recolour any extracted design around your brand primary.**
111
+
112
+ \`designlang theme-swap <url> --primary <hex>\` takes the existing
113
+ extraction and rotates the brand palette around a new primary while
114
+ preserving everything else: type scale, spacing rhythm, neutrals, motion,
115
+ component anatomy. Closes
116
+ [#57](https://github.com/Manavarya09/design-extract/issues/57).
117
+
118
+ \`\`\`bash
119
+ npx designlang theme-swap stripe.com --primary "#ff4800"
120
+ \`\`\`
121
+
122
+ \`\`\`
123
+ #533afd → #ff4800 · 91 colours · https://stripe.com
124
+ Hue shift: 118.5° · neutrals preserved · type/spacing/motion untouched
125
+
126
+ ✓ stripe-com-themeswap-ff4800.themeswap.html
127
+ ✓ stripe-com-themeswap-ff4800.themeswap.md
128
+ ✓ stripe-com-themeswap-ff4800.themeswap.json
129
+ ✓ stripe-com-themeswap-ff4800.themeswap.tokens.json
130
+ \`\`\`
131
+
132
+ ### Added
133
+
134
+ - New CLI command: \`designlang theme-swap <url> --primary <hex>\`
135
+ with \`--from\`, \`-o\`, \`-n\`, \`--format\`, \`--open\` flags.
136
+ - New module \`src/recolor.js\` exporting \`recolorDesign(design, opts)\`.
137
+ Operates in OKLCH so perceptual lightness stays constant — only hue
138
+ rotates. Auto-detects the source primary; pin it with \`--from\`.
139
+ Neutrals (chroma < 0.04 in OKLCH) are explicitly preserved so body
140
+ text, surfaces, and rule lines stay readable.
141
+ - New formatter \`src/formatters/theme-swap.js\` exporting
142
+ \`formatThemeSwap\` (HTML side-by-side preview) and
143
+ \`formatThemeSwapMarkdown\`.
144
+ - New OKLCH inverse helpers in \`src/utils/color-gamut.js\`:
145
+ \`srgbToOklab\`, \`srgbToOklch\`, \`hexToOklch\`, \`oklchToHex\` —
146
+ with chroma fallback for out-of-gamut colours.
147
+ - The recoloured design is fed through every existing emitter (DTCG,
148
+ Tailwind, shadcn, Figma vars, CSS vars), so the swap propagates
149
+ for free.
150
+ - 10 new tests covering primary-pinning, neutral preservation,
151
+ hue rotation, error paths, \`--from\` override, HTML/markdown shapes,
152
+ and XSS escaping.
153
+
154
+ ### Why
155
+
156
+ People keep asking *"what would Stripe look like in our brand colors?"*.
157
+ \`theme-swap\` answers it in 30 seconds. Bridges \`remix\` (full-vocab
158
+ restyle) and \`apply\` (token write-through to a project).
159
+
160
+ ## [12.5.0] — 2026-05-06
161
+
162
+ **Claude Code plugin — five slash commands wrapping the CLI.**
163
+
164
+ designlang is now a first-class Claude Code plugin. Drop it into any
165
+ session and every CLI verb becomes a slash command:
166
+
167
+ \`\`\`bash
168
+ /plugin install Manavarya09/design-extract
169
+ \`\`\`
170
+
171
+ | Command | What it does |
172
+ |---|---|
173
+ | \`/extract <url>\` | Full extraction → DTCG, Tailwind, Figma, motion, voice |
174
+ | \`/grade <url>\` | Shareable HTML Design Report Card (+ \`--badge\`) |
175
+ | \`/battle <urlA> <urlB>\` | Head-to-head graded battle card |
176
+ | \`/remix <url> --as <vocab>\` | Restyle in 6 vocabularies |
177
+ | \`/pack <url>\` | Bundle every output into one design-system directory |
178
+
179
+ ### Added
180
+
181
+ - \`commands/extract.md\`, \`commands/grade.md\`, \`commands/battle.md\`,
182
+ \`commands/remix.md\`, \`commands/pack.md\` — five slash-command
183
+ manifests with \`description\` + \`argument-hint\` frontmatter and prompt
184
+ bodies that wrap the CLI and surface tight summaries.
185
+ - Refreshed \`.claude-plugin/plugin.json\` (was stale at v1.0.0) — name
186
+ bumped to \`designlang\`, description rewritten around all v12 surfaces,
187
+ added \`commands\` directory pointer + expanded keywords.
188
+ - Refreshed \`.claude-plugin/marketplace.json\` — same updates plus
189
+ marketplace tags.
190
+ - New README section "Claude Code plugin" documenting install + the
191
+ five slash commands. Existing skills-ecosystem section retained for
192
+ Cursor / Codex / 40+ other agents.
193
+
194
+ No CLI behavior change. The slash commands are pure wrappers — they
195
+ shell out to \`npx designlang …\` and read the same output files.
196
+
197
+ ## [12.4.0] — 2026-05-05
198
+
199
+ **Pack — one command, one polished design-system bundle.**
200
+
201
+ \`designlang pack <url>\` runs the full extraction once and writes every
202
+ emitter output into a single, signed, layered directory. One artifact a
203
+ designer or dev can clone, drop into a project, or zip up and send to a
204
+ client. Closes [#59](https://github.com/Manavarya09/design-extract/issues/59).
205
+
206
+ ### Added
207
+
208
+ - New CLI command: \`designlang pack <url> [-o <dir>] [--with-clone] [--open]\`
209
+ - New module \`src/pack.js\` exporting \`buildPack(design, opts)\`
210
+ - Layout:
211
+ \`\`\`
212
+ <host>-design-system/
213
+ ├── README.md — bespoke, "Built from <host>" + grade + at-a-glance stats
214
+ ├── LICENSE.txt — provenance + usage guidance
215
+ ├── tokens/ — DTCG + Tailwind + CSS vars + Figma vars + motion + theme.js
216
+ ├── components/ — typed React stubs (anatomy.tsx)
217
+ ├── storybook/ — runnable Storybook project
218
+ ├── starter/ — minimal HTML starter wired to tokens/variables.css
219
+ ├── prompts/ — v0.txt · lovable.txt · cursor.md · claude-artifacts.md
220
+ │ └── recipes/ — recipe-<component>.md cards (named, no longer indexed)
221
+ └── extras/ — voice.json + prompt-pack.md rollup
222
+ \`\`\`
223
+ - 7 new tests covering directory shape, valid JSON outputs, README content,
224
+ starter wiring, recipe filenames, and a regression test for the
225
+ double-stringify bug that broke first integration.
226
+
227
+ ### Why
228
+
229
+ The 17+ loose files designlang already emits are the right pieces, but
230
+ asking a user to zip them themselves is friction. \`pack\` is the same
231
+ artifacts as one polished, downloadable, cite-able bundle.
232
+
3
233
  ## [12.3.0] — 2026-05-05
4
234
 
5
235
  **Remix — restyle any site in a different design vocabulary.**
package/README.md CHANGED
@@ -26,10 +26,13 @@ It also goes where extractors don't: **layout patterns**, **responsive behavior
26
26
 
27
27
  ```bash
28
28
  npx designlang https://stripe.com # extract everything
29
- npx designlang remix stripe.com --as cyberpunk # restyle in another vocabulary ← v12.3
30
- npx designlang remix stripe.com --all # emit all 6 vocabs at once ← v12.3
31
- npx designlang grade https://stripe.com --badge # report card + SVG badge ← v12.2
32
- npx designlang battle stripe.com vercel.com # head-to-head graded fight ← v12.2
29
+ npx designlang brand stripe.com # full brand-guidelines book (13 chapters) ← v12.7
30
+ npx designlang theme-swap stripe.com --primary "#ff4800" # recolour around your brand ← v12.6
31
+ npx designlang pack stripe.com # one polished design-system directory ← v12.4
32
+ npx designlang remix stripe.com --as cyberpunk # restyle in another vocabulary ← v12.3
33
+ npx designlang remix stripe.com --all # emit all 6 vocabs at once ← v12.3
34
+ npx designlang grade https://stripe.com --badge # report card + SVG badge ← v12.2
35
+ npx designlang battle stripe.com vercel.com # head-to-head graded fight ← v12.2
33
36
  npx designlang clone https://stripe.com # working Next.js starter
34
37
  npx designlang --full https://stripe.com # screenshots + responsive + interactions
35
38
  ```
@@ -129,7 +132,10 @@ designlang mcp # stdio MCP server for Cursor / Clau
129
132
  | Grade (v12.1) | `designlang grade <url>` | Shareable HTML "Design Report Card" — letter grade, 8 dimensions, evidence, strengths + fixes |
130
133
  | Battle (v12.2) | `designlang battle <A> <B>` | Head-to-head graded battle card with verdict, dimension table, palette comparison |
131
134
  | Badge (v12.2) | `designlang grade --badge` | Shields.io-style SVG badge — `design · B · 87` — drop into any README. Live endpoint: `designlang.app/badge/<host>.svg` |
132
- | Remix (NEW v12.3) | `designlang remix <url> --as <vocab>` | Restyle the audited page in another vocabulary (brutalist / swiss / art-deco / cyberpunk / soft-ui / editorial). `--all` emits all 6 |
135
+ | Remix (v12.3) | `designlang remix <url> --as <vocab>` | Restyle the audited page in another vocabulary (brutalist / swiss / art-deco / cyberpunk / soft-ui / editorial). `--all` emits all 6 |
136
+ | Pack (v12.4) | `designlang pack <url>` | Bundle every output (tokens / components / Storybook / starter / prompts) into one polished design-system directory |
137
+ | Theme-swap (v12.6) | `designlang theme-swap <url> --primary <hex>` | Recolour the extracted design around a new brand primary. OKLCH hue rotation, neutrals preserved, type/spacing/motion untouched |
138
+ | Brand book (NEW v12.7) | `designlang brand <url>` | Full editorial brand-guidelines document (13 chapters: cover, about, logo, colour, type, spacing, shape, iconography, motion, components, voice, a11y, tokens, how-to-use). Print-ready, dark-mode toggle, hand-off-ready |
133
139
  | Watch | `designlang watch <url>` | Monitor for design changes on interval |
134
140
  | Diff | `designlang diff <A> <B>` | Compare two sites (MD + HTML) |
135
141
  | Multi-brand | `designlang brands <urls...>` | N-site comparison matrix |
@@ -185,6 +191,9 @@ Commands:
185
191
  grade <url> Generate a shareable HTML Design Report Card (--format html|md|json|svg|all, --badge, --open)
186
192
  battle <urlA> <urlB> Head-to-head graded battle card (--format html|md|json|all, --open)
187
193
  remix <url> Restyle in another vocabulary (--as brutalist|swiss|art-deco|cyberpunk|soft-ui|editorial, --all, --list, --open)
194
+ pack <url> Bundle every output into one design-system directory (--with-clone, --open)
195
+ theme-swap <url> --primary <hex> Recolour around a new brand primary (--from, --format html|md|json|tokens|all, --open)
196
+ brand <url> Generate a full editorial brand-guidelines book (--format html|md|json|all, --open)
188
197
  watch <url> Monitor for design changes on interval
189
198
  diff <urlA> <urlB> Compare two sites' design languages
190
199
  brands <urls...> Multi-brand comparison matrix
@@ -232,16 +241,37 @@ designlang ships surfaces beyond the CLI:
232
241
  | **GitHub Action** | [`github-action/`](github-action/) | "Design regression guard" — diffs tokens on every PR and comments. |
233
242
  | **Chrome extension** | [`chrome-extension/`](chrome-extension/) | One-click handoff from any tab (MV3, `activeTab` only). |
234
243
  | **MCP server** | `npx designlang mcp` | Exposes the extracted design as MCP resources + tools for Cursor, Claude Code, Windsurf, etc. See [`docs/MCP-REGISTRY.md`](docs/MCP-REGISTRY.md). |
244
+ | **Claude Code plugin** | [`.claude-plugin/`](.claude-plugin/) | Five slash commands inside Claude Code — `/extract`, `/grade`, `/battle`, `/remix`, `/pack`. |
235
245
 
236
- ## Agent Skill
246
+ ## Claude Code plugin
237
247
 
238
- Works with **Claude Code, Cursor, Codex, and 40+ AI coding agents** via the skills ecosystem:
248
+ Drop designlang straight into Claude Code as a plugin. Every CLI command becomes a slash command:
249
+
250
+ ```bash
251
+ /plugin install Manavarya09/design-extract
252
+ ```
253
+
254
+ Then inside any Claude Code session:
255
+
256
+ | Slash command | What it does |
257
+ |---|---|
258
+ | `/extract <url>` | Full extraction → DTCG tokens, Tailwind, Figma vars, motion, voice |
259
+ | `/grade <url>` | Shareable HTML "Design Report Card" (+ `--badge` for an SVG) |
260
+ | `/battle <urlA> <urlB>` | Head-to-head graded battle card |
261
+ | `/remix <url> --as <vocab>` | Restyle in brutalist / swiss / art-deco / cyberpunk / soft-ui / editorial |
262
+ | `/pack <url>` | Bundle every output into one design-system directory |
263
+
264
+ Manifest: [`.claude-plugin/plugin.json`](.claude-plugin/plugin.json) · marketplace: [`.claude-plugin/marketplace.json`](.claude-plugin/marketplace.json) · commands: [`commands/`](commands/) · skills: [`skills/`](skills/).
265
+
266
+ ## Agent skill (other ecosystems)
267
+
268
+ Works with **Cursor, Codex, and 40+ AI coding agents** via the skills ecosystem:
239
269
 
240
270
  ```bash
241
271
  npx skills add Manavarya09/design-extract
242
272
  ```
243
273
 
244
- In Claude Code, use `/extract-design <url>`.
274
+ In Cursor / Codex / etc., use `/extract-design <url>`.
245
275
 
246
276
  ## Website
247
277
 
package/SUPPORT.md ADDED
@@ -0,0 +1,22 @@
1
+ # Support
2
+
3
+ Need help with **designlang**?
4
+
5
+ - **Bugs** — open an [issue](https://github.com/Manavarya09/design-extract/issues/new/choose) with steps to reproduce and the URL you were extracting.
6
+ - **Feature requests** — see the [open roadmap](https://github.com/Manavarya09/design-extract/issues?q=is%3Aopen+label%3Aroadmap) (issues #56–#70). Feel free to claim one with a comment, or open a new one.
7
+ - **Security issues** — see [SECURITY.md](SECURITY.md). Please report privately.
8
+ - **Questions** — start a [Discussion](https://github.com/Manavarya09/design-extract/discussions) or DM [@manavaryasingh](https://github.com/Manavarya09).
9
+
10
+ ## Surfaces
11
+
12
+ | Surface | Where to ask |
13
+ |---|---|
14
+ | CLI (`npx designlang`) | issue with the failing command + Node version |
15
+ | Claude Code plugin | issue tagged `claude-code` |
16
+ | MCP server (`designlang mcp`) | issue tagged `mcp` |
17
+ | Website (designlang.app) | issue tagged `website` |
18
+ | VS Code / Raycast / Figma / Chrome extensions | issue tagged with the surface name |
19
+
20
+ ## Response time
21
+
22
+ Best effort within 5 business days. PRs welcome — see [CONTRIBUTING.md](CONTRIBUTING.md).