agentleFS
johnqtcgjohnqtcg/awesome-skills/skills/e2e-test/SKILL.md

e2e-test

Skill30 starsChanged 4 months agoMITView on GitHub

Design, maintain, and execute reliable end-to-end tests for critical user journeys with Agent Browser as first choice for exploration and Playwright as the preferred code path for suites and CI. Use for E2E strategy, journey coverage, flaky test triage, artifact collection, CI gating, regression prevention, and browser automation tasks.

  • Reads credentials

26 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use design-md, changelog and 5 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • klauswgSkill

    design-md

    Analyze Stitch projects and synthesize a semantic design system into DESIGN.md files

    Also in 3 projects that use this

  • HashiCorpSkill

    changelog

    Add a `.changelog/<PR_NUMBER>.txt` entry for a GitHub Pull Request, commit, and push.

    Also in 3 projects that use this

  • MicrosoftSkill

    playwright-cli

    Automate browser interactions, test web pages and work with Playwright tests.

    Also in 3 projects that use this

  • BlockSkill

    plan

    Draft a TDD, PRD, or lightweight plan in the conversation without committing it.

    Also in 3 projects that use this

  • GoogleSkill

    improve-codebase-architecture

    Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.

    Also in 3 projects that use this

  • GoogleSkill

    grill-me

    A relentless interview to sharpen a plan or design.

    Also in 4 projects that use this

  • +1 more from google

The file

Show its rules and text

We split this skill into the rules it gives an agent

47 rules. 0 are common, 36 are distinctive, and 11 are very specific to this project.

  • 0

    Common

    Most of the 22 edited versions we read keep these.

  • 36

    Distinctive

    This author's own choices. Worth a look.

  • 11

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Use this skill to create E2E coverage that is deterministic, evidence-backed, and maintainable in real repositories.

    line 9
  2. Distinctive:

    Do not use this skill for visual design review with no automated journey value, performance/load testing, or tests that would require …

    line 27
  3. Distinctive:

    Use both tools intentionally, not interchangeably.

    line 55
  4. Distinctive:

    If a task starts in Agent Browser and the flow is valuable long-term, convert the learned steps into Playwright coverage.

    line 67
  5. Distinctive:

    test architecture or CI gate design

    line 76
  6. Very specific:

    Run bash ${CLAUDE_SKILL_DIR}/scripts/discover_e2e_needs.sh from the target repository's root to collect repository facts (Playwright …

    line 78
  7. Distinctive:

    Run the environment and configuration gate.

    line 80
  8. Distinctive:

    non-JS projects: use the project's native test framework (see Runner Selection below)

    line 86
  9. Very specific:

    If the project has no Node.js / Playwright (e.g., Go, Python, Rust web apps):

    line 95
  10. Very specific:

    Use the project's native test framework (Go net/http, Python requests/httpx, etc.)

    line 97
  11. Distinctive:

    Do NOT install Playwright into a project that has no JavaScript toolchain

    line 98
  12. Distinctive:

    Follow the project's existing E2E test conventions if they exist

    line 99
  13. Distinctive:

    Document the runner selection rationale in the Output Contract

    line 100
  14. Distinctive:

    All 5 mandatory gates still apply regardless of runner choice

    line 101
  15. Distinctive:

    Before generating or updating runnable tests:

    line 107
  16. Distinctive:

    Never print a variable's value to check whether it is set — report the state.

    line 125
  17. Distinctive:

    If required values are missing:

    line 128
  18. Distinctive:

    do not invent them

    line 130
  19. Very specific:

    Place the guard where it can still prevent the read: file scope, inside the test, or in a beforeEach / beforeAll hook.

    line 138
  20. Distinctive:

    Before claiming a test is runnable, determine:

    line 156
  21. Very specific:

    Read references/environment-and-dependency-gates.md whenever environment readiness is uncertain.

    line 164
  22. Distinctive:

    Never claim a suite or repro was executed unless it actually ran.

    line 168
  23. Distinctive:

    If commands were not run, output:

    line 170
  24. Distinctive:

    If commands were run, report:

    line 176
  25. Distinctive:

    Do not treat a single pass as proof of reliability for critical paths or flaky failures.

    line 185
  26. Distinctive:

    Use repeat runs, traces, screenshots, and environment evidence before concluding:

    line 187
  27. Distinctive:

    Default to safe behavior for real-world side effects:

    line 195
  28. Distinctive:

    avoid production data mutation

    line 197
  29. Distinctive:

    avoid real-money or irreversible flows unless explicitly configured for safe test execution

    line 198
  30. Distinctive:

    Before recommending Playwright code or config, adapt to the repository's actual platform:

    line 209
  31. Very specific:

    Never wait on waitForLoadState('networkidle') at any version — Playwright marks it DISCOURAGED.

    line 223
  32. Very specific:

    Next.js: verify baseURL, server startup, and auth/session bootstrapping strategy.

    line 232
  33. Distinctive:

    SPA: prefer explicit waits on route or API completion, not arbitrary sleeps.

    line 233
  34. Very specific:

    Use references/playwright-deep-patterns.md whenever generating or refactoring Playwright code.

    line 263
  35. Distinctive:

    prefer reusable fixtures and domain helpers over copy-pasted flows

    line 267
  36. Very specific:

    use stable auth setup such as storageState when appropriate

    line 268
  37. Distinctive:

    keep retries, trace, screenshot, and video policies aligned with CI needs

    line 272
  38. Distinctive:

    If the repository lacks the needed config or fixtures, generate the smallest honest scaffold rather than pseudo-runnable code.

    line 274
  39. Distinctive:

    Use Agent Browser to discover or reproduce, then convert findings into durable code.

    line 367
  40. Very specific:

    Read references/agent-browser-workflows.md when using Agent Browser.

    line 377
  41. Very specific:

    run npx playwright install --with-deps chromium during setup when browsers are not pre-baked

    line 394
  42. Distinctive:

    use Secret injection for base URL, auth state bootstrap, and sandbox-only credentials

    line 395
  43. Distinctive:

    keep retries and timeout values explicit in config and CI job output

    line 397
  44. Distinctive:

    run broader browser matrix, accessibility sweeps, and visual regression

    line 399
  45. Distinctive:

    If code was generated, also include:

    line 416
  46. Distinctive:

    When the output will be consumed by CI or downstream tooling, append:

    line 423
  47. Distinctive:

    Read the required count off this table:

    line 450

