Памятка для AI-агентов и инженеров, работающих в этом репозитории.
Предполагается, что параллельно запущен экземпляр IntelliJ IDEA с открытым этим проектом, в котором настроена MCP-интеграция, публикующая возможности IDE в виде инструментов. Агент обязан использовать эти IDE-инструменты как основной способ работы с lsFusion-кодом — поиск, правка и инспекции идут через них.
Интеграция опознаётся по набору предоставляемых инструментов —
lsfusion_find_elements, инструмент правки файлов (apply_patchлибоreplace_text_in_file, см. ниже),create_new_file,get_file_problems— а не по имени MCP-сервера. Имя сервера / префикс пространства имён может отличаться от установки к установке; стабильны именно имена инструментов. Везде в этом документе (включая RUN-SERVER.md) инструменты указаны без префикса сервера — использовать тот подключённый MCP-сервер, который их предоставляет.
Для справки по языку и парадигме lsFusion использовать инструменты IDE-интеграции
lsfusion_retrieve_docs и lsfusion_get_guidance. Вызов lsfusion_get_guidance
к тому же обязателен перед работой с .lsf — см. раздел ниже.
- Источник правды для lsFusion-кода:
*/src/main/lsfusion. Файлы вout/production— генерируемые, править нельзя.
lsfusion_get_guidance (как и lsfusion_retrieve_docs) предоставляется тем же
IDEA MCP-сервером, что и инструменты из раздела «Интеграция с IDE».
Перед первой за сессию операцией с .lsf-файлом (поиск, чтение, анализ или
правка) агент обязан один раз вызвать lsfusion_get_guidance и далее
применять полученные правила. Без него даже просто корректно прочитать
lsFusion-код почти невозможно — тонкости (трёхзначная логика, семантика сессий,
конвенции именования) из самого кода не выводятся. Повторный вызов в той же
сессии не нужен.
Если инструмент помечен как deferred — сначала подгрузить его схему через
ToolSearch.
Для любой работы с .lsf-кодом предпочитать эти три инструмента генерическим
аналогам.
- Предпочитать его
Grep/Globдля любого семантического поиска классов, свойств, действий, форм, модулей и метакода. Он понимает пространства имён, сигнатуры, раскрытие метакода и граф использований — текстовый поиск этого не умеет. Grepиспользовать только для не-lsFusion-файлов или поиска буквального текста.- Замечание: читает in-memory индекс IDEA. См. раздел Устаревание индекса.
Имя инструмента правки зависит от версии IDE: в 2026.2 это apply_patch
(принимает формат Codex *** Begin Patch / *** Update File: и unified diff), в
более ранних сборках — replace_text_in_file. Использовать тот, который есть в
наборе. Для новых файлов — create_new_file.
- Предпочитать их
Edit/WriteClaude Code. Инструмент правки пишет через собственный VFS IDEA, поэтому изменение сразу видноlsfusion_find_elementsи остальным IDE-инструментам. - Правки через
Edit/Writeвнешние по отношению к IDEA — индекс от них отстаёт (см. Устаревание индекса). - При использовании
apply_patchв IDE версии 2026.2 Перед правкой открывать файлopen_file_in_editor. apply_patchпо закрытому файлу пишет его напрямую и заменяет все переносы строк на LF; если файл был в CRLF (основная часть репозитория), весь файл попадёт в дифф как изменённый. По открытому файлу правка идёт через документ IDEA и переносы строк сохраняются.
После каждой правки вызывать get_file_problems на каждом изменённом файле.
- Запускает инспекции IntelliJ с полным семантическим анализом lsFusion —
ловит синтаксические ошибки и неразрешённые ссылки (например,
Property or action '…' not found), сообщает severity и строку/колонку. - Всегда актуален: отражает внешние правки немедленно, без оговорки про отставание индекса.
- Оговорка: разрешение символов между файлами всё равно идёт через индекс, поэтому сразу после добавления символа в другом файле ссылка на него может ненадолго ложно показываться как «not found».
- Оговорка: на свёрнутом метакоде (
@metaName(args);без раскрытого тела)get_file_problemsможет выдавать ошибки на код, который метакод сгенерирует. Это ожидаемо — не разворачивать метакод ради «чистого» отчёта; см. раздел «Свёрнутый метакод в коммитах.lsf».
- Найти —
lsfusion_find_elements: локализовать целевые элементы и понять контекст. - Править — инструмент правки (
open_file_in_editor+apply_patchилиreplace_text_in_file) /create_new_file(неEdit/Write). - Проверить —
get_file_problemsна каждом изменённом файле; исправить все сообщённые ошибки.
lsfusion_find_elements читает in-memory индекс IDEA. Правки, сделанные вне
IDEA (Edit / Write Claude Code или любой не-IDE-инструмент), не отражаются,
пока IDEA не обновит VFS — задержка от секунд до десятков секунд (обновление при
фокусе окна / «Synchronize files on frame activation»).
Правка инструментом IDE снимает это полностью: индекс актуален в момент возврата вызова. Это и есть главная причина, по которой он приоритетный.
Если файл был изменён через Edit / Write — не доверять первому результату
lsfusion_find_elements: подождать и повторить запрос либо попросить пользователя
сфокусировать окно IDEA.
- Не использовать MCP-инструменты, публикуемые claude.ai (имена с префиксом
mcp__claude_ai_*) — работать через IDE-интеграцию, описанную выше. - Не использовать
Grep/Edit/Writeдля.lsf-кода там, где применимы инструменты выше.
В коммит должны попадать только свёрнутые обращения к метакоду — одна строка
вида @metaName(arg1, arg2, ...);. Развёрнутая форма (когда плагин lsFusion в
IDEA «расклеил» тело метакода в исходник) в репозиторий идти не должна: она
дублирует сгенерированный код, ломает дальнейшие правки шаблона и засоряет diff.
Признак раскрытого метакода — фигурная скобка { сразу после @metaName(args)
(вместо ;). По синтаксису lsFusion корректный вызов метакода — это всегда
@metaName(args); без блока; форма @metaName(args){ … } появляется только
когда плагин IDEA вставил тело метакода в исходник.
При обнаружении @name(args){ — не коммитить. Сообщить пользователю с
указанием файла и попросить выполнить в IDEA Hide Meta for File (или
Reenable meta, если плагин не схлопнул автоматически). Прямого MCP-инструмента
для сворачивания метакода нет — действие доступно только из плагина lsFusion
в IDEA.
Никогда не разворачивать метакод самостоятельно ради правок «пары строк внутри».
Если нужно изменить то, что генерируется, — менять сам META-шаблон, а не его
раскрытый результат.
Тот же MCP-сервер предоставляет lsfusion_report_feedback — отправку
обезличенного сигнала о качестве документации, правил и инструментов.
Правило: если по ходу работы накопилось, что отправлять, — отправлять feedback всегда, без согласования с пользователем. Этот раздел и есть заранее выданное согласие: отдельно спрашивать разрешение на каждую отправку не нужно. Не решать за пользователя, что находка «мелкая», и не пропускать отправку из-за того, что он занят другим.
Поводом считать, в частности:
lsfusion_retrieve_docsне нашёл ответа или выдал нерелевантное по вопросу, который в документации быть должен;- документация или правила
lsfusion_get_guidanceразошлись с фактическим поведением платформы (проверенным на запуске службы или через/eval); - правило из guidance оказалось неточным, неполным или приводящим к ошибке;
- инструмент IDE-интеграции повёл себя не так, как описано (ложные ошибки, пустой результат, расхождение с индексом);
- в процессе выяснился неочевидный факт о платформе, которого в документации нет и который стоил заметного времени.
Как отправлять:
- Отправлять в конце задачи, одним вызовом на находку, не прерывая ради этого основную работу.
- В отчёте пользователю упомянуть одной строкой, что было отправлено, — чтобы он мог поправить формулировку или попросить не отправлять такое впредь.
- Содержимое отправки держать обезличенным: суть проблемы с платформой, документацией или инструментом — без бизнес-данных, учётных данных, имён клиентов и фрагментов прикладного кода. Это ограничение самого инструмента, и предварительное согласие его не снимает.
- Если пользователь в конкретном случае просит не отправлять — не отправлять.
Если рядом с erp присутствует подпроект custom-logics (то есть файл
../custom-logics/AGENTS.md доступен на чтение) — прочитать его и применять
описанные там правила в дополнение к этому файлу. Если такого подпроекта
нет (стандартный случай открытой erp) — пропустить, всё необходимое уже
здесь.
В lsFusion успешная компиляция модуля не гарантирует корректность кода —
критерий «задача решена» для .lsf — это успешный запуск службы. Процедура
запуска, источники лога, маркеры StartLogger и трактовка исходов вынесены в
отдельный файл — RUN-SERVER.md. Читать его только по
необходимости, когда нужно проверить результат правок .lsf, но до первого
запуска службы в сессии.
Работа с внутренним Redmine (чтение задач, поиск, вложения, комментарии, перевод статусов) описана в отдельном файле — REDMINE.md. Читать его только по необходимости, когда задача действительно требует обращения к Redmine по ссылке или номеру задачи, но до первого обращения к Redmine в сессии.