bitA Tech Blog
📝

Vibe codingによって生成されたコードの品質を担保するためにUltraciteを使ってみた

に公開

背景

Cursor + Claude codeでVibe codingすると、AIにプロンプトを投げてから5分も待てばほぼプロンプトの要件を満たしているコードが生成されます。
しかし生成されたコードを眺めてみると、

  • 1ファイル300行以上
  • ロジックが複雑
  • アンチパターンを含んでいる
    などの問題が見受けられました。
    これらの問題を含んだコードは可読性が低く、微調整や修正を人の手で行う際に問題となる可能性があります。

故に、Vibe codingに一定のルールをつけられるツールをずっと探していました。
自分の要望としては

  • 複雑の設定不要
  • 実行スピードが速い
  • ずっと更新されてるもの

そんな中、XでUltraciteを知り、これが求めていたツールかもしれないと思いました。

本文の目的

  • Ultraciteの紹介
  • Ultraciteを使ってみて、Vibe codingの「動けばOK」という問題が解決されたかどうかを検証する

Ultraciteとは

AI ReadyのBiomeをベースにしたlintツールです。
最近では知名度がどんどん上がっているReactのUIライブラリshadcn/uiの作者にも使われてます。
*Biomeはrustベースのlintツールです。

Ultraciteの特徴

  • Biomeベースなので実行スピードが速い
  • zero configで設定可能
  • MCPサポート
  • VS Code、Cursor、Windsurf とClaude codeなどに対応していて、同じルールが適用されてる
  • 自由にlintルールを変えることができる
  • 成長が速い

    npmtrendsのデータ

Ultraciteを導入して試していきましょう

実行環境

Biomeの拡張機能をインストールする

以下のURLにてBiomeの拡張機能をインストールする。
https://marketplace.visualstudio.com/items?itemName=biomejs.biome

*インストールしない場合、ファイル保存時の自動formatが効かなくなります。この機能を必要としない方はインストールしなくても良いです。

プロジェクト初期化

新規Next.jsプロジェクトを作ります。
*現時点ではReactとの相性が良いです、他のフレームワークとの相性はこちらで確認できます。

pnpm create next-app@latest
# ESlintはNOにしてください、他の選択肢は任意で大丈夫です。
 What is your project named? try-ultracite
 Would you like to use TypeScript? No / Yes
 Would you like to use ESLint? No / Yes #ここは必ずNOにしてください
 Would you like to use Tailwind CSS? No / Yes
 Would you like your code inside a `src/` directory? No / Yes
 Would you like to use App Router? (recommended) … No / Yes
 Would you like to use Turbopack for `next dev`? … No / Yes
 Would you like to customize the import alias (`@/*` by default)? … No / Yes

UIを統一するため、shadcn/uiをインストールします。
ここは任意のUIライブラリも使用可能です、また、インストールしなくても大丈夫です。

pnpm dlx shadcn@latest init
 Preflight checks.
 Verifying framework. Found Next.js.
 Validating Tailwind CSS config. Found v4.
 Validating import alias.
 Which color would you like to use as the base color? Neutral
 Writing components.json.
 Checking registry.
 Updating CSS variables in src/app/globals.css
 Installing dependencies.
 Created 1 file:
  - src/lib/utils.ts

Success! Project initialization completed.
You may now add components.

Ultraciteの初期化

rootフォルダでnpx ultracite@latest initを実行する。
package managerを自動検知できるため、pnpm dlxなどの使用は不要です。

  Detected lockfile, using pnpm add

  Which editors do you want to configure (recommended)?
 VSCode / Cursor / Windsurf # スペースキーで選択可能です、半角スペース以外反応しないのでご注意ください。
 Zed
# 以下の設定は自分の好みで行なってください、今回はCursorとClaude codeにします。
  Which editor rules do you want to enable (optional)?
  Cursor, Claude Code

  Would you like any of the following (optional)?
  none # huskyを設定できますが、今回はなしで

選択完了後に、以下のメッセージが自動的に出てきます。

  Dependencies installed

  tsconfig.json updated

  Biome configuration created

  settings.json created

  GitHub Copilot rules created

  Cursor rules created

  Claude Code rules created

  Pre-commit hook created

  lint-staged updated

  Successfully initialized Ultracite configuration!

