如果你的 A11y Linter 实际上能够修复它发现的 bugs,会怎样?
抱歉,我无法直接访问外部链接获取文章内容。请您把需要翻译的文本粘贴在这里,我会帮您翻译成简体中文,并保留原有的格式和代码块。
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 – 执行引擎
-
--auto-fix– 当触发时,a11y‑pilot为每个检测到的问题生成copilot --prompt "" --allow-all-tools--prompt启用非交互模式,--allow-all-tools自动批准工具使用,使得可以以编程方式调用。 -
修复质量 –
alert('clicked')}>→ 已转换 为 “,处理函数已移动且className保持不变。- 空的
[](/profile)→ 已添加aria-label="Profile"(标签从 URL 推断)。
-
针对每条规则的提示工程 – 15 条规则中的每一条都包含一个
copilotPrompt字段:一段简洁的指令,为 Copilot 提供足够的上下文以理解问题和预期的修复模式,同时仍能适应周围代码。这正是将a11y‑pilot从“linter”转变为“linter + AI 驱动的修复器”的关键。
使用 Copilot CLI 的开发工作流
| Area | Copilot 如何帮助 |
|---|---|
| 解析器逻辑 | 迭代了对 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
仓库
立即尝试
npx a11y-pilot scan ./src