¿Qué hice esta semana? Un comando para responderlo

Trabajo en varias computadoras y algunas no son mías. Al final de la semana necesito saber qué hice en cada una, y la respuesta estaba repartida en decenas de repos. didwhat es un comando que la saca en un solo paso, sin instalar nada más que un binario.

Los viernes me hago siempre la misma pregunta: ¿qué hice esta semana?

La necesito para la daily, para la hoja de horas y para mi bitácora. Y casi nunca la puedo contestar de memoria. El trabajo está en los commits, pero los commits están repartidos en muchos repos, en varias ramas y, sobre todo, en varias computadoras.

Algunas de esas computadoras no son mías. Una es la laptop de un cliente: Windows 11 Enterprise, administrada por su equipo de IT, donde no puedo instalar Python ni Node. Ahí vive una parte de mi semana, y lo que pasa en esa laptop se queda en esa laptop.

Lo que hacía antes

Lo resolvía con un loop de bash que recorría las carpetas y llamaba a git log en cada repo. Lo pegaba a mano en la terminal cada vez que lo necesitaba. Tenía tres problemas:

  • Solo corría en Git Bash. En PowerShell había que traducirlo, y en una computadora bloqueada no siempre hay Git Bash.
  • Mezclaba fechas. git log --since filtra por la fecha del commit, no por la de autor. Un rebase de hoy traía al reporte trabajo de hace dos semanas.
  • Se perdía las mañanas. --since=2026-10-13, sin hora, git lo lee como ese día a la hora actual. Si lo corría a las cuatro de la tarde, todo lo de antes de las cuatro desaparecía. Lo descubrí semanas después.

Un script que se pega a mano y se equivoca en silencio no es una herramienta. Así que lo convertí en una.

didwhat

didwhat es un comando que lista tus commits de todos los repos bajo una carpeta, agrupados por día:

didwhat --since 2026-10-13 ~/code/client
## 2026-10-14

### platform

- 10:12 `57a5e82` feat: record when an invoice enters and leaves scope — *past-due-history*
  - etl/scope.py
  - web/src/InvoiceHistory.tsx

## Not pushed or not committed

### web — `main...origin/main [ahead 1]`

- `M` src/worklist.tsx

Encuentra los repos solo, mira todas las ramas, los remotos y los tags, y al final dice qué quedó sin commitear o sin pushear. La salida es Markdown listo para pegar en la daily o en la bitácora. Con --json sale en JSON, para procesarla con jq.

Por qué Rust

No elegí Rust porque sí. La restricción era la laptop del cliente: tenía que correr en una computadora donde no puedo instalar un runtime.

Rust compila a un solo binario sin dependencias. El de Windows pesa menos de 500 KB comprimido, y lo único que necesita es git en el PATH, que ya está en cualquier computadora donde se programa. Cada release en GitHub trae binarios para Windows, macOS y Linux, con instaladores de una línea. Y si en esa computadora tampoco se puede correr un script de instalación, se baja el .zip, se descomprime y listo.

Lo que encontré al probarlo con repos reales

Los tests pasaban desde el primer día. Los problemas aparecieron cuando lo corrí contra veinte repos de verdad, y cada uno terminó siendo una regla de la herramienta.

Un commit cuenta el día en que lo escribiste. Un rebase cambia la fecha del commit pero no la de autor. didwhat usa la de autor, así que reorganizar una rama hoy no mete su trabajo viejo en el reporte de hoy. Y si la hora del commit es las 23:30, sale en ese día en la hora local, no en el día UTC.

Cada cambio sale una vez. Esto fue lo que más me costó. Cuando un PR se squashea o se cherry-pickea, en la rama principal aparece otro commit con los mismos cambios, otro hash y otra fecha. El reporte mostraba todo dos veces. didwhat compara los cambios con git patch-id, que identifica un diff aunque el mensaje sea otro, y lista el cambio una sola vez, en el día en que lo hiciste, con dónde y cuándo aterrizó:

- 13:18 `94df89d` docs: document the tour conventions — *feat/onboarding-tours* → landed as `fa5be5b` at 13:38, a squash of 7 commits

Eso también funciona con una rama de varios commits squasheada en uno: busca la secuencia de tus commits cuyos cambios suman exactamente los del squash.

Una fecha sin hora es el día completo. --since yesterday --until yesterday cubre de medianoche a medianoche, en vez de ser un instante vacío.

Una fecha que git no entiende es un error. Git lee monday como “ahora”, sin avisar, y el reporte sale vacío. Uno pensaría que no hizo nada el lunes. didwhat se detiene y sugiere last monday.

Los merges de los demás no son tu trabajo. En un repo con mucho movimiento eran veinte por día y tapaban todo lo demás. Ahora solo salen con --merges.

Lo que gano usándolo

  • Un comando en vez de una hora. Lo que antes era reconstruir la semana desde GitHub, Slack y la memoria ahora es correr didwhat y leer.
  • Nada que instalar en la computadora ajena, salvo un binario. No pide permisos de administrador ni instala un runtime.
  • No sale a la red. Por defecto solo lee lo que está en el disco. Con --fetch trae primero lo remoto, y si un repo pide credenciales lo marca como aviso en vez de quedarse esperando.
  • Incluye lo que todavía no existe en ningún otro lado. Los cambios sin commitear y las ramas sin pushear no aparecen en GitHub ni en Jira. Si me olvido de algo en la laptop del cliente, me lo dice.
  • Un número en el que puedo confiar. Si un cambio sale una vez y en su día, puedo contar commits por día sin tener que limpiarlos antes.

Lo que no hace

didwhat solo ve git. Las reuniones, las revisiones de código, las decisiones y las horas investigando algo que no terminó en un commit no están ahí. Para eso sigo escribiendo una bitácora, y para leerla construí Noonly. didwhat no la reemplaza; me da el punto de partida para escribirla.

Tampoco reconoce todos los squash. Si un PR se squashea junto con commits de otra persona, o se cambia al resolver un conflicto, los cambios ya no coinciden con ninguna secuencia tuya y sale aparte. Prefiero que se repita a que esconda algo.

Probarlo

En macOS y Linux:

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/neosergio/didwhat/releases/latest/download/didwhat-installer.sh | sh

En Windows, desde PowerShell:

powershell -ExecutionPolicy Bypass -c "irm https://github.com/neosergio/didwhat/releases/latest/download/didwhat-installer.ps1 | iex"

Y después, en la carpeta donde tienes tus repos:

didwhat

Sin argumentos muestra los últimos siete días. El código está en GitHub, con licencia MIT. Si algo no te funciona, abre un issue: los próximos pasos ya están ahí.

Comentarios