“Common” is measured: kept by at least 6 in 10 of the 22 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

E2E test

Use this skill to create E2E coverage that is deterministic, evidence-backed, and maintainable in real repositories.

Quick Reference

If you need to…Go to
Design new E2E test coverage for a user journey§Operating Model → new journey coverage + Load references/checklists.md
Write or update Playwright tests§Runner Strategy + Load references/playwright-patterns.md
Use advanced Playwright (auth, fixtures, mocking, CI sharding)Load references/playwright-deep-patterns.md
Triage a flaky or failing E2E test§Operating Model → flaky triage + Load references/checklists.md
Use Agent Browser for exploration or repro§Runner Strategy + Load references/agent-browser-workflows.md
Design CI gates for E2E suites§Operating Model → CI gate design + Load references/environment-and-dependency-gates.md
Avoid common Playwright mistakesLoad references/anti-examples.md
Test content inside an iframe (payment, editor, OAuth)Load references/playwright-deep-patterns.md §Iframes
Handle a Tauri or native-mobile app§Version and Platform Gate → Platform Scope Boundary
Check generated spec code before reportingRun python3 ${CLAUDE_SKILL_DIR}/scripts/lint_e2e_spec.py <file.spec.ts>
See a fully worked E2E output exampleLoad references/golden-examples.md

Do not use this skill for visual design review with no automated journey value, performance/load testing, or tests that would require guessed secrets, endpoints, or private accounts.

Load References Selectively

The scripts ship with this skill, not with the repository under test: invoke them via ${CLAUDE_SKILL_DIR} as written. From the target repository a bare scripts/… path names that repository's own directory — missing, or a different program.

Load on demand, not up front. A typical Playwright coding task needs the two every-task rows plus playwright-patterns.md — three files. Everything below that is conditional; open it when the trigger in the first column actually applies.

