T-CREATOR

Gemini CLI を Yarn スクリプトに組み込む:再現可能な AI コマンド群の整備術

Gemini CLI を Yarn スクリプトに組み込む:再現可能な AI コマンド群の整備術

Gemini CLI を Yarn スクリプトに組み込むことで、チーム全体で再現可能な AI コマンド環境を構築できます。この記事では、プロジェクト固有の AI タスクを標準化し、誰でも同じ結果を得られる開発環境の整備方法をご紹介します。

背景

近年、AI を活用した開発が一般的になってきました。Gemini CLI は Google の生成 AI を CLI から利用できるツールですが、個々の開発者が独自にコマンドを実行していると、チーム間で結果が異なったり、再現性が失われたりする問題が発生します。

以下の図は、Gemini CLI を直接利用する場合と Yarn スクリプト経由で利用する場合の違いを示しています。

mermaidflowchart TB
  dev1["開発者 A"] -->|個別実行| gemini1["Gemini CLI"]
  dev2["開発者 B"] -->|個別実行| gemini2["Gemini CLI"]
  dev3["開発者 C"] -->|個別実行| gemini3["Gemini CLI"]

  gemini1 -->|異なる<br/>パラメータ| result1["結果 A"]
  gemini2 -->|異なる<br/>パラメータ| result2["結果 B"]
  gemini3 -->|異なる<br/>パラメータ| result3["結果 C"]

  style result1 fill:#ffcccc
  style result2 fill:#ffcccc
  style result3 fill:#ffcccc

直接実行では、各開発者が異なるパラメータやプロンプトを使用するため、結果に一貫性がありません。

課題

Gemini CLI を開発プロジェクトで活用する際、以下のような課題に直面します。

パラメータの属人化

開発者ごとに異なるパラメータ(temperature、max_tokens など)を使用すると、同じプロンプトでも異なる出力が得られてしまいます。この属人化により、レビューや品質管理が困難になるでしょう。

プロンプトの散逸

有用なプロンプトがドキュメント化されず、個々の開発者のローカル環境に散在すると、チームの知見が蓄積されません。新メンバーが同じタスクを実行する際、一から試行錯誤する必要が生じますね。

実行コマンドの複雑化

Gemini CLI のオプションは多岐にわたります。長いコマンドラインを毎回入力するのは、ミスの原因となりますし、効率的ではありません。

以下の図は、これらの課題がどのように連鎖するかを示しています。

mermaidflowchart LR
  A["パラメータの<br/>属人化"] --> D["再現性の<br/>欠如"]
  B["プロンプトの<br/>散逸"] --> D
  C["コマンドの<br/>複雑化"] --> E["ミスの<br/>増加"]
  D --> F["品質の<br/>ばらつき"]
  E --> F

  style F fill:#ff6b6b

これらの課題が重なると、最終的にプロジェクト全体の品質にばらつきが生じてしまいます。

解決策

Yarn スクリプトに Gemini CLI を組み込むことで、上記の課題を解決できます。具体的には以下のアプローチを取ります。

package.json によるコマンド管理

プロジェクトの package.json にスクリプトを定義することで、全メンバーが同じコマンドを実行できる環境を構築します。パラメータやプロンプトはファイルとしてバージョン管理され、変更履歴も追跡可能になりますね。

環境変数による設定の外部化

API キーなどの機密情報は .env ファイルで管理し、コードリポジトリには含めません。これにより、セキュリティを保ちながら設定を共有できます。

タスク別スクリプトの作成

コードレビュー、ドキュメント生成、テストケース作成など、プロジェクト固有のタスクごとにスクリプトを用意します。これにより、コマンドの意図が明確になり、実行も簡単になるでしょう。

以下の図は、Yarn スクリプト化による解決の全体像を示しています。

mermaidflowchart TB
  pkg["package.json"] -->|定義| scripts["Yarn スクリプト"]
  env[".env ファイル"] -->|設定読込| scripts
  prompts["プロンプト<br/>ファイル"] -->|入力| scripts

  scripts -->|標準化された<br/>実行| gemini["Gemini CLI"]
  gemini -->|一貫した<br/>結果| output["統一された<br/>出力"]

  dev_all["全開発者"] -->|同じコマンド| scripts

  style output fill:#69db7c
  style scripts fill:#339af0

