コンテンツにスキップ

REF-001 リンク切れ

Markdown 内の相対リンク([text](./file.md) の形式)が、実在するファイルを指していることを検証します。リンク先が存在しない場合は error になります。アンカーフラグメント(#section)はリンク先ファイル判定からは除外され、その妥当性は REF-005 アンカー の責務です。

ファイルのリネーム・削除・移動でリンクが壊れるのは、Markdown を運用するうえで最も頻繁に起きる劣化です。AI 生成では存在しないファイルへのリンクが混入することもあります。リンク切れがあっても markdownlint も CI もパスしてしまうため、機械的な検出が必要です。

フィールド必須説明
excludestring[]リンク先の検証から除外するパスの glob 配列
siteRouterobjectSSG の routed URL(例: /docs/x/)を実ファイルに解決する設定

オプション全体を省略しても動作します。exclude は外部のドキュメントや生成物のように、include の対象外だが意図的に存在しないファイルを参照する場合に使います。

通常 REF-001 は ./file.md のような相対リンクを file system path として解決しますが、Astro Starlight などの SSG が生成する routed URL/docs/x//ja/docs/x/)はそのままでは file path として存在しないため、siteRouter を指定しないと broken link と判定されます。

サブフィールド必須説明
presetstring既知の SSG プリセット。現在は "starlight" のみ対応
contentDirstringコンテンツディレクトリ(例: "packages/site/src/content/docs"
defaultLocalestringデフォルトロケール。Starlight の prefix なし root ロケールには "root" を指定
localesstring[]サポートするロケールのリスト(例: ["root", "ja", "ko", "zh"]
urlPrefixstring(preset を使わない汎用設定) URL から取り除くプレフィックス
indexFilestring最初に試す index ファイル名(既定: "index.md"

Starlight (i18n) の例:

{
"rule": "ref001",
"options": {
"siteRouter": {
"preset": "starlight",
"contentDir": "packages/site/src/content/docs",
"defaultLocale": "root",
"locales": ["root", "ja", "ko", "zh"]
}
}
}

/docs/get-started/<contentDir>/docs/get-started/index.md<contentDir>/docs/get-started.md に解決されます。/ja/docs/get-started/<contentDir>/ja/docs/get-started/index.md に解決されます。

汎用設定(preset なし)の例:

{
"rule": "ref001",
"options": {
"siteRouter": {
"contentDir": "src/pages",
"urlPrefix": "/wiki",
"indexFile": "README.md"
}
}
}

/wiki/some-page/src/pages/some-page/README.md に解決されます。

詳細は [アーキテクチャ](./architecture.md) を参照してください。

./architecture.md が存在しない場合、違反になります。

docs/overview.md
line 1 error Link target "./architecture.md" does not exist REF-001
詳細は [アーキテクチャ](./architecture.md) を参照してください。

リンク先ファイル architecture.md を作成するか、リンクを正しいパスに修正します。

{
"rule": "ref001",
"options": {
"exclude": ["generated/**/*.md"]
}
}