Agent skill

Ds Token Lint

by baloise in baloise/design-system

Check a component's design tokens in Base.tokens.json against the canonical naming convention (packages/tokens/CONTEXT.md "Token Naming Anatomy"), report violations as a markdown table, and apply…

Apache-2.0Auto-check passedFrontend & Design

Install Ds Token Lint

skills CLI
$ npx skills add baloise/design-system --skill ds-token-lint -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install baloise/design-system ds-token-lint --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/baloise/design-system.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/ds-token-lint .claude/skills/ds-token-lint && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
ds-token-lint
GitHub stars
114
Token cost
~2.5k tokens
SKILL.md length
1,178 words
Files
5
Skills in repo
10
Repo updated
First seen
Licence
Apache-2.0

At a glance

Check a component's design tokens in Base.tokens.json against the canonical naming convention (packages/tokens/CONTEXT.md "Token Naming Anatomy"), report violations as a markdown table, and apply…

  • Works in 2 steps: Check (Report) → Apply (only after explicit approval)
  • The user asks to lint/check/audit design tokens for a component
  • SKILL.md covers Quick Start, What Gets Checked, Workflow and Examples, plus 2 more sections
  • Runs JavaScript scripts from its folder; calls node and pnpm

What it does

Ds Token Lint is an agent skill from baloise/design-system. Check a component's design tokens in Base.tokens.json against the canonical naming convention (packages/tokens/CONTEXT.md "Token Naming Anatomy"), report violations as a markdown table, and apply approved renames to Base.tokens.json and the component's SCSS. Use when the user asks to lint/check/audit design tokens for a component.

Its SKILL.md is about 2.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files (for example `README.md`, `REFERENCE.md` and `implementation.js`).

It sits in Frontend & Design, covering Linting and formatting, Design tokens and CSS and styling. The repository describes itself as: The Baloise Design System consists of reusable components and a clearly defined visual style, that can be assembled together to build any number of applications. The licence is Apache-2.0.

When your agent uses it

  • The user asks to lint/check/audit design tokens for a component
  • Tasks that involve Linting and formatting
  • Tasks that involve Design tokens

Example prompts

  • “Token Naming Anatomy”
  • “/ds-token-lint”

Requirements

  • Node.js

Workflow steps

2 steps, taken from the step headings in SKILL.md.

  1. Check (Report)
  2. Apply (only after explicit approval)

What it can do on your machine

Read from SKILL.md and the folder at commit 19063c5. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (JavaScript), which the agent can run.

    Shell commands in SKILL.md call:

    • node
    • pnpm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Ds Token Lint loads about 2.5k tokens when it runs. Until then it costs about 87 tokens; SKILL.md has 1,178 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~87
When it runs · the whole SKILL.md, loaded when a task matches
~2.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from baloise/design-system at commit 19063c5, republished under its Apache-2.0 licence (© baloise). 1,178 words, ~2,473 tokens.

Download SKILL.mdSave it as .claude/skills/ds-token-lint/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
ds-token-lint
description
Check a component's design tokens in Base.tokens.json against the canonical naming convention (packages/tokens/CONTEXT.md "Token Naming Anatomy"), report violations as a markdown table, and apply approved renames to Base.tokens.json and the component's SCSS. Use when the user asks to lint/check/audit design tokens for a component.

Token Lint

Checks a component's Component-layer design tokens (🧩 Component > <ComponentName> in Base.tokens.json) against packages/tokens/CONTEXT.md's "Token Naming Anatomy" — the canonical order:

--ds - component - variant - element - category - property - state

This doc is the source of truth, not whatever a given component currently ships. An earlier version of this skill trusted "the real, empirically-verified convention" over the doc, on the finding that most shipped tokens don't follow it (category before variant, not after). That finding still stands as a description of today's state — but it's exactly the drift this skill exists to close, not a convention to defer to. See REFERENCE.md for that history and why the checklist below no longer treats shipped tokens as authoritative.

The convergence model is one component at a time. Every run targets a single component; there's no --all. Work through components one by one, review + apply + changeset each before moving to the next, so the codebase moves steadily toward a single naming convention instead of accumulating a second, half-migrated one. Don't skip around — finish (or consciously defer) one component before starting the next, so it's always clear which components are done.

Two phases: Check (report violations) and Apply (write approved renames).

Quick Start

Check a component's tokens:

