feat: implement PPP tags, model inference, and prompt cleanup
Add full sd-webui-prompt-postprocessor tag support:
- <ppp:set> with evaluate, add, ifundefined modifiers
- <ppp:echo> with fallback
- <ppp:if> with eq/ne/gt/lt/ge/le/contains/in operators and logical
combinators
- <ppp:stn> for sending content to negative prompt (start/end positions)
- <ppp:ext> for generating <lora:...> and hypernet tags
Create PromptWithWildcards node:
- Auto-infers model family (sd1, sdxl, sd3, flux) from MODEL input
- Supports variant override (pony, illustrious, anima, noobai)
- Provides _is_* system variables for <ppp:if> conditions
- Merges <ppp:stn> content into negative output
Add prompt cleanup utilities:
- ignore_repeats: deduplicate keywords case-insensitively
- cleanup_extra_spaces: normalize whitespace and trim brackets
- cleanup_empty_constructs: remove empty keywords and attention tags
Fixes:
- Handle all-zero variant weights (fallback to uniform random selection)
- Resolve ___name__ wildcard syntax with leading underscores
Docs:
- Update README with PPP syntax reference and node documentation
- Add ROADMAP.md with ComfyUI encoding behavior notes
Tests: 190 passing (35 new cleanup tests, 64 PPP/feature tests)