跳到正文
Hacker News· marrykassa·· 9 天前AI 评分38

Isoso CLI:为 React 与 TypeScript 开发者提供 WCAG/A11y 无障碍合规检查

Isoso CLI: Get WCAG/A11y Compliant

AI 导读

Isoso CLI 是一款面向 React 与 TypeScript 开发者的源码级无障碍检测工具,通过解析 .tsx/.jsx 文件识别缺失 alt 文本、键盘陷阱、未标注控件等 WCAG 问题。

正文 · AI 翻译

Isoso

面向发布 React & TypeScript 的开发者进行无障碍测试

终端中的静态 WCAG 导向规则 · 自动修复 codemod · 可选 AI 审查 · 适配 CI 的 JSON 报告

Node License: MIT npm

在进入生产环境之前,捕获 alt 文本缺失、键盘陷阱和未标记的控件。


目录


Isoso 的功能

Isoso 读取你的 .tsx / .jsx 源代码(而非实时 DOM),并标记出通常会违反 WCAG 预期的模式——缺少 alt 文本、没有角色的可点击 <div>、未标记的输入框等等。

flowchart LR
  subgraph input [Your repo]
    JSX[.tsx / .jsx files]
  end
  subgraph isoso [Isoso CLI]
    Parse[Babel JSX extract]
    Static[57 static rules]
    AI[Optional AI pass]
    Report[Text or JSON report]
  end
  subgraph output [Outcomes]
    Term[Terminal]
    CI[Exit code for CI]
    Artifact[JSON artifact]
  end
  JSX --> Parse
  Parse --> Static
  Parse --> AI
  Static --> Report
  AI --> Report
  Report --> Term
  Report --> CI
  Report --> Artifact

加载中

模式 使用场景
静态规则 快速、免费、确定性——非常适合 CI 和 pre-commit
isoso fix 对 57 条可修复的静态规则应用 codemod(默认写入磁盘;使用 --dry-run 预览)
AI 扫描 设置 AI 密钥后对每个文件进行更深入的检查;发现结果使用与静态模式相同的规则 ID 和严重级别
解释 将发现结果转化为影响 + 修复说明(AI 或内置文案)

注意:Isoso 是源代码级分析。它补充——而非替代——浏览器工具(axe、Lighthouse)、屏幕阅读器测试和手动 QA。

Isoso Cloud(仪表盘、组织分析、GitHub 连接的扫描、策略)是独立产品。本仓库是开源 CLI 和规则引擎(第一阶段)。


安装

npm 包:@isoso.dev/isoso(带作用域)。npm 上没有不带作用域的 isoso 包——该名称已被保留/屏蔽。CLI 命令仍然是 isoso。

要求:Node.js 18+

运行一次(不修改 package.json)

将带作用域的名称与 npx 一起使用:

npx @isoso.dev/isoso scan
npx @isoso.dev/isoso rules
npx @isoso.dev/isoso explain --rule img-missing-alt --file src/App.tsx --line 12

在关注可复现性时固定版本:

npx @isoso.dev/isoso@0.3.3 scan

添加到你要扫描的仓库(典型做法)

将其安装为你要扫描的应用中的开发依赖,而非无关项目:

npm install -D @isoso.dev/isoso

然后从该项目运行 isoso 二进制文件(本地安装或 npm 脚本):

npx isoso scan
isoso rules

npx isoso … 在安装后使用 node_modules/.bin/isoso。npm @isoso.dev/isoso 无效——npm 期望的是像 install 这样的子命令,而不是包名。

全局安装(可选)

npm install -g @isoso.dev/isoso@latest
isoso scan
isoso --version

全局 isoso 在发布新版本时不会自动更新。在 npm 上升级后,再次运行 npm install -g @isoso.dev/isoso@latest(或继续使用 npx @isoso.dev/isoso@latest …)。

你输入 何时有效
npx @isoso.dev/isoso scan 始终有效(下载/运行已发布的 CLI)
npx isoso scan 在此目录中执行 npm install -D @isoso.dev/isoso 之后
isoso scan 本地安装(npm 脚本 / node_modules/.bin)或全局安装之后
npm @isoso.dev/isoso … 从不——请使用 npm install 或 npx

