mcpField
D
droidmap

droidmap

ローカル
github.com開発ツール01 日前に更新

droidmap について

droidmapは、Room、Navigation、依存性注入、Gradleモジュールの関係を含むAndroidプロジェクトのグラフを構築します。開発者、コードレビュー、コーディングエージェント向けに変更影響やルールを分析し、ソースを読むだけでプロジェクトをコンパイルしません。

主な機能

  1. 01Androidのコンポーネントとモジュール依存の可視化
  2. 02Room、Navigation、注入ルールの検査
  3. 03変更影響と対象テストの分析
  4. 04プロジェクトレポートと図の生成
  5. 05プルリクエストへの影響概要の投稿

活用シーン

  1. 01マージ前にデータベース移行とルートを確認
  2. 02変更影響を調べて実行するテストを選定
  3. 03プルリクエストで影響を受けるモジュールを提示
  4. 04コーディングエージェントから依存関係を照会

MCP 対応

stdioのMCPサーバーとして動作し、影響分析、差分、ルール検査、ノード参照、検索、レポート、ルール説明をクライアントに提供します。ファイル変更に応じてグラフを更新し、エージェントが編集状況に沿った分析を取得できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"hussainshirazi-droidmap": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/hussainshirazi/droidmap:0.3.0"
]
}
}
}
起動コマンドdocker run -i --rm ghcr.io/hussainshirazi/droidmap:0.3.0

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocighcr.io/hussainshirazi/droidmap:0.3.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

droidmap

CI Release License MCP Registry

あなたのプロジェクトを、あなた自身やプルリクエスト、AI コーディングエージェントのためにマップ化します。Android を理解したマップです。

汎用的なコードグラフはクラスや呼び出しを認識します。しかし、次のようなことは認識できません。

  • Room データベースのバージョン 4 からバージョン 5 へのマイグレーションがないため、バージョン 4 を使っているユーザーが更新時にクラッシュすること。
  • エンティティに列を追加したのにデータベースのバージョンを更新していないため、これも更新時にクラッシュすること。
  • マイグレーションテストの名前は migrationFrom1To4 ですが、実際には 1→2→3→4 を実行している一方、バージョン 1 のユーザーには MIGRATION_1_4 が適用され、どのテストもそれを実行しないこと。
  • navigate("settings") が、どの NavHost にも登録されていないルートを指していること。
  • ViewModel が、Hilt でも Koin でも何もバインドしていないリポジトリをインジェクトすること(Koin では実行時にクラッシュします)。
  • ライブラリがマージ済みマニフェストに ACCESS_NETWORK_STATE を追加したこと。
  • モジュールルールで禁止されているにもかかわらず、機能モジュールが build-logic のコンベンションプラグインを介して :core:data を取得していること。

droidmap は Android の配線を直接読み取ります(Gradle、Room、Navigation、Hilt、Koin、マニフェストを、Kotlin と Java から読み取ります)。それをグラフに変換します。CI でルールを実行し、各プルリクエストに変更の影響範囲を知らせるコメントを付け、変更前にクラスの依存先を確認し、MCP 経由で AI エージェントに渡せます。

ソースファイルのみを読み取ります。Gradle の実行やコードのコンパイルは行わず、データをどこかに送信することもありません。(GitHub Action は、依頼された場合に限り、マージ済みマニフェスト用の Gradle タスクを 1 つ実行します。)

ターミナルで実行した droidmap check と droidmap diff

実際のアプリでの使用例

Now in Android(35 モジュール、Hilt、Room、Navigation 3)で、ノート PC 上にて、それぞれ約 1.5 秒で実行できます。

$ droidmap check
warning room-migration-untested      core/database/src/main/kotlin/com/google/samples/apps/nowinandroid/core/database/NiaDatabase.kt:66
        NiaDatabase: 13 of 13 migration steps have no MigrationTestHelper test (1->2, 2->3, 3->4,
        4->5, 5->6, 6->7, 7->8, 8->9, 9->10, 10->11, 11->12, 12->13, 13->14)

