Sobre el proyecto

vitals es un monitor de sistema para Macs con Apple Silicon que ejecutan macOS 14 o posterior. Un único binario de Rust muestrea la CPU, GPU, memoria, energía y estado térmico en proceso: no recurre a powermetrics, no requiere sudo y no inicia ningún subproceso de ningún tipo. La salida es JSON estructurado que un script, un agente o una persona pueden leer directamente. El mismo binario, ejecutado sin argumentos, es también un elemento de la bandeja de la barra de menú con un panel local opcional. Verbos de línea de comandos snapshot imprime una muestra completa del SoC: chip host y recuento de núcleos, utilización de la CPU en todo el sistema, entradas por núcleo con el tipo de núcleo (eficiencia o rendimiento), frecuencia y utilización, utilización y frecuencia de la GPU, totales y uso de memoria y swap, presión de memoria del kernel, cifras de energía para CPU, GPU, ANE, RAM y sistema, temperaturas de CPU y GPU, velocidades de ventilador con sus máximos, promedios de carga, tiempo de actividad y estado térmico. Una opción de intervalo cambia la ventana de muestreo sobre la cual se integran la CPU, la GPU y la residencia de energía. top clasifica los procesos por CPU y por memoria, de forma independiente y con un recuento de filas configurable, por lo que el mismo proceso puede aparecer en ambas listas. El porcentaje de CPU es por proceso en lugar de para todo el sistema, y puede superar el 100% en trabajos multicore, al igual que ps. pressure devuelve un veredicto en lugar de números brutos: un estado, una bandera que indica si existe un historial utilizable, una lista de razones con códigos y severidades, una lista de procesos sospechosos con la razón por la cual cada uno fue marcado y un resumen de una línea. Por diseño, sale con código cero al informar un estado desfavorable, ya que informar no es fallar. Una bandera de código de salida integra la severidad del veredicto en el estado (0 nominal, 3 advertencia, 4 crítico), mientras que un fallo de tiempo de ejecución sale con 1 y una invocación mal formada sale con 2. watch es el único verbo que no sale por sí mismo. Emite un objeto JSON compacto por línea, vaciado después de cada línea, y se ejecuta hasta que sea interrumpido o hasta que se emita el número de muestras solicitado. El intervalo establece tanto la cadencia como la ventana de muestreo. Debido a que la salida se vacía por línea, un consumidor que lee una línea y cierra la tubería obtiene una salida limpia. Siempre es JSON delimitado por saltos de línea y rechaza la bandera JSON. JSON es el valor predeterminado para snapshot, top y pressure; cada uno acepta también una forma de texto legible para humanos para terminales, y la bandera JSON se acepta como una operación nula. Cada respuesta lleva una versión de esquema. Las unidades residen en los nombres de las claves (memoria en MB, energía en vatios, temperaturas en Celsius) en lugar de en campos separados, y los campos opcionales ausentes se omiten en lugar de emitirse como null. App de barra de menú y panel Ejecutado sin argumentos, vitals es una bandeja de la barra de menú con texto en vivo y un menú desplegable personalizado que cubre la CPU (una sparkline más una barra por núcleo, con núcleos de eficiencia y rendimiento tintados de forma diferente), GPU, memoria juzgada por la señal de presión del kernel y energía. Los valores principales cambian de color en los umbrales, nada se redibuja mientras el desplegable está cerrado y la cadencia de muestreo disminuye mientras la pantalla duerme. La app se declara como un accesorio, por lo que no tiene icono en el Dock ni entrada en el conmutador de apps hasta que se solicita una ventana. Se puede abrir un panel desde el desplegable o volviendo a abrir la app en ejecución, y se abre en una ventana nativa respaldada por una vista web, como su propio proceso. Mientras está abierto, tiene un mosaico en el Dock y un menú de app; cuando se cierra, ese proceso finaliza, lo que mantiene un panel cerrado a coste cero. Si la bandeja se cierra o falla, la ventana lo nota a través de una vigilancia de descriptor de archivo y sale rápidamente. El servidor HTTP se ejecuta dentro del proceso de la bandeja y se inicia bajo demanda, por lo que una bandeja a la que nunca se le ha pedido el panel no tiene oyente ni un segundo muestreador. La página del panel está construida para leerse de arriba hacia abajo: el mismo veredicto que produce el verbo pressure, cuatro mosaicos para CPU, GPU, memoria y energía con cifra principal, punto de estado, línea de contexto y tendencia, un control de rango para 2, 5 o 15 minutos que define el alcance de todo lo que está debajo, gráficos de CPU y GPU a lo largo del tiempo con una retícula y tooltip, una barra por núcleo etiquetada por posición con la velocidad de reloj al pasar el cursor, medidores de memoria y swap cuyo llenado sigue la señal de presión del kernel, y procesos top con barras integradas. Cada gráfico tiene un interruptor de gráfico o tabla para los mismos datos, el sondeo se detiene cuando la página está oculta, el último renderizado correcto permanece en pantalla atenuado si el servidor desaparece, y el tema claro u oscuro sigue al sistema. Instalación y empaquetado Dos rutas de instalación independientes terminan con vitals en el PATH. Una compilación seguida de una instalación crea un enlace simbólico del binario de release en un directorio bin de prefijo (anule el prefijo para evitar sudo, y un objetivo de desinstalación elimina el enlace simbólico). La ruta de instalación de la app compila, empaqueta, copia la app en la carpeta Aplicaciones, instala un agente de lanzamiento por usuario para que la bandeja se inicie en cada inicio de sesión y redirige el mismo enlace simbólico a la copia del paquete; un objetivo de desinstalación correspondiente revierte todo ello. El paquete está firmado ad-hoc en lugar de notarizado, lo cual es suficiente para la ejecución del agente de lanzamiento; abrir la app a través de Finder puede requerir un clic derecho en Abrir por única vez o aprobación en Ajustes del Sistema. Desarrollo La compilación, las pruebas, clippy-con-advertencias-como-errores y el formateo tienen objetivos de make. El panel es una app de Vite y React cuya salida de compilación de producción se incrusta en el binario en tiempo de compilación, por lo que el binario debe reconstruirse después de la página. Un servidor de desarrollo con recarga en caliente actúa como proxy de las solicitudes de API al puerto local, por lo que funciona con cualquier instancia en ejecución, incluida la que está dentro de la bandeja. La contribución se realiza a través de informes de errores, mediciones y pull requests, con un canal separado para vulnerabilidades. El proyecto tiene licencia MIT.