Agent skill

Type Safety

by idavidov13 in idavidov13/agentic-playwright

TypeScript type safety conventions for the Playwright scaffold — the "no any" rule, Zod 4 schema patterns (z.strictObject, top-level validators like z.uuid / z.email / z.url / z.int / z.enum)…

MITAuto-check passedTesting & QA

Install Type Safety

skills CLI
$ npx skills add idavidov13/agentic-playwright --skill type-safety -a claude-code

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

GitHub CLI
$ gh skill install idavidov13/agentic-playwright type-safety --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/idavidov13/agentic-playwright.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/type-safety .claude/skills/type-safety && 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
type-safety
GitHub stars
225
Token cost
~3.5k tokens
SKILL.md length
965 words
Files
3 (incl. references)
Skills in repo
13
Repo updated
First seen
Licence
MIT

At a glance

TypeScript type safety conventions for the Playwright scaffold — the "no any" rule, Zod 4 schema patterns (z.strictObject, top-level validators like z.uuid / z.email / z.url / z.int / z.enum)…

  • Works in 6 steps: Rule out any and unsafe casts → Define the Zod schema → Infer the TypeScript type from the schema → …
  • Extending a Zod schema
  • SKILL.md covers Critical, Schema Location, Instructions and Zod Validators Reference, plus 2 more sections
  • Needs APP_PASSWORD

What it does