WhenLoad / runContents
Every task, before coverage or gate decisionsreferences/checklists.md5 checklists: pre-run readiness, journey coverage, flaky triage, quarantine, result reporting
Every task, before claiming runnablereferences/environment-and-dependency-gates.mdReadiness gates per context (local / preview / staging / CI), available vs declared vs missing, dependency matrix
Before gate decisionsbash ${CLAUDE_SKILL_DIR}/scripts/discover_e2e_needs.shDetects runner, Node, framework, existing tests, env-var states, CI platform. Report facts, not guesses
Writing Playwright code (JS only)references/playwright-patterns.mdSelector order (getByRole first), wait patterns, assertion contracts, config baseline, API-introduction + Node tables
Auth, fixtures, data isolation, mocking, iframes, shardingreferences/playwright-deep-patterns.mdThe advanced layer — large; open the section you need
A mistake not among the seven belowreferences/anti-examples.mdExtended catalog only, no overlap with §Anti-Examples here
Using Agent Browserreferences/agent-browser-workflows.mdCommands, exploration→code conversion, repro steps, handoff format
Shaping the final reportreferences/golden-examples.mdFull output-contract examples (Playwright + Go). All figures in it are synthetic
Grading generated spec codepython3 ${CLAUDE_SKILL_DIR}/scripts/lint_e2e_spec.py <file>Deterministic check of C1–C4 / S1 / S3 / S5 / H2 + W1, L1. Evidence, not a verdict

Runner Strategy

Use both tools intentionally, not interchangeably.

  • Agent Browser first:
    • journey discovery
    • repro of flaky or environment-specific UI behavior
    • fast semantic interaction and screenshot capture
  • Playwright preferred for code:
    • committed E2E tests
    • CI suites
    • repeated local validation
    • multi-browser or matrix execution

If a task starts in Agent Browser and the flow is valuable long-term, convert the learned steps into Playwright coverage.

Operating Model

  1. Classify the task:
    • new journey coverage
    • flaky triage
    • failed CI investigation
    • exploratory browser reproduction
    • test architecture or CI gate design
  2. Run bash ${CLAUDE_SKILL_DIR}/scripts/discover_e2e_needs.sh from the target repository's root to collect repository facts (Playwright version, framework, existing tests, env vars, CI platform). Use its structured output for gate decisions instead of guessing.
  3. Run the environment and configuration gate.
  4. Choose the runner path:
    • Agent Browser for exploration or reproduction
    • Playwright for maintainable automated coverage
    • both when discovery should become code
    • non-JS projects: use the project's native test framework (see Runner Selection below)
  5. Produce only the strongest deliverable the environment can actually support:
    • runnable test
    • guarded scaffold with explicit skips
    • triage report with repro commands

Runner Selection Guidance

If the project has no Node.js / Playwright (e.g., Go, Python, Rust web apps):

  • Use the project's native test framework (Go net/http, Python requests/httpx, etc.)
  • Do NOT install Playwright into a project that has no JavaScript toolchain
  • Follow the project's existing E2E test conventions if they exist
  • Document the runner selection rationale in the Output Contract
  • All 5 mandatory gates still apply regardless of runner choice

Mandatory Gates

1) Configuration Gate

Before generating or updating runnable tests:

  • scan repository config, scripts, env files, docs, and existing tests
  • list required variables, accounts, feature flags, and service dependencies
  • mark each with one of these four states — the same vocabulary scripts/discover_e2e_needs.sh emits:
StateMeansConsequence
availablea non-empty value exists now (process env or a real .env)usable
declaredthe name is known but no value is supplied here — a .env.example entry, or E2E_PASS= with nothing after itnot usable; confirm the runtime source before claiming runnable
missingno evidence the project uses this variable at allscaffold or stop
unknownnot yet inspectedinspect before deciding

declared is the state most easily mistaken for available. A template file proves a variable is expected, never that a value exists. Treating the two as the same is what turns "cannot run" into a false "ready".

Never print a variable's value to check whether it is set — report the state. CI logs, screen recordings, and agent transcripts all capture stdout.

