はじめに
この記事は、アソビュー Advent Calendar 2025の6日目(表面)です。
こんにちは、アソビューの村井です。
近年、GitHub Copilot、Cursor、Claudeなど、複数のAIエージェントを開発に活用する機会が増えています。これらのツールを効果的に活用するために、プロジェクトに特化しルール定義を行うことが一般的になってきました。
しかし、複数のAIエージェントを使い分けている開発チームでは、『各エージェントごとに定義しているルールに差分が出てきてしまう』という課題に 直面している方も多いのではないでしょうか。
そこで本記事では、その具体的な解決策に焦点を当てて、rulesyncを用いたルール一元管理の手法をご紹介します。
具体的な課題
現状の運用
私たちのチームでは、AIエージェントを導入した当初はCursorのみの運用でしたが、今ではメンバーによって利用しているエージェントが異なります。
複数のAIエージェントを使い分けるようになると、各AIエージェントはそれぞれ独自のルールファイル形式を要求するため、以下のように個別に管理する必要が出てきました。
- Cursor用:.cursor/rules/cursor.mdc
- GitHub Copilot用:.github/copilot-instructions.md
- Claude (Project)用:.claude/memories/claude.md
ルールを追加・変更する際は、これらのファイルを個別に手動で更新する必要がありました。一見シンプルな運用に見えますが、実際には以下のような問題が頻発していました。
発生していた問題
各エージェントでルールを適用するためのファイル名や場所が異なるだけでなく、微妙な記法の違いなどを意識して管理する必要があります。例えばcursor.mdcを更新したら、copilot-instructions.mdも手動で更新しなければなりません。人間が作業する以上、どうしても更新漏れやコピペミスが発生し、「Copilotだとこのルールを知らない」といった状況が生まれていました。同じルールを適用したいだけなのに、複数のファイルを個別にメンテナンスしなければならないという二重管理の問題が頻発していました。
rulesyncとの出会い
この「ルールの二重管理問題」を解決するために導入したのがrulesyncです。 rulesyncは、AIエージェント用の設定ファイルを管理・同期するためのツールで、以下の魅力的な機能があります。
- 1つのマスターファイルから、各エージェント用の形式に自動変換・生成
- 生成したファイルを複数のディレクトリへ同時に配置可能
導入手順
1.インストール
当初はyarn経由でのインストールを試みましたが、プロジェクトで利用しているNode.js (v20.0.6) に起因する固有のエラーが発生し、インストールできませんでした。そこで、プロジェクトの Node.jsバージョンに依存せず安定して動作させるため、今回はHomebrewを使用してインストールしました。
brew install rulesync
※brew経由でインストールすると、独立したNode環境で動作するため、プロジェクト固有のバージョン制約やエラーを回避して実行できます。
2.マスターファイルの作成
プロジェクトのルートにrulesync/rules/ディレクトリを作成し、その中にマスターとなるrules.mdを配置します。
mkdir -p rulesync/rules touch rulesync/rules/rules.md
作成したrules.mdに、全エージェントで共通させたいルールを記述します。
--- description: プロジェクト共通ルール globs: ['**/*.ts', '**/*.tsx'] alwaysApply: true --- ## 技術スタック - 言語: TypeScript - テスト: Vitest ## コーディング規約 - 関数コンポーネントはアロー関数を使用する - 変数名はキャメルケースとする - ...
- description: ルールの概要を記述します。
- globs: ルールを適用するファイルパスのパターンを指定します。ここにマッチするファイルを編集している時のみ、ルールが有効になります。
- alwaysApply: trueに設定すると、ファイルパスに関係なく常にこのルールを適用します。プロジェクト全体の共通ルールではtrueにします。
既存のルールがある場合は、rulesync importコマンドを実行することで、既存ファイルをベースにマスターファイルを生成してくれます。
3.設定ファイルの準備
設定ファイル rulesync.jsoncを作成します。ルートディレクトリにあるマスターファイルを元に、各エージェント用のファイルを書き出す設定を行います。
{
"targets": ["cursor", "claudecode", "copilot"],
"features": ["rules"],
"baseDirs": ["."],
"delete": true
}
- targets: 生成対象のAIエージェントを指定します。
- features: 同期する機能の指定です。今回は["rules"]のみを指定します。
- baseDirs: ルールファイルを生成・配置するディレクトリです。ルートのみの場合は ["."] ですが、後述するようにモノレポ構成ではここが重要になります。
- delete: true に設定すると、コマンド実行時に既存のルールファイルを一度削除してから再生成します。古い設定が残って悪さをするのを防ぐため、有効にしておくことを推奨します。
4.生成コマンドの実行
準備ができたら、ルートディレクトリで以下のコマンドを実行します。
rulesync generate
これで、マスターファイルであるrules.mdの内容が、cursor.mdcやcopilot-instructions.mdに自動変換されて生成されます。
モノレポ環境での参照問題
導入自体はスムーズでしたが、実際に運用を始めてからモノレポ環境特有の課題に直面しました。
特定のパッケージを開くとルールが効かない
リポジトリのルートをVS CodeやCursorで開いている時は問題ありませんでした。しかし、特定のパッケージディレクトリ(例:packages/package-a)を直接開いて作業している時に、ルールが適用されない現象が発生しました。
AIエージェントは基本的に、現在開いているワークスペースのルートディレクトリから設定ファイルを探します。そのため、packages/package-aをルートとしてエディターを開くと、リポジトリルートにある.cursor.mdcは参照されず、汎用的な提案しか返ってこなくなってしまったのです。
解決策
当初は各パッケージに手動でファイルをコピーしたり、シンボリックリンクを検討したりしましたが、管理コストを考えると最善手ではありませんでした。
そこで活用したのが、rulesyncのbaseDirs設定です。この設定を使うと、1つのマスターファイルから、複数のディレクトリに同時にルールファイルを生成できます。
rulesync.jsoncを以下のように修正しました。
{
"targets": ["cursor", "claudecode", "copilot"],
"features": ["rules"],
// ★ここがポイント:ルート(.)に加え、各パッケージのディレクトリを指定
"baseDirs": [
".",
"packages/package-a/",
"packages/package-b/",
"packages/package-c/"
],
"delete": true
}
この設定により、ルートディレクトリでrulesync generateを実行するだけで、ルールファイルが一斉に生成されるようになりました。
ディレクトリ構成のイメージ
repository-root/
├── rulesync.jsonc
├── rulesync/
│ └── rules/
│ └── rules.md # ★ マスター(ここだけ編集)
│
├── .claude/ # [自動生成] ルート直下用(.cursor, .github も同様に生成)
│ └── memories/
│ └── rules.md
├── .cursor/
│ └── rules/
│ └── rules.mdc
├── .github/
│ └── instructions/
│ └── rules.instructions.md
│
└── packages/
└── package-a/
├── .claude/.. # [自動生成] 各パッケージ用
├── .cursor/..
└── .github/..
「コマンドは常にルートで実行する」という運用に統一することで、パス指定の混乱もなくなり、どのディレクトリでエディタを開いても同じルールが適用される環境が整いました。
パッケージ固有のルールを設定する
baseDirsで指定したディレクトリには共通ルールが配布されますが、特定のパッケージにだけ適用したいルールがある場合は、globsを利用します。 rulesync/rules/ 配下に新しいルールファイル(例:package-a.md)を作成し、ファイルの先頭でglobsを指定します。
--- description: package-a固有のルール # パッケージA配下のファイルを触っている時だけ有効にする globs: ['packages/package-a/**/*.ts', 'packages/package-a/**/*.tsx'] alwaysApply: false ---
これにより、「全体共通のルール」と「パッケージ固有のルール」を、Markdown側の設定だけで切り分けることができます。
生成ファイルはGit管理外にする
もう一つ、運用をスムーズにするための重要なポイントがあります。それは、自動生成されたルールファイルを.gitignoreに追加し、Git管理外にすることです。
生成ファイルをコミットしてしまうと、以下の問題が発生してしまいます。
マスターファイル(rules.md)を1行修正しただけで、baseDirsで指定した全ディレクトリのファイルに差分が発生する Pull Requestのレビュー時、本質的ではない大量の自動生成ファイルの差分がノイズになる
そのため、rules.mdとrulesync.jsoncのみをGitで管理し、各エージェント用のファイルはあくまで「ローカルで生成して利用するもの」という運用に切り分けることで、リポジトリをクリーンに保っています。
今後の展望
現在は生成ファイルをGit管理外にしているため、新規メンバーが参画した際には手動で rulesync generateコマンドを実行してもらう必要があります。
しかし、これでは「コマンドの実行忘れ」によりルールが適用されないまま開発が進んでしまうリスクがあります。
今後はpackage.jsonのprepareスクリプトなどに生成コマンドを組み込み、yarn installを実行するだけで裏側で勝手にルールファイルが生成・配置されるような、「開発者が意識せずとも、自然とルールが適用される環境」を目指していきたいと考えています。
終わりに
rulesyncの導入により、AIエージェント間のルール差分という具体的な課題を解消し、チーム全体の開発効率を向上させることができました。
特に、モノレポ環境で開発しているチームにとって、baseDirs設定による一括配布のテクニックは非常に有効です。「どのディレクトリを開いても、同じルールでAIが支援してくれる」という体験は、開発のストレスを大きく軽減してくれます。
複数のAIエージェントを活用しつつ、秩序ある開発環境を維持したい方の参考になれば幸いです。
アソビューでは一緒に働くメンバーを大募集しています! カジュアル面談もありますので、少しでも興味があればお気軽にご応募いただければと思います!