Ultracite mcpの設定

以下のjsonをmcp設定ファイルに追加する(mcp設定ファイルわからない場合、ご使用しているIDEの公式ドキュメントを参考にしてください)

{
  "mcpServers": {
    "ultracite": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://www.ultracite.ai/api/mcp/mcp"
      ]
    }
  }
}

claude codeの場合はプロジェクトのフォルダで以下のbashを実行してください

claude mcp add ultracite -s project -- npx -y mcp-remote https://www.ultracite.ai/api/mcp/mcp

scriptsの設定

package.jsonに以下のコードを追加する。(既存ある場合は上書きしてください)

"scripts": {
    "lint": "ultracite lint", 
    "format": "ultracite format"
}

lintはコードのチェックだけ行います。
formatはコードのチェックと同時にコードのチェックツールのルールに沿って、自動修正も行います。

shadcn/uiを対象外にする

shadcn/uiのコンポーネントをlint対象外にする

biome.jsonc
{
  "$schema": "https://biomejs.dev/schemas/2.1.2/schema.json",
  "extends": ["ultracite"],
  "files": {
    "includes": ["**", "!**/src/components/ui/**/*.tsx"]
  }
}

はい、これで設定完了です!

使い方

  • 構文チェックツールとして使いたい時

    • 拡張機能をインストールしている場合、保存時にformatを実行してくれます。
    • 全ファイルをlintやformatしたい場合、
      npx ultracite lintまたはnpx ultracite formatを実行してください。
  • Vibe codingする時
    AI rulesは初期化の時に設定されたと思います。
    ですが、念の為Vibe codingを始める際に以下のようなことを伝えると良いと思います。

    • use Ultracite rule from mcp server
    • mcpからUltraciteのルールを取得し、ルールに従ってコードを書いてください

これで、AIが常にベストプラクティスに沿ってコードを書いてくれます!

ルール取得できるかどうかを検証するため、Claude codeに簡単なPromptを渡します

プロンプト

use Ultracite rule from mcp

create a todo app\
  - use motion/react to create animation\
  - todo card can be dropped\
  - use shadcn/ui

上記のプロンプトをAIに渡したら無事にUltraciteからルールを取得できました。

# AIレスポンスの一部抜粋
> get ultracite rule
  - Don't use `accessKey` attribute on any HTML element.                             
     - Don't set `aria-hidden="true"` on focusable elements.
     - Don't add ARIA roles, states, and properties to elements that don't support them.
 +268 lines (ctrl+r to expand)

完成後は自動的にlintとformatしてくれます

 Bash(pnpm lint)
  Error: npm warn Unknown env config "verify-deps-before-run". This will stop working in the next major version of npm.
     npm warn Unknown env config "_jsr-registry". This will stop working in the next major version of npm.
     .claude/settings.local.json format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

       × Formatter would have printed the following content:
       
         10 10     },
         11 11     "enableAllProjectMcpServers": true,
         12 - ··"enabledMcpjsonServers":·[
         13 - ····"ultracite"
 +244 lines (ctrl+r to see all)

 I need to format the code to fix the linting issues:

 Bash(pnpm format)
  > try-ultracite@0.1.0 format /Users/rishinnan/Downloads/myproj/todo/try-ultracite
     > ultracite format
 +3 lines (ctrl+r to expand)

 Now let's run the lint check again:

⏺ Bash(pnpm lint)
  ⎿  > try-ultracite@0.1.0 lint /Users/rishinnan/Downloads/myproj/todo/try-ultracite
     > ultracite lint
     … +3 lines (ctrl+r to expand)

*コードはルールに従って書いてくれましたが、量が多いため、記事には載せないようにします、興味ある方はぜひ自分で試してみてください。

最後に

実際に検証してみた結果、Ultraciteを使うことでVibe codingの出力品質が大幅に改善されました。AIが生成するコードも一貫したルールに従うようになり、後からの読み解きが格段に楽になります。
また、vibe codingしなくてもUltraciteはlintツールとしても使えるので、今後、個人プロジェクトではUltraciteを採用したいと思います。
興味のある方は、公式ドキュメントを参考に、ぜひ使ってみてください。
最後まで読んでいただきありがとうございました!

参考リンク

bitA Tech Blog
bitA Tech Blog

Discussion