If required values are missing:

  • do not invent them
  • generate placeholder-only scaffolding with explicit TODOs and skip guards when code output is still useful
  • otherwise stop and report the exact blockers

Guard every variable the suite needs, not just the first one. A test.skip(!USER) leaves an unset PASS to reach the page as undefined, which surfaces as a login failure rather than "you forgot to set PASS".

Place the guard where it can still prevent the read: file scope, inside the test, or in a beforeEach / beforeAll hook. A guard in one test says nothing about another test.

A test.skip in afterEach / afterAll is worse than useless. Measured on Playwright 1.62.0 (scripts/verify_hook_semantics.sh): the test body runs, reads the unset value, and the run is then reported as skipped — so a suite that should have failed loudly reports as skipped instead. Never put a guard in an after hook.

In every result include:

  • required variable list with each variable's state
  • example export block or config shape
  • missing variables

2) Environment Gate

Before claiming a test is runnable, determine:

  • target environment: local, preview, staging, CI
  • base URL and auth flow
  • whether seed/reset is deterministic
  • whether third-party dependencies can be stubbed or must be live
  • whether test accounts and permissions are available

Read references/environment-and-dependency-gates.md whenever environment readiness is uncertain.

3) Execution Integrity Gate

Never claim a suite or repro was executed unless it actually ran.

If commands were not run, output:

  • Not run in this environment
  • reason
  • exact commands to run next

If commands were run, report:

  • command(s)
  • target environment
  • pass/fail status
  • artifact locations

4) Stability Gate

Do not treat a single pass as proof of reliability for critical paths or flaky failures.

Use repeat runs, traces, screenshots, and environment evidence before concluding:

  • the bug is fixed
  • the test is stable
  • the failure is infra-only

5) Side-Effect Gate

Default to safe behavior for real-world side effects:

  • avoid production data mutation
  • avoid real-money or irreversible flows unless explicitly configured for safe test execution
  • require explicit approval or isolation for destructive actions

Agent Browser is where these side effects happen. Only its observing commands (snapshot, screenshot, wait) are pre-approved; open, click, fill, select and evaluate deliberately prompt, so the user sees each state-changing step and its target environment. npm ci / npm install run the repository's lifecycle scripts and also prompt.

Version and Platform Gate

Before recommending Playwright code or config, adapt to the repository's actual platform:

SignalAdaptation
Playwright < 1.27Prefer locator and stable attribute selectors. getByRole, getByLabel, getByTestId, and getByPlaceholder do not exist yet.
Playwright < 1.29No expect(...).toPass(). Use expect.poll() (1.21+) instead.
Playwright < 1.33No filter({ hasNot }) and no expect(locator).toBeAttached().
Node below the pinned Playwright's engines.node floornpm install fails. Not runnable — do not claim "ready to run".
Node meets engines but is outside Playwright's supported list (latest 22.x / 24.x / 26.x)Runnable but unsupported. Say so; do not report it as supported.

Two different Node constraints exist — the engines.node install floor and the documented supported-runtime list — and they do not agree. Both tables are in references/playwright-patterns.md §Node.js Compatibility.

Never wait on waitForLoadState('networkidle') at any version — Playwright marks it DISCOURAGED. Assert the user-visible state instead.

The full API-introduction and Node-compatibility tables live in references/playwright-patterns.md §Version and Platform Gate. Read the project's pinned version before generating code; when it cannot be determined, target the oldest plausible version and say so in the Output Contract.

Framework adaptation checklist:

  • Next.js: verify baseURL, server startup, and auth/session bootstrapping strategy.
  • SPA: prefer explicit waits on route or API completion, not arbitrary sleeps.
  • SSR: assert server-rendered and hydrated states separately when needed.
  • Monorepo: locate the owning package, config file, and CI entrypoint before generating commands.

Platform Scope Boundary

Playwright is not the answer everywhere. Route away from it rather than generating code that cannot run:

PlatformRoute toWhy
Native iOS / AndroidDetox, Maestro, or AppiumNo browser to drive
TauriWebdriverIO + @wdio/tauri-serviceRenders in the OS webview (WKWebView / WebView2 / WebKitGTK); Playwright cannot attach. See references/playwright-deep-patterns.md §Tauri
ElectronPlaywright _electronSupported natively
React Native WebPlaywrightStandard DOM; testID → data-testid

