Metadata-Version: 2.4
Name: studio-psd-extract
Version: 0.4.0
Summary: Extrae mesas, capas, texto e imágenes de un PSD al contrato JSON de Omnitok Studio.
License-Expression: LicenseRef-Proprietary
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: psd-tools[composite]<1.26,>=1.25
Requires-Dist: Pillow>=11
Requires-Dist: fonttools>=4.50
Provides-Extra: test
Requires-Dist: pytest>=8.0; extra == "test"
Dynamic: license-file

# studio-psd-extract

Extrae de un PSD las mesas, el árbol de capas, los runs de texto y los fondos rasterizados
al contrato JSON v1 de Omnitok Studio. Es el mismo extractor que usa la
tool `studio_extract_psd` del MCP de Studio.

El fondo de cada mesa (`A{n}-bg`) lleva solo la escena: lo que está dentro de una capa o grupo
de primer nivel llamado `bg`, `fondo` o `background`, más cada capa que cubre al menos un tercio
de la mesa (y los ajustes y rellenos). El texto, los íconos, sliders, flechas, puntos, recortes de
producto y formas chicas quedan fuera porque en la ficha se dibujan como widgets.

El CLI además exporta un PNG por widget (un grupo sin texto es uno solo; si mezcla, uno por capa)
en el `asset` de su nodo. El resumen lista solo los fondos en `assets` y cuenta los widgets por mesa
en `widget_assets`; los items para subirlos salen en `widget_assets` del outline de cada mesa
(`--artboard <id>`). Online no se exportan (tope de assets). Un widget que psd-tools no puede
dibujar queda en el warning `widget_asset_skipped`. El paquete instala `psd-tools[composite]`:
`aggdraw` dibuja las formas vectoriales (líneas divisorias, rectángulos) y `scipy`, los efectos de capa
(sombras, trazo, degradados). El servidor online no los trae.

## Desarrollo

Desde la raíz del repo `omnitok-studio-mcp`:

    uv pip install --python .venv/bin/python -e packages/studio-psd-extract --no-deps
    PYTHONPATH=. .venv/bin/python -m pytest -q packages/studio-psd-extract/tests

Fixtures: `python tests/fixtures/make_fixtures.py` (dentro del paquete) regenera los PSD de prueba.

## Uso

    uvx studio-psd-extract <archivo.psd> --out-dir <carpeta> [--brand-fonts "Fam A,Fam B"] [--font-dir <carpeta> ...] [--no-metrics]
    uvx studio-psd-extract <carpeta>/extraction.json --artboard A3

Escribe `<carpeta>/extraction.json` (contrato completo) y `<carpeta>/assets/psd-<hash12>.png`, e
imprime en stdout un resumen compacto (mesas, fuentes, warnings, `assets_dir` y assets). Con
`--artboard` imprime el outline compacto de esa mesa (ids, tipos, bbox, texto). Exit 0 = ok; 2 = error
(`{"error": {"code", "message"}}`). Límites locales: 1 GB, 300 MP; PSB y Lab no soportados.

Métrica de fuente sustituta: en capas de una línea (runs de la misma fuente y tamaño se unen) compara el ancho de tinta del PSD
con el de la fuente declarada instalada en este equipo (carpetas del sistema, Adobe Fonts y
`--font-dir`). `metrics.status`: `match` (±4 %, o ±2 px en textos chicos), `suspect` (Photoshop probablemente dibujó otra
fuente; `tracking_needed_em` es el tracking que haría calzar), `font_not_installed` o `skipped` (con `reason`: `multiline`, `area_text`, `multi_run`, `transform_complex`, `empty`, `glyph_missing`, `small_caps`, `metrics_error`).

## Publicación

Solo con un tag `psd-v<versión>` que coincida con `version` del `pyproject.toml`; el workflow
`publish-psd-extract` corre los tests, construye y publica en PyPI con trusted publishing.

## Licencia

Propietaria: todos los derechos reservados (ver `LICENSE`).
