取り組みの背景 — なぜ Editor カスタマイズが重要なのか
Antigravity を使い始めたとき、多くの開発者はデフォルト設定のまま作業を進めます。しかし、AI IDE の真価はデフォルトの先にあります。キーバインドの最適化、カスタムスニペットの設計、AIルールの精密な調整、そしてワークスペース設定の体系化——これらを組み合わせることで、開発速度は文字通り別次元に到達します。
ここではAntigravity Editor を「自分専用の開発マシン」に仕上げるための上級カスタマイズ手法を、実装コード付きで体系的に解説します。単なる設定変更ではなく、なぜその設定が有効なのかという背景も含めて、プロフェッショナルな開発環境の構築を目指します。
対象読者は、Antigravity の基本操作に慣れており、さらに効率を追求したい中上級者です。
キーバインド設計の原則 — 認知負荷を最小化する配置戦略
デフォルトキーバインドの限界
Antigravity のデフォルトキーバインドは汎用的に設計されていますが、個人の開発スタイルには最適化されていません。特に以下のような場面で摩擦が生じます。
- AI チャットとエディタ間の切り替えに複数キーが必要
- 頻繁に使うリファクタリング操作にショートカットが割り当てられていない
- プロジェクト固有の操作(テスト実行、ビルド、デプロイ)が標準化されていない
認知負荷最小化の3原則
効果的なキーバインド設計には、3つの原則があります。
頻度順配置: 最も頻繁に使う操作を最もアクセスしやすいキーに割り当てます。具体的には、ホームポジションから指を動かさずに到達できる範囲(Cmd/Ctrl + アルファベットキー)を最優先で使います。
カテゴリ統一: 同じカテゴリの操作は同じ修飾キーの組み合わせに統一します。例えば、AI 関連の操作はすべて Cmd+Shift に、Git 操作はすべて Cmd+Alt に統一するといった具合です。
筋肉記憶の活用: 他のエディタ(VS Code, Vim, Emacs)からの移行者は、既存の筋肉記憶を活かせる配置を優先します。
実装例:AI 操作に特化したキーバインド設定
// .antigravity/keybindings.json
{
"keybindings": [
// === AI チャット操作(Cmd+Shift 系統)===
{
"key": "cmd+shift+a",
"command": "antigravity.openChat",
"description": "AI チャットパネルを開く"
},
{
"key": "cmd+shift+i",
"command": "antigravity.inlineChat",
"description": "インラインチャットを起動"
},
{
"key": "cmd+shift+r",
"command": "antigravity.regenerate",
"description": "直前の AI 応答を再生成"
},
// === コード操作(Cmd+Alt 系統)===
{
"key": "cmd+alt+r",
"command": "antigravity.refactor",
"description": "選択範囲をAIリファクタリング"
},
{
"key": "cmd+alt+e",
"command": "antigravity.explain",
"description": "選択コードの AI 解説"
},
{
"key": "cmd+alt+t",
"command": "antigravity.generateTest",
"description": "選択コードのテスト自動生成"
},
// === ナビゲーション(Cmd 系統)===
{
"key": "cmd+k cmd+d",
"command": "antigravity.openDiff",
"description": "Diff View を開く"
},
{
"key": "cmd+k cmd+c",
"command": "antigravity.openCheckpoints",
"description": "Checkpoints パネルを開く"
}
]
}この設定のポイントは、AI 操作を Cmd+Shift に統一している点です。これにより「AI に何かさせたいときは Shift を押す」という直感的なルールが生まれ、認知負荷が大幅に下がります。
カスタムスニペット設計 — AIと人間のハイブリッド入力
なぜ AI 時代にスニペットが必要なのか
「AI がコードを書いてくれるなら、スニペットは不要では?」と思われるかもしれません。しかし実際には、AI に毎回同じボイラープレートを生成させるのは非効率です。スニペットは「確定的に同じ構造を出力する」場面で AI を補完します。
スニペットが有効な場面は以下の通りです。
- コンポーネントの基本構造(React, Vue, Svelte)
- テストファイルのセットアップ
- API エンドポイントのひな形
- ドキュメントコメントのフォーマット
プロジェクト固有スニペットの設計パターン
// .antigravity/snippets/react-component.json
{
"React Server Component": {
"prefix": "rsc",
"body": [
"import type { FC } from 'react';",
"",
"interface ${1:ComponentName}Props {",
" ${2:propName}: ${3:string};",
"}",
"",
"const ${1:ComponentName}: FC<${1:ComponentName}Props> = async ({ ${2:propName} }) => {",
" ${4:// Server-side data fetching}",
"",
" return (",
" <div className=\"${5:container}\">",
" <h2>{${2:propName}}</h2>",
" ${0}",
" </div>",
" );",
"};",
"",
"export default ${1:ComponentName};"
],
"description": "React Server Component with TypeScript props"
},
"API Route Handler": {
"prefix": "apir",
"body": [
"import { NextRequest, NextResponse } from 'next/server';",
"",
"export async function ${1|GET,POST,PUT,DELETE|}(request: NextRequest) {",
" try {",
" ${2:// Implementation}",
"",
" return NextResponse.json(",
" { success: true, data: ${3:result} },",
" { status: ${4:200} }",
" );",
" } catch (error) {",
" console.error('${5:API Error}:', error);",
" return NextResponse.json(",
" { success: false, error: '${6:Internal server error}' },",
" { status: 500 }",
" );",
" }",
"}"
],
"description": "Next.js App Router API endpoint with error handling"
},
"Vitest Test Suite": {
"prefix": "vtest",
"body": [
"import { describe, it, expect, vi, beforeEach } from 'vitest';",
"import { ${1:functionName} } from './${2:module}';",
"",
"describe('${1:functionName}', () => {",
" beforeEach(() => {",
" vi.clearAllMocks();",
" });",
"",
" it('should ${3:expected behavior}', () => {",
" // Arrange",
" const input = ${4:testInput};",
"",
" // Act",
" const result = ${1:functionName}(input);",
"",
" // Assert",
" expect(result).${5:toBe}(${6:expected});",
" });",
"",
" it('should handle edge case: ${7:description}', () => {",
" ${0}",
" });",
"});"
],
"description": "Vitest test suite with AAA pattern"
}
}スニペット変数の高度な活用
Antigravity のスニペットは VS Code 互換の変数システムをサポートしています。これを活用すると、ファイル名やディレクトリ名から自動的に値を推論できます。
{
"Auto Component from Filename": {
"prefix": "autocomp",
"body": [
"// ${TM_FILENAME_BASE} component",
"// Generated: ${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}",
"",
"interface ${TM_FILENAME_BASE}Props {",
" ${1:children}: ${2:React.ReactNode};",
"}",
"",
"export function ${TM_FILENAME_BASE}({ ${1:children} }: ${TM_FILENAME_BASE}Props) {",
" return <div>${0}</div>;",
"}"
],
"description": "ファイル名から自動でコンポーネント名を設定"
}
}TM_FILENAME_BASE は現在のファイル名(拡張子なし)を自動挿入します。UserProfile.tsx でこのスニペットを展開すると、コンポーネント名が自動的に UserProfile になります。小さな工夫ですが、日に何十回もコンポーネントを作成する場面では大きな時間節約になります。
AIルール設計 — .antigravity/rules の体系的な構築
ルールファイルの階層構造
AIルールは Antigravity の出力品質を左右する最も重要な設定です。ルールファイルは階層的に管理することで、グローバルな方針とプロジェクト固有の制約を両立できます。
.antigravity/
├── rules/
│ ├── global.md # 全プロジェクト共通のルール
│ ├── typescript.md # TypeScript 固有のルール
│ ├── react.md # React 固有のルール
│ ├── testing.md # テスト作成ルール
│ ├── api-design.md # API 設計ルール
│ └── security.md # セキュリティルール
├── keybindings.json
└── snippets/
グローバルルールの設計
<!-- .antigravity/rules/global.md -->
# プロジェクト共通ルール
## コーディング規約
- TypeScript の strict モードを前提とする
- any 型の使用を禁止する(unknown + 型ガードを使用)
- 関数の行数は50行以内に収める
- 純粋関数を優先し、副作用は明示的に分離する
## 命名規約
- 変数・関数: camelCase
- 型・インターフェース: PascalCase(I プレフィックスは付けない)
- 定数: UPPER_SNAKE_CASE
- ファイル名: kebab-case(コンポーネントのみ PascalCase)
## エラーハンドリング
- try-catch は最小限のスコープで使用する
- エラーメッセージはユーザー向けと開発者向けを分離する
- 非同期処理のエラーは必ず上位に伝搬させる
## コメント
- 「何をしているか」ではなく「なぜそうしているか」を書く
- TODO コメントには担当者と期限を含める: // TODO(@username 2026-04-15): ...
- JSDoc は公開APIにのみ記述するドメイン特化ルールの実装
プロジェクトの技術スタックに合わせたドメイン特化ルールが、AI の出力品質を劇的に変えます。
<!-- .antigravity/rules/react.md -->
# React 開発ルール
## コンポーネント設計
- Server Components をデフォルトとし、"use client" は必要な場合のみ
- Props の型はインターフェースで定義(type ではなく interface)
- children を受ける場合は React.ReactNode を使用
- デフォルトエクスポートはページコンポーネントのみ
## 状態管理
- ローカル状態: useState / useReducer
- サーバー状態: TanStack Query(React Query)
- グローバル状態: Zustand(Redux は使用しない)
- URL 状態: nuqs(useSearchParams のラッパー)
## パフォーマンス
- リスト描画では必ず key に一意のIDを使用(index は禁止)
- 動的インポートは React.lazy + Suspense で実装
- 画像は next/image を使用し、width/height を必ず指定
- useCallback / useMemo は計測に基づいて適用(予防的な使用は禁止)<!-- .antigravity/rules/security.md -->
# セキュリティルール
## 入力バリデーション
- ユーザー入力は必ず Zod スキーマで検証する
- SQL クエリにはパラメータ化クエリのみ使用
- HTML の直接埋め込み(dangerouslySetInnerHTML)は原則禁止
## 認証・認可
- API ルートには必ず認証ミドルウェアを適用
- JWT トークンは HttpOnly Cookie に格納
- CORS は許可ドメインを明示的に指定
## シークレット管理
- 環境変数は .env.local に格納(.env にデフォルト値のみ)
- クライアントに公開する変数は NEXT_PUBLIC_ プレフィックスのみ
- コード例にAPIキーの実フォーマットを絶対に含めない
- ✅ YOUR_API_KEY, YOUR_SECRET_KEY
- ❌ AIzaSy..., sk-..., ghp_...ルール適用の優先順位制御
複数のルールファイルが存在する場合、Antigravity は以下の優先順位で適用します。
- インラインチャットで直接指示した内容(最高優先)
- ファイル固有のルール(ファイルパスにマッチするルール)
- プロジェクトルール(
.antigravity/rules/配下) - グローバル設定(Antigravity のユーザー設定)
この優先順位を理解しておくと、「グローバルルールで厳格な型チェックを要求しつつ、テストファイルではやや緩和する」といった柔軟な運用が可能になります。
<!-- .antigravity/rules/testing.md -->
# テスト固有ルール(global.md の一部を上書き)
## 型の緩和
- テストヘルパーでは as unknown as Type によるキャストを許可
- モックオブジェクトでは Partial<Type> を使用可能
- any は vi.fn() の型引数でのみ許可
## テスト構造
- AAA パターン(Arrange-Act-Assert)を必ず守る
- テスト名は「should + 期待動作」の形式で記述
- describe のネストは2段階までワークスペース設定 — チーム全体の開発体験を統一する
.antigravity/settings.json の設計
ワークスペース設定は、個人の好みではなくプロジェクトの要件として管理します。これにより、新しいメンバーが参加しても即座に同じ開発体験を得られます。
// .antigravity/settings.json
{
// === AI モデル設定 ===
"ai.defaultModel": "gemini-2.5-pro",
"ai.fallbackModel": "gemini-2.0-flash",
"ai.temperature": 0.3,
"ai.maxTokens": 8192,
// === エディタ設定 ===
"editor.formatOnSave": true,
"editor.defaultFormatter": "prettier",
"editor.tabSize": 2,
"editor.rulers": [80, 120],
"editor.wordWrap": "wordWrapColumn",
"editor.wordWrapColumn": 120,
// === ファイル管理 ===
"files.exclude": {
"node_modules": true,
".next": true,
"dist": true,
"coverage": true,
".turbo": true
},
"files.watcherExclude": {
"**/node_modules/**": true,
"**/.git/**": true,
"**/.next/**": true
},
// === 検索最適化 ===
"search.exclude": {
"node_modules": true,
"*.lock": true,
".next": true,
"src/generated": true
},
// === AI コンテキスト ===
"ai.contextFiles": [
"README.md",
"ARCHITECTURE.md",
".antigravity/rules/*.md"
],
"ai.ignorePaths": [
"node_modules",
".next",
"dist",
"*.min.js",
"*.map"
]
}環境別設定の分離
開発環境とCI環境で異なる設定が必要な場合は、環境変数を活用して切り替えます。
// .antigravity/settings.json
{
"ai.contextFiles": [
"README.md",
".antigravity/rules/*.md"
],
// CI 環境ではAI機能を無効化
"ai.enabled": "${env:CI:true}",
// ローカル開発ではオートセーブを有効化
"editor.autoSave": "${env:CI:afterDelay}",
"editor.autoSaveDelay": 1000
}Knowledge Items — AI にプロジェクト固有の知識を教える
Knowledge Items は Antigravity 独自の機能で、AI がプロジェクトの文脈を深く理解するための仕組みです。ルールが「こうしなさい」という指示であるのに対し、Knowledge Items は「これがこのプロジェクトの背景です」という文脈情報です。
<!-- .antigravity/knowledge/architecture.md -->
# アーキテクチャ概要
このプロジェクトは Next.js 15 の App Router を使用した SaaS アプリケーションです。
## ディレクトリ構造の意図
- src/app/ — ルーティングと Server Components
- src/components/ — 再利用可能な UI コンポーネント
- src/lib/ — ビジネスロジック(フレームワーク非依存)
- src/services/ — 外部API通信レイヤー
## 重要な設計判断
- データ取得は Server Components で完結させる(クライアントから直接 API を呼ばない)
- 認証は middleware.ts で一元管理する
- Stripe 決済フローは /api/checkout → Stripe → /api/verify-session の3ステップ<!-- .antigravity/knowledge/domain.md -->
# ドメイン用語集
- **テナント**: マルチテナント構成における1つの組織(organizationId で識別)
- **プラン**: Free / Pro / Enterprise の3段階
- **シート**: 1テナント内のユーザー枠数
- **ウィジェット**: ダッシュボードに配置可能な個別コンポーネントKnowledge Items を充実させることで、AI はコードの生成だけでなく、プロジェクトの文脈に沿った適切な判断を下せるようになります。
設定ファイルのバージョン管理戦略
Git で管理すべきファイルと除外すべきファイル
# .gitignore(Antigravity 関連)
# ✅ Git で管理する
# .antigravity/rules/ — プロジェクト共通の AI ルール
# .antigravity/snippets/ — チーム共有のスニペット
# .antigravity/settings.json — プロジェクト設定
# .antigravity/knowledge/ — Knowledge Items
# ❌ Git から除外する
.antigravity/local-settings.json # 個人設定(モデル選択等)
.antigravity/.chat-history/ # チャット履歴
.antigravity/.cache/ # キャッシュ設定変更のレビュープロセス
AI ルールの変更はコードの変更と同じくらいチームに影響を与えます。以下のようなレビュープロセスを導入することを推奨します。
PR テンプレート例:
## AI ルール変更
### 変更内容
- [ ] ルール追加
- [ ] ルール修正
- [ ] ルール削除
### 変更理由
(なぜこのルール変更が必要か)
### 影響範囲
(この変更によりAIの出力がどう変わるか)
### 検証方法
(変更後に期待通りの出力になることをどう確認したか)生産性を最大化する設定の組み合わせパターン
パターン1: フルスタック TypeScript 開発
.antigravity/
├── rules/
│ ├── global.md # 共通ルール(型安全・命名規約)
│ ├── react.md # フロントエンド
│ ├── api-design.md # API 設計
│ ├── database.md # Prisma / Drizzle ルール
│ └── testing.md # テスト
├── snippets/
│ ├── react-component.json
│ ├── api-route.json
│ └── test-suite.json
├── knowledge/
│ ├── architecture.md
│ └── domain.md
├── keybindings.json
└── settings.json
パターン2: モバイルアプリ開発(Swift / Kotlin)
.antigravity/
├── rules/
│ ├── global.md
│ ├── swift.md # Swift / SwiftUI ルール
│ ├── kotlin.md # Kotlin / Jetpack Compose ルール
│ └── testing.md
├── snippets/
│ ├── swiftui-view.json
│ └── compose-screen.json
├── knowledge/
│ ├── app-architecture.md # MVVM / Clean Architecture
│ └── api-contracts.md # バックエンド API 仕様
└── settings.json
パターン3: インフラ・DevOps
.antigravity/
├── rules/
│ ├── global.md
│ ├── terraform.md # IaC ルール
│ ├── docker.md # コンテナ設計ルール
│ └── security.md # インフラセキュリティ
├── snippets/
│ ├── terraform-module.json
│ └── dockerfile.json
├── knowledge/
│ ├── infrastructure.md # 現在のインフラ構成
│ └── runbooks.md # 運用手順
└── settings.json
これらのパターンを参考に、自分のプロジェクトに合った構成を設計してみてください。
まとめ
Antigravity Editor のカスタマイズは、単なる見た目の調整ではなく、開発プロセス全体の品質と速度に直結する投資です。キーバインドで操作の摩擦をなくし、スニペットで定型作業を瞬時に完了し、AIルールで出力品質を保証し、ワークスペース設定でチーム全体の体験を統一する——この4つの柱を体系的に整備することで、Antigravity は「便利なツール」から「自分の手の延長」へと進化します。
まずは今日使っている操作の中で最も頻度の高いものを3つ特定し、そのキーバインドの最適化から始めてみてください。小さな改善の積み重ねが、数か月後には劇的な生産性の違いとして現れます。