Saltar a contenido

Conceptos

Anclaje semántico

La regla de diseño central: las filas de pantalla renderizadas nunca son ubicaciones canónicas de comentarios. Un comentario se ancla a una ubicación semántica — ruta, lado (antiguo/nuevo), rango de líneas, y las líneas de contexto circundantes — no a una coordenada de terminal. Ese anclaje sobrevive al redimensionado, al plegado de hunks, al ajuste de línea, y a los cambios entre unificado ↔ dividido, porque esos solo cambian la proyección del diff, no el diff en sí.

Borradores

Todo comentario empieza como un borrador, guardado localmente y nunca enviado a ningún lado hasta que lo envías explícitamente. Los borradores viven en $XDG_STATE_HOME/leanreview/drafts/ (~/.local/state/…), un archivo JSON por fuente, escrito de forma atómica.

Cada fuente de revisión tiene una clave de identidad estable — un hash del contenido del patch para archivos/stdin, la especificación del diff para comparaciones de git, host/repo/número para PRs y MRs — de modo que reabrir la misma fuente recarga sus borradores, y dos fuentes distintas nunca comparten estado. --discard elimina el borrador guardado de una fuente.

Reubicación y huérfanos

En modo pull-request el diff puede cambiar debajo de tus borradores guardados: alguien sube nuevos commits entre tus sesiones. Al cargar, leanreview re-ancla cada borrador comparando su contexto circundante capturado contra el nuevo diff (siguiendo renombrados de archivos), y reubica un comentario solo cuando hay una coincidencia única — un contexto que coincide dos veces es ambiguo, y adivinar pondría tu nota en la línea equivocada.

Los comentarios que no se pueden ubicar quedan marcados como huérfanos: permanecen en tu lista de borradores, se muestran con una etiqueta [orphaned], quedan excluidos del envío (la pantalla de confirmación advierte sobre ellos), y esperan a que los reubiques o los elimines. Nada se descarta silenciosamente.

Envío

El envío es explícito y atómico donde el host lo permite:

  • GitHub — todos los comentarios de línea se suben como una sola revisión con el evento elegido (comentario / aprobar / solicitar cambios); las respuestas de hilo en borrador se publican después.
  • GitLab — no tiene un endpoint de revisión atómica, así que los comentarios se convierten en discusiones de diff posicionadas y publicadas en orden, y el evento se corresponde con una aprobación o una nota.

En cualquier caso, todo lo que el host haya aceptado se elimina de inmediato de tus borradores — un reintento tras un fallo parcial envía solo lo que aún está pendiente, nunca un duplicado.

El editor

c, e, y r abren tu editor, resuelto en este orden: editor en el archivo de configuración / LEANREVIEW_EDITORGIT_EDITORVISUALEDITORgit var GIT_EDITORvi. Los valores se interpretan como líneas de comando (code --wait, nvim -f). El buffer es un archivo Markdown con un encabezado en comentario HTML que lleva el contexto; el encabezado se elimina automáticamente, y guardar un cuerpo vacío descarta el comentario.