fix(db-*, epf-*): ошибка до запуска платформы не выдаётся за успех

Временный каталог брался из $env:TEMP, которой вне Windows нет. Join-Path
падал на привязке параметра внутри try/finally без catch: try прерывался,
finally отрабатывал, и скрипт выходил с кодом 0 — платформа не запускалась,
постусловие не проверялось (#106).

- временный каталог — [IO.Path]::GetTempPath() (на Windows тот же путь);
- верхнеуровневый trap { … exit 1 } в 15 скриптах db-*/epf-*, запускающих
  платформу: любая необработанная ошибка даёт код 1 и печатает место;
- уборка временного каталога в finally не падает на пустом пути;
- гард check-ps-portability.mjs держит оба правила.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-09-26 13:53:51 +03:00
co-authored by Claude Opus 5.5
parent 317dce6d9f
commit eb1796ef94
35 changed files with 233 additions and 79 deletions
+11
View File
@@ -115,6 +115,7 @@ node tests/skills/check-inline-drift.mjs --list # реестр: семья →
| `check-agent-portability.mjs` | исходники навыков не привязаны к конкретному AI-агенту: единственная разрешённая форма — плейсхолдер `${CLAUDE_SKILL_DIR}/`, который разворачивает `scripts/switch.py` |
| `check-error-streams.mjs` | сообщения об ошибках идут в один и тот же поток в обоих портах навыка (соответствие из `docs/python-porting-guide.md`) |
| `check-nonascii-fs.mjs` | `fsutil`: удаление и копирование держат не-ASCII пути (кириллический `%TEMP%`, кириллические имена объектов 1С), обе копии модуля не разошлись |
| `check-ps-portability.mjs` | `.ps1` навыков не читают `$env:TEMP`/`$env:TMP`; скрипты `db-*`/`epf-*`, запускающие платформу, держат верхнеуровневый `trap { … exit 1 }` |
`check-inline-drift.mjs` держит реестр семей внутри себя: у каждой семьи перечислены варианты, у
варианта — навык-эталон и список копий. Отклоняющийся вариант обязан иметь обоснование (`why`),
@@ -159,6 +160,16 @@ node tests/skills/check-inline-drift.mjs --list # реестр: семья →
[nafs]: https://github.com/nodejs/node/issues/61067
`check-ps-portability.mjs` держит два следствия issue #106. Вне Windows `$env:TEMP` равна `$null`,
и `Join-Path $env:TEMP …` падает на привязке параметра. Внутри `try { } finally { }` без `catch`
такая ошибка прерывает `try`, отрабатывает `finally` — и скрипт выходит с **кодом 0**: платформа
не запускалась, постусловие не проверялось, навык «успешен». Поэтому временный каталог берётся
через `[IO.Path]::GetTempPath()`, а скрипты `db-*`/`epf-*`, запускающие платформу, ставят после
`param(...)` верхнеуровневый `trap { … exit 1 }` — он ловит и ошибки вне `try`, внутренние `catch`
сохраняют приоритет, `finally` отрабатывает. Кейсом это не проверить: libuv на Windows возвращает
`TEMP` в окружение дочернего процесса, даже если раннер его убрал, а пустое значение ломает
`GetTempPath()` иначе, чем отсутствие переменной.
`check-format-versions.mjs` держит границы проверенного диапазона версий формата выгрузки. Раньше
допустимый список версий был независимым литералом в каждом валидаторе, и сверять его было не с
чем: волна 2.21 прошла по четырём валидаторам и молча обошла пятый — `form-validate` остался на