LobeHub Testing Guide
lobehub/lobehub
Explains how to write and run Vitest tests in the LobeHub monorepo: single-file commands, mocking rules, database model tests and regression tests for fixes.
Writes Vitest tests following project patterns: tests/ directories, vi.mock() for module mocking with vi.hoisted() for test-time factories, global LLM mock from src/test/setup.ts, environment…
$ npx skills add caliber-ai-org/ai-setup --skill caliber-testing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install caliber-ai-org/ai-setup caliber-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/caliber-ai-org/ai-setup.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/caliber-testing .claude/skills/caliber-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 "caliber-testing" agent skill from https://github.com/caliber-ai-org/ai-setup/tree/master/skills/caliber-testing into .claude/skills/caliber-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "caliber-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/caliber-ai-org/ai-setup/tree/master/skills/caliber-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 caliber-ai-org/ai-setup --skill caliber-testing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install caliber-ai-org/ai-setup caliber-testing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/caliber-ai-org/ai-setup.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/caliber-testing .agents/skills/caliber-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 "caliber-testing" agent skill from https://github.com/caliber-ai-org/ai-setup/tree/master/skills/caliber-testing into .agents/skills/caliber-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "caliber-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 caliber-ai-org/ai-setup --skill caliber-testing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install caliber-ai-org/ai-setup caliber-testing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/caliber-ai-org/ai-setup.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/caliber-testing .cursor/skills/caliber-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 "caliber-testing" agent skill from https://github.com/caliber-ai-org/ai-setup/tree/master/skills/caliber-testing into .cursor/skills/caliber-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "caliber-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/caliber-ai-org/ai-setup.git --path skills/caliber-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 caliber-ai-org/ai-setup --skill caliber-testing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install caliber-ai-org/ai-setup caliber-testing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/caliber-ai-org/ai-setup.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/caliber-testing .gemini/skills/caliber-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 "caliber-testing" agent skill from https://github.com/caliber-ai-org/ai-setup/tree/master/skills/caliber-testing into .gemini/skills/caliber-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "caliber-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 caliber-ai-org/ai-setup caliber-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 caliber-ai-org/ai-setup --skill caliber-testing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/caliber-ai-org/ai-setup.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/caliber-testing .github/skills/caliber-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 "caliber-testing" agent skill from https://github.com/caliber-ai-org/ai-setup/tree/master/skills/caliber-testing into .github/skills/caliber-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "caliber-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 caliber-ai-org/ai-setup --skill caliber-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 caliber-ai-org/ai-setup caliber-testing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/caliber-ai-org/ai-setup.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/caliber-testing .opencode/skills/caliber-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 "caliber-testing" agent skill from https://github.com/caliber-ai-org/ai-setup/tree/master/skills/caliber-testing into .opencode/skills/caliber-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "caliber-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.
caliber-testingWrites Vitest tests following project patterns: tests/ directories, vi.mock() for module mocking with vi.hoisted() for test-time factories, global LLM mock from src/test/setup.ts, environment…
Caliber Testing is an agent skill from caliber-ai-org/ai-setup. Writes Vitest tests following project patterns: tests/ directories, vi.mock() for module mocking with vi.hoisted() for test-time factories, global LLM mock from src/test/setup.ts, environment variable save/restore in beforeEach/afterEach, vi.clearAllMocks() lifecycle, and test file organization. Use when user says 'write tests', 'add test coverage', 'test this', creates .test.ts files, or when test failures appear in CI. Do NOT use for non-test code or for debugging without writing tests.
Its SKILL.md is about 3.2k 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 Testing & QA, covering Unit testing, Secrets management and Test coverage. It works with Vitest. The repository describes itself as: Continuously sync your AI setups with one command. Codebase tailor suited agent skills, MCPs and config files for Claude Code, Cursor, and Codex. The licence is MIT.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit f5dbc00. 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.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
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.
Names these keys or tokens, usually read from environment variables:
ANTHROPIC_API_KEYOPENAI_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Caliber Testing loads about 3.2k tokens when it runs. Until then it costs about 129 tokens; SKILL.md has 995 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 caliber-ai-org/ai-setup at commit f5dbc00, republished under its MIT licence (© caliber-ai-org). 995 words, ~3,236 tokens.
.claude/skills/caliber-testing/SKILL.md (or your agent's skills folder).__tests__/ directories parallel to source files: src/[module]/__tests__/[module].test.ts__tests__/ directories in vitest.config.ts's include glob (already configured: src/**/*.test.ts)src/test/setup.ts — it is the global LLM provider mock already applied to all testsprocess.env in beforeEach, restore in afterEach, and explicitly delete env vars to test absenceafterEach, not in individual test cleanup. Use fs.rmSync(dir, { recursive: true, force: true })vi.unmock('../module.js') BEFORE the import statementpnpm test locally and pnpm test:coverage before committing to verify coverage thresholds (lines: 50, functions: 50, branches: 50, statements: 50)Create src/[module]/__tests__/[module].test.ts. The parent source file is src/[module]/[module].ts.
Verify: The __tests__ directory exists at the same level as the source file being tested.
At the top of every test file, import from vitest:
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';Add additional imports based on what you're testing:
import fs from 'fs'; import path from 'path'; import os from 'os';fs.mkdtempSync(path.join(os.tmpdir(), 'caliber-prefix-'))import { execSync } from 'child_process';Verify: All required test utilities are imported before test definitions.
If testing a module that imports other modules you want to mock:
vi.mock('../config.js', () => ({
loadConfig: vi.fn(),
writeConfigFile: vi.fn(),
}));For complex mocks with test-time factory functions (hoisted):
const { mockLoadConfig } = vi.hoisted(() => ({
mockLoadConfig: vi.fn(),
}));
vi.mock('../config.js', () => ({
loadConfig: () => mockLoadConfig(),
}));For unmocking global setup mocks (e.g., to test llm/index.js itself):
vi.unmock('../index.js');Place all vi.mock() and vi.unmock() calls BEFORE importing the module under test.
Verify: Mock declarations appear before the import of the module being tested.
Group related tests with describe():
describe('functionName', () => {
it('returns X when Y', () => {
// test body
});
});Verify: Each it() test has a clear, complete assertion.
For tests that modify process.env or process.argv:
describe('config tests', () => {
const originalEnv = process.env;
const originalArgv = process.argv;
beforeEach(() => {
process.env = { ...originalEnv }; // Copy, not reference
process.argv = [...originalArgv];
delete process.env.SPECIFIC_VAR; // Explicitly remove vars to test absence
});
afterEach(() => {
process.env = originalEnv;
process.argv = originalArgv;
});
it('tests env var behavior', () => {
process.env.MY_VAR = 'test';
// test code
});
});Verify: beforeEach creates a copy of env/argv; afterEach restores originals; unused env vars are explicitly deleted with delete process.env.VAR.
For file system tests, create temporary directories and clean them up:
describe('file tree', () => {
const dirs: string[] = [];
afterEach(() => {
for (const d of dirs) {
try { fs.rmSync(d, { recursive: true, force: true }); } catch {}
}
dirs.length = 0;
});
it('processes files', () => {
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'caliber-test-'));
dirs.push(tmp);
// use tmp directory
});
});Verify: All temporary directories are pushed to a cleanup array and removed in afterEach.
Before each test, clear mock call history to avoid pollution between tests:
beforeEach(() => {
vi.clearAllMocks(); // Reset all mock call counts and return values
});
afterEach(() => {
vi.restoreAllMocks(); // Restore original implementations
vi.resetModules(); // Reset cached module imports (if you reload modules)
});Verify: beforeEach calls vi.clearAllMocks() for providers and afterEach calls vi.restoreAllMocks().
Write assertions using expect(). Match the patterns from existing tests:
// Simple checks
expect(value).toBe(expected);
expect(array).toContain(item);
expect(fn).toThrow('error message');
// Instance checks
expect(obj).toBeInstanceOf(ClassName);
// Mock checks
expect(mockFn).toHaveBeenCalledTimes(1);
expect(mockFn).toHaveBeenCalledWith(arg);
// File system checks
expect(fs.existsSync(path)).toBe(true);Verify: Each test has at least one assertion and uses appropriate expect() matchers.
Run tests locally before committing:
pnpm test # Run all tests in watch mode
pnpm test:coverage # Check coverage thresholds
pnpm test -- src/my/path/__tests__/my.test.ts # Run single test fileVerify: All tests pass and coverage thresholds are met (lines: 50%, functions: 50%, branches: 50%).
User asks: "Write tests for my config loader that reads from env vars and a config file."
Actions taken:
src/lib/__tests__/config.test.tsfs and osprocess.env in beforeEach/afterEachResult:
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import fs from 'fs';
vi.mock('fs');
vi.mock('os', () => ({ default: { homedir: () => '/home/user' } }));
import { loadConfig } from '../config.js';
describe('config', () => {
const originalEnv = process.env;
beforeEach(() => {
vi.clearAllMocks();
process.env = { ...originalEnv };
delete process.env.ANTHROPIC_API_KEY;
delete process.env.OPENAI_API_KEY;
});
afterEach(() => {
process.env = originalEnv;
});
it('returns env config when ANTHROPIC_API_KEY is set', () => {
process.env.ANTHROPIC_API_KEY = 'sk-ant-test';
const config = loadConfig();
expect(config?.provider).toBe('anthropic');
});
it('returns null when no env vars set', () => {
expect(loadConfig()).toBeNull();
});
});User asks: "Write tests for file tree analysis."
Actions taken:
src/fingerprint/__tests__/file-tree.test.tsResult:
import { describe, it, expect, afterEach } from 'vitest';
import fs from 'fs';
import path from 'path';
import os from 'os';
import { getFileTree } from '../file-tree.js';
const dirs: string[] = [];
afterEach(() => {
for (const d of dirs) {
try { fs.rmSync(d, { recursive: true, force: true }); } catch {}
}
dirs.length = 0;
});
describe('getFileTree', () => {
it('returns files sorted by mtime descending', () => {
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'caliber-ft-'));
dirs.push(tmp);
fs.writeFileSync(path.join(tmp, 'a.ts'), 'a');
fs.writeFileSync(path.join(tmp, 'b.ts'), 'b');
const tree = getFileTree(tmp);
expect(tree).toHaveLength(2);
});
});User asks: "Write tests for the provider factory that instantiates different providers based on config."
Actions taken:
src/llm/__tests__/index.test.tsvi.unmock('../index.js') to test the real modulevi.hoisted()resetProvider() between tests to clear cached instancesResult:
import { describe, it, expect, vi, beforeEach } from 'vitest';
vi.unmock('../index.js');
const { mockLoadConfig, MockAnthropicProvider } = vi.hoisted(() => {
class MockAnthropicProvider {
config: unknown;
call = vi.fn();
constructor(c: unknown) { this.config = c; }
}
return {
mockLoadConfig: vi.fn(),
MockAnthropicProvider,
};
});
vi.mock('../config.js', () => ({
loadConfig: () => mockLoadConfig(),
}));
vi.mock('../anthropic.js', () => ({
AnthropicProvider: MockAnthropicProvider,
}));
import { getProvider, resetProvider } from '../index.js';
describe('getProvider', () => {
beforeEach(() => {
vi.clearAllMocks();
resetProvider();
});
it('creates AnthropicProvider for anthropic config', () => {
mockLoadConfig.mockReturnValue({
provider: 'anthropic',
model: 'claude-sonnet-4-6',
apiKey: 'sk-test',
});
const provider = getProvider();
expect(provider).toBeInstanceOf(MockAnthropicProvider);
});
});"Cannot find module" when running tests
vi.mock() called after the import statementvi.mock() and vi.unmock() calls to the TOP of the file, before any import statementsEnvironment variable persists across tests
beforeEach assigns by reference instead of copying: process.env = originalEnvbeforeEach: process.env = { ...originalEnv }; delete process.env.VARTemporary files not cleaned up, filling disk
afterEach not called or temp paths not trackeddirs: string[] = [] pushed to in tests, cleaned in afterEach with fs.rmSync(..., { recursive: true, force: true })Mock return value from previous test bleeds into next test
vi.clearAllMocks() not called in beforeEachvi.clearAllMocks() as first statement in beforeEach"vi.mocked() is not a function" when accessing mock calls
vi.mocked() on a non-mocked modulevi.mock() before importing, then cast: const mockFn = vi.mocked(importedFn)Test passes locally but fails in CI
vi.mock() for fs/http/execCoverage threshold failures: "lines not covered", "statements not covered"
pnpm test:coverage locally to see untested lines. Add it() tests for error cases, edge conditions, and branches that return different valuesif (x) return 'a'; else return 'b'; has 0% branch coverage, add tests: one with x=true, one with x=false"expected 1 error but got 0" when testing error throws
expect(() => fn()).toThrow('message'). For async: expect(async () => { await fn() }).rejects.toThrow('message') or use await expect(promise).rejects.toThrow()Mock factory returns undefined
vi.hoisted() variables used before definition in the same blockvi.hoisted() block returns all factories, and vi.mock() blocks use them after the hoisted definitionTest flakes (sometimes passes, sometimes fails)
{ force: true } in rmSync. For timing, avoid setTimeout; use vi.useFakeTimers() and vi.runAllTimers() if needed. Check for leftover files from previous test runs in beforeEach© caliber-ai-org, MIT. 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 skills/caliber-testing of caliber-ai-org/ai-setup.
Open the folder on GitHubat commit f5dbc00
Caliber 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 |
|---|---|---|---|---|---|---|
| Caliber Testing this skillcaliber-ai-org/ai-setup | 1.3k | — | ~3.2k | Automated safety check: Pass | MIT | |
| LobeHub Testing Guidelobehub/lobehub | 83k | — | ~1.6k | Automated safety check: Pass | Custom licence | |
| TDD Guidealirezarezvani/claude-skills | 28k | — | ~3.4k | Automated safety check: Pass | MIT | |
| TDD GuideLeoYeAI/openclaw-master-skills | 2.2k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Test Suite Curationpetrkindlmann/qa-skills | 168 | — | ~6.3k | Automated safety check: Pass | MIT | |
| Qe Test Executionproffesor-for-testing/agentic-qe | 495 | — | ~1.2k | Automated safety check: Pass | MIT |
lobehub/lobehub
Explains how to write and run Vitest tests in the LobeHub monorepo: single-file commands, mocking rules, database model tests and regression tests for fixes.
alirezarezvani/claude-skills
Test-driven development skill for writing unit tests, generating test fixtures and mocks, analyzing coverage gaps, and guiding red-green-refactor workflows across Jest, Pytest, JUnit, Vitest, and…
LeoYeAI/openclaw-master-skills
Test-driven development skill for writing unit tests, generating test fixtures and mocks, analyzing coverage gaps, and guiding red-green-refactor workflows across Jest, Pytest, JUnit, Vitest, and…
petrkindlmann/qa-skills
Audit a whole regression suite and prune/restructure it with evidence: per-test coverage fingerprinting, AST near-duplicate clustering, CI-history mining for never-failing and flaky tests, prune…
proffesor-for-testing/agentic-qe
Orchestrates test suite execution with parallel sharding, intelligent retry, and real-time reporting across Jest, Vitest, and Playwright.
proffesor-for-testing/agentic-qe
Generates durable-first tests — invariants, contracts, and property-based tests at boundaries that survive a reimplementation — plus unit, integration, and e2e coverage.
caliber-ai-org/ai-setup
Creates a new CLI command following the Commander.js pattern in src/commands/.
caliber-ai-org/ai-setup
Discovers and installs community skills from the public registry.
caliber-ai-org/ai-setup
Adds a new LLM provider implementing LLMProvider interface with call() and stream() methods.
caliber-ai-org/ai-setup
Saves user instructions as persistent learnings for future sessions.
caliber-ai-org/ai-setup
Add a new deterministic scoring check in src/scoring/checks/ that evaluates config quality.
caliber-ai-org/ai-setup
Sets up Caliber for automatic AI agent context sync. An agent skill from caliber-ai-org/ai-setup.
Works with
Categories
Writes Vitest tests following project patterns: tests/ directories, vi.mock() for module mocking with vi.hoisted() for test-time factories, global LLM mock from src/test/setup.ts, environment…. Caliber Testing is an agent skill from caliber-ai-org/ai-setup.clearAllMocks() lifecycle, and test file organization.
Caliber Testing fits situations like: user says write tests; add test coverage; creates .test.ts files; test failures appear in CI.
Run `npx skills add caliber-ai-org/ai-setup --skill caliber-testing -a claude-code`. Or copy the skill folder (skills/caliber-testing in caliber-ai-org/ai-setup) into .claude/skills/caliber-testing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add caliber-ai-org/ai-setup --skill caliber-testing -a codex`. Or copy the skill folder (skills/caliber-testing in caliber-ai-org/ai-setup) into .agents/skills/caliber-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 caliber-ai-org/ai-setup --skill caliber-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/caliber-testing, .gemini/skills/caliber-testing, .github/skills/caliber-testing and .opencode/skills/caliber-testing in your project.
Going by SKILL.md and its folder, Caliber Testing needs the command-line tools its instructions call (pnpm) and credentials named ANTHROPIC_API_KEY and OPENAI_API_KEY. Our summary lists: A credential in ANTHROPIC_API_KEY; A credential in OPENAI_API_KEY.
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.
Caliber Testing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k 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 Caliber Testing: LobeHub Testing Guide (lobehub/lobehub, 83k stars), TDD Guide (alirezarezvani/claude-skills, 28k stars), TDD Guide (LeoYeAI/openclaw-master-skills, 2.2k stars) and Test Suite Curation (petrkindlmann/qa-skills, 168 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
caliber-ai-org (a GitHub organization) maintains it in caliber-ai-org/ai-setup, which has 1,301 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on September 24, 2026.
Source: caliber-ai-org/ai-setup on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.