feat(meta-edit): таблица и функция добавляются в существующий внешний источник

Дыра в сценарии: добавить таблицу или функцию к уже существующему источнику было нечем.
Совет «пересоберите источник целиком через meta-compile» оказался вредным — повторная
компиляция заменяет файл источника, выдаёт объекту НОВЫЙ uuid и оставляет файлы не
упомянутых таблиц сиротами: в ChildObjects их уже нет, а на диске они остались.

meta-edit на файле источника принимает add.tables и add.functions. Таблица — единственная
операция навыка, создающая файл: <Источник>/Tables/<Имя>.xml плюс имя в ChildObjects.
Синтаксис тот же, что у meta-compile.

Формат файла таблицы обязан быть один и тот же, кем бы файл ни был создан, поэтому эмиттеры
скопированы из meta-compile механически и зарегистрированы в check-inline-drift.mjs — гард
теперь сверяет семь функций между двумя навыками. Чтобы копии не тянули за собой пол-navыка,
две из них развязаны от эмиттеров-специфик: Build-EdsTableXml принимает готовый XML полей,
Emit-EdsFunction — готовый XML типа. Каждый навык рендерит их своим эмиттером, вывод не изменился.

meta-compile теперь предупреждает о перезаписи существующего объекта — для всех видов, не только
внешних источников: молчаливая замена uuid ломает ссылки, а узнать об этом было неоткуда.

Раундтрип на платформе 8.3.24.1691: таблица, добавленная через meta-edit, возвращается из
выгрузки байт в байт.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi
This commit is contained in:
Nick Shirokov
2026-09-06 13:55:01 +03:00
co-authored by Claude Opus 5
parent ed766154fe
commit 123d6e326b
14 changed files with 1603 additions and 46 deletions
+19
View File
@@ -31,6 +31,25 @@ const SKILLS = join(ROOT, '.claude', 'skills');
// Заготовку по новой семье печатает: node debug/inline-utils/scan-dupes.mjs --stub <py>:<ps1>
const FAMILIES = [
// ─── внешние источники данных: формат файла таблицы один на всех ─────────
// Таблица внешнего источника — отдельный файл, и создать его может как meta-compile
// (источник целиком), так и meta-edit (добавить таблицу в существующий). Формат обязан
// быть один и тот же, поэтому эмиттеры скопированы, а не написаны заново.
...[
// Общие утилиты (Emit-MLText, Emit-FormRef, X и т.п.) сюда не входят: они живут в доброй
// половине навыков и сводить их — отдельная работа, не относящаяся к внешним источникам.
['Get-EdsTables', 'get_eds_tables'],
['Get-EdsFieldRef', 'get_eds_field_ref'],
['Emit-EdsFieldRefList', 'emit_eds_field_ref_list'],
['Emit-EdsFieldRefScalar', 'emit_eds_field_ref_scalar'],
['Emit-EdsFunction', 'emit_eds_function'],
['Emit-EdsTableProperties', 'emit_eds_table_properties'],
['Build-EdsTableXml', 'build_eds_table_xml'],
].map(([ps1, py]) => ({
name: `внешние источники: ${py}`, py, ps1,
variants: [{ id: 'full', authority: 'meta-compile', consumers: ['meta-edit'] }],
})),
// ─── support-guard: запрет правки объекта на поддержке ───────────────────
{
name: 'support-guard: assert_edit_allowed', py: 'assert_edit_allowed', ps1: 'Assert-EditAllowed',