Agent skill

E2E Test Creator

by letehaha in letehaha/moneymatter

Creates backend e2e tests for new or existing endpoints. An agent skill from letehaha/moneymatter.

AGPL-3.0Auto-check: warningsTesting & QA

Install E2E Test Creator

The automated check flagged lines worth reading first. See the safety section below.

skills CLI
$ npx skills add letehaha/moneymatter --skill e2e-test-creator -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install letehaha/moneymatter e2e-test-creator --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/letehaha/moneymatter.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/e2e-test-creator .claude/skills/e2e-test-creator && rm -rf skills-src

Use ~/.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/

Facts

Skill name
e2e-test-creator
GitHub stars
160
Token cost
~2.4k tokens
SKILL.md length
628 words
Files
1
Skills in repo
10
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Creates backend e2e tests for new or existing endpoints. An agent skill from letehaha/moneymatter.

  • Works in 4 steps: Gather Context → Ensure Test Helper Exists → Write the Test File → …
  • After implementing a new API endpoint
  • SKILL.md covers Mode, When to Use, Step 1: Gather Context and Step 2: Ensure Test Helper…, plus 5 more sections
  • Calls npm

What it does

E2E Test Creator is an agent skill from letehaha/moneymatter. Creates backend e2e tests for new or existing endpoints. Auto-triggers after implementing a new API endpoint. Also runs when asked to add test coverage or triggered by "/e2e-test-creator". Follows project conventions for test structure, helpers, and assertions.

Its SKILL.md is about 2.4k 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 End-to-end testing, REST APIs and Test coverage. The repository describes itself as: A personal budget tracking application. Track your balances and transactions with bank connections or manual entry, categorize and analyze expenses and income, and many more. The licence is AGPL-3.0.

When your agent uses it

  • After implementing a new API endpoint
  • Tasks that involve End-to-end testing
  • Tasks that involve REST APIs

Example prompts

  • “/e2e-test-creator”
  • “Use the e2e-test-creator skill to create backend e2e tests for new or existing endpoints. An agent skill from letehaha/moneymatter”
  • “/e2e-test-creator”

Requirements

  • Pre-approved tools (allowed-tools): Read, Write, Edit, Grep, Glob, Bash, AskUserQuestion

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Gather Context
  2. Ensure Test Helper Exists
  3. Write the Test File
  4. Verify

What it can do on your machine

Read from SKILL.md and the folder at commit de5319f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Write
    • Edit
    • Grep
    • Glob
    • Bash
    • AskUserQuestion

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

E2E Test Creator loads about 2.4k tokens when it runs. Until then it costs about 70 tokens; SKILL.md has 628 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~70
When it runs · the whole SKILL.md, loaded when a task matches
~2.4k

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.

Safety

Auto-check: warnings

The automated check found patterns that need a careful read before installing.

  • WarningTells the agent its actions are pre-authorized / not to stop for confirmationSKILL.md:181
    Run from `packages/backend/`. Do NOT wait for user confirmation — run tests immediately after writing them.
  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Read, Write, Edit, Grep, Glob, Bash, AskUserQuestion

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.

SKILL.md

The full file from letehaha/moneymatter at commit de5319f, republished under its AGPL-3.0 licence (© letehaha). 628 words, ~2,396 tokens.

