26 Commits

Author SHA1 Message Date
7f8f09a3ac Исправлен set-version: обновление только ModuleInfo.Version64 и сужены правила в AGENTS
All checks were successful
Build Mod Package / build (push) Successful in 9s
2026-04-09 08:47:39 +03:00
70f93c3d29 Обновлен перевод russian.xml по upstream: добавлены новые строки и синхронизирована Метка охотника
All checks were successful
Build Mod Package / build (push) Successful in 10s
2026-04-09 08:33:59 +03:00
4aa2e136b2 Уточнить поведение при отсутствии совпадения action 2026-04-09 08:26:40 +03:00
3ae30a5263 Добавить и оптимизировать внутренний ранбук ACTIONS.md 2026-04-09 08:15:43 +03:00
4da26911fe Уточнить политику веток: предлагать ветку в начале и MR/merge в конце 2026-04-09 07:53:33 +03:00
df1daee6ab Перенести комментарий о CI-особенности Divine в build.ps1 2026-04-09 07:49:11 +03:00
9d1a26c8e0 Сжать AGENTS.md и убрать дубли правил публикации 2026-04-09 07:46:53 +03:00
8a4970742c Упростить правила публикации и обновлять только ModuleInfo/Version64 2026-04-09 07:37:55 +03:00
b50a6a2f95 Зафиксировать изменения meta.lsx из BG3 Toolkit и правило релизного тега
All checks were successful
Build Mod Package / build (push) Successful in 2s
2026-04-09 07:29:24 +03:00
4646b51459 Подготовить версию v0.2.1 в meta.lsx
All checks were successful
Build Mod Package / build (push) Successful in 3s
2026-04-09 07:03:15 +03:00
a72b7bc1e1 Добавить скрипт обновления версии meta.lsx перед выпуском 2026-04-09 07:00:35 +03:00
7aca648396 Добавить правило про ссылки на архивы релизов
All checks were successful
Build Mod Package / build (push) Successful in 4s
2026-04-08 23:48:58 +03:00
36129b15d1 Дополнить русскую локализацию по оригинальному english.xml
All checks were successful
Build Mod Package / build (push) Successful in 4s
2026-04-08 23:43:31 +03:00
97ca95ba16 Исправлена кодировка описания мода
All checks were successful
Build Mod Package / build (push) Successful in 15s
2026-04-08 23:23:49 +03:00
ad129e15d5 chore: add metadata.lsf for DnD 5.5e AIO Russian mod GUI 2026-04-08 23:19:00 +03:00
c8371a3fec Обновлена локализация по глоссарию, дополнены черты происхождения и добавлен логотип публикации
All checks were successful
Build Mod Package / build (push) Successful in 55s
2026-04-08 22:20:13 +03:00
321fef2f63 Уточнены ориентиры для перевода в AGENTS.md 2026-04-08 22:06:59 +03:00
eb9ba5eefa Добавлен перевод новых строк локализации для голиафа и стрелка
All checks were successful
Build Mod Package / build (push) Successful in 30s
2026-04-08 21:52:36 +03:00
c0524832d0 Добавлен BOM для meta.lsx в сборке и уточнён перевод " Расщепление разума\
All checks were successful
Build Mod Package / build (push) Successful in 35s
2026-04-08 21:31:40 +03:00
e78610c702 Update Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml
All checks were successful
Build Mod Package / build (push) Successful in 28s
2026-04-08 21:17:13 +03:00
5c0a44a71e Update Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml
All checks were successful
Build Mod Package / build (push) Successful in 49s
2026-04-08 21:16:39 +03:00
c859ddc50c Update Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml 2026-04-08 21:16:20 +03:00
5f3ca9ae0d Update Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml 2026-04-08 21:14:33 +03:00
782879d73e Update Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml
All checks were successful
Build Mod Package / build (push) Successful in 46s
2026-04-08 21:12:06 +03:00
d5cd0300da revert 85a7ec546c
revert Исправлен перевод CSV и обновлены правила коммита
2026-04-08 20:40:54 +03:00
85a7ec546c Исправлен перевод CSV и обновлены правила коммита 2026-04-08 20:37:02 +03:00
9 changed files with 682 additions and 366 deletions

67
ACTIONS.md Normal file
View File

