alexandrev-tibco 7d7238ba33 Use the full width in the diff, and filter the tree by kind of difference
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
2026-07-27 17:33:35 +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%