Download SKILL.mdSave it as .claude/skills/e2e-test-creator/SKILL.md (or your agent's skills folder).
name
e2e-test-creator
description
Creates backend e2e tests for new or existing endpoints. Auto-triggers after implementing a new API endpoint. Also runs when asked to add test coverage or triggered by "/e2e-test-creator". Follows project conventions for test structure, helpers, and assertions.
allowed-tools
Read, Write, Edit, Grep, Glob, Bash, AskUserQuestion

E2E Test Creator

Creates properly structured e2e tests for backend API endpoints following this project's exact conventions.

Mode

This skill is primarily a reference guide — read the conventions below and write tests directly based on the endpoint just implemented. However, if there's ambiguity about what scenarios to cover (e.g., complex business logic, unclear edge cases), it's fine to ask the user a brief clarifying question before writing.

When to Use

  • Auto-trigger: After implementing any new backend endpoint (route + controller + service), always write e2e tests as part of the implementation workflow
  • When user explicitly asks to add e2e test coverage
  • When triggered via /e2e-test-creator

Step 1: Gather Context

Before writing any test, read these files to understand what you're testing:

  1. The service being tested (to understand input/output types and logic)
  2. The controller (to understand the Zod schema / endpoint contract)
  3. The route (to confirm the HTTP method and path)
  4. The test helpers file for that domain (packages/backend/src/tests/helpers/<domain>.ts)
  5. Any existing e2e tests for the same domain (to colocate or extend)

Step 2: Ensure Test Helper Exists

Every endpoint needs a corresponding test helper function. If one doesn't exist, create it first.

Test Helper Pattern

Location: packages/backend/src/tests/helpers/<domain>.ts

typescript
import type { myService as apiMyService } from '@services/<domain>/my-service';
import { makeRequest } from './common';

export async function myEndpoint<R extends boolean | undefined = undefined>({
  raw,
  // ... endpoint-specific params
}: {
  raw?: R;
  // ... param types
} = {}) {
  return makeRequest<Awaited<ReturnType<typeof apiMyService>>, R>({
    method: 'get', // or post, put, patch, delete
    url: '/<domain>/endpoint',
    raw,
  });
}

Key rules:

  • Use type-only import for the service function (for return type inference)
  • Use the generic <R> pattern for the raw parameter
  • Pass query params via payload for GET requests (makeRequest converts them to query string)

Step 3: Write the Test File

File Location & Naming
  • Colocate with the service: packages/backend/src/services/<domain>/<feature>.e2e.ts
  • Or extend an existing test file if there's already one for that domain
  • Naming: kebab-case.e2e.ts
Test Structure
typescript
import { describe, expect, it } from '@jest/globals';
import * as helpers from '@tests/helpers';
// Import enums/types needed for test data
import { SOME_ENUM } from '@bt/shared/types';

describe('Feature Name', () => {
  // Group by logical concern
  describe('GET /endpoint', () => {
    it('returns expected data for happy path', async () => {
      // ARRANGE: create prerequisite data via helpers
      const account = await helpers.createAccount({ raw: true });

      // ACT: call the endpoint being tested
      const result = await helpers.myEndpoint({ raw: true });

      // ASSERT: verify the response
      expect(result.someField).toBe(expectedValue);
    });

    it('returns empty/default when no data exists', async () => {
      const result = await helpers.myEndpoint({ raw: true });
      expect(result.count).toBe(0);
    });

    it('filters by query parameter', async () => {
      // Create mixed data
      await helpers.createThing({ type: 'a', raw: true });
      await helpers.createThing({ type: 'b', raw: true });

      // Filter
      const result = await helpers.myEndpoint({ type: 'a', raw: true });
      expect(result.length).toBe(1);
    });
  });
});
Required Minimum Coverage (every endpoint)
  1. Happy path — the main use case returns correct data
  2. Empty state — what happens when there's no data (e.g., no subscriptions yet returns zeros)
  3. Error case — at least one: invalid input, not-found resource, or unauthorized access (use raw: false for status code checks)
Additional Coverage (add when relevant)
  • Filtering — if the endpoint accepts query params, test each filter
  • Cross-currency — if the endpoint does currency conversion, test with a non-base currency
  • Edge cases — boundary values, null fields, inactive records
  • Data isolation — the endpoint only returns data for the authenticated user

Key Rules

NEVER call services directly
typescript
// WRONG
const result = await getSubscriptionsSummary({ userId: 1 });

// CORRECT
const result = await helpers.getSubscriptionsSummary({ raw: true });
Use raw: true for happy path, raw: false for error checks
typescript
// Happy path — get extracted data directly
const data = await helpers.getSomething({ raw: true });
expect(data.name).toBe('expected');

// Error case — check HTTP status code
const res = await helpers.getSomething({ id: 'nonexistent' });
expect(res.statusCode).toBe(404);
Show full SKILL.md (250 more words)Show less
HTTP status codes
  • 200 — success
  • 404 — not found
  • 409 — conflict (e.g., duplicate link)
  • 422 — Zod validation errors (invalid params, query, body). NOT 400 — the validateEndpoint middleware returns 422 Unprocessable Entity for schema validation failures.
Money amounts
  • Create with cents: expectedAmount: 1599 (= $15.99)
  • API responses return decimals: expect(result.amount).toBe(15.99)
Test data setup
  • Each test starts with a clean database (global beforeEach truncates tables)
  • A default user with base currency AED is created automatically
  • Create test-specific data at the top of each it() block via helpers
  • Use await Promise.all([...]) for independent data creation
No test timeouts
  • Default timeout is 15s per test, 20s for setup
  • If a test needs more, there's likely a problem with the test or the endpoint

Step 4: Verify

After writing the test, run it automatically using the test-runner subagent:

bash
npm run test:e2e -- --testPathPattern='<pattern>'

Run from packages/backend/. Do NOT wait for user confirmation — run tests immediately after writing them.

Example: Complete Test for a Summary Endpoint

typescript
import { SUBSCRIPTION_FREQUENCIES, SUBSCRIPTION_TYPES } from '@bt/shared/types';
import { describe, expect, it } from '@jest/globals';
import * as helpers from '@tests/helpers';

describe('Subscriptions Summary', () => {
  describe('GET /subscriptions/summary', () => {
    it('returns summary with correct monthly cost', async () => {
      await helpers.createSubscription({
        name: 'Netflix',
        expectedAmount: 1500,
        expectedCurrencyCode: global.BASE_CURRENCY_CODE,
        frequency: SUBSCRIPTION_FREQUENCIES.monthly,
        startDate: '2025-01-01',
        raw: true,
      });

      const summary = await helpers.getSubscriptionsSummary({ raw: true });

      expect(summary.activeCount).toBe(1);
      expect(summary.estimatedMonthlyCost).toBe(15);
      expect(summary.projectedYearlyCost).toBe(180);
      expect(summary.currencyCode).toBe(global.BASE_CURRENCY_CODE);
    });

    it('returns zeros when no active subscriptions exist', async () => {
      const summary = await helpers.getSubscriptionsSummary({ raw: true });

      expect(summary.activeCount).toBe(0);
      expect(summary.estimatedMonthlyCost).toBe(0);
      expect(summary.projectedYearlyCost).toBe(0);
    });

    it('filters by subscription type', async () => {
      await helpers.createSubscription({
        name: 'Netflix',
        type: SUBSCRIPTION_TYPES.subscription,
        expectedAmount: 1500,
        expectedCurrencyCode: global.BASE_CURRENCY_CODE,
        frequency: SUBSCRIPTION_FREQUENCIES.monthly,
        startDate: '2025-01-01',
        raw: true,
      });
      await helpers.createSubscription({
        name: 'Electricity',
        type: SUBSCRIPTION_TYPES.bill,
        expectedAmount: 10000,
        expectedCurrencyCode: global.BASE_CURRENCY_CODE,
        frequency: SUBSCRIPTION_FREQUENCIES.monthly,
        startDate: '2025-01-01',
        raw: true,
      });

      const subsOnly = await helpers.getSubscriptionsSummary({
        type: SUBSCRIPTION_TYPES.subscription,
        raw: true,
      });
      expect(subsOnly.activeCount).toBe(1);
      expect(subsOnly.estimatedMonthlyCost).toBe(15);

      const billsOnly = await helpers.getSubscriptionsSummary({
        type: SUBSCRIPTION_TYPES.bill,
        raw: true,
      });
      expect(billsOnly.activeCount).toBe(1);
      expect(billsOnly.estimatedMonthlyCost).toBe(100);
    });
  });
});

Troubleshooting

Test timeout (exceeds 15s)

Cause: Endpoint is too slow or test has an unresolved promise Solution: Check for missing await keywords, infinite loops, or endpoints that need optimization.

"relation does not exist" error

Cause: Migration hasn't been applied to the test database Solution: Verify migrations are up to date. The test setup should handle this automatically, but check for new migration files.

Unexpected 422 instead of 400

Cause: The validateEndpoint middleware returns 422 for Zod validation failures, not 400 Solution: Always expect 422 for schema validation errors. Use 400 only for custom validation in service logic.

© letehaha, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/e2e-test-creator of letehaha/moneymatter.

Open the folder on GitHubat commit de5319f

Compare with similar skills

E2E Test Creator 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.

E2E Test Creator compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
E2E Test Creator this skillletehaha/moneymatter160—~2.4kAutomated safety check: WarnAGPL-3.0
Atdd Mutateswingerman/engineer154—~2.7kAutomated safety check: PassMIT
E2E Test ThinkerUniClipboard/UniClipboard1.9k—~1.7kAutomated safety check: PassAGPL-3.0
Check Test Coverageopenshift/oc-mirror124—~853Automated safety check: PassApache-2.0
Platform Dsar Policy Manageforcedotcom/sf-skills1.1k—~5.2kAutomated safety check: PassApache-2.0
Post Dev Testsd0xdev/sd0x-harness192—~1.8kAutomated safety check: NotesMIT

Similar skills

  • Atdd Mutate

    swingerman/engineer

    A skill your agent uses to add a third validation layer to the ATDD workflow — after acceptance tests verify WHAT and unit tests verify HOW, mutation testing verifies the tests actually catch bugs.

    154 GitHub stars~2.7k tokensUpdated 15 days ago
    Testing & QAAuto-check passed
  • E2E Test Thinker

    UniClipboard/UniClipboard

    Analyze the current branch's diff against main and determine which changes are testable via CLI-based end-to-end tests.

    1.9k GitHub stars~1.7k tokensUpdated today
    Testing & QAAuto-check passed
  • Check Test Coverage

    openshift/oc-mirror

    Analyze oc-mirror CLI feature coverage across integration and e2e tests, identifying untested features and gaps

    124 GitHub stars~853 tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Platform Dsar Policy Manage

    forcedotcom/sf-skills

    Configure, run, and audit DsarPolicy Right-to-Portability exports end to end: author the data map over a subject's related records, resolve a request's subject (email/name/id) to a root-entity…

    1.1k GitHub stars~5.2k tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Post Dev Test

    sd0xdev/sd0x-harness

    Post-development test completion. An agent skill from sd0xdev/sd0x-harness.

    192 GitHub stars~1.8k tokensUpdated today
    Testing & QAAuto-check: notes
  • Test Coverage

    luongnv89/skills

    Generate unit tests for untested branches and edge cases. An agent skill from luongnv89/skills.

    131 GitHub stars~2.5k tokensUpdated yesterday
    Testing & QAAuto-check passed

More from letehaha/moneymatter

All 10 skills in this repo
  • Spec Planner

    letehaha/moneymatter

    Deep-dive specification planner. An agent skill from letehaha/moneymatter.

    160 GitHub stars~1.8k tokensUpdated yesterday
    Auto-check: notes
  • Add MCP Tool

    letehaha/moneymatter

    Add a new tool to the MoneyMatter MCP server. An agent skill from letehaha/moneymatter.

    160 GitHub stars~1.9k tokensUpdated yesterday
    Auto-check: notes
  • Find Slop

    letehaha/moneymatter

    Hunt "AI slop" in this codebase — duplication, reinvented wheels, over-engineering, defensive cruft, dead code, comment slop, performance antipatterns.

    160 GitHub stars~3k tokensUpdated yesterday
    Auto-check passed
  • Frontend Rules

    letehaha/moneymatter

    Frontend conventions and component usage rules. An agent skill from letehaha/moneymatter.

    160 GitHub stars~3.8k tokensUpdated yesterday
    Auto-check passed
  • I18n Before Release

    letehaha/moneymatter

    Occasional i18n catch-up: strip unused en keys, then fill any uk translations that slipped through via i18n-editor subagents.

    160 GitHub stars~1.1k tokensUpdated yesterday
    Auto-check passed
  • Prd Creator

    letehaha/moneymatter

    Smart PRD generator. An agent skill from letehaha/moneymatter.

    160 GitHub stars~1.1k tokensUpdated yesterday
    Auto-check: notes

Categories

Questions about E2E Test Creator

What does E2E Test Creator do?

Creates backend e2e tests for new or existing endpoints. An agent skill from letehaha/moneymatter. E2E Test Creator is an agent skill from letehaha/moneymatter. Creates backend e2e tests for new or existing endpoints.

When should I use E2E Test Creator?

E2E Test Creator fits situations like: after implementing a new API endpoint; tasks that involve End-to-end testing; tasks that involve REST APIs.

How do I install E2E Test Creator in Claude Code?

Run `npx skills add letehaha/moneymatter --skill e2e-test-creator -a claude-code`. Or copy the skill folder (.claude/skills/e2e-test-creator in letehaha/moneymatter) into .claude/skills/e2e-test-creator in your project. Claude Code loads it when a task matches its description.

How do I install E2E Test Creator in Codex?

Run `npx skills add letehaha/moneymatter --skill e2e-test-creator -a codex`. Or copy the skill folder (.claude/skills/e2e-test-creator in letehaha/moneymatter) into .agents/skills/e2e-test-creator in your project. Codex loads it when a task matches its description.

Can I use E2E Test Creator in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add letehaha/moneymatter --skill e2e-test-creator -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/e2e-test-creator, .gemini/skills/e2e-test-creator, .github/skills/e2e-test-creator and .opencode/skills/e2e-test-creator in your project.

What does E2E Test Creator need to run?

Going by SKILL.md and its folder, E2E Test Creator needs the command-line tools its instructions call (npm). Its frontmatter pre-approves these tools: Read, Write, Edit, Grep, Glob, Bash, AskUserQuestion.

Does E2E Test Creator access the network?

SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is E2E Test Creator safe to install?

Our automated static check of SKILL.md flagged 1 warning(s): tells the agent its actions are pre-authorized / not to stop for confirmation. Read the flagged lines before installing; the check is not a guarantee either way.

What licence does E2E Test Creator use?

E2E Test Creator is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does E2E Test Creator use?

About 2.4k tokens (SKILL.md is roughly 9.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to E2E Test Creator?

Skills that share tags, products or a category with E2E Test Creator: Atdd Mutate (swingerman/engineer, 154 stars), E2E Test Thinker (UniClipboard/UniClipboard, 1.9k stars), Check Test Coverage (openshift/oc-mirror, 124 stars) and Platform Dsar Policy Manage (forcedotcom/sf-skills, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains E2E Test Creator?

letehaha (a GitHub user) maintains it in letehaha/moneymatter, which has 160 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 7, 2026.

Source: letehaha/moneymatter on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.