@@ -0,0 +1,67 @@
# ACTIONS.md
VERSION: 2
MODE: machine-first
LANG: ru
ROUTING:
- match_user_request_to_action_id: true
- if_match: propose_action
- if_no_match: ignore_actions_md
- if_no_match_user_message: none
PROPOSE_RULE:
- prompt_template: "Приступить к выполнению '{action_id}'?"
- require_user_confirmation: true
- execute_without_confirmation: false
EXECUTION_BASELINE:
- enforce_agents_md: true
- minimal_non_breaking_changes: true
- steps_count_range: [3, 7]
- before_commit_push: request_user_approval
REPORT_FORMAT:
- done
- changed_files
- checks
- remaining
ACTIONS:
translation:update:
intent: sync_ru_translation_with_upstream
inputs:
- Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml
- glossary/glossary.normalized.json
- AGENTS.md::Canonical Paths::Upstream English reference
plan:
- compare_en_vs_ru_by_keys
- classify_diff_into_new_changed_stale_candidate
- update_ru_for_new_and_changed_using_glossary
- validate_xml_structure_and_service_attributes
- prepare_delta_summary_counts
checks:
- xml_valid
- glossary_consistency
- scope_limited_to_localization_and_allowed_metadata
outputs:
- Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml
- optional: Mods/DnD 5.5e AIO Russian/meta.lsx (release-only)
action:report:
intent: unified_task_report
inputs:
- task_context
- modified_files
- verification_results
plan:
- summarize_done
- list_changed_files
- list_checks
- list_remaining
checks:
- concise
- factual
- no_unverified_claims
outputs:
- final_user_report

198
AGENTS.md
View File