快速开始

# Scan the current directory (AI if ISOSO_AI_KEY is in .env, else static rules)
npx @isoso.dev/isoso scan

# Or, after npm install -D @isoso.dev/isoso in this repo:
npx isoso scan

# Scan a sample app in this monorepo (after clone + build)
npx isoso scan examples/sample-app

# Static only—no API calls
npx @isoso.dev/isoso scan --static

# JSON for pipelines + fail the job on serious+ findings
npx @isoso.dev/isoso scan --format json -o isoso-report.json --fail-on serious

# See every rule id and WCAG mapping (57 rules; fixable rules tagged in output)
npx @isoso.dev/isoso rules

# Auto-fix static findings (preview first, then apply)
npx @isoso.dev/isoso fix --dry-run
npx @isoso.dev/isoso fix

# Explain one rule (AI when a key is set)
npx @isoso.dev/isoso explain --rule img-missing-alt --file src/App.tsx --line 12

建议的 package.json 脚本:

{
  "scripts": {
    "a11y": "isoso scan --static --fail-on serious",
    "a11y:report": "isoso scan --format json -o isoso-report.json",
    "a11y:fix": "isoso fix --dry-run"
  }
}

命令

isoso scan

扫描项目树中 JSX/TSX 的无障碍问题。

isoso scan [path] [options]
选项 默认值 描述
[path] . 要扫描的项目根目录
-f, --format <type> text text 或 json
-o, --output <file> — 将报告写入文件(与 -o 结合使用时,JSON 模式下 stdout 保持干净)
--fail-on <severity> serious 如果任何发现结果达到或高于此严重级别(critical、serious、moderate、minor),则退出码为 1
--rules <ids> all 逗号分隔的规则 ID(例如 img-missing-alt,button-missing-name)
--static — 仅强制使用内置规则
--ai — 要求 AI 扫描(如果缺少 ISOSO_AI_KEY 则报错)

