npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

forgottenbranches

v1.0.5

Published

Find and clean up abandoned local git branches

Readme

Contributors Forks Issues License Release

Sobre el proyecto

Muchas veces se suben ramas a producción, se mergean y se quedan abandonadas en local sin que nadie las borre. Con el tiempo se acumulan decenas de ramas que ensucian el output de git branch y dificultan el día a día.

Forgotten Branches escanea cualquier repositorio git, analiza cada rama local y te dice cuáles son seguras de eliminar, cuáles es mejor archivar y cuáles están activas. Ofrece dos interfaces: una Web UI que se abre en el navegador y una Terminal UI (TUI) interactiva con navegación por teclado.

¿Por qué esta herramienta?

  • Sin depender de un servidor — Todo se ejecuta en local, sin conexión externa.
  • Clasificación inteligente — No solo lista ramas: las clasifica según su estado real (mergeadas, huérfanas, abandonadas...).
  • Dos interfaces — Web UI moderna con tema One Dark Pro, y TUI interactiva para la terminal (Ink + React).
  • Archivado — Guarda el historial de ramas que ya no necesitas sin perder la referencia.
  • Borrado en masa — Limpia decenas de ramas en segundos.
  • Protección de ramasmain/master y la rama actual están protegidas contra borrado/archivado.

Plataformas soportadas

  • macOS
  • Linux
  • Windows con WSL

Primeros pasos

Prerrequisitos

  • Node.js 18 o superior
  • pnpm 9 o superior (npm install -g pnpm)
  • Git 2.30 o superior

Instalación

Instalación global (recomendada)

git clone https://github.com/raulfdeztdo/forgottenbranches.git
cd forgottenbranches
chmod +x install.sh update.sh uninstall.sh
./install.sh

El script instala las dependencias, compila el proyecto y registra el comando forgottenbranches de forma global.

Instalación como dependencia de proyecto (npm)

npm install forgottenbranches
# o
pnpm add forgottenbranches

Al instalarlo como dependencia, la herramienta detecta automáticamente el proyecto actual (process.cwd()) y escanea sus ramas sin necesidad de introducir la ruta manualmente.

npx forgottenbranches            # prompt Web/TUI para el proyecto actual
npx forgottenbranches --tui      # TUI directamente
npx forgottenbranches --web      # Web UI directamente

También puedes usarlo como API programática:

import { getBranches, deleteBranch, archiveBranch } from 'forgottenbranches';

const result = await getBranches('/path/to/repo');
console.log(result.branches);

Actualizar

./update.sh

Hace git pull, reinstala dependencias si hay nuevas y recompila. Si ya estás en la última versión te lo indica sin hacer nada.

Uso

# Modo interactivo — elige entre Web UI y Terminal
forgottenbranches

# Web UI directamente (abre el navegador)
forgottenbranches --web

# Terminal UI directamente
forgottenbranches --tui

# Abrir y escanear un repo directamente
forgottenbranches --web /home/usuario/proyectos/mi-app
forgottenbranches --tui /home/usuario/proyectos/mi-app

En el modo interactivo, la aplicación muestra un prompt para elegir entre la interfaz web y la interfaz de terminal.

Estados de las ramas

| Estado | Color | Significado | |--------|-------|-------------| | Active | 🟢 | Actividad reciente, en uso | | Forgotten | 🔴 | Mergeada en main + upstream borrado del remoto | | Orphan | 🟠 | Upstream borrado del remoto, sin mergear | | Merged | 🟡 | Ya está en main, upstream sigue vivo | | Abandoned | ⚪ | Sin actividad en +90 días (o +60 sin upstream) |

Terminal UI (TUI)

La TUI ofrece una experiencia interactiva completa directamente en la terminal, construida con Ink (React para terminal) y React 19.

Navegación por teclado

| Tecla | Acción | |---|---| | / | Navegar entre ramas / ciclar filtros | | / | Cambiar campo de ordenación | | Enter | Expandir/colapsar detalle de rama | | Space | Seleccionar/deseleccionar rama | | Tab | Alternar vista Branches / Archived | | / | Editar la ruta del repositorio | | s | Escanear repositorio | | f | Enfocar filtros (estado y orden) | | a | Archivar rama(s) seleccionada(s) | | d | Eliminar rama(s) seleccionada(s) | | r | Restaurar rama archivada (en vista Archived) | | D | Eliminar permanentemente archivada | | q / Esc | Salir |

Operaciones en masa