@@ -1,153 +1,73 @@
# AGENTS.md
## Project Overview
This repository contains a standalone Russian localization mod for **Baldur's Gate 3**:
- Mod name: `DnD 5.5e All-in-One BEYOND Russian Localization`
- Mod folder: `Mods/DnD 5.5e AIO Russian`
- Base/original mod dependency: `DnD 5.5e All-in-One BEYOND`
- Original mod repository: `https://github.com/Yoonmoonsik/dnd55e`
- Original dependency UUID: `897914ef-5c96-053c-44af-0be823f895fe`
This repository is for the localization mod only. It must not gain gameplay logic, Script Extender files, or unrelated assets.
## Repository Rules
- Keep the repository source-only.
- Do not commit `.pak` artifacts.
- Do not commit temporary build outputs.
- Do not add gameplay or script content unrelated to localization/release packaging.
- Keep the localization folder and metadata consistent with the packaged mod.
## Current Important Paths
## Scope (MUST)
- Repository purpose: standalone Russian localization mod only.
- Allowed domain: localization content + packaging/release metadata.
- Forbidden: gameplay logic, Script Extender content, unrelated assets.
- Keep repository source-only.
- Never commit `.pak` or temporary build artifacts.
## Canonical Paths (MUST)
- Mod sources: `Mods/DnD 5.5e AIO Russian`
- Localization XML: `Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml`
- Glossary: `glossary/glossary.normalized.json`
- Russian localization: `Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml`
- Mod metadata: `Mods/DnD 5.5e AIO Russian/meta.lsx`
- Build script (single source of build truth): `scripts/build.ps1`
- CI workflow: `.gitea/workflows/build.yml`
- Main build script: `scripts/build.ps1`
## Build And Release Model
The authoritative build logic lives in:
- `scripts/build.ps1`
The Gitea workflow should stay thin and only:
1. prepare the workspace
2. download `Divine`
3. call `scripts/build.ps1`
4. publish the release zip for tag builds
### Current Build Outputs
The build script produces:
- `build/DnD 5.5e AIO Russian.pak`
- `build/info.json`
- `build/DnD 5.5e AIO Russian <tag>.zip` for tagged builds
The release zip is expected to contain:
- the built `.pak`
- `info.json`
## Packaging Notes
The package must contain only the BG3 mod structure under `Mods/...`.
Verified expected extracted `.pak` structure:
- Glossary (primary terminology reference): `glossary/glossary.normalized.json`
- 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`
## Packaging Invariants (MUST)
- `.pak` must contain only BG3 mod structure under `Mods/...`.
- Required content in `.pak`:
- `Mods/DnD 5.5e AIO Russian/meta.lsx`
- `Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml`
- 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.
Do not allow `.git`, `.gitea`, `scripts`, `tools`, `.tools`, `build`, or staging directories into the `.pak`.
## Build/CI Contract (MUST)
- CI workflow stays thin:
1. prepare workspace
2. download Divine
3. call `scripts/build.ps1`
4. publish tag archive
- Expected build outputs:
- `build/DnD 5.5e AIO Russian.pak`
- `build/info.json`
- `build/DnD 5.5e AIO Russian <tag>.zip` (for tag builds)
- Release ZIP must include only `.pak` + `info.json`.
- CI triggers: tag `v*` and manual dispatch; not every push to `main`.
## Important Packaging Behavior
## Version/Release Rules (MUST)
- 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.
- Release tag must match the source-of-truth version.
- Decision logic before tagging:
1. If `ModuleInfo/Version64` was manually changed (e.g. BG3 Toolkit), use matching tag and release.
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`.
There is a runner-specific packaging quirk:
## info.json Contract (MUST)
- Top-level keys: `Mods`, `MD5`.
- Per-mod keys: `Author`, `Name`, `Folder`, `Version`, `Description`, `UUID`, `Created`, `Dependencies`, `Group`.
- `Dependencies` is an array of UUIDs.
- Current dependency UUID: `897914ef-5c96-053c-44af-0be823f895fe`.
- `Divine` can produce a broken 48-byte `.pak` on the CI runner depending on the source path.
- Current mitigation is implemented in `scripts/build.ps1`.
- The script uses staged sources and fallback packaging attempts.
- Staging is performed in `%TEMP%`, not in a dot-prefixed directory inside the repo.
## Git Collaboration Policy (MUST)
- 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 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.
- For released versions in user-facing messages: provide direct archive link when derivable (acceptable immediately after tag push, even before CI finishes).
- Never auto-commit/auto-push without explicit user approval.
If packaging breaks again, debug the source path and unpack the resulting `.pak` locally to verify actual contents.
## Versioning
Version displayed by BG3ModManager should be derived from the release tag.
Current behavior:
- `scripts/build.ps1` derives `Version64` from tags like `v0.1.0`
- the computed version is written into:
- generated `info.json`
- staged `meta.lsx` before packaging
Do not manually hardcode release versions in the committed `meta.lsx` for each release if CI can derive them from tags.
## info.json Expectations
`info.json` is generated during build and should remain aligned with BG3/BG3ModManager expectations.
Current expected shape:
- top-level `Mods`
- top-level `MD5`
- per-mod fields:
- `Author`
- `Name`
- `Folder`
- `Version`
- `Description`
- `UUID`
- `Created`
- `Dependencies`
- `Group`
Current dependency model:
- `Dependencies` is an array of dependency UUIDs
- current dependency UUID:
- `897914ef-5c96-053c-44af-0be823f895fe`
## CI Trigger Policy
Current workflow policy:
- run on tags `v*`
- run on manual dispatch
- do not run on every push to `main`
## Git / Collaboration Preferences
User preference:
- after making changes, ask for permission before committing
- if the user approves, commit and push immediately
- for significant changes, propose moving work into a separate branch
- feature/fix branches must use the prefix `feat/` or `fix/`
- after finishing work in a `feat/` or `fix/` branch, propose merging it back into `main`
- comments and commit messages should be written in Russian
- commit messages should describe what was done, not what should be done
- if changes affect files that go into the final `.pak`, or change the build/release process, propose releasing the next version
- if push fails, retry up to two more times with a 3-second pause between attempts
Do not auto-commit or auto-push without explicit user approval.
## Cleanup Expectations
Temporary directories and debug artifacts should not remain in the repository.
Ignored paths currently include:
- `build/`
- `build-stage*`
- `.tools/`
- `*.pak`
If local debugging creates additional temporary folders, remove them when done unless the user explicitly wants to keep them.
## Cleanup (MUST)
- Do not leave temporary/debug artifacts in repo.
- Ignored/temp patterns include: `build/`, `build-stage*`, `.tools/`, `*.pak`.
- Remove additional debug/temp dirs unless user asked to keep them.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -4,37 +4,70 @@
<region id="Config">
<node id="root">
<children>
<node id="Conflicts"/>
<node id="Dependencies">
<children>
<node id="ModuleShortDesc">
<attribute id="Folder" type="LSString" value=""/>
<attribute id="MD5" type="LSString" value=""/>
<attribute id="Folder" type="LSString" value="DnD2024_897914ef-5c96-053c-44af-0be823f895fe"/>
<attribute id="MD5" type="LSString" value="4bd42ca93f895d1ec521a286bea09ef2"/>
<attribute id="Name" type="LSString" value="DnD 5.5e All-in-One BEYOND"/>
<attribute id="PublishHandle" type="uint64" value="0"/>
<attribute id="PublishHandle" type="uint64" value="4419649"/>
<attribute id="UUID" type="guid" value="897914ef-5c96-053c-44af-0be823f895fe"/>
<attribute id="Version64" type="int64" value="36028797018963968"/>
<attribute id="Version64" type="int64" value="144396675937468416"/>
</node>
</children>
</node>
<node id="ModuleInfo">
<attribute id="Author" type="LSString" value="MikhailRaw"/>
<attribute id="CharacterCreationLevelName" type="FixedString" value=""/>
<attribute id="Description" type="LSString" value="Русская локализация мода, который добавляет и обновляет контент в соответствии с правилами DnD 5.5e и другими источниками, включая предыстории, классы, таланты, расы, заклинания и многое другое. Это отдельный мод локализации и он требует установленный оригинальный мод."/>
<attribute id="Description" type="LSString" value="Русская AI локализация мода DnD 5.5e All-in-One BEYOND."/>
<attribute id="FileSize" type="uint64" value="0"/>
<attribute id="Folder" type="LSString" value="DnD 5.5e AIO Russian"/>
<attribute id="LobbyLevelName" type="FixedString" value=""/>
<attribute id="MD5" type="LSString" value=""/>
<attribute id="MD5" type="LSString" value="c0a8f3412870277331306e0719fc6f77"/>
<attribute id="MenuLevelName" type="FixedString" value=""/>
<attribute id="Name" type="LSString" value="DnD 5.5e All-in-One BEYOND Russian Localization"/>
<attribute id="NumPlayers" type="uint8" value="4"/>
<attribute id="PhotoBooth" type="FixedString" value=""/>
<attribute id="PublishHandle" type="uint64" value="0"/>
<attribute id="PublishHandle" type="uint64" value="5965149"/>
<attribute id="StartupLevelName" type="FixedString" value=""/>
<attribute id="UUID" type="FixedString" value="6401e84d-daf2-416d-adeb-99c03a2487a6"/>
<attribute id="Version64" type="int64" value="36028797018963968"/>
<attribute id="Version64" type="int64" value="281477124194306"/>
<children>
<node id="PublishVersion">
<attribute id="Version64" type="int64" value="36028797018963968"/>
<attribute id="Version64" type="int64" value="281477124194304"/>
</node>
<node id="Scripts">
<children>
<node id="Script">
<attribute id="UUID" type="FixedString" value="1953f77d-a201-45d7-a194-9b84c34b8461"/>
<children>
<node id="Parameters">
<children>
<node id="Parameter">
<attribute id="MapKey" type="FixedString" value="HardcoreOnly"/>
<attribute id="Type" type="int32" value="1"/>
<attribute id="Value" type="LSString" value="0"/>
</node>
</children>
</node>
</children>
</node>
<node id="Script">
<attribute id="UUID" type="FixedString" value="0d6510f5-50a3-4ecd-83d8-134c9a640324"/>
<children>
<node id="Parameters">
<children>
<node id="Parameter">
<attribute id="MapKey" type="FixedString" value="HardcoreOnly"/>
<attribute id="Type" type="int32" value="1"/>
<attribute id="Value" type="LSString" value="0"/>
</node>
</children>
</node>
</children>
</node>
</children>
</node>
</children>
</node>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

