Ir al contenido

Records

El plugin Records sigue las clases de cosas de las que están hechos tus Blueprints (los planos): criterios de aceptación y casos de prueba para software, personajes para un libro, hipótesis para una investigación, y las decisiones que un equipo toma por el camino. El plugin solo conoce registros; la raíz declara qué clases tiene, como tipos de registro, y los registros de cada tipo se encuentran, se comprueban, se numeran y se listan en toda la raíz. Un registro no es un Blueprint: nunca es un elemento de colección, nunca está en el índice. El plugin solo cambia la forma (una etiqueta añadida, renumerada o quitada, una lista escrita en una región propia), nunca una palabra que escribiste. Desactivado por defecto; eidos plugin enable records lo activa. Desactivado, los registros se leen como las listas simples que son y los basados en archivos se quedan en sus carpetas.

  • Records, una actividad en la barra de actividad: Overview (cada tipo con sus etiquetas, dónde viven sus registros, sus campos y su recuento, y luego las listas que esperan etiquetas), Waiting con su recuento (mientras un tipo tenga estados), cada tipo de registro con su recuento, las vistas guardadas de cada tipo, Waiting for labels y Records settings al pie. El + de su cabecera crea un tipo de registro nuevo.
  • Un tipo con Show in the sidebar tiene además su propia entrada en la vista Root, bajo Records, con su recuento: una raíz de software muestra Acceptance criteria, una raíz de libro Characters.
  • Cada tipo tiene una tabla en /p/records/<type>: la etiqueta, el texto, el Blueprint donde se encuentra, la sección y una columna por campo, más Status, Signed off y Tasks donde el tipo los usa. Cada columna se ordena desde su cabecera; un cuadro de búsqueda va al frente de los filtros por Blueprint, por sección y por cada campo, todos guardados en la dirección de la página, y Save as view guarda un filtro como vista compartida o local. Una fila abre su Blueprint en un modal, desplazado hasta el registro. El menú de una fila ofrece Open, Open in its own page, Remove label y Delete record (se pregunta una vez), y en un tipo con estados, Confirm y un submenú Status.
  • En el editor en vivo, el menú Turn into de una lista ofrece cada tipo con un patrón de etiqueta, que etiqueta cada elemento de la lista numerado después de las etiquetas que ya hay en el documento, y Plain list (remove labels), que las quita. Ninguno cambia una palabra. Link to a record, en el menú de inserción, encuentra un registro etiquetado por su etiqueta o sus palabras y escribe el enlace.
  • Un enlace a un registro se dibuja como el título del Blueprint y la etiqueta, con las palabras del registro al pasar el ratón. Un enlace cuya etiqueta no existe se dibuja en el tono de error.
  • La página de ajustes lista cada tipo de registro como una tarjeta, con Edit y un botón para quitarlo; New record type abre el mismo formulario desde la página de ajustes, el Overview y el + de la actividad.

Un tipo de registro es un nombre, un título, un patrón de etiqueta, unos pocos campos y dónde viven sus registros. El formulario pide:

  • Name: cómo lo llama la página (Acceptance criteria). El nombre para los comandos se deriva de él y se muestra (criterion).
  • Label: cómo se numera cada registro, con {n} donde va el número: AC{n} etiqueta AC1, AC2 y así sucesivamente, con un ejemplo en vivo mientras escribes. Déjalo vacío para registros que se nombran en lugar de numerarse, como los personajes.
  • Where they live: In document lists, cada registro un elemento de lista dentro de un Blueprint, o One file each, en una carpeta del tipo. Cuando ya existen registros del tipo, esto queda como está.
  • Show in the sidebar: una entrada propia en la vista Root.
  • Fields: los detalles que lleva cada registro, cada uno con un nombre, un tipo (Text, Choice con sus opciones, Link, Number o Yes or no) y si es Required.

Los ajustes del ciclo de vida, más abajo, están en el mismo formulario. Desde la terminal, configure:type escribe los mismos ajustes de la misma manera:

Ventana de terminal
eidos records configure:type add criterion --title "Acceptance criteria" --label "AC{n}" --field "status:list:met|unmet" --sidebar

--field "name:type[:options|…][:required]" acepta text, list, link, number o checkbox, y se repite, sustituyendo los campos. Quitar un tipo con registros escritos necesita --force; sus registros quedan como listas simples, o en su carpeta.

Un registro en línea es un elemento de lista que empieza con la etiqueta de su tipo en negrita, esté donde esté en un Blueprint. Sus campos son la línea sangrada debajo, pares name: value separados por ·:

