feat: PM Block Selector + model-specific block nodes (KREA2, FLUX.2-Klein)
Add per-block, per-LoRA weighting to the LoRA PowerMerge pipeline:
- PM Block Selector: bind a BlockDefinition to one LoRA by stack index;
chain outputs to weight multiple LoRAs, feed into PM LoRA Stack Decompose.
- PM KREA 2 Blocks: model-specific block definition for KREA2 LoRAs
(diffusion_model.blocks.N + txtfusion + txtmlp pathways).
- PM FLUX.2.Klein Blocks: block definition for FLUX.2-Klein LoRAs
(double_blocks + single_blocks streams).
Implementation:
- src/blocks.py: pure logic (key normalization, weight-string parsing,
category/pathway matching, per-LoRA weight computation, up-factor scaling).
Already existed, fully unit-tested in tests/test_blocks.py.
- src/nodes_block_selector.py: thin ComfyUI node wrappers around blocks.py.
- src/lora_decompose.py: optional BlockSelection input threads per-block
weights through the decompose path; scales the up factor (linear delta
scaling), weight 0 drops the LoRA from that key; cache-aware.
- tests/conftest.py: fix pytest_ignore_collect to exclude __init__.py and
src/ from collection, enabling clean test isolation.
3 new nodes registered under LoRA PowerMerge.