v2.2.0: Prompt Builder nodes, wildcard review tool, docs refresh

- Add Wildcard Prompt Composer and Wildcard Character Composer builder nodes (core/builder, web/prompt_builder.js, builders/, vp wildcard lists)

- Add browser-based wildcard review tool (tools/wildcard_review) with manifest-based undo

- Add wildcard catalog/curation, surreal compiler/lint/scene, profile token budget

- README: document all 18 nodes, bump to v2.2.0, fix stale node/platform lists; CHANGELOG 2.2.0

- Rewrite NODE_COMPARISON for 18 nodes; fix QUICKSTART (dead test_setup.py ref, menu path) and QUICK_REFERENCE node list

- gitignore review manifests and CLAUDE.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Eric Hiss
2026-10-28 20:36:44 -07:00
co-authored by Copilot
parent df90d119b4
commit 373ea8bda3
81 changed files with 15705 additions and 588 deletions
+15 -3
View File
@@ -26,6 +26,10 @@ from .wildcard_support import (
normalise_seed,
report_lines,
resolve_wildcards,
filter_notes_of,
lead_with_filter_notes,
screen_output,
wildcard_nsfw_input,
wildcard_optional_inputs,
)
@@ -84,6 +88,7 @@ class IdeogramMagicPrompt:
"tooltip": "How a connected reference image guides the caption (needs a vision-capable backend)."}),
# New inputs are only ever APPENDED below this line, so saved workflows keep their widget order.
**wildcard_optional_inputs(),
**wildcard_nsfw_input(),
},
}
@@ -95,11 +100,13 @@ class IdeogramMagicPrompt:
def run(self, idea, backend, endpoint, model, temperature, aspect_ratio,
megapixels, keep_bboxes, use_tailoring, max_tokens,
application="(custom)", reference_image=None, reference_influence="full",
wildcard_seed=-1, wildcard_llm_block=True, wildcard_instructions=""):
wildcard_seed=-1, wildcard_llm_block=True, wildcard_instructions="", nsfw="off",
violence_filter="off"):
# Resolve wildcards in the idea (core/wildcards). The parser leaves JSON braces alone.
wildcard_resolution = resolve_wildcards(idea or "", seed=normalise_seed(wildcard_seed), legacy=True,
upstream_instructions=wildcard_instructions)
upstream_instructions=wildcard_instructions, nsfw=nsfw,
violence_filter=violence_filter)
idea = wildcard_resolution.text
if not (idea or "").strip() and reference_image is None:
@@ -130,7 +137,12 @@ class IdeogramMagicPrompt:
if wildcard_report:
report = f"{report}\n{wildcard_report}"
print(f"[Ideogram Magic] {report}")
return (r["prompt_json"], r["high_level"], r["width"], r["height"], report)
caption, caption_note = screen_output(r["prompt_json"], "Ideogram Magic caption")
summary, summary_note = screen_output(r["high_level"], "Ideogram Magic summary")
report = lead_with_filter_notes(report, filter_notes_of(wildcard_resolution, caption_note, summary_note))
if caption_note or summary_note:
return ("", "", r["width"], r["height"], report)
return (caption, summary, r["width"], r["height"], report)
def _caption_reference(self, image, influence, backend, endpoint, model, temperature):
try: