pj
Control de proyectos locales en Go con TUI interactiva, cache local y comandos rapidos.

Repositorio: https://github.com/jad21/pj.git
pj esta pensado para el flujo diario: registrar proyectos, buscarlos en una vista bonita y entrar rapido a trabajar.
Que resuelve
- Catalogo local de proyectos con persistencia (
bbolt, sin servidor).
- Busqueda y filtro en TUI con datos de Git y tamano.
- Acceso rapido por nombre (
pj <name>).
- Operaciones de mantenimiento (
add, del, rename, limpieza de caches pesados).
- Inicio rapido: muestra cache primero y refresca metadatos en segundo plano.
Instalacion
Instalacion rapida (sin clone)
go install github.com/jad21/pj/cmd/pj@v0.1.1
Instalacion con Goblin
curl -sf https://goblin.run/github.com/jad21/pj | CMD_PATH="/cmd/pj" sh
Opcional (sin sudo, instala en el home):
curl -sf https://goblin.run/github.com/jad21/pj | CMD_PATH="/cmd/pj" PREFIX="$HOME/.local/bin" sh
Verificar:
pj --help
Desde Git
git clone https://github.com/jad21/pj.git
cd pj
go install ./cmd/pj
Si pj no se encuentra en la terminal, agregar el binario de Go al PATH:
export PATH="$PATH:$(go env GOPATH)/bin"
Desde el codigo local
Desde el root del proyecto:
go build -o "$GOPATH/bin/pj" ./cmd/pj
Verificar:
pj --help
Uso rapido
Registrar proyectos
# Agrega el directorio actual
pj add .
# Agrega varios paths de una vez
pj add ~/codes/app1 ~/codes/app2 /tmp/demo
# Agrega todos los subdirectorios inmediatos
pj add -a .
# Agrega subdirectorios de varias bases
pj add -a ~/codes ~/work
Listar y refrescar
# Lista usando cache (rapido)
pj list
# Fuerza recalc de branch/commit/size antes de listar
pj list --refresh
Renombrar y eliminar
pj rename viejo nuevo
pj del nuevo
pj del /ruta/absoluta/del/proyecto
Entrar por nombre
# Interactivo: abre shell dentro del proyecto
pj catalog
# Solo path (scripts, pipes, subshell)
pj catalog --path
pj catalog -p
# Ejemplo clasico para cd
cd "$(pj catalog --path)"
Si pj <name> no encuentra match exacto:
- Si hay una sola coincidencia por filtro, entra directo.
- Si hay varias (o ninguna), abre la TUI con ese filtro aplicado.
Reabrir ultima ruta
Sin editar ~/.bashrc, pj guarda la ultima ruta activa y puede reabrirla desde otra sesion:
# Abre shell en la ultima ruta guardada
pj last
# Solo imprime la ruta (para scripts)
pj last --path
Detalle: en shells bash, pj actualiza la ruta durante la sesion usando PROMPT_COMMAND; en otros shells guarda al menos la ruta inicial al entrar.
TUI
Ejecuta:
pj
La TUI muestra columnas:
NAME
BRANCH
COMMIT
LAST UPDATED
SIZE (humano)
PATH
Atajos
| Accion |
Tecla |
| Buscar/filter |
Escribir |
| Limpiar filtro / salir |
Esc |
| Navegar |
Flechas / rueda |
| Abrir shell en proyecto |
Enter |
| Limpiar carpetas pesadas |
Ctrl+L |
| Eliminar proyecto (con confirmacion) |
Ctrl+D |
| Renombrar proyecto (dialogo) |
Ctrl+N |
| Abrir con opener detectado |
Ctrl+O |
| Ordenar por columna |
Clic en titulo o F1..F6 |
| Invertir orden |
Ctrl+R |
| Salir |
Esc o Ctrl+C |
Limpieza desde TUI
La accion de limpieza elimina, en la raiz del proyecto seleccionado:
.venv
venv
node_modules
.cache
Luego recalcula y guarda el tamano actualizado.
Autocompletado (bash)
En ~/.bashrc:
if command -v pj >/dev/null 2>&1; then
source <(pj completion bash)
alias repo='pj'
fi
El proyecto ya soporta completion de nombres para pj/pg leyendo cache (pj names --cached) para que TAB responda rapido.
Recargar shell:
source ~/.bashrc
Rendimiento
pj (TUI) inicia con datos en cache y actualiza metadatos en segundo plano.
pj list usa cache por defecto.
pj list --refresh recalcula todo cuando hace falta precision inmediata.
- Completion de nombres consulta cache, no recalcula metadatos.
Persistencia
- DB:
$XDG_DATA_HOME/pj/projects.db
- Fallback:
~/.local/share/pj/projects.db
Reglas importantes
- No duplica proyectos por path.
- Tambien evita duplicados por symlink (
EvalSymlinks).
- Los paths bajo home se muestran compactados como
~/... en listados/TUI.
Stack
- Go + Cobra (CLI)
- Bubble Tea + Lip Gloss (TUI)
- bbolt (DB local)
Licencia
Este proyecto se distribuye bajo licencia MIT. Ver LICENSE.