bash
node .claude/skills/ds-token-lint/index.js button

Output: markdown table of violations, printed to the terminal.

After the user approves the table, apply the fixes:

bash
node .claude/skills/ds-token-lint/index.js button --apply

Output: summary of renamed tokens and updated files.

What Gets Checked

Scope is Component-layer tokens only — everything under 🧩 Component > <ComponentName> in packages/tokens/tokens/Base.tokens.json. Alias/Global token usage inside a component's SCSS is ds-lint-component's job, not this skill's.

  1. Typography font- prefix — a leaf key of Family, Weight, LineHeight, or Size whose value resolves through the Alias 🔤 Text typography category, but isn't grouped under a Font key, is flagged (e.g. --ds-button-family → --ds-button-font-family). This is real, present drift — some components already use Font (e.g. ds-accordion-summary-font-family), others don't (ds-button-family, ds-badge-text-family).
  2. State vocabulary — when a group of sibling JSON keys looks like a state group (at least half its members are already Base/Hover/Active/Disabled/Focus/Selected), any sibling that's a close misspelling of one of those (edit distance ≤ 2) is flagged as a likely typo.
  3. JSON key casing — every key under the component's token tree must be PascalCase (or a bare acronym/number). camelCase or snake_case keys break Style Dictionary's kebab-case transform in ways that are easy to miss.
  4. Segment order — a leaf's JSON path is checked against the canonical anatomy (component → variant → element → category → property → state). category is the closed set Color/Space (Font is deliberately excluded — see below). state is the closed set from Rule 2, with the same sibling-context disambiguation: a state word (Base in particular) only counts as state when its actual JSON siblings look like a state group; a lone Base, or one sibling to Info/Success/Danger/…, is treated as a variant instead — matching how its non-Base siblings are already classified. Everything that's neither category nor state is variant/element (the two aren't separately distinguishable — both are open vocabulary), and the segment closest to the value is treated as property. Flagged when the actual order doesn't match [...variant/element, ...category, property, ...state] (e.g. --ds-button-color-primary-base-text → --ds-button-primary-color-text-base). Skipped (not enough signal to safely reorder) when fewer than two non-category, non-state segments are present — in that case only the unambiguous part is still enforced: a state segment must be terminal.
  5. Disallowed abbreviations — a path segment containing the word Bg (whole, e.g. Bg, or as part of a compound, e.g. ProgressBg) is flagged; the full word Background is required instead (e.g. --ds-toast-primary-color-bg-base → --ds-toast-primary-color-background-base, ProgressBg → ProgressBackground). bg → background is currently the only entry in this vocabulary — extend ABBREVIATIONS in implementation.js if another shorthand needs closing off the same way.

Not checked:

  • A generic "category/property vocabulary" whitelist — element names (tile, sidebar, outline, upload, progress, …) are legitimate, open vocabulary, not a fixed set. Rule 4 only classifies the closed-vocabulary category/state segments; everything else is left as-is, relative to itself.
  • Whether a color token has a state segment — this is legitimately optional (non-interactive components like badge never have one). Rule 4 doesn't require a state segment to exist, only that one is terminal when it does.
  • Reordering around Font groupings — Rule 4 excludes Font from its category vocabulary on purpose, so it doesn't fight Rule 1 over the same leaf in one pass. Fix Rule 1's font- prefix drift first, then re-run the check — Rule 4 will see the now-grouped Font segment as an ordinary variant/element segment and check the rest of the path around it.

A safety note on Rules 4 and 5 co-occurring: if a single token trips both a segment-order violation and an abbreviation violation, --apply refuses the whole batch with an error rather than risk silently dropping one of the two fixes (each violation's fix is applied against the pre-fix tree independently, so a second fix targeting an already-moved leaf would otherwise no-op). This hasn't happened yet against real data. If it does, this skill has no per-row apply — resolve it by hand-editing that one token's rename directly in Base.tokens.json (folding both fixes into a single move), then re-run the check to confirm it's clean before applying the rest of the batch normally.

Show full SKILL.md (343 more words)Show less

Workflow

Phase 1: Check (Report)
bash
node .claude/skills/ds-token-lint/index.js button

Prints a markdown table:

| # | Current Token | Violation | Proposed Fix |
|---|---|---|---|
| 1 | `--ds-button-family` | Typography token missing "font-" prefix | `--ds-button-font-family` |
| 2 | `--ds-button-weight` | Typography token missing "font-" prefix | `--ds-button-font-weight` |

Show this table to the user and ask for approval before running --apply — renaming a shipped token is a breaking change for consumers (packages/tokens/CONTEXT.md, "Naming is immutable"). Approval is whole-batch: either apply every row in the table, or none. If the user wants a subset, re-run after they've told you which rows to skip and adjust manually.

Phase 2: Apply (only after explicit approval)
bash
node .claude/skills/ds-token-lint/index.js button --apply

This:

  1. Renames the token(s) in place in Base.tokens.json, preserving $extensions.com.figma.variableId (renaming is not delete+add — see ADR-0011, Figma Variable identity is variableId, not name).
  2. Rewrites every var(--ds-old-name) reference across packages/core/src/**/*.scss and packages/styles/src/**/*.scss.
  3. Runs pnpm tokens to recompile dist/css/base.tokens.css, dist/scss/_tokens.scss, dist/json/tokens.json.

After applying, invoke the ds-changeset skill (bump: major, scope: tokens + the component name) — every rename here is a breaking change and must be recorded, per project convention.

OrangeVacations.tokens.json (and any future brand file) is out of scope for v1 — currently no component-layer tokens are overridden there. If a future brand file does override a path this skill renames, it will go out of sync silently; check for that manually until brand-file support is added.

Examples

Example 1: Clean component
bash
node .claude/skills/ds-token-lint/index.js toast

Toast already nests variant → category → element → state (e.g. --ds-toast-primary-color-progress-bar-base), which happens to satisfy Rule 4 as-is (no separate property segment beyond the element itself) — prints "No naming violations found."

Example 2: Component with drift
bash
node .claude/skills/ds-token-lint/index.js button

Reports --ds-button-family, --ds-button-weight, --ds-button-line-height, and the --ds-button-size-* group as missing the font- prefix, plus every --ds-button-color-* token as segment-order violations (e.g. --ds-button-color-primary-base-text → --ds-button-primary-color-text-base).

Important Notes

  • Never commit — per CLAUDE.md, leave all changes (Base.tokens.json, SCSS, changeset) unstaged for the user to review.
  • No backup file — git is the safety net; changes stay unstaged until reviewed.
  • Run from the design system repo root (or any subdirectory — the script walks up to find packages/tokens/tokens/Base.tokens.json).

See REFERENCE.md for the history behind this skill's stance (why it used to defer to shipped tokens, and why it now treats the doc as canonical instead) and implementation notes per rule, and packages/tokens/CONTEXT.md for the "Token Naming Anatomy" section this skill enforces.

© baloise, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 4 other files in .claude/skills/ds-token-lint of baloise/design-system.

  • SKILL.md
  • README.md
  • REFERENCE.md
  • implementation.js
  • index.js

Open the folder on GitHubat commit 19063c5

Compare with similar skills

Ds Token Lint next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Ds Token Lint compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Ds Token Lint this skillbaloise/design-system114—~2.5kAutomated safety check: PassApache-2.0
MCP Developmentcoollabsio/coolify63k1 repos~949Automated safety check: PassMIT
Transitions PolishJakubantalik/transitions.dev4.6k2 repos~3.2kAutomated safety check: PassCustom licence
Web Style ExtractorLucent-Snow/style-extractor453—~3.8kAutomated safety check: PassNone
Liuguang Banlan UIsickn33/agentic-awesome-skills47k1 repos~2.5kAutomated safety check: PassMIT
Tailwind Design SystemSuFxGIT/scoutarr1145 repos~5.6kAutomated safety check: PassNone

Similar skills

  • MCP Development

    coollabsio/coolify

    A skill your agent uses for Laravel MCP development. An agent skill from coollabsio/coolify.

    63k GitHub starsUsed in 1 repo~949 tokens
    Frontend & DesignAuto-check passed
  • Transitions Polish

    Jakubantalik/transitions.dev

    Audits existing UI animations against the transitions.dev motion-token scale and suggests tokens for duration, distance, scale, blur and easing.

    4.6k GitHub starsUsed in 2 repos~3.2k tokens
    Frontend & DesignAuto-check passed
  • Web Style Extractor

    Lucent-Snow/style-extractor

    Extracts evidence-backed style guides and motion appendices from websites, keeping reusable visual language and stripping product-specific content.

    453 GitHub stars~3.8k tokensUpdated 6 mo ago
    Frontend & DesignAuto-check passed
  • Liuguang Banlan UI

    sickn33/agentic-awesome-skills

    Implements an interface in one of two named color modes, iridescent white or colorful black, from a parameterized starter that reports measured color intensity.

    47k GitHub starsUsed in 1 repo~2.5k tokens
    Frontend & DesignAuto-check passed
  • Tailwind Design System

    SuFxGIT/scoutarr

    Build scalable design systems with Tailwind CSS v4, design tokens, component libraries, and responsive patterns.

    114 GitHub starsUsed in 5 repos~5.6k tokens
    Frontend & DesignAuto-check passed
  • Extract Design

    Manavarya09/design-extract

    Extract the full design language from any website URL. An agent skill from Manavarya09/design-extract.

    4.2k GitHub stars~786 tokensUpdated 9 days ago
    Frontend & DesignAuto-check: notes

More from baloise/design-system

All 10 skills in this repo
  • Ds Migrate From Baloise

    baloise/design-system

    Migrate a consuming app from the Baloise Design System (bal-) to the Helvetia Design System (ds-).

    114 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed
  • Ds Changeset

    baloise/design-system

    Create a changeset entry for pending changes using the repo's create-changeset.mjs CLI.

    114 GitHub stars~719 tokensUpdated yesterday
    Auto-check passed
  • Ds Create Component

    baloise/design-system

    Create new web components in the Helvetia Design System. An agent skill from baloise/design-system.

    114 GitHub stars~2.1k tokensUpdated yesterday
    Auto-check passed
  • Ds Lint Component

    baloise/design-system

    Lint and fix Helvetia Design System components for style guide compliance.

    114 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed
  • Ds Test Component

    baloise/design-system

    Auto-generate all test files for DS components including visual, a11y, component, page object, and unit tests.

    114 GitHub stars~2.1k tokensUpdated yesterday
    Auto-check passed
  • Ds Update Screenshots

    baloise/design-system

    Post the /update-screenshots bot command as a PR comment to re-baseline visual regression snapshots for one or more components.

    114 GitHub stars~861 tokensUpdated yesterday
    Auto-check passed

Questions about Ds Token Lint

What does Ds Token Lint do?

Check a component's design tokens in Base.tokens.json against the canonical naming convention (packages/tokens/CONTEXT.md "Token Naming Anatomy"), report violations as a markdown table, and apply…. Ds Token Lint is an agent skill from baloise/design-system.json and the component's SCSS.

When should I use Ds Token Lint?

Ds Token Lint fits situations like: the user asks to lint/check/audit design tokens for a component; tasks that involve Linting and formatting; tasks that involve Design tokens.

How do I install Ds Token Lint in Claude Code?

Run `npx skills add baloise/design-system --skill ds-token-lint -a claude-code`. Or copy the skill folder (.claude/skills/ds-token-lint in baloise/design-system) into .claude/skills/ds-token-lint in your project. Claude Code loads it when a task matches its description.

How do I install Ds Token Lint in Codex?

Run `npx skills add baloise/design-system --skill ds-token-lint -a codex`. Or copy the skill folder (.claude/skills/ds-token-lint in baloise/design-system) into .agents/skills/ds-token-lint in your project. Codex loads it when a task matches its description.

Can I use Ds Token Lint in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add baloise/design-system --skill ds-token-lint -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ds-token-lint, .gemini/skills/ds-token-lint, .github/skills/ds-token-lint and .opencode/skills/ds-token-lint in your project.

What does Ds Token Lint need to run?

Going by SKILL.md and its folder, Ds Token Lint needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node and pnpm). Our summary lists: Node.js.

Does Ds Token Lint access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Ds Token Lint safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Ds Token Lint use?

Ds Token Lint is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Ds Token Lint use?

About 2.5k tokens (SKILL.md is roughly 9.9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Ds Token Lint?

Skills that share tags, products or a category with Ds Token Lint: MCP Development (coollabsio/coolify, 63k stars), Transitions Polish (Jakubantalik/transitions.dev, 4.6k stars), Web Style Extractor (Lucent-Snow/style-extractor, 453 stars) and Liuguang Banlan UI (sickn33/agentic-awesome-skills, 47k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Ds Token Lint?

baloise (a GitHub organization) maintains it in baloise/design-system, which has 114 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 7, 2026.

Source: baloise/design-system on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.