## Acceptance criteria
- **AC6:** A root with no collections checks clean.
status: met · test: [check.test.ts](../../cli/test/check.test.ts)

Todo Blueprint que ya escribe **AC1:** a mano se lee tal cual, y también una etiqueta intercalada entre dos (AC2b). Una plantilla también puede marcar una sección para un tipo: en Framework Settings → Templates, la opción Records de una sección escribe <!-- records:section type=<type> --> en la plantilla, y cada elemento del primer nivel de las listas de esa sección en un Blueprint creado a partir de ella es entonces un registro del tipo, con etiqueta o sin ella. Así se encuentra un tipo con nombre, como Characters. La marca es solo de la plantilla; un Blueprint nunca la lleva. Cuando una sección está marcada y los elementos de un Blueprint existente ahí aún no tienen etiqueta, el Overview ofrece Label n items, que no cambia nada hasta que lo aceptas.

Las etiquetas van en secuencia dentro de su Blueprint, de 1 a n sin huecos. Un registro nuevo toma el número siguiente. Quitar uno (Remove label, Delete record, eidos records unlabel o remove) renumera los que van después, y cada enlace a ellos, en cualquier archivo de la raíz, los sigue. Las etiquetas fuera de secuencia se informan, con un arreglo Renumber.

Un tipo con One file each guarda un archivo markdown por registro en una carpeta de la raíz declarada como del tipo (owned_by: "@records/<type>", con el nombre del tipo salvo que des --folder). El frontmatter tiene la etiqueta, el title (las palabras que muestra una lista), los blueprints a los que sirve por id y los campos por nombre; el cuerpo son notas. Las etiquetas de ese tipo van en secuencia en toda su carpeta, y cada archivo se renombra con su etiqueta, salvo que se numere por ids (más abajo).

Enlaza a un registro como a cualquier parte de un documento: un enlace markdown estándar al archivo de su Blueprint, con la etiqueta como fragmento.

