如果你的 A11y Linter 实际上能够修复它发现的 bugs,会怎样?

发布: (2026年2月15日 GMT+8 23:54)
7 分钟阅读
原文: Dev.to

抱歉,我无法直接访问外部链接获取文章内容。请您把需要翻译的文本粘贴在这里,我会帮您翻译成简体中文,并保留原有的格式和代码块。

GitHub Copilot CLI 挑战提交

如果你的 linter 实际上能够修复它发现的问题呢?

a11y‑pilot 是一个 CLI,用于扫描前端代码中的可访问性违规,然后启动 GitHub Copilot CLI 来修复每一个问题。
它不仅仅是建议更改——它会使用精心编写的修复指令调用 copilot --prompt,让 AI 在原地重构你的代码 in place

快速链接

  • npm:
  • GitHub:

工作原理

Scan → Detect → Prompt Engineer → Copilot CLI Fixes → Done
步骤发生了什么
Scan将工具指向任意目录或文件。它会遍历项目,并使用 Babel AST(解析 JSX/TSX)和 htmlparser2(解析类似 HTML 的模板)来解析 JSX、TSX、HTML、Vue、Svelte 和 Astro 文件。
Detect对每个解析后的元素运行 15 条可访问性规则,检查 5 类 WCAG 违规情况。
Auto‑fix对于每个问题,a11y‑pilot 会构建一个精准、上下文丰富的提示,并运行 copilot --prompt --allow-all-tools。Copilot 读取文件,理解周围代码,并应用 所需的最小差异——而不是盲目的查找替换。

Under‑the‑hood diagram

┌─────────────────┐     ┌──────────────────┐     ┌─────────────────┐
│ a11y‑pilot 扫描器 │────▶│ 检测到问题(规则引擎) │────▶│ 构建提示(上下文丰富) │
└─────────────────┘     └──────────────────┘     └────────┬────────┘


┌─────────────────┐     ┌──────────────────┐     ┌─────────────────┐
│ 文件已修复!✔ 报告 │◀────│ Copilot 应用修复 │◀────│ copilot CLI 已调用 │
└─────────────────┘     └──────────────────┘     └─────────────────┘

示例提示(no-div-button 规则)

在文件 src/Hero.tsx 第 20 行,修复此可访问性问题:
有点击处理程序但缺少 `role` 和 `tabIndex`。 **修复方案:** 将 元素替换为原生 “ 元素,将 onClick 处理程序移至按钮,并移除任何 cursor: pointer 样式(按钮默认拥有该样式)。
仅修改必要的最少代码。

Copilot CLI 会读取完整文件上下文,理解周围的 JSX 结构,并进行 智能重构——而不是简单的字符串替换。

终端仪表盘(扫描后)

✖ Found 46 issues (35 errors, 11 warnings) in 4 files (5 scanned)

📊 Issue Breakdown
──────────────────────────────────────────────────
 ♿ Accessibility       ████████░░░░░░░░░░░░   19 (41%)  19E
 🏗️ Semantic HTML      █████░░░░░░░░░░░░░░░   11 (24%)   4E 7W
 ⌨️ Keyboard            ███░░░░░░░░░░░░░░░░░    7 (15%)   5E 2W
 🏷️ ARIA               ██░░░░░░░░░░░░░░░░░░    5 (11%)   5E
 👆 Interaction         ██░░░░░░░░░░░░░░░░░░    4 (9%)    2E 2W
──────────────────────────────────────────────────
14 rules triggered: img‑alt, form‑label, no‑div‑button, …

仪表盘提供了一个即时快照,展示了您的可访问性债务所在的位置——ARIA 使用不当、键盘陷阱、缺失的语义等——帮助您明确需要重点关注的地方。

Copilot CLI – 执行引擎

  1. --auto-fix – 当触发时,a11y‑pilot 为每个检测到的问题生成

    copilot --prompt "" --allow-all-tools

    --prompt 启用非交互模式,--allow-all-tools 自动批准工具使用,使得可以以编程方式调用。

  2. 修复质量

    • alert('clicked')}>已转换 为 “,处理函数已移动且 className 保持不变。
    • 空的 [](/profile)已添加 aria-label="Profile"(标签从 URL 推断)。
  3. 针对每条规则的提示工程 – 15 条规则中的每一条都包含一个 copilotPrompt 字段:一段简洁的指令,为 Copilot 提供足够的上下文以理解问题和预期的修复模式,同时仍能适应周围代码。这正是将 a11y‑pilot 从“linter”转变为“linter + AI 驱动的修复器”的关键。

使用 Copilot CLI 的开发工作流

AreaCopilot 如何帮助
解析器逻辑迭代了对 JSX 元素的 Babel AST 遍历,处理展开属性、表达式容器和成员表达式。Copilot 阐明了 @babel/traverse ESM 默认导出怪癖(`_traverse.default
规则实现参考了 WCAG 标准,确保边缘情况的处理(例如,在 aria-hidden-focus 规则中不标记没有 href 的 “,在 form‑label 中跳过 input[type="hidden"])。
调试快速复现并修复解析错误,生成测试夹具,并为每个规则编写单元测试。
提示优化重新构造提示,直至 AI 为各种代码库生成最小且正确的差异。

实际结果

我将 a11y‑pilot 指向一个包含 12 个可访问性问题 的文件并运行 a11y‑pilot fix
所有问题都已解决变成了, 空的 “ 获得了从文件名推断出的有意义的 alt 文本,未标记的输入获得了正确的 aria-label
重新扫描文件:0 个问题。无需手动编辑。

亲自尝试

# 全局安装(或作为开发依赖)
npm i -g a11y-pilot

# 扫描项目
a11y-pilot scan ./src

# 自动修复所有问题
a11y-pilot fix ./src

享受由 GitHub Copilot CLI 提供动力的无障碍优先工作流!

copilot‑bridge 最初使用 shell: true 时,会触发 Node.js DEP0190 弃用警告。
Copilot CLI 帮我改为直接解析二进制文件,使用:

execFileSync('which', ['copilot'])

并使用正确的 spawn() 调用 不带 shell。

让我印象深刻

最突出的一点是 Copilot CLI 处理 文件级上下文 的能力。
当我把它指向一个包含 12 条可访问性问题的文件并说:

“修复第 20 行的 “”

它没有破坏其他 11 条有问题的行。它只做了 精准、最小化的编辑
正是这个特性让自动修复功能变得可行——我可以自信地逐个或批量 一次性 修复问题,而不必担心连锁破坏。

安装

npm install -g a11y-pilot

仓库

GitHub: safvan-tsy/a11y-pilot

立即尝试

npx a11y-pilot scan ./src
0 浏览
Back to Blog

相关文章

阅读更多 »