XAF Logic Explainer について
XAF Logic ExplainerはRoslynでXAFのソースからエンティティ、コントローラー、ルール、ナビゲーション、Model Editor設定を抽出します。DevExpress XAFアプリを保守するチーム向けに、ソースから確定できない点も明示してエージェントに情報を提供します。
主な機能
- 01エンティティ、プロパティ、関連を解析
- 02コントローラー、アクション、業務ルールを抽出
- 03ナビゲーションと.xafml設定を読み取り
- 04ビュー、レポート、マイグレーションを分析
- 05エージェント向け指示とHTML説明を生成
活用シーン
- 01コーディングエージェントからエンティティやアクションを照会
- 02画面でコントローラーが読み込まれる理由を追跡
- 03レガシーXAFアプリの引き継ぎ資料を作成
MCP 対応
MCPサーバーは、エンティティ、コントローラー、ルール、モデル、レポート、ビューなどを照会するツールを提供し、ソースの再読み込みにも対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
XAF Logic Explainer
AI コーディングエージェントに、あなたの XAF アプリケーションが実際に何をするのかを教えましょう。
XAF モジュールを指定すると、エンティティ、コントローラー、アクション、ビジネスルール、 ナビゲーション、Model Editor のカスタマイズをソースから直接読み取り、その結果を あなたが使うエージェントに渡します。
このプロジェクトの目的
DevExpress は、AI エージェントが XAF に精通するための優れた取り組みを行ってきました。すでに 2 つの要素があり、これが 3 つ目です。
| エージェントに教える内容… | ツール |
|---|---|
| XAF の一般的な仕組み | DevExpress agent-skills |
| 公式ドキュメントの内容 | DevExpress Docs MCP Server |
| あなたのアプリケーションが何をするか | XAF Logic Explainer ← ここです |
XAF ドキュメントのすべてのページを読んだエージェントでも、Invoice の合計が明細から計算されること、
期間が締められていると ApproveController が実行されないこと、3 つの列が Model Editor で非表示にされ、
C# ファイルには一切記述されていないことは、まだ知りません。エージェントはこの 3 つすべてを
自信たっぷりにでっち上げてしまいます。
この課題は、より優れたプロンプトでは解決できません。抽出によって解決できます。
これらのツールは組み合わせて使えます。 フレームワークの知識には DevExpress のスキルを、 公式リファレンスには Docs MCP を、独自のコードベースにはこのツールを使ってください。どれか 1 つが ほかのツールの代わりになるわけではありません。
抽出する内容
以下のすべては、Roslyn を使用して構文として読み取られます。プロジェクトをコンパイルする必要はなく、このツールが DevExpress アセンブリにリンクすることもありません。
- エンティティ — プロパティ、型、関連付け、およびそれらに意味を与える XAF 属性(
[Association]、[Aggregated]、[RuleRequiredField]、[Appearance]、[ModelDefault]、…)。 アプリケーションでの宣言方法を問わず見つけます。XPO の基底クラス経由、実際のプロジェクトで使われるあらゆる表記のDbSet<T>経由、ジェネリックコンテキストの基底クラスの型引数経由、さらに参照プロジェクト内にある基底クラス経由でも見つけます。空の回答も一つの断定です。そのため、ルールはより多く読み取る方向に傾いています。それでも読み取れないものは、記憶に頼らず、文書化して明示します。 - アプリケーションがデータの永続化に使用する ORM — 隣に何があるかではなく、プロジェクト自体が宣言している内容から判断します。XPO アプリケーションの隣に EF Core のキャッシュがあっても EF Core にはなりません。その答えはエージェントファイルに確定ルールとして記載されます。
- 対象とするフレームワーク — プロジェクトファイルで使われるあらゆる表記を対象にします。現代の多くのリーダーが探さない、SDK 導入前の
<TargetFrameworkVersion>v4.8も含みます。.NET Framework では、その環境で実際に利用できないものについての基本ルールがエージェントファイルに追加されます。その範囲は多くの人が想定するよりも狭く、そのように明記されます。 - コントローラーとアクション —
SimpleAction、PopupWindowShowAction、SingleChoiceAction、それらの対象条件、および実行時に呼び出されるハンドラーコード。 - ビジネスルール — 検証属性とコードルール、およびそれらに付随する条件。
- モジュールの設定 —
ModuleUpdaterのシードデータと、初回実行時に作成されるもの。 - ナビゲーション — ユーザーが実際に目にするグループと項目。
- Model Editor(
.xafml) — C# だけを読む人には見えない、XML にのみ存在するカスタマイズ。モジュールとプラットフォームのファイルは、XAF がマージする方法と同じようにマージされます。 - カスタムのプロパティエディターとリストエディター — 動作に不可欠な JavaScript や、
View.CustomizeViewItemControl<T>()を通じて実行時に再設定される組み込みエディターも含みます。これらはモジュールと並ぶプラットフォームプロジェクト内にあるため、ビジネスオブジェクトを読むだけでは見つかりません。 - バージョン条件付きの移行 — アップデーター内の
CurrentDBVersion < new Version(…)ブロック。それぞれのブロックは、どのデータベースに対しても最大一度だけ実行され、現在のコードでは説明できないデータを説明する唯一の手掛かりです。 - レポート — 各レポートの対象、レイアウト内のフィルター、計算フィールドとバインド式、開くパラメーターダイアログ、さらに回答をフィルターに変換する
GetCriteria()まで確認します。デザイナーコード、.repx、またはレポート自身のコンストラクターから読み取ります。 - すべての画面と、そこに読み込まれる内容 — 以下を参照してください。
これらがあるため、すべてのビジネスクラスを読み込んだエージェントでも、アプリケーションについて自信満々に誤った説明をすることがあります。
## この画面を開いたときに実行されるもの
XAF リポジトリには、その答えを示すものはありません。しかも、理由は異なりますが、どちらの情報も欠けています。
画面そのものは、どのファイルにもありません。 XAF は各ビジネスクラスにリストビュー、詳細ビュー、ルックアップビューを生成し、各コレクションにもリストビューを生成します。また、Model Editor に保存されるのは、誰かが変更したものだけです。ソース内を Patient_Prescriptions_ListView で検索しても見つかりませんが、それは存在しない証拠ではありません。
どのコントローラーが実行されるかは、実行時に決まります。 XAF は、ネスト状態、ビューの種類、オブジェクトの種類、ビュー ID という 4 つの条件を AND で組み合わせます。未設定の条件には制限がないため、どの条件も設定していないコントローラーは、すべての画面に読み込まれます。
これは、フレームワーク独自の ID 生成器を使って構築したビュー一覧に対し、ViewController.IsFitToView が評価する方法と同じように、4 つの条件すべてを読み取ります。また、それぞれが一致した理由も記録するため、答えを鵜呑みにせず検証できます。
2 つのレイヤーは分けて扱います。チームが作成したものは詳しく説明し、XAF が提供するものは 1 行にまとめて折りたたみます。量が多く、変更できるものでもないからです。正解を示すカタログがあれば、XAF の提供物にも名前を付けます。実際に登録しているモジュールだけを対象とするため、WinForms のコントローラーが Blazor の画面に表示されることはありません。
ここでは、コントローラーが Active["reason"] を通じて自らを無効にする可能性までは断定しません。これはデータとユーザーに依存します。ここに表示されるのは、XAF が画面に読み込むものであり、必ず何かを実行するものとは限りません。ソースから読み取れなかったものは、黙って「どこでも実行される」と扱うのではなく、その理由とともに別に一覧表示します。
これらを信頼できるかどうかは、レポートを見ればわかります
ここにある他のセクションはすべて、見えなかったものを見つけたという主張です。このセクションはその逆で、むしろこちらのほうが役に立ちます。
Reports V2 を使うと、ユーザーは実行時にレポートを設計できます。レポートはファイルではなく、データベースの行として保存されます。そのため、このツールを含め、リポジトリを読み取るツールには見えません。レポートが 40 件あるのにソースには 1 件もないアプリケーションは珍しくありません。レポート機能の設定がうまくいっていれば、そうなるものです。
そのため、わかっていることに応じて答え方が変わります。
| アプリケーションの状態 | 表示される内容 |
|---|---|
ReportsModuleV2 がない | 「これがすべてです」 — 実行時に追加されるものはありません |
| モジュールが登録され、ソースにレポートがある | 「この一覧は下限です」 |
| モジュールが登録され、ソースにレポートがない | 「実際の件数は0 ではなく不明です」 |
最後の行がよくあるケースです。自信たっぷりに答えるツールが大きな問題を引き起こすのもここです。「このアプリケーションにはレポートがありません」と伝えられたエージェントは、レポートを 40 件作成したユーザーがいるアプリケーションでも、レポートが存在しない前提で設計します。AGENTS.md には、次のように明記されています。
件数は不明であり、0 ではありません。このアプリケーションにはレポートがないと、誰にも伝えてはいけません。
同じルールは、フレームワークのカタログにも適用されます。お使いのマシンのカタログが DevExpress 26.1 を示し、アプリケーションが 23.2 を宣言している場合、フレームワークに関するすべての回答で両方のバージョンを示し、確実であるかのようには提示しません。
「それは見えません」と決して言わないツールは、能力が高いのではありません。検証しにくいだけです。
クイックスタート
dotnet tool install -g XafLogicExplainer.Cli
xaflogic agents --project "C:\MySolution\MyApp.Module"
これにより、ソリューションのルートに AGENTS.md、CLAUDE.md、.github/copilot-instructions.md が作成されます。アカウントも、API キーも、サーバーも必要ありません。次の質問から、エージェントはアプリケーションを理解できます。
生成される内容と、二段階に分かれている理由
AGENTS.md はリポジトリ内でエージェントが行う すべての リクエストに先頭で追加されるため、そのコストは永続的に発生します。エンティティの詳細を 70 KB 分も詰め込むと、肝心の質問を入れる余地がなくなります。そのため、出力を階層化しています。
AGENTS.md | 約 11 KB | 常に読み込み:基本ルール、完全な一覧、規約、レシピ |
.xaflogic/*.md | 約 70 KB | 必要に応じて読み込み:すべてのプロパティ、ハンドラーコード、ルールメッセージ、.xafml |
最も価値のある部分は、最も小さい部分です。AGENTS.md は基本ルールから始まります。このアプリケーションでは XPO を使用し、EF Core は使用しないこと、一覧は完全であり、記載されていないものは本当に存在しないこと、そして一部の動作は C# ではなく Model Editor に定義されていることです。このわずか数段落が、エージェントが見慣れない XAF コードベースについて自信満々に作り上げてしまう内容のほとんどを防ぎます。
既存のファイルが上書きされることはありません。生成されたテキストはマーカーの間に配置され、手作業で書いた内容はすべて保持されます。また、変更がなければ再生成してもバイト単位で同一です。
または、エージェントに直接質問させる
生成ファイルはスナップショットです。MCP サーバーはライブ接続です。エージェントは作業中のアプリケーションに問い合わせるため、情報が古くなることはありません。
/plugin marketplace add peopleworks/XAFLogicExplainer
/plugin install xaf-logic-explainer@peopleworks-xaf
これにより、スキルと MCP サーバーを一度にインストールできます。それ以外の MCP クライアントでは、インストールせずに NuGet から直接実行するか、
{
"mcpServers": {
"xaf": { "command": "dnx", "args": ["XafLogicExplainer.Mcp", "--yes"] }
}
}
CLI がすでにある場合は、それを指定します。
{ "mcpServers": { "xaf": { "command": "xaflogic", "args": ["mcp"] } } }
ソリューションのディレクトリから起動すると XAF モジュールを自動検出するため、どちらの方法でもパスは不要です。
| ツール | 回答できること |
|---|---|
xaf_overview | このアプリケーションの概要と、アプリケーション内にあるすべての項目の完全な一覧 |
xaf_search | フィールド、概念、業務用語が定義されている場所 |
xaf_entity | 1 つのエンティティにあるすべてのプロパティ、リレーションシップ、ルール、計算 |
xaf_controller | アクションの動作と、実行時に呼び出される C# コード |
xaf_rules | アプリケーションが検証、計算、非表示、無効化するもの |
xaf_model | C# ファイルには存在しない Model Editor のカスタマイズ |
xaf_editors | カスタムエディター、それらに必要な JavaScript、実行時に変更される組み込みエディター |
xaf_migrations | 稼働中のデータベースに対して一度だけ実行された処理と、その理由を説明するコメント |
xaf_reports | 各レポートの対象、レポート内のフィルター、レポートを開いたときに表示されるダイアログ |
xaf_view | 1 つの画面に読み込まれるすべての内容、有効になるコントローラー、その理由 |
xaf_walkthrough | 1 つのプロセスの最初から最後までの動作 — 実行される処理、その順序、追跡できなかった箇所 |
xaf_refresh | ソースを再読み込みします(変更は自動的に検出されます) |
存在しないものについて質問すると、役立つ回答が返ってきます。
このアプリケーションに 'PurchaseOrder' というエンティティはありません。 ソースツリー全体から抽出された、19 個のエンティティの完全な一覧はこちらです:… ユーザーが 'PurchaseOrder' の存在を想定している場合、まだ作成されていません。
公式の DevExpress スキルと組み合わせてください。 /plugin install dx-xaf@DevExpress-agent-skills
は XAF の仕組みを教え、こちらはアプリケーションの動作を教えます。前者だけを使うエージェントは、存在しないエンティティを対象に、正しい XAF コードを書いてしまいます。
同じ知識を、ある人のために
エージェントは AGENTS.md を読み取るか、MCP サーバーに問い合わせます。10年前の XAF アプリケーションを引き継いだばかりの人には、同じ事実をまったく違う形でまとめる必要があります。
xaflogic explain --project "C:\MySolution\MyApp.Module" --open
HTML ファイルは1つだけです。サーバーも、ビルド手順も、ネットワークへのリクエストも不要です。インターネットに接続されていないマシンでも、メールの添付ファイルから開けます。実際の引き継ぎは、まさにそのように行われます。
コードベースに散在する関連属性から、ドメインモデルの地図を作成します。自分たちのドメインモデルを見たことがないチームは少なくありません。誰か1人の頭の中にしか存在せず、その人が去ると失われてしまう知識です。

このリポジトリのサンプルアプリケーションから生成した実際の出力です。エンティティにカーソルを合わせると、関係のない要素がすべて薄く表示されます。紫色は、親の削除時に子も削除されることを示します。
あわせて、すべてのエンティティと各プロパティの内容、実行するコードを含むすべてのアクション、ユーザーに実際に表示されるメッセージ付きのバリデーション、そして C# ファイルには記述されない Model Editor の設定も確認できます。
さらに、アプリケーション内のすべての条件式をまとめたインデックスも作成します。SQL とも C# とも異なる構文で、ソース全体に散らばる属性から収集され、ほかではまとめられていません。
自分のコードには触れずに、サンプルで試してみてください。
xaflogic explain --project tests/XafLogicExplainer.Tests/Fixtures/DemoSolution/PharmacyDemo.Module --open
1つのアプリケーションでは答えられない問い
10年間にわたり、クライアント向けにXAFアプリケーションを開発してきました。その間のどこかで、いままた書こうとしているクラスをすでにモデル化していたはずですが、どのプロジェクトだったのか思い出せません。
xaflogic projects add --name pwLegalOffice --project "C:\Clients\Legal\pwLegalOffice.Module"
xaflogic projects add --name Presupuesto --project "C:\Clients\Budget\PWPresupuesto.Module"
xaflogic wiki --open
すべてのアプリケーションを横断する1つのHTMLファイルと、単一プロジェクト向けのツールにはないセクションがあります。
- 複数回モデル化したクラス — プロパティごとの比較により、4回目に書き直す前に、どのアプリケーションで
Clienteが最も詳細にモデル化されているかを確認できます。 - 自分で書いたレイヤー — あるアプリケーションから別のアプリケーションへ引き継いだ基底クラスです。文書化されることのなかった、独自のフレームワークです。基底クラスが一覧に載るのは、いずれかのプロジェクトでそのクラス自体のソースを読み取った場合だけです。そのため、次のリリースで古くなるDevExpress型名のリストと照合されることはありません。
- 同じ名前でも異なる形 — あるアプリケーションでは
Totalがdecimal、別のアプリケーションではdoubleになっているケースです。どちらにも問題はなく、それぞれコンパイルできます。こうして合計に2セントの差が生まれます。 - 使い続けている名前 — アプリケーションで使われている語彙です。誰も書き残していないため、参加した人は皆、コードを読んで覚える必要があります。
同じ読み取り結果から、プロジェクト群全体のマップも作成されます。
このリポジトリにある3つのサンプルクライアントモジュールから生成した実際の出力です。各クラスは、それをモデル化しているアプリケーションの平均的な方向に配置され、合意の度合いに応じて距離が決まります。そのため、すべてのアプリケーションに存在するクラスは中央に配置されます。中央は共通部分、外周はクライアント固有の作業を表します。
さらに、コーパスからしか生成できないものが2つあります。最もよく似ているプロジェクトの組み合わせは、クリックするとページをその2つだけに絞り込めるグリッドで表示されます。また、プロジェクト群が対応するDevExpressのリリースも表示され、フレームワークカタログが実際に説明しているリリースには印が付きます。これにより、DevExpressの型に関するすべての記述について、適切なリリースに基づいて確認したものかどうかがわかります。
表示される情報はすべて、読み取った内容から計算されます。誰かがコーパスについて入力した文章をページに追加する場所はありません。9つのアプリケーションを手書きでまとめた要約は、10個目を追加した日に誤りになりますが、誰も気づかないからです。
プロジェクトで絞り込むと、ほかのプロジェクトと共通する内容だけを確認できます。そして、このページには正直な説明もあります。2つのクラスは名前で照合されるため、Wikiが示すのは同じ名前を持つということです。同じ概念を表しているかどうかは、比較結果で確認できます。
同じナレッジをドキュメントに
一度も見たことのない XAF プロジェクトに着手し、半日後にはそのプロジェクトについてのドキュメントを誰かに渡します。最後のステップはこのツールの役割ではありません。xaflogic extract は Markdown を出力し、mcpOffice — DevExpress Office File API を基盤とする MCP サーバー — が Markdown を .docx に、.docx を PDF に変換します。両方のサーバーを接続すると、エージェントが一方からもう一方へドキュメントを渡します。ここに Word エクスポーターはなく、今後も追加されません(#28)。XAF アプリケーションの読み取りに DevExpress は必要なく、今後も必要ありません。
xaflogic extract --project "C:\MySolution\MyApp.Module"
# writes .xaflogic-output/MyApp_Full.md, and one file per section beside it
次に、エージェントに指示します。
.xaflogic-output/MyApp_Entities.mdをword_create_from_markdownで Word ドキュメントに変換し、続けてword_convertで PDF に変換してください。
読者が一つの対象者層に絞られる場合は、_Full.md ではなくセクションファイルを渡してください。_Entities.md はデータディクショナリ、_BusinessRules.md はルール、_Controllers.md はボタンの動作を説明します。word_create_from_markdown は templatePath を受け取るため、見出し、表、ヘッダー、フッターには独自の .dotx を使用できます。
このリポジトリのサンプルアプリケーションで検証済みです。すべての見出しが Word の見出しになり、ドキュメントのアウトラインに表示されます。プロパティの表は通常の表になり、フェンス付きの C# コードは網掛けされた等幅フォントになり、リスト、太字、インラインコードも保持されます。生成された Markdown に HTML は含まれておらず、テストによってその状態が保たれています。
mcpOffice は DevExpress の API で Office ファイルを書き出すため、DevExpress ライセンスが必要です。XAF アプリケーションを実行しているなら、ライセンスをお持ちです。セットアップについては使用ガイドをご覧ください。
オプション:自分のコードと DevExpress のコードを見分ける
抽出処理は、コードがどのフレームワークを対象としているかを把握せずにソースを読み取ります。そのため、次の疑問には答えられません。DeleteObjectsViewController はチームが作成したものなのか、それとも DevExpress が提供するものなのか。答えがなければ、生成されるドキュメントでは、フレームワークの動作と独自のロジックが同じものとして扱われます。
DevExpress ライセンスをお持ちの場合:
xaflogic catalog build
これはご自身のインストール環境を読み取り、XAF 自体が提供する属性、コントローラー、モデルインターフェイス、モジュールを記録します。公式の概要と、DevExpress が提供するドキュメントへのリンクも含まれます。DevExpress 26.1 では、フレームワークの型が約 850 件あります。
DevExpress のソースコードコンポーネントもインストールしている場合は、各フレームワークコントローラーがどの条件で有効になるかも記録されます。これは、XAF が実行前に確認する 4 つの条件です。アセンブリからは読み取れません。組み込みコントローラーの 5 つに 4 つは、コンストラクター内でターゲットを設定しているためです。ソースコードがアセンブリの隣にない場合は、--dx-sources <Components/Sources> を渡してください。
その後、抽出処理が自動的にカタログを取り込み、通常は得られない次のような情報を示せるようになります。
- 「
ArchiveControllerは組み込みのDeleteObjectsViewControllerを拡張しています」 — 機能を追加しているのではなく、アプリケーション全体の削除動作を変更しています。 - 「
[AuditedByFinance]は XAF や .NET の属性ではありません」 — チームが独自に作成したもので、その意味はこのコードベースにのみ存在し、どのドキュメントにも記載されていません。 - 「フレームワークのコントローラー 32 個もこの画面に読み込まれます」 — 各コントローラーの名前と動作を示し、アプリケーションが実際に登録するモジュールに限定して表示します。そのため、WinForms のコントローラーが Blazor の画面に表示されることはありません。
カタログは ~/.xaflogic/catalog/ に書き込まれ、リポジトリには決して書き込まれません。ライセンス対象ソフトウェアから生成されるためです。カタログがなくてもすべての機能は使えます。カタログは出力の精度を高めるだけです。NOTICE.mdをご覧ください。
コマンド
| コマンド | 説明 |
|---|---|
agents | エージェント向けの AGENTS.md / CLAUDE.md / Copilot の指示を作成します |
mcp | MCP サーバーとして実行し、エージェントがアプリをリアルタイムで照会できるようにします |
explain | アプリを人に説明する、自己完結型の HTML ページを作成します |
wiki | すべてのプロジェクトをまとめて読み、共通点を説明します |
catalog | DevExpress の正解データカタログを構築します(build、status) |
extract | プロジェクトを読み取り、Markdown と JSON をローカルに書き出します |
walkthrough | 1 つのビジネスプロセスをトレースします — 何がどの順序で実行され、何がそれを制御するのかを示します |
diff | 前回の抽出結果と比較し、変更点を報告します |
status | 変更検出用のハッシュと、再抽出が必要かどうかを表示します |
watch | ファイルの変更時に、デバウンス処理を行って再抽出します |
sync | 抽出してリモートターゲットに公開します |
chat | 抽出したプロジェクトについて質問します |
config | ~/.xaflogic/config.json にデフォルト値を設定します |
projects | 複数の XAF プロジェクトを管理します。ほとんどのコマンドは --all を受け付けます |
ドキュメントは英語またはスペイン語で生成されます(--lang en|es)。
便利なフラグ:--orm auto\|xpo\|efcore、--lang en\|es、--enrich(コントローラーとアクションごとに AI が生成するビジネスロジックの要約)、--force、--all。
1 つのプロセスをトレースする
xaflogic walkthrough --from ApproveOrder # to the screen, or > process.md
xaflogic walkthrough --from ApproveOrder --depth 4 --out docs/approval.md
何がどの順序で実行され、どのエンティティに触れ、どのルールがそれらを制御するのかを示します。各ステップには file:line が記載され、Mermaid 図はトレース自体から生成され、モデルが描画することはありません。 トレースで追跡できなかった呼び出しは省略せずに一覧表示されるため、一覧が空なら、その経路は本当に完全です。--narrate を追加すると、各ステップの説明文が生成されます。実際のステップを特定できない段落は、表示前に削除されます。
xaflogic walkthrough --from ApproveOrder --since # against the last extraction
--since は、保存済みのスナップショットを使って同じプロセスを再度たどり、このプロセスの何が変わったのかを報告します。追加されたステップ、そのステップを新たに制御するルール、書き換えられた本体、なくなった分岐、トレースで追跡できなくなった呼び出しなどです。会話型エージェントには昨日の状態がないため、どのエージェントにもこれに答えることはできません。
--enrich と --narrate にはモデルが必要です。次のいずれかがあれば十分です。コマンドラインで指定したキーが優先され、次に環境変数、最後に、利用可能であれば PeopleWorks Copilot アカウントが使われます。
xaflogic extract --enrich --api-key sk-... # or any OpenAI-compatible endpoint:
xaflogic extract --enrich --api-key ... --ai-base-url http://localhost:11434/v1 --ai-model qwen2.5-coder
export OPENAI_API_KEY=sk-... # picked up with no configuration at all
export ANTHROPIC_API_KEY=sk-ant-...
このツールのその他すべての機能は、キー、アカウント、ネットワークがなくても実行できます。ウォークスルーも同様で、説明文の生成を除きます。
抽出は増分方式です。.cs ファイルと .xafml ファイルの SHA-256 ハッシュを使うため、変更のないプロジェクトでは何も行いません。ビルド時に実行する場合は、MSBuild の .targets ファイルを利用できます。
ステータス
v0.17.2。 抽出エンジンは成熟しており、実際の XAF アプリケーションで本番稼働しています。エージェント向けの機能は、現在オープンに開発を進めています。
| ✅ | Roslyn による抽出 — エンティティ、コントローラー、ルール、アップデーター、ナビゲーション、.xafml |
| ✅ | XPO と EF Core。どちらを使うかは、プロジェクト自体の宣言に基づいて決定します |
| ✅ | 参照先プロジェクトの基底クラスを読み取るため、共有フレームワークライブラリが空白のページになることはありません |
| ✅ | あらゆる形式のプロジェクトファイルからターゲットフレームワークを取得し、AGENTS.md に .NET Framework の基本ルールを記載 |
| ✅ | カスタムプロパティエディターとリストエディター、それらのクライアントアセット、および実行時に再構成される組み込みエディター |
| ✅ | バージョン管理されたデータ移行 — 新規ではないデータベースで何が起きたかを確認できます |
| ✅ | 増分変更検出、差分レポート、マルチプロジェクト、監視モード |
| ✅ | ウォークスルー — 1 つのプロセスを最初から最後まで追跡し、そのトレースから生成される図、追跡できなかった呼び出し、--since |
| ✅ | コントローラーとアクションの AI による拡充(--enrich) |
| ✅ | Blazor のアプリ内ヘルプパネル |
| ✅ | AGENTS.md / CLAUDE.md / Copilot の指示 — インフラは不要で、誰でも利用できます |
| ✅ | xaflogic explain — エージェント向けではなく、人が読むための自己完結型 HTML ページを 1 つ生成します |
| ✅ | xaflogic wiki — すべてのプロジェクトを 1 ページにまとめ、共通点も示します |
| ✅ | プラグイン可能な公開先(IDocumentationSink) |
| ✅ | MCP サーバー — ソースに対してリアルタイムに動作する 12 個のツール |
| ✅ | スキルと MCP サーバーを備えたインストール可能な Claude Code プラグイン |
| ✅ | 合成 XPO および EF Core フィクスチャを使った 721 件のテスト — DevExpress は不要です |
| ✅ | DevExpress の正解カタログ。ライセンス保有者がローカルで生成できます |
このツールが生まれた PeopleWorks Copilot は、今ではいくつかある公開先の 1 つであり、すべてをそこに向けて構築する必要はなくなりました。最も重要な出力は、サーバーなしで利用できます。
詳細
XAF アプリケーションの動作の 3 分の 1 がビジネスクラスの外に存在する理由、それが隠れている 4 つの場所、そして抽出結果の実際の姿については、こちらをご覧ください。
- コーディングエージェントは XAF を知っています。しかし、あなたのアプリケーションは見たことがありません。
- Tu agente de código sabe XAF. Nunca ha visto tu aplicación. — スペイン語
それぞれ、もう一方から翻訳するのではなく、それぞれの言語で執筆されています。ソースは
docs/Blog/ にあります。
リポジトリ構成
src/
XafLogicExplainer.Core Roslyn extraction engine — no DevExpress reference
XafLogicExplainer.Mcp MCP server (ModelContextProtocol 2.1)
XafLogicExplainer.Cli the `xaflogic` command
XafLogicExplainer.CopilotSync PeopleWorks Copilot target + AI enrichment
XafLogicExplainer.DescriptionAnnotator generates missing [Description] attributes
XafLogicExplainer.Blazor in-app help panel for XAF Blazor apps
plugins/
xaf-logic-explainer the installable Claude Code plugin
.NET 10 を基盤としています。
DevExpress パッケージを参照するのは XafLogicExplainer.Blazor のみです。ビルドには DevExpress NuGet フィードとライセンスが必要です。それ以外はどこでもビルドできるため、CI で無料で検証できます。
貢献
最も価値のある貢献は、抽出できなかったものを教えていただくことです。XAF は非常に大規模で、各コードベースで使われる機能も異なり、フレームワーク全体を網羅するプロジェクトはありません。まさにこのために抽出漏れの Issue テンプレートを用意しています。プロジェクトで使っている XAF のパターンと、ツールが検出できなかった内容をお知らせください。
CONTRIBUTING.md をご覧ください。バグ報告、ドキュメント、翻訳も歓迎します。
ライセンス
MIT。DevExpress との関係については NOTICE.md をご覧ください。
独立したコミュニティプロジェクトであり、Developer Express Inc. とは提携関係になく、同社による承認やサポートも受けていません。DevExpress のソースコードは含まれておらず、ビルドや実行に DevExpress のライセンスは不要です。DevExpress、XAF、eXpressApp Framework は Developer Express Inc. の商標です。
Pedro Hernández(PeopleWorks)が、Microsoft MVP for .NET として、DevExpress および XAF コミュニティのために開発しました。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。