Si eres PM y la palabra terminal te da ansiedad, este módulo es para ti.
Déjame adivinar: cuando necesitas un dato de una API, le pides a un ingeniero que te lo consiga. Cuando quieres saber cuántas estrellas tiene un repo de GitHub, abres el navegador. Cuando necesitas transformar un JSON, lo pegas en un conversor online. No está mal. Pero es lento. Y lo peor: te hace dependiente.
La CLI no es solo para developers. En este módulo no vas a aprender a programar: vas a aprender a pedirle datos a una API sin abrir el navegador, a navegar archivos y a transformar datos con comandos que caben en una línea. Sin mouse. Sin pedirle permiso a nadie.
Cuando el desarrollador te diga "te mando el endpoint", tú vas a responder: "dame 5 minutos y te cuento qué encontré".
Vamos.
2.1. La Terminal es un Micrófono, No un Taladro
El mayor miedo del PM no técnico es: "si escribo el comando equivocado, voy a romper algo."
Piensa en la terminal como un micrófono: le dices a la computadora qué hacer, y ella responde. Si el comando está mal, solo recibes un mensaje de error. Nadie se lastima.
La terminal local no puede romper nada importante a menos que ejecutes comandos destructivos como rm -rf / (borrar todo). Y ese comando no se escribe por accidente.
Analogía (Producción Audiovisual): cuando un editor de video abre la línea de tiempo ve capas, clips y transiciones. Parece complejo, pero cada acción tiene un atajo de teclado. La terminal es lo mismo: atajos que, una vez memorizados, son más rápidos que el mouse.
2.2. El Mapa de la Terminal
Todo empieza por entender qué te está diciendo el prompt:
Comandos básicos de navegación:
| Comando | Qué hace |
|---|---|
pwd | ¿Dónde estoy? (Print Working Directory) |
ls | ¿Qué hay aquí? (List) |
cd carpeta | Ir a carpeta |
cd .. | Subir un nivel |
cd ~ | Ir a home (siempre puedes volver aquí) |
clear | Limpiar la pantalla |
Siempre puedes volver a casa con cd ~. No importa cuán perdido estés.
2.3. Git para PMs: Lo Mínimo que Necesitas Saber
No vas a ser contributor. Pero sí necesitas entender el flujo de datos de Git:
Comandos que usarás como PM:
# Clonar un repositorio (bajar archivos a tu máquina)
git clone https://github.com/usuario/repo.git
# Ver el estado de los archivos
git status
# Ver qué cambió entre versiones
git diff
# Bajarte los cambios más recientes
git pull
# Ver el historial de cambios
git log --oneline
# Crear una rama para trabajar sin romper nada
git checkout -b nombre-de-tu-rama
# Subir tus cambios
git add -A
git commit -m "descripción del cambio"
git push origin nombre-de-tu-rama
No necesitas saber mergear ni resolver conflictos. Con clone, pull, status, add, commit y push puedes gestionar documentos de especificaciones sin depender de nadie.
2.4. cURL: El Navegador sin Ventanas
cURL es la herramienta que te permite hablar con servidores sin abrir el navegador. Cualquier operación CRUD de una API REST puedes hacerla con cURL:
curl URL-X POST -d '{...}'-X PUT .../items/1-X DELETE .../items/1# GET: Obtener datos
curl https://api.github.com/repos/github/spec-kit
# GET con headers (autenticación)
curl -H "Authorization: Bearer TOKEN" https://api.github.com/user
# POST: Crear datos
curl -X POST https://api.ejemplo.com/items \
-H "Content-Type: application/json" \
-d '{"nombre": "Nuevo Item", "precio": 100}'
# PUT: Actualizar datos
curl -X PUT https://api.ejemplo.com/items/1 \
-H "Content-Type: application/json" \
-d '{"precio": 150}'
# DELETE: Borrar datos
curl -X DELETE https://api.ejemplo.com/items/1
cURL es como pedir comida por teléfono en vez de usar una app. La app (navegador) es más bonita, pero el teléfono (cURL) funciona siempre, con cualquier restaurante, sin instalar nada nuevo.
2.5. jq: El Filtro para JSON
Las APIs devuelven JSON. Los humanos no leen JSON fácilmente. jq es el puente:
Si ejecutas curl https://api.github.com/repos/github/spec-kit, obtienes un bloque enorme de JSON. Con jq, extraes solo lo que necesitas:
# Obtener solo el nombre del repo
curl -s https://api.github.com/repos/github/spec-kit | jq '.name'
# Obtener la descripción
curl -s https://api.github.com/repos/github/spec-kit | jq '.description'
# Obtener el número de estrellas
curl -s https://api.github.com/repos/github/spec-kit | jq '.stargazers_count'
# Obtener múltiples campos
curl -s https://api.github.com/repos/github/spec-kit | jq '{nombre: .name, estrellas: .stargazers_count, issues: .open_issues_count}'
El flag -s en cURL significa "silent" (no mostrar barras de progreso). Sin él, ves ruido técnico. Con él, solo ves la respuesta.
-
Preparar el entorno
Windows:
- Instala Git Bash desde git-scm.com. Esto te da una terminal bash + git + cURL.
- Instala jq:
winget install jqlang.jq(PowerShell como administrador).
macOS:
- Terminal viene incluida. Ábrela desde Spotlight.
- Instala jq:
brew install jq.
Linux:
- Instala jq:
sudo apt install jq.
Verifica que todo funciona:
# Esto debería mostrar las versiones de cada herramienta git --version curl --version jq --version -
Ejercicio 1: Navegar como un PM
Abre Git Bash (Windows) o Terminal (macOS/Linux).
# ¿Dónde estoy? pwd # ¿Qué hay aquí? ls # Crea una carpeta para el curso mkdir product-operator # Entra a la carpeta cd product-operator # Crea 3 subcarpetas: specs, scripts, benchmarks mkdir specs scripts benchmarks # Verifica que se crearon ls -la # -la muestra archivos ocultos y detallesQué aprendiste:
mkdir(make directory),ls -la(list con detalles),cd(change directory). -
Ejercicio 2: Tu primer archivo desde la terminal
# Crea un archivo de especificación vacío touch specs/login-feature.md # Escribe contenido en el archivo echo "# Feature: Login con Google" > specs/login-feature.md echo "**Prioridad:** P1" >> specs/login-feature.md echo "**Esfuerzo:** 5 puntos" >> specs/login-feature.md # Ver el contenido del archivo cat specs/login-feature.md # Agregar más contenido echo "## Criterios de Aceptación" >> specs/login-feature.md echo "- [ ] Usuario puede iniciar sesión con Google" >> specs/login-feature.md echo "- [ ] Usuario existente puede vincular cuenta" >> specs/login-feature.md # Ver el resultado cat specs/login-feature.mdQué aprendiste:
touch(crear archivo vacío),echo >(escribir),echo >>(agregar),cat(ver contenido). -
Ejercicio 3: Obtener datos reales con cURL + jq
Vamos a consultar datos reales de GitHub para hacer benchmark de repositorios de herramientas que usas como PM.
~108kestrellas de github/spec-kit — dato que vas a consultar tú, sin navegador1 líneade comando para extraer repo, estrellas, issues y descripción# Consultar datos del repo de Spec Kit curl -s https://api.github.com/repos/github/spec-kit | jq '{repo: .full_name, estrellas: .stargazers_count, issues: .open_issues_count, descripcion: .description}'Respuesta esperada (valores aproximados):
{ "repo": "github/spec-kit", "estrellas": 108000, "issues": 264, "descripcion": "Toolkit to help you get started with Spec-Driven Development" }Ahora compara con otro repo que te interese:
# Consultar otro repo curl -s https://api.github.com/repos/n8n-io/n8n | jq '{repo: .full_name, estrellas: .stargazers_count, issues: .open_issues_count}'Ejercicio: consulta 3 repositorios de herramientas que uses (o te interesen) y responde:
- ¿Cuál tiene más estrellas? (popularidad)
- ¿Cuál tiene más issues abiertos? (posible señal de mantenimiento tenso)
-
Ejercicio 4: Operaciones CRUD en un servicio de prueba
Usaremos JSONPlaceholder, una API falsa para practicar:
# GET — Leer datos echo "=== GET: Obtener todos los posts ===" curl -s https://jsonplaceholder.typicode.com/posts | jq '.[0:2]' # .[0:2] significa "los primeros 2 elementos del array" # GET — Leer un elemento específico echo "=== GET: Post #1 ===" curl -s https://jsonplaceholder.typicode.com/posts/1 | jq '.' # POST — Crear un nuevo recurso echo "=== POST: Crear post ===" curl -s -X POST https://jsonplaceholder.typicode.com/posts \ -H "Content-Type: application/json" \ -d '{ "title": "Mi primer post desde la terminal", "body": "Esto lo escribió un PM sin abrir el navegador", "userId": 1 }' | jq '.' # PUT — Actualizar un recurso existente echo "=== PUT: Actualizar post #1 ===" curl -s -X PUT https://jsonplaceholder.typicode.com/posts/1 \ -H "Content-Type: application/json" \ -d '{ "id": 1, "title": "Post actualizado", "body": "Este post fue modificado desde la terminal", "userId": 1 }' | jq '.' # DELETE — Borrar un recurso echo "=== DELETE: Borrar post #1 ===" curl -s -X DELETE https://jsonplaceholder.typicode.com/posts/1 | jq '.'Qué aprendiste: CRUD desde la terminal. Este es el mismo patrón que usa cualquier API REST. Si puedes hacer esto, puedes hablar con casi cualquier API.
-
Ejercicio 5: Git para tu Spec Kit
# Configura tu identidad (solo la primera vez) git config --global user.name "Tu Nombre" git config --global user.email "tu@email.com" # Inicializa tu carpeta como repositorio git cd ~/product-operator git init # Agrega todos los archivos git add -A # Guarda la primera versión git commit -m "init: estructura inicial del spec kit" # Ver el historial git log --oneline # Conéctalo a GitHub (crea el repo vacío en GitHub primero) # git remote add origin https://github.com/tu-usuario/product-operator.git # git push -u origin mainPara el PM: Con esto ya puedes versionar tus documentos. Cada cambio queda registrado. Si alguien pregunta "¿cuándo cambió ese requerimiento?", abres
git logy tienes la respuesta.
4.1. El Cheatsheet del PM (Póntelo en la Pared)
Navegación
| Comando | Acción |
|---|---|
pwd | ¿Dónde estoy? |
ls | ¿Qué hay aquí? |
cd carpeta | Ir a carpeta |
cd .. | Subir nivel |
cd ~ | Volver a casa |
Archivos
| Comando | Acción |
|---|---|
cat archivo | Ver contenido |
touch archivo | Crear archivo |
mkdir carpeta | Crear carpeta |
cp a b | Copiar a → b |
mv a b | Mover / renombrar a → b |
rm archivo | Borrar archivo |
cURL
| Comando | Acción |
|---|---|
curl URL | GET (leer) |
curl -X POST URL ... | Crear |
curl -X PUT URL ... | Actualizar |
curl -X DELETE URL | Borrar |
curl -s URL | jq '.' | GET + formatear JSON |
Git
| Comando | Acción |
|---|---|
git status | Estado actual |
git add -A | Preparar todo |
git commit -m | Guardar versión |
git push | Subir a GitHub |
git pull | Bajar cambios |
git log --oneline | Historial |
4.2. Automatización Simple para tu Día a Día
Alias útiles para tu terminal:
Agrega estas líneas a tu archivo ~/.bashrc (Linux/Git Bash) o ~/.zshrc (macOS):
# Tu identidad como PM digital
alias gh-repo='curl -s https://api.github.com/repos/'
# Ver métricas de un repo rápido
gh-metrics() {
curl -s "https://api.github.com/repos/$1" | jq '{estrellas: .stargazers_count, forks: .forks_count, issues: .open_issues_count}'
}
# Uso: gh-metrics github/spec-kit
4.3. Entregable del Módulo
Parte A — Bitácora de comandos. Ejecuta los ejercicios y guarda el historial:
- Crea la estructura de carpetas de tu Spec Kit desde la terminal. (Ejercicio 1)
- Crea un archivo de especificación con
echoycat. (Ejercicio 2) - Consulta 2 APIs distintas con cURL + jq: una real (GitHub) y una de prueba (JSONPlaceholder). Guarda los resultados en archivos. (Ejercicios 3 y 4)
- Inicializa git en tu carpeta y haz tu primer commit. (Ejercicio 5)
Para guardar el historial: history | tail -50 > bitacora-comandos.md
Parte B — Script de consulta personalizado. Escribe un script en bash (o PowerShell) que consulte una API que te interese y extraiga información relevante para tu trabajo. Ejemplo: el estado de los repositorios de tu equipo (issues abiertos, PRs pendientes). Apóyate en el kit del módulo: cheatsheet-comandos.md y aliases-pm.sh.
Formato de entrega — un archivo Markdown con:
- El historial de comandos (mínimo 15 comandos distintos ejecutados).
- El script personalizado que creaste.
- Una reflexión de 3 líneas: "¿Qué tarea que antes le pedía a un desarrollador ahora puedo hacer yo desde la terminal?"
- Error: copiar comandos desde un documento con comillas tipográficas (“ ”) — bash no las entiende. Corrección: escribe las comillas rectas (") directamente en la terminal.
- Error: olvidar el flag
-sen cURL y encadenar con jq entre barras de progreso. Corrección: usa siemprecurl -s URL | jqcuando filtres la salida. - Error: ejecutar
git add -Aen la carpeta equivocada (por ejemplo, tu home completo). Corrección: verifica conpwdygit statusantes de agregar. - Error: JSON mal formado en POST/PUT (comas finales, comillas simples en las claves).
Corrección: valida primero con
echo '{...}' | jq '.'— si jq lo lee, el servidor también. - Error: borrar con comodines sin verificar (
rm *.md). Corrección: lista primero conls *.md; lo que ves es exactamente lo que se borrará.
| Criterio | No Aprobado (0) | Aprobado (1) | Sobresaliente (2) |
|---|---|---|---|
| 1. Ejecuta correctamente operaciones CRUD con cURL | Los comandos fallan por errores de sintaxis (faltan flags, comillas mal cerradas, URLs mal escritas) | Los comandos GET funcionan pero los comandos POST/PUT/DELETE tienen errores en el formato JSON o en los headers | Los 4 verbos CRUD funcionan correctamente, el PM entiende la diferencia entre GET, POST, PUT y DELETE, y puede consultar APIs no vistas en clase |
| 2. Usa jq para extraer campos específicos de JSON | No usa jq o solo usa jq '.' sin filtrar campos específicos |
Usa jq '.campo' para campos simples pero no puede extraer múltiples campos ni filtrar arrays |
Usa jq con confianza: extrae campos anidados, filtra arrays con .[], y construye objetos con {nombre: .campo} |
| 3. Versiona documentos con git desde la terminal | No usa git o solo usa git clone sin init/add/commit |
Hace init, add y commit pero no usa git status ni git log para revisar el estado del repositorio |
Maneja el ciclo completo: init, status, add, commit, log, pull, push. Puede explicar para qué sirve cada comando |
Aprobación: 2 de 3 criterios en "Aprobado" o superior.
- La terminal es un micrófono, no un taladro: el peor escenario habitual es un mensaje de error.
- Con
pwd,ls,cdycd ~nunca estás perdido. curlhabla con cualquier API REST;jqconvierte su JSON en respuestas legibles.- El ciclo
add → commit → pushversiona tus specs sin depender de nadie. - Autonomía: cada dato que antes pedías a un ingeniero ahora está a un comando de distancia.
Kit: CLI para PMs
| Archivo | Descripción |
|---|---|
| ⬇ cheatsheet-comandos.md | Cheatsheet descargable de ~40 comandos esenciales con ejemplos |
| ⬇ aliases-pm.sh | Script de alias para .bashrc/.zshrc con funciones PM |