日本語の文章、コードのコメント・静的な文言から「AI 臭さ」を機械的に拾う Rust 製の Linter
noslop は、日本語の文書やコード内のコメント・静的な文字列・JSX/HTML の文言を対象に、LLM が書いた文章に出やすい癖を決まった規則で指摘する Linter です。と言えるでしょう のような定型句、〜ではなく の対比の繰り返し、文の長さがそろいすぎた単調なリズム、見出しと太字だけで組んだ教科書的な構成を検出します。
noslop は「この文章は AI が書いた」と判定する道具ではありません。書き手は自分の文章の癖に気づきにくく、長い文書を目で追うと必ず見落としが出ます。noslop は疑わしい箇所を並べるところまでを受け持ち、直すか残すかは書き手が文脈で決めます。残すと決めた箇所には、理由を添えた抑制コメントを書けます。
文字種と語句のパターン、文長の統計で判定し、品詞で数えるルール(「の」の連鎖・連続漢字・実験的な名詞句の列挙)は、形態素解析の辞書で判定します。辞書を同梱した単一のバイナリで動き、起動も速く、大きなリポジトリでもファイルを並列に処理します。
- 辞書を同梱: 形態素解析器 hasami の IPAdic の辞書をバイナリに同梱し、「の」の連鎖(P16)と連続漢字(P15)を品詞で判定する。インストールも設定も要らない(形態素解析の辞書)
- 校正済みの閾値: 人間とモデル 7 種の文書で誤検知率を確かめた語句と閾値だけを既定で有効にする。未校正のものは実験的ルールとして明示的に有効にしたときだけ動く
- 2 つのレーン: AI 臭さ(
slop)と読みやすさ(readability)の指摘を分けて出す。文書全体の点数は出さず、指摘とその件数だけを並べる - Markdown を理解する: コードブロック・インラインコード・URL・文書の先頭の front matter(YAML の
---・TOML の+++)を除き、見出し・リスト・表・引用を区別して解析する。文書の途中の---は区切り線か見出しの下線として読み、本文を捨てない - コードの文言も読む: コードのファイルは、tree-sitter で取り出したコメント、日本語の静的な文字列、JSX/HTML の本文・表示属性を検査する。補間や別々のボタン名は独立した断片として扱い、指摘は元のファイルの行・列で示す(コードのコメントと静的な文言)
- 括弧を考慮した文分割: 形態素解析器 hasami の辞書を使わない文分割を使う。「」や()の内側の句点では文を切らず、閉じ忘れた括弧があっても後続の文を巻き込まない。
Yahoo!ニュースのように文末記号を含む語の途中でも切らない - 判断を記録できる:
<!-- noslop-disable-next-line P01 -- 引用のため -->のように、残す理由を文書に書ける - CI 向けの出力: text(色付き)・JSON(安定したスキーマ)・GitHub Actions の注釈に対応する。既定ではジョブを落とさない
- AI エージェントに渡せる: 直す箇所をルールごとにまとめた改稿指示を、Markdown・JSON・TOON(同じ内容を少ないトークンで表す形式)で出せる。MCP サーバー(
noslop mcp)、Claude Code のフック(noslop hook claude-code。書いた直後、gws で Google ドキュメント・スプレッドシートに書き込む前、応答を終えたとき)、claw-hooks から呼ぶ入口(noslop hook commandなど)、スキル(noslop skill-install)で、書いた AI 自身に見直させる。gws の書き込み前に読める値とコマンドの形は連携方法にまとめた - 文体の混在を見直す: 実験的な R20 を
--enable-rules R20で有効にすると、全文が対象の文書で、本文全体のです・ます調と言い切りの混在を確認できる。引用・会話・独立した断片を除き、部分差分では判定を実行しない - 変更した箇所だけを見直す:
noslop check --git-diffで、コミットしていない変更に重なる指摘を JSON・TOON などで取り出せる(変更した箇所の検査) - 改稿を比べる:
noslop diffで、改稿で新しく出た指摘・消えた数字や固有名詞・文書全体に一律に当てた直しを確かめる - 手元のコーパスで校正できる:
noslop calibrateで、人の文書と生成文書からルールごとの誤検知率・検出率を測り、閾値を選ぶ
文言を読めるコードの言語(拡張子と設定は コードのコメントと静的な文言 にあります):
Claude Code が書いたコードのコメントを noslop のフックで検査し、指摘を受けた Claude Code が文章を修正している様子です。
応答を終えたときのフック(Stop)は、コミットしていない変更に重なる指摘を返します。次の画面では、Claude Code が 2 件の指摘を文脈で見直し、言い換えにすぎない対比を肯定文に書き換えています。読み手の誤解を正す対比は、理由を添えて残しています。
設定手順は AI エージェントへの導入 を参照してください。
- OS: macOS、Linux、Windows
- Rust: 1.98 以上(ソースからビルドする場合)
brew install owayo/noslop/noslopRust 1.98 以上が必要です。
cargo install --git https://github.com/owayo/noslop --lockedReleases から自分の環境のアーカイブを取得して展開し、noslop を PATH の通った場所に置きます。各リリースには、取得したファイルを確かめるための SHA256SUMS も添付しています。
| プラットフォーム | ファイル |
|---|---|
| Linux (x86_64) | noslop-x86_64-unknown-linux-gnu.tar.gz |
| Linux (ARM64) | noslop-aarch64-unknown-linux-gnu.tar.gz |
| macOS (Intel) | noslop-x86_64-apple-darwin.tar.gz |
| macOS (Apple Silicon) | noslop-aarch64-apple-darwin.tar.gz |
| Windows (x86_64) | noslop-x86_64-pc-windows-msvc.zip |
macOS でブラウザから取得した場合は、実行の前に隔離属性を外します: xattr -d com.apple.quarantine noslop。
mise が必要です (Rust のツールチェーンは mise.toml で固定しています)。
git clone https://github.com/owayo/noslop.git
cd noslop
make installmake install は /usr/local/bin に入れます。場所を変えるときは INSTALL_PATH を指定します (例: make install INSTALL_PATH="$HOME/.local/bin")。
アーカイブには LICENSE と THIRD_PARTY_NOTICES.md も含まれます。Homebrew での更新、スキルの導入先、ソースから入れる場合の指定は インストールの補足 を参照してください。
ソースからの導入では、Claude Code と Codex CLI のスキルも ~/.claude/skills/noslop/ と ~/.codex/skills/noslop/ に入ります。make uninstall はスキルを残します。
インストール後は、同梱の IPAdic より語彙の多い辞書を取得することを推奨します。
noslop dict download名前を省くと、hasami が推奨する ipadic-neologd-sudachi(IPAdic + NEologd + SudachiDict)を取得します。辞書を指定しない既定の auto では、次の実行から取得した辞書を使います。取得状況と使う辞書は noslop dict list で確認できます。
辞書の選び方や、同梱の辞書で校正した条件に合わせる設定は 形態素解析の辞書 を参照してください。
ファイルを指定して検査します。ディレクトリを渡すと、その配下の Markdown とテキストをまとめて検査します(.gitignore・.ignore・.noslopignore を尊重します)。
noslop check README.md
noslop check docs --genre tech改稿指示を AI や編集者に渡すなら --report brief を使います。JSON・TOON でも出せます。
noslop check README.md --report brief
noslop check README.md --report brief --format toon改稿後は、指摘の変化に加えて、数字や固有名詞の消失、文書全体に一律に当てた直しを確認できます。
noslop diff draft-v1.md draft-v2.md
noslop explain R01既定では指摘があっても終了コードは 0 です。指摘で CI を止める場合だけ --fail-on warning などを付けます。引数・設定・入出力の誤りは終了コード 2 です。フックの終了コードは呼び出す側の約束に合わせています。
| 調べたいこと | 文書 |
|---|---|
| 全コマンド・オプション・終了コード | CLI リファレンス |
| ルールの ID・レーン・状態 | ルール一覧・各ルールの説明 |
| コードの対応言語・コメントと静的な文言の取り出し方 | コードのコメントと静的な文言 |
| text・JSON・TOON・GitHub 注釈・改稿指示の例 | 出力形式 |
| CI に組み込む例 | GitHub Actions で使う |
| スキル・MCP・フックの導入 | AI エージェントへの導入・連携の仕様 |
| 改稿の確認事項と、点数を出さない理由 | 改稿の比較と指摘の読み方 |
| 辞書の取得・選択・辞書なしの動作 | 形態素解析の辞書 |
| 校正の根拠と測り直しの手順 | 校正の考え方・校正手順 |
ユーザーの設定は ~/.config/noslop/config.toml、プロジェクトの設定は noslop.toml(または .noslop.toml)に置きます。既定値 → ユーザーの設定 → プロジェクトの設定 → CLI の順に、書いた項目を上書きします。
noslop init --user
noslop initgenre = "tech"
[morphology]
dictionary = "bundled"bundled は、品詞で数えるルールを元の校正と同じ同梱の IPAdic で判定する指定です。既定の auto は、取得済みの配布辞書があればそちらを先に選びます。
重ね方・独自ルール・抑制コメント・ジャンルは 設定と抑制コメント に、全項目は 設定の例 にあります。
mise が必要です。ツールの版は mise.toml で固定しています。
make setup # ツールチェーン (mise) と依存を取得する
make ci # CI と同じ検査 (書き換えない)| コマンド | 説明 |
|---|---|
make setup |
ツールチェーン (mise) と依存を取得する |
make build |
デバッグ版をビルドする |
make release |
リリース版をビルドする |
make run |
デバッグ版を実行する (引数は ARGS="...") |
make test |
テストを実行する |
make lint |
clippy を警告ゼロで通す |
make fmt |
コードを整形する (書き換える) |
make fmt-check |
整形済みかを確かめる (書き換えない) |
make check |
整形と静的検査 (書き換えない) |
make ci |
CI と同じ検査 (書き換えない) |
make install |
リリース版を INSTALL_PATH (既定 /usr/local/bin) に入れる |
make uninstall |
INSTALL_PATH から取り除く |
make clean |
ビルド成果物を消す |
make でターゲットの一覧を表示します。リリースは GitHub Actions で行います (Actions → Release → Run workflow)。
辞書を同梱しないビルドのテスト、ルール一覧の再生成、辞書目録の検証、リリースの仕組みとロードマップは 開発とリリース を参照してください。
noslop のルール体系・語句カタログ・閾値の一部は、MIT ライセンスで公開されている日本語の文章作法プロジェクトに由来します。著作権表示とライセンス全文は THIRD_PARTY_NOTICES.md にあります。
文分割には、日本語の形態素解析器 hasami(MIT)の辞書を使わない文分割を使っています。hasami が組み込む例外表(文末記号を含む語の一覧)は、SudachiDict などの辞書データから抽出しています。出典と著作権表示は THIRD_PARTY_NOTICES.md にあります。
既定のバイナリ(feature bundled-dict)には、hasami が mecab-ipadic から作った形態素解析の辞書を同梱しています。mecab-ipadic のライセンス(NAIST-2003)の条文は THIRD_PARTY_NOTICES.md に、辞書の出所は dict/README.md にあります。


