The file diff sat in a narrow centred column with empty space around it: cells had a fixed minWidth inside a two-axis ScrollView, and the empty/notice states were vertically centred. Now each side takes exactly half the width, content is anchored top-leading, and scrolling is vertical only, with long lines wrapping (a "Wrap lines" toggle turns that off for code, remembered across launches). The tree's right column was pinned at 220pt regardless of window size; both name columns now share the space evenly and only the status column is fixed. The "only differences" checkbox became a filter with the modes worth having when reviewing a real comparison: everything, only differences, only changed files, only on the left, only on the right, only on one side. Folders survive filtering only when something inside them does, so no empty branches are left behind. 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