取り組みの背景
AI コーディングツールが普及した今、コードを「速く生成すること」はもはや差別化要因ではありません。重要なのは、生成されたコードの品質をいかに高い水準で維持し続けるかです。
Antigravity エディタは単なるコード生成ツールではなく、コードレビュー・テスト生成・品質分析を統合した AI 開発プラットフォームです。しかし、その能力を最大限に引き出している開発者は意外と少ないのが現実です。
対象読者は、Antigravity の基本操作を習得済みで、さらに一歩進んだ活用方法を模索している中・上級者です。カスタムルールの設定方法やコンテキスト管理の基礎を事前に確認しておくと、より深く理解できます。
AIコード品質の本質的な課題
なぜ AI 生成コードの品質にばらつきが生じるか
AI コード生成の最大の課題は 確率的な非一貫性 です。同じプロンプトを与えても、出力されるコードの品質はセッションごとに変動します。特に以下のような状況でこの問題が顕在化します。
- プロジェクトのコンテキストが不十分な場合
- チームのコーディング規約が AI に伝わっていない場合
- 生成後のレビュープロセスが属人的な場合
この問題を解決するには、AI の生成プロセス自体を構造化すること が最も効果的です。
品質の 3 つの次元
AI コード品質を評価する際は、以下の 3 軸で考えると整理しやすくなります。
- 正確性: バグがなく、仕様通りに動作するか
- 保守性: 将来の変更に対して脆弱でないか
- 一貫性: チームの規約・スタイルに準拠しているか
従来の開発では人間のコードレビューがこれらを担保していましたが、AI を活用することでこのプロセス自体を大幅に効率化・自動化できます。
プロンプトエンジニアリング:品質重視の設計パターン
レビュー視点を組み込んだ生成プロンプト
コードを生成する際に、最初からレビュー観点を含めることで品質が大幅に向上します。
# 品質重視コード生成プロンプトテンプレート
以下の機能を実装してください。
## 要件
[機能の説明]
## 品質基準(必須)
- エラーハンドリング: 全ての外部呼び出しに適切な try-catch を追加
- 型安全性: TypeScript の strict モードに準拠(any 型禁止)
- テスタビリティ: 副作用を分離し、純粋関数として実装
- パフォーマンス: N+1 クエリ問題を避けた実装
- セキュリティ: 入力値のバリデーションを必ず含める
## 出力形式
1. 実装コード(コメント付き)
2. 想定されるエッジケースとその対処法
3. 単体テストのスケルトン(テストケース名のみ)
このプロンプトを Antigravity のカスタムコマンドとして登録することで、チーム全員が同一品質基準でコードを生成できるようになります。
段階的品質向上プロンプト(Iterative Quality Improvement)
一発で完璧なコードを生成しようとするより、段階的に品質を高めるアプローチが効果的です。
# Step 1: まず動くものを作る
[機能の概要説明]を実装してください。まず最小限の動作する実装を作成します。
# Step 2: 堅牢性向上
前の実装をレビューし、以下の観点で改善してください:
- エラーハンドリングの網羅性
- エッジケースへの対応
- パフォーマンスの最適化
# Step 3: テスト駆動での品質確認
改善した実装に対して、以下のテストケースを生成してください:
- 正常系(3パターン以上)
- 異常系(エラー、null、境界値)
- エッジケース
この 3 ステップアプローチにより、最初から完璧を目指すより高品質なコードが安定して得られます。
コンテキスト管理:品質基準の永続化
AGENTS.md による品質ポリシーの定義
プロジェクトのルートに AGENTS.md(または antigravity.md)を配置することで、すべての AI 生成コードに品質基準を自動適用できます。
# プロジェクト品質ポリシー
## コーディング規約
- 言語: TypeScript strict モード必須
- フォーマッター: Biome(設定は biome.json 参照)
- 命名規則: camelCase(変数・関数)、PascalCase(クラス・型)
- ファイル構成: Feature-based モジュール構造
## 必須の実装パターン
- エラーは Result 型でラップして返す(throw 禁止)
- 非同期処理には必ず Promise.allSettled を使用(複数並行時)
- 外部 API コールは必ずリトライロジックを含める(最大3回)
## 禁止パターン
- `any` 型の使用(`unknown` を使用すること)
- `console.log` を本番コードに残す(logger サービスを使用)
- 未使用のインポートや変数
## テスト要件
- カバレッジ目標: ユニットテスト 80% 以上
- テストファイル: `{filename}.test.ts` で同一ディレクトリに配置
- モックは `vi.mock()` を使用(Vitest)
この設定ファイルが存在するだけで、Antigravity はすべてのコード生成・レビューでこれらの基準を自動的に参照します。
.antigravity/quality-rules.json による詳細設定
より細かい品質ルールは JSON 形式で設定できます。
{
"quality": {
"review": {
"focus_areas": [
"security",
"performance",
"error_handling",
"type_safety"
],
"severity_threshold": "warning",
"auto_fix": ["formatting", "imports", "unused_vars"]
},
"generation": {
"require_tests": true,
"require_types": true,
"require_error_handling": true,
"comment_density": "moderate"
},
"metrics": {
"complexity_threshold": 10,
"function_length_max": 50,
"file_length_max": 300
}
}
}
AI コードレビューの自動化
Inline Chat を使ったリアルタイムレビュー
Cmd+I(Mac)または Ctrl+I(Windows/Linux)で起動する Inline Chat は、書いたコードを即座にレビューするのに最適です。
# 効果的なレビュープロンプト集
## セキュリティレビュー
このコードをセキュリティ観点でレビューしてください。
特に以下を確認:
1. SQL インジェクション / XSS の可能性
2. 認証・認可の抜け漏れ
3. センシティブデータの露出リスク
## パフォーマンスレビュー
このコードのパフォーマンスボトルネックを特定してください。
データ量が 10 万件規模になった場合の挙動も考慮してください。
## リファクタリング提案
このコードをより保守性の高い形にリファクタリングしてください。
SOLID 原則に従い、変更理由と改善点を説明してください。
カスタムコマンドによるレビューの標準化
Antigravity のカスタムコマンド機能を使って、チーム共通のレビューコマンドを定義します。.antigravity/commands/ ディレクトリに以下のようなファイルを作成します。
# .antigravity/commands/review-security.md
選択したコードのセキュリティレビューを実施します。
## チェック項目
- [ ] 入力値のバリデーション(XSS, SQLi, Path Traversal)
- [ ] 認証トークンの安全な取り扱い
- [ ] 機密情報のログ出力防止
- [ ] CORS ポリシーの適切な設定
- [ ] Rate Limiting の必要性
## 出力形式
問題点を重大度(Critical/High/Medium/Low)別に列挙し、
各問題に対して具体的な修正案を提示してください。
このコマンドは /review-security で呼び出せるようになり、チーム全員が一貫した基準でセキュリティレビューを実施できます。
テスト自動生成の高度な活用
ユニットテストの体系的生成
Antigravity は実装コードを解析して、網羅的なテストケースを自動生成できます。効果的なプロンプトの例を示します。
以下の関数のユニットテストを Vitest で生成してください。
## テストケース要件
1. 正常系: 最低3パターン(代表的な入力・境界値・大量データ)
2. 異常系: エラーケース全網羅(null, undefined, 型不一致, 範囲外)
3. 副作用: モック対象の外部呼び出しを vi.mock() で適切にモック
4. 非同期: Promise の resolve/reject 両方をテスト
## 出力コード品質
- describe/it ブロックで論理的にグルーピング
- テスト名は「~のとき、~になること」形式
- アサーションは具体的な期待値を記述
- beforeEach/afterEach でテスト間の独立性を確保
E2E テストシナリオの生成
// 生成されたテストコードの例(Vitest + Testing Library)
import { describe, it, expect, vi, beforeEach } from 'vitest'
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
import { PaymentForm } from './PaymentForm'
import * as stripeModule from '@/lib/stripe'
vi.mock('@/lib/stripe')
describe('PaymentForm', () => {
beforeEach(() => {
vi.clearAllMocks()
})
describe('正常系', () => {
it('有効なクレジットカード情報を入力したとき、決済処理が完了すること', async () => {
const mockCharge = vi.spyOn(stripeModule, 'createCharge')
.mockResolvedValue({ id: 'ch_test_001', status: 'succeeded' })
render(<PaymentForm amount={1000} />)
fireEvent.change(screen.getByLabelText('カード番号'), {
target: { value: '4242424242424242' }
})
fireEvent.click(screen.getByRole('button', { name: '決済する' }))
await waitFor(() => {
expect(screen.getByText('決済が完了しました')).toBeInTheDocument()
})
expect(mockCharge).toHaveBeenCalledWith({ amount: 1000 })
})
it('金額が0円のとき、決済ボタンが非活性になること', () => {
render(<PaymentForm amount={0} />)
expect(screen.getByRole('button', { name: '決済する' })).toBeDisabled()
})
})
describe('異常系', () => {
it('決済APIがエラーを返したとき、エラーメッセージが表示されること', async () => {
vi.spyOn(stripeModule, 'createCharge')
.mockRejectedValue(new Error('カードが拒否されました'))
render(<PaymentForm amount={1000} />)
fireEvent.click(screen.getByRole('button', { name: '決済する' }))
await waitFor(() => {
expect(screen.getByText('カードが拒否されました')).toBeInTheDocument()
})
})
})
})
このようなテストコードを Antigravity が自動生成することで、テスト作成の工数を大幅に削減しながら、高いカバレッジを維持できます。
CI/CD パイプラインへの品質ゲート統合
GitHub Actions との連携
プルリクエスト時に自動で AI コードレビューを実行する CI パイプラインを構築します。
# .github/workflows/ai-quality-gate.yml
name: AI Quality Gate
on:
pull_request:
types: [opened, synchronize]
jobs:
ai-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
- name: Install dependencies
run: npm ci
# 変更ファイルの差分を取得
- name: Get changed files
id: changed-files
run: |
echo "files=$(git diff --name-only origin/main...HEAD | grep -E '\.(ts|tsx|js|jsx)$' | tr '\n' ' ')" >> $GITHUB_OUTPUT
# Biome による静的解析
- name: Run Biome lint
run: npx biome check --reporter=json . > biome-report.json || true
# Vitest によるテスト実行
- name: Run tests with coverage
run: npm run test:coverage -- --reporter=json --outputFile=test-report.json
# カバレッジ閾値チェック
- name: Check coverage threshold
run: |
COVERAGE=$(node -e "
const report = require('./coverage/coverage-summary.json');
console.log(report.total.lines.pct);
")
echo "Line coverage: ${COVERAGE}%"
if (( $(echo "$COVERAGE < 80" | bc -l) )); then
echo "❌ Coverage ${COVERAGE}% is below threshold (80%)"
exit 1
fi
echo "✅ Coverage ${COVERAGE}% meets threshold"
# PR へのレポート投稿
- name: Post review summary to PR
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const biomeReport = JSON.parse(fs.readFileSync('biome-report.json', 'utf8'));
const errorCount = biomeReport.diagnostics?.length || 0;
const body = `## 🤖 AI Quality Gate レポート
| 項目 | 結果 |
|------|------|
| Biome 警告数 | ${errorCount} 件 |
| テストカバレッジ | ${process.env.COVERAGE}% |
| 品質ゲート | ${errorCount === 0 ? '✅ 通過' : '❌ 要修正'} |
${errorCount > 0 ? '### 修正が必要な箇所\n詳細は Actions ログを確認してください。' : ''}
`;
github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body
});
Pre-commit フックによるローカル品質チェック
コミット前にローカルで品質チェックを実行することで、CI/CD の待ち時間を削減します。
// package.json への追加
{
"scripts": {
"pre-commit": "biome check --apply . && npm run test:changed",
"test:changed": "vitest run --changed HEAD"
},
"lint-staged": {
"*.{ts,tsx}": [
"biome check --apply",
"vitest related --run"
]
}
}
# Husky のセットアップ
npm install --save-dev husky lint-staged
npx husky init
echo "npx lint-staged" > .husky/pre-commit
チーム全体での品質標準化
共有プロンプトライブラリの構築
チームで使うプロンプトを Git リポジトリで管理することで、ベストプラクティスを組織全体に展開できます。
project/
├── .antigravity/
│ ├── commands/
│ │ ├── review-security.md # セキュリティレビュー
│ │ ├── review-performance.md # パフォーマンスレビュー
│ │ ├── generate-tests.md # テスト生成
│ │ ├── refactor-suggest.md # リファクタリング提案
│ │ └── explain-code.md # コード解説
│ ├── quality-rules.json # 品質ルール設定
│ └── templates/
│ ├── feature.md # 機能実装テンプレート
│ ├── bugfix.md # バグ修正テンプレート
│ └── review.md # レビュー依頼テンプレート
└── AGENTS.md # AI への共通指示
このディレクトリ構造をリポジトリに含めることで、チームメンバー全員が同じ品質基準で AI を活用できます。
コードレビュープロセスへの AI 統合
人間のコードレビューと AI レビューを組み合わせたハイブリッドアプローチが最も効果的です。
推奨ワークフロー:
- 開発者が機能を実装(Antigravity で生成・編集)
- Antigravity の
/review-security コマンドで自動レビュー
- AI の指摘事項を確認・修正
- PR を作成(CI の AI Quality Gate が自動実行)
- 人間のレビュアーは ビジネスロジックと設計の妥当性 に集中
- マージ後、カバレッジレポートで品質トレンドを確認
この分担により、人間のレビュアーは機械的なチェックから解放され、より価値の高いレビューに集中できます。
品質指標の測定と改善サイクル
定量的な品質トラッキング
品質改善を継続するには、定量的な指標の追跡が不可欠です。以下の指標を定期的に計測することを推奨します。
// quality-metrics.ts — 品質指標の自動計測スクリプト
import { execSync } from 'child_process'
import { writeFileSync } from 'fs'
interface QualityMetrics {
timestamp: string
coverage: {
lines: number
branches: number
functions: number
}
lintWarnings: number
testCount: number
avgComplexity: number
}
async function collectMetrics(): Promise<QualityMetrics> {
// テストカバレッジ取得
execSync('npm run test:coverage -- --reporter=json', { stdio: 'pipe' })
const coverageSummary = require('./coverage/coverage-summary.json')
// Biome 警告数取得
const biomeOutput = execSync('npx biome check --reporter=json .', {
stdio: 'pipe',
encoding: 'utf8'
})
const biomeReport = JSON.parse(biomeOutput)
const metrics: QualityMetrics = {
timestamp: new Date().toISOString(),
coverage: {
lines: coverageSummary.total.lines.pct,
branches: coverageSummary.total.branches.pct,
functions: coverageSummary.total.functions.pct,
},
lintWarnings: biomeReport.diagnostics?.length || 0,
testCount: 0, // Vitest の出力から取得
avgComplexity: 0, // 複雑度分析ツールから取得
}
// 指標をファイルに保存(トレンド分析用)
const history = require('./quality-history.json') || []
history.push(metrics)
writeFileSync('./quality-history.json', JSON.stringify(history, null, 2))
return metrics
}
collectMetrics().then(metrics => {
console.log('📊 品質指標レポート')
console.log(` カバレッジ: ${metrics.coverage.lines}%`)
console.log(` Lint 警告: ${metrics.lintWarnings} 件`)
})
週次品質レポートの自動生成
# scripts/weekly-quality-report.sh
#!/bin/bash
echo "# 週次コード品質レポート $(date '+%Y年%m月%d日')"
echo ""
echo "## テストカバレッジ推移"
node -e "
const history = require('./quality-history.json');
const lastWeek = history.slice(-7);
lastWeek.forEach(m => {
console.log('- ' + m.timestamp.split('T')[0] + ': ' + m.coverage.lines + '%');
});
"
echo ""
echo "## 改善が必要な領域"
# カバレッジが低いファイルを抽出
node -e "
const coverage = require('./coverage/coverage-summary.json');
Object.entries(coverage)
.filter(([file, data]) => file !== 'total' && data.lines.pct < 70)
.sort((a, b) => a[1].lines.pct - b[1].lines.pct)
.slice(0, 10)
.forEach(([file, data]) => console.log('- ' + file + ': ' + data.lines.pct + '%'));
"
よくある失敗パターンと回避策
失敗パターン 1: AI 生成コードをそのまま信頼する
問題: AI が自信を持って提示するコードでも、ドメイン固有の要件を満たしていないことがあります。
解決策: 生成されたコードに対して必ず「このコードで [具体的なエッジケース] が発生したらどうなりますか?」と追加確認を行います。
失敗パターン 2: コンテキストを毎回リセットする
問題: 長時間のセッションでコンテキストを初期化すると、品質基準が失われます。
解決策: AGENTS.md と .antigravity/quality-rules.json に品質基準を永続化し、セッション依存を排除します。
失敗パターン 3: テスト生成を後回しにする
問題: 実装後にテストを生成しようとすると、設計が変わってテストが書きにくくなっています。
解決策: 実装と同時にテストを生成します。「この関数を実装する前に、期待する動作をテストケースとして先に定義してください」というアプローチが効果的。
失敗パターン 4: チームへの展開を後回しにする
問題: 個人のワークフローとして最適化しても、チームに普及しないと効果が限定的です。
解決策: .antigravity/ ディレクトリをリポジトリに含め、オンボーディングドキュメントに AI 品質ワークフローの説明を追加します。
個人開発者の視点から(実体験メモ)
まとめ
Antigravity エディタの真の価値は、コード生成の速度だけでなく、品質保証プロセス全体を AI で強化できること にあります。
本記事で紹介したアプローチをまとめると次のようになります。
- プロンプト設計: 品質観点を最初から組み込む
- コンテキスト永続化:
AGENTS.md と設定ファイルで品質基準を固定
- AI レビュー自動化: カスタムコマンドでチーム標準化
- テスト生成: 実装と並行して網羅的なテストを生成
- CI/CD 統合: 品質ゲートで客観的な品質保証
- 継続改善: 定量指標のトラッキングで品質トレンドを可視化
これらを組み合わせることで、個人開発者でもチーム開発者でも、プロダクション品質のコードを安定して生成・維持できる体制を構築できます。
さらに深く
AI とのペアプログラミングを「速く書くため」から「高品質に維持するため」へ。このパラダイムシフトこそが、2026 年の競争力の源泉になると考えています。