From 113dc9e9280b33b7aa3e4691eb8915cdaddea65b Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Mon, 17 Aug 2026 21:18:15 +0300 Subject: [PATCH] =?UTF-8?q?fix(cfe-validate):=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9=20=D0=B7=D0=B0=D1=82=D0=B8=D1=80=D0=B0=D0=BB=D0=B0=20?= =?UTF-8?q?=D0=B8=D0=BC=D1=8F=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D0=B8=D1=82=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Новая проверка (сверка «файл модуля ↔ пометка») переиспользовала $objName — ту же переменную, из которой собирается финальная строка отчёта. В расширении с заимствованным объектом ps1 печатал «Validation OK: Extension.Цены» — имя последнего проверенного объекта вместо имени расширения. py-порт был прав, то есть порты разошлись молча. Расхождение видно только на непустом расширении с чистым результатом, поэтому ни один существующий кейс его не ловил: тесты сверяют снапшот, а итоговую строку — нет. Добавлены утверждения на неё в кейсы valid, with-borrowed-object и module-state-file-without-flag; проверено, что на старой версии скрипта они падают. Co-Authored-By: Claude Opus 5 (1M context) --- .../skills/cfe-validate/scripts/cfe-validate.ps1 | 14 +++++++------- .../skills/cfe-validate/scripts/cfe-validate.py | 2 +- .../module-state-file-without-flag.json | 7 ++++++- tests/skills/cases/cfe-validate/valid.json | 3 ++- .../cases/cfe-validate/with-borrowed-object.json | 3 ++- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/.claude/skills/cfe-validate/scripts/cfe-validate.ps1 b/.claude/skills/cfe-validate/scripts/cfe-validate.ps1 index bdffc167..1ad5b183 100644 --- a/.claude/skills/cfe-validate/scripts/cfe-validate.ps1 +++ b/.claude/skills/cfe-validate/scripts/cfe-validate.ps1 @@ -1,4 +1,4 @@ -# cfe-validate v1.12 — Validate 1C configuration extension structure (CFE) +# cfe-validate v1.13 — Validate 1C configuration extension structure (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -1268,22 +1268,22 @@ if ($versionRank -ge 219 -and $childObjNode) { $typeName = $child.LocalName if (-not $moduleKindsByType.ContainsKey($typeName)) { continue } if (-not $childTypeDirMap.ContainsKey($typeName)) { continue } - $objName = $child.InnerText.Trim() - if (-not $objName) { continue } + $stateObjName = $child.InnerText.Trim() + if (-not $stateObjName) { continue } $typeDir = Join-Path $configDir $childTypeDirMap[$typeName] - $objFile = Join-Path $typeDir "$objName.xml" + $objFile = Join-Path $typeDir "$stateObjName.xml" if (-not (Test-Path $objFile)) { continue } $objText = [System.IO.File]::ReadAllText($objFile, [System.Text.Encoding]::UTF8) if ($objText -notmatch 'Adopted') { continue } foreach ($kind in $moduleKindsByType[$typeName]) { $stateChecked++ - $hasFile = Test-Path (Join-Path (Join-Path (Join-Path $typeDir $objName) "Ext") "$kind.bsl") + $hasFile = Test-Path (Join-Path (Join-Path (Join-Path $typeDir $stateObjName) "Ext") "$kind.bsl") $hasFlag = $objText -match "$kind" if ($hasFile -and -not $hasFlag) { - $stateIssues += "$typeName.$objName — есть $kind.bsl, но нет для $kind" + $stateIssues += "$typeName.$stateObjName — есть $kind.bsl, но нет для $kind" } elseif ($hasFlag -and -not $hasFile) { - $stateIssues += "$typeName.$objName — есть для $kind, но нет $kind.bsl" + $stateIssues += "$typeName.$stateObjName — есть для $kind, но нет $kind.bsl" } } } diff --git a/.claude/skills/cfe-validate/scripts/cfe-validate.py b/.claude/skills/cfe-validate/scripts/cfe-validate.py index 35f747c2..39d6bb1d 100644 --- a/.claude/skills/cfe-validate/scripts/cfe-validate.py +++ b/.claude/skills/cfe-validate/scripts/cfe-validate.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cfe-validate v1.12 — Validate 1C configuration extension XML structure (CFE) +# cfe-validate v1.13 — Validate 1C configuration extension XML structure (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Validates extension Configuration.xml: root, InternalInfo, extension properties, ChildObjects, borrowed objects.""" import sys, os, argparse, re diff --git a/tests/skills/cases/cfe-validate/module-state-file-without-flag.json b/tests/skills/cases/cfe-validate/module-state-file-without-flag.json index 7d832ea8..78424952 100644 --- a/tests/skills/cases/cfe-validate/module-state-file-without-flag.json +++ b/tests/skills/cases/cfe-validate/module-state-file-without-flag.json @@ -28,5 +28,10 @@ } ], "params": { "extensionPath": "cfe" }, - "expect": { "stdoutContains": "есть Module.bsl, но нет для Module" } + "expect": { + "stdoutContains": [ + "есть Module.bsl, но нет для Module", + "=== Validation: Extension.Тест ===" + ] + } } diff --git a/tests/skills/cases/cfe-validate/valid.json b/tests/skills/cases/cfe-validate/valid.json index 11e929e4..e91c5ecb 100644 --- a/tests/skills/cases/cfe-validate/valid.json +++ b/tests/skills/cases/cfe-validate/valid.json @@ -6,5 +6,6 @@ "args": { "-Name": "Тест", "-OutputDir": "{workDir}/ext", "-ConfigPath": "{workDir}" } } ], - "params": { "extensionPath": "ext" } + "params": { "extensionPath": "ext" }, + "expect": { "stdoutContains": "=== Validation OK: Extension.Тест" } } diff --git a/tests/skills/cases/cfe-validate/with-borrowed-object.json b/tests/skills/cases/cfe-validate/with-borrowed-object.json index 8c00dee7..96dae553 100644 --- a/tests/skills/cases/cfe-validate/with-borrowed-object.json +++ b/tests/skills/cases/cfe-validate/with-borrowed-object.json @@ -15,5 +15,6 @@ "args": { "-ExtensionPath": "{workDir}/ext", "-ConfigPath": "{workDir}", "-Object": "Catalog.Товары" } } ], - "params": { "extensionPath": "ext" } + "params": { "extensionPath": "ext" }, + "expect": { "stdoutContains": "=== Validation OK: Extension.Тест" } }