36 repo_root = Path(__file__).resolve().parents[1]
37 failures = []
38
39 for md_file in iter_markdown_files(repo_root):
40 if not md_file.is_file():
41 failures.append((str(md_file), "<file>", "Markdown file not found"))
42 continue
43 content = md_file.read_text(encoding="utf-8", errors="replace")
44 for match in LINK_PATTERN.findall(content):
45 target = match[0] or match[1]
46 if should_skip_link(target):
47 continue
48 normalized = normalize_target(target)
49 if not normalized:
50 continue
51 resolved = (md_file.parent / normalized).resolve()
52 if not resolved.exists():
53 failures.append((str(md_file.relative_to(repo_root)), target, str(resolved)))
54
55 if failures:
56 print("Broken markdown links detected:")
57 for src, target, resolved in failures:
58 print(f" - {src}: '{target}' -> missing '{resolved}'")
59 return 1
60
61 print("Markdown link check passed for README.md and docs/**/*.md")
62 return 0
63
64
int main(int argc, char **argv)