v8unpack-agent
Прикладной инструмент над upstream-распаковщиком v8unpack: превращает
выгрузку конфигурации 1С в читаемый текстовый слой, машиночитаемую опись
форм и компактный контекст для LLM.
Задача пакета — дать агенту достоверные сведения о формах и модулях без угадывания. Где данные нечитаемы, результат помечается как неполный, а не достраивается догадками.
Границы и non-goals
- Пакет не распаковывает контейнер сам: дерево выгрузки готовит upstream
v8unpack, а агент работает с уже раскрытым каталогом. - Production-адаптера одиночного
Form.binв пакете нет: реализацию распаковщика передаёт вызывающая сторона. - Функций
index_cf()иrag.rebuild()не существует; векторная индексация находится вне scope пакета. - Пакет не подключается к живой информационной базе и не читает её данные.
Кто что решает
| Компонент | Ответственность |
|---|---|
upstream v8unpack |
распаковка контейнеров в дерево файлов |
v8unpack-agent |
опись форм, текстовый слой, индексы, контекст, отчёт о запуске |
| вызывающая сторона | реализация распаковщика формы и решения по degraded-результату |
Установка
Основная установка из PyPI:
pip install v8unpack-agent
Исторический pre-release 0.1.0rc1 остаётся доступным в PyPI и по умолчанию
не выбирается резолверами (нужен явный pin или --pre):
pip install v8unpack-agent==0.1.0rc1
Установка актуального состояния main напрямую из Git остаётся вариантом для
проверки ещё не опубликованных изменений:
pip install git+https://github.com/MRDK80/v8unpack-agent.git
Установка для разработки из клона:
pip install -e ".[test]"
upstream v8unpack нужен для фактического извлечения текстов, включая
поддержку внешних отчётов .erf.
Быстрый старт: CLI
Один прогон — один отчёт и один код возврата. На вход подаётся каталог уже распакованной выгрузки.
v8unpack-agent-run <корень_выгрузки> --report-path post-run.json
Аргумент --report-path обязателен, значения по умолчанию нет, а
каталог-родитель должен существовать заранее.
| Код | Значение |
|---|---|
| 0 | все объекты обработаны полностью |
| 2 | ошибка аргументов или корень не является каталогом |
| 3 | degraded: есть частичные или отказавшие объекты |
| 4 | управляемая фатальная ошибка пайплайна |
| 5 | ошибка записи отчёта |
| 6 | фатальная ошибка и ошибка записи одновременно |
Degraded — неуспешное завершение: неполный контекст не должен выглядеть
успехом для автоматизации. Полное описание аргументов, стадий и кодов причин —
в docs/runner.md, схема отчёта — в
docs/run_report.md.
Быстрый старт: Python
Каноническая цепочка: обнаружение источников, распаковка по FormBinSource,
обновление индекса.
from pathlib import Path
from v8unpack_agent import unpack_all_forms, update_forms_index
from v8unpack_agent.form_artifact import FormArtifact
from v8unpack_agent.form_identity import FormBinSource
from v8unpack_agent.scan_forms import scan_forms
dump_root = Path("unpacked_cf")
unpacked_root = Path("text_layer")
def unpack_one(source: FormBinSource, root: Path) -> FormArtifact:
"""Здесь вызывается реальное извлечение текстов из source.bin_path."""
return FormArtifact.for_form(root, source.name)
scan_index = scan_forms(dump_root)
print(f"Найдено форм: {scan_index.total}")
artifacts = unpack_all_forms(dump_root, unpacked_root, unpack_one)
index = update_forms_index(dump_root, unpacked_root, artifacts)
index.save(Path("forms_index.json"))
Распаковщик получает FormBinSource и корень текстового слоя — ровно два
аргумента. Существующая трёхаргументная реализация подключается только через
adapt_legacy_unpacker(). Подробный разбор и отбор по form_ids — в
docs/pipeline.md, готовые сценарии — в
examples/README.md.
Пайплайн
| Шаг | Функция | Результат |
|---|---|---|
| опись форм | scan_forms() |
FormScanIndex с layout-метаданными и индексом ссылочных типов |
| обнаружение источников | discover_form_sources() |
FormBinSource с каноническим form_id |
| распаковка | unpack_all_forms() |
FormArtifact на каждую форму |
| структура формы | parse_elem_json() |
элементы и привязки data_path, best-effort |
| реквизиты объекта | decode_object_attributes() |
Properties и TabularSections |
| классификация | classify_form() |
object, service или unknown |
| внешние отчёты | unpack_erf() |
текстовый слой и запросы СКД |
| индекс актуальности | update_forms_index() |
FormsIndex с ключом form_id |
| контроль дрейфа | check_drift() |
DriftReport по хешам |
| контекст для LLM | build_form_context() |
FormContext и промпт-фрагмент |
Ключевые возможности
- Одноимённые формы разных владельцев не затирают друг друга: идентичность —
form_id, а не имя. - Формы без кода попадают в опись: elem-only ветка заполняет
elem_json_path. - Частичный результат всегда явный:
extraction_ok=Falseневозможен без непустогоextraction_warnings. - Ссылочные типы реквизитов приводятся к имени объекта метаданных; неизвестный
UUID остаётся
Ref#<uuid>и не угадывается. - Сервисные формы отделены от объектных, чтобы метрика покрытия не занижалась архитектурным паттерном платформы.
- Дрейф детектируется по хешам модуля и структуры, а не только по времени изменения файла.
- Сериализация индексов переносима: в файлы пишутся только относительные POSIX-пути, одинаковые на POSIX и NT.
Версии схем
Три независимые версии, которые не сравниваются друг с другом.
| Артефакт | Версия | Где описан |
|---|---|---|
FormsIndex |
2 | docs/pipeline.md |
FormScanIndex |
2 при чтении legacy 1 | docs/scan_forms.md |
| post-run report | 1 | docs/run_report.md |
Публичная поверхность
| Модуль | Основные имена | Канонический документ |
|---|---|---|
scan_forms |
scan_forms, FormEntry, FormScanIndex, scan_warning_code |
scan_forms |
pipeline |
unpack_all_forms, unpack_erf, update_forms_index, FormUnpacker |
pipeline |
form_identity |
FormBinSource, discover_form_sources, select_sources, adapt_legacy_unpacker |
pipeline |
form_artifact |
FormArtifact |
pipeline |
forms_index |
FormsIndex, FormsIndexEntry, is_form_stale |
pipeline |
runner, cli |
RunOptions, RunOutcome, run_pipeline |
runner |
run_report |
PostRunReport, ObjectRunResult, write_post_run_report |
run_report |
elem_parser |
parse_elem_json, ElemIndexResult, UnindexedReason |
elem_parser |
form_classifier |
classify_form, FormClass, classify_empty_tree_form |
form_classifier |
coverage_metric |
calc_data_path_coverage, CoverageReport |
form_classifier |
object_decoder |
decode_object_attributes, DecodeResult, DecodeError |
object_decoder |
catalog_resolver |
resolve_data_path, ResolvedBinding |
catalog_resolver |
form_context |
FormContext, build_form_context, to_llm_prompt_fragment |
form_context |
form_summary |
build_form_summary, to_normalized_json |
form_summary |
form_router |
FormRouter, form_paths |
form_router |
common_modules |
scan_common_modules, build_common_module_context |
common_modules |
managed_forms |
discover_elem_forms, ElemFormEntry |
managed_forms_structure |
skd_extractor |
extract_skd_queries, extract_all_skd_queries |
skd_extractor |
drift_checker |
check_drift, DriftReport |
drift_checker |
Документация
Начало работы
Пайплайн и запуск
Формы и разбор
- Структура элементов и
UnindexedReason - Классификация форм и метрика покрытия
- Сводка по форме
- Контекст для LLM
- Маршрутизация путей формы
- Структура управляемых форм
- Структура внешних обработок и отчётов
- Запросы СКД
Метаданные и индексы
- Опись форм и индекс ссылочных типов
- Реквизиты объекта из raw-секции
header - Разрешение
data_path - Общие модули
- Контроль дрейфа
Исследования
Датированные протоколы с агрегатами; выводы не переписываются задним числом.
- Доля неиндексированных форм
- Разрешение ссылочных типов
- Нессылочные типовые грани
- Кросс-конфигурационная проверка типов
- Пустые реквизиты объекта
- Структура
Form.bin - Валидация на третьей выгрузке
Примеры и политики
Известные ограничения
- Обычные (неуправляемые) формы хранят разметку в бинарном виде и частично
не читаются; такие формы получают
unknownи исключаются из знаменателя метрики. - Квалификаторы реквизитов и составные типы не декодируются.
- Индекс ссылочных типов строится только для видов метаданных с доказанной
ссылочной формой; остальные UUID остаются
Ref#<uuid>. - В режиме
mode="external"индекс ссылочных типов не собирается. - Распаковщики из
examples/и тестов — заглушки и не читают бинарный формат. - Пакет ещё не опубликован в индексе пакетов (issue #149).
Тесты
pytest
Фикстуры синтетические: реальная выгрузка для прогона не требуется. Порядок работы с ветками, проверки перед PR и требования к обезличенности описаны в CONTRIBUTING.md.
Связанное
saby-integration/v8unpack— upstream-распаковщик на Python, лицензия MIT.
Лицензия
MIT — см. LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file v8unpack_agent-0.1.0.tar.gz.
File metadata
- Download URL: v8unpack_agent-0.1.0.tar.gz
- Upload date:
- Size: 266.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64c0fcf1e1a4badab13d46e54e49146c9c62d8cea662423c5a9103579a132e14
|
|
| MD5 |
6468ef38a17cc440121a4857edc1f1b5
|
|
| BLAKE2b-256 |
10460909a1810a80f85ca96106633695fa88f2d317ed93cd15896c25f82480ca
|
Provenance
The following attestation bundles were made for v8unpack_agent-0.1.0.tar.gz:
Publisher:
release.yml on MRDK80/v8unpack-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
v8unpack_agent-0.1.0.tar.gz -
Subject digest:
64c0fcf1e1a4badab13d46e54e49146c9c62d8cea662423c5a9103579a132e14 - Sigstore transparency entry: 2888053540
- Sigstore integration time:
-
Permalink:
MRDK80/v8unpack-agent@02ab4c831ea6572d433c7bd0c127111f34dec7a2 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/MRDK80
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@02ab4c831ea6572d433c7bd0c127111f34dec7a2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file v8unpack_agent-0.1.0-py3-none-any.whl.
File metadata
- Download URL: v8unpack_agent-0.1.0-py3-none-any.whl
- Upload date:
- Size: 129.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d4386f7181140f14e0c8f1411eff4940879508c84b0c1fb8ca2fbbd17038baf
|
|
| MD5 |
4ae5137f93ab6a257c21bdd12eeb6d85
|
|
| BLAKE2b-256 |
5c0652a724d883f62ea8d381e1f5fb187ffc181d57d70e31ad5ed47bdce023c1
|
Provenance
The following attestation bundles were made for v8unpack_agent-0.1.0-py3-none-any.whl:
Publisher:
release.yml on MRDK80/v8unpack-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
v8unpack_agent-0.1.0-py3-none-any.whl -
Subject digest:
4d4386f7181140f14e0c8f1411eff4940879508c84b0c1fb8ca2fbbd17038baf - Sigstore transparency entry: 2888053553
- Sigstore integration time:
-
Permalink:
MRDK80/v8unpack-agent@02ab4c831ea6572d433c7bd0c127111f34dec7a2 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/MRDK80
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@02ab4c831ea6572d433c7bd0c127111f34dec7a2 -
Trigger Event:
push
-
Statement type: