fix(skills): внятная диагностика разбора JSON вместо стектрейса (#80)

Неверный входной JSON ронял скрипты необработанным исключением: PS1 отдавал дамп
ConvertFrom-Json с CategoryInfo, py-порт — traceback с внутренностями json/decoder.py.
Имя файла в сообщении не фигурировало, а для полиморфного -Value не было видно, какую
форму ждёт операция.

Общий хелпер ConvertFrom-JsonInput / parse_json_input в 12 навыках × 2 порта (24 места),
зарегистрирован семьёй в check-inline-drift.mjs — копии держит гард. Сообщение в одну
строку: ожидаемая форма, полученное значение, текст парсера в скобках.

Эхо полученного значения нужно потому, что съеденные оболочкой кавычки дают почти тот же
JSON ({group:X} вместо {"group":"X"}), и без него агент считает свой вызов верным. PS 5.1
печатает лишь огрызок и локализованно, Python — только номер колонки.

Возврат в PS1 через Write-Output -NoEnumerate: вынос разбора в функцию добавляет второй
анруллинг, и одноэлементный JSON-массив стал бы скаляром. Импорты внутри тела py-хелпера —
skd-decompile импортирует json локально как _json, а тело семьи обязано быть одинаковым.

В раннер добавлен inputRaw (запись входного файла дословно): через case.input битый JSON
невыразим, JSON.stringify всегда даёт валидный документ.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-21 15:25:54 +03:00
co-authored by Claude Opus 5
parent 53fc16d2f1
commit a44a29a7d8
37 changed files with 1037 additions and 101 deletions
+13
View File
@@ -394,6 +394,19 @@ const FAMILIES = [
],
},
// ─── Разбор пользовательского JSON ─────────────────────────────────────
// Сообщение об ошибке разбора одинаково во всех навыках (issue #80): стектрейс парсера
// агент читает как «скрипт сломан» и идёт чинить не то место. Вся специфика навыка —
// в аргументах source/expected на месте вызова, тело функции общее.
{
name: 'parse_json_input', py: 'parse_json_input', ps1: 'ConvertFrom-JsonInput',
variants: [
{ id: 'base', authority: 'interface-edit',
consumers: ['cf-edit', 'form-compile', 'form-edit', 'meta-compile', 'meta-edit', 'mxl-compile',
'role-compile', 'skd-compile', 'skd-decompile', 'subsystem-compile', 'subsystem-edit'] },
],
},
];
// ─── Семьи, разъехавшиеся целиком ───────────────────────────────────────────