1 warning

OfflineFirstTopicsRepository.syncWith を 1 行変更した後の結果です(出力を短縮しています)。

$ droidmap diff
Changed (1): OfflineFirstTopicsRepository (injectable)

Affected (what depends on the changed code):

  Screens: ForYouScreen, InterestsScreen, TopicScreen
  Navigation destinations: ForYouNavKey, InterestsNavKey, TopicNavKey
  ViewModels: ForYouViewModel, InterestsViewModel, TopicViewModel
  Dependency injection: DataModule.bindsTopicRepository, GetFollowableTopicsUseCase, SyncWorker
  Modules: :app, :app-nia-catalog, :core:data, :core:data-test, :core:domain, ... and 12 more

Tests that cover it (1): OfflineFirstTopicsRepositoryTest

$ droidmap diff --format tests
:core:data:test --tests com.google.samples.apps.nowinandroid.core.data.repository.OfflineFirstTopicsRepositoryTest

最後の行を CI で ./gradlew にそのまま渡せます。テストスイート全体ではなく、テストクラス 1 つだけを実行します(変更によって失敗する可能性のあるテストだけを実行するを参照)。

インストール

macOS または Linux:

curl -fsSL https://raw.githubusercontent.com/hussainshirazi/droidmap/main/install.sh | sh

Windows(PowerShell):

irm https://raw.githubusercontent.com/hussainshirazi/droidmap/main/install.ps1 | iex

Homebrew:brew tap hussainshirazi/droidmap https://github.com/hussainshirazi/droidmap を実行してから、brew install droidmap を実行します。Scoop:scoop bucket add droidmap https://github.com/hussainshirazi/droidmap を実行してから、scoop install droidmap/droidmap を実行します。

GitHub Actions 以外の CI システム(GitLab、Bitbucket、Jenkins、Bitrise)で使う Docker:docker run --rm -v "$PWD":/project ghcr.io/hussainshirazi/droidmap check(バージョン 0.2.0 以降)。

Gradle(バージョン 0.3.0 以降。Gradle Plugin Portal への公開後に利用可能)では、ルートの build.gradle.kts に追加します。./gradlew droidmapCheck を実行すると、エラーがある場合にビルドが失敗します。

plugins { id("io.github.hussainshirazi.droidmap") version "0.3.0" }

droidmap {
    failOn.set("warning")       // error (the default), warning, info or never
    mergedManifest.set(true)    // run each processReleaseMainManifest first: library permissions are checked too
}

または、最新リリースから droidmap.jar をダウンロードし、java -jar droidmap.jar を実行します。droidmap には Java 17 以降が必要です。droidmap コマンドは JAVA_HOME、PATH 上の java、または Android Studio に付属する Java を使用します。そのため、Android Studio がインストールされていれば、追加の設定は不要です。Kotlin コンパイラーのパーサーを同梱しているため、jar のサイズは約 65 MB です。

クイックスタート

プロジェクト内のどこからでも実行できます。

droidmap init                     # once: the GitHub workflow and the MCP config for AI agents
droidmap check                    # run the rules; exit code 1 on errors
droidmap impact TopicEntity       # what depends on it, transitively
droidmap diff                     # what your uncommitted changes touch
droidmap diff --base main         # what your branch touches
droidmap report -o REPORT.md      # an overview, with module and screen-flow diagrams

プルリクエスト時(GitHub Action)

droidmap init はこのワークフローを .github/workflows/droidmap.yml に書き込みます。

name: droidmap
on: [push, pull_request]

jobs:
  droidmap:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write   # findings as code scanning alerts
      pull-requests: write     # the comment that says what the pull request touches
    steps:
      - uses: actions/checkout@v7
      - uses: hussainshirazi/droidmap@v0

プルリクエストごとに、Action は変更が影響する内容をコメントし、プッシュのたびにそのコメントを更新します。