View File

@@ -556,6 +556,10 @@
"Origin Feat: Alert": "Черта происхождения: Бдительный",
"Origin Feat: Magic Initiate (Cleric)": "Черта происхождения: Посвященный в магию (Жрец)",
"Origin Feat: Magic Initiate (Wizard)": "Черта происхождения: Посвященный в магию (Волшебник)",
"Origin Feat: Magic Initiate (Druid)": "Черта происхождения: Посвященный в магию (Друид)",
"Origin Feat: Healer": "Черта происхождения: Лекарь",
"Origin Feat: Lucky": "Черта происхождения: Везунчик",
"Origin Feat: Tavern Brawler": "Черта происхождения: Драчун",
"Origin Feat: Musician": "Черта происхождения: Музыкант",
"Origin Feat: Savage Attacker": "Черта происхождения: Дикий атакующий",
"Origin Feat: Skilled": "Черта происхождения: Одаренный",

View File

@@ -8,7 +8,7 @@ param(
[string]$ModName = "DnD 5.5e All-in-One BEYOND Russian Localization",
[string]$ModUuid = "6401e84d-daf2-416d-adeb-99c03a2487a6",
[string]$ModAuthor = "MikhailRaw",
[string]$ModDescription = "Russian Localization",
[string]$ModDescription = "Русская локализация мода, который добавляет и обновляет контент в соответствии с правилами DnD 5.5e и другими источниками, включая предыстории, классы, таланты, расы, заклинания и многое другое. Это отдельный мод локализации и он требует установленный оригинальный мод.",
[string]$ModVersion64 = "36028797018963968",
[string]$ModGroup = "6401e84d-daf2-416d-adeb-99c03a2487a6",
[string]$DependencyUuid = "897914ef-5c96-053c-44af-0be823f895fe",
@@ -103,7 +103,8 @@ if (-not (Test-Path -LiteralPath $stagedMetaPath)) {
$stagedMetaContent = Get-Content -LiteralPath $stagedMetaPath -Raw
$stagedMetaContent = $stagedMetaContent -replace '(<attribute id="Version64" type="int64" value=")\d+("/>)', "`${1}$resolvedVersion64`${2}"
Set-Content -LiteralPath $stagedMetaPath -Value $stagedMetaContent -Encoding utf8
$utf8Bom = New-Object System.Text.UTF8Encoding($true)
[System.IO.File]::WriteAllText($stagedMetaPath, $stagedMetaContent, $utf8Bom)
Write-Host "[build.ps1] Staged source tree:"
Get-ChildItem -Recurse $stagingPath | Select-Object FullName, Length | Format-Table -AutoSize
@@ -112,6 +113,8 @@ if (Test-Path -LiteralPath $tempPackagePath) {
Remove-Item -LiteralPath $tempPackagePath -Force
}
# CI quirk: Divine can occasionally emit a broken ~48-byte package for some source roots.
# Mitigation: try staged/mods/workspace sources and accept only outputs that look valid by size.
$packageAttempts = @(
[ordered]@{ Name = "staging-root"; Source = $stagingPath },
[ordered]@{ Name = "mods-root"; Source = $modsPath },

63
scripts/set-version.ps1 Normal file
View File

@@ -0,0 +1,63 @@
param(
[Parameter(Mandatory = $true)]
[string]$VersionTag,
[string]$MetaPath = "Mods/DnD 5.5e AIO Russian/meta.lsx"
)
$ErrorActionPreference = "Stop"
function Convert-VersionTagToVersion64 {
param(
[string]$Tag
)
$normalized = $Tag
if ($normalized.StartsWith("v")) {
$normalized = $normalized.Substring(1)
}
if ($normalized -notmatch '^\d+(\.\d+){0,3}$') {
throw "Version tag '$Tag' is invalid. Expected format: vX.Y.Z or X.Y.Z"
}
$parts = $normalized.Split(".")
$numbers = @(0, 0, 0, 0)
for ($i = 0; $i -lt $parts.Length; $i++) {
$numbers[$i] = [int]$parts[$i]
}
return ([int64]$numbers[0] -shl 55) -bor ([int64]$numbers[1] -shl 47) -bor ([int64]$numbers[2] -shl 31) -bor [int64]$numbers[3]
}
$resolvedMetaPath = [System.IO.Path]::GetFullPath($MetaPath)
if (-not (Test-Path -LiteralPath $resolvedMetaPath)) {
throw "meta.lsx was not found: '$resolvedMetaPath'."
}
$resolvedVersion64 = Convert-VersionTagToVersion64 -Tag $VersionTag
$metaContent = Get-Content -LiteralPath $resolvedMetaPath -Raw
[xml]$metaXml = $metaContent
# Explicitly target ModuleInfo/Version64 via XML path to avoid touching Dependencies/PublishVersion.
$moduleInfoVersionNode = $metaXml.SelectSingleNode('/save/region/node/children/node[@id="ModuleInfo"]/attribute[@id="Version64" and @type="int64"]')
if ($null -eq $moduleInfoVersionNode) {
throw "ModuleInfo/Version64 attribute was not found in '$resolvedMetaPath'."
}
# Replace only the Version64 attribute that appears inside ModuleInfo before its <children> block.
$moduleInfoVersionPattern = '(?s)(<node id="ModuleInfo">\s*(?:(?!<children>).)*?<attribute id="Version64" type="int64" value=")\d+("/>)'
if ($metaContent -notmatch $moduleInfoVersionPattern) {
throw "ModuleInfo/Version64 attribute was not found in '$resolvedMetaPath'."
}
$updatedMeta = [regex]::Replace(
$metaContent,
$moduleInfoVersionPattern,
"`${1}$resolvedVersion64`${2}",
1
)
$utf8Bom = New-Object System.Text.UTF8Encoding($true)
[System.IO.File]::WriteAllText($resolvedMetaPath, $updatedMeta, $utf8Bom)
Write-Host "[set-version.ps1] Updated '$resolvedMetaPath' to Version64=$resolvedVersion64 (from tag '$VersionTag')."