全開発者が同じ Yarn スクリプトを実行することで、統一された結果が得られます。

具体例

ここからは、実際の実装例をステップごとに見ていきましょう。

Step 1: プロジェクトのセットアップ

まず、プロジェクトディレクトリを作成し、必要なパッケージをインストールします。

bashmkdir my-ai-project
cd my-ai-project
yarn init -y

次に、Gemini CLI をプロジェクトに追加しましょう。

bashyarn add -D @google/generative-ai
yarn add -D dotenv

Step 2: ディレクトリ構造の作成

プロジェクト内に、プロンプトや設定を管理するディレクトリを作成します。

bashmkdir -p scripts/prompts
mkdir -p scripts/configs

ディレクトリ構造は以下のようになります。

luamy-ai-project/
├── package.json
├── .env
├── .gitignore
└── scripts/
    ├── prompts/
    │   ├── code-review.txt
    │   └── doc-generator.txt
    └── configs/
        └── gemini-config.json

Step 3: 環境変数の設定

.env ファイルを作成し、Gemini API キーを設定します。

bashGEMINI_API_KEY=your_api_key_here
GEMINI_MODEL=gemini-1.5-pro

セキュリティのため、.gitignore.env を追加しておきましょう。

bash# .gitignore
.env
node_modules/

Step 4: プロンプトファイルの作成

再利用可能なプロンプトをファイルとして保存します。まず、コードレビュー用のプロンプトを作成しましょう。

txt以下のコードをレビューしてください。以下の観点で評価をお願いします:

1. コードの可読性
2. パフォーマンスの問題
3. セキュリティ上の懸念
4. ベストプラクティスへの準拠

コード:
{CODE}

レビュー結果は以下の形式で出力してください:
- 評価(良好/要改善/問題あり)
- 具体的な指摘事項
- 改善提案

このファイルを scripts​/​prompts​/​code-review.txt として保存します。

Step 5: 設定ファイルの作成

Gemini CLI のパラメータを JSON ファイルで管理します。

json{
  "temperature": 0.7,
  "maxOutputTokens": 2048,
  "topP": 0.95,
  "topK": 40
}

このファイルを scripts​/​configs​/​gemini-config.json として保存しましょう。

Step 6: CLI ラッパースクリプトの作成

Node.js スクリプトで Gemini CLI を呼び出すラッパーを作成します。

javascript// scripts/gemini-cli.js
require('dotenv').config();
const fs = require('fs');
const path = require('path');

環境変数と必要なモジュールを読み込みます。

次に、Google Generative AI ライブラリを初期化する部分を実装しましょう。

javascript// Gemini API の初期化
const {
  GoogleGenerativeAI,
} = require('@google/generative-ai');
const genAI = new GoogleGenerativeAI(
  process.env.GEMINI_API_KEY
);

設定ファイルとプロンプトファイルを読み込む関数を作成します。

javascript// 設定ファイルの読み込み
function loadConfig(configPath) {
  const fullPath = path.join(
    __dirname,
    'configs',
    configPath
  );
  return JSON.parse(fs.readFileSync(fullPath, 'utf-8'));
}

// プロンプトファイルの読み込み
function loadPrompt(promptPath) {
  const fullPath = path.join(
    __dirname,
    'prompts',
    promptPath
  );
  return fs.readFileSync(fullPath, 'utf-8');
}

メインの実行関数を実装します。この関数は、プロンプトと設定を受け取り、Gemini API を呼び出すものです。

javascript// Gemini CLI の実行
async function runGemini(
  promptFile,
  configFile,
  variables = {}
) {
  const config = loadConfig(configFile);
  let prompt = loadPrompt(promptFile);

  // プロンプト内の変数を置換
  Object.keys(variables).forEach((key) => {
    prompt = prompt.replace(`{${key}}`, variables[key]);
  });

  const model = genAI.getGenerativeModel({
    model: process.env.GEMINI_MODEL,
  });

  const result = await model.generateContent({
    contents: [{ role: 'user', parts: [{ text: prompt }] }],
    generationConfig: config,
  });

  return result.response.text();
}

コマンドライン引数を処理し、実行する部分を追加しましょう。