droidmap:この変更が影響する内容

origin/main との比較:変更されたファイルは 1 件で、そのうち 1 件を droidmap が読み取りました。

変更済み(1):ItemEntity room_entity

影響を受けるもの(変更されたコードに依存するもの):

画面HomeScreen
ViewModelHomeViewModel
RoomAppDatabase、ItemDao
依存関係の注入DataModule.bindItems、OfflineItemRepository
モジュール:app、:core:data、:core:database、:feature:detail-screen、:feature:home

変更によって宣言(遷移先、バインディング、DAO メソッド)が削除されると、コメントには 削除済み としてその宣言が記載され、まだそれに依存しているものは 影響を受けるもの として記載されます。

検出結果はコードスキャンのアラート、変更行の注記、ジョブの概要に表示され、エラーがある場合はステップが失敗します。Action に Java のセットアップは不要です。GitHub のランナーにすでにある JDK を使用します。ライブラリがマージ後のマニフェストに追加する権限も確認するには、merge-manifest: true を設定します。最初に ./gradlew processReleaseMainManifest を実行するため、そのジョブにはビルドで使用する JDK が必要です(actions/setup-java)。

入力デフォルト
path.Android プロジェクトのフォルダーがリポジトリのルートではない場合に指定します
fail-onerrorより厳しくするには warning または info、レポートのみを行うには never を指定します
commenttrueプルリクエストのコメントに影響の概要を表示しない場合は false を指定します(ジョブの概要には表示されます)
upload-sariftrueGitHub Advanced Security がないプライベートリポジトリでは false を指定します(公開リポジトリではコードスキャンを無料で利用できます)
args--config tools/droidmap.toml など、droidmap check に追加する引数
baseauto比較対象の Git ref:auto はプルリクエストのベースブランチ、none は比較を無効にします。それ以外の ref は取得する必要があります(例:fetch-depth: 0 を指定)
merge-manifestofftrue を指定すると、最初に processReleaseMainManifest を実行し、ライブラリが追加する権限も確認します。プロダクトフレーバーがある場合は、processProdReleaseMainManifest など、バリアントに対応するタスクを指定します。ビルドを実行するため、pull_request_target ワークフローでは絶対に使用しないでください
version固定されたリリース0.2.0 などの droidmap リリース
変更によって失敗する可能性のあるテストだけを実行する

droidmap diff --format tasks は、変更によって失敗する可能性のある各モジュールのテストタスクを一覧表示します。対象は、変更されたファイルを含むモジュールと、それらに依存するすべてのモジュールです(テスト内でのみ使用するモジュールは、そのテストだけが実行されます)。ビルド設定(settings、ルートのビルドファイル、gradle/、build-logic)に変更がある場合は、すべてのモジュールが一覧表示されます。Gradle ファイルのみを読み取るため、Gradle を実行せずに少しの時間で完了します。

      - uses: actions/checkout@v7
        with:
          fetch-depth: 0   # the base branch, to compare with
      - run: curl -fsSL https://raw.githubusercontent.com/hussainshirazi/droidmap/main/install.sh | sh
      - run: |
          tasks=$(~/.local/bin/droidmap diff --base origin/${{ github.base_ref }} --format tasks --task testDebugUnitTest)
          if [ -n "$tasks" ]; then ./gradlew $tasks; else echo "No module affected"; fi

--format modules は代わりにモジュールのパスを 1 行ずつ出力します。

--format tests はさらに絞り込み、呼び出しが変更された関数に到達するテストクラスだけを Gradle の引数として出力します(:core:data:testDebugUnitTest --tests com.example.OfflineRepositoryTest ...)。そのため、./gradlew $(droidmap diff --base origin/main --format tests --task testDebugUnitTest) を実行すると、対象のテストだけが実行されます。呼び出しは、コードで宣言された内容(プロパティやパラメーターの型、コンストラクター、関数の戻り値の型)をたどります。また、インターフェースへの呼び出しはすべての実装に到達するため、テストを多めに実行する方向に判定されます。テキストレポートと impact には、同じテストが「このコードをカバーするテスト」として表示されます。