Say plainly that the tool does not fit, name the right one, and stop. A plausible-looking Playwright suite for a Tauri app is worse than no answer.

Content Inside Iframes

Page-level locators do not cross a frame boundary. Embedded payment fields, editors, and OAuth screens need frameLocator. When an element is visibly on screen but "not found", check for an iframe before changing the selector — see references/playwright-deep-patterns.md §Iframes and Embedded Third-Party Content. Payment iframes additionally require the Side-Effect Gate: confirm sandbox mode before running anything.

Playwright-First Engineering Rules

Use references/playwright-deep-patterns.md whenever generating or refactoring Playwright code.

At minimum:

  • prefer reusable fixtures and domain helpers over copy-pasted flows
  • use stable auth setup such as storageState when appropriate
  • isolate data per test or per worker
  • define what can be mocked and what must stay real
  • choose serial vs parallel execution intentionally
  • keep retries, trace, screenshot, and video policies aligned with CI needs

If the repository lacks the needed config or fixtures, generate the smallest honest scaffold rather than pseudo-runnable code.

Anti-Examples

1) Unconditional waitForTimeout in assertions

BAD:

await page.waitForTimeout(3000);
await expect(page.getByText("Order confirmed")).toBeVisible();

GOOD:

await expect(page.getByText("Order confirmed")).toBeVisible();

2) Fragile CSS selector chains

BAD:

await page.locator(".app > div:nth-child(2) .cta.primary").click();

GOOD:

await page.getByRole("button", { name: "Continue" }).click();

3) Shared mutable data across tests

BAD:

const sharedEmail = "e2e-user@example.com";
test("profile update", async ({ page }) => { /* mutates same account */ });

GOOD:

test("profile update", async ({ page }) => {
  // test.info() exists only while a test runs; at file scope the file fails to load.
  const email = `e2e-${test.info().parallelIndex}-${Date.now()}@example.com`;
  /* isolated data per test */
});

4) Guessing env values or credentials

BAD:

await page.goto("http://staging");
await page.fill("#email", "fake-user@test.com");
await page.fill("#password", "password123");

GOOD:

test.skip(!process.env.E2E_BASE_URL || !process.env.E2E_USER, "explicit TODOs until config exists");
await page.goto(process.env.E2E_BASE_URL!);

5) Silently serializing entire suite

BAD:

test.describe.configure({ mode: "serial" });

GOOD:

test.describe("checkout funnel", () => {
  test.describe.configure({ mode: "serial" }); // justified by irreversible payment sandbox state
});

6) Repeating login instead of storageState

BAD:

test.beforeEach(async ({ page }) => {
  await page.goto("/login");
  await page.fill("#email", process.env.E2E_USER!);
});

GOOD:

test.use({ storageState: "playwright/.auth/user.json" });

7) Pseudo-runnable scaffold without test.skip

BAD:

test("checkout", async ({ page }) => {
  await page.goto(process.env.E2E_BASE_URL!);
});

GOOD:

test.skip(!process.env.E2E_BASE_URL, "missing base URL");
// TODO: wire payment sandbox account before enabling this journey

Agent Browser Bridge

Use Agent Browser to discover or reproduce, then convert findings into durable code.

Required bridge steps:

  1. capture the environment and entry URL
  2. record the exact command sequence
  3. save milestone screenshots
  4. note the selectors or semantic targets that proved stable
  5. translate the validated flow into Playwright assertions and helpers

Read references/agent-browser-workflows.md when using Agent Browser.

Flaky Test Policy

See references/checklists.md §Flaky Triage Template for the complete template.

Key rules:

  • A test is flaky only with non-deterministic behavior under unchanged code and environment
  • Required sequence: reproduce (--repeat-each=N or -count=N) → classify root cause → fix → quarantine with deadline
  • Root cause categories: selector instability, async race, test-data coupling, network instability, environment drift, application defect
  • quarantine only with owner, tracking issue, and removal deadline

CI Strategy

