Skip to content

v1.20.0

Choose a tag to compare

@github-actions github-actions released this 14 Jun 13:18
· 10 commits to master since this release

Добавлено

  • 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-negative index_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 → ридер возвращает sentinel None (≠ «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 → live find_definition).

Полный список изменений: CHANGELOG.md