開発環境のセットアップ
contextlint は bun workspace を使ったモノレポです。このページでは、リポジトリを clone してから、ビルド・テスト・型チェック・lint を実行できる状態までの手順を解説します。
| ツール | バージョン | 用途 |
|---|---|---|
| Bun | 1.3.x 以上 | パッケージマネージャ・テストランナー |
| Node.js | 22 以上 | ランタイム(CLI / MCP / LSP は Node 上で動作) |
| Git | — | リポジトリ操作 |
packageManager フィールドで Bun のバージョンを固定しているため、Bun を使うのが推奨です。
クローンと依存関係のインストール
Section titled “クローンと依存関係のインストール”git clone https://github.com/nozomi-koborinai/contextlint.gitcd contextlintbun installbun install は workspace 内のすべての package(@contextlint/core、@contextlint/cli、@contextlint/mcp-server、@contextlint/lsp-server、contextlint-vscode、site)を一括でセットアップします。
リポジトリ構成
Section titled “リポジトリ構成”contextlint は packages/ 配下に以下の構成で配置されています。
| Package | 役割 |
|---|---|
@contextlint/core | ルールエンジン、Markdown テーブルパーサ、Context Graph API |
@contextlint/cli | contextlint コマンドのエントリポイント |
@contextlint/mcp-server | AI ツール連携用の MCP サーバ(5 ツール) |
@contextlint/lsp-server | エディタ統合用の LSP サーバ |
contextlint-vscode | VS Code / Cursor 拡張機能 |
site | contextlint.dev ランディングページとドキュメント(Astro) |
リポジトリ全体のアーキテクチャは Architecture を参照してください。
コアと consumer の責務分離
Section titled “コアと consumer の責務分離”lint パイプライン(lintFiles)、設定ファイルのロード(findConfig / loadConfig)、結果のフォーマット(formatFileResults / formatContentResults)はすべて @contextlint/core に集約されています。@contextlint/cli と @contextlint/mcp-server はこれを import するだけで、consumer 側でパイプラインや設定処理を再実装してはいけません。
lintFiles は意図的に同期 API(globSync + readFileSync)として設計されています。非同期化しないでください。
主要コマンド
Section titled “主要コマンド”リポジトリのルートで実行します。
| コマンド | 内容 |
|---|---|
bun run --filter '*' build | 全 package を tsc でビルド |
bun test | 全 package のテストを bun:test で実行 |
bun run --filter '*' typecheck | 全 package の型チェック |
npx eslint . | TypeScript を ESLint で lint |
bunx markdownlint-cli2 "README*.md" | README ファイルの Markdown lint |
特定の package だけビルドしたい場合は、--filter の値を package 名に変えます(例: bun run --filter '@contextlint/core' build)。
TypeScript と ESLint の設定
Section titled “TypeScript と ESLint の設定”contextlint は strict 設定を採用しています。コードを書く際には以下を守ってください。
strict+noUncheckedIndexedAccess— 配列やオブジェクトのインデックスアクセスはT | undefined型になります。verbatimModuleSyntax— 型のみを import する際はimport typeを必ず付けます。- ESM — すべての package は
"type": "module"です。 any禁止 —JSON.parseの結果など、暗黙のanyもno-unsafe-assignmentで検出されます。!non-null assertion 禁止 —if (!x) throw new Error(...)のようなガードで型を絞り込んでください。asキャスト不要 — ルール実装では Zod schema のparseで options が検証済みのため、asは使いません。
ESLint の設定は eslint.config.mjs、TypeScript は per-package の tsconfig.json(ビルド用、テスト除外)と tsconfig.eslint.json(lint 用、テスト含む)の二系統です。
セットアップが正しく完了しているかを確認するには、以下を実行してすべて成功することを確認します。
bun run --filter '*' buildbun testbun run --filter '*' typechecknpx eslint .ここまで通れば、新しいルールの追加やバグ修正を始められる状態です。