Compare commits

...
4 Commits
Author SHA1 Message Date
DemonGatanjieuandClaude Opus 5.5 a47e85ff90 v1.62.3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 23:33:43 +08:00
DemonGatanjieuandClaude Opus 5.5 6d1776d856 Tests no longer look like node tables to ComfyUI-Manager
Manager reads every .py file of a plugin, tests too, and listed ten names
from two test files as AMB's nodes, the only match for Power Lora Loader
among them, so a workflow missing it could offer AMB in place of rgthree.
The tables are written so its scanner passes them by, and a new test uses
the scanner's own patterns to keep any file from looking like one again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 23:33:42 +08:00
DemonGatanjieuandClaude Opus 5.5 e6a9c3be93 v1.62.2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 03:49:01 +08:00
DemonGatanjieuandClaude Opus 5.5 b34936a99f Fix workflow cards squeezed into strips
A card clips its content, so plain grid rows shrank to fit the list's height
instead of letting it scroll: with many workflows every card ended up 56 px
tall.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 03:49:00 +08:00
6 changed files with 64 additions and 14 deletions
+10
View File
@@ -1,5 +1,15 @@
# 📈 Anomalous Model Browser Changelog
## v1.62.3 (Fix: ComfyUI-Manager took other packs' nodes for AMB's) — 2026-11-05
- ComfyUI-Manager 不再把别的插件的节点算到 AMB 头上:AMB 没有节点,是测试文件里的假节点表让它误以为有,于是缺 Power Lora Loader 等节点时会推荐装 AMB。Manager 重新扫描后生效。AMB 本身用起来没有变化。
- ComfyUI-Manager no longer takes other packs' nodes for AMB's: AMB has no nodes, but node tables in its test files looked like some, so a missing Power Lora Loader and the like could offer AMB. Takes effect once Manager scans again. AMB itself works as before.
## v1.62.2 (Fix: workflow cards squeezed into strips) — 2026-11-05
- 工作流很多时,卡片不再被压成细条,列表正常滚动。
- With many workflows, the cards are no longer squeezed into thin strips; the list scrolls.
## v1.62.1 (Fix: Anomalous sometimes did not start) — 2026-11-05
- 修好一个偶发的启动故障:有时打开 ComfyUI,AMB 整个没加载,悬浮按钮和窗口都没有,刷新一下又好了。
+1 -1
View File
@@ -9,7 +9,7 @@
[![ComfyUI Manager](https://img.shields.io/badge/ComfyUI-Manager-green?style=for-the-badge&logo=comfyui)](https://github.com/ltdrdata/ComfyUI-Manager)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow?style=for-the-badge)](LICENSE)
[![Changelog](https://img.shields.io/badge/📖_Changelog-v1.62.1-blue?style=for-the-badge)](CHANGELOG.md)
[![Changelog](https://img.shields.io/badge/📖_Changelog-v1.62.3-blue?style=for-the-badge)](CHANGELOG.md)
[![Bilibili Video](https://img.shields.io/badge/Bilibili-视频演示-00A1D6?style=for-the-badge&logo=bilibili)](https://www.bilibili.com/video/BV1boHx61Enc/)
[![Bilibili Voices](https://img.shields.io/badge/Bilibili-配音演示-00A1D6?style=for-the-badge&logo=bilibili)](https://www.bilibili.com/video/BV1bkpZ6uEZQ/)
[![Reddit](https://img.shields.io/badge/Reddit-r%2Fcomfyui-FF4500?style=for-the-badge&logo=reddit)](https://www.reddit.com/r/comfyui/s/n38ihf3DLf)
+37
View File
@@ -0,0 +1,37 @@
"""ComfyUI-Manager reads every .py file of a plugin, tests too, and lists whatever looks like a node
table as that plugin's nodes. AMB has none (AD-024), so no file may look like one: a table in a test once
made Manager offer AMB to people who missed Power Lora Loader, in place of rgthree."""
import re
import unittest
from pathlib import Path
PLUGIN = Path(__file__).resolve().parents[1]
# As ComfyUI-Manager's scanner.py (scan_in_file) has them.
TABLE = re.compile(r"_CLASS_MAPPINGS\s*(?::\s*\w+\s*)?=\s*(?:\\\s*)?{([^}]*)}", re.MULTILINE | re.DOTALL)
OTHERS = (r'^[^=]*_CLASS_MAPPINGS\["(.*?)"\]', r"^[^=]*_CLASS_MAPPINGS\['(.*?)'\]",
r'@register_node\("(.+)",\s*\".+"\)', r'"(\w+)"\s*:\s*{"class":\s*\w+\s*')
def claims(code):
"""What the scanner would take for nodes in `code`: the tables with something in them, and the other forms."""
found = [table.strip() for table in TABLE.findall(code) if table.strip()]
return found + [name for pattern in OTHERS for name in re.findall(pattern, code)]
class ManagerScanTests(unittest.TestCase):
def test_the_check_sees_a_table(self):
name = "NODE_CLASS_" + "MAPPINGS" # in two, or this file would be the one to look like a table
self.assertTrue(claims(name + ' = {"Some Node": object}'))
self.assertFalse(claims(name + " = {}"))
def test_no_file_looks_like_a_node_table(self):
for path in PLUGIN.rglob("*.py"):
parts = path.relative_to(PLUGIN).parts
if "__pycache__" in parts or any(part.startswith(".") for part in parts):
continue # the scanner leaves these out too
self.assertEqual(claims(path.read_text(encoding="utf-8", errors="ignore")), [], path)
if __name__ == "__main__":
unittest.main()
+12 -11
View File
@@ -65,18 +65,19 @@ class UsageTests(unittest.TestCase):
{"type": "loras", "root": 0, "rel": "never.safetensors", "size": 9},
{"type": "vae", "root": 0, "rel": "hashed.safetensors", "size": 1},
]
registered = { # by this name, not as the keyword's value: tests/test_manager_scan.py says why
"KSampler": node("nodes", ["MODEL"], ["LATENT"]),
"Power Lora Loader (rgthree)": node("custom_nodes.rgthree-comfy", ["MODEL"], ["MODEL"]),
"easy loraStack": node("custom_nodes.ComfyUI-Easy-Use"),
"easy seed": node("custom_nodes.ComfyUI-Easy-Use.py.nodes"),
"Unused Thing": node("custom_nodes.forgotten-pack"),
"DetailerForEach": node("custom_nodes.ComfyUI-Impact-Pack", ["IMAGE", "BBOX_DETECTOR"], ["IMAGE"]),
"UltralyticsDetectorProvider": node("custom_nodes.comfyui-impact-subpack", [], ["BBOX_DETECTOR"]),
"Genie Speak": node("custom_nodes.Genie-TTS", ["STRING"], ["AUDIO"]),
"Manager Thing": node("custom_nodes.ComfyUI-Manager"),
}
nodes = types.SimpleNamespace(
NODE_CLASS_MAPPINGS={
"KSampler": node("nodes", ["MODEL"], ["LATENT"]),
"Power Lora Loader (rgthree)": node("custom_nodes.rgthree-comfy", ["MODEL"], ["MODEL"]),
"easy loraStack": node("custom_nodes.ComfyUI-Easy-Use"),
"easy seed": node("custom_nodes.ComfyUI-Easy-Use.py.nodes"),
"Unused Thing": node("custom_nodes.forgotten-pack"),
"DetailerForEach": node("custom_nodes.ComfyUI-Impact-Pack", ["IMAGE", "BBOX_DETECTOR"], ["IMAGE"]),
"UltralyticsDetectorProvider": node("custom_nodes.comfyui-impact-subpack", [], ["BBOX_DETECTOR"]),
"Genie Speak": node("custom_nodes.Genie-TTS", ["STRING"], ["AUDIO"]),
"Manager Thing": node("custom_nodes.ComfyUI-Manager"),
},
NODE_CLASS_MAPPINGS=registered,
LOADED_MODULE_DIRS={name: str(custom / name) for name in packs},
EXTENSION_WEB_DIRS={"rgthree-comfy": str(custom / "rgthree-comfy" / "js"), "page-only": str(custom / "page-only" / "web")},
)
+3 -2
View File
@@ -11,7 +11,8 @@ PLUGIN = Path(__file__).resolve().parents[1]
sys.path[:0] = [str(PLUGIN), str(PLUGIN.parents[1])]
from api import tts_version, version_manager as vm
NODES = 'NODE_CLASS_MAPPINGS = {"AnomalousTTS_CharacterSpeech": object}\n'
MAPPINGS = 'NODE_CLASS_' + 'MAPPINGS' # in two: tests/test_manager_scan.py says why
NODES = MAPPINGS + ' = {"AnomalousTTS_CharacterSpeech": object}\n'
def git(cwd, *args):
@@ -51,7 +52,7 @@ class TtsVersionTests(unittest.TestCase):
def test_only_the_official_clone_is_found(self):
self.assertIsNone(tts_version.find_checkout())
self.clone('A_fork', 'https://github.com/someone/Anomalous_TTS.git')
self.clone('Other_pack', 'https://github.com/DemonGatanjieu/Anomalous_TTS', nodes='NODE_CLASS_MAPPINGS = {}\n')
self.clone('Other_pack', 'https://github.com/DemonGatanjieu/Anomalous_TTS', nodes=MAPPINGS + ' = {}\n')
(self.nodes / 'Plain_copy').mkdir()
Path(self.nodes / 'Plain_copy' / 'nodes.py').write_text(NODES, encoding='utf-8') # no git: Manager's zip, a copy
self.assertIsNone(tts_version.find_checkout())
+1
View File
@@ -94,6 +94,7 @@
.anomalous-wf-list.is-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
grid-auto-rows: max-content; /* a card clips its content, so plain rows would shrink to fit instead of scrolling */
align-content: start;
gap: 14px;
}