Changelog

[1.1.1] — 2026-05-24

Agregado

  • Búsqueda por nombre de módulo o función/clase — los resultados muestran el módulo contenedor como sufijo; al seleccionar un callable salta a su módulo y resalta el callable en el panel de detalle
  • Etiqueta de enlace del mismo módulo en la sección de Callables — los enlaces en palegoldenrod desplazan el scroll dentro del modal abierto en lugar de navegar; ahora etiquetados
  • Resaltado de callables muertos — nombres y borde izquierdo usan el color de acento; los callables vivos permanecen neutros

Cambiado

  • Rediseño visual: paleta alineada con el lenguaje de diseño del proyecto — canvas negro, texto whitesmoke, acento salmon para código muerto, palegoldenrod para selección y enlaces del mismo módulo, gradiente azul→verde→rojo derivado de la Wiphala para frecuencia de commits
  • Ajuste de pantalla ahora desplaza el centro del grafo por la mitad del ancho de la leyenda para que el grafo no quede cubierto
  • Sin peticiones de fuentes externas — el HTML de salida es completamente autocontenido; se usa la fuente monoespaciada del sistema

[1.1.0] — 2026-05-24

Agregado

  • Capa de grafo de callables — seguimiento de dependencias a nivel de función/método/clase junto al grafo de módulos existente, unido por prefijo canónico (mod::Name pertenece al módulo mod)
  • Chain walker para ast.Attribute — resuelve llamadas cualificadas (estilo np.linalg.norm()) probando cada punto de división contra las definiciones del proyecto
  • Alias mapper extendido — cada forma de import contribuye una entrada nombre_local → canónico; las definiciones locales también se agregan para que las llamadas al mismo módulo se resuelvan
  • Aristas de herencia desde ClassDef.basesclass B(A) produce la arista B → A
  • Aristas de decoradores desde decorator_list — maneja @dec simple y @dec(arg) parametrizado de la misma forma
  • Fuente sintética mod::<module> para llamadas a nivel de módulo — puntos de entrada como cli() en __main__.py ya no se marcan falsamente como muertos
  • Coincidencia de nombres naive con alcance como fallback para obj.method() cuando obj no tiene información de tipos
  • Detección de callables muertos consciente de llamadas — un callable está muerto cuando su fan-in en el grafo es cero Y su canónico no aparece en el conjunto de imports del proyecto
  • Sección “Callables” por módulo en el modal — cada función/método/clase con su fan-in, fan-out, llamadas, llamado-por, y bandera de muerto
  • Referencias a funciones pasadas como argumentos Call rastreadas como aristas — cubre callbacks entregados a executors, sorted(key=...), map, decoradores por nombre
  • Anillo rojo discontinuo alrededor de cualquier círculo de módulo que contenga al menos un callable muerto

Cambiado

  • Parseo de archivos en un solo paso — cada módulo ahora se lee y parsea con AST una vez en lugar de tres; ~30% de speedup en tiempo real en un proyecto de 1 354 archivos (3.48s → 2.44s)
  • parse_calls ahora tiene alcance por caller — retorna call_edges: dict[source, set[target]] en lugar de un set plano de llamadas
  • symbols_to_review_detector reemplazado por dead_callables_detector a nivel de proyecto
  • Campo de payload de módulo symbols_to_review reemplazado por with_symbols_to_review (booleano)

Corregido

  • discover() ya no emite entradas Package duplicadas para directorios con muchos archivos .py
  • Los getter / setter / deleter de propiedades ya no colapsan en un canónico — cada rol obtiene un canónico distinto (mod::Class.bar@get, @set, @del)

Limitaciones conocidas

  • La resolución de obj.method() cae al matching naive cuando obj es una variable local sin información de tipos — la resolución precisa via anotaciones de tipo está planificada para v1.2
  • El seguimiento de referencias cubre callable-como-argumento; otros contextos (asignación, listas, retornos) aún se pierden — seguimiento completo de referencias es un ítem de v1.2

[1.0.3] — 2026-04-05

Agregado

  • Layout de circle packing jerárquico — los paquetes contienen sub-paquetes sin superposición de nodos
  • Codificación de color — relleno del nodo por frecuencia de commit (azul→rojo), brillo del borde del paquete por profundidad de anidamiento
  • Toggle de filtro de tests — mostrar/ocultar todos los nodos, aristas y paquetes con “test” en el nombre
  • Clic en nodo para seleccionar y abrir modal de detalle; clic en círculo de paquete para hacer zoom
  • Barra de búsqueda fuzzy — escribe un nombre de módulo, salta y lo resalta (/ para enfocar)
  • Atajos de teclado: F zoom to fit, / enfocar búsqueda, Esc deseleccionar/cerrar

Cambiado

  • Clic central para hacer pan en el canvas
  • Escape cierra el modal y deselecciona el nodo en un solo press
  • Longitud mínima de flecha para evitar aristas invisibles entre nodos cercanos

Corregido

  • Panning y zoom ahora con throttle rAF — suave a cualquier frecuencia de actualización de pantalla
  • Orden de dibujo de paquetes precomputado una vez en lugar de ordenado en cada frame

[1.0.2] — 2026-03-26

Corregido

  • Las estadísticas de git ahora se ejecutan desde la raíz correcta del proyecto (cwd=root)
  • module.full_path usado para leer archivos para que el CLI funcione desde cualquier directorio

[1.0.1] — 2026-03-26

Corregido

  • Los archivos de plantilla HTML y JS ahora están incluidos en el wheel
  • Las estadísticas de git ya no fallan en repos sin commits (fallback elegante)
  • El punto de entrada del CLI ahora lee correctamente sys.argv via la función cli()

[1.0.0] — 2026-03-25

Agregado

  • Lanzamiento inicial
  • Visualización de grafo de dependencias
  • Detección de código muerto, detección de ciclos, análisis de hotspots
  • Integración con Git (frecuencia de commits, churn, último autor)
  • Detección de símbolos no usados
  • CLI y API Python
  • Procesamiento paralelo consciente del GIL