alexandrev-tibco a4efef9664 Professional pass on the UI: fix the collapsed tree, add search, navigation and options
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
2026-07-27 17:42:03 +02:00
2026-07-27 17:24:05 +02:00

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
S
Description
Kotej — comparador macOS estilo Beyond Compare: ZIP/JAR/EAR como carpetas, comparacion semantica JSON/XML, motor sin dependencias
Readme 1.6 MiB
Languages
Swift 53.2%
TypeScript 39.8%
CSS 4.2%
JavaScript 2.3%
Shell 0.4%
Other 0.1%