Asistente visual de Git con terminal de comandos en tiempo real.
╔══════════════════════════════════╗ ║ $ git add . ║ ║ $ git commit -m "fix: login" ║ ← Comandos en vivo ║ $ git push ║ con animación ║ ✔ Todo sincronizado ║ ╚══════════════════════════════════╝
Cada comando se muestra antes de ejecutarse.
Sin backend. Sin telemetría. 100% local.
| Característica | Descripción | |
|---|---|---|
| 🖥️ | Terminal visual | Cada comando git aparece con animación de escritura. Color verde sobre fondo oscuro. |
| 🔐 | Aprobación manual | Los comandos requieren clic "Ejecutar"/"Cancelar" antes de correr. Los destructivos piden doble confirmación. |
| ⚡ | Acciones rápidas | Quick Commit, Sync, Nueva rama, Undo commit, Descartar cambios. Todo en un clic. |
| 🐙 | GitHub integrado | Login con token, crear repos, push, pull, fork, PRs, merge. Sin salir de la app. |
| 📜 | Historial persistente | Todos los comandos ejecutados se guardan localmente. Filtro por comando o rama. |
| 🧠 | Commit messages | Generación automática basada en archivos modificados. Hook listo para conectar un LLM. |
git clone https://github.com/tu-usuario/easygit
cd easygit
npm install
npm run devRequisitos: Node.js 18+, Git instalado en el sistema.
- Abre EasyGit →
npm run dev - Sidebar izquierdo → "abrir repositorio" → selecciona tu proyecto
- O → "init nuevo repo" para crear uno nuevo
- Pestaña GitHub → "Conectar con GitHub"
- Crea un token en github.com/settings/tokens
- Permisos:
repo(Read y Write),Pull requests(Read y Write)
- Permisos:
- Pega el token → Conectar
1. Abre EasyGit → abre tu proyecto local
2. Tab GitHub → "Nuevo repositorio"
3. Configura:
┌─────────────────────────────────┐
│ Nombre: mi-proyecto │
│ Descripción: Un proyecto genial│
│ Visibilidad: ○ Público 🔒 Priv│
│ README: ✔ │
│ .gitignore: Node │
│ Licencia: MIT │
└─────────────────────────────────┘
4. Clic → "Crear repo y subir código"
→ Repo creado en GitHub
→ Remote configurado automáticamente
→ Código subido con git push
| Botón | Comandos | Descripción |
|---|---|---|
| Quick Commit | add . + commit -m + push |
Sube cambios en 1 clic |
| Sync | git pull |
Trae cambios del remoto |
| Nueva rama | checkout -b + push -u |
Crea rama y la sube |
| Undo commit | reset --soft HEAD~1 |
Deshace el último commit (seguro) |
| Descartar cambios 🔴 | restore . |
Destructivo — requiere doble confirmación |
| Acción | Descripción |
|---|---|
| Push | Sube cambios al remoto |
| Pull | Trae cambios del remoto |
| Fork | Forkea el repo actual a tu cuenta |
| New PR | Crea pull request (título, base, head, descripción) |
| Merge PR | Mergea PRs directamente desde la lista |
| Crear repo | Con nombre, descripción, visibilidad, .gitignore y licencia |
| Listar repos | Tus repos de GitHub con URL para clonar |
┌────────────────────────────────────────────────────┐
│ ⚡ EasyGit │ mi-repo │ ← Title bar
├──────────┬─────────────────────────────────────────┤
│ │ [Repo] [GitHub] [Historial] │ ← Tabs
│ Sidebar │ │
│ │ ● Rama: main │
│ Repos │ ahead: 2 behind: 0 clean: false │
│ favs │ │
│ │ Archivos modificados: │
│ Rama │ [M] src/index.js │
│ actual │ [A] src/nuevo.js │
│ │ │
│ │ [Quick Commit] [Sync] [New branch] │
│ │ [Undo commit] [⚠️ Descartar cambios] │
├──────────┴─────────────────────────────────────────┤
│ $ Terminal │
│ $ git add . ● │ ← Escribiendo...
│ $ git commit -m "modifica: src/" ✔ │ ← Exitoso
└────────────────────────────────────────────────────┘
| Aspecto | Cómo se maneja |
|---|---|
| Credenciales Git | No se guardan. Usa credential helper del sistema o SSH keys. |
| GitHub Token | Se almacena en electron-store (JSON local en ~/.config/easygit/). |
| Ejecución de comandos | child_process.execFile() — sin shell intermedio, sin riesgo de inyección. |
| Argumentos | Escapados contra caracteres especiales en nombres de rama o mensajes. |
| Comandos destructivos | restore ., reset --hard → doble confirmación con modal rojo. |
| Force push | No implementado. Explícitamente omitido por seguridad. |
| Telemetría | Cero. No hay backend, no hay recolección de datos. |
| Conexiones externas | Solo las que tú inicias (push, pull, fork, PR a GitHub). |
// ✅ SEGURO — Argumentos como array, sin shell
execFile('git', ['commit', '-m', message], { cwd: repoPath })
// ❌ PELIGROSO — Shell interpreta el string, permite inyección
exec(`git commit -m "${message}"`)| Capa | Tecnología | Propósito |
|---|---|---|
| Shell | Electron 29 | Ventana de escritorio, IPC entre procesos |
| UI | React 18 | Componentes reactivos, estado con hooks |
| Estilos | Tailwind CSS 3 | Tema oscuro hacker, colores #b8cc52 / #95e6cb |
| Git (parseo) | simple-git |
Status, branches, log como objetos JS |
| Git (ejecución) | child_process.execFile |
Comando exacto en string para la terminal |
| Persistencia | electron-store |
JSON local, sin base de datos |
| GitHub API | https nativo |
Llamadas directas sin dependencias externas |
| Fuente | JetBrains Mono / Fira Code | Monoespaciada para la terminal |
simple-git |
child_process.execFile |
|---|---|
| API limpia para leer estado del repo | Captura el string exacto del comando |
Parsea automático: status, branches, log |
Necesario para mostrar en la terminal visual |
| Devuelve objetos JS listos para la UI | Muestra $ git add . letra por letra |
easygit/
├── src/
│ ├── main/ # Proceso principal de Electron
│ │ ├── main.js # Entry point, IPC handlers
│ │ ├── preload.js # Bridge seguro renderer ↔ main
│ │ ├── gitService.js # Wrapper de git (simple-git + execFile)
│ │ ├── githubService.js # API de GitHub vía HTTPS nativo
│ │ └── storeService.js # Persistencia local (electron-store)
│ ├── renderer/ # UI con React
│ │ ├── index.html
│ │ ├── main.jsx # Entry point React
│ │ ├── App.jsx # Componente principal, lógica de acciones
│ │ ├── index.css # Tailwind + estilos terminal
│ │ └── components/
│ │ ├── Sidebar.jsx # Repos favoritos, ramas
│ │ ├── RepoPanel.jsx # Estado, archivos, acciones
│ │ ├── TerminalPanel.jsx # Terminal con animación de escritura
│ │ ├── GitHubPanel.jsx # Login, push, fork, PRs, crear repo
│ │ └── HistoryPanel.jsx # Historial de comandos
│ └── store/ # Estado del renderer (hooks React)
│ └── repoStore.js
├── dist/ # Build de producción
├── package.json
├── vite.config.js
├── tailwind.config.js
├── postcss.config.mjs
└── README.md
| Dato | Almacenamiento | Propósito |
|---|---|---|
| Historial de comandos | electron-store (JSON) |
Auditoría, pestaña Historial |
| Repos favoritos | electron-store (JSON) |
Sidebar, acceso rápido |
| GitHub token | electron-store (JSON) |
Evitar pegar el token cada vez |
| GitHub user info | electron-store (JSON) |
Mostrar avatar y nombre |
NO guarda: contenido de archivos, diffs completos, credenciales de Git, estadísticas de uso, ni ningún dato fuera de tu máquina.
Archivo de datos: ~/.config/easygit/easygit-data.json
Modo sin IA (incluido):
modifica: src/, docs/; añade: 2 archivos
Hook para LLM (opcional):
Editar src/renderer/App.jsx → función generateCommitMessage(). Ahí tienes acceso a status con archivos modificados, staged y diff. Conecta cualquier API (Anthropic, OpenAI, etc.) y devuelve el mensaje siguiendo Conventional Commits.
| Error | Causa | Solución |
|---|---|---|
GPU process isn't usable |
Sin GPU en el entorno | En máquina real funciona. Si persiste: electron . --disable-gpu |
ERR_CONNECTION_REFUSED |
Vite no arrancó antes que Electron | wait-on lo maneja. Si no: arranca Vite aparte |
| Push rechazado | Rama desactualizada | Pull primero, resuelve conflictos, push |
| Token inválido | Token expiró o sin permisos | Generar nuevo token con alcance repo |
remote already exists |
Remote ya configurado | La app hace set-url automáticamente |
MIT — Haz lo que quieras con este proyecto.
Hecho con ⚡ para desarrolladores que quieren ver qué está pasando.