Compare commits

..
2 Commits
Author SHA1 Message Date
ausboss 3a4ce52760 Release 2.21.1
Update release metadata and notes for the repository-hosted README badge fix.
2026-11-06 11:48:17 -06:00
ausboss e761b3dd0b Serve the release badge from the repository (#290)
Keep the release badge available from GitHub and reject stale generated badge versions during release preflight.
2026-11-05 20:28:47 -06:00
8 changed files with 74 additions and 24 deletions
+6
View File
@@ -4,6 +4,12 @@ All notable changes to ComfyUI-AusBoss are documented here.
## Unreleased
## 2.21.1 - 2026-11-06
- **The README release badge stays available when the badge service is down.**
The badge is served from the repository, shows the current version, and opens
the latest GitHub Release.
## 2.21.0 - 2026-11-05
- **Crop + Rotate + Pad has clearer controls and steadier previews.** Image
+7 -1
View File
@@ -346,11 +346,17 @@ before a release that follows a ComfyUI update.
A new `version` in `pyproject.toml` that lands on main publishes to the Comfy
Registry through the publish workflow (`.github/workflows/publish_action.yml`).
After a successful upload, the same workflow tags that commit and creates a
GitHub Release with the full changelog section. The README badge follows the
GitHub Release with the full changelog section. The README badge links to the
latest GitHub Release. If only that step fails, rerun the failed jobs to retry
it without uploading the Registry version again. Existing releases are left
unchanged on a rerun. Contributors never change `version`.
For an authorized release, update both `pyproject.toml` and
`AUSBOSS_JS_VERSION`, date the changelog section, then run
`python scripts/release_badge.py`. Preflight rejects a badge that does not
match the pack version. Its SVG lives in the repository so the release
number stays visible when an external badge service is unavailable.
The Registry shows notes with each version. They are that version's section
of `CHANGELOG.md`, one line per entry: its bold opening, and for a new node
the sentence that says what it does (`scripts/changelog_notes.py`). So open
+3 -3
View File
@@ -3,9 +3,9 @@
<p>ComfyUI nodes for image and video work.</p>
<p>
<img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="MIT License">
<!-- The publish workflow creates a GitHub Release for each version.
This badge follows it; release_preflight.py checks the source. -->
<a href="https://github.com/ausboss/ComfyUI-AusBoss/releases/latest"><img src="https://img.shields.io/github/v/release/ausboss/ComfyUI-AusBoss?label=release&color=00b4aa&style=flat-square" alt="Latest release"></a>
<!-- Generated by scripts/release_badge.py. Release preflight checks
the badge against pyproject.toml so it cannot silently go stale. -->
<a href="https://github.com/ausboss/ComfyUI-AusBoss/releases/latest"><img src="assets/readme/release.svg" alt="Latest release"></a>
<a href="https://www.youtube.com/@ausbossdev"><img src="https://img.shields.io/badge/YouTube-%40ausbossdev-00b4aa?style=flat-square&logo=youtube&logoColor=white" alt="YouTube @ausbossdev"></a>
<a href="https://discord.gg/RwVxY9Fuaj"><img src="https://img.shields.io/badge/Discord-AusBoss-00b4aa?style=flat-square&logo=discord&logoColor=white" alt="Discord: AusBoss"></a>
</p>
+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" width="105" height="20" role="img" aria-label="release: v2.21.1">
<title>release: v2.21.1</title>
<path fill="#555" d="M0 0h48v20H0z"/>
<path fill="#00b4aa" d="M48 0h57v20H48z"/>
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" font-size="11">
<text x="24" y="14">release</text>
<text x="76.5" y="14">v2.21.1</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 425 B

+1 -1
View File
@@ -9,7 +9,7 @@ import { app } from "../../../scripts/app.js";
// Must match `version` in pyproject.toml — scripts/release_preflight.py
// enforces it. The backend serves its copy at /ausboss/pack_version; a
// mismatch means the browser cached JavaScript from an older install.
export const AUSBOSS_JS_VERSION = "2.21.0";
export const AUSBOSS_JS_VERSION = "2.21.1";
export const BRAND = "#00b4aa"; // AusBoss teal — keep node accents consistent.
export const BRAND_DARK = "#007f78";
+1 -1
View File
@@ -3,7 +3,7 @@ name = "ausboss-nodes"
# Manager/registry search matches against this text, so it names the actual
# nodes instead of describing the collection abstractly.
description = "ComfyUI-AusBoss (AusBoss nodes): image and video nodes with compact controls: Image and Video Crop + Rotate + Pad (frame or clip), Load Image + Pad, Image Folder (run a workflow on a folder of pictures), Image Resize, Align Image, Image Size, Color Match, Image Compare A/B, Realign to Source (experimental), Save Image (PNG, lossless WebP/JXL, captions), Load Video, Save Video, Select Frame, Frame Interpolate, Mask Refine, Mask by Name and Mask by Touch (type a name or click a thing, get its mask), LaMa Inpaint, Crop For Inpaint, Stitch Inpaint, Tiled Upscale and Tiled Upscale Stitch, LoRA Loader, Krea 2 Encode and Outpaint Model Patch, Latent Size, Layout Boxes (draw where things and words go), Seed, Select Every Nth, Split Batch, Merge Batches, Text, Integer, Float, Math Expression, Show Text, Free Memory, Workflow Note, Callout (a note with arrows), Workflow Switches, Run Timer, and Step Preview (stop bad runs). Example workflows for Qwen Image 2.1, Krea 2, Klein 9B and LTX 2.3."
version = "2.21.0"
version = "2.21.1"
# comfy-cli serializes this to JSON verbatim, so `file` publishes the literal
# string {"file": "LICENSE"} to the registry listing. `text` puts a readable
# name there instead. Both forms are supported; the LICENSE file is unchanged.
+35
View File
@@ -0,0 +1,35 @@
#!/usr/bin/env python3
"""Regenerate the repository's release badge from pyproject.toml."""
from pathlib import Path
import re
from changelog_notes import pyproject_version
ROOT = Path(__file__).resolve().parent.parent
BADGE_PATH = "assets/readme/release.svg"
def badge_svg(version: str) -> str:
if not re.fullmatch(r"[0-9]+\.[0-9]+\.[0-9]+", version):
raise ValueError(f"invalid release version: {version!r}")
label = f"v{version}"
value_width = max(54, len(label) * 7 + 8)
width = 48 + value_width
center = 48 + value_width / 2
return f'''<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="20" role="img" aria-label="release: {label}">
<title>release: {label}</title>
<path fill="#555" d="M0 0h48v20H0z"/>
<path fill="#00b4aa" d="M48 0h{value_width}v20H48z"/>
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" font-size="11">
<text x="24" y="14">release</text>
<text x="{center:g}" y="14">{label}</text>
</g>
</svg>
'''
if __name__ == "__main__":
target = ROOT / BADGE_PATH
target.write_text(badge_svg(pyproject_version()), encoding="utf-8")
print(f"Updated {BADGE_PATH}")
+12 -18
View File
@@ -9,9 +9,8 @@ Checks:
BOM breaks installs silently.
2. AUSBOSS_JS_VERSION in js/shared/index.mjs equals the pyproject
version, so the stale-browser warning never fires on a fresh install.
3. The README release badge reads GitHub Releases and links to the latest
release. The publish workflow creates it after the Registry upload.
The check guards against a static version or unsupported badge route.
3. The repository-hosted README badge matches pyproject.toml and links to
the latest GitHub Release. Its image needs no external badge service.
4. The Registry archive holds runtime files only. With git it is listed
the way comfy-cli packs it - tracked files minus those .comfyignore
matches - and every shipped path must sit under the runtime allowlist
@@ -40,6 +39,7 @@ import sys
from changelog_notes import notes_for
from registry_contract import git_paths
from release_badge import BADGE_PATH, badge_svg
from workflow_contract import example_problems
ROOT = pathlib.Path(__file__).resolve().parent.parent
@@ -98,25 +98,19 @@ if pyproject_version:
except (OSError, ValueError) as exc:
errors.append(f"no release notes for {pyproject_version}: {exc}")
# --- 3. the README release badge stays dynamic -------------------------------
DYNAMIC_BADGE = (
"img.shields.io/github/v/release/ausboss/ComfyUI-AusBoss?"
)
# --- 3. the README release badge matches the version -------------------------
try:
readme = (ROOT / "README.md").read_text(encoding="utf-8")
if DYNAMIC_BADGE not in readme:
errors.append(
"README.md release badge must use the shields.io GitHub release source"
)
if f'src="{BADGE_PATH}"' not in readme:
errors.append(f"README.md release badge must use {BADGE_PATH}")
if 'href="https://github.com/ausboss/ComfyUI-AusBoss/releases/latest"' not in readme:
errors.append("README.md must link to the latest GitHub Release")
if re.search(r"badge/release-\d+\.\d+\.\d+-", readme):
errors.append(
"README.md carries a hardcoded release-X.Y.Z badge; use the "
"dynamic badge only"
)
except OSError as exc:
errors.append(f"could not read README.md: {exc}")
if pyproject_version:
badge = (ROOT / BADGE_PATH).read_text(encoding="utf-8")
if badge != badge_svg(pyproject_version):
errors.append("release badge is stale; run python scripts/release_badge.py")
except (OSError, ValueError) as exc:
errors.append(f"could not validate the README release badge: {exc}")
# --- 4. the Registry archive holds runtime files only ------------------------
# comfy-cli packs `git ls-files` minus whatever .comfyignore matches, and git