---
id: 0005
title: Type schema en types.yaml — fields por tipo + principal_field
status: completed
priority: high
created: 2026-04-30
completed: 2026-05-01
---

## Objetivo

Extender `types.yaml` para declarar el **esquema de campos** de cada entity
type, ademas de la cosmetica que ya existe (color/shape/icon). Es la base
sobre la que tiran 0007 (Type Editor) y 0008 (Inspector editable).

## Formato propuesto

```yaml
entities:
  - name: Person
    color: "#5B8DEF"
    shape: circle
    icon: ti-user
    principal_field: name              # opcional, default = "name"
    fields:
      - { name: name,        type: string, required: true }
      - { name: first_name,  type: string }
      - { name: last_name,   type: string }
      - { name: age,         type: int }
      - { name: nationality, type: string }
      - { name: birth_date,  type: date }
      - { name: gender,      type: enum, values: [male, female, other] }
```

Tipos soportados (v1): `string`, `int`, `float`, `bool`, `date`, `url`,
`enum`. `enum` requiere `values: [...]`.

`principal_field` es el campo que el viewport usa como label visible del
nodo cuando no hay otro override (sustituye al actual `name` hardcodeado).

## Cambios en codigo

- `types_registry.h`:
  - Nuevo `FieldSpec { string name; FieldKind kind; bool required; vector<string> enum_values; }`.
  - `EntitySpec` gana `string principal_field` y `vector<FieldSpec> fields`.
- `types_registry.cpp`:
  - Parser tolerante: ignora `fields:` si no esta presente; tipos
    desconocidos se mapean a `string` con warning.
  - **Writer** nuevo: `bool types_save_yaml(const char* path, const ParsedTypes& types, string* error_msg)`. Round-trip que preserva el orden de claves y el formato compacto del ejemplo.
- `examples/types.yaml`: anadir `fields` a Person, Email, Domain, Phone, Org como semilla.

## Definicion de hecho

- Parser lee el yaml extendido sin romper el yaml existente (sin `fields`).
- Writer regenera un yaml legible y re-parseable (test round-trip).
- `examples/types.yaml` incluye `fields` para los 10 tipos existentes.
- `apply_types_yaml` no se rompe (no toca `fields` aun, eso es 0007/0008).
