Versions-LE について
Versions-LE は、リポジトリのマニフェストと CI ワークフローにある依存関係やツールチェーンの制約を比較します。モノレポ、リリース準備、依存関係の更新を確認する開発者向けで、未対応の構文は推測せず明示的に除外します。
主な機能
- 01複数マニフェスト間の制約比較
- 02両立しないバージョン範囲の検出
- 03Rust の最低バージョンと CI の差異確認
- 04問題と記述箇所のレポート
- 05未対応の制約構文の拒否
活用シーン
- 01モノレポ内の依存関係の衝突確認
- 02リリース前の CI ツールチェーン確認
- 03依存関係更新後の制約の整合性確認
MCP 対応
MCP サーバーは `compare_versions` と `versions_le_check` を MCP クライアントに提供します。ファイルパスと内容を引数で受け取り、ファイルシステムやネットワークにアクセスせず比較結果を返します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
1掲載時のツール一覧 · 3 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| files | array | はい | 比較するマニフェストです。 |
| maxResults | integer | いいえ | 返される指摘数の上限(デフォルトは 500)。meta.truncated は省略された結果があるかどうかを示します。 |
詳細
Versions-LE:2つのピン、1つの依存関係
リポジトリ内のマニフェスト間で、1つの依存関係が異なる制約を受けている箇所と、両方を満たすバージョンが存在しない箇所を見つけます
package.json · Cargo.toml · pyproject.toml · go.mod · GitHub ワークフロー
役に立ちましたか? スターや評価があると、ほかの開発者にも見つけてもらいやすくなります — ★ GitHub · ★ Open VSX · ★ Marketplace
できること
api が regex = "1" を要求し、web が regex = "2" を要求するため、ビルドが失敗しました。両方を満たすバージョンはありません。あるいは、まだ失敗していなくても、いずれ失敗します。CI は3月から Rust 1.80 でビルドしている一方、rust-version は 1.88 を指定しています。
Versions-LE: Compare Versions を実行すると、ワークスペース内のすべてのマニフェストをまとめて比較します。エクスプローラーから、フォルダー内のすべてのマニフェストを比較することもできます。レポートはエディターの横に開きます。各問題を重大度順に示し、問題を引き起こしたファイル、キー、制約をすべて表示したうえで、意図的に比較対象から除外した項目とその理由も示します。VS Code と、Cursor や VSCodium などの VS Code ベースのエディターで動作します(Open VSX からインストールできます)。
- モノレポ内で — ほかのクレートが
1.0に移行する中、serde 0.9に固定されたクレートを見つけます - リリース前に — 公開する最小バージョンより古いツールチェーンで CI がテストしていないか確認します
- 依存関係のバージョン更新をレビューするときに — ほかと一緒に更新されなかったパッケージを見つけます
マニフェストを編集することも、推測することもありません。モデル化していない制約は名前を示し、すべての比較から除外します。
インストール
| 場所 | 得られるもの | インストール |
|---|---|---|
| VS Code | エディター内で、キーを押すだけで比較できます | Marketplace |
| Cursor、VSCodium、Windsurf | 同じ拡張機能です | Open VSX |
| ターミナルまたは CI のステップ | 終了コード付きで、ツリー全体を取得できます | cargo install versions-le · crates.io |
| Node 経由のターミナル | Rust 版とバイト単位で一致する同じコマンドラインです | npx versions-le · npm |
| Node 経由のあらゆる MCP エージェント | stdio 経由の compare_versions | npx versions-le-mcp · npm |
6 つのチェック
| コード | 重大度 | 意味 |
|---|---|---|
disjoint-constraint | error | 1 つの依存関係に対する 2 つの制約のうち、どちらも同時に満たす単一のバージョンがない状態です。このツールが示す最も強い判定です。 |
malformed-constraint | error | そのエコシステム固有の制約の形式をしていますが、壊れています。 |
constraint-conflict | warning | 1 つの依存関係に対して、複数の場所で異なる要件が指定されています。 |
msrv-mismatch | warning | マニフェスト間で rust-version が異なるか、CI のツールチェーンの固定バージョンが宣言された最小バージョンを下回っています。 |
prerelease-in-production | warning | 開発用またはビルド用の依存関係以外で、-rc または -alpha の制約が指定されています。 |
floating-pin | info | latest、*、0.x バージョンに対するキャレット、または固定されていない CI ツールのバージョンです。 |
異なることと、満たせないことは別々の検出結果です。 constraint-conflict
は懸念事項であり、disjoint-constraint は解決できないビルドを意味します。この 2 つを混同することはありません。
互いに素かどうかは、文字列の比較ではなく、モデル化された範囲に対する区間演算で判定します。そのため、>=20 と
>=20.0.0 は競合として報告されません。どちらも同じ要件を 2 通りに記述したものです。
不整合のある依存関係ごとに検出結果は 1 つで、すべての該当箇所が含まれます。4 通りの制約が指定された依存関係は、4 つの該当箇所を持つ 1 つの問題です。検出結果を 4 つにすると、4 つの問題があるように読めてしまいます。
4 つの拒否理由
推測は一切しません。 このツールがモデル化していない文法の制約は、レポートの refusals に記載され、比較の対象にはなりません。範囲に近似することもありません。
| 理由 | 該当する場合 |
|---|---|
unknown_grammar | 値が、このツールでモデル化していない構文の制約である場合:PEP 440 の ~=, !=, ===, ==1.2.*;npm の workspace:, npm:, file:, link:, git または https の URL、owner/repo 形式の省略表記、dist タグ;version のない Cargo 依存関係テーブル;コミット SHA またはブランチのアクション参照;CI のチャネル名(stable、latest、lts/*)。 |
cross_ecosystem | 同じ名前が 2 つのエコシステムで使われている場合です。1 度だけ記載され、それぞれのエコシステムの該当箇所が含まれます。2 つが比較されることはありません。 |
ambiguous_version_string | ワークフロー内の <tool>-version: の値が、明らかにバージョンではない場合です。例:${{ matrix.node }}、リスト、ファイル名。比較対象がなく、値を作り出すこともないため、エントリーは一切作成されません。 |
per_job_tool_version | 1 つの CI ツールが異なるバージョンでインストールされている場合です。例:テストジョブの python-version: 3.9 と、公開ジョブの 3.12。ツールのバージョンはインストールするジョブに属するため、2 つが比較されることはありません。 |
malformed-constraint は拒否理由ではなく検出結果です。この区別には意図があります。これは、値がそのエコシステム固有の制約の形式をしているものの、壊れているという、より限定的な判定です。ツールがマニフェストに責任があると判断するのは、確信が持てる場合に限ります。それ以外はすべて、自らの責任とします。^^1.0.0 は不正な形式です。latest はそうではありません。このツールがモデル化しないことを選んだ構文ですが、意味はあります。
比較がエコシステムをまたぐことはありません。 npm の semver と Cargo の semver は、同じ単語を共有するだけの無関係なパッケージです。また、裸の "1.0.200" は npm では 1.0.200 と完全に一致を意味しますが、Cargo では 2.0.0 未満のすべてを意味します。橋渡しとなるのは msrv-mismatch のみです。名前を照合するのではなく、両方のキーを指定して構築されます。
読み取る内容
| マニフェスト | キー |
|---|---|
package.json | 4 つの依存関係セクション、engines.*、packageManager |
Cargo.toml | 依存関係、開発用、ビルド用、ワークスペースおよびターゲットの各バリエーション、rust-version |
pyproject.toml | PEP 621 の dependencies、optional-dependencies、requires-python |
go.mod | require(単独形式とブロック形式)、go ディレクティブ |
.github/workflows/*.yml | uses: アクション参照、<tool>-version: 入力、toolchain: |
この最後の項目が最初の項目と同じくらい重要な理由は、CI のツールチェーンがマニフェストで宣言された最低バージョンと食い違うことこそ、リリース直前まで誰も気づかない典型的な問題だからです。
node_modules、vendor、.git は読み取りません。.github は常に読み取ります。ワークフローは定義上、隠しディレクトリに存在するためです。
対応しないこと
- マニフェストは編集しません。
--fix、--pin、--updateはありません。バージョンが食い違う依存関係に適切なバージョンを選ぶのは、導出ではなく判断だからです。 - 依存関係グラフは解決しません。 リゾルバーが選ぶバージョンではなく、マニフェストに 記載されている 内容を読み取ります。ロックファイルも、推移的な依存関係の分析も行いません。
- ネットワークには接続しません。 どのバージョンが存在するか、取り下げられているか、最新かは把握しません。確認するのは、宣言された 2 つの要件を同時に満たせるかどうかだけです。
- スタイルのリンティングは行いません。 マニフェストの並べ替え、引用符、書式設定は別のツールの役割です。
AI エージェントから使う
同じエンジンが MCP サーバーとして動作するため、エージェントはマニフェストを目視で比較する代わりに、直接呼び出せます。
| エディター | 方法 |
|---|---|
| VS Code 1.101+ | インストールは不要です。拡張機能がエージェントモードに compare_versions を登録します |
| Claude Code | claude mcp add versions-le -- npx -y versions-le-mcp |
| Cursor、Windsurf、その他 | npx versions-le-mcp を指定します |
compare_versions(files: [{ path, content }], maxResults?)
エディターが表示するレポートをデータとして返します。デフォルトでは検出結果は最大 500 件で、meta.truncated に切り詰められたかどうかが示されます。ファイルの読み取りもネットワークリクエストも行いません。npm では versions-le-mcp として、MCP レジストリでは io.github.nolindnaidoo/versions-le として公開されています。Rust CLI のサーバーとまったく同じように応答します。同じテスト用データセットを両方に適用し、壊れた JSON や TOML も含む、生成された何千ものマニフェストセットを使った差分テストで、すべての応答を比較します。
手動で設定する — MCP 設定ファイルを使う任意のホスト
{
"mcpServers": {
"versions-le": {
"command": "npx",
"args": ["-y", "versions-le-mcp"]
}
}
}
または、npm install -g versions-le-mcp で一度インストールし、versions-le-mcp を指定します。環境変数、API キー、独自の設定は不要です。動作確認するには、次のコマンドを実行します。
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y versions-le-mcp
ターミナルや CI のステップから、ツリー全体を同じ方法で比較できます。Rust 製 CLI は crate/ にあり、拡張機能と同じコーパス crate/fixtures/ を共有するため、制約の解釈が食い違うことはありません。同じコマンドラインは npm から versions-le としても提供されており、Node はあるものの Rust がない環境で使えます。また CI では、3 つのオペレーティングシステム上でクレート版とバイト単位で一致することを確認しています。
npm(versions-le)または crates.io(versions-le)からインストールできます。どちらをインストールしても、同じ versions-le コマンドが使われます。
npm install -g versions-le # or run it once: npx versions-le
cargo install versions-le
versions-le . # every manifest in the tree; one JSON report on stdout when piped
versions-le --ecosystem cargo . # one ecosystem
versions-le --fail-on any . # floating pins fail the build too
versions-le --strict . # an unanalysed corner exits 2
versions-le mcp # compare_versions and versions_le_check over MCP on stdio
終了コードが結果を表します — 0 は info を超えるものがない場合、1 は検出事項がある場合、2 は質問の形式が正しくない場合です。マニフェストがまったくない場合は 0 です。競合するものが何もないためです。
コマンド
| コマンド | 説明 |
|---|---|
Versions-LE: Compare Versions | ワークスペース内のすべてのマニフェスト、または Explorer で選択したフォルダー以下のマニフェストを比較します |
Versions-LE: Open Settings | Versions-LE の設定を開きます |
Versions-LE: Help & Troubleshooting | 組み込みドキュメント |
デフォルトでは、どのコマンドにもキーは割り当てられていません。エディターの キーボードショートカット から、任意のコマンドにキーを割り当てられます。
設定
| 設定 | デフォルト | 説明 |
|---|---|---|
versions-le.exclude | [] | 除外するマニフェストのグロブパターン。node_modules、.git、vendor は常に除外されます |
versions-le.openResultsSideBySide | true | 現在のエディターの横にレポートを開きます |
versions-le.showPositions | true | 各制約が記述されている行を表示します |
versions-le.copyToClipboardEnabled | false | レポートもクリップボードにコピーします |
versions-le.clipboardIncludesPositions | true | コピーに行番号を含めます |
versions-le.notificationsLevel | silent | all = すべての通知、important = 警告とエラー、silent = エラーのみ |
versions-le.statusBar.enabled | true | ステータスバーの項目を表示します |
versions-le.telemetryEnabled | false | ローカルのみのイベントログ(プライバシーを参照) |
言語
英語以外に 12 言語に対応しています。
ドイツ語 · スペイン語 · フランス語 · インドネシア語 · イタリア語 · 日本語 · 韓国語 · ポルトガル語(ブラジル) · ロシア語 · ウクライナ語 · ベトナム語 · 中国語(簡体字)
両方の部分を網羅しています。マニフェスト(コマンド名、設定名、説明)と、拡張機能の実行中に表示されるすべての内容(通知、ステータスバー、レポートの見出し)です。検出事項のメッセージはエンジンの英語で、CLI のものと同一です。
プライバシーとセキュリティ
- ネットワークアクセスはありません。 この拡張機能はデータをどこにも送信しません。どのバージョンが存在するかは把握せず、提示された2つの要件を同時に満たせるかどうかだけを判定します。
telemetryEnabled設定は、確認できるローカルの出力チャネル(Versions-LE)にイベントを書き込むだけです。 - マニフェストだけを読み取り、それ以外は読み取りません。 マニフェストへの書き込みも行いません。
- MCP サーバーも同じ方針です。 コンテンツを引数として受け取り、データを返します。ファイルシステムへのアクセス、ネットワーク呼び出し、テレメトリーはありません。
- エラー通知では、ホームディレクトリと認証情報らしき文字列を伏せます。
- 評価の案内は最大2回です。 3回目の正常な使用時に、評価していただけるかを1度尋ねます。後でを選択した場合、または案内を閉じた場合は、20回目にもう一度だけ尋ねます。今後表示しないを選ぶと、案内は終了します。
notificationsLevelを自分でimportantまたはsilentに設定しても、案内はオフになります。回数は VS Code の拡張機能ストレージに保存され、どこにも送信されません。評価するを選ぶと、インストール元の VS Code Marketplace または Open VSX の掲載ページがブラウザーで開きます。
ドキュメント
| 内容 | 場所 |
|---|---|
| ツールが行ってよいこと — チェック、拒否、出力の契約、対象外の事項 | crate/SPEC.md |
| 拡張機能の構築方法と内部構造 — アーキテクチャ、不変条件、ツールチェーン、リリース | AGENTS.md |
| CLI の構築方法と内部構造 | crate/AGENTS.md |
| 変更内容 | CHANGELOG.md · crate/CHANGELOG.md |
| このツールとほかの15個のページ | letools.dev/tools/versions-le |
パフォーマンス
| 入力 | サイズ | 検出数 | 時間 | 処理率 | スキャン速度 |
|---|---|---|---|---|---|
| 50 crates、50 packages | 0.01 MB | 450 | 2.38 ms | 188,722/sec | 6.1 MB/s |
| 500 crates、500 packages | 0.15 MB | 4,500 | 27.13 ms | 165,892/sec | 5.4 MB/s |
| 2,000 crates、2,000 packages | 0.58 MB | 18,000 | 486.79 ms | 36,977/sec | 1.2 MB/s |
Apple M5 Pro、24 GB RAM、Node 24.3.0 でウォームアップ後に7回実行した中央値です。入力はチェックインせず、scripts/benchmark.ts で生成するため、上記のサイズは実際に測定した値と一致します。bun run benchmark で再現できます。
これらの数値はマシン固有であり、CI では保証していません。ビルドをベンチマークで止めても、ランナーがどれだけビジーだったかがわかるだけです。
テスト
| 指標 | カバレッジ |
|---|---|
| ステートメント | 79.30% |
| 分岐 | 72.41% |
| 関数 | 82.44% |
| 行 | 82.58% |
24ファイルにわたる381件のテストケースに加え、実際の VS Code 拡張機能ホストで実行する統合テストスイートと、ビルド済みの .vsix をクリーンなプロファイルにインストールするエンドツーエンドテストがあります。
実際の実行結果である coverage/coverage-summary.json と coverage/test-results.json から scripts/coverage-readme.js が生成します。このセクションに差異があると CI は失敗します。bun run test:coverage で再現できます。ケース数は vitest が出力する値です。
LE ファミリーのその他のツール
あらゆるモデルが直面する作業に対応する、単機能ツールが16個あります。それぞれに Rust CLI と MCP サーバーが付属します。詳細はこちら:letools.dev
取り出す
- String-LE — コードベース内のすべての文字列を抽出し、人が読めるようにします
- Numbers-LE — コードベース内のすべてのハードコードされた数値を抽出し、人が確認できるようにします
- Units-LE — 単位付きの数量をすべて抽出して正規化し、曖昧なものは名前を示して対象外にします
- Dates-LE — すべての日付とタイムスタンプ、およびそれぞれが解決される正確な時点を抽出します
- IDs-LE — UUID、ULID、NanoID、ObjectId、Snowflakeをすべて抽出し、内部に含まれる時刻をデコードします
- IPs-LE — IPアドレス、CIDRブロック、MACアドレスをすべて抽出し、正規化してスコープ別に分類します
- URLs-LE — コードベース内のすべてのURLを、プロトコルと正確な位置情報とともに抽出します
- Paths-LE — コードベース内のすべてのファイルパスを抽出し、現在も何かを指しているかどうかを示します
- Colors-LE — コードベース内のすべての色を抽出し、パレットにない色を示します
チェックする
- Regex-LE — コードベース内のすべての正規表現を検出し、壊滅的なバックトラッキングを引き起こす可能性があるものを報告します
- Versions-LE — リポジトリ内のマニフェスト間で、同じ依存関係のバージョン制約が異なる箇所を検出します
- i18n-LE — プロジェクトで使用している i18n ライブラリを特定し、そのライブラリのルールに基づいてカタログを監査します
- Scrape-LE — スクレイパーを書く前にページをスクレイピングできるか確認し、判定できない場合はその旨を示します
保護する
- Secrets-LE — コードベース内のハードコードされた認証情報を検出し、レポートに表示することはありません
- EnvSync-LE — ディレクトリツリー内の dotenv ファイルを比較し、どのファイルにどのキーがないかを示します
- Unicode-LE — 意味を隠す Unicode を検出します。双方向制御文字、不可視文字、ホモグリフ、混在スクリプトが対象です
それぞれが独立しています。共有クレートも、公開されたコアもありません。2つのツールが同じ答えにたどり着くとすれば、それはその答えが2度正しかったからです。
お問い合わせ — nolindnaidoo.com · GitHub · LinkedIn
nolindnaidoo によるその他のプロジェクト
Rust — pixelcoords と pixelactions は一連のループを構成します。pixelcoords が 場所 に答え、pixelactions がそこで 操作 します。それぞれ独自のツールと独自の方針を持ち、LE ファミリーには属しません。
- pixelcoords — 画面を固定し、領域を指定して、ピクセル単位で正確な座標と切り抜きを取得します pixelcoords.dev · crates.io · docs.rs
- pixelactions — 人が検証した座標を受け取り、操作を実行して、反映されたことを確認します pixelactions.dev · crates.io · docs.rs
ライセンス
MIT © nolindnaidoo
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。