The previous change made both name columns fully flexible with no floor, so the list collapsed to its minimum width and every name was truncated to "c com" / "e...e". Columns now have an explicit minimum and the tree fills the window. Added what a comparison tool is expected to have and this didn't: - Search box to filter rows by name, on top of the status filter. - Next/previous difference with a position counter, plus cmd-G / cmd-shift-G, walking only what's actually visible. - Comparison options popover exposing the text tolerances (whitespace, case, blank lines, CRLF) that the engine already supported but had no way in. - File sizes, a Size column, status shown as a coloured pill instead of plain text, alternating row backgrounds, and a context menu with "Reveal in Finder" (only for real files — archive entries have no path) and "Copy path". - Compare-again button next to the sides. Note on verification: ImageRenderer can't rasterise List/VSplitView, so the headless snapshot only confirmed the bars fill the width and the difference counter works; the tree layout needs a look on screen. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UfhDYRLTpGJSKGP1m3LVJN
Kotej
Comparador de ficheros, carpetas y artefactos (ZIP/JAR/EAR/WAR) para macOS. Ligero, sin dependencias externas y con el motor aislado del interfaz.
Qué lo diferencia
- Los archivos son carpetas. Un JAR, un EAR o un WAR se abren y comparan como si fueran directorios, incluido anidado (EAR → JAR → clases).
- Comparación semántica. Dos JSON o dos XML que significan lo mismo no se marcan como distintos aunque cambie el orden de claves, los atributos o el formato. Y puedes exigir byte a byte cuando lo necesites.
- Rápido por diseño. La comparación es por niveles: el directorio central de un ZIP ya trae CRC32 y tamaño de cada entrada, así que dos JAR idénticos se resuelven sin descomprimir nada. Solo se lee el contenido que hace falta.
Modos de comparación
| Modo | Cuándo |
|---|---|
| Byte a byte | Exactitud total; cualquier bit distinto cuenta |
| Texto | Tolera fin de línea, espacios finales, mayúsculas o líneas en blanco (configurable) |
| Semántica | JSON/XML equivalentes canónicamente, aunque los bytes difieran |
Por defecto cada fichero usa el modo que le corresponde según su tipo (JSON/XML → semántica, texto → texto, resto → binaria).
Integración con Finder
Con la app instalada, activa la extensión en Ajustes del Sistema → General → Elementos de inicio y extensiones → Extensiones de Finder → Kotej. Después, en el menú contextual del Finder:
- Selecciona dos elementos → Comparar los 2 elementos con Kotej
- O selecciona uno → Seleccionar para comparar, y en otro → Comparar con “…”
También responde a kotej://compare?left=/ruta/a&right=/ruta/b, que abre la
comparación en una pestaña.
Pestañas
Cada pestaña es una comparación independiente, con su propio estado y opciones.
⌘T abre una, ⌘W la cierra. Una comparación que llega desde el Finder reutiliza
la pestaña actual si está vacía, y si no abre otra: nunca pisa lo que estabas
comparando.
Estado
- ✅ Motor (
KotejEngine): lector ZIP propio, escaneo de árboles, archivos anidados, comparación por niveles, comparadores binario/texto/JSON/XML y diff de líneas. - ✅ App SwiftUI: pestañas (varias comparaciones en una ventana), comparación vacía con arrastrar y soltar, árbol side-by-side, filtro "solo diferencias", diff de fichero y resumen.
- ✅ Idiomas: sigue el del sistema, con inglés y español incluidos.
- ✅ Extensión de Finder.
- ⏳ Licencia por decidir; CLI para CI pendiente.
Desarrollo
swift test