Component Inventory logo

Component Inventory

Organization
staple-lab
component-inventory

Use when building or updating the design system's catalogue site and its machine-readable registry - component gallery, auto-extracted props tables, token explorer, lifecycle/status board, adoption metrics, a11y and test status, and the generated AGENTS.md that gives AI coding agents the same source of truth. Triggers on "design system docs", "component inventory", "storybook alternative", "props table", "catalogue".

Overview

Publisherstaple-lab
Repositorydesign-system-skills
Skill namecomponent-inventory
Stars
7
Forks
0
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by staple-lab on GitHub. Read the source before you install it.

Installation

Install the Component Inventory AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/staple-lab/design-system-skills/tree/main/plugins/design-system/skills/component-inventory
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/staple-lab/design-system-skills.git /tmp/design-system-skills
mkdir -p .claude/skills
cp -r /tmp/design-system-skills/plugins/design-system/skills/component-inventory .claude/skills/component-inventory
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Component Inventory in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Component Inventory on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Component Inventory is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Component inventory

The inventory is the design system's catalogue — the page a developer opens to answer "does this already exist, what is it called, and how do I use it". Storybook is the workbench (isolated development, interaction testing); the inventory is the shop window. Teams that run both use them for different jobs; teams that run one usually want this one.

References worth copying from: Atlassian Design System (the props tables and the do/don't pairs), Shopify Polaris (guidance quality and content standards), Vercel Geist (density, keyboard navigation, restraint), Adobe Spectrum (the accessibility documentation depth).

The registry is the product

source of truth  →  .design-system/registry.json  →  ┬→ inventory site
(code + tokens)      (generated, never hand-written)  ├→ AGENTS.md (AI contract)
                                                      ├→ lint rule data
                                                      └→ adoption + coverage reports

Docs drift from code because they are written twice. Generate the registry from the source, then everything downstream is a view. If a fact appears in the site but not in the registry, you built it wrong.

What is generated versus authored:

FieldSource
props (name, type, default, required, description)react-docgen-typescript over the real types
tokens consumedstatic scan of the component's styles
test + a11y statuslast Vitest/axe run (--reporter=json)
lint violationslast ESLint run
bundle sizebuild output per entry
adoption / usage countscan of consuming code
status, since, description, do/don't, guidanceauthored in the component's .meta.ts — judgement cannot be extracted

The build script is ${CLAUDE_PLUGIN_ROOT}/templates/registry/build-registry.mjs; the schema is registry.schema.json.

What every component page must show

This is the bar. Anything less and people go read the source instead — which is fine once and fatal at scale.

  1. Live examples, per variant and per state, with the code visible and copyable. Interactive, not screenshots.

    "Live" means the real component is mounted on the page — not a syntax-highlighted string of what it would look like. This is the difference between a catalogue and a list, and it is the one thing readers actually come for: a props table tells them the API exists, a rendered Button tells them what they are getting. The mechanism is a <Name>.examples.tsx beside each component, which the site eagerly globs (components/*/*.examples.tsx) and renders; the meta file's code string is the caption, not the example. Ship a component without that file and its page silently degrades to dead code blocks — silently, because nothing fails, so it survives review and lands looking finished.

    Treat a stable or beta component with no .examples.tsx as a build failure, the same way an empty a11y section is. ds-component-author owns writing the file; the inventory's job is to notice when it is missing rather than to render a placeholder and move on.

  2. Complete props table — name, resolved TypeScript type, default, required, description, deprecation notice. Auto-extracted, so it cannot be wrong.

  3. Anatomy — the named parts of a compound component, so Dialog.Footer is discoverable without reading the exports.

  4. Keyboard map — every key, in a table. The most-consulted section of any good design system's docs, and the most commonly missing.

  5. Accessibility notes — the roles and ARIA the component provides, what the consumer still owes (an accessible name for icon-only usage), and known limitations. State them; a documented gap is a decision, an undocumented one is a surprise.

  6. Do / don't pairs, rendered side by side. The single highest-signal piece of guidance you can write — it takes ten seconds to absorb and prevents the misuse that a paragraph of prose does not.

  7. Status badge — draft / beta / stable / deprecated, plus the version it landed in and, for deprecations, the migration.

  8. Tokens consumed — links back to the token explorer.

  9. Test + a11y status — the actual last-run result, with the count of behavioural tests and the axe verdict. Not a claim, a number.

  10. Adoption — where it is used, and what unmigrated hand-rolled equivalents still exist.

System-level pages

  • Foundations — colour (every ramp with its measured contrast ratios against the surfaces it is used on), type scale rendered at real size, spacing, radius, elevation, motion with playable examples.
  • Token explorer — searchable and filterable by tier, with copy-to-clipboard of the token name and the var(). Theme and density switchers apply live to the whole site, which is also the fastest way to spot a component that never got dark-mode treatment.
  • Status board — every component in one table: status, test coverage, a11y, bundle size, adoption. This is the page a design system lead opens on Monday, and it is what turns "we should improve the system" into a ranked list.
  • Getting started — install, theme setup, the first component, and the escape-hatch policy.
  • Patterns and Content — starter pages for cross-component judgement: forms wiring and validation timing, the three kinds of empty state, field- vs page-level errors, the skeleton-vs-spinner rule; and voice, action labels, the error-message pattern, a terminology table. These two pages are authored, not generated — the one deliberate exception to the registry rule, because a decision that spans components ("validate on blur, not keystroke") has no single source file to be extracted from. The template ships them as editable starter guidance in the site source, and each page's intro says so, so nobody waits for a generator to update them.
  • Contribution — how a component graduates draft → stable, who reviews, what the bar is. A system with no gate becomes a junk drawer within a year.

Search

Make it good, and make it keyboard-first (/ or ⌘K). Index component names, prop names, token names, and synonyms — someone looking for "dropdown" must find Select and Menu, and someone typing "modal" must find Dialog. The synonym list is authored in the meta file and is worth ten minutes of thought per component: failed search is the main reason people build a duplicate.

The AI contract — AGENTS.md

Generate it from the registry. This is what stops agents inventing component names and hardcoding hexes, and it is the cheapest quality win in the whole system:

markdown
# Design system: @acme/ui

Import from `@acme/ui`. Never from `@acme/ui/dist/*` or from the primitives directly.

## Rules
- Semantic tokens only: `var(--ds-color-bg-accent)`. Never a raw hex, never `--ds-color-accent-600` (primitive tier).
- Spacing comes from the scale: `var(--ds-space-4)`. Never a raw px value.
- Every interactive element needs a visible `:focus-visible` ring.
- Icon-only buttons require `aria-label` (the type will reject them otherwise).

## Components (24 stable, 3 beta)
| Component | Status | Use for | Don't use for | Props |
|---|---|---|---|---|
| Button | stable | Actions the user takes | Navigation — use Link | variant, size, loading, startIcon, … |
| Dialog | stable | Focused tasks needing a decision | Non-blocking messages — use Toast | open, onOpenChange, … |

## Tokens
Full list: `tokens/dist/tokens.json`. Semantic tier only in components.

Keep it generated and short. A 4,000-line AGENTS.md is skimmed by agents the same way it is by humans. Link out to the registry JSON for the exhaustive data — an agent can read it on demand, and it is the same file the site renders.

The registry build emits llms.txt alongside AGENTS.md — same data, the llms.txt convention, for the tools that look for that filename instead. Two filenames, one generator; never author either by hand.

For agents that speak MCP, ${CLAUDE_PLUGIN_ROOT}/templates/mcp/server.mjs (dependency-free Node, wired as npm run mcp — see ${CLAUDE_PLUGIN_ROOT}/templates/mcp/README.md) serves the registry and tokens live with four tools: search_components, get_component, search_tokens, get_guidelines. The division of labour: AGENTS.md is the ambient contract that costs nothing to have in context, the MCP server is the on-demand one — an agent queries for exactly the component it is writing against and gets current data, instead of a stale snapshot of everything.

Building the site

Template: ${CLAUDE_PLUGIN_ROOT}/templates/inventory/ — a Vite + React app that reads registry.json and tokens.json, styled entirely with the system's own tokens. That last part is deliberate: the docs site is the system's first consumer, so a token that does not work shows up here first, and dogfooding is not optional if you want to find these problems before your users do.

The site's own styles are authored against the default --ds- var prefix (in src/inventory.css and src/pages.tsx). If the project sets a different tokens.prefix in design-system.config.json, rewrite the prefix in the copied site files at scaffold time — a mechanical sed 's/--ds-/--<prefix>-/g', nothing more. That is the only prefix-sensitive copy step: the registry scanner and the token data read the prefix from the config and the generated tokens.json, so they follow automatically.

Deploy on merge to main. Documentation that requires a local dev server gets read by the person who wrote it and nobody else.

Keeping it honest

  • Regenerate the registry in CI, and fail the build if it differs from the committed one. That single check is what makes "the docs are always current" true rather than aspirational.
  • Fail the build on a stable component with no examples, no do/don't, or an empty a11y section. The bar has to be mechanical or it moves.
  • Track failed searches if you can. They are a direct list of what people expected to exist — the best roadmap input available.
  • Review deprecations quarterly. A deprecation with no removal date is a permanent fixture, and consumers learn to ignore the badge.

Frequently asked questions

What does the Component Inventory AI skill do?

Use when building or updating the design system's catalogue site and its machine-readable registry - component gallery, auto-extracted props tables, token explorer, lifecycle/status board, adoption metrics, a11y and test status, and the generated AGENTS.md that gives AI coding agents the same source of truth. Triggers on "design system docs", "component inventory", "storybook alternative", "props table", "catalogue".

Why use Component Inventory on TypingMind?

Because you install it once and use it with any model. Component Inventory is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Component Inventory in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/staple-lab/design-system-skills/tree/main/plugins/design-system/skills/component-inventory. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Component Inventory?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Component Inventory?

As many as you like. As long as a model supports skills, you can use Component Inventory with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Component Inventory AI skill free?

Yes. It is published on GitHub by staple-lab under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