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.bases — class 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 llamadassymbols_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