記事の校正で、AI特有の言い回しを毎回目視でチェックするのに疲れたので、textlintをローカルに導入した。同じ設定でまた迷わないよう、手順を残しておく。


    導入

    ホームディレクトリ直下で npm install すると、~/node_modules が配下のすべてのディレクトリから親として参照されるようになり、別のプロジェクトに影響が出ることがある。専用ディレクトリを切る。

    mkdir -p ~/tools/textlint-ai && cd ~/tools/textlint-ai
    npm init -y
    npm i -D textlint @textlint-ja/textlint-rule-preset-ai-writing

    設定ファイル

    .textlintrc.json を作成する。ここでハマりやすいのがルール名の書き方で、パッケージ名とrcファイル内のキー名が一致しない。

    {
      "rules": {
        "@textlint-ja/preset-ai-writing": true
      }
    }

    パッケージ名は @textlint-ja/textlint-rule-preset-ai-writing だが、rcのキーは @textlint-ja/preset-ai-writing になる。textlint-rule- の部分が省略される。ここを間違えると「ルールが見つからない」エラーになる。


    コマンド化

    毎回パスを打つのは手間なので、~/.zshrc に関数を足す。

    ailint() {
      local d="$HOME/tools/textlint-ai"
      "$d/node_modules/.bin/textlint" -c "$d/.textlintrc.json" "$@"
    }

    source ~/.zshrc で反映すれば、どのディレクトリからでも ailint 記事.md で実行できる。バイナリとconfigを絶対パスで指定しているので、カレントディレクトリに関係なく動く。


    使い方

    ailint "記事.md"

    指摘がなければ何も出力されない。何か表示されて初めて動いていると考えがちだが、textlintは無出力が正常終了のサインになる。

    指摘が出た場合の例。

    3:1   error  リストアイテムでの強調(**)とコロン(:)の組み合わせは機械的な印象を…  no-ai-list-formatting
    7:3   error  「革命的な」という表現は過度に誇張的である可能性があります…            no-ai-hype-expressions
    9:13  error  述語とコロンで終わるパターンは…                                        no-ai-colon-continuation

    行番号とルール名が出るので、該当箇所を見て直す。


    --fix に期待しない

    textlint --fix はほぼ効かない。プリセット5ルールのうちfixerを持つのは no-ai-emphasis-patterns の「見出し内の太字を外す」1箇所だけで、それも発火しないケースがある。実行すると「1 fixable problem」と出るのに、ファイルの中身が変わらないことがある。

    これは手抜きではなく意図的な設計だと考えている。助詞の挿入で文章が壊れた実例がある以上、機械的な修正は判断が必要な箇所まで踏み込むと事故る。指摘だけに留めて、直すのは書き手に任せる設計の方が安全ということだと思う。


    誤検知の除外

    記事の中でメール件名の説明として ⚠️【要確認】 のような絵文字入り文字列をコードとして引用すると、装飾目的の絵文字と区別がつかず指摘される。バッククォートで囲まれた箇所だけ除外する設定を .textlintrc.json に足しておく。

    {
      "rules": {
        "@textlint-ja/preset-ai-writing": {
          "no-ai-list-formatting": {
            "allows": ["/`[^`]*[✅⚠️❌][^`]*`/"]
          }
        }
      }
    }

    チェックされる内容

    5つのルールで構成されている。

    • no-ai-list-formatting — - **項目**: 説明 のような強調とコロンの組み合わせ、リスト内の装飾絵文字
    • no-ai-hype-expressions — 「効果的な」「完全に」「優れた」のような誇張表現
    • no-ai-emphasis-patterns — 「注意」「ポイント」のような太字プレフィックス
    • no-ai-colon-continuation — 述語+コロンで文を終えてリストを続ける構文(形態素解析で判定)
    • ai-tech-writing-guideline — 冗長表現や表記ゆれなど。既定でseverityがinfoなので、従うかどうかは任意

    最後のルールだけ厳格さが違う。「適切な」「効率的な」のような一般的な語も拾うので、助言として読むくらいがちょうどいい。


    まとめ

    導入は10分もかからないが、rcファイルのキー名の違いと、--fix が効かないことの2点だけは知らずに使うとつまずく。指摘を直すのは自分の仕事という前提で使うツールだと捉えておくと、期待値のズレがない。