Micare
Productividad

Aviso de sesión inactiva

Avisos escalonados cuando tu sesión con el asistente queda en pausa esperando tu respuesta. A los 30 y 45 minutos manda una notificación del sistema para que no pierdas el hilo, y se cancela sola si retomas antes. Multiplataforma y configurable.

HookPremiumProductividadsesiones y foco

Empieza aquí · Aviso de sesión inactiva

Esta semilla hace que tu asistente te avise cuando dejaste una conversación a medias. Si te distrajiste y la sesión lleva un rato esperando tu respuesta, te llega una notificación del sistema para que no pierdas el hilo.

Para instalarla (una sola vez)

Dile a tu asistente:

siembra esta semilla 🌱

Y ya. Tu asistente hace todo lo técnico por ti. Vas a ver comandos raros en la pantalla; ni caso, él se encarga. Cuando termine, te va a decir cómo probar que quedó.

Otras formas de pedirlo que también entiende: "instala esta semilla", "configura el aviso de sesión inactiva", "pon esto a funcionar".


Para el asistente que siembra

Eres el asistente. Instala este hook (gancho de automatización) siguiendo estos pasos. La semilla trae dos scripts que trabajan en pareja:

  • kernel/idle-nudge.sh — se cablea al evento Stop (cuando terminas de responder). Programa los avisos.
  • kernel/idle-nudge-cleanup.sh — se cablea al evento SessionEnd (cuando se cierra la sesión). Limpia el estado para no avisar de sesiones ya cerradas.

0. Placeholders según la plataforma

Sustituye estos placeholders por la ruta real de la plataforma del usuario:

| Placeholder | Claude Code (global) | Claude Code (un solo proyecto) | Cowork (escritorio) | |---|---|---|---| | <TU-RUTA-HOOKS> | ~/.claude/hooks/ | .claude/hooks/ (dentro del proyecto) | ~/.claude/hooks/ | | <TU-SETTINGS> | ~/.claude/settings.json | .claude/settings.json | ~/.claude/settings.json |

Recomendación por defecto: instalación global en ~/.claude/, para que el aviso funcione en todas las carpetas del usuario. Cowork de escritorio comparte la misma configuración ~/.claude/.

1. Copiar los dos scripts a la carpeta de hooks

mkdir -p <TU-RUTA-HOOKS>
cp kernel/idle-nudge.sh kernel/idle-nudge-cleanup.sh <TU-RUTA-HOOKS>

2. Darles permiso de ejecución (chmod)

chmod +x <TU-RUTA-HOOKS>/idle-nudge.sh <TU-RUTA-HOOKS>/idle-nudge-cleanup.sh

3. Cablearlos en settings.json

Edita <TU-SETTINGS> y agrega este bloque de hooks. Si el archivo ya tiene una sección Stop o SessionEnd, NO la reemplaces: agrega el objeto del comando dentro del array hooks existente (fusiona, no sobrescribas).

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "bash <TU-RUTA-HOOKS>/idle-nudge.sh", "timeout": 3 }
        ]
      }
    ],
    "SessionEnd": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "bash <TU-RUTA-HOOKS>/idle-nudge-cleanup.sh", "timeout": 3 }
        ]
      }
    ]
  }
}

Sustituye <TU-RUTA-HOOKS> por la ruta real que definiste en el paso 0 (por ejemplo ~/.claude/hooks/ si instalaste global, o .claude/hooks/ si fue por proyecto). El "timeout": 3 es de sobra: el hook solo programa los avisos y regresa al instante; los watchers corren desprendidos de fondo.

4. (Opcional) Personalizar por variables de entorno

Todo tiene un default sano, así que este paso es opcional. Si el usuario quiere cambiar algo, agrega un bloque env en <TU-SETTINGS> o define las variables en su shell:

| Variable | Qué controla | Default | |---|---|---| | NUDGE_DISABLE | Con cualquier valor, apaga los avisos | (vacío = activo) | | NUDGE_TITLE | Título de la notificación | Claude Code | | NUDGE_SOUND | Sonido en macOS | Glass | | NUDGE_FIRST_MIN | Minutos para el 1er aviso | 30 | | NUDGE_SECOND_MIN | Minutos para el 2do aviso | 45 | | NUDGE_MSG_FIRST | Texto del 1er aviso | auto (usa los minutos) | | NUDGE_MSG_SECOND | Texto del 2do aviso | auto (usa los minutos) |

5. VERIFICACIÓN post-siembra (hazla y muestra el resultado)

# 1) Los scripts existen y son ejecutables
ls -l <TU-RUTA-HOOKS>/idle-nudge.sh <TU-RUTA-HOOKS>/idle-nudge-cleanup.sh

# 2) Prueba en caliente: dispara un aviso inmediato (umbral 0 minutos)
echo '{"session_id":"prueba-siembra"}' | \
  NUDGE_FIRST_MIN=0 NUDGE_SECOND_MIN=999 NUDGE_MSG_FIRST="Prueba: la semilla funciona" \
  bash <TU-RUTA-HOOKS>/idle-nudge.sh

# 3) Revisa que se creó el archivo de estado
ls ~/.cache/idle-nudge/

# 4) La limpieza lo borra
echo '{"session_id":"prueba-siembra"}' | bash <TU-RUTA-HOOKS>/idle-nudge-cleanup.sh
ls ~/.cache/idle-nudge/

# 5) (Opcional) Cierra el watcher de prueba que quedó dormido.
#    El paso 2 usó NUDGE_SECOND_MIN=999, así que su vigilante se queda ~16.6 h
#    durmiendo. Es inofensivo (al despertar no encuentra el nonce que borró el
#    paso 4 y sale en silencio), pero si no quieres dejar el proceso de fondo:
pkill -f 'sleep 59940' 2>/dev/null || true

Salida esperada:

  • Paso 1: aparecen las dos rutas con permisos -rwxr-xr-x (la x = ejecutable).
  • Paso 2: en 1-2 segundos salta una notificación del sistema que dice "Prueba: la semilla funciona". (La primera vez, macOS puede pedir permiso para mostrar notificaciones desde la terminal — hay que autorizarlo.)
  • Paso 3: la lista muestra prueba-siembra.nonce.
  • Paso 4: la lista ya no muestra prueba-siembra.nonce (quedó vacía).
  • Paso 5: sin salida visible (solo cierra el vigilante de prueba, si lo corriste).

Si los primeros cuatro pasos dan eso, la semilla quedó sembrada y funcionando (el paso 5 es solo limpieza opcional).


¿Cómo sé que funcionó?

Fácil: deja una conversación a medias y no escribas nada por ~30 minutos. Te va a llegar una notificación recordándote que la sesión sigue esperando. Si escribes algo antes de esos 30 minutos, no te molesta. Y si cierras la sesión, tampoco.

Es un recordatorio amable para que ninguna conversación se te quede olvidada. 🌱