docs(issues): close 0005 — type schema fields

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-01 00:01:02 +02:00
parent fb7538088b
commit d26449af64
@@ -0,0 +1,57 @@
---
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).