diff --git a/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md b/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md index ed167ec..3c5f398 100644 --- a/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md +++ b/.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md @@ -11847,91 +11847,414 @@ Add a gitea workflow for this project in a way that mirrors my AMZNCharTools ext _**Agent (model default, mode Agent)**_ +
Thought Process +The user wants me to add a Gitea workflow for the Dynamic-Link-Manager project, mirroring the structure from the AMZNCharTools (AmazonCharacterTools) extension they modeled the project after. I need to: + +1. Look at the AmazonCharacterTools project for its Gitea workflow(s) +2. Create similar workflow(s) in Dynamic-Link-Manager + +Let me search for Gitea workflow files in the AmazonCharacterTools project. +
--- + + --- - +
-Tool use: **glob_file_search** +Tool use: **glob_file_search** • Searched codebase "undefined" • **2** results in **1** directory -Status: **loading** +Directory: **T:\AmazonCharacterTools** (2 files) +| File | +|------| +| `../..\AmazonCharacterTools\.gitea\workflows\release.yml` | +| `../..\AmazonCharacterTools\.gitea\docker-compose.runner.yml` |
--- - +
-Tool use: **glob_file_search** +Tool use: **glob_file_search** • Searched codebase "undefined" • **2** results in **1** directory -Status: **loading** +Directory: **T:\AmazonCharacterTools** (2 files) +| File | +|------| +| `../..\AmazonCharacterTools\.gitea\workflows\release.yml` | +| `../..\AmazonCharacterTools\.gitea\docker-compose.runner.yml` |
--- +
Thought Process +Found the Gitea workflow and docker-compose in AmazonCharacterTools. Let me read those files and also check if Dynamic-Link-Manager has any .gitea folder yet. +
--- + + --- - -
-Tool use: **read_file_v2** - -Status: **loading** - + +
Tool use: **read_file_v2** • Read file: T:\AmazonCharacterTools\.gitea\workflows\release.yml
--- - -
-Tool use: **read_file_v2** - -Status: **loading** - + +
Tool use: **read_file_v2** • Read file: T:\AmazonCharacterTools\.gitea\docker-compose.runner.yml
--- - +
-Tool use: **glob_file_search** - -Status: **loading** +Tool use: **glob_file_search** • Searched codebase "undefined" • **0** result in **1** directory +Directory: **T:\Dynamic-Link-Manager** (0 file)
--- - -
-Tool use: **read_file_v2** - -Status: **loading** - + +
Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\blender_manifest.toml
--- + +
Tool use: **read_file_v2** • Read file: T:\AmazonCharacterTools\blender_manifest.toml + +
+
+ +--- + +
Thought Process + +I have what I need. The AmazonCharacterTools has: +1. `.gitea/workflows/release.yml` - A workflow that: + - Triggers on workflow_dispatch with input release_tag + - Gets version from blender_manifest.toml using Python/tomllib + - Creates a zip with addon dir name "amzncharactertools" and copies __init__.py, blender_manifest.toml, ops, ui, utils + - Creates a release via API and uploads the zip as asset + +2. `.gitea/docker-compose.runner.yml` - Runner config (user-specific, with tokens/paths) - I should NOT copy this verbatim; it's environment-specific. I could add a similar file but with placeholders, or skip it since the user said "workflow" and the workflow is the main thing. I'll add the workflow and optionally a docker-compose that mirrors structure but with neutral placeholders so they can duplicate and fill in. + +For Dynamic-Link-Manager: +- Addon id in manifest is "dynamiclinkmanager", name "Dynamic Link Manager" +- Structure: has ops/, ui/, and from the conversation also utils might exist. Let me check. +- Top-level: __init__.py, blender_manifest.toml (and maybe others) + +I'll create: +1. `.gitea/workflows/release.yml` - adapted for Dynamic-Link-Manager: + - Same structure (workflow_dispatch, get version from blender_manifest.toml) + - ADDON_DIR=dynamiclinkmanager (lowercase, from manifest id or typical zip name) + - zip_name=dynamiclinkmanager_${version}.zip or dynamic_link_manager_${version}.zip - the AMZN one uses amzncharactertools_version.zip so I'll use dynamiclinkmanager_version.zip + - Copy same kind of files: __init__.py, blender_manifest.toml, ops, ui, utils if present + +Let me check Dynamic-Link-Manager structure for dirs and top-level files. +
+ +--- + + +Checking Dynamic-Link-Manager layout to match the zip structure: + + +--- + + +
+Tool use: **glob_file_search** • Searched codebase "undefined" • **28** results in **1** directory + +Directory: **T:\Dynamic-Link-Manager** (28 files) + +| File | +|------| +| `../ui/preferences.py` | +| `../ops/__init__.py` | +| `../__init__.py` | +| `../ops/migrator.py` | +| `../ui/__init__.py` | +| `../utils/__init__.py` | +| `../blender_manifest.toml` | +| `../.cursorindexingignore` | +| `../ui/operators.py` | +| `../.specstory/history/2025-08-20_22-43Z-creating-a-blender-extension-for-asset-replacement.md` | +| `../ops\tweak_tools.py` | +| `../ui\properties.py` | +| `../ui/panels.py` | +| `../ui\__pycache__\properties.cpython-311.pyc` | +| `../.specstory/history/2026-02-18_23-39Z-character-migrator-workflow-integration.md` | +| `../ui\panels.py` | +| `../.specstory/.gitignore` | +| `../ui\__pycache__\operators.cpython-311.pyc` | +| `../ui\operators.py` | +| `../ui\__pycache__\panels.cpython-311.pyc` | +| `../ops\__pycache__\migrator.cpython-311.pyc` | +| `../ops\migrator.py` | +| `../.specstory\history\2026-02-19_18-53Z-blendfile-local-datablocks-analysis.md` | +| `../.specstory\.what-is-this.md` | +| `../.specstory\history\2026-02-18_23-39Z-character-migrator-workflow-integration.md` | +| `../.gitignore` | +| `../ui/properties.py` | +| `../ops/library.py` | + +
+
+ +--- + + +
Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\__init__.py + +
+
+ +--- + +
Thought Process + +Dynamic-Link-Manager has: +- __init__.py (root) +- blender_manifest.toml +- ops/ (with __init__.py, migrator.py, tweak_tools.py, library.py) +- ui/ (with __init__.py, operators.py, panels.py, properties.py, preferences.py) +- utils/ (with __init__.py) + +The addon is loaded by Blender with a module name - from the manifest, id = "dynamiclinkmanager". The folder name when installed is often the repo name "Dynamic-Link-Manager" but for zips it's usually a single token. AMZN uses "amzncharactertools" as the folder inside the zip. For Blender extensions/addons the folder name in the zip should match what the addon expects. Looking at the manifest, `id = "dynamiclinkmanager"` - so the zip could be structured as a folder "dynamiclinkmanager" or "Dynamic-Link-Manager". The AMZN workflow uses ADDON_DIR=amzncharactertools (manifest id). So I'll use dynamiclinkmanager. + +Creating the workflow and the docker-compose. For docker-compose I'll mirror the structure but use placeholder/example values so the user can duplicate and configure (or I'll use generic names like "dlm-runner" and leave tokens/paths as placeholders). +
+ +--- + + +Adding `.gitea/workflows/release.yml` and `.gitea/docker-compose.runner.yml` to mirror AmazonCharacterTools. + + +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\.gitea\workflows\release.yml + +
+ +
+ +--- + + +
Tool use: **read_file_v2** • Read file: T:\AmazonCharacterTools\.gitea\docker-compose.runner.yml + +
+
+ +--- + +
Thought Process + +I'll add a docker-compose.runner.yml that mirrors the structure but is clearly for Dynamic-Link-Manager (different runner name, placeholder token). The user can reuse the same runner for multiple repos or duplicate and change the token/name. I'll use placeholder token and a distinct runner name so it doesn't conflict with the AMZN one if they want a separate runner. +
+ +--- + + + + + +--- + + + +
Tool use: **edit_file_v2** • Edit file: T:\Dynamic-Link-Manager\.gitea\docker-compose.runner.yml + +
+ +
+ +--- + +
Thought Process + +Done. I've added: +1. `.gitea/workflows/release.yml` - mirrors AMZNCharTools release workflow, adapted for Dynamic-Link-Manager (version from blender_manifest.toml, zip name dynamiclinkmanager_.zip, ADDON_DIR=dynamiclinkmanager, same ops/ui/utils copy pattern). +2. `.gitea/docker-compose.runner.yml` - mirrors the runner compose file with container name gitea-act-runner-dlm, runner name dlm-runner, and placeholder token so they can register a runner for this repo (or reuse the same runner as AMZN if they prefer). + +No need to run linters on YAML. I'll summarize for the user. +
+ +--- + + +Summary of what was added to mirror your AMZNCharacterTools setup: + +**1. `.gitea/workflows/release.yml`** +- **Trigger:** `workflow_dispatch` with input `release_tag` (e.g. `v0.3.0`). +- **Version:** Read from `blender_manifest.toml` via Python/tomllib; outputs `version` and `zip_name=dynamiclinkmanager_.zip`. +- **ZIP layout:** Top-level `__init__.py` and `blender_manifest.toml`, plus `ops/`, `ui/`, and `utils/` (if present), all under a single folder `dynamiclinkmanager` (manifest `id`). +- **Release:** Creates a draft release for the given tag and uploads the zip as an asset using `GITEA_TOKEN`. + +**2. `.gitea/docker-compose.runner.yml`** +- Same layout as AMZN’s runner compose. +- `container_name`: `gitea-act-runner-dlm`, `GITEA_RUNNER_NAME`: `dlm-runner`. +- `GITEA_RUNNER_REGISTRATION_TOKEN` is set to ``; replace with the token from **Repository → Settings → Actions → Runners → New Runner** (or point the repo at your existing `amzn-tools-runner` and skip this file). + +If you already use one Gitea Actions runner for all repos, you can ignore the docker-compose file and only use the workflow; it uses `runs-on: ubuntu-latest`, which works with a standard runner. + +--- + +_**User**_ + +bump version to 0.1.0 and update the changelog to concisely summarize the last 9 commits. + +--- + +_**Agent (model default, mode Agent)**_ + +
Thought Process + +The user wants me to: +1. Bump version to 0.1.0 in the project (likely blender_manifest.toml) +2. Update the changelog to concisely summarize the last 9 commits + +I need to: +1. Find where version is defined (blender_manifest.toml) +2. Find the changelog file (CHANGELOG.md or similar) +3. Get the last 9 commits from git +4. Update version and write changelog entries +
+ +--- + + + + + +--- + + +
Tool use: **read_file_v2** • Read file: T:\Dynamic-Link-Manager\blender_manifest.toml + +
+
+ +--- + + +
+Tool use: **glob_file_search** • Searched codebase "undefined" • **0** result in **1** directory + +Directory: **T:\Dynamic-Link-Manager** (0 file) + +
+
+ +--- + + +
Tool use: **run_terminal_command_v2** • Run command: cd /d T:\Dynamic-Link-Manager && git log -9 --oneline + +```bash +cd /d T:\Dynamic-Link-Manager && git log -9 --oneline +``` + +``` +Set-Location: C:\Users\Nathan\AppData\Local\Temp\ps-script-24013b75-b893-4570-9bbb-ef187ab3e60b.ps1:7 +Line | + 7 | cd /d T:\Dynamic-Link-Manager && git log -9 --oneline + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + | A positional parameter cannot be found that accepts argument 'T:\Dynamic-Link-Manager'. + +``` +
+
+ +--- + +
Thought Process + +PowerShell doesn't use `cd /d`. I need to use Set-Location or cd without /d. Also there's no CHANGELOG file - I'll need to create one. Let me get the git log with a proper PowerShell command. +
+ +--- + + + + + +--- + + +
Tool use: **run_terminal_command_v2** • Run command: Set-Location T:\Dynamic-Link-Manager; git log -9 --oneline + +```bash +Set-Location T:\Dynamic-Link-Manager; git log -9 --oneline +``` + +``` +6d9fb0f gitea composer +1f28932 MigNLA action slot behavior and reports +ae38056 refactor operator labels and document operators +55afba3 NLAMig AnimLayers feature +a3868e1 tweak tools (untested for now) +4dee5cb fix BBod Shapekeys liboverride and copy values +4b6a351 truncate names +4d5706d specify icons +7642ff5 redefine and fix migrate basebody shapkeys + +``` +
+
+ +--- + + +
Tool use: **run_terminal_command_v2** • Run command: Set-Location T:\Dynamic-Link-Manager; git log -9 --format="%s" + +```bash +Set-Location T:\Dynamic-Link-Manager; git log -9 --format="%s" +``` + +``` +gitea composer +MigNLA action slot behavior and reports +refactor operator labels and document operators +NLAMig AnimLayers feature +tweak tools (untested for now) +fix BBod Shapekeys liboverride and copy values +truncate names +specify icons +redefine and fix migrate basebody shapkeys + +``` +
+
+ +--- + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0b5d6ff --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,19 @@ +# Changelog + +## [0.1.0] - 2026-02-19 + +### Added +- Gitea release workflow and runner docker-compose. +- Tweak tools subsection: add/remove/bake constraints for arms, legs, and both; track name and post-clean options. +- MigNLA: when no NLA, copy active action and action slot (incl. last_slot_identifier, blend/extrapolation/influence); debug logging for slot migration. +- NLAMig: AnimLayers support (mirror `als.turn_on`), strip timing and properties; active-action-only path when no NLA tracks. +- Operator icons (CopyAttr, MigNLA, CustProps, BoneConst, RetargRelatives, MigBBodyShapeKeys, pickers, tweak ops). +- BaseBody shapekeys step: prefer original base body’s shape-key action slot; library override + editable; copy shape key values. + +### Changed +- Operator labels refactored to canonical short names (CopyAttr, MigNLA, MigCustProps, etc.) with `bl_description` on all UI operators. +- Migrate BaseBody shapekeys redefined: find base body in hierarchy, override mesh/key data when linked, then apply shape-key action. +- Button labels truncated (e.g. “NLA”, “BaseBody ShapeKeys”). + +### Fixed +- BaseBody shapekeys: lib override creation and value copy; correct original-base-body lookup and slot assignment. diff --git a/blender_manifest.toml b/blender_manifest.toml index f13cbc2..25eb737 100644 --- a/blender_manifest.toml +++ b/blender_manifest.toml @@ -3,7 +3,7 @@ schema_version = "1.0.0" id = "dynamiclinkmanager" name = "Dynamic Link Manager" tagline = "Character migrator and linked library tools" -version = "0.0.2" +version = "0.1.0" type = "add-on" # Optional: Semantic Versioning