Selecciona varias ramas con Space y ejecuta la acción (a archivar / d eliminar / r restaurar). Un contador muestra cuántas ramas están seleccionadas y qué acción se ejecutará.

Ramas protegidas

Las ramas main, master y la rama actualmente activa (checked-out) están protegidas contra archivado y eliminación, tanto en la Web UI como en la TUI.

  • Indicador visual: icono 🔒 junto al nombre de la rama
  • Motivo: tooltip/texto indicando si es "main branch" o "current checked-out branch"
  • Acciones bloqueadas: los botones de Archive/Delete se ocultan o muestran un mensaje explicativo

Funcionalidades

  • Dos interfaces — Web UI (One Dark Pro) y Terminal UI (Ink + React) con navegación completa por teclado.
  • Análisis completo por rama — nombre, upstream, último commit (hash, autor, fecha, mensaje), antigüedad, último checkout del reflog.
  • Información de merge — qué commit la mergeó en main, cuándo y con qué mensaje.
  • Panel de detalle desplegable — clic en cualquier rama para ver todos los datos (Web UI); para expandir (TUI).
  • Ramas protegidasmain, master y rama actual marcadas con 🔒. No se pueden archivar ni borrar.
  • Vista de archivadas — Tab para alternar entre ramas activas y archivadas. Restaurar o eliminar permanentemente.
  • Eliminar ramas — individual o en masa, con borrado seguro (-d) o forzado (-D).
  • Archivar ramas — crea un tag anotado archive/<nombre> y borra la rama local.
  • Desarchivar — restaura la rama desde el tag de archivo.
  • Selección múltiple — checkboxes en cada fila con barra de acciones para operar sobre varias ramas a la vez.
  • Operaciones en masa en TUISpace para seleccionar, a/d/r/D para actuar sobre todas las seleccionadas.
  • Historial de proyectos — las rutas escaneadas se guardan en localStorage (Web UI).
  • Filtros — por nombre de rama y por estado mediante pills interactivas (Web) o teclado (TUI).
  • Ordenación — por nombre, fecha de commit, antigüedad o estado (por defecto: activas primero).

Testing

El proyecto incluye una suite completa de tests automatizados que cubren backend, frontend, y flujos end-to-end.

pnpm test              # Unit + integration tests (Vitest)
pnpm test:watch        # Modo watch
pnpm test:ui           # Interfaz visual de Vitest
pnpm test:coverage     # Reporte de cobertura
pnpm test:e2e          # Tests end-to-end (Playwright)
pnpm test:e2e:ui       # Playwright UI
pnpm test:all          # Todos los tests

Estructura de tests

| Capa | Tecnología | Ubicación | |---|---|---| | Lógica git (git.ts) | Vitest + mock child_process | server/src/git.test.ts | | API REST (app.ts) | Vitest + supertest | server/src/app.test.ts | | Componentes React | Vitest + Testing Library + jsdom | client/src/components/*.test.tsx | | End-to-end | Playwright (Chromium) | e2e/*.spec.ts |

Convenciones

  • Los tests se co-localizan con el código fuente (src/foo.tssrc/foo.test.ts)
  • TDD siempre que sea posible: escribe el test antes del código
  • Antes de un PR: pnpm run build && pnpm test && pnpm test:e2e
  • Más información en .agents/skills/testing/SKILL.md

Desarrollo

# Instalar dependencias (workspaces server + client en un solo comando)
pnpm install

# Iniciar servidores de desarrollo (Express :3001 + Vite :5173)
pnpm run dev

# Compilar para producción
pnpm run build

El backend escucha en localhost:3001 y el frontend en localhost:5173 con proxy de Vite hacia la API.

Cómo funciona

┌─────────────┐      ┌──────────────┐     ┌───────────┐
│  React UI   │────▶│  Express API │────▶│  git CLI  │
│  (Vite)     │◀────│  (Node.js)   │◀────│  (local)  │
└─────────────┘      └──────────────┘     └───────────┘

El backend Express ejecuta comandos git directamente sobre tus repositorios locales usando child_process. El frontend React muestra los resultados en una interfaz con tema One Dark Pro. En producción, un solo proceso Node.js sirve tanto la API como el frontend compilado — no necesitas arrancar dos procesos.

Todo ocurre en tu máquina. No se envía ningún dato al exterior.

Licencia

Distribuido bajo la licencia MIT. Ver LICENSE para más información.

Contacto

Raúl Fernández Tirado — @raulfdeztdo

Repositorio: https://github.com/raulfdeztdo/forgottenbranches