See [Validate a Root AC6](../cli-core/check.md#ac6), and [Login AC1](#ac1) in this file.

El enlace funciona en cualquier sitio donde funcione markdown, también en GitHub. La comprobación del núcleo resuelve la ruta, y mover el Blueprint la reescribe como reescribe cualquier enlace. El plugin comprueba el fragmento, informa de una etiqueta que no existe y reescribe el fragmento y la etiqueta en las palabras del enlace cuando el registro se renumera. Escribe las palabras del enlace como el título del Blueprint y la etiqueta; Link to a record del editor lo escribe por ti. En la línea de comandos, un registro se nombra <blueprint>/<label> (B-SHS2/AC6, el Blueprint por id o por ruta) o <path>#<label>.

Un tipo puede dar a sus registros un ciclo de vida. Cada parte está desactivada hasta que el tipo la activa, en el formulario del tipo de registro o con configure:type, así que un tipo que no usa ninguna se lee y se comporta como uno simple.

  • Estados: las etapas por las que pasa un registro, cada una en una de tres categorías: esperando a quien decide, confirmado o cerrado (--status Open:waiting --status Mitigated:confirmed --status Accepted:closed). New records start as nombra el primero (--default-status). Los registros en un estado de espera forman la cola Waiting, en la actividad Records y con eidos records --waiting.

  • Aprobación (--sign-off): confirmar un registro anota quién lo confirmó y cuándo, como confirmed y confirmed_by junto a su estado; salir de la categoría confirmada borra ambos. Solo una persona aprueba. Un agente propone y deja el registro en espera, y solo confirma uno --as la persona que lo resolvió en la conversación.

  • List on documents (--listed, tipos basados en archivos): cada Blueprint al que sirve un registro muestra los registros del tipo en una lista, al día en una región records:list que escribe el plugin, donde la plantilla del Blueprint la pone, o si no bajo un encabezado con el nombre del tipo al pie del cuerpo:

    <!-- records:list type=risk -->
    - [ ] [RSK-F36 The index drifts from the files](../risk/rsk-f36-the-index-drifts-from-the-files.md) · Open · @claude
    <!-- /records:list -->

    El plugin la escribe después de cada cambio; nunca escribas dentro de ella.

  • Link to tasks (--tasks, tipos basados en archivos): un registro nombra las tareas que lo llevan a cabo (--task <id>), y la página de cada tarea muestra los registros que la nombran.

  • Numeración (tipos basados en archivos): In order (--numbering sequential, el valor por defecto) etiqueta los registros de 1 a n y renumera tras quitar uno. Unique ids (--numbering ids) da a cada registro un id como lo dan las tareas, con las letras que elijas antes del guion (--id-prefix RSK da RSK-F36). Un id nunca se renumera, y uno cambiado (eidos records set RSK-F36 --id RSK-DRIFT) conserva el anterior como alias que sigue encontrándolo. Elige ids cuando varias personas añaden registros en ramas distintas, donde dos números siguientes chocarían al fusionar.

Ventana de terminal
eidos records configure:type add risk --mode file --numbering ids --id-prefix RSK \
--status Open:waiting --status Mitigated:confirmed --status Accepted:closed \
--sign-off --listed --tasks

Un registro de decisiones es el uso más sencillo de todo lo anterior: un tipo de registro basado en archivos con ciclo de vida, un archivo por decisión, en espera hasta que una persona la confirma, listado en los Blueprints para los que se tomó y enlazado a las tareas a las que afecta.

Ventana de terminal
eidos records configure:type add decision --mode file --numbering ids --id-prefix D \
--status Proposed:waiting --status Confirmed:confirmed --status Rejected:closed --status Superseded:closed \
--sign-off --listed --tasks
eidos records add B-SHS2 decision "Cache the index in memory" --task T-4KQ7 --notes "Why, and what else was weighed" --as claude
eidos records confirm D-7M2P --as grace

--notes escribe el cuerpo del registro: el porqué, qué más se sopesó, qué descarta. Un agente registra una decisión que tomó por su cuenta como sí mismo y la deja en espera de una persona.

  • .eidos/plugins/records/settings.yaml, compartido: types, cada uno con name, title, label, mode, sidebar, folder para un tipo basado en archivos y fields (cada uno con name, type, options y required), más statuses, default_status, sign_off, listed, tasks, numbering e id_prefix donde el tipo los usa. Lo escriben la página de ajustes y configure:type; nunca lo edites a mano.
  • La carpeta de un tipo basado en archivos en la raíz, declarada owned_by: "@records/<type>": un archivo markdown por registro. La raíz →
  • Los registros en línea viven en los propios Blueprints, como tus elementos de lista. Una región records:list en un Blueprint es del plugin.
Ventana de terminal
eidos records # every record, by type; --type, --blueprint, --where field=value, --search, --waiting, --task, --json
eidos records types # the types: labels, fields, mode, and count
eidos records show B-SHS2/AC6 # one record; <path>#<label>, or a file-based record by its label
eidos records add B-SHS2 criterion "A root with no collections checks clean." --field status=met
eidos records add B-SHS2 risk "The index drifts from the files" --task T-4KQ7 --as claude # a file-based record serving the blueprint
eidos records set RSK-F36 --status Mitigated --as grace # --field name=value, --for, --task, --id; into a confirmed status signs it off
eidos records confirm RSK-F36 --as grace # to the type's first confirmed status; a person signs off
eidos records label B-SHS2 --section "Acceptance criteria" --type criterion --dry-run # the labels it would add; no word changes
eidos records unlabel B-SHS2/AC6 # a plain list item again; the labels after it renumbered, links following
eidos records remove B-SHS2/AC6 # the record taken out; the labels after it renumbered, links following
eidos records renumber --dry-run # labels back in sequence, in one blueprint or every one
eidos records project # write every records:list region that drifted again; or one blueprint
eidos records configure:type set criterion --no-sidebar # add|set|remove; --dry-run, --json

Cada comando acepta --json. Una escritura se firma con --as <alias>, si no con EIDOS_USER, si no con el usuario que actúa.

Un agente añade un registro con eidos records add, quita uno con eidos records remove y nunca numera etiquetas a mano: el plugin las mantiene en secuencia y los enlaces a ellas al día. Escribe la frase del registro con las palabras del dueño, deja la línea de campos para valores y etiqueta una lista existente solo cuando se le pide.

Todo son avisos: records/label-gap (etiquetas fuera de secuencia, una etiqueta intercalada o una etiqueta repetida; Renumber lo arregla, como eidos records renumber), records/label-duplicate (una etiqueta repetida en un Blueprint, o en dos archivos de un tipo), records/field-required (un campo obligatorio vacío), records/field-option (el valor de un campo Choice fuera de sus opciones), records/field-type (un campo Number o Yes or no con otra cosa), records/reference-missing (un enlace cuya etiqueta su Blueprint no tiene), records/type-unknown (una sección de plantilla marcada para un tipo que la raíz no declara), records/blueprint-missing (un registro basado en archivo que sirve a un Blueprint que la raíz no tiene), records/task-missing (un registro que nombra una tarea que el backlog no tiene) y records/list-stale (una región records:list que ya no es lo que dicen sus registros; su arreglo la vuelve a escribir). Desactivado de nuevo, nada cambia en un Blueprint y nada del plugin se ejecuta.