javascript// コマンドライン引数の処理
async function main() {
  const args = process.argv.slice(2);
  const promptFile = args[0];
  const configFile = args[1] || 'gemini-config.json';

  // 標準入力からコードを読み込む
  let inputCode = '';
  if (!process.stdin.isTTY) {
    inputCode = fs.readFileSync(0, 'utf-8');
  }

  const variables = { CODE: inputCode };
  const response = await runGemini(
    promptFile,
    configFile,
    variables
  );

  console.log(response);
}

main().catch(console.error);

Step 7: package.json へのスクリプト登録

package.json に Yarn スクリプトを定義します。まず、基本的なスクリプト構造を追加しましょう。

json{
  "name": "my-ai-project",
  "version": "1.0.0",
  "scripts": {
    "ai:review": "node scripts/gemini-cli.js code-review.txt gemini-config.json",
    "ai:doc": "node scripts/gemini-cli.js doc-generator.txt gemini-config.json",
    "ai:test": "node scripts/gemini-cli.js test-generator.txt gemini-config.json"
  }
}

これにより、チームメンバーは以下のようなシンプルなコマンドで AI 機能を利用できます。

Step 8: 実行例

作成したスクリプトを実際に使用してみましょう。コードレビューを実行する例です。

bash# ファイルの内容をパイプで渡す
cat src/utils/helper.js | yarn ai:review

標準入力からコードを受け取り、Gemini がレビュー結果を返してくれます。

複数のファイルを一括でレビューすることも可能です。

bash# 複数ファイルのレビュー
find src -name "*.js" -exec sh -c 'echo "=== {} ===" && cat {} | yarn ai:review' \;

Step 9: より高度な活用例

Git のプレコミットフックと組み合わせることで、コミット前の自動レビューも実現できます。

bash# .git/hooks/pre-commit
#!/bin/bash

# ステージングされたファイルを取得
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".js$")

for FILE in $STAGED_FILES; do
  echo "Reviewing $FILE..."
  cat $FILE | yarn ai:review > "/tmp/review-$FILE.txt"
done

echo "All reviews completed!"

CI/CD パイプラインに組み込む例も見てみましょう。

yaml# .github/workflows/ai-review.yml
name: AI Code Review

on: [pull_request]

jobs:
  ai-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      - name: Install dependencies
        run: yarn install
      - name: Run AI Review
        env:
          GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
        run: |
          git diff origin/main...HEAD --name-only | \
          grep ".js$" | \
          xargs -I {} sh -c 'cat {} | yarn ai:review'

実装の要点(図解付き)

以下の図は、実装した仕組みがどのように動作するかを示しています。

mermaidsequenceDiagram
  participant Dev as 開発者
  participant Yarn as Yarn CLI
  participant Script as ラッパー<br/>スクリプト
  participant File as ファイル<br/>システム
  participant API as Gemini API

  Dev->>Yarn: yarn ai:review
  Yarn->>Script: node gemini-cli.js
  Script->>File: プロンプト読込
  Script->>File: 設定読込
  Script->>File: コード読込
  Script->>API: リクエスト送信
  API->>Script: レスポンス
  Script->>Dev: 結果出力

開発者が Yarn コマンドを実行すると、ラッパースクリプトが必要なファイルを読み込み、Gemini API を呼び出して結果を返します。

まとめ

Gemini CLI を Yarn スクリプトに組み込むことで、以下のメリットが得られます。

まず、再現可能性の向上です。全メンバーが同じパラメータ・プロンプトを使用するため、一貫した結果が得られるようになりました。これにより、レビューや品質管理が容易になりますね。

次に、知見の蓄積です。プロンプトや設定をファイルとしてバージョン管理することで、チームの知見が組織的に蓄積されます。新メンバーもすぐに活用できるでしょう。

さらに、作業効率の向上も実現できます。複雑なコマンドラインを覚える必要がなく、シンプルな Yarn コマンドで AI 機能を利用できるため、開発速度が向上します。

そして、CI/CD との統合も容易です。スクリプト化により、自動化パイプラインへの組み込みがスムーズに行えます。

最後に、セキュリティの確保です。環境変数で API キーを管理することで、機密情報の漏洩リスクを最小限に抑えられますね。

Gemini CLI と Yarn スクリプトの組み合わせは、AI を活用した開発環境の標準化において非常に有効です。ぜひ、皆さんのプロジェクトでも導入を検討してみてください。

関連リンク