Encuentra y limpia ramas locales olvidadas en tus repositorios git.
Explorar la documentación »
Reportar Bug
·
Solicitar Funcionalidad
Tabla de contenidos
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.
- 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 ramas —
main/mastery la rama actual están protegidas contra borrado/archivado.
- macOS
- Linux
- Windows con WSL
git clone https://github.com/raulfdeztdo/forgottenbranches.git
cd forgottenbranches
chmod +x install.sh update.sh uninstall.sh
./install.shEl script instala las dependencias, compila el proyecto y registra el comando forgottenbranches de forma global.
npm install forgottenbranches
# o
pnpm add forgottenbranchesAl 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 directamenteTambién puedes usarlo como API programática:
import { getBranches, deleteBranch, archiveBranch } from 'forgottenbranches';
const result = await getBranches('/path/to/repo');
console.log(result.branches);./update.shHace git pull, reinstala dependencias si hay nuevas y recompila. Si ya estás en la última versión te lo indica sin hacer nada.
# 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-appEn el modo interactivo, la aplicación muestra un prompt para elegir entre la interfaz web y la interfaz de terminal.
| 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) |
La TUI ofrece una experiencia interactiva completa directamente en la terminal, construida con Ink (React para terminal) y React 19.
| 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 |
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á.
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
- 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 protegidas —
main,mastery 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 TUI —
Spacepara seleccionar,a/d/r/Dpara 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).
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| 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 |
- Los tests se co-localizan con el código fuente (
src/foo.ts→src/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
# 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 buildEl backend escucha en localhost:3001 y el frontend en localhost:5173 con proxy de Vite hacia la API.
┌─────────────┐ ┌──────────────┐ ┌───────────┐
│ 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.
Distribuido bajo la licencia MIT. Ver LICENSE para más información.
Raúl Fernández Tirado — @raulfdeztdo
Repositorio: https://github.com/raulfdeztdo/forgottenbranches