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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ This project uses a Keep a Changelog-style structure. Until a tagged release is

### Fixed

- The README link to the agent orchestration reference no longer points at a generated path that is missing on GitHub. `tests/markdown-links.test.mjs` keeps relative links in tracked Markdown resolvable.
- Current audit timestamps accept and preserve RFC 3339 offsets consistently. History, artifact input order, and fix-lease expiry compare actual instants without losing fractional precision; invalid legacy calendar values are rejected without rewriting frozen schemas.
- Claude installation uses the existing exclusive-copy routine for staging as well as activation, avoiding a native `fs.cpSync` crash observed on Windows with Node 22.19.0.
- Human findings no longer require a remediation plan when the reviewer records the required finding details; later plans preserve the original finding.
Expand Down
3 changes: 1 addition & 2 deletions README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,7 @@ For a new run, use `init` with `--inspection-mode quick|detailed --inspection-pu
- [Report formats, HTML accessibility, and verification boundaries](docs/report-formats.md)
- [Architecture, responsibilities, artifacts, and bilingual glossary](docs/architecture-and-glossary.md)
- [Browser-based Web inspection and network boundaries](docs/web-inspection.md)
- [Agent orchestration for Codex](shared/skill/references/agent-orchestration.md)
- [Agent orchestration for Claude](claude/skills/information-accessibility-practice/references/agent-orchestration.md)
- [Agent orchestration for Codex and Claude](shared/skill/references/agent-orchestration.md)
- [Standards assessment and evidence levels](shared/skill/references/standards-assessment.md)
- [Security policy](SECURITY.md)
- [Contribution guide](CONTRIBUTING.md)
Expand Down
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,7 @@ https://example.com/
- [レポート形式、HTMLアクセシビリティ、検証境界](docs/report-formats.md)
- [アーキテクチャ、役割、成果物、日英用語集](docs/architecture-and-glossary.md)
- [実Web検査とbrowser/network境界](docs/web-inspection.md)
- [Codex向けagent orchestration](shared/skill/references/agent-orchestration.md)
- [Claude向けagent orchestration](claude/skills/information-accessibility-practice/references/agent-orchestration.md)
- [CodexとClaude向けagent orchestration](shared/skill/references/agent-orchestration.md)
- [規格assessmentと証拠レベル](shared/skill/references/standards-assessment.md)
- [セキュリティ方針](SECURITY.md)
- [コントリビューション手順](CONTRIBUTING.md)
Expand Down
1 change: 1 addition & 0 deletions release-files.json
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,7 @@
"tests/interaction-browser-e2e.test.mjs",
"tests/interaction-supervision.test.mjs",
"tests/jis-procedure-reuse.test.mjs",
"tests/markdown-links.test.mjs",
"tests/module-dependency.test.mjs",
"tests/multi-agent-forward.test.mjs",
"tests/network-address.test.mjs",
Expand Down
55 changes: 55 additions & 0 deletions tests/markdown-links.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";
import { execFileSync } from "node:child_process";
import test from "node:test";
import { fileURLToPath } from "node:url";

const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");

function trackedFiles() {
return execFileSync("git", ["ls-files", "-z"], { cwd: root, encoding: "utf8", shell: false })
.split("\0")
.filter(Boolean);
}

function localLinks(markdown) {
const links = [];
let inFence = false;
for (const [index, line] of markdown.split(/\r?\n/u).entries()) {
if (line.startsWith("```")) inFence = !inFence;
if (inFence) continue;
for (const match of line.matchAll(/\[[^\]]+\]\((?<target>[^)]+)\)/gu)) {

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 Check reference-style Markdown links

The matcher only recognizes inline links of the form [text](target), so a standard reference-style link such as [guide][docs] with [docs]: missing.md is ignored and the test still passes. A broken relative link can therefore be introduced without triggering the repository-wide safeguard this test claims to provide; parse reference definitions as well or use a Markdown parser.

Useful? React with 👍 / 👎.

const target = match.groups.target.trim();
if (/^(?:https?:|mailto:|#)/iu.test(target)) continue;
links.push({ line: index + 1, target });
}
}
return links;
}

function targetExists(target, file, tracked) {
const clean = target.split("#", 1)[0].split("?", 1)[0];
if (!clean) return true;
const resolved = path.posix.normalize(path.posix.join(path.posix.dirname(file), clean));
return tracked.has(resolved) || [...tracked].some((entry) => entry.startsWith(`${resolved}/`));
}

test("every relative Markdown link in tracked files resolves", (t) => {
let tracked;
try {
tracked = new Set(trackedFiles());
} catch (error) {
t.skip(`git unavailable or not a work tree: ${error.message}`);
return;
}

const broken = [];
for (const file of [...tracked].filter((entry) => entry.endsWith(".md"))) {
const markdown = fs.readFileSync(path.join(root, file), "utf8");
for (const { line, target } of localLinks(markdown)) {
if (!targetExists(target, file, tracked)) broken.push(`${file}:${line} -> ${target}`);
}
}
assert.deepEqual(broken, [], `broken relative Markdown links:\n${broken.join("\n")}`);
});
Loading