Control UI
cursor/plugins
Build or adapt a local browser/CDP harness to drive and inspect a web, IDE, or Electron UI.
Reference guide for writing and running Langflow frontend accessibility tests with axe (Jest) and IBM Equal Access (Playwright page.runA11yScan).
$ npx skills add langflow-ai/langflow --skill ibm-a11y-testing-guide -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install langflow-ai/langflow ibm-a11y-testing-guide --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/langflow-ai/langflow.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/ibm-a11y-testing-guide .claude/skills/ibm-a11y-testing-guide && 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 "ibm-a11y-testing-guide" agent skill from https://github.com/langflow-ai/langflow/tree/main/.agents/skills/ibm-a11y-testing-guide into .claude/skills/ibm-a11y-testing-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ibm-a11y-testing-guide", 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/langflow-ai/langflow/tree/main/.agents/skills/ibm-a11y-testing-guideType 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 langflow-ai/langflow --skill ibm-a11y-testing-guide -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install langflow-ai/langflow ibm-a11y-testing-guide --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/langflow-ai/langflow.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/ibm-a11y-testing-guide .agents/skills/ibm-a11y-testing-guide && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ibm-a11y-testing-guide" agent skill from https://github.com/langflow-ai/langflow/tree/main/.agents/skills/ibm-a11y-testing-guide into .agents/skills/ibm-a11y-testing-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ibm-a11y-testing-guide", 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 langflow-ai/langflow --skill ibm-a11y-testing-guide -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install langflow-ai/langflow ibm-a11y-testing-guide --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/langflow-ai/langflow.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/ibm-a11y-testing-guide .cursor/skills/ibm-a11y-testing-guide && 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 "ibm-a11y-testing-guide" agent skill from https://github.com/langflow-ai/langflow/tree/main/.agents/skills/ibm-a11y-testing-guide into .cursor/skills/ibm-a11y-testing-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ibm-a11y-testing-guide", 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/langflow-ai/langflow.git --path .agents/skills/ibm-a11y-testing-guide--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 langflow-ai/langflow --skill ibm-a11y-testing-guide -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install langflow-ai/langflow ibm-a11y-testing-guide --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/langflow-ai/langflow.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/ibm-a11y-testing-guide .gemini/skills/ibm-a11y-testing-guide && 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 "ibm-a11y-testing-guide" agent skill from https://github.com/langflow-ai/langflow/tree/main/.agents/skills/ibm-a11y-testing-guide into .gemini/skills/ibm-a11y-testing-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ibm-a11y-testing-guide", 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 langflow-ai/langflow ibm-a11y-testing-guideInstalls 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 langflow-ai/langflow --skill ibm-a11y-testing-guide -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/langflow-ai/langflow.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/ibm-a11y-testing-guide .github/skills/ibm-a11y-testing-guide && 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 "ibm-a11y-testing-guide" agent skill from https://github.com/langflow-ai/langflow/tree/main/.agents/skills/ibm-a11y-testing-guide into .github/skills/ibm-a11y-testing-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ibm-a11y-testing-guide", 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 langflow-ai/langflow --skill ibm-a11y-testing-guide -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install langflow-ai/langflow ibm-a11y-testing-guide --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/langflow-ai/langflow.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/ibm-a11y-testing-guide .opencode/skills/ibm-a11y-testing-guide && 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 "ibm-a11y-testing-guide" agent skill from https://github.com/langflow-ai/langflow/tree/main/.agents/skills/ibm-a11y-testing-guide into .opencode/skills/ibm-a11y-testing-guide/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ibm-a11y-testing-guide", 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.
ibm-a11y-testing-guideReference guide for writing and running Langflow frontend accessibility tests with axe (Jest) and IBM Equal Access (Playwright page.runA11yScan).
Ibm A11y Testing Guide is an agent skill from langflow-ai/langflow. Reference guide for writing and running Langflow frontend accessibility tests with axe (Jest) and IBM Equal Access (Playwright page.runA11yScan). Covers which engine/test layer to pick, the POUR checklist, axe-vs-IBM rule gaps, Radix/AG-Grid component gotchas, and IBM baselines. Use when writing or reviewing a11y tests, debugging a specific axe/IBM violation, or deciding which test layer fits a UI surface. Does not run scans, audit a whole surface, or fix a PR end-to-end — see ibm-a11y-route-scan…
Its SKILL.md is about 4.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 Frontend & Design, covering Accessibility. It works with Jest and Playwright. The repository describes itself as: Langflow is a powerful tool for building and deploying AI-powered agents and workflows. The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 504c02f. 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:
npxuvnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, uv 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 no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ibm A11y Testing Guide loads about 4.6k tokens when it runs. Until then it costs about 147 tokens; SKILL.md has 2,116 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 langflow-ai/langflow at commit 504c02f, republished under its MIT licence (© langflow-ai). 2,116 words, ~4,610 tokens.
.claude/skills/ibm-a11y-testing-guide/SKILL.md (or your agent's skills folder).Reference material for how to test a given UI surface. This skill does not decide what to scan or drive a fix loop by itself — use it while writing tests, debugging a violation, or implementing a fix identified by ibm-a11y-route-scan, ibm-a11y-level1-audit, or ibm-a11y-pr-remediation.
Use this skill for frontend work under src/frontend when the change affects:
Use alongside:
frontend-testing for Jest/React Testing Library patterns.e2e-testing for Playwright patterns.frontend-i18n when adding or changing user-facing labels, accessible names, aria-label, tooltips, or visible strings.ibm-a11y-route-scan to batch-scan routes with the Python scanner and produce Markdown/HTML reports.ibm-a11y-level1-audit for a scoped IBM Level 1 compliance audit and report.ibm-a11y-pr-remediation to scan and fix an entire PR/branch end-to-end.Do not stop at "run axe on default render." Inspect the changed UI and cover every meaningful user-visible state, for both keyboard and screen-reader users, that can expose accessibility bugs.
Automated a11y is not one tool. Run BOTH — they catch different classes of bug:
axe() (@/utils/a11y-test), jsdom-only. Fast; strong on contrast, labels, roles, ARIA basics.aChecker):page.runA11yScan(label) — runs aChecker.getCompliance in-browser on the live DOM, so it scans open modals / menus / selected / editing states. This is IBM, not axe (despite the name).scripts/a11y/a11y_scan.py (see ibm-a11y-route-scan) — route scanner for the default-loaded page only.A page that is green on axe is NOT done. When the change touches a table/tree/listbox/menu/composite widget, IBM is mandatory. Prefer page.runA11yScan for stateful surfaces (it sees the DOM after your interactions); use the Python scanner for a quick default-load route check.
Verify commands:
cd src/frontend
RUN_A11Y=true RUN_A11Y_ASSERT=true npx playwright test tests/a11y/<feature>.a11y.spec.ts --project=chromium --workers=5
# The Python scanner's playwright deps are NOT in the default `uv sync`.
# One-time: `uv run --with playwright playwright install chromium`
uv run --with playwright python scripts/a11y/a11y_scan.py \
--url http://localhost:3000 \
--routes /settings/<route> \
--out /tmp/a11y.json --markdown /tmp/a11y.md --timeout-ms 45000RUN_A11Y=true runs the scan; add RUN_A11Y_ASSERT=true to actually fail on new violations (without it the scan is informational). Both engines must report zero. After changing a shared component, re-scan every page that uses it, not just the one you touched.
tabindex; arrows move within.<body>.rowgroup owns row, list owns listitem).presentation/none).aria-hidden="true" never wraps a focusable element.Things axe passes but IBM flags (all real WCAG Level 1):
| IBM rule | WCAG | Typical cause |
|---|---|---|
element_tabbable_role_valid | 4.1.2 | tabbable element with role="presentation" / no widget role (focus sentinels, wrappers) |
aria_child_valid | 1.3.1 | rowgroup/list/tablist owning no valid child role |
aria_child_tabbable | 2.1.1 / 4.1.2 | composite widget with no tabbable descendant (needs roving tabindex) |
aria_hidden_focus_misuse | 4.1.2 | focusable element inside aria-hidden="true" |
aria_accessiblename_exists | 4.1.2 | element with a widget role but no accessible name — e.g. an AG Grid columnheader with neither field nor headerName (icon-only action column) |
aria_content_in_landmark | 1.3.1 | content outside any landmark — e.g. a Radix menu/popover portaled to <body>. role="menu" is NOT landmark-exempt; only aria-modal dialogs are. Often unfixable app-wide → baseline it (see below) |
Rule of thumb: touch a table/tree/listbox/menu → scan with IBM.
TableComponent): the grid's own tab guards + pagination are the fragile part.tabindex="-1", but NEVER inert/disabled — that breaks AG Grid's tab guards and traps reverse (Shift+Tab) entry (WCAG 2.1.2).tabToNextCell hook plus a container-scoped focusin redirect (defer the redirect to requestAnimationFrame — focus changes inside a focusin handler are ignored, and AG Grid restores the last-focused cell on the next tick).role="presentation"; the grid needs one roving-tabindex row.columnheader accessible name from field; a column with neither field nor headerName is nameless (aria_accessiblename_exists, 4.1.2). Give it a headerName and hide it visually with a headerClass (sr-only clip on .ag-header-cell-text) so the header stays blank but named.onCellKeyDown on Enter/Space (give the column a colId to target it). A Radix trigger opens on keydown/pointerdown, not a synthetic .click() — focus the trigger and re-dispatch the key (new KeyboardEvent("keydown", {key, bubbles:true})), guarding against re-entry (skip when target is already the button). TableComponent spreads {...props} to AG Grid, so pass onCellKeyDown from the page — no shared-component change..ag-no-border): the theme suppresses the cell focus outline (outline:none), hiding keyboard focus (2.4.7). Restore it with a :focus-visible ring scoped to .ag-no-border .ag-cell:focus-visible (+ header/row). :focus-visible distinguishes modality on AG cells — mouse click resolves to :focus, keyboard nav to :focus-visible — so the ring shows for keyboard only and mouse stays quiet. CAVEAT when verifying: probe with a clean, first-interaction page; a session that already used the keyboard makes :focus-visible report true for a later mouse click (heuristic contamination).ensureDomOrder: true so DOM order matches visual order for tab navigation.TableComponent is shared across settings/traces — fix once in the grid patch, then re-scan every grid page. Its pagination/tab-out rework lives in LE-1720 / PR #13953; don't duplicate it per-page.Trigger asChild double tab stop: a DialogTrigger/DropdownMenuTrigger wrapping a real <button> without asChild makes Radix render its own <button> around it → nested buttons → two consecutive tab stops (2.4.3). Always pass asChild when the child is already an interactive element. (Watch the trigger wrapper's own asChild={cond} default — DeleteConfirmationModal needs an explicit asChild.)startEditingCell opens an inline editor), Radix steals it back. Re-assert focus on your target across a few requestAnimationFrames to outlast the one-time restore. For rename-style flows, .select() the input too.DropdownMenu/Popover content portals to <body>, tripping aria_content_in_landmark. Portaling into <main> is not an option when <main> is overflow-hidden (clips the menu). Treat as app-wide debt → baseline it (below); the menu's real a11y (role, named trigger, keyboard open/close, focus restore) is covered by a keyboard test instead.aria-disabled (instead of native disabled) when the control must stay discoverable, and keep it non-operable.<button> with an aria-label.onClick.Apply these when building or reviewing AG Grid tables that open an edit modal (reference: GlobalVariablesPage, tests/a11y/global-variables.a11y.spec.ts):
onCellKeyDown and per-column suppressKeyboardEvent for Enter/Space so AG Grid’s default Space handling does not compete. Prefer not changing shared TableComponent defaults unless the same map is product-wide.node.setSelected, update React selection state so toolbar actions (e.g. delete) enable/disable correctly (TableOptions.hasSelection is read at render time).rowIndex + colId) when opening edit; on close (Escape, Cancel, or save) restore with api.setFocusedCell + DOM .focus(), using a few requestAnimationFrames to outlast Radix dialog cleanup. Controlled edit dialogs without a Radix trigger need this explicitly. Create flows that use a real DialogTrigger (e.g. Add New) should restore to that trigger.Use Jest when the changed surface is a primitive or component that renders in jsdom without full app routing.
import { render, screen } from "@testing-library/react";
import { axe } from "@/utils/a11y-test";
it("should_have_no_axe_violations", async () => {
const { container } = render(<Component />);
expect(await axe(container)).toHaveNoViolations();
});Notes: a11y-test.ts disables color-contrast (jsdom can't measure layout). Prefer role/label/text queries. Assert accessible names explicitly for icon-only / visually-hidden / generated labels. Put tests at __tests__/<name>.a11y.test.tsx.
cd src/frontend
npx jest path/to/<name>.a11y.test.tsx --runInBandpage.runA11yScanUse Playwright when the surface needs real browser layout, routing, app state, mocking, modals, tables, focus order, keyboard behavior, or full-page interactions.
import { expect, test } from "../fixtures";
import { awaitBootstrapTest } from "../utils/await-bootstrap-test";
test("scans populated state", { tag: ["@release", "@api"] }, async ({ page }) => {
await awaitBootstrapTest(page, { skipModal: true });
await page.goto("/settings/example");
await expect(page.getByText("Example")).toBeVisible();
await page.runA11yScan("settings-example-populated");
});Rules: put specs under tests/a11y/<feature>.a11y.spec.ts; import test/expect from ../fixtures; tag every test @release plus a domain tag (@workspace/@api/@database/@components/@starter-projects); stable scan names (lowercase, feature-first, state-specific); mock API for deterministic states; disable animations for focus assertions; use explicit interactions (no random clicking of destructive controls). If the route belongs in static coverage, update scripts/a11y/a11y_routes.json.
cd src/frontend
RUN_A11Y=true npx playwright test tests/a11y/<feature>.a11y.spec.ts --project=chromium --workers=5
RUN_A11Y=true RUN_A11Y_ASSERT=true npx playwright test tests/a11y/<feature>.a11y.spec.ts --project=chromium --workers=5
npm run a11y:html-report --silentSome IBM violations are real but framework-level and can't be fixed per-page (e.g. aria_content_in_landmark on a Radix menu portal). Track them with an IBM baseline so the scan stays green while the debt is recorded — do NOT silently drop the scan or the assertion.
How it works (fixtures.ts + .achecker.yml):
baselineFolder: tests/a11y/baselines. The baseline file name is the scan label: {project}__{label}.json, e.g. chromium__assets-files-actions-menu.json (dashes preserved; the first scan in a test has no index suffix).filterReport loads that file and marks any result matching a baseline entry by path.dom + ruleId + reasonId as ignored: true. countNewA11yViolations counts violation && !ignored, so baselined issues don't fail.Create one:
coverage/accessibility-reports/{label}.json.tests/a11y/baselines/{label}.json as { "results": [ { "ruleId", "reasonId", "path": { "dom": … } } ] }. A minimal baseline (only the entries to ignore) is clearest; add a description field noting why and how to resurface it.Matching is exact-DOM-path, so baselines can go stale if unrelated <body>-level portals (toasts) shift the portal index — scan the state with no other overlays open.
For route/page changes, cover the smallest matrix representing real user states:
Don't force states the page can't enter; briefly explain any skipped state.
Use tests/a11y/api-keys.a11y.spec.ts and tests/a11y/files.a11y.spec.ts as the models for route-level work: mock API data; scan populated table; scan empty table; open create modal and scan; submit to the generated-result modal and scan; open a text-cell modal and scan; select a row and scan the selected state; set a mobile viewport and scan. Add keyboard-interaction tests (not scans) for tab-out, reverse re-entry, Enter-to-open, focus restore, and focus-visible where the surface has custom keyboard behavior. This is the expected bar for data-rich routes.
Driving grid row states: client-rendered states (upload progress %, upload-failed/error, disabled rows) are usually driven by fields the cell renderer reads off the row (params.data.*). If the list query returns the response untransformed, just inject the field into the mocked rows (e.g. { ...file, progress: -1 }) to scan the error/progress state — no need to simulate the real flow.
When done, state:
© langflow-ai, MIT. 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 .agents/skills/ibm-a11y-testing-guide of langflow-ai/langflow.
Open the folder on GitHubat commit 504c02f
Ibm A11y Testing Guide 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 |
|---|---|---|---|---|---|---|
| Ibm A11y Testing Guide this skilllangflow-ai/langflow | 155k | — | ~4.6k | Automated safety check: Pass | MIT | |
| Control UIcursor/plugins | 10k | 2 repos | ~1.2k | Automated safety check: Pass | None | |
| Scout UI Testingelastic/kibana | 21k | — | ~3.1k | Automated safety check: Pass | Custom licence | |
| Accessibility Testingpetrkindlmann/qa-skills | 168 | — | ~4.5k | Automated safety check: Pass | MIT | |
| A11y Playwright Testingfugazi/test-automation-skills-agents | 247 | — | ~3.2k | Automated safety check: Pass | MIT | |
| Browser QAaffaan-m/ECC | 276k | 2 repos | ~1k | Automated safety check: Pass | MIT |
cursor/plugins
Build or adapt a local browser/CDP harness to drive and inspect a web, IDE, or Electron UI.
elastic/kibana
A skill your agent uses when creating, updating, debugging, or reviewing Scout UI tests in Kibana (Playwright + Scout fixtures), including page objects, browser authentication, parallel UI tests…
petrkindlmann/qa-skills
Test for WCAG 2.2 AA compliance with axe-core + Playwright, keyboard navigation audits, screen reader testing, ARIA pattern validation, and legal compliance mapping (ADA, EAA, Section 508).
fugazi/test-automation-skills-agents
Accessibility testing for web applications using Playwright (@playwright/test), TypeScript, and axe-core.
affaan-m/ECC
Run automated post-deploy UI verification with a browser automation MCP (claude-in-chrome, Playwright, or Puppeteer): console-error and Core Web Vitals smoke checks, form and auth-flow interaction…
jxnl/personal-monorepo-template
Audit AI-generated, AI-shaped, or AI-looking frontend code, UI screenshots, and design diffs.
langflow-ai/langflow
Review backend code for quality, security, maintainability, and best practices based on established checklist rules.
langflow-ai/langflow
Refactor high-complexity React components in Langflow frontend.
langflow-ai/langflow
Write and review Playwright E2E tests for Langflow. An agent skill from langflow-ai/langflow.
langflow-ai/langflow
Guide for implementing Langflow frontend query and mutation patterns with Axios and TanStack React Query v5.
langflow-ai/langflow
Perform a scoped IBM Equal Access Level 1 compliance audit of a chosen Langflow frontend surface (routes, components, or a PR) and produce a findings report mapped to WCAG/IBM Level 1 criteria.
langflow-ai/langflow
Add, change, or review user-facing text in the Langflow frontend using the i18n system (i18next / react-i18next).
Works with
Categories
Reference guide for writing and running Langflow frontend accessibility tests with axe (Jest) and IBM Equal Access (Playwright page.runA11yScan). Ibm A11y Testing Guide is an agent skill from langflow-ai/langflow.runA11yScan).
Ibm A11y Testing Guide fits situations like: reviewing a11y tests; debugging a specific axe/IBM violation; deciding which test layer fits a UI surface.
Run `npx skills add langflow-ai/langflow --skill ibm-a11y-testing-guide -a claude-code`. Or copy the skill folder (.agents/skills/ibm-a11y-testing-guide in langflow-ai/langflow) into .claude/skills/ibm-a11y-testing-guide in your project. Claude Code loads it when a task matches its description.
Run `npx skills add langflow-ai/langflow --skill ibm-a11y-testing-guide -a codex`. Or copy the skill folder (.agents/skills/ibm-a11y-testing-guide in langflow-ai/langflow) into .agents/skills/ibm-a11y-testing-guide 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 langflow-ai/langflow --skill ibm-a11y-testing-guide -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ibm-a11y-testing-guide, .gemini/skills/ibm-a11y-testing-guide, .github/skills/ibm-a11y-testing-guide and .opencode/skills/ibm-a11y-testing-guide in your project.
Going by SKILL.md and its folder, Ibm A11y Testing Guide needs the command-line tools its instructions call (npx, uv and npm). Our summary lists: Python 3; Node.js.
SKILL.md contains no URLs. Its commands use npx, uv 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.
Ibm A11y Testing Guide is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 18k 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 Ibm A11y Testing Guide: Control UI (cursor/plugins, 10k stars), Scout UI Testing (elastic/kibana, 21k stars), Accessibility Testing (petrkindlmann/qa-skills, 168 stars) and A11y Playwright 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.
langflow-ai (a GitHub organization) maintains it in langflow-ai/langflow, which has 155,411 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 9, 2026.
Source: langflow-ai/langflow on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.