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 を活用した開発環境の標準化において非常に有効です。ぜひ、皆さんのプロジェクトでも導入を検討してみてください。
関連リンク
articleGemini CLI を Yarn スクリプトに組み込む:再現可能な AI コマンド群の整備術
articleGemini CLI と OpenAI CLI を横並び比較:フラグ体系・入出力・コストの違い
articleGemini CLI 認証まわりの落とし穴:期限切れキー/環境変数漏れ/権限不足の対処
articleGemini CLI 使いどころマップ:自動化・解析・生成を横断するユースケース 30
articleGemini CLI のコスト監視ダッシュボード:呼び出し数・トークン・失敗率の可視化
articleGemini CLI を中核にした“AI パイプライン”設計:前処理 → 推論 → 後処理の標準化
articleLangChain 再ランキング手法の実測:Cohere/OpenAI ReRank/Cross-Encoder の効果
articleJotai 非同期で Suspense が発火しない問題の切り分けガイド
articleJest moduleNameMapper 早見表:パスエイリアス/静的アセット/CSS を一網打尽
articleComfyUI ワークフロー設計 101:入力 → 前処理 → 生成 → 後処理 → 出力の責務分離
articleGitHub Copilot でリファクタ促進プロンプト集:命名・抽象化・分割・削除の誘導文
articleCodex で既存コードを読み解く:要約・設計意図抽出・依存関係マップ化
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来