Storybook
pproenca/dot-skills
A skill your agent uses whenever creating, configuring, or extending Storybook for a TS/React component library — covers main.ts/preview.ts setup, CSF3 story authoring, args/argTypes/controls…
Write Vitest/Testing Library tests the Ultraviolet way — interact with the rendered DOM like a user, following query priority.
$ npx skills add scaleway/ultraviolet --skill unit-testing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install scaleway/ultraviolet unit-testing --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/scaleway/ultraviolet.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/unit-testing .claude/skills/unit-testing && rm -rf skills-srcUse ~/.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/
Install the "unit-testing" agent skill from https://github.com/scaleway/ultraviolet/tree/main/.agents/skills/unit-testing into .claude/skills/unit-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-testing", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/scaleway/ultraviolet/tree/main/.agents/skills/unit-testingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add scaleway/ultraviolet --skill unit-testing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install scaleway/ultraviolet unit-testing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/scaleway/ultraviolet.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/unit-testing .agents/skills/unit-testing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "unit-testing" agent skill from https://github.com/scaleway/ultraviolet/tree/main/.agents/skills/unit-testing into .agents/skills/unit-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-testing", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add scaleway/ultraviolet --skill unit-testing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install scaleway/ultraviolet unit-testing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/scaleway/ultraviolet.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/unit-testing .cursor/skills/unit-testing && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "unit-testing" agent skill from https://github.com/scaleway/ultraviolet/tree/main/.agents/skills/unit-testing into .cursor/skills/unit-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-testing", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/scaleway/ultraviolet.git --path .agents/skills/unit-testing--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add scaleway/ultraviolet --skill unit-testing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install scaleway/ultraviolet unit-testing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/scaleway/ultraviolet.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/unit-testing .gemini/skills/unit-testing && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "unit-testing" agent skill from https://github.com/scaleway/ultraviolet/tree/main/.agents/skills/unit-testing into .gemini/skills/unit-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-testing", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install scaleway/ultraviolet unit-testingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add scaleway/ultraviolet --skill unit-testing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/scaleway/ultraviolet.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/unit-testing .github/skills/unit-testing && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "unit-testing" agent skill from https://github.com/scaleway/ultraviolet/tree/main/.agents/skills/unit-testing into .github/skills/unit-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-testing", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add scaleway/ultraviolet --skill unit-testing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install scaleway/ultraviolet unit-testing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/scaleway/ultraviolet.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/unit-testing .opencode/skills/unit-testing && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "unit-testing" agent skill from https://github.com/scaleway/ultraviolet/tree/main/.agents/skills/unit-testing into .opencode/skills/unit-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "unit-testing", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
unit-testingWrite Vitest/Testing Library tests the Ultraviolet way — interact with the rendered DOM like a user, following query priority.
Unit Testing is an agent skill from scaleway/ultraviolet. Write Vitest/Testing Library tests the Ultraviolet way — interact with the rendered DOM like a user, following query priority. Use when creating or updating React component tests, or rewriting snapshot-only tests into behavior assertions.
Its SKILL.md is about 1.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering Unit testing and React components. It works with Testing Library and Vitest. The repository describes itself as: A monorepo Design System with React components. The licence is Apache-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 738c080. It shows what the files ask for, not the result of running them.
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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Unit Testing loads about 1.7k tokens when it runs. Until then it costs about 63 tokens; SKILL.md has 740 words of instructions outside code blocks.
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.
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.
The full file from scaleway/ultraviolet at commit 738c080, republished under its Apache-2.0 licence (© scaleway). 740 words, ~1,671 tokens.
.claude/skills/unit-testing/SKILL.md (or your agent's skills folder).Tests resemble real user interaction. The more a test looks like a user, the more confidence it gives.
A component that is hard to query by role or text is usually inaccessible, not a reason to reach for a lower-priority query.
Choose the highest query that works, in this order:
getByRole — top preference for almost everything. Use with name to filter by
accessible name: getByRole('button', { name: /submit/i }). If you can't match
something by role, the UI is probably inaccessible.getByLabelText — best for form fields; mirrors how users find inputs by their label.getByPlaceholderText — placeholder is not a label, only use if that's all there is.getByText — for non-interactive elements (div, span, p) outside forms.getByDisplayValue — for filled-in form values.getByAltText — for img, area, input.getByTitle — title is not read consistently and not visible to sighted users.getByTestId only when you can't match by role or text and it doesn't
make sense (e.g. dynamic text). Users can't see them; a testid is a last resort.getByRolegetByRole('alert'), getByRole('status')getByTextgetByAltTextgetByTestIdsrc/components/<Name>/__tests__/*.test.tsx (or *.test.ts for pure utils).renderWithTheme from @utils/test to render within the theme provider:import { renderWithTheme } from '@utils/test'
import { screen } from '@testing-library/react'
import { userEvent } from '@testing-library/user-event'
it('submits on click', async () => {
const onClick = vi.fn()
renderWithTheme(<Button onClick={onClick}>Submit</Button>)
await userEvent.click(screen.getByRole('button', { name: /submit/i }))
expect(onClick).toHaveBeenCalledOnce()
})userEvent (click, type, hover, keyboard) — not fireEvent where possible.screen (pre-bound to document.body); screen.getByRole is preferred over
destructuring from render.expect(fn(input)).toEqual(output), no rendering needed.The line is thin, but split files by intent:
a11y.test.tsx — accessibility-only concerns: axe violations, keyboard
navigation, focus management, ARIA attributes. Query by role to trigger those
checks, but assert on a11y outcomes (expect(axe).toHaveNoViolations(), focus
landing, etc.).*.test.tsx — behavior: does the component render and respond.
getByRole here asserts behavior; labels/descriptions/roles are matched as a
side effect of finding the element a user interacts with, not asserted directly.If a test's real question is "is this accessible?", it's an a11y test. If it's "does this work?", it's a regular test. Same query tools, different intent.
toHaveAttribute tests the implementation (an attribute on an element); jest-dom's
semantic matchers test the behavior a user perceives. Reach for them first —
if a matcher exists for what you're asserting, use it instead of checking the
attribute that happens to produce it:
expect(radio).toHaveAccessibleName('Agree') — over toHaveAttribute('aria-label', ...)expect(radio).toHaveAccessibleDescription('Invalid value') — over checking
aria-describedby/title wiringexpect(button).toBeDisabled() — over toHaveAttribute('disabled')expect(radio).toBeChecked() — over toHaveAttribute('checked') or poking .checkedexpect(toast).toBeVisible() — over toHaveAttribute('aria-hidden', 'false')These compute their result from the whole source chain (label, aria-label, aria-labelledby, title, form state, etc.), so they pass when the wiring works and fail when it breaks — even if the break is in a different attribute than the one you'd have checked.
A snapshot only locks the initial DOM — it passes until someone clicks "update snapshot", so it never catches a regression. Use one to sanity-check the default render, then prove every behavior (state, props, interaction) with assertions.
asFragment().toMatchSnapshot() for the default render + userEvent /
screen.getByRole assertions for every behavior.render(<Button variant={v} />).shouldMatchSnapshot from @utils/test locks markup, not behavior, and is deprecated.
It is acceptable only as an initial-DOM lock; otherwise assert what the variant changes.
getByRole('button', { name: /submit/i }), expect(el).toHaveAttribute(...),
await userEvent.click(...) then expect(onClick).toHaveBeenCalled(), etc.a11y.test.tsx exists next to the rewritten file, create one with:expectNoViolations(container) across every theme in consoleThemesMap (use
it.for([...consoleThemesMap.entries()])), rendering the component with a
realistic full set of props.alt="" images, ARIA
wiring, accessible name/description via jest-dom semantic matchers like
toHaveAccessibleName / toHaveAccessibleDescription).
Tag the describe block with { tags: ['a11y'] }. See existing a11y.test.tsx
files (e.g. Radio, Button) for the established pattern.© scaleway, 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
Just SKILL.md in .agents/skills/unit-testing of scaleway/ultraviolet.
Open the folder on GitHubat commit 738c080
Unit Testing 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Unit Testing this skillscaleway/ultraviolet | 127 | — | ~1.7k | Automated safety check: Pass | Apache-2.0 | |
| Storybookpproenca/dot-skills | 214 | — | ~3.6k | Automated safety check: Pass | MIT | |
| React Testingaffaan-m/ECC | 274k | 1 repos | ~3.3k | Automated safety check: Pass | MIT | |
| React Testingcitypaul/.dotfiles | 739 | — | ~3.6k | Automated safety check: Pass | Custom licence | |
| React TestingHoangNguyen0403/agent-skills-standard | 570 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Hilla TestAI-Unified-Process/marketplace | 140 | — | ~3.9k | Automated safety check: Warn | Apache-2.0 |
pproenca/dot-skills
A skill your agent uses whenever creating, configuring, or extending Storybook for a TS/React component library — covers main.ts/preview.ts setup, CSF3 story authoring, args/argTypes/controls…
affaan-m/ECC
React component testing with React Testing Library, Vitest/Jest, MSW for network mocking, accessibility assertions with axe, and the decision boundary between component tests and Playwright/Cypress…
citypaul/.dotfiles
React component testing patterns including components, hooks, context, and forms.
HoangNguyen0403/agent-skills-standard
Test React components with RTL and Jest/Vitest. An agent skill from HoangNguyen0403/agent-skills-standard.
AI-Unified-Process/marketplace
Creates tests for Hilla use cases on both sides of the browser boundary: Vitest + React Testing Library tests for the React/TypeScript view (with the generated endpoint clients mocked) and Spring…
langgenius/dify
Use when writing or changing Vitest or React Testing Library tests under `web/` or `packages/dify-ui/`, or when the user explicitly requests frontend test…
scaleway/ultraviolet
Audit components for accessibility. An agent skill from scaleway/ultraviolet.
scaleway/ultraviolet
Fix accessibility issues documented in a component's A11y.mdx audit file by editing the component source, then refresh the audit artifacts.
scaleway/ultraviolet
Create or update a GitHub Pull Request — analyze the diff, draft the description from the repo template, push with gh.
Works with
Categories
Write Vitest/Testing Library tests the Ultraviolet way — interact with the rendered DOM like a user, following query priority. Unit Testing is an agent skill from scaleway/ultraviolet. Write Vitest/Testing Library tests the Ultraviolet way — interact with the rendered DOM like a user, following query priority.
Unit Testing fits situations like: updating React component tests; rewriting snapshot-only tests into behavior assertions.
Run `npx skills add scaleway/ultraviolet --skill unit-testing -a claude-code`. Or copy the skill folder (.agents/skills/unit-testing in scaleway/ultraviolet) into .claude/skills/unit-testing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add scaleway/ultraviolet --skill unit-testing -a codex`. Or copy the skill folder (.agents/skills/unit-testing in scaleway/ultraviolet) into .agents/skills/unit-testing in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add scaleway/ultraviolet --skill unit-testing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/unit-testing, .gemini/skills/unit-testing, .github/skills/unit-testing and .opencode/skills/unit-testing in your project.
SKILL.md names no scripts, command-line tools or credentials: Unit Testing is instructions for the agent only.
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.
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.
Unit Testing 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.
About 1.7k tokens (SKILL.md is roughly 6.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Unit Testing: Storybook (pproenca/dot-skills, 214 stars), React Testing (affaan-m/ECC, 274k stars), React Testing (citypaul/.dotfiles, 739 stars) and React Testing (HoangNguyen0403/agent-skills-standard, 570 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
scaleway (a GitHub organization) maintains it in scaleway/ultraviolet, which has 127 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 6, 2026.
Source: scaleway/ultraviolet on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.