Skip to content

Commit c441526

Browse files
committed
feat: initial Blender-Developer-Tools v0.1.0 release
8 skills covering Blender 5.1 Python development with 4.5 LTS fallback support: addon-scaffolding, operators, ui-panels, custom-properties, mesh-editing-and-bmesh, headless-batch-scripting, slotted-actions-animation, geometry-nodes-python. 4 rules encoding the most common AI anti-patterns: prefer-data-over-ops-in-loops, always-free-bmesh, target-extensions-platform-format, type-annotate-props-and-defend-context. 1 template (extension-addon-template) demonstrating Extensions Platform format with register_classes_factory, PointerProperty binding, and symmetric register/unregister. 10 snippets covering canonical patterns: object creation/deletion via bpy.data, depsgraph evaluated mesh, bmesh load/edit/free, temp_override context, foreach_set bulk vertex injection, register_classes_factory, PointerProperty binding, cross-version property deletion, and the slotted-actions channelbag bridge utility. Full ecosystem infrastructure: validate.yml with validate-counts job, drift-check@v1.9 consumer, release.yml using release-doc-sync@v1 with floating tag maintenance (v0, v0.1), self-healing label-sync, and dependabot github-actions coverage. standards-version markers throughout at 1.9.1. Made-with: Cursor
1 parent 702d99e commit c441526

38 files changed

Lines changed: 3913 additions & 1 deletion

.github/dependabot.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: "github-actions"
4+
directory: "/"
5+
schedule:
6+
interval: "daily"
7+
target-branch: "main"

.github/workflows/drift-check.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: Ecosystem drift check
2+
3+
on:
4+
pull_request:
5+
branches: [main]
6+
push:
7+
branches: [main]
8+
workflow_dispatch:
9+
10+
jobs:
11+
drift-check:
12+
name: Ecosystem drift check
13+
runs-on: ubuntu-latest
14+
permissions:
15+
contents: read
16+
steps:
17+
- uses: actions/checkout@v6
18+
- uses: TMHSDigital/Developer-Tools-Directory/.github/actions/drift-check@v1.9
19+
with:
20+
mode: self
21+
format: gh-summary

.github/workflows/label-sync.yml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
name: Label PRs
2+
3+
on:
4+
pull_request:
5+
types: [opened, synchronize]
6+
7+
permissions:
8+
contents: read
9+
pull-requests: write
10+
11+
jobs:
12+
label:
13+
name: Auto-label by path
14+
runs-on: ubuntu-latest
15+
steps:
16+
- uses: actions/checkout@v6
17+
18+
- name: Get changed files
19+
id: changed
20+
env:
21+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
22+
run: |
23+
FILES=$(gh pr diff ${{ github.event.pull_request.number }} --name-only)
24+
echo "files<<EOF" >> "$GITHUB_OUTPUT"
25+
echo "$FILES" >> "$GITHUB_OUTPUT"
26+
echo "EOF" >> "$GITHUB_OUTPUT"
27+
28+
- name: Apply labels
29+
env:
30+
FILES: ${{ steps.changed.outputs.files }}
31+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
32+
run: |
33+
LABELS=""
34+
35+
if echo "$FILES" | grep -q "^skills/"; then
36+
LABELS="$LABELS skills"
37+
fi
38+
39+
if echo "$FILES" | grep -q "^rules/"; then
40+
LABELS="$LABELS rules"
41+
fi
42+
43+
if echo "$FILES" | grep -q "^snippets/"; then
44+
LABELS="$LABELS snippets"
45+
fi
46+
47+
if echo "$FILES" | grep -q "^templates/"; then
48+
LABELS="$LABELS templates"
49+
fi
50+
51+
if echo "$FILES" | grep -qE "(README\.md|AGENTS\.md|CLAUDE\.md|ROADMAP\.md|CHANGELOG\.md|^docs/)"; then
52+
LABELS="$LABELS documentation"
53+
fi
54+
55+
if echo "$FILES" | grep -q "^\.github/"; then
56+
LABELS="$LABELS ci"
57+
fi
58+
59+
if [ -n "$LABELS" ]; then
60+
for label in $LABELS; do
61+
gh label create "$label" --force --color "ededed" 2>/dev/null || true
62+
gh pr edit ${{ github.event.pull_request.number }} --add-label "$label"
63+
done
64+
echo "Applied labels:$LABELS"
65+
else
66+
echo "No labels to apply"
67+
fi

