Compare commits
8 Commits
v0.2.1.2
...
6782cfcd87
| Author | SHA1 | Date | |
|---|---|---|---|
| 6782cfcd87 | |||
| eaf84ad605 | |||
| 65e3f5b48e | |||
| 9519b92771 | |||
| 6257027a13 | |||
| cde9194ed5 | |||
| 1c8cf13f67 | |||
| 74a8942999 |
18
ACTIONS.md
18
ACTIONS.md
@@ -65,3 +65,21 @@ ACTIONS:
|
|||||||
- no_unverified_claims
|
- no_unverified_claims
|
||||||
outputs:
|
outputs:
|
||||||
- final_user_report
|
- final_user_report
|
||||||
|
meta:sync-parent:
|
||||||
|
intent: sync_dependency_moduleshortdesc_from_parent_meta
|
||||||
|
inputs:
|
||||||
|
- parent_meta_git_url (optional; defaults to upstream)
|
||||||
|
- 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
|
||||||
|
|
||||||
|
|||||||
52
AGENTS.md
52
AGENTS.md
@@ -1,13 +1,37 @@
|
|||||||
# AGENTS.md
|
# AGENTS.md
|
||||||
|
|
||||||
## Scope (MUST)
|
## General Rules (MUST)
|
||||||
|
|
||||||
|
### Git Collaboration Policy (General)
|
||||||
|
- Ask user permission before commit.
|
||||||
|
- After approval: commit and push immediately.
|
||||||
|
- At the start of each new fix/feature task: pause task execution, propose switching to a dedicated `fix/*` or `feat/*` branch, and continue only after explicit user decision on branch change necessity.
|
||||||
|
- After finishing work in `fix/*` or `feat/*`: propose either
|
||||||
|
1. creating an MR into `main`, or
|
||||||
|
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.
|
||||||
|
- Remove additional debug/temp dirs unless user asked to keep them.
|
||||||
|
|
||||||
|
### Rules Maintenance (General)
|
||||||
|
- For changes to rules files (`AGENTS.md`, `ACTIONS.md`): prefer optimized, compressed edits for AI-agent execution (machine-readable, unambiguous).
|
||||||
|
- Keep rule updates minimal and non-duplicative: merge overlapping points, remove redundancy, preserve intent.
|
||||||
|
|
||||||
|
## Project-Specific Rules (MUST)
|
||||||
|
|
||||||
|
### Scope
|
||||||
- Repository purpose: standalone Russian localization mod only.
|
- Repository purpose: standalone Russian localization mod only.
|
||||||
- Allowed domain: localization content + packaging/release metadata.
|
- Allowed domain: localization content + packaging/release metadata.
|
||||||
- Forbidden: gameplay logic, Script Extender content, unrelated assets.
|
- Forbidden: gameplay logic, Script Extender content, unrelated assets.
|
||||||
- Keep repository source-only.
|
- Keep repository source-only.
|
||||||
- Never commit `.pak` or temporary build artifacts.
|
- Never commit `.pak` or temporary build artifacts.
|
||||||
|
|
||||||
## Canonical Paths (MUST)
|
### Canonical Paths
|
||||||
- Mod sources: `Mods/DnD 5.5e AIO Russian`
|
- Mod sources: `Mods/DnD 5.5e AIO Russian`
|
||||||
- Russian localization: `Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml`
|
- Russian localization: `Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml`
|
||||||
- Mod metadata: `Mods/DnD 5.5e AIO Russian/meta.lsx`
|
- Mod metadata: `Mods/DnD 5.5e AIO Russian/meta.lsx`
|
||||||
@@ -17,7 +41,7 @@
|
|||||||
- Action catalog and command playbooks: `ACTIONS.md`
|
- Action catalog and command playbooks: `ACTIONS.md`
|
||||||
- Upstream English reference: `https://github.com/Yoonmoonsik/dnd55e/blob/main/Mods/DnD2024_897914ef-5c96-053c-44af-0be823f895fe/Localization/English/english.xml`
|
- Upstream English reference: `https://github.com/Yoonmoonsik/dnd55e/blob/main/Mods/DnD2024_897914ef-5c96-053c-44af-0be823f895fe/Localization/English/english.xml`
|
||||||
|
|
||||||
## Packaging Invariants (MUST)
|
### Packaging Invariants
|
||||||
- `.pak` must contain only BG3 mod structure under `Mods/...`.
|
- `.pak` must contain only BG3 mod structure under `Mods/...`.
|
||||||
- Required content in `.pak`:
|
- Required content in `.pak`:
|
||||||
- `Mods/DnD 5.5e AIO Russian/meta.lsx`
|
- `Mods/DnD 5.5e AIO Russian/meta.lsx`
|
||||||
@@ -25,7 +49,7 @@
|
|||||||
- Must not leak into `.pak`: `.git`, `.gitea`, `scripts`, `tools`, `.tools`, `build`, staging dirs.
|
- Must not leak into `.pak`: `.git`, `.gitea`, `scripts`, `tools`, `.tools`, `build`, staging dirs.
|
||||||
- Staging for packaging must be in `%TEMP%`, not in dot-prefixed repo dirs.
|
- Staging for packaging must be in `%TEMP%`, not in dot-prefixed repo dirs.
|
||||||
|
|
||||||
## Build/CI Contract (MUST)
|
### Build/CI Contract
|
||||||
- CI workflow stays thin:
|
- CI workflow stays thin:
|
||||||
1. prepare workspace
|
1. prepare workspace
|
||||||
2. download Divine
|
2. download Divine
|
||||||
@@ -38,7 +62,7 @@
|
|||||||
- Release ZIP must include only `.pak` + `info.json`.
|
- Release ZIP must include only `.pak` + `info.json`.
|
||||||
- CI triggers: tag `v*` and manual dispatch; not every push to `main`.
|
- CI triggers: tag `v*` and manual dispatch; not every push to `main`.
|
||||||
|
|
||||||
## Version/Release Rules (MUST)
|
### Version/Release Rules
|
||||||
- Read release version only from `save/region/node[@id="ModuleSettings"]/children/node[@id="ModuleInfo"]/attribute[@id="Version64"]` via explicit XML parsing.
|
- Read release version only from `save/region/node[@id="ModuleSettings"]/children/node[@id="ModuleInfo"]/attribute[@id="Version64"]` via explicit XML parsing.
|
||||||
- `PublishVersion` must not be changed during release preparation.
|
- `PublishVersion` must not be changed during release preparation.
|
||||||
- Release tag must match the source-of-truth version.
|
- Release tag must match the source-of-truth version.
|
||||||
@@ -47,27 +71,17 @@
|
|||||||
2. If `ModuleInfo/Version64` equals latest released version, bump version first (e.g. `scripts/set-version.ps1 -VersionTag <tag>`), commit, then create/push tag.
|
2. If `ModuleInfo/Version64` equals latest released version, bump version first (e.g. `scripts/set-version.ps1 -VersionTag <tag>`), commit, then create/push tag.
|
||||||
- `scripts/build.ps1` derives release `Version64` from tag and writes it to generated `info.json` and staged `meta.lsx`.
|
- `scripts/build.ps1` derives release `Version64` from tag and writes it to generated `info.json` and staged `meta.lsx`.
|
||||||
|
|
||||||
## info.json Contract (MUST)
|
### info.json Contract
|
||||||
- Top-level keys: `Mods`, `MD5`.
|
- Top-level keys: `Mods`, `MD5`.
|
||||||
- Per-mod keys: `Author`, `Name`, `Folder`, `Version`, `Description`, `UUID`, `Created`, `Dependencies`, `Group`.
|
- Per-mod keys: `Author`, `Name`, `Folder`, `Version`, `Description`, `UUID`, `Created`, `Dependencies`, `Group`.
|
||||||
- `Dependencies` is an array of UUIDs.
|
- `Dependencies` is an array of UUIDs.
|
||||||
- Current dependency UUID: `897914ef-5c96-053c-44af-0be823f895fe`.
|
- Current dependency UUID: `897914ef-5c96-053c-44af-0be823f895fe`.
|
||||||
|
|
||||||
## Git Collaboration Policy (MUST)
|
### Git Collaboration Policy (Project-Specific)
|
||||||
- Ask user permission before commit.
|
|
||||||
- After approval: commit and push immediately.
|
|
||||||
- At the start of each new fix/feature task: propose switching to a dedicated `fix/*` or `feat/*` branch.
|
|
||||||
- After finishing work in `fix/*` or `feat/*`: propose either
|
|
||||||
1. creating an MR into `main`, or
|
|
||||||
2. merging to `main` immediately and deleting the `fix/*`/`feat/*` branch.
|
|
||||||
- Commit messages and comments: Russian.
|
- Commit messages and comments: Russian.
|
||||||
- Commit message content: what was done (not what should be done).
|
- Commit message content: what was done (not what should be done).
|
||||||
- If push fails: retry up to 2 more times with 3s pause.
|
|
||||||
- If changes affect `.pak` contents or build/release flow: propose releasing next version.
|
- If changes affect `.pak` contents or build/release flow: propose releasing next version.
|
||||||
- For released versions in user-facing messages: provide direct archive link when derivable (acceptable immediately after tag push, even before CI finishes).
|
- For released versions in user-facing messages: provide direct archive link in Markdown format `[version](url)` when derivable (acceptable immediately after tag push, even before CI finishes).
|
||||||
- Never auto-commit/auto-push without explicit user approval.
|
|
||||||
|
|
||||||
## Cleanup (MUST)
|
### Cleanup (Project-Specific)
|
||||||
- Do not leave temporary/debug artifacts in repo.
|
|
||||||
- Ignored/temp patterns include: `build/`, `build-stage*`, `.tools/`, `*.pak`.
|
- Ignored/temp patterns include: `build/`, `build-stage*`, `.tools/`, `*.pak`.
|
||||||
- Remove additional debug/temp dirs unless user asked to keep them.
|
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
<node id="ModuleInfo">
|
<node id="ModuleInfo">
|
||||||
<attribute id="Author" type="LSString" value="MikhailRaw"/>
|
<attribute id="Author" type="LSString" value="MikhailRaw"/>
|
||||||
<attribute id="CharacterCreationLevelName" type="FixedString" value=""/>
|
<attribute id="CharacterCreationLevelName" type="FixedString" value=""/>
|
||||||
<attribute id="Description" type="LSString" value="Русская AI локализация мода DnD 5.5e All-in-One BEYOND."/>
|
<attribute id="Description" type="LSString" value="Русский перевод мода DnD 5.5e All-in-One BEYOND. Перевод ещё в разработке: AI помогает быстро обновлять тексты, а финальные правки и качество мы проверяем вручную."/>
|
||||||
<attribute id="FileSize" type="uint64" value="0"/>
|
<attribute id="FileSize" type="uint64" value="2488095"/>
|
||||||
<attribute id="Folder" type="LSString" value="DnD 5.5e AIO Russian"/>
|
<attribute id="Folder" type="LSString" value="DnD 5.5e AIO Russian"/>
|
||||||
<attribute id="LobbyLevelName" type="FixedString" value=""/>
|
<attribute id="LobbyLevelName" type="FixedString" value=""/>
|
||||||
<attribute id="MD5" type="LSString" value="c0a8f3412870277331306e0719fc6f77"/>
|
<attribute id="MD5" type="LSString" value="c0a8f3412870277331306e0719fc6f77"/>
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
<attribute id="PublishHandle" type="uint64" value="5965149"/>
|
<attribute id="PublishHandle" type="uint64" value="5965149"/>
|
||||||
<attribute id="StartupLevelName" type="FixedString" value=""/>
|
<attribute id="StartupLevelName" type="FixedString" value=""/>
|
||||||
<attribute id="UUID" type="FixedString" value="6401e84d-daf2-416d-adeb-99c03a2487a6"/>
|
<attribute id="UUID" type="FixedString" value="6401e84d-daf2-416d-adeb-99c03a2487a6"/>
|
||||||
<attribute id="Version64" type="int64" value="281477124194306"/>
|
<attribute id="Version64" type="int64" value="281477124194307"/>
|
||||||
<children>
|
<children>
|
||||||
<node id="PublishVersion">
|
<node id="PublishVersion">
|
||||||
<attribute id="Version64" type="int64" value="281477124194304"/>
|
<attribute id="Version64" type="int64" value="281477124194304"/>
|
||||||
|
|||||||
91
scripts/sync-parent-meta.ps1
Normal file
91
scripts/sync-parent-meta.ps1
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
param(
|
||||||
|
[string]$ParentMetaUrl = "https://raw.githubusercontent.com/Yoonmoonsik/dnd55e/main/Mods/DnD2024_897914ef-5c96-053c-44af-0be823f895fe/meta.lsx",
|
||||||
|
[string]$TargetMetaPath = "Mods/DnD 5.5e AIO Russian/meta.lsx"
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
|
||||||
|
$resolvedTargetMetaPath = [System.IO.Path]::GetFullPath($TargetMetaPath)
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath $resolvedTargetMetaPath)) {
|
||||||
|
throw "Target meta.lsx was not found: '$resolvedTargetMetaPath'."
|
||||||
|
}
|
||||||
|
|
||||||
|
if ([string]::IsNullOrWhiteSpace($ParentMetaUrl)) {
|
||||||
|
throw "ParentMetaUrl must not be empty."
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$parentResponse = Invoke-WebRequest -Uri $ParentMetaUrl -UseBasicParsing -TimeoutSec 60
|
||||||
|
} catch {
|
||||||
|
throw "Failed to download parent meta.lsx from '$ParentMetaUrl': $($_.Exception.Message)"
|
||||||
|
}
|
||||||
|
|
||||||
|
$parentRaw = $parentResponse.Content
|
||||||
|
$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 downloaded from '$ParentMetaUrl'."
|
||||||
|
}
|
||||||
|
|
||||||
|
$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 meta downloaded from '$ParentMetaUrl'."
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = $node.GetAttribute("value")
|
||||||
|
if ([string]::IsNullOrWhiteSpace($value)) {
|
||||||
|
throw "Required parent ModuleInfo attribute '$field' has empty value in meta downloaded from '$ParentMetaUrl'."
|
||||||
|
}
|
||||||
|
|
||||||
|
$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 ", "))
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user