AI エージェントで使用する(MCP)

droidmap mcp は、stdio を介して動作するModel Context Protocol サーバーです。ファイルが変更されるとグラフを再構築するため(変更されたファイルのみを解析します)、エージェントが編集するコードに沿った回答が得られます。

Claude Code プラグイン(サーバーと、Claude に使うタイミングを伝えるスキルを含みます。エンティティ、ルート、バインディングを変更する前の影響確認、変更後のチェックと実行すべきテストを案内します)。Java 以外にインストールするものはありません。また、Android Studio に付属する Java を自動で見つけます。初回起動時に、プラグインに対応する droidmap のリリースをダウンロードし、SHA-256 を検証します。

/plugin install droidmap --marketplace hussainshirazi/droidmap

Claude Code 2.1.275 より前のバージョンでは、まずマーケットプレイスを追加します:/plugin marketplace add hussainshirazi/droidmap。次に、/plugin install droidmap@droidmap を実行します。スキルは通常の SKILL.md ファイルです。スキルを読み込める他のエージェントも、同じファイルを使用できます。

任意の MCP クライアント。 droidmap init は .mcp.json(Claude Code)を作成し、該当するフォルダーが存在する場合は .cursor/mcp.json または .vscode/mcp.json も作成します。これらをコミットすれば、チーム全員がサーバーを利用できます。既存のファイルは変更せず、代わりに追加すべき内容を表示します。手動で設定する場合:

claude mcp add droidmap -- droidmap mcp .
{ "mcpServers": { "droidmap": { "command": "droidmap", "args": ["mcp", "."] } } }

Java 以外にインストールしない場合:"command": "java", "args": ["-jar", "/path/to/droidmap.jar", "mcp", "."]。Docker を使用する場合:"command": "docker", "args": ["run", "--rm", "-i", "-v", "/path/to/project:/project", "ghcr.io/hussainshirazi/droidmap", "mcp"]。droidmap は MCP Registry に io.github.hussainshirazi/droidmap として掲載されています(バージョン 0.2.0 以降)。

ツール用途
droidmap_impactエンティティ、ルート、ViewModel、バインディング、モジュールを変更する前に、何が依存しているかを確認します
droidmap_diff未コミットの変更(またはブランチ)が影響する範囲と、それらを対象とするテストを確認します
droidmap_check変更後にルールを実行します
droidmap_show1 つのノードの属性、依存関係、利用元を確認します
droidmap_find名前でノードを検索します
droidmap_reportプロジェクトの概要を Markdown 形式で取得します
droidmap_explainルールが重要な理由と、検出された問題の修正方法を確認します

droidmap が理解する内容

分野読み取る内容
Gradlesettings.gradle(.kts) に記載されたモジュール、Kotlin DSL と Groovy における project(":x") および型安全な projects.x.y の依存関係、バージョンカタログのプラグイン、インクルードビルド(build-logic)の慣例プラグインが、それを適用する各モジュールに追加するプロジェクト依存関係、Kotlin Multiplatform のソースセット(commonTest の依存関係はテスト依存関係です)。
Roomデータベース、エンティティ、DAO(各 @Query が使用するテーブルと、各 @Insert、@Update、@Delete、@Upsert が書き込むエンティティ。継承されたものも含みます)、手動マイグレーションと自動マイグレーション、エクスポートされたスキーマ JSON、各エンティティの列とその JSON の比較、どの MigrationTestHelper テストがどのマイグレーション手順を対象にしているか。
ナビゲーション文字列ルート(定数、テンプレート、ヘルパー関数から構築)または型安全なルートを使う Compose Navigation、Navigation 3(entry<Key> と、キーに対する when 内の NavEntry(key))、XML ナビゲーショングラフ(ファイルをまたぐもの、ディープリンク、メニュー項目、戻る操作のみを行うアクションを含む)、Kotlin と Java の navigate(...) 呼び出し:ルート、R.id アクション、Safe Args の方向指定(HomeFragmentDirections.actionHomeToDetail(id))、および navigateToTab(route) などの独自ヘルパー経由の呼び出し(最大5段階のヘルパーまで)。
Hilt@HiltViewModel、@Inject コンストラクターとフィールド、修飾子付きの @Provides と @Binds、エントリーポイント、および各画面、アクティビティ、フラグメントが使用する ViewModel。
Koinモジュールと定義(single、factory、viewModel、singleOf(::X)、bind)、Koin Annotations(JSR-330 対応。アノテーション付きクラスが対象となるのは、モジュールの @ComponentScan がそのクラスのパッケージをカバーする場合のみです)、各定義が get() で取得するもの、koinViewModel、koinInject、by inject() の使用箇所。
マニフェストソースマニフェストの権限(tools:node="remove" を含む)とコンポーネント、およびビルドによって生成されている場合は、統合マニフェストの権限と、それぞれを追加したライブラリ。

