Skip to content

Commit cb3488e

Browse files
TMHSDigitalclaude
andcommitted
feat: uv-and-mesh-attributes skill for the UV, tangent and attribute examples
Six examples (uv-layer-grid, lightmap-uv-channel, triangulate-tangents, color-attribute-wheel, shape-key-blend, vertex-weight-limit) were credited to mesh-editing-and-bmesh, whose prose had no section on any of their contracts, so an agent had to infer them from example scripts. The new skill states each contract those examples measured: the calc_uvs=True no-op, the lightmap channel's active/active_render flags, re-fetching layers by name after calc_tangents (the 4.5 dangling-handle read and segfault), tangents and n-gons, CORNER vs POINT color domains, shape keys and four-influence weights with renormalizing. The six examples now map to it as well. Its high-level block is smoke-run (ratchet floor 14 -> 15). Live-run proven: it PASSES on Blender 5.2.1 LTS and 4.5.14 LTS via run_content.py. Closes #533 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LpkeXRvikhJZSVGBFM91Dv Signed-off-by: TM Hospitality Strategies <TMHospitalityStrategies@gmail.com>
1 parent 6be6529 commit cb3488e

13 files changed

Lines changed: 175 additions & 22 deletions

File tree

‎.cursor-plugin/plugin.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@
4444
"skills/constraints-and-parenting/SKILL.md",
4545
"skills/images-and-pixels/SKILL.md",
4646
"skills/curves-and-text/SKILL.md",
47-
"skills/compositor-nodes/SKILL.md"
47+
"skills/compositor-nodes/SKILL.md",
48+
"skills/uv-and-mesh-attributes/SKILL.md"
4849
],
4950
"rules": [
5051
"rules/prefer-data-over-ops-in-loops.mdc",

‎AGENTS.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ a `.cursor-plugin/plugin.json` manifest so the ecosystem drift checker
2020
classifies it as a `cursor-plugin`. This is content the AI loads when the user
2121
asks Blender questions or works on Blender add-ons in Cursor or Claude Code.
2222

23-
The content base is 25 skills, 16 rules, 3 templates, 31 snippets, 66
23+
The content base is 26 skills, 16 rules, 3 templates, 31 snippets, 66
2424
examples, and 80 showcase pieces (counts are CI-enforced across README.md, the agent docs, ROADMAP.md,
2525
`site.json` and the site templates). The full inventory tables and per-item purposes live in
2626
`CLAUDE.md`. Example anatomy and authoring rules: copy `examples/bmesh-gear/`;
@@ -32,7 +32,7 @@ in `docs/VISUAL-STYLE.md`; the canonical run prompt is
3232

3333
```
3434
Blender-Developer-Tools/
35-
skills/<skill-name>/SKILL.md # 25 skill files
35+
skills/<skill-name>/SKILL.md # 26 skill files
3636
rules/<rule-name>.mdc # 16 rule files
3737
templates/<template-name>/ # 3 starter templates
3838
snippets/<snippet-name>.py # 31 standalone Python snippets

‎CLAUDE.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ The **Blender Developer Tools** repository is at **v0.158.0**. It packages skill
1717
## Repository Architecture
1818

1919
```
20-
skills/<skill-name>/SKILL.md - AI workflow definitions, 25 total
20+
skills/<skill-name>/SKILL.md - AI workflow definitions, 26 total
2121
rules/<rule-name>.mdc - Anti-pattern rules, 16 total
2222
templates/<template-name>/ - Starter projects, 3 total
2323
snippets/<snippet-name>.py - Standalone code patterns, 31 total
@@ -30,7 +30,7 @@ docs/gallery/ - Committed generated gallery pages + hero render
3030
VERSION - Source of truth for the repo version
3131
```
3232

33-
## Skills (25)
33+
## Skills (26)
3434

3535
| Skill | Purpose |
3636
| --- | --- |
@@ -59,6 +59,7 @@ VERSION - Source of truth for the repo version
5959
| images-and-pixels | `Image.pixels` layout and bulk `foreach_*`, byte vs float buffers, colorspace, `save()` vs `save_render()`, PNG vs EXR alpha |
6060
| curves-and-text | Curve and TextCurve datablocks: splines, bevel/extrude closed forms, `body`, Bfont, evaluated mesh read-back |
6161
| compositor-nodes | 4.5 `scene.node_tree` vs 5.x `scene.compositing_node_group`, Glare node enum-to-menu-socket change, `use_compositing` |
62+
| uv-and-mesh-attributes | UV layers (`calc_uvs=True` no-op without a layer), lightmap channel `active` / `active_render`, re-fetch layers by name after `calc_tangents`, color-attribute domains, shape keys, four-influence skin weights |
6263

6364
## Rules (16)
6465

‎CONTRIBUTING.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ The drift-check workflow enforces these on every push and PR.
329329

330330
## Aggregate Counts
331331

332-
`README.md` declares aggregate counts (e.g. "25 skills, 16 rules, 3 templates, 31 snippets, 69 examples, and 80 showcase pieces"). The `validate-counts` job in `.github/workflows/validate.yml` enforces these substrings against the filesystem on every push and PR. Showcase pieces are counted separately from examples. When you add or remove content, update the README counts in the same commit.
332+
`README.md` declares aggregate counts (e.g. "26 skills, 16 rules, 3 templates, 31 snippets, 69 examples, and 80 showcase pieces"). The `validate-counts` job in `.github/workflows/validate.yml` enforces these substrings against the filesystem on every push and PR. Showcase pieces are counted separately from examples. When you add or remove content, update the README counts in the same commit.
333333

334334
## Pull Request Process
335335

‎README.md‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
</p>
2626

2727
<p align="center">
28-
<strong>25 skills</strong> &nbsp;&bull;&nbsp; <strong>16 rules</strong> &nbsp;&bull;&nbsp; <strong>3 templates</strong> &nbsp;&bull;&nbsp; <strong>31 snippets</strong> &nbsp;&bull;&nbsp; <strong>69 examples</strong> &nbsp;&bull;&nbsp; <strong>80 showcase pieces</strong>
28+
<strong>26 skills</strong> &nbsp;&bull;&nbsp; <strong>16 rules</strong> &nbsp;&bull;&nbsp; <strong>3 templates</strong> &nbsp;&bull;&nbsp; <strong>31 snippets</strong> &nbsp;&bull;&nbsp; <strong>69 examples</strong> &nbsp;&bull;&nbsp; <strong>80 showcase pieces</strong>
2929
</p>
3030

3131
<p align="center">
@@ -44,13 +44,13 @@
4444

4545
## Overview
4646

47-
This repository ships **25 skills, 16 rules, 3 templates, 31 snippets, 69 examples, and 80 showcase pieces** for Blender Python development targeting Blender 5.2 LTS (current stable) with Blender 4.5 LTS fallback support. Blender 5.1 is prior stable.
47+
This repository ships **26 skills, 16 rules, 3 templates, 31 snippets, 69 examples, and 80 showcase pieces** for Blender Python development targeting Blender 5.2 LTS (current stable) with Blender 4.5 LTS fallback support. Blender 5.1 is prior stable.
4848

4949
The content is consumed by AI coding agents, installed as a plugin or read from a checkout. An optional second plugin registers the official [Blender Lab MCP server](https://www.blender.org/lab/mcp-server/) for live sessions (see [Live Blender session](#live-blender-session-mcp)); the server is referenced from upstream, not part of this repository, and nothing else depends on it. Cursor and Claude Code both install it as a plugin (see [Quick start](#quick-start)): Cursor loads the skills and applies `rules/*.mdc` wherever their scope globs match; Claude Code loads the skills and gets the rules through a generated `blender-rules` skill, since it does not read Cursor `.mdc` files. An agent picks a skill up when its description matches the task. Any agent that can read files in a workspace can use it the same way. There is no build step for the content — edit the Markdown and Python files directly.
5050

5151
| Layer | Role |
5252
| --- | --- |
53-
| **Skills** | Guided workflows: scaffolding, operators, panels, properties, mesh and bmesh, headless batch, slotted actions, geometry nodes, procedural materials, depsgraph queries, drivers and handlers, `bl_info` migration, video sequencer, imported-mesh cleanup, high-to-low baking, engine export presets, extension runtime and packaging, timers, modal operators and threading, GPU drawing and viewport overlays, porting add-ons to Blender 5, Grease Pencil v3, constraints and parenting, images and pixels, curves and text, compositor nodes |
53+
| **Skills** | Guided workflows: scaffolding, operators, panels, properties, mesh and bmesh, headless batch, slotted actions, geometry nodes, procedural materials, depsgraph queries, drivers and handlers, `bl_info` migration, video sequencer, imported-mesh cleanup, high-to-low baking, engine export presets, extension runtime and packaging, timers, modal operators and threading, GPU drawing and viewport overlays, porting add-ons to Blender 5, Grease Pencil v3, constraints and parenting, images and pixels, curves and text, compositor nodes, UV layers and mesh attributes |
5454
| **Rules** | Guardrails for the most common AI mistakes: ops-in-loops, bmesh leaks, legacy `bl_info` only, prop assignments, deprecated context-copy override, per-element loops over bulk mesh data, import without scale check, export without evaluated geometry, mixed glTF/FBX axis RNA, and the 5.x breaks: `bgl`, the pre-4.1 normals API, `sequence_editor.sequences`, `action.fcurves`, 3.x Principled socket names, NodesModifier ID-property inputs, the EEVEE engine id |
5555
| **Templates** | A working Extensions Platform add-on starter, a headless batch script starter, and a GLB-in engine-ready asset pipeline |
5656
| **Snippets** | 31 small standalone Python files demonstrating canonical patterns, 5 to 75 lines each |
@@ -61,14 +61,14 @@ The content is consumed by AI coding agents, installed as a plugin or read from
6161

6262
Neither agent needs a clone of `main`: both install the slim `plugin-dist` build. Clone the full repository only to [run the examples or contribute](#run-the-examples-or-contribute).
6363

64-
- **Cursor** — install it as a local plugin from the slim `plugin-dist` branch, then run **Developer: Reload Window**. **Customize** lists the 25 skills and 16 rules; the rules apply by glob scope and the agent loads a skill when its description matches the task.
64+
- **Cursor** — install it as a local plugin from the slim `plugin-dist` branch, then run **Developer: Reload Window**. **Customize** lists the 26 skills and 16 rules; the rules apply by glob scope and the agent loads a skill when its description matches the task.
6565

6666
```bash
6767
git clone --branch plugin-dist --single-branch https://github.com/TMHSDigital/Blender-Developer-Tools.git ~/.cursor/plugins/local/blender-developer-tools
6868
```
6969

7070
(On Windows the folder is `%USERPROFILE%\.cursor\plugins\local\`. Cursor skips symlinks that point outside that folder, so clone or copy rather than link.) Teams can import the repository as a team marketplace instead; it carries `.cursor-plugin/marketplace.json`. The plugin already applies the rules, so there is nothing to copy. Only to scope the pack to one project without the plugin, copy `skills/*` into that project's `.cursor/skills/` and `rules/*.mdc` into `.cursor/rules/` from a checkout; copying only the rules gives you no skills.
71-
- **Claude Code** — install as a plugin, then run `/skills` to see all 25 skills plus `blender-rules`:
71+
- **Claude Code** — install as a plugin, then run `/skills` to see all 26 skills plus `blender-rules`:
7272

7373
```text
7474
/plugin marketplace add TMHSDigital/Blender-Developer-Tools@plugin-dist
@@ -197,7 +197,7 @@ Browse both, with filters, full-size renders and each script's README, in the **
197197
## How content is organized
198198

199199
```
200-
skills/<name>/SKILL.md - 25 skill files, YAML frontmatter, one canonical pattern each
200+
skills/<name>/SKILL.md - 26 skill files, YAML frontmatter, one canonical pattern each
201201
rules/<name>.mdc - 16 rule files, anti-pattern + correction
202202
templates/<name>/ - 3 template directories (extension-addon-template, headless-batch-script-template, ai-asset-pipeline-template)
203203
snippets/<name>.py - 31 standalone Python snippets, 5 to 75 lines each

‎ROADMAP.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ derives the actual version from conventional-commit types.
4040
| Skills for stranded examples: Grease Pencil v3, constraints and parenting, images and pixels, curves and text, compositor nodes | 25 | 12 | 3 | 31 | Shipped |
4141
| Live-session bridge (opt-in `blender-live-session` plugin, upstream Blender Lab MCP) | - | - | - | - | Shipped |
4242
| Rules for the headline 5.x breaks: `action.fcurves`, Principled v2 socket names, NodesModifier ID-property inputs, the EEVEE engine id | 25 | 16 | 3 | 31 | Shipped |
43+
| UV layers and mesh attributes skill (lightmap channel, tangents, color attributes, shape keys, skin weights) | 26 | 16 | 3 | 31 | Shipped |
4344
| Stable (1.0) | — | — | — | — | Upcoming; criteria below |
4445

4546
## What "Stable (1.0)" means

‎examples/index.json‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@
331331
"path": "examples/color-attribute-wheel/",
332332
"script": "examples/color-attribute-wheel/color_attribute_wheel.py",
333333
"skills": [
334+
"uv-and-mesh-attributes",
334335
"mesh-editing-and-bmesh"
335336
],
336337
"render": true,
@@ -1428,6 +1429,7 @@
14281429
"path": "examples/lightmap-uv-channel/",
14291430
"script": "examples/lightmap-uv-channel/lightmap_uv_channel.py",
14301431
"skills": [
1432+
"uv-and-mesh-attributes",
14311433
"mesh-editing-and-bmesh"
14321434
],
14331435
"render": true,
@@ -1853,6 +1855,7 @@
18531855
"path": "examples/shape-key-blend/",
18541856
"script": "examples/shape-key-blend/shape_key_blend.py",
18551857
"skills": [
1858+
"uv-and-mesh-attributes",
18561859
"mesh-editing-and-bmesh"
18571860
],
18581861
"render": true,
@@ -2241,6 +2244,7 @@
22412244
"path": "examples/triangulate-tangents/",
22422245
"script": "examples/triangulate-tangents/triangulate_tangents.py",
22432246
"skills": [
2247+
"uv-and-mesh-attributes",
22442248
"mesh-editing-and-bmesh"
22452249
],
22462250
"render": true,
@@ -2380,6 +2384,7 @@
23802384
"path": "examples/uv-layer-grid/",
23812385
"script": "examples/uv-layer-grid/uv_layer_grid.py",
23822386
"skills": [
2387+
"uv-and-mesh-attributes",
23832388
"mesh-editing-and-bmesh"
23842389
],
23852390
"render": true,
@@ -2452,6 +2457,7 @@
24522457
"path": "examples/vertex-weight-limit/",
24532458
"script": "examples/vertex-weight-limit/vertex_weight_limit.py",
24542459
"skills": [
2460+
"uv-and-mesh-attributes",
24552461
"mesh-editing-and-bmesh"
24562462
],
24572463
"render": true,

‎examples/skills.json‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"car-mirror-symmetry": ["depsgraph-and-evaluated-data"],
1010
"coincident-vert-weld": ["ai-mesh-cleanup"],
1111
"collision-hull-proxy": ["ai-mesh-cleanup", "mesh-editing-and-bmesh"],
12-
"color-attribute-wheel": ["mesh-editing-and-bmesh"],
12+
"color-attribute-wheel": ["uv-and-mesh-attributes", "mesh-editing-and-bmesh"],
1313
"compositor-glare": ["compositor-nodes", "porting-to-blender-5"],
1414
"cross-version-property-delete": ["custom-properties", "porting-to-blender-5"],
1515
"curve-bevel-arc": ["curves-and-text"],
@@ -37,7 +37,7 @@
3737
"image-pixels-testcard": ["images-and-pixels"],
3838
"lattice-deform": ["depsgraph-and-evaluated-data", "mesh-editing-and-bmesh"],
3939
"light-link-studio": ["procedural-materials-and-shaders"],
40-
"lightmap-uv-channel": ["mesh-editing-and-bmesh"],
40+
"lightmap-uv-channel": ["uv-and-mesh-attributes", "mesh-editing-and-bmesh"],
4141
"lod-decimate-chain": ["ai-mesh-cleanup", "depsgraph-and-evaluated-data", "mesh-editing-and-bmesh"],
4242
"mesh-automasking-settings": ["mesh-editing-and-bmesh"],
4343
"mesh-normals-after-41": ["mesh-editing-and-bmesh", "porting-to-blender-5"],
@@ -49,7 +49,7 @@
4949
"prop-origin-transform": ["ai-mesh-cleanup", "operators"],
5050
"ray-cast-space": ["depsgraph-and-evaluated-data"],
5151
"shader-node-group": ["procedural-materials-and-shaders"],
52-
"shape-key-blend": ["mesh-editing-and-bmesh"],
52+
"shape-key-blend": ["uv-and-mesh-attributes", "mesh-editing-and-bmesh"],
5353
"sky-texture-sun-elevation": ["procedural-materials-and-shaders"],
5454
"soccer-ball-goldberg": ["depsgraph-and-evaluated-data", "mesh-editing-and-bmesh"],
5555
"socket-attach-points": ["constraints-and-parenting"],
@@ -58,13 +58,13 @@
5858
"temp-override-join": ["headless-batch-scripting", "operators"],
5959
"timers-modal-threading": ["operators", "timers-modal-and-threading"],
6060
"text-version-stamp": ["curves-and-text"],
61-
"triangulate-tangents": ["mesh-editing-and-bmesh"],
61+
"triangulate-tangents": ["uv-and-mesh-attributes", "mesh-editing-and-bmesh"],
6262
"turntable": ["slotted-actions-animation"],
6363
"unapplied-scale-gltf": ["ai-mesh-cleanup", "engine-export-presets"],
6464
"usd-export-evaluation-mode": ["depsgraph-and-evaluated-data", "headless-batch-scripting"],
65-
"uv-layer-grid": ["mesh-editing-and-bmesh"],
65+
"uv-layer-grid": ["uv-and-mesh-attributes", "mesh-editing-and-bmesh"],
6666
"vertex-color-ao": ["mesh-editing-and-bmesh"],
67-
"vertex-weight-limit": ["mesh-editing-and-bmesh"],
67+
"vertex-weight-limit": ["uv-and-mesh-attributes", "mesh-editing-and-bmesh"],
6868
"vse-cut-list": ["vse-python"],
6969
"vse-gamma-cross": ["vse-python"],
7070
"vse-linear-modifiers": ["vse-python"],

‎scripts/build_plugin_dist.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
```
7777
7878
Cursor: clone this branch into `~/.cursor/plugins/local/blender-developer-tools`
79-
and reload the window (Customize then lists the 25 skills and 16 rules).
79+
and reload the window (Customize then lists the 26 skills and 16 rules).
8080
8181
Skills reference bundled files as `${CLAUDE_PLUGIN_ROOT}/snippets/...`, which
8282
Claude Code expands to this plugin's install directory. In Cursor, read it as

‎site.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
"github": "https://github.com/TMHSDigital/Blender-Developer-Tools"
1919
},
2020
"installSteps": [
21-
"<strong>Claude Code:</strong> <code>/plugin marketplace add TMHSDigital/Blender-Developer-Tools@plugin-dist</code> then <code>/plugin install blender-developer-tools@blender-developer-tools</code>. The 25 skills load when a task matches; the rules come along as the <code>blender-rules</code> skill",
22-
"<strong>Cursor:</strong> <code>git clone --branch plugin-dist --single-branch https://github.com/TMHSDigital/Blender-Developer-Tools.git ~/.cursor/plugins/local/blender-developer-tools</code>, then reload the window; Customize lists the 25 skills and 16 rules, and the plugin applies the rules for you. This clones only the 0.3 MB plugin build, not <code>main</code>",
21+
"<strong>Claude Code:</strong> <code>/plugin marketplace add TMHSDigital/Blender-Developer-Tools@plugin-dist</code> then <code>/plugin install blender-developer-tools@blender-developer-tools</code>. The 26 skills load when a task matches; the rules come along as the <code>blender-rules</code> skill",
22+
"<strong>Cursor:</strong> <code>git clone --branch plugin-dist --single-branch https://github.com/TMHSDigital/Blender-Developer-Tools.git ~/.cursor/plugins/local/blender-developer-tools</code>, then reload the window; Customize lists the 26 skills and 16 rules, and the plugin applies the rules for you. This clones only the 0.3 MB plugin build, not <code>main</code>",
2323
"<strong>Other agents (Codex, Copilot, Windsurf):</strong> clone the same slim build (<code>git clone --branch plugin-dist --single-branch https://github.com/TMHSDigital/Blender-Developer-Tools.git</code>) and copy its <code>skills/*</code> into <code>.agents/skills/</code>, append <code>exports/AGENTS.md</code> to your project's <code>AGENTS.md</code> for the rules, and for Copilot copy <code>exports/copilot/blender-python.instructions.md</code> into <code>.github/instructions/</code>",
2424
"<strong>Optional, live session:</strong> <code>/plugin install blender-live-session@blender-developer-tools</code> adds the official Blender Lab MCP server (needs <code>uv</code> and Blender 5.1+ with its add-on) so the agent can inspect and drive your open scene, plus a skill that has it read before it mutates and prove changes headless. See the README's <a href=\"https://github.com/TMHSDigital/Blender-Developer-Tools#live-blender-session-mcp\">Live Blender session</a>",
2525
"Grab <code>snippets/</code> and <code>templates/</code> as starting points for add-ons and headless batch jobs"

0 commit comments

Comments
 (0)