For PR automation, separate Blocking critical journeys from broader nightly coverage:

  • Blocking PR gate:
    • run npx playwright install --with-deps chromium during setup when browsers are not pre-baked
    • use Secret injection for base URL, auth state bootstrap, and sandbox-only credentials
    • upload-artifact for trace, screenshot, video, and HTML report on failure
    • keep retries and timeout values explicit in config and CI job output
  • Nightly / extended lane:
    • run broader browser matrix, accessibility sweeps, and visual regression
    • increase retries only for known infra volatility, not to hide product bugs

Output Contract

For any E2E task, return:

  1. Task type
  2. Runner choice
  3. Environment gate
  4. Config/dependency status
  5. Covered journey or Failure under triage
  6. Executed commands
  7. Execution status
  8. Artifacts
  9. Next actions

If code was generated, also include:

  • files created or updated
  • skip conditions or TODO markers if scaffolding only

Machine-Readable Summary (JSON)

When the output will be consumed by CI or downstream tooling, append:

{
  "task_type": "new_journey_coverage",
  "runner": "playwright",
  "environment": "local",
  "execution_status": "pass",
  "tests_passed": 3,
  "tests_failed": 0,
  "tests_skipped": 0,
  "artifacts": ["playwright-report/index.html", "test-results/"],
  "scorecard": { "critical": "4/4 PASS", "standard": "5/6 applicable PASS (0 N/A)", "hygiene": "4/4 applicable PASS (0 N/A)" },
  "blockers": [],
  "next_actions": ["add password-reset edge case"]
}

Quality Scorecard

For non-Playwright runners (Go HTTP, Python requests, etc.), mark Playwright-specific items as N/A. Count only applicable items when computing pass rates.

List every item including the N/A ones. Dropping a row and dividing by a smaller denominator inflates the score.

The Standard and Hygiene bars are ratios of applicable items, rounded up — a fixed ≥ 4/6 is unreachable for a Go HTTP suite, where S1 and S4 never apply. Read the required count off this table:

Applicable items6543210
Standard needs (⌈⅔ n⌉)443221n/a — passes
Hygiene needs (⌈¾ n⌉)——3321n/a — passes

Report the arithmetic, not only the verdict: Standard: 3/3 applicable (3 N/A) → PASS.

For Playwright output, run python3 ${CLAUDE_SKILL_DIR}/scripts/lint_e2e_spec.py <file> before reporting. It mechanically checks C1, C2, C3, C4, S1, S3, S5, and H2, plus two extra checks that are not scorecard items: W1 (network wait armed after its trigger) and L1 (test.info() evaluated while the file loads). An L1 finding is CRITICAL and means overall FAIL: that file throws during collection and runs no tests at all. It does not check S2, S4, S6, H1, H3, H4 — those need repository and CI context it cannot see, so assess them yourself. A clean report is weaker evidence than a dirty one: it is a heuristic pass, not a parser, and cannot see through helpers or page objects.

Critical (any FAIL → overall FAIL)

#ItemPASS rule
C1No unconditional waitForTimeout in assertionsZero instances outside diagnostic comments
C2Data isolation explicitEach test owns its data or has deterministic cleanup
C3No guessed secrets or URLsAll external values from env/config with skip guard
C4All 5 mandatory gates addressedConfiguration, Environment, Execution Integrity, Stability, Side-Effect

Standard (≥ ⅔ of applicable items PASS)

#ItemPASS rule
S1Selectors use getByRole/getByLabel/getByTestId≥ 90% of interactions use accessible selectors
S2Auth strategy explicitstorageState reuse or justified in-test login
S3Assertions after major interactionsEvery user-visible state change has an expect
S4Artifact policy configuredtrace, screenshot, video settings present
S5Serial vs parallel justifiedSerial only with documented reason
S6Mock boundaries documentedEach mocked dependency has rationale

Hygiene (≥ ¾ of applicable items PASS)

#ItemPASS rule
H1Reusable fixtures/helpersShared flows extracted, not copy-pasted
H2Descriptive test namesName describes user journey, not implementation
H3CI strategy presentBlocking gate vs nightly split documented
H4Repeat-run validationCritical paths validated with --repeat-each

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.