Kotlin と Java は、Kotlin コンパイラー自身のパーサー(detekt と ktlint が使用するもの)を使って、複数のスレッドで読み取られます。

コマンド

droidmap init   [path]                               # write the GitHub workflow and MCP config (never overwrites)
droidmap check  [path] [--format text|json|sarif] [--fail-on error|warning|info|never] [--sarif FILE] [--base REF]
droidmap impact <node> [path] [--depth N] [--json]   # what depends on a node
droidmap diff   [path] [--base REF] [--depth N] [--format text|markdown|json|modules|tasks|tests] [--task NAME]   # what a change touches
droidmap show   <node> [path] [--json]               # a node, its dependencies and its users
droidmap find   <text> [path] [--limit N] [--json]   # search nodes
droidmap report [path] [-o FILE]                     # the Markdown report, with Mermaid diagrams
droidmap build  [path] [-o DIR] [--node-link]        # write droidmap-out/graph.json and REPORT.md
droidmap rules                                       # list the rules and their default severities
droidmap explain <rule>                              # why a rule matters and how to fix what it finds
droidmap mcp    [path]                               # run the MCP server over stdio

[path] を指定しない場合、droidmap は現在のフォルダーを基準に Gradle プロジェクト(そのフォルダー以上の階層で最も近い settings.gradle(.kts))を対象にします。ターミナルでは出力がカラー表示されます。NO_COLOR=1 でカラー表示を無効にし、FORCE_COLOR=1 で有効にできます。

<node> には、ID、名前、または名前の一部を指定できます。例:TopicEntity、:core:data、"editor?id={id}"、HomeViewModel。check、impact、show、find、report では --config FILE と --graph FILE も指定できます(スキャンの代わりに、保存済みの graph.json を使用します)。build、diff、mcp では --config FILE を指定できます。

diff は、作業ツリー(コミット済みかどうかを問わず、新規ファイルも含む)を、ブランチが --base から分岐した時点(デフォルトは HEAD。つまり未コミットの変更)と比較します。変更された行は、その行を囲む最も内側の宣言に対してカウントされるため、関数を1つ編集してもクラス全体が変更扱いにはなりません。

check --sarif FILE を指定すると、検出結果も SARIF 形式で書き出されます。check --base REF を指定すると、Room のスキーマファイルもそのコミットと比較されます。リリース済みのスキーマのみ変更してはならないため、最後のリリースタグを指定するのが最も正確です。build を使用する場合は、.gitignore に droidmap-out/ を追加してください。

終了コード:処理が完了した場合は 0、check で --fail-on 以上の問題が見つかった場合(または find で一致するものがなかった場合)は 1、使用方法または設定のエラーは 2、内部エラーは 3 です。

ルール

