Method Project Map

БесплатноВерсия 0.5.1 — что нового

Посмотрите, как устроен проект, — и покажите это ИИ-агенту

Читает проект статически — на десяти языках, от Python до Rust и C++ — и рисует его устройство: пакеты, файлы, классы, функции и кто кого вызывает. Теперь и между языками: от экрана Flutter через канал платформы в Swift, Kotlin или C++ и дальше в ядро на Rust. ИИ и интернет здесь не участвуют: карта вычисляется, поэтому она всегда одинакова и обновляется вместе с кодом.

Лицензия MIT · для работы нужен Python 3.9 или новее — на каком бы языке ни был проект · macOS, Linux, Windows · интерфейс на русском и английском.

Вызовы pause и setSpeed из Dart через канал audio/player доходят до обработчиков на Swift и Kotlin; в C++ обработчика setSpeed нет — это пропуск канал audio/player DartSwiftKotlinC++ FlutteriOSAndroidWindows 'pause''setSpeed' case "pause":case "setSpeed": "pause" ->"setSpeed" -> == "pause" нет "setSpeed"
Рис. 1 — Канал платформы Flutter: схема-пример
  • Без ИИ и интернета
  • Открытый исходный код
  • Карта обновляется сама

Вызовы, которые не проверяет компилятор

Приложение на Flutter обращается к Swift, Kotlin и C++ по имени канала и имени метода — обычным строкам. Ядро на Rust вызывают по именам символов. Переименуйте одну сторону — приложение соберётся, а упадёт уже во время работы. Карта связывает обе стороны.

  • Каналы Flutter

    Методы, события и сообщения: invokeMethod('pause') в Dart доходит до ветки case "pause":, "pause" -> или method_name() == "pause" в Swift, Kotlin, Java и C++ — и обратно. Имена каналов могут лежать в константах.

  • C ABI (FFI)

    dart:ffi, Swift, C/C++ и Go (cgo) — к функциям Rust с #[no_mangle], определениям на C, @_cdecl в Swift и //export в Go.

  • JNI

    external fun и native в Kotlin и Java — к функциям Java_… на Rust или C.

  • Сгенерированные привязки

    Pigeon, flutter_rust_bridge, UniFFI и команды Tauri: вызов через сгенерированный API доходит до реализации в приложении.

Пропуск

Метод канала, который одна из платформ не обрабатывает. Такой вызов падает только на этой платформе — и только во время работы. pmap check . перечисляет пропуски с файлом и строкой, даже без проекта архитектуры, а pmap check --strict останавливает на них сборку в CI.

Проверено на плагинах из pub.dev. В audioplayers — Dart, Kotlin, Swift и C++ — карта нашла 73 связи между языками, все подтверждённые: каждый из 23 методов канала дошёл до своей ветки на каждой платформе. В connectivity_plus — 7 связей.

Агент узнаёт, что ещё поменять

Сразу после того как агент правит код, карта коротко сообщает ему, что от этого кода зависит в других местах: вызовы из других файлов и другую сторону каждой связи между языками. Так правка не останавливается на полпути.

  • Если от изменения ничего не зависит, заметки нет, а в одной сессии она не повторяется.
  • Заметка читает компактный индекс рядом с картой: 0,4 с на фреймворке Flutter из 1 700 файлов.
  • Обзор проекта в начале сессии стал вдвое короче — 4 000 символов вместо 7 500 — и начинается со связей между языками.

правка lib/player.dart · AudioPlayer.pause

Method Project Map — code elsewhere depends on what you just changed; keep it in step:

AudioPlayer.pause (lib/player.dart:41)

→ android/…/AudioPlayerPlugin.kt:112 (Kotlin, channel audio/player "pause")

→ ios/Classes/AudioPlayerPlugin.swift:88 (Swift, channel audio/player "pause")

→ windows/audio_player_plugin.cpp:57 (C/C++, channel audio/player "pause")

used in 1 other file: lib/ui/controls.dart:23 Controls.onPause

Рис. 2 — Заметка после правки, пример

pmap connect ставит заметку и обзор ИИ-агентам для программирования, которые умеют запускать команды до и после своих действий, а для остальных — навык, правило и MCP-сервер с инструментами pmap_overview, pmap_find, pmap_show, pmap_source, pmap_check, pmap_stale и pmap_scan. Каждое изменение — помеченный блок с резервной копией; отменить — pmap disconnect --all.

Агент читает почти вдвое меньше кода

Проект на 29 тысяч строк со скрытыми тестами, которых агент не видит: 6 задач на исправление ошибок × 2 режима × 5 прогонов. Показано, сколько потрачено с картой по сравнению с работой без неё.

Код, прочитанный агентом

0,55× 95 % доверительный интервал — 0,49–0,59

Выходные токены

0,85×

Входные токены в сумме

0,93× интервал 0,83–1,02: разница не значима

Исправлений, прошедших скрытые тесты, — 60 из 60 и с картой, и без неё. Обзор в начале сессии сокращал чтение кода, но стоил примерно столько же токенов, сколько экономил. Поэтому в 0.5.0 обзор стал короче, а главной стала заметка после правки; следующее испытание проверит её на задачах, проходящих через несколько языков. Отчёты — в репозитории, папка bench/reports.

Блок-схема проекта в браузере

У каждой связи есть уровень уверенности: подтверждена, возможна или не определена. Карта никогда не выдаёт догадку за факт.

  • Переключаться между проектами через Finder, Проводник или список недавних.
  • Искать классы, функции и файлы по имени; смотреть код одной функции.
  • Выгружать схемы в Mermaid и сохранять всю карту одной самодостаточной HTML-страницей для сайта или вики.
  • Работать на русском и английском — со встроенным справочником и пошаговым обучением.

Схема — это проект для кода

Схема, которую редактор Method Diagram отдаёт кодовому агенту, служит карте проектом архитектуры. Агент дописывает у функций строку «код:» с путями к файлам, а карта сверяет связи в коде со связями на схеме.

  • Файл схемы — PROJECT.mdm, проверка — pmap check .; функции и объекты со строкой код: становятся подсистемами.
  • Что соединено на схеме, то коду можно использовать; всё остальное — расхождение, с названиями функций.
  • Объекты с одним и тем же код: — один тип данных: «Заявка» и «Проверенная заявка» делят один класс.
  • Обзор для агента начинается со списка функций и того, где они в коде.
Функции и объект схемы связаны с папками кода; зависимость app/dispatch от app/payments на схеме не нарисована — это расхождение 1Принять заявку Заявка 2Назначить мастера код: app/intakeкод: app/modelsкод: app/dispatch app/intake/app/models/app/dispatch/ app/payments/ нет на схеме — расхождение
Рис. 3 — Схема Method Diagram как проект архитектуры, пример

Десять языков, можно вперемешку

Карта следит за типами переменных: через объявления и конструкторы, через объявленные результаты функций проекта — в том числе по цепочкам вызовов — и через типы полей. В типизированных языках вызов у класса проекта — подтверждённая связь, если ни один подкласс не переопределяет метод; вызов через интерфейс, протокол или трейт — возможная.

  • Python

    Импорты (относительные, раскладка src/, реэкспорты), вызовы через области видимости и аннотации типов, наследование — встроено, без зависимостей.

  • TypeScript / JavaScript

    ES-модули и CommonJS, алиасы путей из tsconfig, реэкспорты через index, монорепозитории, JSX-компоненты.

  • Go

    Модули go.mod, пакеты из нескольких файлов, методы с получателем, встраивание, интерфейсы, cgo.

  • Java / Kotlin

    Пакеты, групповые и статические импорты, функции верхнего уровня Kotlin, оба языка в одном проекте, JNI.

  • C#

    Пространства имён, using, using static, global using, алиасы, records, инструкции верхнего уровня.

  • Swift

    Модули SwiftPM и Xcode, протоколы, расширения, init, @_cdecl.

  • Dart / Flutter

    Импорты package:, реэкспорты, префиксы, файлы part, виджеты, миксины, каналы платформы и dart:ffi.

  • Rust

    Крейты и воркспейсы, mod, use, pub use, блоки impl и трейты, ? и unwrap(), #[no_mangle].

  • C / C++

    #include, пространства имён, классы, методы вне класса, заголовки с extern "C", Win32 и C++/WinRT.

Замеры на настоящем коде

Вызовы, которые карта оценивает; обращения к библиотекам не считаются. Неопределённым остаётся то, чего статический анализ действительно не видит: код из макросов, замыкания и значения функций без типов.

  • Фреймворк Flutter Dart, 1 712 файлов за 20 с

    90 % подтверждено, 3 % возможно, 7 % не определено

  • net/http Go, 157 файлов за 0,6 с

    73 % подтверждено, 4 % возможно, 23 % не определено

  • Крейт time Rust, 164 файла за 0,3 с

    65 % подтверждено, 4 % возможно, 31 % не определено

  • Крейт openmls Rust, 263 файла кода библиотеки за 0,5 с

    61 % подтверждено, 39 % не определено

Три шага

Для работы нужен Python 3.9 или новее — на каком бы языке ни был проект. Всё ставится в ~/.pmap, плюс ярлык приложения.

  1. 01

    Скачать

    Архив с этой страницы — или git clone https://github.com/lstcrsdd/method-project-map.git

  2. 02

    Установить

    В папке проекта — ./install.sh, на Windows — install.bat. Установщик сразу подключает карту к ИИ-агенту (без агентов — ключ --none) и скачивает грамматики tree-sitter для других языков, около 15 МБ (только Python — ключ --python-only).

  3. 03

    Открыть

    Method Project Map — в «Программах» (macOS), меню «Пуск» (Windows) или меню приложений (Linux), либо ~/.pmap/bin/pmap ui. В первый раз карта спросит, какую папку показать, и предложит минутное обучение.

Ограничения

  1. Проверки типов нет

    Вызовы у значений, тип которых карта не видит (переменные без типа, результаты библиотечных функций), остаются неопределёнными — карта не выдаёт догадку за факт.

  2. Связи между языками — по именам

    Имя канала или символа, собранное во время работы, карта не прослеживает. Objective-C и модули React Native пока не читаются.

  3. Сгенерированный и чужой код

    Он засоряет карту — исключите его через файл .pmapignore.

  4. Статический анализ «закрытого мира»

    Карта не видит вызовов из кода вне репозитория, подмены функций на лету и обращений по имени через getattr.

Посмотрите на свой проект

Бесплатно: версия 0.5.1, лицензия MIT. Вопросы, задачи и pull request'ы — на GitHub.