Dotnet Testing
novotnyllc/dotnet-artisan
Defines .NET test strategy and implementation patterns across xUnit v3 (Facts, Theories, fixtures, IAsyncLifetime), integration testing (WebApplicationFactory, Testcontainers), Aspire testing…
Scaffold and extend Playwright E2E tests for the gc.platform suite (tests/playwright), wiring every artifact to the real frontend (localhost:4200) + real .NET backend — never mocks.
$ npx skills add fmflurry/settings-opencode --skill playwright-e2e-authoring -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install fmflurry/settings-opencode playwright-e2e-authoring --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/fmflurry/settings-opencode.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/playwright-e2e-authoring .claude/skills/playwright-e2e-authoring && 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 "playwright-e2e-authoring" agent skill from https://github.com/fmflurry/settings-opencode/tree/master/skills/playwright-e2e-authoring into .claude/skills/playwright-e2e-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-e2e-authoring", 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/fmflurry/settings-opencode/tree/master/skills/playwright-e2e-authoringType 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 fmflurry/settings-opencode --skill playwright-e2e-authoring -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install fmflurry/settings-opencode playwright-e2e-authoring --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fmflurry/settings-opencode.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/playwright-e2e-authoring .agents/skills/playwright-e2e-authoring && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "playwright-e2e-authoring" agent skill from https://github.com/fmflurry/settings-opencode/tree/master/skills/playwright-e2e-authoring into .agents/skills/playwright-e2e-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-e2e-authoring", 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 fmflurry/settings-opencode --skill playwright-e2e-authoring -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install fmflurry/settings-opencode playwright-e2e-authoring --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fmflurry/settings-opencode.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/playwright-e2e-authoring .cursor/skills/playwright-e2e-authoring && 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 "playwright-e2e-authoring" agent skill from https://github.com/fmflurry/settings-opencode/tree/master/skills/playwright-e2e-authoring into .cursor/skills/playwright-e2e-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-e2e-authoring", 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/fmflurry/settings-opencode.git --path skills/playwright-e2e-authoring--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 fmflurry/settings-opencode --skill playwright-e2e-authoring -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install fmflurry/settings-opencode playwright-e2e-authoring --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fmflurry/settings-opencode.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/playwright-e2e-authoring .gemini/skills/playwright-e2e-authoring && 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 "playwright-e2e-authoring" agent skill from https://github.com/fmflurry/settings-opencode/tree/master/skills/playwright-e2e-authoring into .gemini/skills/playwright-e2e-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-e2e-authoring", 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 fmflurry/settings-opencode playwright-e2e-authoringInstalls 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 fmflurry/settings-opencode --skill playwright-e2e-authoring -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/fmflurry/settings-opencode.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/playwright-e2e-authoring .github/skills/playwright-e2e-authoring && 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 "playwright-e2e-authoring" agent skill from https://github.com/fmflurry/settings-opencode/tree/master/skills/playwright-e2e-authoring into .github/skills/playwright-e2e-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-e2e-authoring", 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 fmflurry/settings-opencode --skill playwright-e2e-authoring -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install fmflurry/settings-opencode playwright-e2e-authoring --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fmflurry/settings-opencode.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/playwright-e2e-authoring .opencode/skills/playwright-e2e-authoring && 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 "playwright-e2e-authoring" agent skill from https://github.com/fmflurry/settings-opencode/tree/master/skills/playwright-e2e-authoring into .opencode/skills/playwright-e2e-authoring/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-e2e-authoring", 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.
playwright-e2e-authoringScaffold and extend Playwright E2E tests for the gc.platform suite (tests/playwright), wiring every artifact to the real frontend (localhost:4200) + real .NET backend — never mocks.
Playwright E2E Authoring is an agent skill from fmflurry/settings-opencode. Scaffold and extend Playwright E2E tests for the gc.platform suite (tests/playwright), wiring every artifact to the real frontend (localhost:4200) + real .NET backend — never mocks. Use whenever the user wants to add or write E2E / end-to-end tests, cover a new frontend feature module or screen, create a .spec.ts, add a Page Object Model (POM) or a Playwright fixture, or says things like "test the invoices page", "add an e2e test for <flow", or "write Playwright tests for <feature" — even when they do not mention…
Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including reference files (for example `references/data-setup.md`, `references/fixtures.md` and `references/pom.md`).
It sits in Testing & QA, covering End-to-end testing, Browser testing and Forms and invoices. It works with Playwright and .NET. The repository describes itself as: Custom OpenCode settings. The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 0e6c33c. 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:
npxnpmdocker-composeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx and npm, 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:
PLAYWRIGHT_KC_PASSWORDFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Playwright E2E Authoring loads about 2.4k tokens when it runs, and up to ~9k if it reads all its reference files. Until then it costs about 167 tokens; SKILL.md has 1,041 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 fmflurry/settings-opencode at commit 0e6c33c, republished under its MIT licence (© fmflurry). 1,041 words, ~2,384 tokens.
.claude/skills/playwright-e2e-authoring/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.This suite tests the live gc.platform stack end-to-end: the real Angular frontend (http://localhost:4200) plus the real GcPlatform.Api .NET backend, orchestrated by docker-compose at the repo root. Tests drive the full stack — there are no mocks, no stubs, no fake data.
Path convention: All paths in this document are relative to tests/playwright/ (the test suite root).
Your job when this skill is active: turn a request like "add E2E tests for the <feature> screen" into a correct POM + module fixture + spec, colocated under tests/<module>/, that compiles under strict TypeScript and follows the conventions the existing auth and invoices modules already demonstrate.
.spec.ts, a Page Object Model, or a module fixture.These come from tests/playwright/CLAUDE.md. Everything this skill generates must honour them.
| # | Rule | What it means in practice |
|---|---|---|
| 1 | No mocks | Real frontend + real backend + real DB. No page.route()/context.route(), no MSW/sinon/nock, no fixture stubs, no page.waitForTimeout() or arbitrary sleeps. Create/clean test data via real API or UI. |
| 2 | Page Object Model | Every screen is a POM class under tests/<module>/pages/ extending BasePage. Specs never call raw page.locator() — all DOM access flows through a POM. |
| 3 | Work by fixture | POMs are injected via Playwright fixtures (test.extend). Specs import test/expect from their module fixture, never from @playwright/test. Never new SomePage() inside a spec. |
| 4 | Per application module | One test folder per frontend feature: frontend/src/app/modules/<module> → tests/<module>/. POM, fixtures, and specs stay colocated. Cross-module helpers live in support/. |
docker-compose up is running (frontend + backend healthy). You don't have to start it to author files, but never compensate for a missing backend with a mock.frontend/src/app/modules/<module> so the test folder name mirrors it exactly (Rule 4). If unsure of the name, ask or inspect the frontend tree.tenant-a-user (seeded identity for tenant TEN-A via env vars PLAYWRIGHT_KC_USERNAME/PLAYWRIGHT_KC_PASSWORD, defaults: Nova-Delta-17!). Avoid reusing this account in password-reset specs — provision a disposable account via support/identity-accounts.ts. The dev-user identity has no tenant_id claim, so tenant-scoped screens (dunning, notifications, payments) render empty; use it only for session/logout tests.references/fixtures.md.| Route kind | Example | Module fixture extends | POMs bound to | Extra step |
|---|---|---|---|---|
Authenticated (behind authSessionGuard) | /invoices | support/fixtures/auth.fixture | authenticatedPage | Add the route to the warm-up loop in support/auth.setup.ts |
| Public | /login, /activer | support/fixtures/base.fixture | page | none |
Create the folder structure, then the artifacts in dependency order (POM → fixture → spec). Read the matching reference file before writing each kind — they hold the exact templates and the reasoning behind each convention.
Scaffold the folders
tests/<module>/
├─ pages/ # one <screen>.page.ts per screen
├─ fixtures/ # <module>.fixture.ts
└─ <feature>.spec.tsWrite the POM(s) — one per screen. → read references/pom.md
BasePage (import { BasePage } from '../../../support/pages/base.page';).private readonly Locators, assign them in the constructor.getByRole() / getByLabel() / getByTestId() over CSS/XPath.goto, clicks, fills) and high-level assertions (expectLoaded, expect…).Write the module fixture — fixtures/<module>.fixture.ts. → read references/fixtures.md
base (public) or auth (authenticated) per the table above.expect.Write the spec(s) — <feature>.spec.ts. → read references/spec.md
import { test, expect } from './fixtures/<module>.fixture';test.describe, share setup with test.beforeEach.references/data-setup.md for API-based setup/teardown patterns.If the routes are authenticated, append them to the route warm-up loop in support/auth.setup.ts so the dev server's lazy compile is paid once, serially, before workers fan out.
When setting up test data or managing test state across modules, reach for these helpers:
| Helper | Purpose |
|---|---|
keycloak-token.ts | Fetch a fresh access token via Authorization Code + PKCE flow for API calls from specs. |
identity-accounts.ts | Provision a disposable account (email + password + accountId) via POST /identity/accounts for password-reset flows. |
keycloak-admin.ts | Revoke a Keycloak session server-side (admin API); used to trigger session-loss tests. |
mailpit.ts | Poll Mailpit SMTP for password-reset emails and extract the reset link. |
dunning-report-supply.ts | Poll the dunning report generation status and check when lines appear. |
The config (playwright.config.ts) sets generous defaults for the real stack:
timeout: 90_000 — per-test wall-clock limit (90s for frontend + backend round-trips + lazy compile).expect.timeout: 15_000 — auto-retry window for assertions (15s for Transloco fetch + transforms).retries: 1, workers: 2 — one safety retry, two parallel workers.Raise limits only for tests that legitimately need extra time (e.g., AI report generation: test.setTimeout(20 * 60 * 1000);) with a comment explaining why.
See references/spec.md#admitted-exceptions for bounded fault injection, multi-context, and alternate-tenant patterns. All three are strict, justified-only uses; never extend beyond their examples.
A module may hold several fixture files when specs need genuinely different base states. Example: tests/auth/fixtures/ has three:
auth.fixture.ts — unauthenticated journey (public routes like login, sign-up).session.fixture.ts — extends the shared support/fixtures/auth.fixture, reusing the storageState.stay-connected.fixture.ts — simulates a browser restart by clearing storageState mid-flow.Each fixture explains its purpose in a JSDoc; never duplicate a fixture without documenting why the separation is necessary.
The e2e-runner agent and /e2e command hand Playwright work to this skill. After implementation, the playwright-e2e-review skill audits the result against the four rules.
Read the one that matches what you're writing — don't write from memory:
references/pom.md — Page Object Model template, locator strategy, the BasePage contract, annotated real example.references/fixtures.md — base vs auth fixtures, the authenticatedPage mechanism, the Record<never, never> gotcha, module-fixture templates, mergeTests.references/spec.md — spec structure, web-first assertions, real-data setup/teardown, naming conventions.references/data-setup.md — creating and cleaning test data via the real API, seeded vs. transient data, extracting auth tokens, defensive teardown patterns.The suite is strict TypeScript (tsc with strict: true, noImplicitAny) and the repo bans the any type. Before reporting success:
cd tests/playwright
npx tsc --noEmit --pretty false # must be cleanIf the stack is up, you can also run the new module:
npm run test:e2e -- tests/<module>Note: the suite runs against system Chrome (channel: 'chrome' in playwright.config.ts) because the Playwright browser CDN is firewall-blocked here. Don't add firefox/webkit projects expecting downloaded browsers.
© fmflurry, 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 (references) in skills/playwright-e2e-authoring of fmflurry/settings-opencode.
Open the folder on GitHubat commit 0e6c33c
Playwright E2E Authoring 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 |
|---|---|---|---|---|---|---|
| Playwright E2E Authoring this skillfmflurry/settings-opencode | 171 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Dotnet Testingnovotnyllc/dotnet-artisan | 233 | — | ~972 | Automated safety check: Pass | MIT | |
| Dotnet Testingmacalbert/envilder | 138 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Web Application Testinganthropics/skills | 180k | 51 repos | ~966 | Automated safety check: Pass | Apache-2.0 | |
| Playwright CLIsanity-io/sanity | 6.4k | 18 repos | ~1.9k | Automated safety check: Pass | MIT | |
| playwright-cli Browser Automationgithub/gh-aw | 5.4k | 24 repos | ~2.8k | Automated safety check: Pass | MIT |
novotnyllc/dotnet-artisan
Defines .NET test strategy and implementation patterns across xUnit v3 (Facts, Theories, fixtures, IAsyncLifetime), integration testing (WebApplicationFactory, Testcontainers), Aspire testing…
macalbert/envilder
Mandatory testing conventions for .NET (xUnit, AwesomeAssertions).
anthropics/skills
Tests local web applications with Python Playwright scripts, checking frontend behavior, capturing screenshots and reading browser console logs.
sanity-io/sanity
Automates browser interactions for web testing, form filling, screenshots, and data extraction.
github/gh-aw
Drives a real browser from the command line with playwright-cli to open pages, interact, mock requests, save state and work with Playwright tests.
appsmithorg/appsmith
Writes a Playwright end-to-end test from a prompt, runs it against a live Appsmith deployment and retries with fixes up to three times until it passes.
fmflurry/settings-opencode
Keep a reviewable decision trail for long-running or unattended work: a TSV log with one row per decision (what, why, evidence, result).
fmflurry/settings-opencode
A skill your agent uses for 'why does X work this way', 'why we picked Y', design rationale, regressions, postmortems, or data-backed thresholds.
fmflurry/settings-opencode
Audit and fix common accessibility issues in Angular templates and Angular Material components.
fmflurry/settings-opencode
Scaffolds and extends Angular standalone feature MODULES under src/app/modules/{name} using Clean Architecture layering (presentation/application/core/infrastructure), a self-registering module…
fmflurry/settings-opencode
Pre-merge code review for Angular + TypeScript pull requests.
fmflurry/settings-opencode
Generate OpenAPI 3.1 specs that follow the Zalando RESTful API Guidelines (kebab-case naming, cursor pagination, RFC 9457 problem+json errors, URL versioning, idempotency), one YAML file per bounded…
Works with
Categories
Scaffold and extend Playwright E2E tests for the gc.platform suite (tests/playwright), wiring every artifact to the real frontend (localhost:4200) + real .NET backend — never mocks. Playwright E2E Authoring is an agent skill from fmflurry/settings-opencode.NET backend — never mocks.
Playwright E2E Authoring fits situations like: the user wants to add; write E2E / end-to-end tests; cover a new frontend feature module; create a .spec.ts.
Run `npx skills add fmflurry/settings-opencode --skill playwright-e2e-authoring -a claude-code`. Or copy the skill folder (skills/playwright-e2e-authoring in fmflurry/settings-opencode) into .claude/skills/playwright-e2e-authoring in your project. Claude Code loads it when a task matches its description.
Run `npx skills add fmflurry/settings-opencode --skill playwright-e2e-authoring -a codex`. Or copy the skill folder (skills/playwright-e2e-authoring in fmflurry/settings-opencode) into .agents/skills/playwright-e2e-authoring 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 fmflurry/settings-opencode --skill playwright-e2e-authoring -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/playwright-e2e-authoring, .gemini/skills/playwright-e2e-authoring, .github/skills/playwright-e2e-authoring and .opencode/skills/playwright-e2e-authoring in your project.
Going by SKILL.md and its folder, Playwright E2E Authoring needs the command-line tools its instructions call (npx, npm and docker-compose) and credentials named PLAYWRIGHT_KC_PASSWORD. Our summary lists: Node.js; Docker.
SKILL.md contains no URLs. Its commands use npx and npm, which can reach the network depending on how they are called. 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.
Playwright E2E Authoring is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.4k tokens (SKILL.md is roughly 9.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Playwright E2E Authoring: Dotnet Testing (novotnyllc/dotnet-artisan, 233 stars), Dotnet Testing (macalbert/envilder, 138 stars), Web Application Testing (anthropics/skills, 180k stars) and Playwright CLI (sanity-io/sanity, 6.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
fmflurry (a GitHub user) maintains it in fmflurry/settings-opencode, which has 171 GitHub stars. The repository holds 20 skills in this directory. The repository was last updated on October 7, 2026.
Source: fmflurry/settings-opencode on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.