扫描范围

  • Glob:**/*.{tsx,jsx}
  • 忽略: node_modules、dist、build、.next、coverage

示例文本输出(节选)

Isoso accessibility scan
Engine: static rules
Root: /app
Files scanned: 42
Findings: 3

  critical: 1
  serious: 2

[critical] img-missing-alt — src/Hero.tsx:18:7
  <img> is missing an alt attribute.
  Fix: Add alt="..." describing the image, or alt="" if decorative.

Completed in 124ms

isoso fix

对静态规则引擎发现的问题应用自动 codemod。每个可修复的规则 id 在 isoso rules 中标记为 [fixable]。修复运行在与 scan 相同的 .tsx / .jsx 文件上(AI 发现的问题不会自动修复)。

isoso fix [path] [options]
选项 默认值 描述
[path] . 项目根目录
--dry-run — 列出编辑内容但不写入文件(默认会写入)
--rules <ids> 所有可修复项 以逗号分隔的可修复规则 id

典型工作流

isoso scan --static
isoso fix --dry-run    # review proposed edits
isoso fix              # apply to disk

合并前在 git 中审查差异——codemod 能处理常见模式,但无法替代对每个组件的判断。


isoso rules

打印所有静态规则,包含 id、人类可读名称、严重级别以及 WCAG 成功标准引用。

isoso rules

将这些 id 与 --rules 或 isoso explain --rule <id> 一起使用。


isoso explain

将发现的问题展开为 摘要、影响和修复建议。

isoso explain --rule <id> [options]
选项 描述
--rule <id> 必填。来自 isoso rules 的规则 id
--file <path> 用于提供上下文的文件路径
--line <n> 行号(默认 1)
--message <text> 覆盖发现的消息
--snippet <text> 来自你扫描的代码片段
--builtin 仅提供精选的 WCAG 指南——不调用 API

环境:ISOSO_AI_KEY 位于 .env(见下文)。可选 ISOSO_AI_MODEL、ISOSO_AI_BASE_URL 或 ISOSO_AI_CHAT_URL 用于你的提供商。


@isoso/core 自带 57 项静态检查(图片、表单、键盘、地标、媒体、表格、焦点、文档结构、自动完成、字幕和视口)。严重级别驱动 --fail-on 和 CI 门禁。

列出每个规则 id、WCAG 引用和严重级别:

npx @isoso.dev/isoso rules

类别包括:文本替代(img-missing-alt、svg-missing-accessible-name、role-img-missing-label……)、键盘与焦点(click-without-keyboard-handler、tabindex-zero-without-role、outline-none-utility……)、表单(input-missing-label、label-without-htmlfor、fieldset-needs-legend……)、链接与按钮、地标(nav-missing-label、multiple-main-landmarks……)、媒体和文档(html-missing-lang、multiple-h1)。

运行子集:

npx @isoso.dev/isoso scan --static --rules img-missing-alt,button-missing-name

静态扫描与 AI 扫描

静态(--static) AI(存在密钥时默认)
速度 非常快 较慢(逐文件 API 调用)
成本 免费 提供商用量(API 计费)
确定性 相同输入 → 相同输出 可能因模型而异
发现形式 ruleId、严重级别、WCAG、行号、消息、修复 与静态规则相同的 schema

自动行为

  1. 如果设置了 ISOSO_AI_KEY → AI 扫描(除非 --static)。
  2. 如果没有密钥 → 静态规则(CLI 会打印黄色提示)。
  3. --ai → 如果没有密钥则快速失败。

设置

  1. 在此仓库或运行 isoso 的应用中,将 .env.example 复制为 .env。
  2. 设置 ISOSO_AI_KEY=...(你的提供商的 API 密钥)
  3. 运行 npx @isoso.dev/isoso scan(省略 --static),或在本地安装后运行 isoso scan。

CLI 会从当前工作目录向上查找 .env。

cp .env.example .env
# edit .env, then:
npx @isoso.dev/isoso explain --rule img-missing-alt --file src/App.tsx --line 24

当你希望零网络调用时,在 explain 上使用 --builtin。

自定义 AI 提供商(chat completions JSON API):

变量 用途
ISOSO_AI_KEY 作为 Authorization: Bearer … 发送的 API 密钥
ISOSO_AI_MODEL 模型 id(默认 gpt-4o-mini)
ISOSO_AI_CHAT_URL 完整的 chat completions URL
ISOSO_AI_BASE_URL 基础 URL;Isoso 调用 {BASE}/chat/completions

CI 集成

在任何 CI 流水线(GitHub Actions、GitLab CI 等)中运行 isoso scan。当发现的问题达到或超过 --fail-on 时,退出码为 1。

# Example GitHub Actions step
- run: npx @isoso.dev/isoso scan --static --format json --fail-on serious -o isoso-report.json

严重级别门禁:--fail-on serious 会在严重和高危发现上失败。使用 --fail-on critical 获得更宽松的门禁,或使用 --fail-on moderate 获得更严格的门禁。

提示

  • 在 CI 中优先使用 --static,以获得速度和可预测的成本。
  • 仅当你有意在流水线中运行 AI 时,才将 ISOSO_AI_KEY 存储在 CI 密钥中。
  • GitHub 组织集成(连接仓库、PR 扫描、仪表盘历史记录)仅属于 Isoso Cloud——不属于此 CLI。

安全与合规

在发布门禁、发布合规声明或将扫描输出视为无障碍性证明之前,请先阅读本文。

不提供 WCAG 或法律合规保证

Isoso 不认证、审计或保证你的应用程序符合 WCAG 2.x(任何级别)、ADA、Section 508、EN 301 549、EAA 或任何其他无障碍标准或法律。

Isoso 做什么 它不做什么
标记常见的 JSX/TSX 模式,映射到面向 WCAG 的启发式规则 证明符合性或“通过”官方审计
帮助团队在源码早期发现问题 替代屏幕阅读器测试、键盘 QA 或用户研究
生成对 CI 友好的报告和可选的自动修复 构成法律签署、VPAT 或第三方认证

isoso rules 中的规则 id 和 WCAG 引用描述的是某个模式为何有风险,而非判定你的产品合规或违法。你仍需对产品的无障碍性和法律义务负责。

仅限源码级分析

CLI 分析的是 .tsx / .jsx 源文件——而非实时 DOM、运行时 CSS、来自 CMS/API 的内容、PDF、原生应用或第三方嵌入内容。发现结果可能是误报(安全模式被标记)或漏报(仅在运行时或生产构建中才可见的问题)。

当合规性至关重要时,请将 Isoso 与浏览器工具(例如 axe DevTools、Lighthouse)、手动测试、辅助技术检查以及专业审计结合使用。

自动修复(isoso fix)风险

Codemod 会应用机械式编辑。它们可能改变行为、破坏测试或忽略上下文(装饰性图片与信息性图片、自定义组件、设计系统包装器)。合并前务必审查 git diff;未经审查,不要在生产线分支上无人值守地运行 fix。

AI 扫描与解释

当设置 ISOSO_AI_KEY 时,文件片段和规则上下文可能会发送到你配置的 AI 提供商。你需要对提供商条款、数据处理负责,并绝不将 API 密钥提交到 git。

  • 当你希望零外部数据传输时,在 CI 中优先使用 --static。
  • 在 explain 上使用 --builtin,仅用于离线、精选副本。
  • AI 输出可能因模型而异,且并非确定性的法律或合规建议。

密钥与环境

做法 原因
将 ISOSO_AI_KEY 保存在 .env 或 CI 密钥中 仓库历史中的密钥会永久暴露
将 .env 添加到 .gitignore 本地密钥不得随应用一起发布
将 CI 密钥限定在需要 AI 的任务中 减少工作流日志泄露时的影响范围

CLI 通过从当前工作目录向上查找来加载 .env——除你的 shell 和提供商所做的之外,它不会加密或存储密钥。

严重性门禁是策略,不是法律

--fail-on 控制你的流水线的退出码(例如在 serious 及以上时失败)。那是你的质量标准,而非对 WCAG 符合性级别或法律安全港的映射。

Isoso Cloud

isoso.dev 上的仪表板扫描、策略和 GitHub 连接的运行受单独的条款和隐私政策约束。云端存储发现结果并不意味着你的应用程序合规。

报告安全问题

如果您认为在 Isoso CLI 中发现了安全漏洞(而非您应用中的无障碍问题),请通过 info@isoso.dev 负责任地报告(主题:security)。在协调之前,请勿公开带有漏洞利用细节的 issue。


Monorepo 布局

包 npm 名称 角色
packages/isoso-cli @isoso.dev/isoso CLI 入口点(scan、fix、rules、explain);二进制名称 isoso
packages/isoso-core @isoso/core 规则引擎、报告、AI 扫描 + 解释
packages/isoso-scanner @isoso/scanner Glob + Babel JSX 提取,编排核心

已发布的 @isoso.dev/isoso 捆绑包内置了 @isoso/core 和 @isoso/scanner,实现单次安装。


开发 Isoso

从 monorepo 根目录:

npm install
npm run build
npm test                    # @isoso/core unit tests
npx isoso scan examples/sample-app
脚本 操作
npm run build 构建 core → scanner → 复制 vendor → 构建 CLI
npm run dev 通过 Node 构建并运行 CLI

示例违规:examples/sample-app/BadExample.tsx 故意违反若干规则——用它来在本地验证扫描。


Isoso Cloud

需要组织级仪表盘、GitHub 连接的仓库扫描、团队、策略和计费?这些功能位于 Isoso Web / Cloud,而非此 CLI 仓库。CLI 仍然是开源本地和 CI 方案;在适用静态启发式规则的地方,云端扫描与 CLI 对齐相同的规则 ID。


许可证

MIT — 参见 LICENSE。


更早交付无障碍 UI。在您的应用上运行 npx @isoso.dev/isoso scan,然后运行 npx @isoso.dev/isoso fix 进行安全的自动编辑。

来源:Hacker News · github.com