1. はじめに:なぜマイナー言語・社内フレームワークでCursorは「幻覚」を起こすのか
TypeScriptやPython、Goといったメジャー言語を使用している場合、Cursor(およびその背後にあるLLM)は驚異的な補完精度を発揮します。理由は単純で、公開リポジトリやWeb上に天文学的なトークン量の学習データが存在し、かつ強固な型システムやLSP(Language Server Protocol)がLLMへ正確なコンテキストを提供しているためです。
しかし、以下の環境に足を踏み入れた瞬間、AIの精度は急落し、もっともらしい嘘(ハルシネーション)を連発し始めます。
1. 歴史の浅いマイナー言語・DSL(Mojo, Gleam, KCL, 各種社内定義DSLなど)
2. 社外秘の独自社内フレームワークやレガシーなオレオレライブラリ
3. 動的型付けかつメタプログラミング多用で、静的解析が効かないコードベース
この問題の本質は、「AIの知能不足」ではなく「コンテキスト欠乏(Context Starvation)」にあります。Cursorのコンテキストエンジン(Indexing Engine)が、プロジェクト内の抽象化レイヤーや暗黙のルールを正しくベクター化・参照できていないのです。
本記事では、型定義が存在しない、あるいは学習データが極小の環境において、Cursorのインテリジェンスを強制的に引き上げ、メジャー言語と同等以上の爆速開発環境を構築するためのアーキテクチャと実践テクニックを解説します。
—
2. `@Docs` インデックス最適化:社内プロプライエタリ・マイナー構文をCursorに注入するプロトコル
Cursorの強力な機能の1つが `@Docs`(カスタムドキュメントのインデックス化)です。しかし、単に社内ポータルやGitHub WikiのURLを登録するだけでは、期待する精度は得られません。LLMがRAG(Retrieval-Augmented Generation)で取得しやすいよう「チャンク構造を意識したドキュメント設計」を行う必要があります。
2.1 ドキュメント・クローリングの最適化設定
Cursorの設定画面(`Settings > Features > Docs`)でカスタムURLを追加する際、以下の点に注意してインデックスを作成します。
Prefix: https://internal-docs.corp.local/framework/v2/
Entrypoint: https://internal-docs.corp.local/framework/v2/getting-started
ここで重要なのは、「APIシグネチャ」と「エラーパターン」が集約されたページを最優先でクロールさせることです。
2.2 LLM向けに整形された「チートシートMarkdown」のローカル配置
外部URLが存在しない社内独自DSLなどの場合、プロジェクトルート直下にAI専用のドキュメントを配置し、それをCursorに学習させます。
Internal Data Flow DSL Specification (v1.4)
Core Syntax Rules
- Every block must terminate with `~>` (pipe operator).
- Variables defined in `context {}` are immutable unless prefixed with `mut:`.
Built-in Functions & Signatures
`transform(data: Stream, fn: Lambda) -> Stream`
Applies transformation logic over internal memory buffers.
このファイルをリポジトリ内に配置し、Cursor Settingsの `Indexing & Retrieval` でインデックス対象に含めることで、コード生成時にローカルの埋め込みベクトル(Vector Embeddings)から高精度な構文知識が引き出されます。
—
3. 型情報のない世界を救う「Shadow Types(擬似型定義)」と `.cursorrules` 設計
動的型付け言語やオレオレフレームワークで最も開発速度を落とす要因は、「引数に何が渡ってくるか分からない」「メソッドチェーンの戻り値が推論できない」点です。
これを解決するために、我々が導入すべきアプローチが「Shadow Types(シャドウ・タイプ)」パターンです。
3.1 Shadow Types(擬似型インターフェース)の導入
言語本体に型システムがなくても、TypeScriptライクな擬似コードやインターフェース定義ファイルを `.cursor/types/` ディレクトリに設置し、Cursorに「このフレームワークの暗黙のオブジェクト構造はこうなっている」と教え込みます。
// filepath: .cursor/types/internal-framework.d.ts
/
- 実行時コンテキストに暗黙的に注入される `$ctx` オブジェクトの型定義
- ※ 実コードではコンパイルされない。Cursorの推論誘導専用。
/
interface InternalContext {
readonly traceId: string;
readonly session: {
userId: string;
roles: Array<'ADMIN' | 'OPERATOR' | 'USER'>;
};
/
- 社内KVSクライアントへのアクセサ
- @param key 検索キー(形式: `service:domain:id`)
/
kvsGet
emitEvent(eventName: string, payload: object): void;
}
3.2 `.cursorrules` による推論強制
`.cursorrules` は、リポジトリルートに配置することで Cursor の振る舞いを決定づける最重要ファイルです。ここに「マイナー構文のコーディング規約」と「Shadow Typesの参照先」を明記します。
Context & Tech Stack Rules
You are an expert developer specializing in our in-house framework “CoreEngine”.
Core Principles
1. Dynamic Objects: When resolving methods on the global context `$ctx`, strictly adhere to the types defined in `.cursor/types/internal-framework.d.ts`.
2. No Hallucinated Standard Libraries: This project uses a minimal custom runtime. Standard POSIX or generic Node.js APIs are NOT available unless explicitly imported.
3. Error Handling Protocol:
- Never use generic `try/catch`.
- Use `Result
` pattern matching via `matchResult(res, { ok: …, err: … })`.
Syntax Enforcement Pattern
-lang
// GOOD
def handle_request(req) {
let user = $ctx.kvsGet(“user:” + req.id)
return Response.ok(user)
}
// BAD – Do NOT generate this (No standard global fetch exists)
def handle_request(req) {
return fetch(“https://api…”)
}
—
4. チーム全体でAIの脳を同期する:`.cursor/` ディレクトリと共有設定
開発者ごとにAIの出力品質がバラつく状態は、チーム開発において致命的です。テックリードは「Cursorの設定をリポジトリでコード管理(IaC化)」し、`git clone` した瞬間に全員のAIが同じ賢さで動作する状態を整える必要があります。
4.1 ディレクトリ構成のベストプラクティス
リポジトリ直下に以下のような構成を展開し、Gitの管理下に置きます。
.
├── .cursor/
│ ├── docs/ # AI専用に圧縮された仕様書・チートシート
│ │ └── architecture.md
│ ├── types/ # Shadow Types(擬似型定義)
│ │ └── globals.d.ts
│ └── rules/ # モジュール単位のローカルルール
│ └── data-layer.md
├── .cursorrules # プロジェクト全体のグローバルAIプロンプト
├── .vscode/
│ ├── settings.json # Cursor/VS Codeエディタ設定
│ └── extensions.json # 推奨プラグイン一覧
└── src/
4.2 `.vscode/settings.json` の最適化構成例
Cursorのインデックス動作を制御し、ノイズとなるファイルをAIの検索対象から徹底的に除外します。
// filepath: .vscode/settings.json
{
// AIのコンテキスト走査から不要な大容量ディレクトリ・自動生成ファイルを除外
“cursor.general.excludeFromIndexing”: [
“/node_modules/“,
“/dist/“,
“/build/“,
“/.git/“,
“/coverage/“,
“/.min.js”,
“/.lock”
],
// AIコード補完(Tabキー)のトリガー感度を最大化
“editor.inlineSuggest.enabled”: true,
“editor.inlineSuggest.suppressSuggestions”: false,
// マイナー言語向け: カスタム拡張子のファイルマッピング
“files.associations”: {
“.internaldsl”: “groovy”, // 構文ハイライト用(最も構文が近い言語を割り当て)
“.customconf”: “yaml”
},
// チーム共通フォーマット設定
“editor.formatOnSave”: true,
“editor.defaultFormatter”: “esbenp.prettier-vscode”
}
—
5. 開発スピードを異次元に引き上げるショートカット&神拡張機能
Cursorの真価は、適切なコンテキストが供給された状態で、キーボードから手を離さずにAIへ指示を出すフローを構築したときに発揮されます。
5.1 現場で生きる厳選ショートカット
| ショートカット (Mac / Win) | 機能 | マイナー環境での実践活用テクニック |
| :— | :— | :— |
| `Cmd + K` / `Ctrl + K` | インライン生成・編集 | 範囲選択して「Shadow Typesに基づきバリデーション関数化」と指示 |
| `Cmd + L` / `Ctrl + L` | AI Chat (サイドバー) | `@Files` で独自パーサーコードを渡し、「この構文解析の逆変換を書いて」と依頼 |
| `Cmd + I` / `Ctrl + I` | Composer (マルチファイル編集) | フレームワークのバージョンアップ時、全ハンドラーの引数シグネチャを一括変換 |
| `Cmd + Shift + L` / `Ctrl + Shift + L` | 選択行をAIチャットに即時投入 | 未知のエラーログを選択して即座に原因特定・修正コードを生成 |
5.2 マイナー環境で絶対に入れるべき拡張機能
1. Which Key (`usernamehw.whichkey`)
- 独自ショートカットやComposer起動のコマンドパレットを瞬時に可視化。認知負荷を激減させます。
2. Text File Context Provider (Custom Local Tools)
- ファイルツリーや依存関係のテキスト表現を素早くコピーし、`Cmd + L` のプロンプト先頭に注入するためのユーティリティ。
3. YAML / JSON Path Extractor
- 巨大な独自定義設定ファイルの階層パス(JSONPath)をワンクリックで取得し、AIへの指示(「このパスのキー定義を追加して」)を正確化します。
—
6. まとめ:AI時代のテックリードが設計すべき「コンテキスト供給インフラ」
マイナー言語や社内フレームワークにおいて、AIが使えないと嘆く時代は終わりました。AIの回答精度は、「コードベースの希少度」ではなく「アーキテクトが設計したコンテキスト供給システムの精度」に完全に比例します。
1. `@Docs` で圧縮された仕様データを供給する
2. `Shadow Types` で動的環境に明示的な境界線を引く
3. `.cursorrules` でAIの思考を社内標準プロトコルに縛る
4. `.cursor/` ディレクトリをチームで共有・バージョン管理する
これら4つのレイヤーを整えることで、型定義のない孤島のような環境であっても、最先端の型安全言語を凌駕する超高速なAIアシスト開発環境を手に入れることができます。
まずは、リポジトリに `.cursorrules` と `.cursor/types/` を1つ作成することから始めてみてください。あなたのチームの開発体験は劇的に変わるはずです。