fix(skills): корректный запуск Python-портов на macOS/Linux

- subsystem-compile.py: авто-валидация через subprocess к subsystem-validate.py
  (вместо powershell.exe + .ps1), без проброса кода возврата — паритет с сиблингами
- resolve_v8path (12 db/epf .py): резолв каталога платформы по ОС (1cv8 без .exe
  на *nix), авто-поиск /opt/1cv8/*; ibcmd только явным путём, 1cv8c убран
- сообщения об ошибках платформо-нейтральные (ps1+py), коммент-заглушка PY-only в .ps1
- runner.mjs (v0.5): loadV8Context кросс-платформенный (1cv8/ibcmd без .exe)
- тесты: stdoutContains маркер валидатора (#26), негативный кейс db-update/error-bad-v8dir
- синхронный бамп версий ps1+py всех затронутых навыков

Fixes #26, #27

Co-Authored-By: Korolev Pavel <korolev.vrn@gmail.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-30 11:42:07 +03:00
co-authored by Korolev Pavel Claude Opus 4.8
parent 3a7f1c1763
commit 29999a2755
29 changed files with 379 additions and 213 deletions
@@ -0,0 +1,5 @@
{
"name": "Ошибка: каталог -V8Path без исполняемого 1C",
"args_extra": ["-V8Path", "{workDir}"],
"expectError": true
}
@@ -5,6 +5,7 @@
},
"validatePath": "Subsystems/Тест",
"expect": {
"files": ["Subsystems/Тест.xml"]
"files": ["Subsystems/Тест.xml"],
"stdoutContains": "=== Validation OK: Subsystem.Тест"
}
}
+6 -3
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env node
// skill-test-runner v0.4 — Snapshot-based regression tests for 1C skill scripts
// skill-test-runner v0.5 — Snapshot-based regression tests for 1C skill scripts
// Usage: node tests/skills/runner.mjs [filter] [--update-snapshots] [--runtime python] [--json report.json] [--concurrency N] [--with-validation]
import { execFileSync, execFile } from 'child_process';
@@ -970,9 +970,12 @@ function loadV8Context() {
try {
const proj = JSON.parse(readFileSync(projectFile, 'utf8'));
const v8bin = proj.v8path;
const v8exe = v8bin ? (existsSync(join(v8bin, '1cv8.exe')) ? join(v8bin, '1cv8.exe') : null) : null;
// Platform executable names: Windows uses .exe; *nix (macOS/Linux) plain names.
const exeName = process.platform === 'win32' ? '1cv8.exe' : '1cv8';
const ibcmdName = process.platform === 'win32' ? 'ibcmd.exe' : 'ibcmd';
const v8exe = v8bin && existsSync(join(v8bin, exeName)) ? join(v8bin, exeName) : null;
if (!v8exe) return null;
const ibcmdExe = v8bin && existsSync(join(v8bin, 'ibcmd.exe')) ? join(v8bin, 'ibcmd.exe') : null;
const ibcmdExe = v8bin && existsSync(join(v8bin, ibcmdName)) ? join(v8bin, ibcmdName) : null;
const defaultDb = proj.databases?.find(d => d.id === proj.default) || proj.databases?.[0];
return {
v8path: v8bin,