Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/report-accessibility-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ permissions:

jobs:
chromium-report:
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22
- name: Generate Codex and Claude skills
Expand All @@ -37,7 +37,7 @@ jobs:
node scripts/verify-package.mjs
- name: Upload browser verification evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: accessible-report-browser-evidence
path: audit-runs/report-accessibility/browser-e2e.json
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/report-nvda-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ jobs:
runs-on: windows-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22
- name: Generate Codex and Claude skills
Expand Down Expand Up @@ -59,7 +59,7 @@ jobs:
-OutputDirectory audit-runs/nvda-report/evidence
- name: Upload NVDA smoke evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: accessible-report-nvda-evidence
path: |
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/source-monitor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22
- name: Inspect official pages
Expand All @@ -32,7 +32,7 @@ jobs:
if test -f "$RUNNER_TEMP/source-monitor/review.md"; then cat "$RUNNER_TEMP/source-monitor/review.md" >> "$GITHUB_STEP_SUMMARY"; fi
if test -f "$RUNNER_TEMP/source-monitor/catalog-diff.json"; then echo 'Catalog diff is in the workflow artifact.' >> "$GITHUB_STEP_SUMMARY"; fi
if ! test -f "$RUNNER_TEMP/source-monitor/catalog-candidate.json"; then echo 'Catalog candidate could not be built; inspect catalog-refresh.log.' >> "$GITHUB_STEP_SUMMARY"; fi
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: always()
with:
name: official-source-review
Expand Down
11 changes: 6 additions & 5 deletions .github/workflows/verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,17 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
node: [20, 22]
os: [ubuntu-latest, windows-latest, macos-latest]
node: [22, 24]
runs-on: ${{ matrix.os }}
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: ${{ matrix.node }}
- name: Install worksheet test dependency
run: npm install --no-save --ignore-scripts --package-lock=false exceljs@4.4.0
run: npm install
- name: Verify package, catalogs, and tests
if: runner.os != 'Windows'
run: TEMP="$RUNNER_TEMP" TMP="$RUNNER_TEMP" TMPDIR="$RUNNER_TEMP" node scripts/verify-all.mjs
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/web-evidence-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ permissions:

jobs:
chromium-evidence:
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22
- name: Generate Codex and Claude skills
Expand Down
3 changes: 3 additions & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Test dependencies are installed without a lockfile and without install scripts.
package-lock=false
ignore-scripts=true
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ This project uses a Keep a Changelog-style structure. Until a tagged release is

### Changed

- Node.js 22 or later is now required (package `engines`, `doctor`, the Web capability contract and the documentation). Node.js 20 reached end of life on 2026-04-30 and is no longer supported or tested. CI runs Node.js 22 and 24 on Ubuntu, Windows and macOS; workflow actions move to versions that run on Node.js 24 and are pinned by commit, and the browser E2E workflows pin Ubuntu 24.04. Contributors install test dependencies with `npm install` through a root `package.json`, which also stops an unrelated parent-directory `package.json` from capturing the install.

- Removed internal plans, implementation reviews, status notes, and research source copies from the public source tree; retained official source links and attribution.

- Reviewed the Digital Agency accessibility policy against the monitored source on 2026-09-25. The 18 additional criterion mappings and routing are unchanged; the catalog source hash, review date and attribution binding now match the reviewed page.
Expand Down
8 changes: 4 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ The accepted PR records the submitted version and the maintainer's corrections;
Run the unified verifier before requesting review:

```sh
npm install --no-save --ignore-scripts --package-lock=false exceljs@4.4.0
node scripts/verify-all.mjs
npm install
npm run verify
```

Install test dependencies at the repository root so that local `node_modules` is not part of a skill distribution. XLSX tests use the same pinned ExcelJS version as the CLI package; its dependencies retain their own licenses and are not vendored in release archives.
`npm install` reads the root `package.json` (test dependencies only; the installable CLI package is `shared/skill/package.json`) and `.npmrc` (no lockfile, no install scripts). The root manifest pins the project root, so a stray `package.json` or `node_modules` in a parent directory cannot capture the install. Install at the repository root so that local `node_modules` is not part of a skill distribution. XLSX tests use the same pinned ExcelJS version as the CLI package; its dependencies retain their own licenses and are not vendored in release archives. Node.js 22 or later is required; CI runs Node.js 22 and 24.

For focused work, the underlying checks are:

Expand All @@ -45,7 +45,7 @@ node --test tests/*.test.mjs

`docs/cli-reference.md` is generated from the CLI command registry. After adding or changing a command, its options, or its localized help, run `node scripts/build-cli-reference.mjs --write`; `tests/cli-reference.test.mjs` fails when the committed page is out of date.

Platform-specific behavior must remain covered by the Ubuntu/Windows CI matrix.
Platform-specific behavior must remain covered by the Ubuntu/Windows/macOS CI matrix.

## Source and distribution parity

Expand Down
4 changes: 2 additions & 2 deletions README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# Information Accessibility Audit Skill and Agent

Installation requires Node.js 20 or later and a pinned source revision. See the [Windows, macOS and Linux install, upgrade, restore and removal guide](docs/installing.md) first.
Installation requires Node.js 22 or later and a pinned source revision. See the [Windows, macOS and Linux install, upgrade, restore and removal guide](docs/installing.md) first.

## In 30 seconds

Expand Down Expand Up @@ -62,7 +62,7 @@ See the [profile selection and migration guide](docs/profile-selection-and-migra

## Requirements and installation

- Node.js 20 or later
- Node.js 22 or later
- A local copy of this repository
- The pinned Playwright and axe-core versions, plus host-approved Chromium or installed system Chrome, only when using the browser scan

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# 情報アクセシビリティ監査スキル/エージェント

導入にはNode.js 20以上と版を固定したソースが必要です。[3 OS共通の導入・更新・復元・削除手順](docs/installing.md)を先に確認してください。
導入にはNode.js 22以上と版を固定したソースが必要です。[3 OS共通の導入・更新・復元・削除手順](docs/installing.md)を先に確認してください。

## 30秒で分かる概要

Expand Down Expand Up @@ -62,7 +62,7 @@ AIと自動検査が作るものは、原則として問題候補やE0/E1のsc

## 前提条件と導入

- Node.js 20以上
- Node.js 22以上
- リポジトリのローカルコピー
- browser scanを使う場合のみ、指定版のPlaywright、axe-core、ホストで利用を認められたChromiumまたはシステムChrome

Expand Down
4 changes: 2 additions & 2 deletions docs/installing.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Installation, upgrade and removal / 導入・更新・削除

Use a pinned source revision for every install. The [v0.1.0 prerelease](https://github.com/Nagi-Inaba/information-accessibility-skill/releases/tag/v0.1.0) is published, but the package version alone does not identify earlier development revisions. Verify its `SHA256SUMS` and `source-manifest.json`; record the full source commit with the audit. Node.js 20 or later is required. Browser scans additionally need a permitted browser adapter; ledger and report commands do not.
Use a pinned source revision for every install. The [v0.1.0 prerelease](https://github.com/Nagi-Inaba/information-accessibility-skill/releases/tag/v0.1.0) is published, but the package version alone does not identify earlier development revisions. Verify its `SHA256SUMS` and `source-manifest.json`; record the full source commit with the audit. Node.js 22 or later is required. Browser scans additionally need a permitted browser adapter; ledger and report commands do not.

導入ごとにソース版を固定します。[プレリリース v0.1.0](https://github.com/Nagi-Inaba/information-accessibility-skill/releases/tag/v0.1.0)は公開済みですが、版番号だけでは過去の開発版を特定できません。添付の`SHA256SUMS`と`source-manifest.json`を確認し、完全なsource commitを監査記録とともに保管します。Node.js 20以上が必要です。ブラウザー検査には別途利用を認められたadapterが必要ですが、台帳・レポートのコマンドには不要です。
導入ごとにソース版を固定します。[プレリリース v0.1.0](https://github.com/Nagi-Inaba/information-accessibility-skill/releases/tag/v0.1.0)は公開済みですが、版番号だけでは過去の開発版を特定できません。添付の`SHA256SUMS`と`source-manifest.json`を確認し、完全なsource commitを監査記録とともに保管します。Node.js 22以上が必要です。ブラウザー検査には別途利用を認められたadapterが必要ですが、台帳・レポートのコマンドには不要です。

| Host | Windows | macOS / Linux | Installed components |
| --- | --- | --- | --- |
Expand Down
2 changes: 1 addition & 1 deletion docs/version-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

現行の監査専用導入と任意のauthorized fixerは、ともにorchestration registry `17.0.0`を使用します。installerは同梱されたfeature manifestとregistry版の一致を確認し、異なる組合せを拒否します。監査専用導入には`fix-authorization`・`fix-handoff`・`change-record`のpayload schemaと修正実行CLIを含めません。通常の監査runはこの構成で作成・検証できます。これらのartifactを含む既存runの読取りには、対応する修正機能と元のpackage/commitを保持してください。修正機能の追加・除外によって既存の監査runや元の証拠を書き換えません。

セキュリティ修正の対象は現在のmainと、公開済みreleaseがある場合はその最新版です。古い開発commitの個別保守や、旧形式で新しい監査を継続できることは保証しません。実行要件はNode.js 20以上です。Web検査の依存関係は同梱package.jsonを正本とし、現在はaxe-core 4.13.0、任意のPlaywright 1.62.1です。
セキュリティ修正の対象は現在のmainと、公開済みreleaseがある場合はその最新版です。古い開発commitの個別保守や、旧形式で新しい監査を継続できることは保証しません。実行要件はNode.js 22以上です。Node.js 20は上流のサポートが2026年4月30日に終了したため対象外で、CIはNode.js 22と24をUbuntu・Windows・macOSで確認します。Web検査の依存関係は同梱package.jsonを正本とし、現在はaxe-core 4.13.0、任意のPlaywright 1.62.1です。

## 現行の主要形式

Expand Down
16 changes: 16 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "information-accessibility-skill-workspace",
"private": true,
"description": "Development workspace for verification. The installable CLI package is shared/skill/package.json.",
"scripts": {
"sync": "node scripts/sync-distributions.mjs --write",
"verify": "node scripts/verify-all.mjs"
},
"devDependencies": {
"exceljs": "4.4.0"
},
"engines": {
"node": ">=22"
},
"license": "MIT"
}
1 change: 1 addition & 0 deletions release-files.json
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,7 @@
"tests/retest-delta.test.mjs",
"tests/run-evidence.test.mjs",
"tests/run-targets.test.mjs",
"tests/runtime-baseline.test.mjs",
"tests/runtime-locale.test.mjs",
"tests/runtime-procedure-locale.test.mjs",
"tests/scan-web-cli.test.mjs",
Expand Down
2 changes: 1 addition & 1 deletion shared/skill/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
}
},
"engines": {
"node": ">=20"
"node": ">=22"
},
"license": "MIT"
}
2 changes: 1 addition & 1 deletion shared/skill/references/web-capabilities.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"schema_version": "1.0.0",
"adapter": "playwright-chromium",
"preflight_command": "accessibility-audit preflight-web --browser-channel chrome --format json",
"dependencies": { "node": ">=20", "playwright": "1.62.1", "axe-core_for_scan": "4.13.0" },
"dependencies": { "node": ">=22", "playwright": "1.62.1", "axe-core_for_scan": "4.13.0" },
"browser_channels": ["playwright-chromium", "chrome"],
"default_required": ["browser_dom", "accessibility_tree", "keyboard_input", "responsive_viewport", "network_fetch"],
"capabilities": [
Expand Down
7 changes: 4 additions & 3 deletions shared/skill/scripts/doctor.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { normalizeRuntimeLocale, runtimeLocaleFromEnvironment } from "./lib/runt
const scriptRoot = path.dirname(fileURLToPath(import.meta.url));
const skillRoot = path.dirname(scriptRoot);
const require = createRequire(import.meta.url);
const minimumNodeMajor = 22;

function readJson(file) {
return JSON.parse(fs.readFileSync(file, "utf8").replace(/^\uFEFF/u, ""));
Expand Down Expand Up @@ -69,8 +70,8 @@ export function diagnose(root = skillRoot) {
}

const nodeMajor = Number.parseInt(process.versions.node.split(".", 1)[0], 10);
const nodeSupported = Number.isInteger(nodeMajor) && nodeMajor >= 20;
if (!nodeSupported) errors.push(`Node.js 20 or newer is required; found ${process.versions.node}.`);
const nodeSupported = Number.isInteger(nodeMajor) && nodeMajor >= minimumNodeMajor;
if (!nodeSupported) errors.push(`Node.js ${minimumNodeMajor} or newer is required; found ${process.versions.node}.`);

let manifest = { name: "unknown", version: "unknown", bin: {} };
try {
Expand Down Expand Up @@ -100,7 +101,7 @@ export function diagnose(root = skillRoot) {
status,
node: {
version: process.versions.node,
required: ">=20",
required: `>=${minimumNodeMajor}`,
supported: nodeSupported,
platform: process.platform,
architecture: process.arch
Expand Down
51 changes: 51 additions & 0 deletions tests/runtime-baseline.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";
import { spawnSync } from "node:child_process";
import test from "node:test";
import { fileURLToPath } from "node:url";

const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const skillRoot = path.join(root, "codex/skills/information-accessibility-practice");
const readText = (...parts) => fs.readFileSync(path.join(root, ...parts), "utf8").replace(/\r\n/gu, "\n");
const readJson = (...parts) => JSON.parse(readText(...parts));

const skillPackage = readJson("shared/skill/package.json");
const minimumMajor = Number(/^>=(\d+)$/u.exec(skillPackage.engines.node)?.[1]);

test("the Node.js baseline is declared once per surface and agrees everywhere", () => {
// Node.js 20 reached end of life on 2026-04-30.
assert.ok(Number.isInteger(minimumMajor) && minimumMajor >= 22, `engines.node must be >=N with N of at least 22: ${skillPackage.engines.node}`);
const workspace = readJson("package.json");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include the root manifest in release archives

release-files.json now ships this test, but the rootFiles allow-list in scripts/build-release.mjs still excludes the newly required root package.json and .npmrc. In every generated source release, node scripts/verify-all.mjs therefore reaches this line and fails with ENOENT for package.json; the documented npm run verify cannot start either. Add the workspace files to the release allow-list and inventory, or keep the shipped verifier independent of files excluded from the archive.

Useful? React with 👍 / 👎.

assert.equal(workspace.private, true);
assert.equal(workspace.engines.node, skillPackage.engines.node);
assert.equal(workspace.devDependencies.exceljs, skillPackage.dependencies.exceljs);
assert.equal(readJson("shared/skill/references/web-capabilities.json").dependencies.node, skillPackage.engines.node);
const doctor = spawnSync(process.execPath, [path.join(skillRoot, "scripts/accessibility-audit.mjs"), "doctor", "--format", "json"], { cwd: root, encoding: "utf8" });
assert.equal(doctor.status, 0, doctor.stderr || doctor.stdout);
const reported = JSON.parse(doctor.stdout).node;
assert.equal(reported.required, skillPackage.engines.node);
assert.equal(reported.supported, Number.parseInt(process.versions.node, 10) >= minimumMajor);
});

test("documentation states the same minimum Node.js major", () => {
for (const file of ["README.md", "README.en.md", "docs/installing.md", "docs/version-support.md"]) {
const stated = [...readText(file).matchAll(/Node\.js (\d+)(?:以上| or later)/gu)].map((match) => Number(match[1]));
assert.ok(stated.length > 0, `${file} states no Node.js minimum`);
assert.ok(stated.every((major) => major === minimumMajor), `${file} states Node.js ${stated.join(", ")}`);
}
});

test("CI tests every supported Node.js major on Ubuntu, Windows and macOS and runs nothing older", () => {
const verify = readText(".github/workflows/verify.yml");
const nodes = JSON.parse(/node:\s*(\[[^\]]*\])/u.exec(verify)?.[1] ?? "[]");
const systems = (/os:\s*\[([^\]]*)\]/u.exec(verify)?.[1] ?? "").split(",").map((item) => item.trim());
assert.ok(nodes.includes(minimumMajor), `the verify matrix omits Node.js ${minimumMajor}`);
assert.ok(nodes.every((major) => major >= minimumMajor), `the verify matrix lists ${nodes.join(", ")}`);
assert.deepEqual(systems, ["ubuntu-latest", "windows-latest", "macos-latest"]);
for (const file of fs.readdirSync(path.join(root, ".github/workflows")).filter((name) => name.endsWith(".yml"))) {
for (const match of readText(".github/workflows", file).matchAll(/node-version:\s*(\d+)\s*$/gmu)) {
assert.ok(Number(match[1]) >= minimumMajor, `${file} runs Node.js ${match[1]}`);
}
}
});
Loading