backend-endpoint
Create REST/GraphQL API endpoint with validation, error handling, and tests. Auto-invoke when user says "add endpoint", "create…
Generate backend tests (unit, integration, mocks) for existing code. Auto-invoke when user says "write test for", "add test", "test this", or "create test".
Claude Code
$ npx -y skills add qf-studio/navigator --skill backend-test --agent claude-code
Codex
$ npx skills add qf-studio/navigator --skill backend-test -a codex -y
Cursor
$ npx skills add qf-studio/navigator --skill backend-test -a cursor -y
Gemini CLI
$ npx skills add qf-studio/navigator --skill backend-test -a gemini-cli -y
GitHub Copilot
$ npx skills add qf-studio/navigator --skill backend-test -a github-copilot -y
OpenCode
$ npx skills add qf-studio/navigator --skill backend-test -a opencode -y
Windsurf
$ npx skills add qf-studio/navigator --skill backend-test -a windsurf -y
name: backend-test description: Generate backend tests (unit, integration, mocks) for existing code. Auto-invoke when user says "write test for", "add test", "test this", or "create test". allowed-tools: Read, Write, Edit, Grep, Glob, Bash version: 2.0.0
Generate backend tests for **existing code** — typically code that was written without tests, or where additional coverage is needed beyond what a code-writing skill (`backend-endpoint`) already produced.
> **When to use this vs. `backend-endpoint`**: `backend-endpoint` generates tests as part of creating a new endpoint. Use `backend-test` when the code already exists and you need to add or expand its tests.
Auto-invoke when user says:
Query the knowledge graph for what we know about testing in this project:
PLUGIN_DIR="${CLAUDE_PLUGIN_ROOT:-$(cat "${NAVIGATOR_CONFIG_HOME:-${XDG_CONFIG_HOME:-$HOME/.config}/navigator}/plugin-root" 2>/dev/null)}"
[ -d "$PLUGIN_DIR/skills" ] || PLUGIN_DIR="$HOME/.claude/plugins/marketplaces/navigator-marketplace"
python3 "$PLUGIN_DIR/skills/nav-graph/functions/graph_manager.py" \
--action query --concept testing \
--graph-path .agent/knowledge/graph.json 2>/dev/null | head -40Surface patterns (preferred frameworks, mocking conventions) and pitfalls (flaky-test gotchas). If the graph returns nothing, proceed without it.
If the user named a specific file, use it. Otherwise, ask:
What should I test? - File path (e.g., src/services/userService.ts) - Function name (e.g., authenticateUser) - API endpoint (e.g., POST /api/login)
Read the target file in full so the generated tests cover its actual behavior, not assumed behavior.
# Jest grep -q '"jest"' package.json 2>/dev/null && echo "Jest detected" # Vitest grep -q '"vitest"' package.json 2>/dev/null && echo "Vitest detected" # Mocha grep -q '"mocha"' package.json 2>/dev/null && echo "Mocha detected" # Node test runner (built-in) [ -f "package.json" ] && grep -q '"test":\s*"node --test' package.json && echo "node:test detected"
Detect existing test patterns by reading a peer test file under `__tests__/`, `tests/`, or `*.test.ts` alongside the target.
**File location**: place tests where existing tests live (mirror the project's convention — colocated `*.test.ts` next to source, or under a `tests/` directory).
**Structure (Jest/Vitest)**:
import { describe, it, expect, beforeEach, vi } from 'vitest'; // or 'jest'
import { {FUNCTION_NAME} } from '{TARGET_PATH}';
describe('{FUNCTION_NAME}', () => {
describe('happy path', () => {
it('returns expected result for valid input', () => {
const result = {FUNCTION_NAME}({VALID_INPUT});
expect(result).toEqual({EXPECTED});
});
});
describe('error cases', () => {
it('throws on invalid input', () => {
expect(() => {FUNCTION_NAME}({INVALID_INPUT})).toThrow();
});
});
describe('edge cases', () => {
it('handles empty input', () => { /* ... */ });
it('handles boundary values', () => { /* ... */ });
});
});**For API/integration tests** (supertest pattern):
import request from 'supertest';
import { app } from '{APP_PATH}';
describe('{METHOD} {PATH}', () => {
it('returns 200 for valid request', async () => {
const response = await request(app).{method}('{PATH}').send({BODY});
expect(response.status).toBe(200);
expect(response.body).toMatchObject({EXPECTED_SHAPE});
});
it('returns 4xx for invalid request', async () => {
const response = await request(app).{method}('{PATH}').send({BAD_BODY});
expect(response.status).toBe(400);
});
});Run the generated tests:
{TEST_COMMAND} {TEST_FILE_PATH}If any fail because tests assume incorrect behavior, **fix the tests, not the source** — unless the source has an actual bug. If the source is buggy, surface that to the user; don't silently change it.
{
"execution_summary": {
"skill": "backend-test",
"task": "tests for {TARGET}",
"files_created": ["{test file path}"],
"files_modified": [],
"tests_added": ["{test file path}"],
"stack_detected": "{e.g. vitest+supertest}",
"patterns_followed": [
{"summary": "{e.g. supertest pattern for HTTP integration tests}", "concepts": ["testing", "api"], "confidence": 0.8}
],
"decisions_made": [
{"summary": "{e.g. mocked the DB client because tests must run offline}", "concepts": ["testing"], "confidence": 0.75}
],
"pitfalls_avoided": [],
"assumptions_made": ["{e.g. project uses Vitest globals — no explicit import needed}"]
}
}Ingest:
PLUGIN_DIR="${CLAUDE_PLUGIN_ROOT:-$(cat "${NAVIGATOR_CONFIG_HOME:-${XDG_CONFIG_HOME:-$HOME/.config}/navigator}/plugin-root" 2>/dev/null)}"
[ -d "$PLUGIN_DIR/skills" ] || PLUGIN_DIR="$HOME/.claude/plugins/marketplaces/navigator-marketplace"
echo '<execution_summary JSON>' | python3 "$PLUGIN_DIR/skills/nav-graph/functions/execution_to_graph.py" -Create REST/GraphQL API endpoint with validation, error handling, and tests. Auto-invoke when user says "add endpoint", "create…
Create database migration with schema changes and rollback. Auto-invoke when user says "create migration", "add table", "modify…
Create React/Vue component with TypeScript, tests, and styles. Auto-invoke when user says "create component", "add component",…
Generate frontend component tests (React Testing Library, Vue Test Utils, snapshot) for existing components. Auto-invoke when…
Render a one-screen intent brief (Goal/Scope/Approach/Limits/Verify/Won't-do/Contradiction) before implementing ambiguous…
Clear conversation context while preserving knowledge via context marker. Use when user says "clear context", "start fresh",…
Use your assigned AgentMail inbox to read email tasks, explicitly send or reply, and check delivery. Provided automatically by…
Create a new Architecture Decision Record with sequential numbering and AgentDB registration