feat(skd-info): auto-resolve object directory path to DCS template

When model passes report/dataprocessor path instead of template path,
scan Templates/*.xml metadata for DataCompositionSchema type and
auto-resolve. Single match → resolve with [i] hint, multiple → list.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-04-16 17:23:56 +03:00
parent afdfc97fb1
commit e30b518935
2 changed files with 83 additions and 4 deletions
+45 -2
View File
@@ -1,4 +1,4 @@
# skd-info v1.0 — Analyze 1C DCS structure
# skd-info v1.1 — Analyze 1C DCS structure
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory=$true)]
@@ -17,6 +17,8 @@ $ErrorActionPreference = "Stop"
# --- Resolve path ---
$originalPath = $TemplatePath
if (-not $TemplatePath.EndsWith(".xml")) {
$candidate = Join-Path (Join-Path $TemplatePath "Ext") "Template.xml"
if (Test-Path $candidate) {
@@ -24,7 +26,48 @@ if (-not $TemplatePath.EndsWith(".xml")) {
}
}
if (-not (Test-Path $TemplatePath)) {
# If still not a file, try resolving from object directory (Reports/X, DataProcessors/X)
if (-not (Test-Path $TemplatePath -PathType Leaf)) {
$templatesDir = Join-Path $originalPath "Templates"
if (Test-Path $templatesDir) {
$dcsTemplates = @()
foreach ($metaXml in (Get-ChildItem $templatesDir -Filter "*.xml" -File)) {
[xml]$meta = Get-Content $metaXml.FullName -Encoding UTF8
$tt = $meta.SelectSingleNode("//*[local-name()='TemplateType']")
if ($tt -and $tt.InnerText -eq "DataCompositionSchema") {
$tplName = [System.IO.Path]::GetFileNameWithoutExtension($metaXml.Name)
$tplPath = Join-Path (Join-Path (Join-Path $templatesDir $tplName) "Ext") "Template.xml"
if (Test-Path $tplPath) {
$dcsTemplates += $tplPath
}
}
}
if ($dcsTemplates.Count -eq 1) {
$TemplatePath = $dcsTemplates[0]
$resolvedMsg = (Resolve-Path $TemplatePath).Path
$cwd = (Get-Location).Path
if ($resolvedMsg.StartsWith($cwd)) {
$resolvedMsg = $resolvedMsg.Substring($cwd.Length + 1)
}
Write-Host "[i] Resolved: $resolvedMsg"
} elseif ($dcsTemplates.Count -gt 1) {
Write-Host "Multiple DCS templates found in: $originalPath"
$cwd = (Get-Location).Path
for ($i = 0; $i -lt $dcsTemplates.Count; $i++) {
$p = (Resolve-Path $dcsTemplates[$i]).Path
if ($p.StartsWith($cwd)) { $p = $p.Substring($cwd.Length + 1) }
Write-Host " $($i+1). $p"
}
Write-Host "Specify the template path."
exit 1
} else {
Write-Error "No DCS templates found in: $originalPath"
exit 1
}
}
}
if (-not (Test-Path $TemplatePath -PathType Leaf)) {
Write-Error "File not found: $TemplatePath"
exit 1
}
+38 -2
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# skd-info v1.0 — Analyze 1C DCS structure
# skd-info v1.1 — Analyze 1C DCS structure
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -281,12 +281,48 @@ def main():
args = parser.parse_args()
# --- Resolve path ---
template_path = args.TemplatePath
original_path = args.TemplatePath
template_path = original_path
if not template_path.endswith(".xml"):
candidate = os.path.join(template_path, "Ext", "Template.xml")
if os.path.isfile(candidate):
template_path = candidate
# If still not found, try resolving from object directory (Reports/X, DataProcessors/X)
if not os.path.isfile(template_path) and not template_path.endswith(".xml"):
templates_dir = os.path.join(original_path, "Templates")
if os.path.isdir(templates_dir):
dcs_templates = []
for fname in os.listdir(templates_dir):
if not fname.endswith(".xml"):
continue
meta_path = os.path.join(templates_dir, fname)
if not os.path.isfile(meta_path):
continue
try:
meta_tree = etree.parse(meta_path, etree.XMLParser(remove_blank_text=True))
tt_nodes = meta_tree.xpath("//*[local-name()='TemplateType']")
if tt_nodes and (tt_nodes[0].text or "").strip() == "DataCompositionSchema":
tpl_name = os.path.splitext(fname)[0]
tpl_path = os.path.join(templates_dir, tpl_name, "Ext", "Template.xml")
if os.path.isfile(tpl_path):
dcs_templates.append(tpl_path)
except Exception:
continue
if len(dcs_templates) == 1:
template_path = dcs_templates[0]
resolved_display = os.path.relpath(os.path.abspath(template_path))
print(f"[i] Resolved: {resolved_display}")
elif len(dcs_templates) > 1:
print(f"Multiple DCS templates found in: {original_path}")
for i, p in enumerate(dcs_templates):
print(f" {i+1}. {os.path.relpath(os.path.abspath(p))}")
print("Specify the template path.")
sys.exit(1)
else:
print(f"No DCS templates found in: {original_path}", file=sys.stderr)
sys.exit(1)
if not os.path.isabs(template_path):
template_path = os.path.join(os.getcwd(), template_path)