Laravel Specialist
Jeffallan/claude-skills
Builds Laravel 10+ applications with Eloquent models, Sanctum authentication, Horizon queues, API resources and Livewire components, tested with Pest or PHPUnit.
Framework-agnostic HTTP API route testing patterns, authentication strategies, and integration testing best practices.
$ npx skills add blencorp/claude-code-kit --skill route-tester -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install blencorp/claude-code-kit route-tester --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/blencorp/claude-code-kit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/cli/core/skills/route-tester .claude/skills/route-tester && 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 "route-tester" agent skill from https://github.com/blencorp/claude-code-kit/tree/main/cli/core/skills/route-tester into .claude/skills/route-tester/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "route-tester", 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/blencorp/claude-code-kit/tree/main/cli/core/skills/route-testerType 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 blencorp/claude-code-kit --skill route-tester -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install blencorp/claude-code-kit route-tester --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blencorp/claude-code-kit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/cli/core/skills/route-tester .agents/skills/route-tester && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "route-tester" agent skill from https://github.com/blencorp/claude-code-kit/tree/main/cli/core/skills/route-tester into .agents/skills/route-tester/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "route-tester", 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 blencorp/claude-code-kit --skill route-tester -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install blencorp/claude-code-kit route-tester --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blencorp/claude-code-kit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/cli/core/skills/route-tester .cursor/skills/route-tester && 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 "route-tester" agent skill from https://github.com/blencorp/claude-code-kit/tree/main/cli/core/skills/route-tester into .cursor/skills/route-tester/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "route-tester", 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/blencorp/claude-code-kit.git --path cli/core/skills/route-tester--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 blencorp/claude-code-kit --skill route-tester -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install blencorp/claude-code-kit route-tester --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blencorp/claude-code-kit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/cli/core/skills/route-tester .gemini/skills/route-tester && 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 "route-tester" agent skill from https://github.com/blencorp/claude-code-kit/tree/main/cli/core/skills/route-tester into .gemini/skills/route-tester/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "route-tester", 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 blencorp/claude-code-kit route-testerInstalls 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 blencorp/claude-code-kit --skill route-tester -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/blencorp/claude-code-kit.git skills-src && mkdir -p .github/skills && cp -r skills-src/cli/core/skills/route-tester .github/skills/route-tester && 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 "route-tester" agent skill from https://github.com/blencorp/claude-code-kit/tree/main/cli/core/skills/route-tester into .github/skills/route-tester/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "route-tester", 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 blencorp/claude-code-kit --skill route-tester -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install blencorp/claude-code-kit route-tester --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/blencorp/claude-code-kit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/cli/core/skills/route-tester .opencode/skills/route-tester && 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 "route-tester" agent skill from https://github.com/blencorp/claude-code-kit/tree/main/cli/core/skills/route-tester into .opencode/skills/route-tester/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "route-tester", 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.
route-testerFramework-agnostic HTTP API route testing patterns, authentication strategies, and integration testing best practices.
Route Tester is an agent skill from blencorp/claude-code-kit. Framework-agnostic HTTP API route testing patterns, authentication strategies, and integration testing best practices. Supports REST APIs with JWT cookie authentication and other common auth patterns.
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files (for example `resources/api-integration-testing.md`, `resources/authentication-testing.md` and `resources/http-testing-fundamentals.md`).
It sits in Backend & APIs, covering Authentication, REST APIs and Test strategy. The repository describes itself as: Claude Code infrastructure with auto-activating skills and framework-specific kits. Install complete Claude Code infrastructure in 30 seconds with automatic framework detection… The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d1b17ed. 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.
Route Tester loads about 3k tokens when it runs. Until then it costs about 53 tokens; SKILL.md has 332 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 blencorp/claude-code-kit at commit d1b17ed, republished under its MIT licence (© blencorp). 332 words, ~2,989 tokens.
.claude/skills/route-tester/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.This skill provides framework-agnostic guidance for testing HTTP API routes and endpoints across any backend framework (Express, Next.js API Routes, FastAPI, Django REST, Flask, etc.).
Unit Tests
Integration Tests
End-to-End Tests
// Common pattern across frameworks
describe('Protected Route Tests', () => {
let authCookie: string;
beforeEach(async () => {
// Login and get JWT cookie
const loginResponse = await request(app)
.post('/api/auth/login')
.send({ email: 'test@example.com', password: 'password123' });
authCookie = loginResponse.headers['set-cookie'][0];
});
it('should access protected route with valid cookie', async () => {
const response = await request(app)
.get('/api/protected/resource')
.set('Cookie', authCookie);
expect(response.status).toBe(200);
});
it('should reject access without cookie', async () => {
const response = await request(app)
.get('/api/protected/resource');
expect(response.status).toBe(401);
});
});describe('Bearer Token Auth', () => {
let token: string;
beforeEach(async () => {
const response = await request(app)
.post('/api/auth/login')
.send({ email: 'test@example.com', password: 'password123' });
token = response.body.token;
});
it('should authenticate with bearer token', async () => {
const response = await request(app)
.get('/api/protected/resource')
.set('Authorization', `Bearer ${token}`);
expect(response.status).toBe(200);
});
});GET Requests
describe('GET /api/users', () => {
it('should return paginated users', async () => {
const response = await request(app)
.get('/api/users?page=1&limit=10');
expect(response.status).toBe(200);
expect(response.body).toHaveProperty('data');
expect(response.body).toHaveProperty('pagination');
expect(Array.isArray(response.body.data)).toBe(true);
});
it('should filter users by query params', async () => {
const response = await request(app)
.get('/api/users?role=admin');
expect(response.status).toBe(200);
expect(response.body.data.every(u => u.role === 'admin')).toBe(true);
});
});POST Requests
describe('POST /api/users', () => {
it('should create new user with valid data', async () => {
const newUser = {
name: 'John Doe',
email: 'john@example.com',
role: 'user'
};
const response = await request(app)
.post('/api/users')
.set('Cookie', authCookie)
.send(newUser);
expect(response.status).toBe(201);
expect(response.body).toMatchObject(newUser);
expect(response.body).toHaveProperty('id');
});
it('should reject invalid data', async () => {
const invalidUser = {
name: 'John Doe'
// Missing required email field
};
const response = await request(app)
.post('/api/users')
.set('Cookie', authCookie)
.send(invalidUser);
expect(response.status).toBe(400);
expect(response.body).toHaveProperty('errors');
});
});PUT/PATCH Requests
describe('PATCH /api/users/:id', () => {
it('should update user fields', async () => {
const updates = { name: 'Jane Doe' };
const response = await request(app)
.patch('/api/users/123')
.set('Cookie', authCookie)
.send(updates);
expect(response.status).toBe(200);
expect(response.body.name).toBe('Jane Doe');
});
it('should return 404 for non-existent user', async () => {
const response = await request(app)
.patch('/api/users/999999')
.set('Cookie', authCookie)
.send({ name: 'Test' });
expect(response.status).toBe(404);
});
});DELETE Requests
describe('DELETE /api/users/:id', () => {
it('should delete user and return success', async () => {
const response = await request(app)
.delete('/api/users/123')
.set('Cookie', authCookie);
expect(response.status).toBe(204);
});
it('should prevent unauthorized deletion', async () => {
const response = await request(app)
.delete('/api/users/123');
// No auth cookie
expect(response.status).toBe(401);
});
});Status Codes
describe('HTTP Status Codes', () => {
it('200 OK - Successful GET', async () => {
const response = await request(app).get('/api/users');
expect(response.status).toBe(200);
});
it('201 Created - Successful POST', async () => {
const response = await request(app).post('/api/users').send(validData);
expect(response.status).toBe(201);
});
it('204 No Content - Successful DELETE', async () => {
const response = await request(app).delete('/api/users/123');
expect(response.status).toBe(204);
});
it('400 Bad Request - Invalid input', async () => {
const response = await request(app).post('/api/users').send({});
expect(response.status).toBe(400);
});
it('401 Unauthorized - Missing auth', async () => {
const response = await request(app).get('/api/protected');
expect(response.status).toBe(401);
});
it('403 Forbidden - Insufficient permissions', async () => {
const response = await request(app).delete('/api/admin/users/123').set('Cookie', userCookie);
expect(response.status).toBe(403);
});
it('404 Not Found - Non-existent resource', async () => {
const response = await request(app).get('/api/users/999999');
expect(response.status).toBe(404);
});
it('500 Internal Server Error - Server failure', async () => {
// Test error handling
mockDatabase.findOne.mockRejectedValue(new Error('DB Error'));
const response = await request(app).get('/api/users/123');
expect(response.status).toBe(500);
});
});Response Schema Validation
describe('Response Schema', () => {
it('should match expected schema', async () => {
const response = await request(app).get('/api/users/123');
expect(response.body).toEqual({
id: expect.any(String),
name: expect.any(String),
email: expect.any(String),
role: expect.stringMatching(/^(user|admin)$/),
createdAt: expect.any(String),
updatedAt: expect.any(String)
});
});
});describe('Error Handling', () => {
it('should return structured error response', async () => {
const response = await request(app)
.post('/api/users')
.send({ invalid: 'data' });
expect(response.status).toBe(400);
expect(response.body).toEqual({
error: expect.any(String),
message: expect.any(String),
errors: expect.any(Array)
});
});
it('should handle database errors gracefully', async () => {
mockDatabase.findOne.mockRejectedValue(new Error('Connection lost'));
const response = await request(app).get('/api/users/123');
expect(response.status).toBe(500);
expect(response.body.error).toBe('Internal Server Error');
});
it('should sanitize error messages in production', async () => {
process.env.NODE_ENV = 'production';
const response = await request(app).get('/api/error-prone-route');
expect(response.status).toBe(500);
expect(response.body.message).not.toContain('stack trace');
expect(response.body.message).not.toContain('SQL');
});
});describe('API Tests', () => {
let testDatabase;
beforeAll(async () => {
// Initialize test database
testDatabase = await initTestDatabase();
});
afterAll(async () => {
// Clean up test database
await testDatabase.close();
});
beforeEach(async () => {
// Seed test data
await testDatabase.seed();
});
afterEach(async () => {
// Clear test data
await testDatabase.clear();
});
// Tests...
});While this skill provides framework-agnostic patterns, here are common testing libraries per framework:
❌ Don't share state between tests
// Bad
let userId;
it('creates user', async () => {
const response = await request(app).post('/api/users').send(userData);
userId = response.body.id; // Shared state!
});
it('deletes user', async () => {
await request(app).delete(`/api/users/${userId}`); // Depends on previous test
});✅ Do create fresh state for each test
// Good
it('creates user', async () => {
const response = await request(app).post('/api/users').send(userData);
expect(response.status).toBe(201);
});
it('deletes user', async () => {
const user = await createTestUser();
const response = await request(app).delete(`/api/users/${user.id}`);
expect(response.status).toBe(204);
});See the resources/ directory for more detailed guides:
http-testing-fundamentals.md - Deep dive into HTTP testing conceptsauthentication-testing.md - Authentication strategies and edge casesapi-integration-testing.md - Integration testing patterns and toolsTest Structure
describe('Resource Name', () => {
describe('HTTP Method /path', () => {
it('should describe expected behavior', async () => {
// Arrange
const testData = {...};
// Act
const response = await request(app)
.method('/path')
.set('Cookie', authCookie)
.send(testData);
// Assert
expect(response.status).toBe(expectedStatus);
expect(response.body).toMatchObject(expectedData);
});
});
});Authentication Pattern
let authCookie: string;
beforeEach(async () => {
const response = await request(app)
.post('/api/auth/login')
.send({ email: 'test@example.com', password: 'password123' });
authCookie = response.headers['set-cookie'][0];
});
// Use authCookie in protected route tests
.set('Cookie', authCookie)© blencorp, 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 4 other files in cli/core/skills/route-tester of blencorp/claude-code-kit.
Open the folder on GitHubat commit d1b17ed
Route Tester 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 |
|---|---|---|---|---|---|---|
| Route Tester this skillblencorp/claude-code-kit | 106 | — | ~3k | Automated safety check: Pass | MIT | |
| Laravel SpecialistJeffallan/claude-skills | 12k | 1 repos | ~2.1k | Automated safety check: Pass | MIT | |
| Hybrid Cloud Test Gengetsentry/sentry | 46k | — | ~2.6k | Automated safety check: Pass | Custom licence | |
| API Patternsdilolabs/nosia | 213 | 1 repos | ~2.5k | Automated safety check: Pass | MIT | |
| Verify Authendpointsmadeyoga/AuthEndpoints | 121 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Nodejs Express Serverever-works/ever-works | 162 | — | ~965 | Automated safety check: Pass | AGPL-3.0 |
Jeffallan/claude-skills
Builds Laravel 10+ applications with Eloquent models, Sanctum authentication, Horizon queues, API resources and Livewire components, tested with Pest or PHPUnit.
getsentry/sentry
Generate hybrid cloud tests for the Sentry codebase. An agent skill from getsentry/sentry.
dilolabs/nosia
Builds REST APIs using respondto blocks with Jbuilder templates following the 37signals same-controllers-different-formats philosophy.
madeyoga/AuthEndpoints
Drive the AuthEndpoints HTTP API via the in-repo test host (cookie sessions, Identity bearer, Simple JWT, CSRF, ReAuth).
ever-works/ever-works
Build production-ready Express.js servers with middleware, authentication, routing, and database integration.
ownpilot/OwnPilot
Systematic approach to debugging REST APIs, HTTP errors, authentication issues, and network problems.
blencorp/claude-code-kit
Material-UI v7 component library patterns including sx prop styling, theme integration, responsive design, and MUI-specific hooks.
blencorp/claude-code-kit
Express.js framework patterns including routing, middleware, request/response handling, and Express-specific APIs.
blencorp/claude-code-kit
Next.js 15+ App Router development patterns including Server Components, Client Components, data fetching, layouts, and server actions.
blencorp/claude-code-kit
Core Node.js backend patterns for TypeScript applications including async/await error handling, middleware concepts, configuration management, testing strategies, and layered architecture principles.
blencorp/claude-code-kit
Prisma ORM patterns including Prisma Client usage, queries, mutations, relations, transactions, and schema management.
blencorp/claude-code-kit
Core React 19 patterns including hooks, Suspense, lazy loading, component structure, TypeScript best practices, and performance optimization.
Categories
Framework-agnostic HTTP API route testing patterns, authentication strategies, and integration testing best practices. Route Tester is an agent skill from blencorp/claude-code-kit. Framework-agnostic HTTP API route testing patterns, authentication strategies, and integration testing best practices.
Route Tester fits situations like: tasks that involve Authentication; tasks that involve REST APIs; tasks that involve Test strategy.
Run `npx skills add blencorp/claude-code-kit --skill route-tester -a claude-code`. Or copy the skill folder (cli/core/skills/route-tester in blencorp/claude-code-kit) into .claude/skills/route-tester in your project. Claude Code loads it when a task matches its description.
Run `npx skills add blencorp/claude-code-kit --skill route-tester -a codex`. Or copy the skill folder (cli/core/skills/route-tester in blencorp/claude-code-kit) into .agents/skills/route-tester 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 blencorp/claude-code-kit --skill route-tester -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/route-tester, .gemini/skills/route-tester, .github/skills/route-tester and .opencode/skills/route-tester in your project.
SKILL.md names no scripts, command-line tools or credentials: Route Tester 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.
Route Tester is published under the MIT licence (the repository's licence). 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.
Skills that share tags, products or a category with Route Tester: Laravel Specialist (Jeffallan/claude-skills, 12k stars), Hybrid Cloud Test Gen (getsentry/sentry, 46k stars), API Patterns (dilolabs/nosia, 213 stars) and Verify Authendpoints (madeyoga/AuthEndpoints, 121 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
blencorp (a GitHub organization) maintains it in blencorp/claude-code-kit, which has 106 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on November 28, 2025.
Source: blencorp/claude-code-kit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.