Playwright Testing
chongdashu/vibejam-starter-pack
Plan, implement, and debug frontend tests: unit/integration/E2E/visual/a11y.
Generate unit, integration, E2E, and visual regression tests following the Testing Trophy methodology (80% integration).
$ npx skills add EliasOulkadi/shokunin --skill test-commander -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install EliasOulkadi/shokunin test-commander --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/EliasOulkadi/shokunin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.pack/skills/test-commander .claude/skills/test-commander && 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 "test-commander" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/test-commander into .claude/skills/test-commander/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-commander", 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/EliasOulkadi/shokunin/tree/master/.pack/skills/test-commanderType 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 EliasOulkadi/shokunin --skill test-commander -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install EliasOulkadi/shokunin test-commander --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.pack/skills/test-commander .agents/skills/test-commander && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "test-commander" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/test-commander into .agents/skills/test-commander/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-commander", 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 EliasOulkadi/shokunin --skill test-commander -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install EliasOulkadi/shokunin test-commander --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.pack/skills/test-commander .cursor/skills/test-commander && 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 "test-commander" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/test-commander into .cursor/skills/test-commander/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-commander", 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/EliasOulkadi/shokunin.git --path .pack/skills/test-commander--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 EliasOulkadi/shokunin --skill test-commander -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install EliasOulkadi/shokunin test-commander --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.pack/skills/test-commander .gemini/skills/test-commander && 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 "test-commander" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/test-commander into .gemini/skills/test-commander/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-commander", 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 EliasOulkadi/shokunin test-commanderInstalls 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 EliasOulkadi/shokunin --skill test-commander -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .github/skills && cp -r skills-src/.pack/skills/test-commander .github/skills/test-commander && 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 "test-commander" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/test-commander into .github/skills/test-commander/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-commander", 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 EliasOulkadi/shokunin --skill test-commander -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install EliasOulkadi/shokunin test-commander --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/EliasOulkadi/shokunin.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.pack/skills/test-commander .opencode/skills/test-commander && 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 "test-commander" agent skill from https://github.com/EliasOulkadi/shokunin/tree/master/.pack/skills/test-commander into .opencode/skills/test-commander/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-commander", 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.
test-commanderGenerate unit, integration, E2E, and visual regression tests following the Testing Trophy methodology (80% integration).
Test Commander is an agent skill from EliasOulkadi/shokunin. Generate unit, integration, E2E, and visual regression tests following the Testing Trophy methodology (80% integration). Covers Vitest/Jest, Testing Library, Playwright, MSW for API mocking, snapshot strategy, visual regression (Chromatic/Percy/Playwright), test factories with Faker, and CI sharding. Use when user asks to write tests, set up testing framework, mock API/dependencies, improve coverage, or add visual regression. Do NOT use for performance/load testing, production monitoring, or type testing (covered…
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts, reference files and assets (for example `assets/test-api-template.ts`, `references/msw-patterns.md` and `references/visual-regression.md`). Compatibility notes: opencode
It sits in Testing & QA, covering Unit testing, Visual regression testing and End-to-end testing. It works with Playwright, Testing Library, Vitest and Jest. The repository describes itself as: 職人 Shokunin 62 AI agent skills for OpenCode, Claude Code, Cursor, Windsurf. ChromaDB memory, MCP servers, declarative self-updates. Multi-model, open source, zero cost. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4c68e5b. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadBashWriteGrepGlobFrom allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (TypeScript and Shell), which the agent can run.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.
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.
opencode
From compatibility in the SKILL.md frontmatter.
Test Commander loads about 3k tokens when it runs, and up to ~8.7k if it reads all its reference files. Until then it costs about 137 tokens; SKILL.md has 825 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 noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Bash, Write, Grep, GlobAutomated 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); the scripts in this folder are not scanned.
The full file from EliasOulkadi/shokunin at commit 4c68e5b, republished under its MIT licence (© EliasOulkadi). 825 words, ~3,018 tokens.
.claude/skills/test-commander/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Tests that catch real bugs. Following the Testing Trophy (Kent C. Dodds): 80% integration, 10% unit, 10% E2E. Based on patterns from Testing Library, Playwright, MSW, and Chromatic.
/\
/E2E\ ← 2-3 critical flows
/------\
/ Visual \ ← Visual regression on key components
/----------\
/Integration\ ← 80% of tests. Components + API + store.
/--------------\
/ Unit \ ← Pure logic. Utils, helpers, formatters.
/------------------\
Static ← TypeScript + ESLint| What are you testing? | Level | Tool | Speed |
|---|---|---|---|
| Pure logic (math, format, transform) | Unit | Vitest | < 5ms each |
| Component + API + store together | Integration | Testing Library + MSW | 50-200ms each |
| Critical user flow (checkout, signup) | E2E | Playwright | 2-10s each |
| Visual appearance | Visual | Playwright / Chromatic | 1-5s each |
Default: Integration. Catches 80% of bugs with 20% of maintenance cost.
Every data-fetching component must test ALL five states:
describe('UserProfile', () => {
it('shows loading skeleton initially', async () => {
render(<UserProfile userId="123" />)
expect(screen.getByRole('status')).toHaveTextContent('Loading...')
})
it('shows error state with retry button', async () => {
server.use(http.get('/api/users/123', () => new HttpResponse(null, { status: 500 })))
render(<UserProfile userId="123" />)
await waitFor(() => {
expect(screen.getByRole('alert')).toHaveTextContent('Failed to load')
})
expect(screen.getByRole('button', { name: /retry/i })).toBeInTheDocument()
})
it('shows empty state when no data', async () => {
server.use(http.get('/api/users/123', () => HttpResponse.json(null)))
render(<UserProfile userId="123" />)
await waitFor(() => {
expect(screen.getByText(/no user found/i)).toBeInTheDocument()
})
})
it('renders user data on success', async () => {
render(<UserProfile userId="123" />)
await screen.findByText('Alice')
expect(screen.getByText('alice@example.com')).toBeInTheDocument()
})
it('handles race condition: fast re-fetch', async () => {
const { rerender } = render(<UserProfile userId="123" />)
await screen.findByText('Alice')
rerender(<UserProfile userId="456" />)
await screen.findByText('Bob')
expect(screen.queryByText('Alice')).not.toBeInTheDocument()
})
})import { http, HttpResponse } from 'msw'
import { setupServer } from 'msw/node'
const server = setupServer(
http.get('/api/users', () => {
return HttpResponse.json([
{ id: '1', name: 'Alice', email: 'alice@example.com' },
{ id: '2', name: 'Bob', email: 'bob@example.com' },
])
}),
http.post('/api/users', async ({ request }) => {
const body = await request.json()
return HttpResponse.json({ id: '3', ...body }, { status: 201 })
})
)
beforeAll(() => server.listen({ onUnhandledRequest: 'warn' }))
afterEach(() => server.resetHandlers())
afterAll(() => server.close())import { faker } from '@faker-js/faker'
function createUser(overrides: Partial<User> = {}): User {
return {
id: faker.string.uuid(),
name: faker.person.fullName(),
email: faker.internet.email(),
createdAt: faker.date.recent().toISOString(),
...overrides,
}
}
const admin = createUser({ name: 'Admin User' })
const emptyUser = createUser({ email: '' }) // Edge case factorytest('checkout flow', async ({ page }) => {
await page.goto('/products')
await page.getByTestId('add-to-cart').click()
await page.getByTestId('cart-count').toHaveText('1')
await page.getByTestId('checkout').click()
await page.getByLabel('Email').fill('test@example.com')
await page.getByRole('button', { name: 'Pay $29.99' }).click()
await expect(page.getByTestId('order-confirmed')).toBeVisible()
await expect(page.getByTestId('order-id')).not.toBeEmpty()
})Always record traces on failure:
npx playwright test --trace ontest('homepage visual', async ({ page }) => {
await page.goto('/')
await expect(page).toHaveScreenshot('homepage.png', {
fullPage: true,
maxDiffPixelRatio: 0.01,
})
})test:
strategy:
matrix:
shard: [1/4, 2/4, 3/4, 4/4]
run: npx vitest --shard=${{ matrix.shard }}| Symptom | Root cause | Fix |
|---|---|---|
| Passes locally, fails CI | Timing, different env | Use waitFor/findBy* instead of fixed timeouts |
| Fails randomly | Shared mutable state | Reset state in beforeEach. Use fresh factories. |
| Network-dependent flake | API response timing | MSW mocks all network. No real API calls. |
| Visual diff flake | Anti-aliasing, OS differences | Use maxDiffPixelRatio: 0.01. Run on same OS in CI. |
If a test flakes more than once: fix it same day or skip it with test.skip() + a comment explaining why. Never let flaky tests accumulate.
| Anti-pattern | Fix |
|---|---|
| Testing implementation details (state, methods, internal props) | Test behavior: what the user sees / API returns |
| Large snapshots (>20 lines) | Snapshots only for small, stable outputs |
| Over-mocking (mocking business logic) | Mock only network + I/O boundaries. Never mock your own code. |
| Too many assertions per test | One behavior per it() block |
| Shared mutable state between tests | Reset in beforeEach. Factories over literals. |
| Happy path only | Every error + empty state gets a test |
| No trace on E2E failure | Always --trace on in CI. Saves to test-results/. |
| E2E tests on every PR (slow) | E2E only on merge to main. Integration on every PR. |
onUnhandledRequest: 'warn' + reset between testsaxe-core in E2E for key pagesimport { faker } from '@faker-js/faker'
function createUser(overrides: Partial<User> = {}): User {
return {
id: faker.string.uuid(),
name: faker.person.fullName(),
email: faker.internet.email(),
role: faker.helpers.arrayElement(['admin', 'editor', 'viewer']),
createdAt: faker.date.recent({ days: 30 }).toISOString(),
...overrides
}
}
// Edge cases
const adminUser = createUser({ role: 'admin' })
const emptyEmail = createUser({ email: '' })
const longName = createUser({ name: 'a'.repeat(256) })
const futureDate = createUser({ createdAt: faker.date.future().toISOString() })// Playwright
test('homepage visual check', async ({ page }) => {
await page.goto('/')
await expect(page).toHaveScreenshot('homepage.png', {
fullPage: true,
maxDiffPixelRatio: 0.01,
})
})
// CI update: npx playwright test --update-snapshots| Symptom | Root cause | Fix |
|---|---|---|
| Passes locally, fails CI | Timing, different env | Use waitFor/findBy* instead of fixed timeouts |
| Fails randomly | Shared mutable state | Reset state in beforeEach. Use fresh factories. |
| Network-dependent flake | API response timing | MSW mocks all network. No real API calls. |
| Visual diff flake | Anti-aliasing, OS differences | maxDiffPixelRatio: 0.01. Run on same OS in CI. |
| Flaky test not reproducible | Race condition in test setup | Add awaits. Ensure fixtures are resolved before assertions. |
Rule: one flake = fix today. Two flakes = skip with test.skip() + comment. Never let flaky tests accumulate.
| Cause | Fix |
|---|---|
| MSW server fails to start — port conflict in CI | Run with --no-file-parallelism flag. MSW workers share the same server; parallel test files compete for port |
screen.findByText() consistently times out at 1000ms | Increase timeout in options: screen.findByText(..., {}, { timeout: 5000 }). Verify MSW handler path matches exactly (trailing slash matters) |
| Visual snapshot differs between CI (Linux) and local (macOS/Windows) | Font anti-aliasing and rendering differ by OS. Run visual tests on same OS as CI. Use maxDiffPixelRatio: 0.02 for cross-OS tolerance |
beforeAll MSW hook fails — entire test file skips | Ensure server.listen() is in beforeAll (not beforeEach). Register all handlers before calling listen(). Check onUnhandledRequest: 'warn' catches missing handlers |
| Playwright E2E passes locally, fails headless in CI | Use --trace on in CI config. Check browser version: npx playwright install --with-deps chromium. Some JS executes differently headless vs headed |
| Test factory generates duplicate unique IDs | Use faker.string.uuid() or crypto.randomUUID(). Never use sequential integers for unique IDs. Add uniqueness assertion in factory validation |
| E2E test flakes on dynamic content that loads after navigation | Use page.waitForResponse(urlPattern) targeting the API call, not waitForTimeout(). Assert on data-dependent element, not fixed time |
| Snapshot test fails on every CI run with timestamp diffs | Check snapshot for timestamps, random IDs, or dynamic dates. Mock with vi.setSystemTime() or jest.useFakeTimers(). Never snapshot unstable content |
| CI shard times out after 10 minutes | Increase shard count from 4 to 8+ for large suites. Profile slowest test file with --reporter=verbose. Extract slow E2E tests to separate job |
© EliasOulkadi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (scripts, references, assets) in .pack/skills/test-commander of EliasOulkadi/shokunin.
Open the folder on GitHubat commit 4c68e5b
Test Commander 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 |
|---|---|---|---|---|---|---|
| Test Commander this skillEliasOulkadi/shokunin | 114 | — | ~3k | Automated safety check: Notes | MIT | |
| Playwright Testingchongdashu/vibejam-starter-pack | 149 | — | ~2.1k | Automated safety check: Pass | None | |
| Playwright Testingchongdashu/vibejam-starter-pack | 149 | — | ~2.2k | Automated safety check: Pass | None | |
| Web Testing with Playwright and Vitestwithkynam/vibecode-pro-max-kit | 1.1k | — | ~892 | Automated safety check: Pass | Apache-2.0 | |
| React Testingaffaan-m/ECC | 277k | 1 repos | ~3.3k | Automated safety check: Pass | MIT | |
| Senior QAalirezarezvani/claude-skills | 28k | 1 repos | ~2.1k | Automated safety check: Pass | MIT |
chongdashu/vibejam-starter-pack
Plan, implement, and debug frontend tests: unit/integration/E2E/visual/a11y.
chongdashu/vibejam-starter-pack
Plan, implement, and debug frontend tests: unit/integration/E2E/visual/a11y.
withkynam/vibecode-pro-max-kit
Covers web testing from unit to E2E, load, visual, accessibility and security checks, with Playwright, Vitest and k6 guides plus a Playwright setup script.
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…
alirezarezvani/claude-skills
Generates unit tests, integration tests, and E2E tests for React/Next.js applications.
shinpr/ai-coding-project-boilerplate
Designs frontend tests using the repository's configured React test and browser harnesses, including RTL, MSW, Vitest, and Playwright when present.
EliasOulkadi/shokunin
Design CI/CD pipelines for GitHub Actions, GitLab CI, and CircleCI with matrix builds, test sharding, caching, Docker layer caching, OIDC auth, deployment strategies (rolling, blue-green, canary)…
EliasOulkadi/shokunin
Build production-grade components for React, Vue 3, and Svelte 5 with all states (loading, empty, error, success, idle), TypeScript strict, WCAG 2.2 accessibility, server components (RSC), and…
EliasOulkadi/shokunin
PostgreSQL database administration — backup/restore (pgdump, PITR, WAL archiving), health monitoring (connections, bloat, cache hit ratio, dead tuples), connection pooling (PgBouncer), replication…
EliasOulkadi/shokunin
Design database schemas with Prisma/Drizzle, PostgreSQL index strategy (B-tree, GIN, GiST, BRIN, Hash), query optimization (EXPLAIN ANALYZE), migration safety (expand/contract, zero-downtime), and…
EliasOulkadi/shokunin
Optimize Docker images with multi-stage builds, distroless bases, BuildKit cache mounts, multi-arch builds, compose watch, security hardening (non-root, seccomp, capabilities drop), and…
EliasOulkadi/shokunin
Design error handling, structured logging, and observability with OpenTelemetry (traces, metrics, logs), error classification, recovery patterns (retry with jitter, circuit breaker, bulkhead…
Categories
Generate unit, integration, E2E, and visual regression tests following the Testing Trophy methodology (80% integration). Test Commander is an agent skill from EliasOulkadi/shokunin. Generate unit, integration, E2E, and visual regression tests following the Testing Trophy methodology (80% integration).
Test Commander fits situations like: user asks to write tests; set up testing framework; mock API/dependencies; improve coverage.
Run `npx skills add EliasOulkadi/shokunin --skill test-commander -a claude-code`. Or copy the skill folder (.pack/skills/test-commander in EliasOulkadi/shokunin) into .claude/skills/test-commander in your project. Claude Code loads it when a task matches its description.
Run `npx skills add EliasOulkadi/shokunin --skill test-commander -a codex`. Or copy the skill folder (.pack/skills/test-commander in EliasOulkadi/shokunin) into .agents/skills/test-commander 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 EliasOulkadi/shokunin --skill test-commander -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/test-commander, .gemini/skills/test-commander, .github/skills/test-commander and .opencode/skills/test-commander in your project.
Going by SKILL.md and its folder, Test Commander needs TypeScript and a shell for the scripts in its folder and the command-line tools its instructions call (npx). Our summary lists: Node.js; A Bash shell. Its frontmatter pre-approves these tools: Read, Bash, Write, Grep, Glob. Compatibility (from SKILL.md): opencode.
SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Test Commander is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 5.6k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Test Commander: Playwright Testing (chongdashu/vibejam-starter-pack, 149 stars), Playwright Testing (chongdashu/vibejam-starter-pack, 149 stars), Web Testing with Playwright and Vitest (withkynam/vibecode-pro-max-kit, 1.1k stars) and React Testing (affaan-m/ECC, 277k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
EliasOulkadi (a GitHub user) maintains it in EliasOulkadi/shokunin, which has 114 GitHub stars. The repository holds 49 skills in this directory. The repository was last updated on October 5, 2026.
Source: EliasOulkadi/shokunin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.