Playwright E2E Testing
fugazi/test-automation-skills-agents
Author and maintain versioned Playwright (@playwright/test) TypeScript UI specs for browser user flows.
Decision guide for testing in the ar-io-node repo — which test layer to use, how to run it, and which helpers to reach for.
$ npx skills add ar-io/ar-io-node --skill testing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ar-io/ar-io-node testing --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/ar-io/ar-io-node.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/testing .claude/skills/testing && 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 "testing" agent skill from https://github.com/ar-io/ar-io-node/tree/develop/.claude/skills/testing into .claude/skills/testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "testing", 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/ar-io/ar-io-node/tree/develop/.claude/skills/testingType 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 ar-io/ar-io-node --skill testing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ar-io/ar-io-node testing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ar-io/ar-io-node.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/testing .agents/skills/testing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "testing" agent skill from https://github.com/ar-io/ar-io-node/tree/develop/.claude/skills/testing into .agents/skills/testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "testing", 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 ar-io/ar-io-node --skill testing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ar-io/ar-io-node testing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ar-io/ar-io-node.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/testing .cursor/skills/testing && 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 "testing" agent skill from https://github.com/ar-io/ar-io-node/tree/develop/.claude/skills/testing into .cursor/skills/testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "testing", 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/ar-io/ar-io-node.git --path .claude/skills/testing--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 ar-io/ar-io-node --skill testing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ar-io/ar-io-node testing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ar-io/ar-io-node.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/testing .gemini/skills/testing && 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 "testing" agent skill from https://github.com/ar-io/ar-io-node/tree/develop/.claude/skills/testing into .gemini/skills/testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "testing", 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 ar-io/ar-io-node testingInstalls 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 ar-io/ar-io-node --skill testing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ar-io/ar-io-node.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/testing .github/skills/testing && 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 "testing" agent skill from https://github.com/ar-io/ar-io-node/tree/develop/.claude/skills/testing into .github/skills/testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "testing", 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 ar-io/ar-io-node --skill testing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ar-io/ar-io-node testing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ar-io/ar-io-node.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/testing .opencode/skills/testing && 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 "testing" agent skill from https://github.com/ar-io/ar-io-node/tree/develop/.claude/skills/testing into .opencode/skills/testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "testing", 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.
testingDecision guide for testing in the ar-io-node repo — which test layer to use, how to run it, and which helpers to reach for.
Testing is an agent skill from ar-io/ar-io-node. Decision guide for testing in the ar-io-node repo — which test layer to use, how to run it, and which helpers to reach for. Use when writing a new test, picking a layer (unit / property / e2e / auto-verify / parquet integration / load test), running the suite or a single file, debugging a test failure, or when a schema or pipeline change needs cross-source verification. Triggers: "write a test for X", "run the tests", "which test layer", "run e2e", "run auto-verify", "load test the gateway", "test parquet…
Its SKILL.md is about 2.6k 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 DataFrames, End-to-end testing and Load testing. It works with ClickHouse, GraphQL, SQLite and TypeScript. The repository describes itself as: A scalable and modular gateway built for the permaweb atop the Arweave permanent data storage network. The licence is AGPL-3.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 9decdeb. 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:
yarnnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use yarn, 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:
ADMIN_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Testing loads about 2.6k tokens when it runs. Until then it costs about 140 tokens; SKILL.md has 1,099 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 noted patterns worth knowing about, such as sudo or a known installer.
:indexing` | Auto-verify run. Driven by `.env` + `AUTO_VERIFY_*` vars. |hrough `scripts/service`**, which reads `.env`. `BACKGROUND_RETRIEVAL_ORDER` governs bundle reachability during unbundliAutomated 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 ar-io/ar-io-node at commit 9decdeb, republished under its AGPL-3.0 licence (© ar-io). 1,099 words, ~2,597 tokens.
.claude/skills/testing/SKILL.md (or your agent's skills folder).Pick the narrowest layer that can fail on the change.
| Layer | Lives in | Runner | When to use |
|---|---|---|---|
| Unit | src/**/*.test.ts | yarn test / yarn test:file <path> | Pure logic, SQL wrappers, filters, route handlers (with supertest), middleware, data-source composition. Default choice. |
| Property | src/**/*.property.test.ts | same as unit | Invariants: determinism, output shape, distribution, round-trip. Uses fast-check. See src/lib/cdb64.property.test.ts for pattern. |
| E2E | test/end-to-end/*.test.ts | yarn test:e2e | Full request lifecycle through real containers: admin APIs, ArNS, bundler sidecar, webhook delivery, moderation, Prometheus metrics. Requires Docker. |
| Auto-verify | src/tests/auto-verify/ | yarn test:auto-verify:indexing | Cross-source indexing reconciliation (SQLite / Parquet / bundle-parser / ClickHouse). Use after schema changes to stable_* tables, the Parquet export, or ClickHouse transactions. |
| Parquet / ClickHouse scripts | scripts/tests/parquet/test-* | bash, run directly | Parquet export correctness & perf, ClickHouse import pipeline, TTL rules loader. Operate against a populated local DB. |
| Load / stability | tools/test-chunk-retrieval, tools/test-data-retrieval | bash, run directly | Stress endpoints for FD leaks, ECONNRESET patterns, p99 latency. Needs a running gateway. |
| GraphQL perf probe | test/perf/gql-perf | bash, GRAPHQL_URL=… ./test/perf/gql-perf | Ad-hoc timing comparisons across gateway endpoints. |
| Torrent engine contract | src/index-swarm/transport/contract.test.ts | unit always; against a real engine with INDEX_SWARM_E2E_ENGINE_URL | The TorrentTransport contract. Runs against the in-memory fake in yarn test; set the env vars in the file's header to also run it against a real qBittorrent (turn its IP filter off, or its WebSeed test is blocked). Needed for any change to an adapter under src/index-swarm/transport/. |
Escalate when a change crosses boundaries. A unit test on a SQL wrapper is not enough if the change also alters the stable_* schema — add or update an auto-verify adapter. A unit test on the Parquet exporter isn't enough if row counts could drift — run scripts/tests/parquet/test-parquet-export.
| Command | What it does |
|---|---|
yarn test | All unit+property tests, sequential (--test-concurrency 1). |
yarn test:file src/foo/bar.test.ts | Single unit test file. Pass multiple paths if needed. |
yarn test:coverage | Full suite with HTML + text coverage via c8. |
yarn test:file:coverage <path> | Single file with coverage. |
yarn test:e2e | All e2e tests. Builds the core image unless USE_PREBUILT_IMAGE=true. |
yarn test:auto-verify:indexing | Auto-verify run. Driven by .env + AUTO_VERIFY_* vars. |
yarn lint:check / yarn lint:fix | ESLint. |
yarn duplicate:check / yarn deps:ci | jscpd and madge circular-dep gate. |
Tag filtering (unit + e2e): wrap test bodies with isTestFiltered(tags) from test/utils.ts and set TEST_ONLY_TAGS=slow,integration or TEST_SKIP_TAGS=flaky. CI runs e2e with TEST_SKIP_TAGS=flaky.
Single e2e file: yarn test:file test/end-to-end/indexing.test.ts works — test:file just forwards args to node --test.
node:test (describe, it, before, after, beforeEach). Imports: import { describe, it } from 'node:test'; import assert from 'node:assert'; (or import { strict as assert } from 'node:assert').createTestLogger() from test/test-logger.ts. Never winston.createLogger({ silent: true }). Test output goes to logs/test.log (overwritten each run), not the console.test/sqlite-helpers.ts (coreDb, dataDb, bundlesDb, moderationDb). The helper creates fresh DBs from test/*-schema.sql in before and truncates all tables in afterEach. Do not construct your own Sqlite instance.stable_* or new_* table, regenerate with ./test/dump-test-schemas (requires populated data/sqlite/*.db) and commit the result.test/stubs.ts (ArweaveChainSourceStub, manifest streams, ANS-104 bundle stream), test/mock_files/ (txs, manifests, block id maps), test/mocks/ (e.g. mock-redis-token-bucket.ts).supertest. Pattern in src/middleware/httpsig.test.ts, src/routes/data/handlers.test.ts.fast-check is in devDeps. Use .property.test.ts suffix to signal intent. Fix a seed when collisions/distribution matter; keep numRuns modest so the suite stays under a minute.composeUp() / cleanDb() from test/end-to-end/utils.ts. It wraps DockerComposeEnvironment (testcontainers) around the real docker-compose.yaml with sensible defaults and exposes START_HEIGHT, STOP_HEIGHT, filters, and ADMIN_API_KEY='secret'.USE_PREBUILT_IMAGE=true reuses a pre-built core image (CI does this). Local runs rebuild from the Dockerfile.waitForBlocks, waitForBundleToBeIndexed, waitForTxToBeIndexed, waitForDataItemToBeIndexed, waitForLogMessage. Prefer these over hand-rolled polling.compose.down() in after(...). Forgetting this leaks containers across runs and tends to manifest as port conflicts on 4000/5432/8123.See docs/auto-verify.md for the full spec. Key triggers:
stable_blocks / stable_transactions / stable_data_items (or their tag tables) → update the matching adapter under src/tests/auto-verify/sources/ and the canonical types in src/tests/auto-verify/types.ts.ParquetSource.transactions schema change → update ClickHouseSource and the table-cleanup list in gateway-control.ts's cleanClickHouseTables.A silent adapter divergence shows up as field_mismatch / missing_in_source discrepancies rather than a build error, so the adapters are the first thing to re-verify after a schema change.
Run knobs: AUTO_VERIFY_ITERATIONS=N to shuffle and sample, AUTO_VERIFY_FAIL_FAST=true while iterating, AUTO_VERIFY_PRESERVE_CACHE=false only when changing a data.db migration.
All under scripts/tests/parquet/. They assume a populated data/sqlite/ and run the real export binary:
| Script | Use for |
|---|---|
test-parquet-export | Small export + --verifyCount. First thing to run after changing scripts/parquet-export or a projected column. |
test-parquet-full | L1+L2, bigger range. Catches per-partition edge cases. |
test-parquet-performance | Sweep partition sizes (5/10/25/50). Use when changing batching. |
test-timing / test-query-timing | [TIMING] breakdowns; use to isolate slow SQL in export. |
test-data-integrity | Post-hoc: verify field formats in an export directory. |
test-clickhouse-integration | End-to-end export → clickhouse-import. Run after schema or loader changes. |
test-clickhouse-ttl-rules | TTL rules loader only (PE-9058 path). |
They read config via scripts/lib/common.sh (load_env, load_clickhouse_config). Height ranges are hardcoded to ranges present in the fixture DB — if data/sqlite/core.db doesn't cover the range, expect empty results rather than a failure.
tools/test-chunk-retrieval — stress /chunk/{offset}. Supports --concurrency, --duration, --track-fds <pid> for FD leak detection on Linux. Output includes p50/p95/p99, status code histogram, resource-exhaustion flag (EMFILE, ENFILE, ENOMEM).tools/test-data-retrieval — same shape, for /raw/{id} and similar. See tools/README.md for flags.Use these when validating a fix for a reported leak or a latency regression, not as part of the normal dev loop.
When a test needs the real service running (load tools, parquet scripts, ad-hoc curl):
yarn service:stoprm logs/service.log && touch logs/service.log (JSONL log; easier to diff when empty)yarn service:startyarn service:logs or tail logs/service.log; OTEL spans land in logs/otel-spans.jsonl.--test-concurrency 1). Don't add parallelism assumptions; don't rely on test isolation via parallelism.sqlite-helpers.ts truncates in afterEach, not beforeEach. The first test in a file starts with an empty DB from the before hook; later tests inherit cleared-but-migrated state. Inserting in before is dangerous because afterEach will delete it.bundle_formats is preserved across truncation (see the tbl_name != 'bundle_formats' filter). If a test depends on an empty bundle_formats, wipe it explicitly.test/end-to-end/files/ (BDI, data items). Don't synthesize them at runtime.scripts/service, which reads .env. BACKGROUND_RETRIEVAL_ORDER governs bundle reachability during unbundling, not ON_DEMAND_RETRIEVAL_ORDER — if unbundling stalls, check trusted-gateway reachability first.coverage/ (c8). Don't commit.node:test has no .only. Use TEST_ONLY_TAGS or narrow via yarn test:file <path>; combine with --test-name-pattern if needed (pass through yarn test:file).© ar-io, 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
Just SKILL.md in .claude/skills/testing of ar-io/ar-io-node.
Open the folder on GitHubat commit 9decdeb
Testing 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 |
|---|---|---|---|---|---|---|
| Testing this skillar-io/ar-io-node | 127 | — | ~2.6k | Automated safety check: Notes | AGPL-3.0 | |
| Playwright E2E Testingfugazi/test-automation-skills-agents | 247 | — | ~3.2k | Automated safety check: Pass | MIT | |
| Manual Testhypequery/hypequery | 103 | — | ~618 | Automated safety check: Pass | Custom licence | |
| ClickHouse RowBinary for Node.jsClickHouse/agent-skills | 544 | — | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| Senior Backendalirezarezvani/claude-skills | 28k | 1 repos | ~3.8k | Automated safety check: Pass | MIT | |
| API Testingfugazi/test-automation-skills-agents | 247 | — | ~1.5k | Automated safety check: Pass | MIT |
fugazi/test-automation-skills-agents
Author and maintain versioned Playwright (@playwright/test) TypeScript UI specs for browser user flows.
hypequery/hypequery
Execute one of the model-runnable E2E test specs in testing/ (cli, datasets, serve, mcp, react) against a real ClickHouse instance.
ClickHouse/agent-skills
Generates TypeScript or JavaScript readers and writers for ClickHouse's RowBinary formats over HTTP in Node.js, after checking that RowBinary suits the data.
alirezarezvani/claude-skills
Designs and implements backend systems including REST APIs, microservices, database architectures, authentication flows, and security hardening.
fugazi/test-automation-skills-agents
Test REST and GraphQL endpoint contracts using Playwright request fixture (TypeScript) or REST Assured (Java).
crowdin/crowdin-api-client-js
Run end-to-end tests against the real Crowdin or Crowdin Enterprise API using credentials from .env.
ar-io/ar-io-node
Operate any AR.IO node deployment — architecture, daily ops, diagnostics, and recurring pitfalls that apply to every operator.
ar-io/ar-io-node
Drive the AR.IO Node release process end-to-end — preflight checks, prepare commit, finalize with image SHAs, test docker compose profiles, tag & publish, and post-release cleanup.
Categories
Decision guide for testing in the ar-io-node repo — which test layer to use, how to run it, and which helpers to reach for. Testing is an agent skill from ar-io/ar-io-node. Decision guide for testing in the ar-io-node repo — which test layer to use, how to run it, and which helpers to reach for.
Testing fits situations like: writing a new test; picking a layer (unit / property / e2e / auto-verify / parquet integration / load test); running the suite; debugging a test failure.
Run `npx skills add ar-io/ar-io-node --skill testing -a claude-code`. Or copy the skill folder (.claude/skills/testing in ar-io/ar-io-node) into .claude/skills/testing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ar-io/ar-io-node --skill testing -a codex`. Or copy the skill folder (.claude/skills/testing in ar-io/ar-io-node) into .agents/skills/testing 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 ar-io/ar-io-node --skill testing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/testing, .gemini/skills/testing, .github/skills/testing and .opencode/skills/testing in your project.
Going by SKILL.md and its folder, Testing needs the command-line tools its instructions call (yarn and node) and credentials named ADMIN_API_KEY. Our summary lists: Docker; A credential in ADMIN_API_KEY.
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.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Testing 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.
About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Testing: Playwright E2E Testing (fugazi/test-automation-skills-agents, 247 stars), Manual Test (hypequery/hypequery, 103 stars), ClickHouse RowBinary for Node.js (ClickHouse/agent-skills, 544 stars) and Senior Backend (alirezarezvani/claude-skills, 28k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ar-io (a GitHub organization) maintains it in ar-io/ar-io-node, which has 127 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 7, 2026.
Source: ar-io/ar-io-node on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.