diff --git a/.claude/skills/meta-validate/SKILL.md b/.claude/skills/meta-validate/SKILL.md index edeb31c2..0cbb215b 100644 --- a/.claude/skills/meta-validate/SKILL.md +++ b/.claude/skills/meta-validate/SKILL.md @@ -1,7 +1,7 @@ --- name: meta-validate description: Валидация объекта метаданных 1С. Используй после создания или модификации объекта конфигурации для проверки корректности -argument-hint: [-MaxErrors 30] +argument-hint: [-MaxErrors 30] — pipe-separated paths for batch allowed-tools: - Bash - Read @@ -16,18 +16,21 @@ allowed-tools: ``` /meta-validate +/meta-validate path1.xml|path2.xml|path3.xml — batch mode ``` ## Параметры | Параметр | Обязательный | По умолчанию | Описание | |------------|:------------:|--------------|-------------------------------------------------| -| ObjectPath | да | — | Путь к XML-файлу или каталогу объекта | -| MaxErrors | нет | 30 | Остановиться после N ошибок | +| ObjectPath | да | — | Путь к XML-файлу или каталогу объекта. Несколько путей через `\|` для batch | +| MaxErrors | нет | 30 | Остановиться после N ошибок (per object) | | OutFile | нет | — | Записать результат в файл (UTF-8 BOM) | `ObjectPath` авторезолв: если указана директория — ищет `/.xml`. +**Batch mode**: при нескольких путях через `|` каждый объект валидируется отдельно, в конце выводится сводка `=== Batch: N objects, X passed, Y failed ===`. + ## Команда ```powershell @@ -94,6 +97,9 @@ Errors: 1, Warnings: 1 # С записью в файл ... -ObjectPath Catalogs/Номенклатура.xml -OutFile result.txt + +# Batch: несколько объектов через | +... -ObjectPath "Catalogs/Банки.xml|Documents/Заказ.xml|Enums/ВидДоговора.xml" ``` ## Верификация diff --git a/.claude/skills/meta-validate/scripts/meta-validate.ps1 b/.claude/skills/meta-validate/scripts/meta-validate.ps1 index 05257e55..80b76b65 100644 --- a/.claude/skills/meta-validate/scripts/meta-validate.ps1 +++ b/.claude/skills/meta-validate/scripts/meta-validate.ps1 @@ -1,4 +1,4 @@ -# meta-validate v1.0 — Validate 1C metadata object structure +# meta-validate v1.1 — Validate 1C metadata object structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -12,6 +12,31 @@ param( $ErrorActionPreference = "Stop" [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 +# --- Batch mode: pipe-separated paths (comma reserved by PowerShell) --- + +$pathList = @($ObjectPath -split '\|' | ForEach-Object { $_.Trim() } | Where-Object { $_ }) +if ($pathList.Count -gt 1) { + $batchOk = 0 + $batchFail = 0 + foreach ($singlePath in $pathList) { + $callArgs = @{ ObjectPath = $singlePath; MaxErrors = $MaxErrors } + if ($OutFile) { + $baseName = [System.IO.Path]::GetFileNameWithoutExtension($OutFile) + $ext = [System.IO.Path]::GetExtension($OutFile) + $dir = Split-Path $OutFile + if (-not $dir) { $dir = "." } + $objLeaf = [System.IO.Path]::GetFileNameWithoutExtension($singlePath) + $callArgs.OutFile = Join-Path $dir "$baseName`_$objLeaf$ext" + } + & $PSCommandPath @callArgs + if ($LASTEXITCODE -eq 0) { $batchOk++ } else { $batchFail++ } + } + Write-Host "" + Write-Host "=== Batch: $($pathList.Count) objects, $batchOk passed, $batchFail failed ===" + if ($batchFail -gt 0) { exit 1 } + exit 0 +} + # --- Resolve path --- if (-not [System.IO.Path]::IsPathRooted($ObjectPath)) { diff --git a/.claude/skills/meta-validate/scripts/meta-validate.py b/.claude/skills/meta-validate/scripts/meta-validate.py index adf42731..6f6fb2ef 100644 --- a/.claude/skills/meta-validate/scripts/meta-validate.py +++ b/.claude/skills/meta-validate/scripts/meta-validate.py @@ -1,8 +1,9 @@ -# meta-validate v1.0 — Validate 1C metadata object structure (Python port) +# meta-validate v1.1 — Validate 1C metadata object structure (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os import re +import subprocess import sys from lxml import etree @@ -18,10 +19,32 @@ parser.add_argument("-MaxErrors", type=int, default=30) parser.add_argument("-OutFile", default="") args = parser.parse_args() -object_path = args.ObjectPath max_errors = args.MaxErrors out_file = args.OutFile +# ── batch mode: pipe-separated paths ───────────────────────── + +path_list = [p.strip() for p in args.ObjectPath.split('|') if p.strip()] +if len(path_list) > 1: + batch_ok = 0 + batch_fail = 0 + for single_path in path_list: + cmd = [sys.executable, __file__, "-ObjectPath", single_path, "-MaxErrors", str(max_errors)] + if out_file: + base, ext = os.path.splitext(out_file) + obj_leaf = os.path.splitext(os.path.basename(single_path))[0] + cmd += ["-OutFile", f"{base}_{obj_leaf}{ext}"] + rc = subprocess.call(cmd) + if rc == 0: + batch_ok += 1 + else: + batch_fail += 1 + print() + print(f"=== Batch: {len(path_list)} objects, {batch_ok} passed, {batch_fail} failed ===") + sys.exit(1 if batch_fail > 0 else 0) + +object_path = path_list[0] + # ── resolve path ───────────────────────────────────────────── if not os.path.isabs(object_path):