From prefab-sentinel
Diagnoses and repairs broken references, Variant overrides, and wiring errors in Unity Prefabs, Scenes, and Assets via MCP tools. Includes Editor Bridge setup for write operations.
How this skill is triggered — by the user, by Claude, or both
Slash command
/prefab-sentinel:guideThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Unity プロジェクトで Prefab / Scene / Asset の検査・編集・参照修復を行う MCP ツールリファレンス。
Unity プロジェクトで Prefab / Scene / Asset の検査・編集・参照修復を行う MCP ツールリファレンス。
MCP ツールとして呼び出す(CLI は v0.4.0 で廃止済み)。Plugin 導入時はホスト(Claude Code / Codex CLI)が MCP サーバーを自動起動するため、このスキルが使える時点でツールは接続済み。
書き込みの実適用・実行検証・editor_* ツールを使うには Editor Bridge のセットアップが必要 → Unity Bridge セットアップ。read-only 検査・dry-run だけならセットアップ不要。
最短経路。UNITYTOOL_BRIDGE_WATCH_DIR 等の Editor Bridge 環境変数は read-only 経路では不要(broken-reference 検出と Variant 差分は YAML 直読みで完結する)。activate_project はセッションで最初に 1 回呼び、scope(必須)と Unity プロジェクトルート(project_root、任意)を宣言する。
(1) 壊れた参照を検出する — validate_refs で broken GUID / fileID を構造化応答で取り出す。
activate_project(scope="Assets/<feature>", project_root="/path/to/unity/project")
validate_refs(scope="Assets/<feature>")
返ってきた envelope の data.unique_missing_asset_guids が空配列なら OK、要素があれば未解決 GUID の集合(重複排除済み)。data.broken_occurrences に発生回数。
(2) Variant の override を可視化する — inspect_variant で base からの差分のみを取り出す。
inspect_variant(asset_path="Assets/<feature>/Variants/Foo.prefab", show_origin=True)
各 override に origin_path / origin_depth が付き、どの prefab(Base / Mid / Leaf)が値を確定したかを追える。
(3) 編集を dry-run でプレビューする — set_property の confirm=False で差分だけ取り出す(書き込まない)。
set_property(
asset_path="Assets/<feature>/Foo.prefab",
symbol_path="CharacterBody/MeshRenderer",
property_path="m_StaticBatchInfo.firstSubMesh",
value=2,
confirm=False,
)
symbol_path は GameObject パス + 末尾コンポーネント名でコンポーネント自体を指す(asset_path と symbol_path は常に別引数)。severity と data.diff を読んで意図通りなら confirm=True + 非空 change_reason で再呼び出し。change_reason を欠くと CHANGE_REASON_REQUIRED で拒否される。
どこから手をつけるか迷ったらここから。各ツールは read-only で副作用なし。
validate_refs — broken GUID / fileID を全件検出する起点。scope 引数でスコープを宣言する。<scope>/config/ignore_guids.txt があれば auto-load される。inspect_wiring — MonoBehaviour フィールドの配線(null / fileID 不整合 / 重複参照)を分析する。script_filter で特定の script class に絞れる。inspect_hierarchy — GameObject の階層ツリーをコンポーネント注釈付きで読む。expand_monobehaviour=true でスクリプトクラス名を展開する。書き込み系(set_property / patch_apply / add_component 等)はこの 3 つで現状把握してから着手する。
全 MCP ツールの正本カタログは docs/tools.md、応答エンベロープ(success / severity / code / message / data / diagnostics)とエラーコードの正本は docs/api-reference.md。各ツールの引数・戻り値は MCP ツールスキーマに記述されている。主なカテゴリ:
validate_refs / validate_structure / inspect_wiring / inspect_variant / inspect_hierarchy / inspect_materials / find_referencing_assets / get_unity_symbols / find_unity_symbol / diff_unity_symbols / list_serialized_fields / validate_field_rename / check_field_coverageset_property / set_properties / add_component / remove_component / patch_apply / revert_overrides / set_material_property / copy_asset / rename_assetvalidate_runtime(UdonSharp compile + ClientSim、Editor Bridge 常駐が必須)editor_* 系。Scene / Hierarchy / Component / Material / BlendShape / Animation / Console / Prefab Stage の検査・編集(editor_screenshot / editor_open_prefab / editor_close_prefab / editor_safe_save_prefab / editor_execute_menu_item / editor_recompile(同期再コンパイル)/ editor_refresh(compile-aware refresh)等)。完全な一覧は docs/tools.md の editor_* カテゴリ群を参照activate_project(スコープ宣言 + キャッシュ warm)/ get_project_status / deploy_bridge(Bridge C# / .asmdef を Unity プロジェクトへ同期)offline / live の権威境界: offline 系(get_unity_symbols / find_unity_symbol / set_property / set_properties 等、symbol_path で住所する)は last-saved disk YAML を権威とし Unity 不要で動く。live 系(editor_*、hierarchy_path で住所する)は live editor / Prefab Stage を権威とする。Editor Bridge 接続中かつ live に未保存変更がある間、offline symbol-reference ツールはペイロードに freshness マーカーを付け、ツリーが last-saved disk を反映し live と乖離しうることを通知する(issue #40)。
書き込み系ツールは confirm=True + 非空 change_reason の監査ペアを必須とする(patch_apply / set_properties は out_report も必須)。
複数操作をまとめて適用するときは patch_apply に plan JSON を渡す。plan_version: 2 が唯一受け入れられる形状(旧 {"target": ..., "ops": [...]} 形状は ValueError で即時拒否される)。
resources[] — 編集対象。kind(prefab / scene / asset / material / json)と mode(open = 既存編集 / create = 新規作成)。ops[] — 操作列。open は既存プロパティの値変更・配列操作のみ。create は階層・コンポーネントのゼロ作成(result ハンドルで作成物に名前を付け後続 op から参照、ルートは自動で "root" ハンドル)。postconditions[] — 適用後の検証条件。最小例(open mode のプロパティ編集):
{
"plan_version": 2,
"resources": [
{"id": "res1", "kind": "prefab", "path": "Assets/.../Target.prefab", "mode": "open"}
],
"ops": [
{"resource": "res1", "op": "set", "component": "SkinnedMeshRenderer", "path": "m_Enabled", "value": true}
],
"postconditions": []
}
完全なスキーマ(op 種別一覧、create / scene モード、配列操作、複数リソース、annotated examples)は docs/execution-reference.md の「patch_apply 入力スキーマ」節を参照。実例集は knowledge/prefab-sentinel-patch-patterns.md。
open モードの component は 型名セレクタで指定する(例: SkinnedMeshRenderer、UnityEngine.MeshFilter)。同型が複数あるときは TypeName@/hierarchy/path で曖昧性を解消する。YAML の数値 fileID はセレクタに使えない(C# ブリッジは型名で検索する)。add_component は create モード専用。既存 Prefab へコンポーネントを追加する bridge 操作は無く、open モードで使うと create-mode operation エラーになる。既存 Prefab への追加は YAML 直接編集で行う。insert_array_element / remove_array_element)の path は m_Array.Array.data のように .Array.data で終わる必要がある(Unity SerializedProperty の規約)。ObjectReference の value — open モードは {"guid": "...", "fileID": ...} 形式または null、create モードは {"handle": "..."} でハンドル参照。create モードでハンドル文字列を裸で渡すとランタイムエラーになる。0000000000000000e000000000000000(unity default resources — メッシュ Sphere / Cube 等)、0000000000000000f000000000000000(unity_builtin_extra — マテリアル・シェーダ)。fileID⇔名前の解決は prefab_sentinel/builtin_assets.py。UdonSharpBehaviour + backing UdonBehaviour、後者は m_Script が固定 GUID 45115577ef41a5b4ca741ed302693907)で構成され、片方だけでは "Selected U# behaviour is not setup" になる。create モードの add_component で UdonSharpBehaviour 派生型を指定すると backing が自動生成・自動配線される。詳細は knowledge ファイルを参照:
knowledge/prefab-sentinel-workflow-patterns.md — ワークフロー選択、判断ルールknowledge/prefab-sentinel-variant-patterns.md — Variant 操作、VRChat 着せ替えknowledge/prefab-sentinel-editor-camera.md — カメラ操作パターンknowledge/prefab-sentinel-material-operations.md — マテリアル操作パターンknowledge/prefab-sentinel-wiring-triage.md — 配線検査の読み方knowledge/prefab-sentinel-patch-patterns.md — パッチ計画の実例集knowledge/ には ModularAvatar / liltoon / VRCFury / AvatarOptimizer など主要な VRChat エコシステムツールのドメインナレッジが同梱されている(L1 概念 / L2 操作パターン / L3 SerializedProperty の 3 レベル構成)。
これらのツールが関わる Prefab / Scene / Material を検査・編集するときは、判断の前に対応する knowledge/*.md を読む。SerializedProperty 名やコンポーネントの不変条件はツールごとに異なり、読まずに編集するとそのツールの作法を外した変更になる。
対象ファイルは knowledge/ を Glob し、コンポーネント型名・シェーダー名・パッケージ名から特定する。VRChat SDK / UdonSharp 自体のナレッジも knowledge/ に含まれる。
個別のファイル名はここに列挙しない — knowledge/ ディレクトリの内容そのものが単一の正本で、新しいツールのナレッジは knowledge-acquisition スキルが随時追加する。このスキルに一覧を持たせると drift するため、必ず Glob で実体を見る。
本 guide は MCP ツールリファレンスと Editor Bridge セットアップ手順。以下のスキルは複数ツールを組み合わせたゲート付きワークフローを提供する。
| スキル | 用途 | トリガー |
|---|---|---|
/prefab-sentinel:variant-safe-edit | Prefab/Scene/Asset の安全な編集。preflight → dry-run → confirm → validate のフルパイプライン | パッチ適用、Prefab 編集全般 |
/prefab-sentinel:prefab-reference-repair | 壊れた参照の検出・修復。ignore-guid ポリシーと decision_required ゲート付き | validate_refs で壊れた GUID/fileID が検出されたとき |
/prefab-sentinel:udon-log-triage | ランタイム例外・Udon/ClientSim ログエラーの分類→アセット特定→修正提案 | ランタイム例外やログベースのリグレッション発生時 |
read-only 検査(validate_* / inspect_* / find_*、および patch の dry-run)は Unity も Bridge も不要 — このスキル冒頭の例だけで動く。書き込みの実適用(confirm=True)・validate_runtime・editor_* ツールを使うときだけ Editor Bridge をセットアップする。
ユーザーが「Bridge セットアップして」と依頼したら、AI 側のツール呼び出しとユーザーの Unity 側手動操作を分けて、次を順に進める。
プロジェクト確認 + Bridge C# 配置(AI) — ユーザーに Unity プロジェクトルートを確認し、activate_project でスコープを宣言してから deploy_bridge を呼ぶ。
activate_project(scope="Assets/<feature>", project_root="/path/to/unity/project")
deploy_bridge()
deploy_bridge は activate_project が前提(プロジェクト未活性なら DEPLOY_NO_PROJECT で停止)。target_dir 省略時の既定は <project_root>/Assets/Editor/PrefabSentinel/。明示する場合もプロジェクト内に限る(外側は DEPLOY_OUTSIDE_PROJECT)。.asmdef をコピーし、配置先の親ディレクトリに残った旧 PrefabSentinel.*.cs を除去して CS0101 重複定義エラーを防ぐ。手動 cp は partial 分割ファイル群を取りこぼすため使わない。Unity でコンパイル完了を待つ(ユーザー手動) — ユーザーに Unity Editor へ切り替えてもらい、配置された C# のコンパイル完了を待つ。この時点では Editor Bridge がまだ起動していないため、editor_recompile / editor_console は使えない(chicken-and-egg)。ユーザーが Unity Console を目視し、コンパイルエラーが無いことを確認する。エラーがある場合: CS0101(重複定義)なら配置先や親ディレクトリに旧 Bridge ファイルが残存、CS0246 等の型未解決なら VRChat SDK / UdonSharp の未導入・バージョン不整合を疑う。
Editor Bridge ウィンドウを開く(ユーザー手動) — Unity Editor の PrefabSentinel > Editor Bridge メニューからウィンドウを開き、watch ディレクトリ(例: <project_root>/Temp/PrefabSentinelBridge)を入力して有効化する。
UNITYTOOL_BRIDGE_WATCH_DIR を設定(AI) — 手順 3 でユーザーが入力した watch ディレクトリのパスを確認し、同じ値を環境変数 UNITYTOOL_BRIDGE_WATCH_DIR に設定する。この env は MCP サーバープロセスが読む。MCP サーバーはホスト(Claude Code / Codex CLI)が起動するため、ホストが MCP サーバーを spawn する際に渡る場所 — OS のユーザー環境変数、またはホストの MCP server 設定の env ブロック — に置く。設定後は反映のためホスト / MCP サーバーセッションを再起動する。UNITYTOOL_* 環境変数の正本と Windows / WSL のパス変換は CONFIGURATION.md を参照。
依頼の仕方: ユーザーは「watch dir を <path> にして」と頼めばよい。AI はそのパスを確認し、env を設定し、反映には再起動が要る旨を伝える。
疎通確認(AI) — get_project_status を呼び、data.editor_state が non-null(is_playing 等 4 つの bool フラグが返る)なら Bridge は接続済み。null なら未接続 — 手順 2〜4 を見直す。最後に validate_runtime で実行検証経路まで通ることを確認する。
Python → {uuid}.request.json をアトミック書き込み → Editor Bridge がポーリング検出 → UnityPatchBridge / UnityRuntimeValidationBridge / UnityEditorControlBridge が処理 → {uuid}.response.json をアトミック書き込み → Python がポーリング読み取り。Editor を閉じずに、ロード済みアセットキャッシュを跨いだ操作ができる。
npx claudepluginhub tyunta/prefab-sentinel --plugin prefab-sentinelApplies four-stage variant edits (preflight/dry-run/confirm/runtime) to Unity Prefabs, Scenes, and Assets without corruption. Triggers on patch, set_property, revert_overrides, or Prefab Variant changes.
Controls the Unity Editor from the terminal via the `ucp` CLI. Automates scenes, GameObjects, assets, builds, tests, packages, and profiling over a WebSocket/JSON-RPC bridge.
Manages Unity assets: dependency inspection, reference integrity checks, prefab/scriptable-object creation, and package add/remove via the `u` CLI.