ルールデフォルト検出内容
room-migration-patherror現在のバージョンへのマイグレーションパスがない既知のスキーマバージョン
room-schema-missingwarning現在のバージョンまたはそれ以前のバージョンのエクスポート済みスキーマ JSON がない
room-schema-stalewarning現在のバージョンのスキーマ JSON と一致しなくなったエンティティ:バージョンを上げずにエンティティを変更すると、更新時にクラッシュします
room-schema-changedwarning--base REF を指定した場合:REF 時点ですでに存在していたバージョンのスキーマ JSON が変更されています。そのバージョンがリリース済みの場合、同じクラッシュが発生します
room-migration-untestedwarningMigrationTestHelper のテストが実行されていないマイグレーションステップ
room-migration-unusedwarningアプリコードで使用されていない手動の Migration(addMigrations に渡されていないなど)。テストで実行されていても検出します
room-destructive-fallbackwarningユーザーデータを削除する fallbackToDestructiveMigration()
room-insert-replaceoff行を削除して再挿入する @Insert(onConflict = REPLACE)
nav-unknown-targeterrorどのデスティネーションも登録していないルートまたはキーへの navigate()
nav-unreachablewarningどこからも遷移、開始、参照されず、ディープリンクやメニュー項目からも開かれないデスティネーション
nav-deeplink-not-in-manifestwarningスキームとホストを受け入れるアクティビティのインテントフィルターがないディープリンク(navDeepLink、<deepLink>)。そのため、リンクからアプリを開けません
hilt-missing-bindingwarning@Inject コンストラクター、@Provides、@Binds のいずれもない、インジェクション対象のプロジェクト型
hilt-duplicate-bindingerror同一の型と修飾子が、1 つのソースセット内で重複してバインドされています
hilt-app-not-registerederror@AndroidEntryPoint クラスがある一方で、マニフェストの <application android:name> が @HiltAndroidApp クラスを指していない(または該当クラスがない)状態です。これらのクラスを開くとクラッシュします
hilt-fragment-hosterror@AndroidEntryPoint フラグメントが、@AndroidEntryPoint ではないアクティビティにホストされています(ナビゲーショングラフ、レイアウト、フラグメントトランザクション経由)。フラグメントがアタッチされるとクラッシュします
workmanager-setupwarningHiltWorkerFactory を渡すものがない @HiltWorker、またはデフォルトのイニシャライザーがまだマニフェストにあるため WorkManager が呼び出さない Configuration.Provider
koin-missing-definitionwarningKoin が要求する型(get()、inject()、koinInject())を提供する Koin 定義がありません。実行時に NoDefinitionFoundException が発生します
gradle-unknown-projecterrorsettings に含まれていないモジュールへのプロジェクト依存関係
gradle-forbidden-dependencyerror[[gradle.forbid]] ルールで禁止されている依存関係
gradle-cycleerror相互に依存する循環依存モジュール
manifest-permissionerrorallowed_permissions にない権限。ソースマニフェスト内にある場合、またはライブラリによってマージ後のマニフェストに追加された場合を検出します
gson-model-not-keptwarningGson がリフレクション(fromJson、TypeToken、GsonConverterFactory を使う Retrofit API)で読み込むクラスのフィールドが、難読化されたリリースビルドで R8 によって名前変更されます。@SerializedName、@Keep、keep ルールがありません。デバッグビルドでは動作しますが、リリースビルドでは空のフィールドが読み込まれます

設定

プロジェクトのルートに .droidmap.toml を配置します(すべて省略可能です)。

[rules]
"room-migration-untested" = "error"   # error | warning | info | off
"room-insert-replace" = "error"

[manifest]
allowed_permissions = ["android.permission.INTERNET", "android.permission.POST_NOTIFICATIONS"]

[[gradle.forbid]]
from = ":feature:*"
to = ":feature:*"
reason = "features talk to each other through :core modules"

[ignore]
paths = ["benchmarks/**"]