Type Safety is an agent skill from idavidov13/agentic-playwright. TypeScript type safety conventions for the Playwright scaffold — the "no any" rule, Zod 4 schema patterns (z.strictObject, top-level validators like z.uuid / z.email / z.url / z.int / z.enum), schemas built directly from the documented OpenAPI / Swagger contract (response envelope spelled out per endpoint), type inference via zOutput and zInput, the mandatory expect(Schema.parse(body)).toBeTruthy() assertion for API responses, explicit return types on exported functions, and the two sanctioned patterns for…

Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/examples.md` and `references/troubleshooting.md`).

It sits in Testing & QA, covering Type safety, OpenAPI specifications and API testing. It works with Zod, OpenAPI, Playwright and TypeScript. The repository describes itself as: Production-grade Playwright + TypeScript Scaffold for Agentic Testing. Harness for all major AI coding agents baked in. The licence is MIT.

When your agent uses it

  • Extending a Zod schema
  • Inferring a TypeScript type from a schema
  • Writing type annotations on function signatures
  • Reviewing code for any / unsafe casts

Example prompts

  • “no any”
  • “/type-safety”

Workflow steps

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

  1. Rule out any and unsafe casts
  2. Define the Zod schema
  3. Infer the TypeScript type from the schema
  4. Validate at runtime with the mandatory assertion
  5. Annotate function signatures
  6. Handle process.env.* correctly

What it can do on your machine

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

  • Tool permissions

    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.

  • Runs code

    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.

  • Network

    No URLs in SKILL.md.

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

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • APP_PASSWORD

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

Context cost

Type Safety loads about 3.5k tokens when it runs, and up to ~4.9k if it reads all its reference files. Until then it costs about 249 tokens; SKILL.md has 965 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~249
When it runs · the whole SKILL.md, loaded when a task matches
~3.5k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~4.9k

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 passed

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.

SKILL.md

The full file from idavidov13/agentic-playwright at commit f6cbf35, republished under its MIT licence (© idavidov13). 965 words, ~3,458 tokens.

Download SKILL.mdSave it as .claude/skills/type-safety/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
type-safety
description
TypeScript type safety conventions for the Playwright scaffold — the "no any" rule, Zod 4 schema patterns (z.strictObject, top-level validators like z.uuid / z.email / z.url / z.int / z.enum), schemas built directly from the documented OpenAPI / Swagger contract (response envelope spelled out per endpoint), type inference via zOutput and zInput, the mandatory expect(Schema.parse(body)).toBeTruthy() assertion for API responses, explicit return types on exported functions, and the two sanctioned patterns for process.env.* (non-null assertion ! vs ?? fallback). Use when creating or extending a Zod schema, inferring a TypeScript type from a schema, writing type annotations on function signatures, reviewing code for any / unsafe casts, or deciding between ! and ?? on a process.env.* access. For env-variable definitions (where APP_URL etc. are declared) see the config skill; for the full API test coverage matrix and how schemas are consumed in tests see the api-testing skill.
author
Ivan Davidov

Type Safety

Critical

  • NEVER use any. Use explicit types, Zod-inferred types (zOutput<typeof ...>), or unknown at boundaries.
  • NEVER use as T or as unknown as T to silence the type-checker. If you genuinely need to cross a type boundary, validate first (Schema.parse(...)) and let Zod produce the typed result.
  • ALWAYS define API schemas with z.strictObject(). z.object() silently strips unknown keys and hides contract drift.
  • ALWAYS prefer Zod 4 top-level validators (z.uuid(), z.email(), z.url(), z.int(), z.enum(E)) over the deprecated chained forms (z.string().uuid(), z.string().email(), etc.).
  • ALWAYS assert API responses with the exact pattern expect(SchemaName.parse(body)).toBeTruthy();. Schema.parse(body) on its own is not enough.
  • ALWAYS specify explicit return types on exported and public functions (Promise<void>, Promise<UserResponse>, Locator, string, etc.).
  • Access process.env.* with ! (guaranteed at runtime) or ?? (with a safe fallback). Never let string | undefined leak into downstream code.
  • Build response schemas directly from the documented contract. Define each field — including the response envelope (success / message / data / errors or whatever the API uses) — explicitly per endpoint, exactly as the OpenAPI / Swagger spec describes. Do not invent factories or helpers that hide the envelope. If an envelope is genuinely repeated across many endpoints in one domain, extract a per-domain shared z.strictObject definition (e.g. fixtures/api/schemas/{area}/_envelope.ts) and compose with .extend(...) — but only after the repetition is real and observed.

Schema Location

fixtures/api/schemas/
├── {area}/        ← App-specific schemas (user, product, etc.) — run `ls fixtures/api/schemas/` to find the real subdirectory
│   └── userSchema.ts
└── util/          ← Shared error response schemas
    └── errorResponseSchema.ts

Instructions

Phase 1: Rule out any and unsafe casts

The TypeScript project is "strict": true. That configuration exists to surface bad types; don't work around it.

typescript
// FORBIDDEN
const data: any = await response.json();
function process(input: any): any {
    /* ... */
}
const user = raw as UserResponse;
const user = raw as unknown as UserResponse;

// CORRECT
const raw: unknown = await response.json();
const user = UserResponseSchema.parse(raw); // Zod validates + types
function process(input: unknown): ProcessedResult {
    /* ... */
}

Rules:

  • unknown is the right type at a boundary (network, file read, user input) — convert to a concrete type via Schema.parse(...).
  • Inside a function body, every variable must have a concrete type (explicit or inferred from a typed source).
  • as T is a red flag. If you see one, ask: "Can I parse with Zod here instead?" The answer is almost always yes.
Phase 2: Define the Zod schema

Use z.strictObject() and Zod 4 top-level validators. Build the response schema — including the envelope — directly from the OpenAPI / Swagger documentation. Each schema is a self-contained 1:1 mirror of the documented contract.

typescript
import { z } from 'zod/v4';
import type { output as zOutput, input as zInput } from 'zod/v4';

// 1. Define the domain schema with strict validation
export const UserSchema = z.strictObject({
    id: z.uuid(),
    email: z.email(),
    token: z.string().min(1),
    role: z.enum(['admin', 'user', 'guest']),
    avatar: z.url().optional(),
});

// 2. Wrap with the response envelope exactly as the spec describes it.
//    Spell every field out — no factory helper. If many endpoints in this
//    domain share the same envelope, extract a per-domain `_envelope.ts`
//    `z.strictObject` and compose with `.extend(...)` (only after the
//    repetition is real).
export const UserResponseSchema = z.strictObject({
    success: z.boolean(),
    message: z.string(),
    data: UserSchema,
    errors: z.unknown().nullable(),
});
typescript
// FORBIDDEN -- z.object() silently strips unknown keys
export const Schema = z.object({
    id: z.uuid(),
});

// CORRECT -- z.strictObject() rejects unknown keys at runtime
export const Schema = z.strictObject({
    id: z.uuid(),
});
Phase 3: Infer the TypeScript type from the schema

Zod 4 exposes two inference helpers. Pick based on whether you want the shape before or after transforms / defaults:

  • zOutput<typeof Schema> — the type after parsing (defaults applied, transforms run). Use this for response types and 99% of schema consumers.
  • zInput<typeof Schema> — the type before parsing (defaults optional, pre-transform values accepted). Use this for form payloads or request bodies where the caller may omit defaulted fields.
typescript
import type { output as zOutput, input as zInput } from 'zod/v4';

export type User = zOutput<typeof UserSchema>;
export type UserResponse = zOutput<typeof UserResponseSchema>;

// Example where Input and Output differ -- a schema with a default:
const SignupSchema = z.strictObject({
    email: z.email(),
    role: z.enum(['admin', 'user']).default('user'),
});

type SignupInput = zInput<typeof SignupSchema>; // { email: string; role?: 'admin' | 'user' }
type SignupOutput = zOutput<typeof SignupSchema>; // { email: string; role: 'admin' | 'user' }

If there are no .default(...) or .transform(...) calls, zInput and zOutput produce the same type — still prefer zOutput for clarity.

Phase 4: Validate at runtime with the mandatory assertion

API response validation uses the exact assertion pattern enforced across the scaffold:

typescript
import {
    UserResponse,
    UserResponseSchema,
} from '../../../fixtures/api/schemas/app/userSchema';
import { ApiEndpoints } from '../../../enums/app/app';

const { status, body } = await apiRequest<UserResponse>({
    method: 'GET',
    url: ApiEndpoints.CURRENT_USER,
    baseUrl: process.env.API_URL,
});

expect(status).toBe(200);
expect(UserResponseSchema.parse(body)).toBeTruthy();
  • The generic <UserResponse> gives compile-time safety on body.
  • expect(SchemaName.parse(body)).toBeTruthy(); is the mandatory runtime check — not schema.parse(body) alone, not a bare SchemaName.parse(body) with no assertion.
  • If the response is legitimately null (e.g., a 204 DELETE), assert expect(body).toBeNull() instead — do not call parse() on null.

This pattern is enforced in the api-testing Critical rule and repeated by helpers and test-standards. Any helper, fixture, or spec that calls apiRequest follows it.

Phase 5: Annotate function signatures

Always specify return types on public / exported functions. TypeScript can often infer them, but an explicit annotation documents the contract and surfaces breaking changes earlier.

typescript
// CORRECT
async submit(): Promise<void> { /* ... */ }
async getData(): Promise<UserResponse> { /* ... */ }
get submitButton(): Locator { /* ... */ }
export function formatDate(value: number | string): string { /* ... */ }

// AVOID -- return type missing
async submit() { /* ... */ }

Parameter types must also be explicit — never rely on noImplicitAny to rescue a missing annotation.

Show full SKILL.md (400 more words)Show less
Phase 6: Handle process.env.* correctly

process.env.X is always typed as string | undefined. Two sanctioned patterns:

typescript
// Pattern A -- non-null assertion: use when the value is guaranteed at runtime
// (e.g., after auth bootstrap, or because the key is in env/.env.example).
const url = process.env.APP_URL!;

// Pattern B -- fallback: use when a sensible default exists or the value is
// truly optional.
const environment = process.env.ENVIRONMENT ?? 'dev';
const timeout = Number(process.env.TIMEOUT_MS ?? 10000);

Never let string | undefined spread into downstream code unchecked:

typescript
// FORBIDDEN -- downstream consumers will get `string | undefined`
export const baseUrl = process.env.API_URL;

// CORRECT -- force the resolution at the access point
export const baseUrl = process.env.API_URL!;
// or
export const baseUrl = process.env.API_URL ?? 'http://localhost:3000';

NEVER hardcode secrets, passwords, or URLs. See the config skill for where env variables are declared.

typescript
// FORBIDDEN
const password = 'secret123';

// CORRECT
const password = process.env.APP_PASSWORD!;

Zod Validators Reference

Use the most specific Zod validator for each field. Zod 4 promotes string format validators to top-level APIs:

Data TypeValidatorExample
UUIDz.uuid()id: z.uuid()
GUID (permissive)z.guid()id: z.guid()
Emailz.email()email: z.email()
URLz.url()website: z.url()
Non-emptyz.string().min(1)name: z.string().min(1)
Integerz.int()count: z.int()
Enumz.enum([...])role: z.enum(['admin', 'user'])
Native Enumz.enum(MyEnum)role: z.enum(Roles)
Literalz.literal(...)statusCode: z.literal(200)
Optional.optional()avatar: z.url().optional()
Arrayz.array(...)items: z.array(ItemSchema)
Unionz.union([...])message: z.union([z.string(), z.array(z.string())])
ISO Datez.iso.date()date: z.iso.date()
ISO DateTimez.iso.datetime()createdAt: z.iso.datetime()
IPv4z.ipv4()ip: z.ipv4()
Base64z.base64()data: z.base64()
Zod 4 deprecations

The chained forms still work but prefer the top-level forms:

  • z.string().email() → z.email()
  • z.string().uuid() → z.uuid()
  • z.string().url() → z.url()
  • z.nativeEnum(E) → z.enum(E)
  • z.object() → z.strictObject() (mandatory for this project — rejects unknown keys)
  • z.object().merge() → removed; use .extend() on z.strictObject() or spread { ...A.shape, ...B.shape }
  • z.object().passthrough() → z.looseObject() (only when explicitly needed)
  • z.infer<typeof Schema> → zOutput<typeof Schema> (use zInput<> for pre-transform types)

TypeScript Strict Mode

The project uses "strict": true in tsconfig.json. Consequences:

  • All parameters must have explicit types.
  • Return types should be specified on public methods.
  • No implicit any.
  • Null checks are enforced (strictNullChecks).

Do not disable or weaken strict mode for a single file. If a type feels impossible to express, the shape is usually wrong — re-parse at the boundary with Zod.

See Also

  • api-testing skill — how schemas are consumed in tests, the full coverage matrix, expect(Schema.parse(body)).toBeTruthy() enforcement, Phase 7 behaviour-mismatch protocol.
  • config skill — where env variables are declared (env/.env.example, dotenv loading) and the consumption decision for ! vs ??.
  • data-strategy skill — Faker factories that return Zod-inferred types; factories call Schema.parse(...) internally to guarantee the output matches.
  • refactor-values skill — safe workflow for changing enum values referenced by z.literal(...) or z.enum([...]); Anti-Pattern 4 forbids loosening schemas to accommodate drift.
  • helpers skill — helpers that call APIs apply the same expect(Schema.parse(body)).toBeTruthy() pattern (Phase 5).
  • debugging skill — when expect(Schema.parse(body)).toBeTruthy() throws ZodError, or when a zInput / zOutput mismatch produces an unexpected runtime error.
  • references/examples.md — three worked examples (new schema + test, zInput vs zOutput with defaults, replacing as T casts with Zod parse).
  • references/troubleshooting.md — common type-safety pitfalls (z.object() drift, process.env widening, unsafe casts, zInput vs zOutput confusion, ZodError on contract violations, manual envelope repetition, implicit any in parameters).

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

Files

SKILL.md and 2 other files (references) in .claude/skills/type-safety of idavidov13/agentic-playwright.

  • SKILL.md
  • references/examples.md
  • references/troubleshooting.md

Open the folder on GitHubat commit f6cbf35

Compare with similar skills

Type Safety 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.

Type Safety compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Type Safety this skillidavidov13/agentic-playwright225—~3.5kAutomated safety check: PassMIT
API Testingpetrkindlmann/qa-skills168—~2.7kAutomated safety check: PassMIT
API Testingfugazi/test-automation-skills-agents247—~1.5kAutomated safety check: PassMIT
Zodjasonjgardner/blockbench-mcp-plugin4953 repos~1.4kAutomated safety check: PassGPL-3.0
Playwright E2E Testingfugazi/test-automation-skills-agents247—~3.2kAutomated safety check: PassMIT
Playwright Automationpetrkindlmann/qa-skills168—~5.5kAutomated safety check: PassMIT

Similar skills

  • API Testing

    petrkindlmann/qa-skills

    Test REST and GraphQL APIs with Playwright APIRequestContext, Supertest, or standalone HTTP clients.

    168 GitHub stars~2.7k tokensUpdated 4 mo ago
    Testing & QAAuto-check passed
  • API Testing

    fugazi/test-automation-skills-agents

    Test REST and GraphQL endpoint contracts using Playwright request fixture (TypeScript) or REST Assured (Java).

    247 GitHub stars~1.5k tokensUpdated 5 days ago
    Testing & QAAuto-check passed
  • Zod

    jasonjgardner/blockbench-mcp-plugin

    Zod schema validation best practices for type safety, parsing, and error handling.

    495 GitHub starsUsed in 3 repos~1.4k tokens
    DevelopmentAuto-check passed
  • Playwright E2E Testing

    fugazi/test-automation-skills-agents

    Author and maintain versioned Playwright (@playwright/test) TypeScript UI specs for browser user flows.

    247 GitHub stars~3.2k tokensUpdated 5 days ago
    Testing & QAAuto-check passed
  • Playwright Automation

    petrkindlmann/qa-skills

    Write production-grade Playwright tests in TypeScript: Page Object Model, fixtures, auto-waiting, user-facing locators, parallel execution, CI integration, sharding, and 2025-2026 feature awareness.

    168 GitHub stars~5.5k tokensUpdated 4 mo ago
    Testing & QAAuto-check passed
  • OpenAPI to MCP Server

    mcp-use/mcp-use

    Turns an OpenAPI or Swagger spec into an MCP server with the mcp-use TypeScript SDK, mapping each operation to a tool, wiring auth, testing and deploying.

    11k GitHub stars~5.2k tokensUpdated today
    Backend & APIsAuto-check passed

More from idavidov13/agentic-playwright

All 13 skills in this repo
  • AI Native Workflow

    idavidov13/agentic-playwright

    Sole entry-point router for AI-assisted work on this Playwright scaffold — owns the 8-phase main workflow (classify → route → explore → plan+confidence → human gate → apply → verify → report), the…

    225 GitHub stars~3.5k tokensUpdated today
    Auto-check passed
  • Common Tasks

    idavidov13/agentic-playwright

    Copy-paste AI prompt templates for common Playwright scaffold development tasks — adding page objects, functional/E2E/API tests, Zod schemas, factories, fixtures, and components.

    225 GitHub stars~2.5k tokensUpdated today
    Auto-check passed
  • Data Strategy

    idavidov13/agentic-playwright

    Test data strategy for the Playwright scaffold — Faker + Zod factories for dynamic happy-path data, static TS files (.ts with as const exports — never .json) for domain-specific curated invalid…

    225 GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Page Objects

    idavidov13/agentic-playwright

    Page Object Model pattern for the Playwright scaffold — class structure, get-accessor locator pattern, action-method conventions, component composition, registration via the page-object fixture, and…

    225 GitHub stars~3.6k tokensUpdated today
    Auto-check passed
  • Selectors

    idavidov13/agentic-playwright

    Selector strategy, exploration-first workflow, locator priority order (getByRole then getByLabel then getByPlaceholder then getByText then getByTestId), and feedback/validation-message selector…

    225 GitHub stars~2.7k tokensUpdated today
    Auto-check passed
  • Test Standards

    idavidov13/agentic-playwright

    Spec file conventions for the Playwright scaffold — imports from test-options.ts, test file structure (describe / beforeEach / test / test.step), single-tag rule, functional vs E2E vs API vs setup…

    225 GitHub stars~3.9k tokensUpdated today
    Auto-check passed

Questions about Type Safety

What does Type Safety do?

TypeScript type safety conventions for the Playwright scaffold — the "no any" rule, Zod 4 schema patterns (z.strictObject, top-level validators like z.uuid / z.email / z.url / z.int / z.enum)…. Type Safety is an agent skill from idavidov13/agentic-playwright.

When should I use Type Safety?

Type Safety fits situations like: extending a Zod schema; inferring a TypeScript type from a schema; writing type annotations on function signatures; reviewing code for any / unsafe casts.

How do I install Type Safety in Claude Code?

Run `npx skills add idavidov13/agentic-playwright --skill type-safety -a claude-code`. Or copy the skill folder (.claude/skills/type-safety in idavidov13/agentic-playwright) into .claude/skills/type-safety in your project. Claude Code loads it when a task matches its description.

How do I install Type Safety in Codex?

Run `npx skills add idavidov13/agentic-playwright --skill type-safety -a codex`. Or copy the skill folder (.claude/skills/type-safety in idavidov13/agentic-playwright) into .agents/skills/type-safety in your project. Codex loads it when a task matches its description.

Can I use Type Safety 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 idavidov13/agentic-playwright --skill type-safety -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/type-safety, .gemini/skills/type-safety, .github/skills/type-safety and .opencode/skills/type-safety in your project.

What does Type Safety need to run?

Going by SKILL.md and its folder, Type Safety needs credentials named APP_PASSWORD.

Does Type Safety access the network?

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.

Is Type Safety safe to install?

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.

What licence does Type Safety use?

Type Safety is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Type Safety use?

About 3.5k tokens (SKILL.md is roughly 14k 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 1.4k tokens, read only when the agent opens those files.

What are the alternatives to Type Safety?

Skills that share tags, products or a category with Type Safety: API Testing (petrkindlmann/qa-skills, 168 stars), API Testing (fugazi/test-automation-skills-agents, 247 stars), Zod (jasonjgardner/blockbench-mcp-plugin, 495 stars) and Playwright E2E Testing (fugazi/test-automation-skills-agents, 247 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Type Safety?

idavidov13 (a GitHub user) maintains it in idavidov13/agentic-playwright, which has 225 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on October 8, 2026.

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