- CSSExporter : export en custom properties CSS (:root, selecteur custom, sanitisation noms)
- AmigaExporter : export 12-bit Amiga en format txt (#RGB) et C (tableau UWORD)
- enregistrement des deux exporters dans le registry
- ajout des formats css et amiga dans le node PaletteFormatter
- specs completes pour les deux exporters
- section Export Formats dans le README
- etape check coverage threshold dans le workflow GitHub Actions
- section [report] fail_under=90 dans .coveragerc
- badges tests CI et coverage dans le README
- mention du seuil dans la section tests du README
README reecrit entierement en anglais avec sommaire par categorie
(Colors, Palette, Output, IO, Image) et liens vers les fiches
individuelles dans docs/nodes/.
16 fiches creees avec description, tableaux inputs/outputs,
screenshots et categorie ComfyUI pour chaque node.
4 nouvelles methodes sur PixelPalette : copy_subset, append_palette,
insert_palette et mix_with_palette avec leurs specs mamba (31 tests).
4 nouveaux nodes ComfyUI : CopySubsetNode, AppendPaletteNode,
InsertPaletteNode et MixPaletteNode avec workflows de test 11-14.
Captures d'ecran de tous les workflows de test dans ComfyUI :
workflow charge + resultat apres execution pour chaque node.
Le workflow 08 (palette_formatter) n'a que le workflow car
sa sortie est du texte uniquement.
Screenshots du workflow 01 (color preview) dans ComfyUI :
avant et apres execution. Mise a jour de la section Nodes
du README avec descriptions en francais.
- numerotation 01_ a 10_ des workflows par complexite croissante
- lefthook pre-commit avec mamba pour bloquer si tests cassent
- github actions CI (python 3.10/3.11/3.12) sur push et PR
- docs/pr-conventions.md pour les conventions de messages PR
- mise a jour README section Contribute (tests, CI, git flow)
- ajout coverage et lefthook dans requirements-dev.txt
Generateur Python (workflows/generate_workflows.py) qui produit
10 workflows de test en format UI et API, avec PreviewImage connecte
automatiquement apres chaque node produisant une IMAGE.
Ajoute aussi la skill Claude Code /reload-comfyui pour redemarrer
le serveur ComfyUI dans tmux et recharger un workflow dans le navigateur.
Remplace le chargement importlib des nodes palette/ par des imports
relatifs standard. L'ancien mecanisme creait des instances de classes
PixelColor/PixelPalette differentes entre nodes/ et nodes/palette/,
ce qui faisait echouer tous les isinstance() a l'execution ComfyUI.
Corrige aussi le text_size du ColorPreviewNode et PaletteRenderer
qui utilisaient un try/except arial.ttf avec fallback silencieux sur
la police par defaut sans taille — le texte restait toujours minuscule.
Utilise maintenant ImageFont.load_default(size=N) (Pillow 10+).
Register SortPaletteNode, GradientBetweenNode, CreateGradientPaletteNode
and PaletteViewNode in the main __init__.py using the importlib pattern
for compatibility. All nodes appear in the pixel_art/ category.
Refactored the importlib boilerplate into a shared _load_palette_node helper.
The custom __init__ was missing all attributes except colors, breaking
the dataclass constructor interface and the GimpPaletteLoader node.
Restored full constructor with all parameters (name, raw_content,
source_filename, metadata, format_type).
Reactivated 26 specs from spec_pending covering: initialization,
GIMP parsing, generic parsing, PixelColor validation, utility methods,
formatting, export, properties, and error handling.
5 specs remain pending (parser metadata, generic hex parser, raw format).
PaletteRenderer in lib/palette renders palettes as PIL images
with grid, horizontal and vertical layouts. Optional text overlay
for names, indices and hex values.
PaletteViewNode wraps it for ComfyUI, outputting IMAGE tensors.
13 specs covering all layouts, pixel accuracy, text areas, edge cases.
New class method PixelPalette.create_gradient_palette() generates
a palette with N interpolated colors between two endpoints.
Supports RGB and HSV color spaces via the existing mixer system.
CreateGradientPaletteNode wraps it for ComfyUI.
Specs cover RGB/HSV interpolation, boundary preservation, validation.
GradientBetweenNode wraps palette.create_gradient() to interpolate
colors between two indices. Supports RGB and HSV color spaces.
Uses deepcopy to preserve the original palette.
New SortPaletteNode wraps palette.sort_by_hue() and sort_by_brightness()
with deepcopy to avoid mutating the original palette.
Specs cover hue sorting, brightness sorting (perceptual luminosity),
edge cases (single color, achromatic colors).