不明なルール名や重大度はエラーになるため、入力ミスによってルールが変更されないままになることはありません。from、to、ignore.paths は glob パターンで、* は : と / にも一致します。禁止ルールは tests = true を指定しない限り、テストの依存関係をスキップします。allow_same_parent = true を指定すると、:feature:a:impl と :feature:a:api のような兄弟モジュールが相互に依存できます。allowed_permissions を使うと、ライブラリがマージ済みマニフェストに追加する権限がライブラリ名とともに報告されるため、その権限を削除する(tools:node="remove")か、許可できます。

グラフ

droidmap build は、次の3つのリストを含む droidmap-out/graph.json(スキーマ droidmap/1)を書き出します。

  • nodes:id、kind、label、file、line、module、attrs。
  • edges:source、target、kind、file、line、attrs。
  • unresolved:静的解析で追跡できなかった内容と、その理由。

エッジは常に source が target に依存することを表すため、影響範囲は逆方向にたどります。パスはプロジェクトルートからの相対パスで、出力は決定的なため、差分を簡単に確認できます。--node-link を指定すると、graphify などのツールが読み込める networkx の node-link 形式も書き出します。

ノードの種類:module、room_database、room_entity、room_dao、room_migration、room_schema、test、nav_destination、nav_route、screen、function、viewmodel、injectable、hilt_module、hilt_provider、koin_module、koin_definition、entry_point、component、permission、class。

エッジの種類:depends_on、contains_entity、contains_dao、queries、writes、has_schema、migrates、tests、registers、shows、navigates_to、starts_at、uses_viewmodel、injects、bound_by、requires、declared_in、uses_permission、declares。

制限事項

droidmap はソースを読み取りますが、Gradle は実行しません。そのため、数秒で処理でき、ビルドされていないチェックアウトでも動作し、プロジェクトのビルドスクリプトを実行することもありません。一方で、ビルドによってのみ生成されるものは扱えません。また、意図的に保守的な動作をします。解決できないもの(変数に格納されたルート、定数ではないバージョン、型を特定できない Koin 定義など)は推測せず、unresolved に記録し、その項目に対してルールは適用されません。推測に基づくルールは、実際には存在しない問題を報告してしまいます。

  • ビルドで生成されるコード(KSP、kapt)は読み取りません。Safe Args では生成コードを必要としません。HomeFragmentDirections.actionHomeToDetail() は、Safe Args が生成コードに付ける名前を使って対応するアクションと照合されます。
  • ライブラリが追加する権限は解決済みの依存関係から取得するため、ビルドによって生成済みの場合に限り、マージ済みマニフェストを読み取ります(<module>/build/intermediates/merged_manifests/、または Action の merge-manifest 入力)。マージ済みマニフェストがビルドファイルより古い場合は、その旨が示されます。
  • 名前は Kotlin と Java のルール(インポート、パッケージ、囲んでいるクラスとそのスーパータイプ)に従って解決されますが、型推論は行いません。型推論にはコンパイラーとすべての依存関係が必要です。repo.load() のような変数に対する呼び出しは、変数の型が宣言されている場合、またはコンストラクターや関数の宣言済み戻り値の型から分かる場合に追跡されます。ラムダの it、ジェネリックの型引数、ライブラリ呼び出しの連鎖など、型推論が必要な場合は追跡されません。
  • 実行時に構築される値は追跡されません。たとえば、var から読み取るルートや、ループ内で構築されるルートは対象外です。定数、文字列テンプレート、それらを返す関数、および最大5階層までのヘルパー関数は追跡されます。

貢献

./gradlew test fatJar を実行すると、テストを実行し、build/libs/droidmap.jar をビルドします。CONTRIBUTING.md には、コードの場所、新しいルールや修正に必要なこと、CI での実プロジェクトを使ったチェックが記載されています。誤った検出や見逃しを報告する場合は、False positive or missed problem の Issue フォームを使用してください。セキュリティ上の問題は、SECURITY.md の説明に従って非公開で報告してください。

ライセンス

Apache-2.0。LICENSE を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。