The Save Metadata (Civitai) graph trace only recognized ComfyUI's stock
LoraLoader/LoraLoaderModelOnly, so LoRAs loaded via rgthree's multi-LoRA
nodes were silently missing from the written metadata and the preview.
- tracer.py: harvest LoRAs from "Power Lora Loader (rgthree)" (lora_N dicts)
and "Lora Loader Stack (rgthree)" (flat lora_0N/strength_0N pairs), several
per node, in load order. Skip disabled, empty ("None") and zero-strength
slots to match what actually loads. Stock loaders still work.
- save_civitai_metadata.js: mirror the same detection in the live-graph
Test-detection preview (kept in sync with the Python tracer).
- Preview warning now distinguishes positive/negative (may be resolved at run
time by the AI2Go Prompt Batch node) from genuinely-unresolved fields.
- Tests for both rgthree loaders (multiple loras, ordering, skipped slots).
- README: document the supported LoRA loaders.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Real-world testing feedback (PR #9):
- Detect models loaded via UNETLoader ("Load Diffusion Model", unet_name in
the diffusion_models folder) + GGUF unet loaders, not just checkpoints;
carry the folder so AutoV2 hashing looks in the right place. Fixes
"model (?)" on Flux/SD3/Krea workflows. Mirrored in the JS Test button.
- Expand %date:FORMAT% filename tokens (frontend feature that doesn't reach a
custom node's widget) before get_save_image_path, so e.g.
"%date:yyyy-MM-dd%/Krea-Turbo" works. New comfy-free filenames module.
- Test-detection preview panel now reserves its natural height and grows the
node to fit (measured, like the Prompt Batch editor) instead of overflowing.
Advanced node sockets kept as-is per user preference. +10 unit tests (39 passed).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Extends the static graph tracer to walk sampler.model backward through
LoraLoader/LoraLoaderModelOnly and pass-through nodes to the checkpoint
loader, populating TraceResult.model_name/.model_file/.loras in load order.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Implements Task 6 — pure module for walking ComfyUI API prompt backward from
save node to detect sampler and read scalar fields (steps, cfg, seed, etc).
Provides TraceResult dataclass and trace() function with BFS backward search
and single-sampler fallback. Leaves Tasks 7 & 8 extension marker in place.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Implement to_a1111_sampler function that maps ComfyUI (sampler_name, scheduler) pairs
to A1111/Civitai sampler labels. Includes 23 known sampler mappings with fallback to
readable label generation and scheduler-specific handling.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move _parse_prompts/_select/DEFAULT_PROMPTS_JSON out of nodes/prompt_batch.py
(which imports comfy_api) into a pure nodes/prompt_batch_core.py so the parsing
logic can be unit tested and reused by the upcoming Civitai metadata tracer
without a ComfyUI install. prompt_batch.py now imports the three names;
behavior is unchanged (select_prompt keeps all three of the original _select's
fallback logger.warning calls, so logging is identical too).
Also fix pytest collection: the repo root doubles as the ComfyUI extension
package (its own __init__.py does relative imports), which made pytest wrap
the repo root in a Package collector and fail importing it. Add
--confcutdir=tests/testpaths in pyproject.toml so `pytest tests/...` (and bare
`pytest`) work without needing a ComfyUI install.