v1.20.0
Добавлено
find_definition(name, module_hint='', limit=50)— прямой примитив «где определён метод» (форвард-комплементfind_callers_context). Реверс-навигация (кто зовёт) у нас была, прямого «куда ведёт определение» — нет, хотя вся машинерия (methods+modules,idx_meth_name,_normalize_module_hint) уже построена. Раньше агент эмулировал это цепочкойfind_module → extract_procedures → ручной поиск по имени. В отличие от_resolve_target_key(ровно один ключ дляfind_callers) НЕ обязан разрешать в один — одноимённые методы в десятках объектов (ОбработкаПроведенияв каждом документе — на ЕРП 600+ кандидатов) это норма 1С, поэтому возвращает всех кандидатов сlimit/truncated; сужаетсяmodule_hint(rel_path|'Документ.X'/'Document.X'| голое имя объекта). Перф закрыт прямымEXPLAIN QUERY PLAN: WHERE на имени —= ? COLLATE NOCASE(seek поidx_meth_name, ~3 мс на крупных ERP-индексах), а НЕpy_lower(m.name)(он отключает индекс → SCAN ~700 мс). NOCASE не сворачивает кириллицу → для lowercase-кириллического имени на пустом результате один дешёвыйpy_lower-fallback (_meta.slow_fallback=True). Контракт:{name, definitions:[{file, line, end_line, type, is_export, params (list[str]), category, object_name, module_type}], total, truncated, _meta:{index_used, unique, hint_applied, slow_fallback}}.hint_applied= «фильтр по hint применён к запросу» (детерминированно), не «hint изменил счёт». Без индекса — live черезextract_proceduresпри наличии hint (rel_pathнапрямую, иначе черезfind_module); без hint →{error:'no index', hint}. Битый core-индекс (OperationalError) → ридер возвращаетNone→ helper уходит в fallback, а не выдаёт тихий false-negativeindex_used=True, total=0.get_module_outline(path, include_methods=True)— дешёвый структурный «скелет» модуля (дерево#Область+ агрегаты), первый хоп перед чтением тел. Гдеextract_proceduresдаёт плоский список, новый хелпер показывает иерархию областей (какая процедура в какой#Область, с вложенностью) и агрегаты ({methods, exports, regions, loc}), чтобы решить, куда нырять, не читая модуль на 5–15К строк. Вложенность в индексе НЕ хранится (_parse_regionsотдаёт плоский список), но у каждой области и метода есть[line, end_line]→ дерево восстанавливается на лету по вложенности интервалов чистой функцией_build_outline_tree(детерминированной, юнит-тестируемой без БД). Незакрытая#Область(end_line=NULL) трактуется как «до конца файла» для вложенности, в ответеend_lineостаётсяNone.include_methods=False→ только дерево областей + агрегаты (ещё дешевле). Методы вне любой области →orphan_methods._metaзеркалитget_object_full_structure:index_used=Trueилиfallback_reason∈ {index_unavailable_or_table_missing(нет/старый индекс без таблицыregions, или модуль не в индексе),index_empty_for_module(модуль есть, методы пусты — stale, подстраховались live),parse_failed: …}. Старый индекс без таблицыregions→ ридер возвращает sentinelNone(≠ «0 областей») → live-парсинг, а не тихо-неполное оглавление.
Изменено
git_search(..., exclude_path='')— отсечение шумовых зон из полнотекста (exclude_path='Forms,Templates','ConfigDumpInfo.xml'). На ЕРП/УХ полнотекст забивают*/Forms/*(огромные form.xml),*/Templates/*(макеты СКД),ConfigDumpInfo.xml; раньше их можно было отсечь только сузивpath, что не всегда возможно (искомое разбросано). Параметр — список литеральных имён через запятую (glob-метасимволы во входе отклоняются, как уpath; невалидный элемент →[{"error": ...}], поиск не расширяется молча). Матчится на любой глубине: внутренне каждое имя разворачивается в:(glob,exclude)**/{имя}/**+:(glob,exclude)**/{имя}— вложенный*/Forms/*исключается так же, как top-level (магия-free:(exclude)Formsякорится на корень и вложенные НЕ убирает — проверено фактическимgit grep). Параметр добавлен в конец сигнатурыgit_search→ существующие позиционные вызовы (path,file_types,regex, …) байт-в-байт прежние.safe_grep(ходит черезliteral_files) не затронут.
Совместимость
- Схема индекса и
BUILDER_VERSION(14) НЕ менялись — пересборка боевых индексов НЕ требуется. Все три фичи — read-only слой поверх уже существующих таблиц (methods/modules/regions), ровно в духе v1.18.0/v1.19.0.find_definition/get_module_outline— новые функции;exclude_path— новый параметр с дефолтом''(поведение без него прежнее). Новых индексов/таблиц/колонок нет (idx_meth_name/idx_regions_moduleуже были). Старые индексы — мягкая деградация (нетregions→ live-оглавление; битый core → livefind_definition).
Полный список изменений: CHANGELOG.md