diff --git a/ACTIONS.md b/ACTIONS.md index 4688c20..85a147c 100644 --- a/ACTIONS.md +++ b/ACTIONS.md @@ -65,3 +65,21 @@ ACTIONS: - no_unverified_claims outputs: - final_user_report + meta:sync-parent: + intent: sync_dependency_moduleshortdesc_from_parent_meta + inputs: + - parent_meta_path + - Mods/DnD 5.5e AIO Russian/meta.lsx + plan: + - read_parent_moduleinfo_fields + - validate_required_fields_folder_md5_name_publishhandle_uuid_version64 + - update_target_dependencies_moduleshortdesc_fields + - validate_xml_structure + - report_changed_fields + checks: + - xml_valid + - required_parent_fields_present + - only_dependencies_moduleshortdesc_changed + outputs: + - Mods/DnD 5.5e AIO Russian/meta.lsx + diff --git a/AGENTS.md b/AGENTS.md index a962d8a..f351e13 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,6 +11,8 @@ 2. merging to `main` immediately and deleting the `fix/*`/`feat/*` branch. - If push fails: retry up to 2 more times with 3s pause. - Never auto-commit/auto-push without explicit user approval. +- Approval prompts for pending actions: short direct question in imperative form, no soft/opening phrases. +- If multiple actions or combinations are possible: provide a numbered options list so user can reply with a number. ### Cleanup (General) - Do not leave temporary/debug artifacts in repo. diff --git a/Mods/DnD 5.5e AIO Russian/meta.lsx b/Mods/DnD 5.5e AIO Russian/meta.lsx index 6c5e2ac..fb085e7 100644 --- a/Mods/DnD 5.5e AIO Russian/meta.lsx +++ b/Mods/DnD 5.5e AIO Russian/meta.lsx @@ -21,7 +21,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/scripts/sync-parent-meta.ps1 b/scripts/sync-parent-meta.ps1 new file mode 100644 index 0000000..92b4f7b --- /dev/null +++ b/scripts/sync-parent-meta.ps1 @@ -0,0 +1,87 @@ +param( + [Parameter(Mandatory = $true)] + [string]$ParentMetaPath, + [string]$TargetMetaPath = "Mods/DnD 5.5e AIO Russian/meta.lsx" +) + +$ErrorActionPreference = "Stop" + +$resolvedParentMetaPath = [System.IO.Path]::GetFullPath($ParentMetaPath) +$resolvedTargetMetaPath = [System.IO.Path]::GetFullPath($TargetMetaPath) + +if (-not (Test-Path -LiteralPath $resolvedParentMetaPath)) { + throw "Parent meta.lsx was not found: '$resolvedParentMetaPath'." +} + +if (-not (Test-Path -LiteralPath $resolvedTargetMetaPath)) { + throw "Target meta.lsx was not found: '$resolvedTargetMetaPath'." +} + +$parentRaw = Get-Content -LiteralPath $resolvedParentMetaPath -Raw +$targetRaw = Get-Content -LiteralPath $resolvedTargetMetaPath -Raw + +[xml]$parentXml = $parentRaw +[xml]$targetXml = $targetRaw + +$parentModuleInfo = $parentXml.SelectSingleNode('/save/region/node/children/node[@id="ModuleInfo"]') +if ($null -eq $parentModuleInfo) { + throw "ModuleInfo node was not found in parent meta: '$resolvedParentMetaPath'." +} + +$requiredFields = @("Folder", "MD5", "Name", "PublishHandle", "UUID", "Version64") +$sourceValues = @{} + +foreach ($field in $requiredFields) { + $node = $parentModuleInfo.SelectSingleNode("attribute[@id='$field']") + if ($null -eq $node) { + throw "Required parent ModuleInfo attribute '$field' is missing in '$resolvedParentMetaPath'." + } + + $value = $node.GetAttribute("value") + if ([string]::IsNullOrWhiteSpace($value)) { + throw "Required parent ModuleInfo attribute '$field' has empty value in '$resolvedParentMetaPath'." + } + + $sourceValues[$field] = $value +} + +$targetDependencyNode = $targetXml.SelectSingleNode('/save/region/node/children/node[@id="Dependencies"]/children/node[@id="ModuleShortDesc"]') +if ($null -eq $targetDependencyNode) { + throw "Dependencies/ModuleShortDesc node was not found in target meta: '$resolvedTargetMetaPath'." +} + +$changedFields = @() +foreach ($field in $requiredFields) { + $targetAttr = $targetDependencyNode.SelectSingleNode("attribute[@id='$field']") + if ($null -eq $targetAttr) { + throw "Target Dependencies/ModuleShortDesc attribute '$field' is missing in '$resolvedTargetMetaPath'." + } + + $currentValue = $targetAttr.GetAttribute("value") + $newValue = [string]$sourceValues[$field] + if ($currentValue -ne $newValue) { + $targetAttr.SetAttribute("value", $newValue) + $changedFields += $field + } +} + +if ($changedFields.Count -eq 0) { + Write-Host "[sync-parent-meta.ps1] No changes needed. Target dependency data is already up to date." +} else { + $utf8Bom = New-Object System.Text.UTF8Encoding($true) + $settings = New-Object System.Xml.XmlWriterSettings + $settings.Encoding = $utf8Bom + $settings.Indent = $true + $settings.IndentChars = " " + $settings.NewLineChars = "`n" + $settings.NewLineHandling = [System.Xml.NewLineHandling]::Replace + + $writer = [System.Xml.XmlWriter]::Create($resolvedTargetMetaPath, $settings) + try { + $targetXml.WriteTo($writer) + } finally { + $writer.Dispose() + } + + Write-Host ("[sync-parent-meta.ps1] Updated fields: " + ($changedFields -join ", ")) +}