.github/workflows/release.yml

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
branches: [main]
6+
paths-ignore:
7+
- ".github/**"
8+
- "docs/**"
9+
- "LICENSE"
10+
- "README.md"
11+
- "AGENTS.md"
12+
- "CLAUDE.md"
13+
- "CHANGELOG.md"
14+
- "ROADMAP.md"
15+
16+
permissions:
17+
contents: write
18+
19+
concurrency:
20+
group: release
21+
cancel-in-progress: false
22+
23+
jobs:
24+
version-and-release:
25+
name: Bump version, tag, and release
26+
runs-on: ubuntu-latest
27+
if: "!contains(github.event.head_commit.message, '[skip ci]')"
28+
steps:
29+
- uses: actions/checkout@v6
30+
with:
31+
fetch-depth: 0
32+
token: ${{ secrets.GITHUB_TOKEN }}
33+
34+
- name: Get current version
35+
id: current
36+
run: |
37+
version=$(cat VERSION | tr -d '[:space:]')
38+
echo "version=$version" >> "$GITHUB_OUTPUT"
39+
echo "Current version: $version"
40+
41+
- name: Determine bump type from commits
42+
id: bump
43+
run: |
44+
last_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
45+
if [ -z "$last_tag" ]; then
46+
commits=$(git log --oneline --format="%s")
47+
else
48+
commits=$(git log "$last_tag"..HEAD --oneline --format="%s")
49+
fi
50+
51+
echo "Commits since last release:"
52+
echo "$commits"
53+
54+
bump="patch"
55+
if echo "$commits" | grep -qiE "^(feat|feature)(\(.+\))?!:|BREAKING CHANGE"; then
56+
bump="major"
57+
elif echo "$commits" | grep -qiE "^(feat|feature)(\(.+\))?:"; then
58+
bump="minor"
59+
fi
60+
61+
echo "bump=$bump" >> "$GITHUB_OUTPUT"
62+
echo "Bump type: $bump"
63+
64+
- name: Compute new version
65+
id: new
66+
run: |
67+
current="${{ steps.current.outputs.version }}"
68+
bump="${{ steps.bump.outputs.bump }}"
69+
70+
IFS='.' read -r major minor patch <<< "$current"
71+
72+
# Initial release: VERSION already at 0.1.0 with no prior tag.
73+
# If there is no last tag and the bump type would otherwise advance
74+
# past 0.1.0, hold the version at 0.1.0 so the first release is
75+
# cut at the value that's already in VERSION.
76+
last_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
77+
if [ -z "$last_tag" ]; then
78+
new_version="$current"
79+
else
80+
case "$bump" in
81+
major) major=$((major + 1)); minor=0; patch=0 ;;
82+
minor) minor=$((minor + 1)); patch=0 ;;
83+
patch) patch=$((patch + 1)) ;;
84+
esac
85+
new_version="$major.$minor.$patch"
86+
fi
87+
88+
echo "version=$new_version" >> "$GITHUB_OUTPUT"
89+
echo "New version: $new_version"
90+
91+
- name: Check if tag already exists
92+
id: check
93+
run: |
94+
new_version="${{ steps.new.outputs.version }}"
95+
if git rev-parse "v$new_version" >/dev/null 2>&1; then
96+
echo "skip=true" >> "$GITHUB_OUTPUT"
97+
echo "Tag v$new_version already exists, skipping"
98+
else
99+
echo "skip=false" >> "$GITHUB_OUTPUT"
100+
fi
101+
102+
- name: Update VERSION file
103+
if: steps.check.outputs.skip == 'false'
104+
env:
105+
NEW_VERSION: ${{ steps.new.outputs.version }}
106+
run: |
107+
echo "$NEW_VERSION" > VERSION
108+
109+
- name: Sync release docs
110+
if: steps.check.outputs.skip == 'false'
111+
uses: TMHSDigital/Developer-Tools-Directory/.github/actions/release-doc-sync@v1
112+
with:
113+
plugin-version: ${{ steps.new.outputs.version }}
114+
previous-version: ${{ steps.current.outputs.version }}
115+
116+
- name: Commit version bump
117+
if: steps.check.outputs.skip == 'false'
118+
run: |
119+
git config user.name "github-actions[bot]"
120+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
121+
git add -A
122+
if git diff --cached --quiet; then
123+
echo "No changes to commit"
124+
else
125+
git commit -m "chore: bump version to ${{ steps.new.outputs.version }} [skip ci]"
126+
git push origin main
127+
fi
128+
129+
- name: Create and push tag
130+
if: steps.check.outputs.skip == 'false'
131+
run: |
132+
new_version="${{ steps.new.outputs.version }}"
133+
IFS='.' read -r major minor _patch <<< "$new_version"
134+
135+
git tag "v$new_version"
136+
git tag -f "v$major"
137+
git tag -f "v$major.$minor"
138+
139+
git push origin "v$new_version"
140+
git push origin "v$major" --force
141+
git push origin "v$major.$minor" --force
142+
143+
- name: Create GitHub Release
144+
if: steps.check.outputs.skip == 'false'
145+
env:
146+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
147+
run: |
148+
gh release create "v${{ steps.new.outputs.version }}" \
149+
--title "v${{ steps.new.outputs.version }}" \
150+
--generate-notes

0 commit comments

Comments
 (0)