JevLint-LE について
JevLint-LEは、コードやJSON内のJevおよびLuna向け意思決定モデルの質問を検査します。APIキー不要のオフラインルールを備え、開発者やエージェント向けに、利用者自身のキーによる任意のモデル検査も提供します。
主な機能
- 01JSONと6言語のコードをリント
- 02安全な修正の適用と検出結果の抑制
- 03エディター、CLI、CI、MCPでルールを共有
- 04検査・修正・ルール参照用の8つのMCPツール
- 05任意のモデル検査とレイアウトプローブ
活用シーン
- 01リクエスト送信前に質問の不備を検出
- 02エディターとCIで同じ検査を実行
- 03エージェントに生成リクエストの検査と安全な修正を依頼
- 04モデルに質問を確認させ、レイアウトの影響をテスト
MCP 対応
stdioのMCPサーバーは、テキストやファイルの検査、安全な修正、ルールの一覧・説明、任意のモデル検査とプローブを行う8つのツールを提供します。モデルを呼び出すツールは、利用者が設定したAPIキーを使います。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
8掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| text | string | はい | リクエスト JSON またはソースコード。 |
| rules | object | いいえ | 上書きするルールレベル。例:{ "JEV004": "off" }。レベル:off、hint、info、warning、error。 |
| filename | string | いいえ | テキストの種類を示す拡張子を持つファイル名:.json、.ts、.js、.py、.rs、.go。デフォルトは request.jev.json です。 |
詳細
DecisionLint:Jev/Luna リント
送信前に、Jev と Luna の意思決定モデルに関する質問をリントします
JSON、JavaScript、TypeScript、Python、Rust、Go に対応し、TypeSafe、OpenAI、およびそれらを提供するすべてのプラットフォームで利用できます
役に立ちましたか? 他の開発者に見つけてもらうには、スターまたは評価をお願いします — ★ GitHub · ★ Open VSX · ★ Marketplace
機能
送信前に、Jev と Luna に投げる質問をリントします。DecisionLint は、意思決定モデル向けに書いた質問をチェックします。対象は TypeSafe の Jev、OpenAI の Decisions API(gpt-6-luna)、そして OpenRouter や Vercel AI Gateway から手元の llama.cpp まで、どちらの形式にも対応するすべてのプラットフォームです。DecisionLint は JSON とコードから質問を読み取り、悪い回答につながる可能性が高い書き方の質問を報告します。リントでは API を呼び出さず、キーも必要ありません。オプションのコマンドを使えば、自分のキーで、ファイルを指定したプラットフォームに送信し、モデル自身にチェックさせることもできます。
- JSON、JavaScript、TypeScript、Python、Rust、Go で入力中にリントします。
- 機械的なミスは電球アイコンから修正でき、同意できない指摘を無視する方法もあります。
- CI、コマンドライン、MCP サーバー経由の AI エージェントで、同じルールを使用できます。 3 つすべてで同じ設定ファイルを使います。
- すべてのプラットフォームで、共通のルールセットを使用できます。 TypeSafe の
/v1/systemone形式と OpenAI の/v1/decisions形式、predicate、choices、levelsを同じルールでチェックします。また、AI SDK のどちらかの形式に対応するdecide()呼び出しも対象です。リクエストに適用される上限は、モデル ID の表記、ファイル内の URL、またはtarget設定から読み取る、そのプラットフォーム固有の値です。Vercel では 255 個の選択肢、LiteLLM では 128 個の質問が上限となり、プラットフォームが上限を公開していない場合は上限なしとなります。 - 自分のキーを使うオプションのコマンドが 2 つあります。 1 つは、テキストパターンでは見つけられない問題が質問にないかモデルに尋ねます。もう 1 つは、レイアウトを変えて質問を再送し、回答が変わらないかを確認します。どちらも、モデル ID が示すプラットフォーム、または指定したエンドポイントに送信します。ローカルの llama.cpp も指定できます。
次のようなリクエストは問題なさそうに見えますが、3 つの問題があります。
{
"model": "jev-latest",
"state": "My parcel came three days late and the lid is cracked.",
"questions": {
"team": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": { "billing": "Charges and refunds", "delivery": "Late or damaged parcels" }
},
"late": { "type": "noul", "instructions": "Did more than two parcels arrive late?" }
}
}
| 指摘 | 重要な理由 |
|---|---|
jev-latest の DEC001 | このエイリアスはリリースごとに変わるため、こちらで何も変更しなくても回答が変わる可能性があります |
team の DEC004 | どちらのチームについてでもないメッセージも、いずれか一方に分類されてしまいます |
late の DEC102 | Jev は正確に数えられません。各荷物について質問し、コードで数えてください |
インストール
| 対象 | 利用できる機能 | インストール |
|---|---|---|
| VS Code | 入力中のリント、電球アイコンからの修正、Ask コマンドと Probe コマンド | Marketplace · ext install nolindnaidoo.decisionlint |
| Cursor、VSCodium、Windsurf | 同じ拡張機能 | Open VSX |
| ターミナルまたは CI のステップ | ツリー全体に対する同じルールのチェック、終了コード、SARIF、JUnit | npx decisionlint · npm |
| Node 経由の任意の MCP エージェント | stdio 経由の 8 つのツール | npx -y decisionlint-mcp · npm |
AI エージェントから使用する
同じプログラムがMCPサーバーでもあるため、Jev または OpenAI Decisions の質問を作成するエージェントは、作成した内容を lint して、表示される前に修正できます。ツールの説明とサーバーの指示には、両方のベンダー名と3種類すべてのリクエスト形式が記載されているため、エージェントはどの場合でもこのサーバーを呼び出すべきだと判断できます。
| エディター | 方法 |
|---|---|
| VS Code 1.101+ | インストールは不要です。拡張機能がサーバーをエディターに提供し、エージェントがツールを呼び出すとエディターがサーバーを起動します |
| Claude Code | claude mcp add decisionlint -- npx -y decisionlint-mcp |
| Cursor、Windsurf、その他 | npx -y decisionlint-mcp を指定します |
8つのツールを提供します。lint_text はテキストとして渡されたリクエストまたはソースコードを lint し、lint_paths はディスク上のファイルを lint します。どちらも各指摘に修正内容が含まれます。fix_text は安全な修正を適用したテキストと、残った問題のレポートを返します。書き込みは行いません。list_rules はすべてのルールとその意味を一覧表示し、explain_rule はルールのページと、指摘される例および指摘されない例を返します。これらは何も送信せず、キーも不要です。
残りの3つは、エージェント向けのエディターの Ask コマンドと Probe です。ask_model は Jev、または model: gpt-6-luna を指定した Luna に、テキスト内またはファイル内の質問の確認を依頼し、モデルの指摘を追加した lint レポートを返します。plan_ask は送信される内容を示しますが、何も送信しません。probe_question はレイアウトを変えて質問を1つ送信し、回答が維持されるかを報告します。送信を行う2つのツールはキーを使用し、費用が発生します。また、それらの説明には、ユーザーから依頼された場合にのみ呼び出すようエージェントに指示されています。キーは、クライアントがサーバーを起動した環境にある TYPESAFE_API_KEY または OPENAI_API_KEY、あるいはサーバーを起動したディレクトリ内の .env.local または .env から読み込まれます。ツールの引数から読み込まれることはないため、キーがエージェントの記録に残ることはありません。各ツールはテキストとともに構造化コンテンツを返し、ファイルへの書き込みは行いません。
MCP レジストリには io.github.nolindnaidoo/decisionlint として登録されています。レジストリからサーバーをインストールするクライアントで利用できます。
手動で設定する:MCP 設定ファイルを持つ任意のホスト
ほとんどのホストは JSON 設定ファイルを読み込みます。エントリを1つ追加します。
{
"mcpServers": {
"decisionlint": { "command": "npx", "args": ["-y", "decisionlint-mcp"] }
}
}
初回実行時のインストール確認を省略するには、-y を指定します。起動のたびに npx を使わないようにするには、npm install -g decisionlint-mcp で一度インストールし、代わりに "command": "decisionlint-mcp" を設定します。
CI 用に decisionlint をすでに固定しているプロジェクトでは、npx decisionlint --mcp から同じサーバーを利用できます。フラグなしで起動した decisionlint はサーバーではなく、終了するリンターです。そのため、クライアントに指定するのはフラグなしのパッケージです。
検出できる問題
Jev と Luna が保証するのは回答の形式であり、回答そのものではありません。質問の形式が不適切でも、自信に満ちた数値が返ってくることがあります。これらのルールは、テキストから読み取れる誤りを検出します。
| コード | 名前 | デフォルト | 意味 |
|---|---|---|---|
| DEC000 | unreadable | hint | 質問の一部が実行時に組み立てられるため、それを必要とするルールが実行されませんでした |
| DEC001 | unpinned-model | warning | jev-latest のようなエイリアスはリリースごとに変わるため、こちらで何も変更していなくても回答が変わる可能性があります |
| DEC002 | choice-option-limit | error | Choice の選択肢が 255 個を超えています。API に拒否されます |
| DEC003 | score-level-limit | error | Score のレベルが 10 個を超えています。API に拒否されます |
| DEC004 | no-fallback-option | info | Choice に other または none of the above がないため、どの選択肢にも当てはまらない入力が、いずれかの選択肢に無理に割り当てられます。測定されたコストの中で最大であり、テキストから判断するのが最も困難です |
| DEC005 | duplicate | error | 質問 ID、選択肢、またはレベルが重複しています。オブジェクトでは、後の項目が前の項目を暗黙的に置き換えます |
| DEC006 | criteria-shape | error | Choice には選択肢のマップ、Score にはレベルの配列が必要で、Noul は true と false を受け取ります |
| DEC007 | invalid-question | error | タイプがないか不明であるか、指示が空文字列です |
| DEC008 | numeric-levels | warning | Score のレベルが数値のみです。Jev は状態を各説明と照合し、レベルの位置は参照しません |
| DEC009 | too-few-options | info | 選択肢が 1 つの Choice、またはレベルが 1 つの Score では、どの入力にも同じ回答が返されます |
| DEC010 | unused-disable | warning | decisionlint-disable コメントが何も抑制していないため、後から追加される検出結果を隠すことしかできません |
| DEC011 | description-repeats-name | info | 選択肢の説明が名前を繰り返しているだけか、Noul の基準が「はい」と「いいえ」になっています。Jev は状態を説明と照合しますが、この説明では何も伝わりません |
| DEC012 | terse-instructions | info | 指示が 1 語または 2 語のため、質問は ID に頼っています。Jev に渡されるのは指示であり、ID ではありません |
| DEC013 | newer-model | info | model は、これらのルールを測定した Jev のバージョンより新しいバージョンを指定しているため、そのバージョンでは検出結果のコストが発生しない可能性があり、そのバージョン特有の弱点も検査されません |
| DEC014 | question-limit | error | リクエストの質問数が、送信先のプラットフォームが 1 回の呼び出しで受け付ける数を超えています。プラットフォームに拒否されます |
| DEC101 | double-negative | info | 1 つの節で質問が二重に否定されているか、否定が別の否定に直接かかっています |
| DEC102 | arithmetic | warning | 質問で Jev に数値の計算または比較を求めています |
| DEC103 | date-comparison | info | 質問で Jev に 2 つの時点の順序付け、またはその間隔の測定を求めています |
| DEC104 | compound | off | Noul で「and」によって 2 つの判断を結び付けています |
| DEC105 | generation | warning | 質問で値、または文章の作成を求めています |
| DEC107 | negated-noul | off | 基準のない Noul が、「はい」が何かの不在を意味するような表現になっています |
| DEC108 | inverted-criteria | off | Noul の true の基準が、否定的なケースを表しています |
| DEC110 | degree-levels | off | Score のレベルが程度を表す語、単独のラベル、または 1 つの語を強弱で表したものです。Jev が状態と照合するものがありません |
| DEC111 | numeric-encoding | off | 質問で値を 16 進数または RGB の表記で参照しています |
| DEC112 | undefined-boundary | off | 基準のない Noul が、「大きい」「よく」「十分」などの語を条件にしています |
| DEC301 | model-counting | warning | Jev は質問に数え上げまたは計算が必要だと解釈しています |
| DEC302 | model-undefined-boundary | info | Jev は Noul を、明確な境界が示されていない程度の問題を条件にしていると解釈しています |
| DEC303 | model-overlapping-options | info | Jev は Choice の 2 つの選択肢が同じケースを対象にしていると解釈しています |
| DEC304 | model-overlapping-levels | warning | Jev は Score の 2 つのレベルが同じ状況を表していると解釈しています |
| DEC305 | model-label-mismatch | warning | Jev は、選択肢の名前が示す内容と説明が示す内容が異なると解釈しています |
| DEC306 | model-criteria-off-topic | info | Jev は、基準が指示で尋ねていない事柄を判定していると解釈しています |
| DEC307 | model-ordered-options | info | Jev は Choice の選択肢を 1 つの尺度上の段階と解釈しています。その間の段階は Score で表します |
| DEC308 | model-unordered-levels | info | Jev は Score のレベルを順序のないカテゴリと解釈しています。カテゴリから選ぶ場合は Choice を使います |
| DEC309 | model-depends-on-sibling | info | Jev は、質問の回答に同じリクエスト内の別の質問の回答が必要だと解釈しています |
| DEC310 | model-overlapping-questions | info | Jev は、1 つのリクエスト内の 2 つの質問が同じ判断を求めていると解釈しています |
| DEC311 | model-answer-not-in-state | info | Jev は、ファイルに記述された状態に、質問の対象が含まれていないと解釈しています |
| DEC312 | model-orders-in-state | info | Jev は、ファイルに記述された状態の一部が、その読み手に指示を与えていると解釈しています |
| 各指摘は、専用ページにリンクしています。各ページには、指摘対象となる例、指摘対象にならない例、修正方法、抑制方法が記載されています。各ページから、ルールの出典である TypeSafe のドキュメントにもリンクしています。 |
検査対象
- TypeSafe 形式または OpenAI 形式の JSON および JSONC リクエスト本文。
- JavaScript および TypeScript のオブジェクトリテラル。
client.systemOne(...)およびclient.decisions.create(...)にインラインで渡されるリクエストと、いずれかのベンダー向け Vercel AI SDK のdecide({ questions })も含まれます。typeSafeAi.decisionModel('...')内のモデル ID はモデルとして読み取られます。 @typesafe-ai/sdkを使用するファイル内のnoul()、choice()、score()呼び出し。- Python:辞書、
typesafe_sdkのNoul(...)、Choice(...)、Score(...)、NoulCriteria(...)を使用する LangChain のlangchain_typesafe、またはいずれかをラップするライブラリのクラス、およびsystem_one(...)またはclient.decisions.create(...)に渡されるリクエスト。 - Rust:
json!内の JSON、質問タイプにちなんだ名前の構造体や列挙型バリアント、および::noul(...)形式のコンストラクター。 - Go:文字列キーを持つマップ、
Typeフィールドを持つ構造体、質問タイプにちなんだ名前の構造体、および OpenAI の Go SDK のopenai.DecisionNewParams{...}にあるOfPredicate、OfChoice、OfScoreの質問。 - これらの言語のいずれかで、リクエストを JSON として文字列に貼り付けたもの。
- その他の言語:プログラムに送信するリクエストを
.jev.jsonファイルに書き出させ、それを開いてください。すべてのチェックがそのファイルに対して実行され、実行時に構築される内容はないため、見落とされるものはありません。 oxlint-plugin-jev設定内のjev/askルール。
OpenAI の Decisions API
OpenAI の Decisions API は、モデル gpt-6-luna を使い、Jev と同じ種類の質問を異なる形式で行います。DecisionLint は 0.5.0 からこの形式を読み取ります。対象範囲は次のとおりです。
- 読み取り対象。
/v1/decisionsリクエスト本文、TypeScript および Python のclient.decisions.create(...)、Vercel AI SDK のdecide()。predicateは Noul として、choices: [{ value, description }]は Choice の選択肢として、levels: [{ label, description }]は Score の段階として読み取り、同じルールを適用します。 - チェック対象。 根拠のあるすべてのルール:フォールバック選択肢の欠落、名前を繰り返すだけの説明、簡潔すぎる指示、度合いの段階、重複、カウント、境界の未定義などです。指摘では Luna を明記します。OpenAI 自身のガイドでも同じ内容が求められています。
- 対象外。
DEC002とDEC003はプラットフォームが公開している上限をチェックしますが、OpenAI は上限を公開していないため、OpenAI 向けのリクエストには適用されません。Vercel のように上限を公開しているゲートウェイ向けのリクエストには、両方が適用されます。DEC001は変化する Jev のエイリアスに関するもので、OpenAI のモデル ID は 1 つです。 - 形式の誤りは OpenAI 独自のフィールド名で報告されます。
choicesがマップ形式または名前だけで記述されている場合、Choice にchoicesがない場合、Score にlevelsがない場合などです。誤ったpredicateは電球アイコンから修正できます。形式を組み替える修正は Jev 専用です。 - Luna に質問する。 OpenAI のキーを用意し、このファイルについて Luna に質問を実行するか、
--ask-platform openaiを指定してください。方法は次のセクションで説明します。 - Jev で調整し、Luna 用に独自のカットオフを設定。 文言ルールの各デフォルト値は、その欠陥が
jev-1.13.0にもたらすコストを測定して設定しました。モデルを使ったチェックは、2026-10-24 に調整用データセット全体を対象に Luna で実行し、可能なものについては Luna 自身の回答に基づいてカットオフを設定しました。たとえば 12 件のうち 7 件です。残る 5 件は Luna に質問しません。欠陥ありの例と欠陥なしの例をカットオフで区別できなかったためです。それぞれの妨げとなった例は docs/cutoffs.md に記載されています。文言ルールが Luna にもたらすコストは、まだ測定されていません。
すべてのプラットフォーム
Jev と Luna はモデルの一部であり、TypeSafe と OpenAI はリクエストの送信先の一部です。Microsoft、Liquid AI、Cloudflare は、TypeSafe の形式で独自のモデルを提供しています。OpenRouter、Vercel AI Gateway、LiteLLM、LLM Gateway は、どちらの形式でも、これらのいずれかにリクエストを転送します。llama.cpp、vLLM、Ollaya は、オープンモデルをお使いのマシン上で実行します。DecisionLint は両方の形式を読み取るため、いずれも同じルールでチェックされます。それぞれの違いは、各情報の参照元ページとともに、ひとつのテーブル src/lint/targets.ts にまとめられています。
| プラットフォーム | 指定方法 | キー変数 | 公開されている制限 |
|---|---|---|---|
| TypeSafe | jev-1.13.0、jev-latest | TYPESAFE_API_KEY | 255 個のオプション、10 レベル |
| OpenAI | gpt-6-luna | OPENAI_API_KEY | なし |
| OpenRouter | ~typesafe/jev-latest、typesafe/jev-1.13 | OPENROUTER_API_KEY | なし |
| Vercel AI Gateway | typesafe-ai/jev、openai/gpt-6-luna-decisions | AI_GATEWAY_API_KEY | 255 個の選択肢、10 レベル |
| LLM Gateway | gpt-6-luna-decisions、microsoft-decision-1 | LLM_GATEWAY_API_KEY | なし |
| Liquid AI | d1、d1:free | LIQUID_API_KEY | なし |
| LiteLLM | 設定したエンドポイント | 形式のキー | 1 リクエストあたり 128 個の質問 |
| Eden AI | 独自のパス | 独自のキー | 255 個のオプション |
| llama.cpp | 設定したエンドポイント | なし | 10 レベル |
このテーブルから、次の 3 点がわかります。
- リクエストに適用される制限は、そのプラットフォームのものです。 プラットフォームは、モデル ID の表記で判別できる場合はそこから、ファイル内の URL が示すプラットフォームが 1 つの場合はそこから、またはすべてのリクエストをひとつの送信先に送るプロジェクトでは
decisionlint.jsonのtargetまたはdecisionlint.targetから判別されます。制限を公開していないプラットフォームについては、その制限に関する指摘はありません。リクエストの送信先を示すものがない場合もあります。TypeSafe 形式の質問には TypeSafe の制限が適用され、それ以外の形式には制限が適用されません。 - 浮動エイリアスはすべての表記で検出され、プラットフォームがドキュメントで指定している表記で固定されます。
jev-latestはjev-1.13.0に、~typesafe/jev-latestはtypesafe/jev-1.13に固定されます。 - モデルを使ったチェックは、ID が示すプラットフォームに送信され、そのプラットフォームの変数にあるキーが使われます。すべてのゲートウェイで使われる
openai/gpt-6-luna-decisionsのように、ホストを示さない表記は、推測せずに拒否されます。エンドポイントを設定するまで拒否されます。方法については、次の 2 つのセクションで説明します。
「Open Jev」はこれらのプラットフォームのいずれでもありません。これは、/v1/systemone を再実装する、互いに無関係な少なくとも 9 つのプロジェクトで使われている名前です。llama.cpp が提供するものは ggml-org/OpenJev-GGUF です。それぞれ、設定したエンドポイントとして指定します。
テスト済みの環境
以下の各プラットフォームに対して、稼働中の API を通じて実際にリクエストを送り、それぞれでキャリブレーション用データセット全体を対象に、モデルベースのチェックを実行しました。
- TypeSafe、
jev-1.13.0。Jev の閾値はここで設定しました。 - OpenRouter、
typesafe/jev-1.13。TypeSafe と同じように応答するため、その検出結果はキャリブレーション済みとして扱います。 - LLM Gateway、
jev-1.13.0、および Vercel AI Gateway、typesafe-ai/jev。どちらも OpenAI 形式でリクエストを送るため、Jev の応答が少し変わります。そのため、検出結果には閾値を TypeSafe で設定したことが示されます。 - OpenAI、
gpt-6-luna。Luna の閾値はここで調整しました。また、Vercel AI Gateway、openai/gpt-6-luna-decisionsは OpenAI と同じように応答します。 - Liquid AI、
d1。d1 の閾値はここで調整しました。
1.1.0 以降、Luna と d1 にはそれぞれ独自の閾値があります。各モデルでキャリブレーション用データセット全体を実行して調整したもので、閾値は正しい例を一つも誤検出せず、誤りのある例を少なくとも10件中6件検出します。閾値を設定できないチェックは、そのモデルでは実行されません。Luna では5つ、d1 では2つのチェックが該当します。その他のモデル、またはこれらのモデルでも別の ID や別の経路で利用した場合は、ファミリーの閾値、または Jev の閾値で判定され、検出結果にはその旨が示されます。docs/cutoffs.md には、各閾値、モデルごとに検出した既知の欠陥の数と誤検出した正しい質問の数、実行されない各チェックが実行されない理由、各プラットフォームの応答が同じモデルの別の環境での応答とどの程度異なるかが記載されています。保存済みの実行結果を基に作成しているため、数値は実行結果そのものです。LiteLLM、Eden AI、llama.cpp はまだ実行していません。
ファイルについてモデルに質問する
ルール DEC301 から DEC312 はリンティングの対象ではありません。Ask コマンドのいずれかを実行するか、コマンドラインで --ask を指定した場合にのみ実行されます。各コマンドはファイル内のすべての質問を意思決定モデルに送り、テキストパターンでは検出できない問題について質問します。たとえば、選択肢の重複、説明と矛盾する選択肢名、対象を取り違えた基準、Score にすべき Choice、同じ内容を尋ねる2つの質問、別の質問の回答を必要とする質問などです。
プラットフォームごとにコマンドがあり、それぞれに専用のキーがあります。
| コマンド | 送信先 | デフォルトのモデル | キー |
|---|---|---|---|
| このファイルについて Jev に質問 | TypeSafe | jev-1.13.0 | TypeSafe API キーを設定、または TYPESAFE_API_KEY |
| このファイルについて Luna に質問 | OpenAI | gpt-6-luna | OpenAI API キーを設定、または OPENAI_API_KEY |
| OpenRouter 経由でこのファイルについて質問 | OpenRouter | typesafe/jev-1.13 | OpenRouter API キーを設定、または OPENROUTER_API_KEY |
| Vercel AI Gateway 経由でこのファイルについて質問 | Vercel AI Gateway | typesafe-ai/jev | Vercel AI Gateway API キーを設定、または AI_GATEWAY_API_KEY |
| LLM Gateway 経由でこのファイルについて質問 | LLM Gateway | jev-1.13.0 | LLM Gateway API キーを設定、または LLM_GATEWAY_API_KEY |
| このファイルについて Liquid d1 に質問 | Liquid AI | d1 | Liquid AI API キーを設定、または LIQUID_API_KEY |
| このファイルについて自分のエンドポイントのモデルに質問 | decisionlint.ask.endpoint | decisionlint.ask.endpointModel | エンドポイント API キーを設定、またはなし |
- プラットフォームのキーを、次の3つの方法のいずれかで設定します。... API キーを設定コマンドを実行してキーを貼り付けると、オペレーティングシステムのキーチェーンに保存されます。または、
decisionlint.ask.keysの Settings にプラットフォームの ID を指定して入力します。この設定はユーザー設定でのみ行え、Settings Sync の対象外です。あるいは、プラットフォームで指定されている環境変数にキーを設定し、その環境変数が VS Code の実行環境で利用できるようにします。 - 質問を含むファイルを開き、プラットフォームの Ask コマンドを実行します。
各コマンドが送信するモデルは、プラットフォームごとの decisionlint.ask.models で指定します。TypeSafe のデフォルトはチェックの閾値を設定したバージョンで、それ以外のモデル(Luna を含む)からの検出結果にはその旨が示されます。OpenRouter の typesafe/jev-1.13 はそのバージョンと同じように応答することが確認されているため、その検出結果には表示されません。プローブは TypeSafe のキーとモデルを使って、TypeSafe 上の Jev に問い合わせます。
自分がホストするプラットフォーム(llama.cpp、vLLM、LiteLLM、Ollaya)の場合は、
decisionlint.ask.endpoint に待ち受けている完全な URL を、
decisionlint.ask.endpointModel に提供しているモデル ID を設定し、
パスが /systemone または /decisions で終わらない場合は、
decisionlint.ask.endpointShape に typesafe または openai を設定します。その後、自分のエンドポイントでモデルに質問を実行します。endpoint キーを設定している場合はそのキーを、設定していない場合は、形状に対応する SDK が読み取る TYPESAFE_API_KEY または OPENAI_API_KEY のいずれかを送信します。どちらもない場合はキーを送信しません。これはローカルの llama.cpp に接続する方法です。エンドポイントはユーザー設定でのみ設定できるため、リポジトリが任意のホストにキーを送信させることはできません。
実行する前に知っておくこと:
- 自分のキーとクレジットを使用します。 質問ごとに 1 回、さらにリクエスト本文ごとに 1 回のリクエストを送信します。Jev ではそれぞれ約 800 入力トークン、Luna ではその 2 倍です。TypeSafe の公開価格では質問 1 件あたり数千分の 1 セント、OpenAI では 1〜2 セントです。送信前に表示される件数は切り上げた推定値であり、プラットフォームの請求額とは異なる場合があります。
- 送信されるのは質問のみです。タイプ、指示、基準、ID が送信されます。
decisionlint.ask.sendStateを有効にしない限り、stateは送信されません。有効にすると、ファイルに書き出された state も送信され、さらに、各質問で尋ねている内容が state に含まれているか、state に読み手への命令となるテキストが含まれているかの 2 つのチェックを実行します。 - 実行時に一部が組み立てられる質問は送信されません。 概要に、保留された質問の数が表示されます。
- 1 回の実行で送信されるリクエストは、最大
decisionlint.ask.maxCalls件です。デフォルトは 25 件です。 - 信頼されていないワークスペースでは無効です。 ワークスペース:ワークスペースの信頼を管理を実行し、フォルダーを信頼すると有効になります。
- ファイルを編集すると検出結果は消えます。古いテキストに対する結果だからです。チェック中にファイルを編集または閉じると、チェックは停止します。
- 各検出結果には Jev が示した確率が表示されます。 判定ではなく、数値を添えた議論として扱ってください。
decisionlint.ask.confirm を有効にすると、まずリクエスト数、トークンのおおよその数、費用を知らせ、確認を待ちます。デフォルトでは無効です。コマンドを実行すること自体が、送信の決定となります。
質問を検証する
質問内にカーソルを置き、DecisionLint: カーソル位置の Jev の質問を検証を実行します。その質問と隣に書かれた state を送信し、記述どおりに 3 回、その後、選択肢の順序を反転する、選択肢名を隠す、レベルを反転する、基準を削除するといったレイアウト変更を加えて送信します。回答が変わったかどうかを示すレポートが開きます。
選択肢の順序だけを変えたときに回答が変わるなら、その質問では判断できていません。同じリクエストを 3 回送って回答が一致しない場合、入力だけでは判断できません。
ファイルに state が書き出されている必要があり、その state が送信されます。また、リクエストを 5〜6 件消費します。
この拡張機能でネットワークを使用するのはこれだけです。コマンドラインでは --ask だけがネットワークを使用します。
プロジェクト設定
プロジェクトに decisionlint.json を置くと、エディターとコマンドラインの両方で読み込まれるため、作業中に表示される内容と CI のレポートが一致します。
{
"rules": { "DEC004": "error", "DEC110": "warning" },
"fallbackOptions": ["other", "none", "unsure"],
"ignore": ["DEC004:department"],
"exclude": ["fixtures", "**/*.generated.ts"]
}
exclude には、リンターの対象外にするファイルとフォルダーを、設定ファイルからの相対パスで指定します。** はフォルダーをまたぎ、* は 1 つのフォルダー内にとどまり、スラッシュのない名前は階層を問わず一致します。エディターとコマンドラインでは、同じファイルが対象外になります。
リンター対象のファイルから上に向かって確認し、最も近い設定ファイルが適用されるため、フォルダーごとに設定ファイルを置けます。適用される設定ファイルがある場合、エディターの rules、fallbackOptions、ignore の設定はその内容に置き換えられます。設定ファイルを読み込めない場合は、何もリンターにかけられず、ステータスバーに理由が表示されます。認識されないキーはエラーになるため、タイプミスによってルールがひそかに有効なままになることはありません。
検出結果を 1 件だけ無視するには、電球アイコンを使います。この行の DEC004 を無効化またはこのファイルの DEC004 を無効化を選ぶと、コメントが自動的に書き込まれます。厳密な JSON ではコメントを使えないため、検出結果を無視するには ignore を使います。
検出できないこと
- 適切な形式の質問が、あなたのデータに対して正しいかどうか。 これを判断するには、ラベル付きの例と Jev への呼び出しが必要です。
- 確認できない値に関すること。 変数から組み立てられた質問は読み取り不能として報告され、ステータスバーに件数が表示されます。ファイルの一部が読み取れなかった場合、そのファイルが問題なしと表示されることはありません。
- 文言に関するすべてのこと。
DEC101からDEC112は、英語のテキストに対するヒューリスティックです。ルールが有効になるのは、私たちの実行結果または他の人の実行結果において、質問の書き方の悪さが Jev での回答や信頼度を損なった場合に限られます。また、調整に使っていない公開コードでの検出結果のうち、少なくとも10件中9件が正しい場合にのみ有効な状態を保ちます。TypeSafe のドキュメントにある失敗モードを説明する4つのルール、DEC104、DEC107、DEC108、DEC111は、jev-1.13.0では誤検出がなく、無効になっています。DEC110とDEC112は回答を損ないましたが、2つ目の公開サンプルでは正解率が10件中9件を下回り、それぞれ9件中8件、3件中2件だったため、1.1.0 以降は無効です。いずれもdecisionlint.rulesで有効にできます。さらに2つのルールは、検出するたびに誤りだったため、0.4.0 で削除されました。 - 英語以外の質問に関すること。
- 単独のオブジェクトに不足しているもの。
questionsマップの外にある{ type, instructions }はテンプレートかビルダーの一部かもしれないため、criteriaの欠落はリクエスト内でのみ報告されます。
DEC004 は、根拠となる提案が条件付きのため、情報提供のみのルールです。つまり、選択肢ですべての入力を網羅できない可能性がある場合に、フォールバックを追加するよう提案します。TypeSafe のドキュメントにある Choice の例11件中9件で検出されます。選択肢ですべてを網羅できている場合は、その質問について無効にしてください。
検出結果の抑制
コード内では次のようにします。
// decisionlint-disable-next-line DEC004
const side = { type: 'choice', instructions: 'Heads or tails?', criteria: { heads: null, tails: null } };
decisionlint-disable-line は同じ行を対象とし、decisionlint-disable はファイル全体を対象とします。
コードを指定せずに記述すると、すべてのルールが抑制されます。
何も抑制しないコメントは DEC010 として報告されるため、検出結果を修正した後に残ったコメントが、後から新たな検出結果を隠すことはありません。
JevLint-LE 向けに書かれたものも引き続き機能します。jevlint-le-disable コメントと、コメント内、rules 内、または ignore 内の JEV コードは、今後も読み込まれます。検出結果はすべて DEC コードとともに出力されます。
修正
こちらで判断しなくても修正できる検出結果があります。たとえば、API では true を受け取るのに Noul の criteria キーに yes と記述されている場合、質問の型が誤っている場合、criteria の形式が正しくない場合です。npx decisionlint --fix はこれらを修正し、実行時の概要には修正される件数が表示されます。
エディターでは、保存時の自動修正も同じ処理を行います。
{ "editor.codeActionsOnSave": { "source.fixAll.decisionlint": "explicit" } }
フォールバックの選択肢を追加したり、モデルを固定したりすると、正常に動作しているリクエストの動作が変わるため、自動で書き込まれることはありません。これらは電球メニューに表示されたままになります。
JSON にはコメントを記述できないため、設定を使ってください。
{ "decisionlint.ignore": ["DEC004:side"] }
CLI
エディター以外でも同じ lint が実行できるため、CI や VS Code 以外のエディターでも使えます。
エディターと CI で同じバージョンを使用する
他の linter と同じように、プロジェクトにインストールしてください。
npm install --save-dev decisionlint
すると、エディターは拡張機能に同梱されているコピーではなく、そのコピーを使って lint を実行します。そのため、入力中に表示される結果と、CI で npx decisionlint が報告する内容は同じになります。バージョンは package.json の変更に応じて変わり、全員に一度に反映されます。プロジェクトのコピーが使われている間、ステータスバーには project 0.5.2 と表示されます。
インストールされていない場合、拡張機能は設定なしで独自のコピーを使って lint を実行します。
次の場合も独自のコピーが使われ、ステータスバーには project has 0.2.0 と表示されます。理由はツールチップに表示されます。
- ワークスペースが信頼されていない場合。コピーの読み込み時に、そのコードが実行されるためです
- コピーが0.3.0より古い場合。エディターで読み込み可能になった最初のバージョンです
- コピーの読み込みに失敗した場合、またはその種類のファイルを読み込めない場合
コピーの package.json を読み込めない場合、表示できるバージョンがないため、ステータスバーには project copy unreadable と表示されます。この場合も、理由はツールチップに表示されます。
Ask コマンドとプローブは、プロジェクトに何がインストールされていても、拡張機能独自のコードを常に実行します。
npx decisionlint src/ # a directory, searched for files it reads
npx decisionlint request.jev.json # one file
npx decisionlint --format github . # annotations on a pull request
実行が成功した場合は 0、検出結果によって失敗した場合は 1、指定された処理を実行できなかった場合(不明なオプション、パスの指定漏れ、読み取る対象がない場合)は 2 を返します。エラーがあると実行は必ず失敗します。警告は --max-warnings を超えた場合にのみ失敗の原因になります。
| オプション | 説明 |
|---|---|
--format <stylish|compact|json|github|sarif|junit> | 検出結果の出力形式です。stylish はファイルごとにまとめるデフォルトの形式です。compact は path:line:column の形式で 1 行に 1 件ずつ出力します。sarif はコードスキャン向け、junit はテストレポーター向けです。-f も使用できます |
--rule <CODE=level> | 1 つのルールを off、hint、info、warning または error に設定します。コードの代わりにルール名を使うこともできます。また、warn は warning を意味します |
--config <file> | この設定ファイルを使用し、対象ファイルの近くにある decisionlint.json は使用しません。-c も使用できます |
--max-warnings <n> | n 件を超える警告が報告された場合に失敗させます |
--stdin-filename <path> | 標準入力を指定したファイルとして lint します |
--fix | API が拒否する内容のみを修正し、修正を適用します |
--quiet | エラーのみを出力します |
--ask | 各質問についてモデルにも問い合わせます。モデル ID が示すプラットフォームに質問を送信します。デフォルトでは TypeSafe に TYPESAFE_API_KEY を使用します。--ask-model gpt-6-luna の場合は OpenAI に OPENAI_API_KEY を使用します。OpenRouter、Vercel AI Gateway、LLM Gateway、Liquid AI の場合は、それぞれのプラットフォーム名の表記を使用します。または、--ask-endpoint で指定した宛先に送信します |
--ask-plan | --ask で送信される内容を表示し、送信は行いません |
--ask-platform <id> | --ask の送信先を明示します。typesafe、openai、openrouter、vercel、llmgateway または liquid を指定でき、それぞれ独自のキー変数と、各プラットフォームの表記によるデフォルトモデルを使用します。指定しない場合、モデル ID の表記に応じた送信先が選択されます |
--ask-model <id> | --ask で問い合わせるモデルです。Jev のバージョン、OpenAI の Decisions API 向けの gpt-6-luna、または別のプラットフォームの表記によるモデル ID を指定できます。デフォルトは jev-1.13.0 です |
--ask-endpoint <url> | --ask の送信先となる完全な URL です。セルフホストするプラットフォーム、またはモデル名の表記からホストを特定できないゲートウェイに使用します。DECISIONLINT_ASK_ENDPOINT からも読み取ります。このツールが認識していないホストには、その形式に対応するキーを送信するか、キーを送信しません |
--ask-shape <shape> | --ask-endpoint のパスが /systemone または /decisions で終わらない場合に送信する形式です。typesafe または openai を指定できます。DECISIONLINT_ASK_SHAPE からも読み取ります |
--ask-max-calls <n> | 1 回の実行で --ask が送信できるリクエストの最大数です。デフォルトは 25 です |
--ask-send-state | --ask と併用すると、ファイルに書き出された状態も送信します |
--color, --no-color | デフォルトの形式に色を付けるか、色を付けないようにします。どちらも指定しない場合、NO_COLOR が設定されていなければ、ターミナルでは色付きで出力します |
--no-error-on-unmatched-pattern | 対象パスに lint するファイルがなくても成功させます |
--mcp | MCP サーバーとして実行します |
サマリー行には、全文を読み取れなかった質問の数、サイズが大きいためスキップしたファイル、読み取れなかったフォルダーまたはファイルが必ず示されます。リンクされたフォルダーはたどりません。--ask を指定しない限り、Jev に問い合わせるチェックは実行せず、ネットワークも使用しません。
CI とコミット前
GitHub では、このアクションがプルリクエストに注釈を付けます。
- uses: nolindnaidoo/[email protected]
with:
paths: src
GitHub のコードスキャンでは、SARIF を出力してアップロードします。
- run: npx decisionlint --format sarif src > decisionlint.sarif
continue-on-error: true
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: decisionlint.sarif
--format junit は、Jenkins、GitLab、および多くのテストレポーターが読み取る XML を出力します。実行を失敗させるのはエラーのみであるため、ここで失敗ケースとなるのもエラーのみです。
pre-commit との併用:
- repo: https://github.com/nolindnaidoo/decisionlint
rev: v1.1.0
hooks:
- id: decisionlint
モデルに質問する
--ask は、lint の後に判定モデルへ質問するチェック(DEC301 から DEC312)を実行します。ネットワークを使用する唯一のオプションであり、設定ファイルで有効にすることはできません。
npx decisionlint --ask-plan src/ # what it would send. No key, nothing sent
TYPESAFE_API_KEY=... npx decisionlint --ask src/ # send it
--ask-platformは送信先を指定します。typesafe、openai、openrouter、vercel、llmgateway、liquidのいずれかを指定でき、それぞれに固有の表記によるデフォルトモデルと、対応するキー変数(TYPESAFE_API_KEY、OPENAI_API_KEY、OPENROUTER_API_KEY、AI_GATEWAY_API_KEY、LLM_GATEWAY_API_KEY、LIQUID_API_KEY)があります。指定しない場合、プラットフォーム固有の表記を使った--ask-modelの値、OpenRouter の場合は~typesafe/jev-latestを指定すると、そのプラットフォームに送信されます。単独の ID を指定した場合は、そのベンダーに送信されます。キーは指定された変数からのみ読み取られ、表示されることはありません。--ask-endpointまたはDECISIONLINT_ASK_ENDPOINTを指定すると、自分でホストするプラットフォームに送信できます。パスから形式を判別できない場合は、--ask-shapeも指定します。openai/gpt-6-luna-decisionsのようにホストを特定できない表記は、これらを指定しない限り拒否され、何も送信されません。- 実行時に組み立てられる部分を含む質問は送信されません。サマリーには保留された質問の数が表示されます。
--ask-send-stateを追加しない限り、状態は送信されません。--ask-max-callsは実行全体の上限です。上限を超える場合、実行は終了コード 2 で終了します。そのため、プロジェクトの一部だけをチェックした状態でジョブが成功することはありません。- キーが拒否された場合、リクエストが失敗した場合、または実行を中止した場合も、終了コード 2 で終了します。また、予定していたリクエスト数のうち、何件の回答を得たかが表示されます。
- これらの検出結果はデフォルトでは警告以下であるため、
--ruleで重大度を引き上げるか、--max-warningsを指定した場合にのみ実行が失敗します。
コマンド
すべてのコマンドにショートカットを割り当てることができます。Keyboard Shortcuts を開いて DecisionLint を検索し、一覧の任意のコマンドで割り当てたいキーを押してください。初期状態ではどのコマンドにも割り当てられていないため、現在使用中のショートカットと競合することはありません。
または、keybindings.json に記述することもできます。以下のキーは一例です。
[
{ "key": "ctrl+alt+j", "command": "decisionlint.lintFile", "when": "editorTextFocus" },
{ "key": "ctrl+alt+k", "command": "decisionlint.askJev", "when": "editorTextFocus" }
]
| コマンド | ID |
|---|---|
| このファイル内の質問を lint | decisionlint.lintFile |
| ワークスペース内の質問を lint | decisionlint.lintWorkspace |
| 設定を開く | decisionlint.openSettings |
| このファイルについて Jev に質問 | decisionlint.askJev |
| このファイルについて Luna に質問 | decisionlint.askLuna |
| OpenRouter 経由でこのファイルについて質問 | decisionlint.askOpenRouter |
| Vercel AI Gateway 経由でこのファイルについて質問 | decisionlint.askVercel |
| LLM Gateway 経由でこのファイルについて質問 | decisionlint.askLlmGateway |
| このファイルについて Liquid d1 に質問 | decisionlint.askLiquid |
| エンドポイントのモデルにこのファイルについて質問 | decisionlint.askEndpoint |
| TypeSafe API キーを設定 | decisionlint.setTypeSafeApiKey |
| OpenAI API キーを設定 | decisionlint.setOpenAIApiKey |
| OpenRouter API キーを設定 | decisionlint.setOpenRouterApiKey |
| Vercel AI Gateway API キーを設定 | decisionlint.setVercelApiKey |
| LLM Gateway API キーを設定 | decisionlint.setLlmGatewayApiKey |
| Liquid AI API キーを設定 | decisionlint.setLiquidApiKey |
| エンドポイント API キーを設定 | decisionlint.setEndpointApiKey |
| API キーをクリア | decisionlint.clearApiKeys |
| カーソル位置の質問をプローブ | decisionlint.probeQuestion |
Ask コマンドとプローブはキーを使ってリクエストを送信するため、誤って押さないキーを割り当ててください。
設定
| 設定 | デフォルト | 意味 |
|---|---|---|
decisionlint.rules | {} | ルールごとの重大度を、コードまたは名前で指定します:off、hint、info、warning、error。存在しないルール名またはレベルを指定すると、decisionlint.json の場合と同様に、その理由を示して lint を停止します |
decisionlint.fallbackOptions | other、none、unknown、unclear、uncertain、unsure、ambiguous、undetermined、neither、not stated、not applicable、insufficient evidence、cannot tell、n/a、およびその他5言語での「other」 | DEC004 で選択肢をフォールバックにする語句です。選択肢の名前にこれらのいずれかが単語として含まれていれば該当します。そのため、none_implied と other_or_unclear も該当します |
decisionlint.ignore | [] | 除外する CODE:questionId エントリー |
decisionlint.target | "" | 各リクエストの送信先となるプラットフォームです。制限を適用するために使います。空の場合は、各モデル ID から読み取ります |
decisionlint.ask.models | typesafe の場合は jev-1.13.0、それ以外は各プラットフォーム固有のデフォルト | プラットフォームごとに、Ask コマンドが送信するモデル ID です。TypeSafe のデフォルトは、チェックの調整に使われたバージョンです |
decisionlint.ask.keys | 空 | 各プラットフォームの API キーと、指定したホスト用の endpoint です。キーチェーンを使わず、ここに入力したい場合に設定します。ユーザー設定のみで、同期されません |
decisionlint.ask.endpoint | "" | Ask the Model at My Endpoint が送信先とする URL です。自分でホストするプラットフォーム用です。ユーザー設定のみ |
decisionlint.ask.endpointShape | "" | エンドポイントのパスから形式が判別できない場合に、エンドポイントへ送る形式を typesafe または openai で指定します |
decisionlint.ask.endpointModel | "" | エンドポイントへ送るモデル ID です |
decisionlint.ask.maxCalls | 25 | 1つの Ask コマンドが送信できるリクエストの最大数です |
decisionlint.ask.sendState | false | モデルが状態を確認できるよう、ファイルに記述された状態も送信します |
decisionlint.ask.confirm | false | 有料コマンドが何かを送信する前に、送信内容と費用を表示し、確認を待ちます |
decisionlint.include | JSON、JavaScript、TypeScript、Python、Rust、Go のファイル | ワークスペースコマンドが lint するファイルです |
decisionlint.exclude | node_modules とビルド出力 | ワークスペースコマンドがスキップするファイルです |
decisionlint.maxFileSizeBytes | 1000000 | これより大きいファイルはスキップ対象として報告されます |
decisionlint.notificationsLevel | important | 通知で表示する情報量です。all は各コマンドの後に概要を追加し、silent はコマンドを実行できなかった場合にのみメッセージを表示します。検出結果は常にエディターに表示されます |
プライバシーとセキュリティ
- Lint はネットワークを使用しません。 拡張機能、コマンドライン、MCP サーバーはキーなしで lint を実行し、何も送信しません。テレメトリーも収集しません。
- プラットフォームに接続するのは Ask コマンド、probe、
--ask、および送信を行う2つの MCP ツールだけです。 キーを使って接続し、実行した場合にのみ接続します。decisionlint.ask.sendStateまたは--ask-send-stateを有効にしない限り、送信するのは質問のみで、stateは送信しません。probe は質問の横に記述された状態を送信します。 - キーはリポジトリに保存されません。 Set ... API Key コマンドは、オペレーティングシステムのキーチェーンにキーを保存します。
decisionlint.ask.keysとdecisionlint.ask.endpointはユーザー設定でのみ設定でき、Settings Sync の対象外です。そのため、リポジトリが任意のホストにキーを送るよう指定することはできません。コマンドラインは環境変数からのみキーを読み取り、キーを表示することはありません。 - 信頼されていないワークスペースからは送信できません。 Ask コマンドは無効になり、プロジェクト独自のリンターも読み込まれません。リンターを読み込むとワークスペース内のコードが実行されるためです。
- MCP サーバーは何も書き込みません。 キーはクライアントが MCP サーバーを起動した環境、または MCP サーバーのディレクトリにある
.env.localや.envから読み取り、ツールの引数からは読み取りません。そのため、エージェントのトランスクリプトにキーが記録されることはありません。
ドキュメント
| 内容 | 場所 |
|---|---|
| 製品の概要と今後の予定 | SPEC.md |
| 構築方法と構成の仕組み:アーキテクチャ、不変条件、リリース | AGENTS.md |
| すべてのルールと、検出される例・されない例 | docs/rules |
| 各しきい値と、モデル・プラットフォームごとの検出結果 | docs/cutoffs.md |
| 変更内容 | CHANGELOG.md |
| ツールのページと、同じファミリーのその他のツール | letools.dev/tools/decisionlint |
開発
bun install
bun run typecheck && bun run lint && bun run test
bun run build
bun run test:integration # real VS Code against samples/
bun run package # release/decisionlint-<version>.vsix
bun run test:e2e-vsix # the packaged VSIX in a clean profile
AGENTS.md はエンジニアリング標準です。SPEC.md には製品の概要と今後の予定が記載されています。samples/ は、実際の VS Code を操作する bun run test:integration で使う、意図的に誤りを含めたワークスペースです。
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 つのツールが同じ結果を出すのは、どちらも正しい答えを出したためです。
お問い合わせ — 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 つのサーバーを複数のクライアントで再利用できます。