test(skills): expect.stderrContains и захват stderr на успешном прогоне

execSkillAsync отдавал только stdout, а stderr сохранялся исключительно в ветке
ошибки. Поэтому предупреждение навыка, который отработал успешно (exit 0), проверить
было нечем: кейс мог убедиться лишь в том, что навык не упал, — то есть в молчании
вместо текста.

Резолв теперь отдаёт оба потока, добавлен ключ expect.stderrContains.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-13 14:20:19 +03:00
co-authored by Claude Opus 5
parent 9949039d98
commit 35c8618813
2 changed files with 33 additions and 4 deletions
+9
View File
@@ -49,6 +49,7 @@ node tests/skills/check-inline-drift.mjs --list # реестр: семья →
| `check-uuid-invariant.mjs` | uuid объекта и сущностей не перегенерируются при правке |
| `check-inline-drift.mjs` | копии общих inline-утилит совпадают с эталонами своих вариантов |
| `check-type-maps.mjs` | карты типов метаданных согласованы с таблицей `ChildObjects` из `docs/1c-configuration-spec.md` |
| `check-format-versions.mjs` | проверенный диапазон версий формата: границы одинаковы во всех навыках и сходятся с лестницей из `docs/1c-configuration-spec.md` |
`check-inline-drift.mjs` держит реестр семей внутри себя: у каждой семьи перечислены варианты, у
варианта — навык-эталон и список копий. Отклоняющийся вариант обязан иметь обоснование (`why`),
@@ -57,6 +58,13 @@ node tests/skills/check-inline-drift.mjs --list # реестр: семья →
Правишь общую утилиту — правишь эталон, копируешь во всех потребителей варианта, прогоняешь гард.
`check-format-versions.mjs` держит границы проверенного диапазона версий формата выгрузки. Раньше
допустимый список версий был независимым литералом в каждом валидаторе, и сверять его было не с
чем: волна 2.21 прошла по четырём валидаторам и молча обошла пятый — `form-validate` остался на
2.17–2.20 и ругался на форму, которую сам же создавал (issue #63). Эталон верхней границы — последняя
**замеренная** ступень таблицы «Лестница версий» из спецификации, поэтому расхождение спеки и кода
падает здесь, а не на чужой выгрузке.
`check-type-maps.mjs` сверяет словари типов метаданных с таблицей «Порядок типов в ChildObjects»
из спецификации: имя типа, каталог и порядок обязаны совпадать, а тип, которого в карте нет
намеренно, объявляется исключением **с причиной**. Так проверка отличает намеренное ограничение
@@ -278,6 +286,7 @@ ibcmd-проход автоматически `○ skipped`, если рядом
| `files` | Массив путей относительно `workDir` — каждый должен существовать после прогона |
| `stdoutContains` | Строка или массив строк — все должны присутствовать в stdout |
| `stdoutNotContains` | Строка или массив строк — ни одной не должно быть в stdout |
| `stderrContains` | Строка или массив строк — все должны присутствовать в stderr. Для предупреждений: навык печатает их в stderr и продолжает, поэтому `expectError` тут не годится |
| `preserves` | Объект (или массив объектов) — байтовые свойства файла, которые навык обязан сохранить |
`preserves` проверяет то, что снэпшот-сравнение нормализует и потому увидеть не может: