コンテンツにスキップ

はじめに

たとえば、こういうことが起きていませんか?

  • 別ファイルへのリンクを張っていたが、リンク先のファイル名がいつのまにかリネームされていた。リンクは壊れているが、ビルドも markdownlint も通る
  • 同じテンプレートで書いているはずの設計ドキュメントで、いつの間にか必須セクションが 1 つ欠けていた。レビューでも見落とされた
  • AI に新しいドキュメントを生成させたら、既存ファイルへの参照がいくつか壊れていた。生成時に人間は気づかない

これらは 構文としては正しい Markdown です。markdownlint も通る、ビルドも通る、CI も green。それでも ドキュメントとしての整合性は崩れている — これが contextlint が解決しようとする問題です。

contextlint は、構造化された Markdown ドキュメントの 意味的な整合性 を検証するルールベースのリンターです。リンク切れ、必須セクションの欠落、テーブルの空セル、ID の重複、ドキュメント間の依存関係の崩れといった問題を、決定論的に、数秒で検出します。

contextlint は、Markdown 中心のワークフローを採用しているチーム・個人に向いています。たとえば次のようなケースです。

  • 仕様駆動開発(SDD) — 要件・仕様・設計を Markdown で書き、それを基に AI がコードを生成するアプローチ
  • ADR(Architecture Decision Records) — 設計判断を Markdown で残しているチーム
  • ドキュメント駆動開発 — 設計を先に文章化してから実装に入るスタイル
  • 大規模リポジトリのドキュメント整備 — 数十〜数百の Markdown ファイルが互いに参照し合う規模

contextlint は コンテンツの意味とファイル間の整合性 に特化しています。Markdown の構文・フォーマット・スタイル(見出しレベルの一貫性、リスト記法、テーブル構文など)は対象外です。これらは markdownlint の領域なので、両者を併用することを推奨します。

観点markdownlintcontextlint
Markdown の構文
フォーマット・スタイル
テーブル内のデータ整合性
必須セクションの存在
ファイル間の参照整合性
依存グラフの検証

ドキュメントの整合性を LLM にチェックさせる選択肢もありますが、contextlint は 静的解析 にこだわっています。理由はいくつかあります。

  • 再現性 — 同じ入力なら同じ結果。プロンプトや temperature に左右されません。CI で安定して動かせます。
  • コスト — トークンを消費しません。100 ファイルを検証してもコストはゼロです。
  • 速度 — サブ秒で完了します。エディタ統合(LSP)で「入力中にリアルタイム検出」が成り立つ速さです。
  • 明確さ — エラーメッセージが固定なので、機械処理(自動修正、CI でのフィルタリング)に向いています。

LLM はドキュメントを 書く 役割で力を発揮し、できあがったドキュメントを 検証する のは静的解析が向いています。それぞれの得意な領域を分担させるのが contextlint の設計思想です。

contextlint は、ドキュメントのライフサイクルの 3 つのタイミング に組み込めます。

タイミングプロトコル主なツール
書いている間LSPVS Code / Cursor / Neovim / Helix / JetBrains
AI が書いている間MCPClaude Code / Cursor Agent / Cline / Codex / Windsurf
マージ前CLIGitHub Actions / pre-commit / Husky / lint-staged

書く瞬間からマージまで、ドキュメントの整合性を継続的に保てます。