Skill: alannetwork/touch-the-grass (version 1.0.1)

--- name: touch-the-grass version: 1.0.0 description: Skill de reconexión personal para semanas agobiantes de trabajo. Úsala cuando el usuario mencione que está estresado, agotado, quemado, necesita descansar, quiere desconectarse del trabajo, o cuando diga frases como "touch the grass", "necesito descansar", "llevo semanas sin parar", "estoy quemado", "burnout". También se activa en el heartbeat diario para recordatorios proactivos de actividades. Gestiona un sistema de actividades para bajar la dopamina, las agrega al Google Calendar del usuario, lleva un score con verificación visual por foto, y mantiene una racha (streak) de días activos. metadata: {"openclaw":{"emoji":"🌿"}} --- # Touch the Grass 🌿 Skill de reconexión personal. Ayuda al usuario a planear y completar actividades que bajan la dopamina y reconectan con el mundo analógico después de semanas intensas de trabajo. ## Archivos de referencia - `{baseDir}/activities.json` — catálogo completo de actividades con puntuación - El estado del usuario (score, streak, actividades completadas) se guarda en la **memoria del agente** --- ## Flujos principales ### 1. Inicio / Activación manual Cuando el usuario mencione estrés, agotamiento o quiera reconectarse: 1. Salúdalo con empatía, sin drama. Algo como: *"Llevas un buen rato dándole duro. Hora de tocar el pasto 🌿"* 2. Pregúntale su **estado de ánimo actual del 1 al 5** (1=agotado, 5=bien) 3. Lee `{baseDir}/activities.json` para cargar el catálogo 4. Sugiere **3 actividades concretas** según la hora del día: - **Mañana (6-12h)**: prioriza outdoor y mindful - **Tarde (12-18h)**: outdoor, analógico, social - **Noche (18-23h)**: analógico, pasivo con intención, mindful 5. Pregunta cuáles quiere agendar y para cuándo 6. Crea los eventos en **Google Calendar** con: - Título: emoji + nombre de la actividad (ej: `🌿 Caminar 15 min sin teléfono`) - Descripción: "Touch the Grass — tiempo para ti. Sin pantallas." - Recordatorio: 10 minutos antes 7. Confirma con el usuario y dile su **score actual + streak** ### 2. Heartbeat diario (recordatorio proactivo) Este flujo corre **una vez al día en la mañana** (configurar en cron a las 9:00 AM hora local). Revisa en memoria si el usuario tiene actividades Touch the Grass pendientes para hoy: **Si tiene actividades agendadas hoy:** > "Buenos días ☀️ Tienes [actividad] agendada para hoy a las [hora]. ¿Listo para tocar el pasto?" **Si no tiene actividades agendadas:** > "Hey 👋 ¿Ya planeaste tu momento Touch the Grass para hoy? Tu mente lo necesita. ¿Te ayudo a agendar algo rápido?" **Si lleva 3+ días sin completar ninguna actividad:** > "Llevás [N] días sin tocar el pasto 🥀 No te estoy juzgando, pero sí te recuerdo que existe. ¿Qué tal 15 minutos hoy?" No seas insistente si el usuario ya respondió ese día. ### 3. Registro y verificación de actividad completada Cuando el usuario diga que completó una actividad: #### Paso 1 — Verificación Pregunta cómo quiere confirmarla: > "¡Genial! ¿Cómo lo confirmamos?" > - 💬 Solo texto → **+1 punto** > - 📸 Foto → **+2 puntos** (el agente analiza la imagen) > - 🌐 Post en redes → **+3 puntos** #### Paso 2 — Si envía FOTO (verificación con visión) Analiza la imagen recibida. Verifica que sea plausible para la actividad declarada: **Criterios de validación visual:** - ¿La imagen muestra un contexto exterior, naturaleza, o entorno relacionado con la actividad? - ¿Hay elementos consistentes con la actividad (libro, comida cocinada, parque, persona caminando)? - ¿La imagen parece genuina (no stock photo, no captura de pantalla)? Si la imagen **es válida**: otorga +2 puntos, confirma con entusiasmo moderado Si la imagen **no es clara o no corresponde**: pide amablemente otra foto o acepta texto como respaldo (+1 punto) **Nunca seas condescendiente si la foto no es perfecta.** El objetivo es motivar, no policiar. #### Paso 3 — Si comparte POST de redes Acepta la URL o captura de pantalla del post. Si hay URL, confirma que existe. Otorga +3 puntos. #### Paso 4 — Actualiza estado en memoria Guarda en memoria del agente: ``` touch_the_grass_state: { score: N, streak_days: N, last_activity_date: "YYYY-MM-DD", completed_today: ["activity_id"], mood_checkins: [{"date": "...", "before": N, "after": N}] } ``` #### Paso 5 — Feedback post-actividad Pregunta: *"Del 1 al 5, ¿cómo te sientes ahora vs antes?"* Guarda el delta en memoria. Si el delta es positivo, menciónalo brevemente. ### 4. Ver progreso / score Cuando el usuario pida ver su progreso: Muestra un resumen: ``` 🌿 Touch the Grass — Tu progreso ⭐ Score total: [N] puntos 🔥 Racha actual: [N] días 📅 Actividades esta semana: [N] 😊 Delta de ánimo promedio: +[N] Bonos de racha: 3 días → +5 pts [conseguido ✅ / falta N días] 7 días → +15 pts 14 días → +30 pts Última actividad: [nombre] — hace [N] días ``` --- ## Reglas generales - **Tono**: cálido, directo, sin sermones. Ni coach de vida ni robot. Como un amigo que te conoce. - **No insistir**: si el usuario dice que no puede hoy, acéptalo sin culpa. Registra que ya respondió. - **Honestidad sobre el scoring**: si el usuario pregunta por qué se da más puntos por foto, explícalo naturalmente — la idea es que haya evidencia real del momento, no competencia. - **Privacidad**: las fotos se analizan solo para verificar la actividad. No se describen en detalle ni se comentan aspectos personales de la imagen. - **Google Calendar**: siempre confirma la zona horaria antes de crear eventos si hay duda. El usuario está en **Guadalajara / Ciudad de México (America/Mexico_City, UTC-6)**. --- ## Setup al instalar (una sola vez) Cuando el usuario instale la skill o diga "configura touch the grass", ofrécele estas dos opciones: ### Opción A — Cron dedicado ✅ recomendado (hora exacta) Ejecuta este comando y confirma que quedó registrado: ``` openclaw cron add \ --name "touch-the-grass-daily" \ --cron "0 9 * * *" \ --tz "America/Mexico_City" \ --session isolated \ --message "Heartbeat Touch the Grass: revisa si el usuario tiene actividades TTG planeadas para hoy. Si no tiene, recuérdaselo con amabilidad. Si lleva 3+ días sin completar ninguna, menciónalo. Sigue las instrucciones del skill touch-the-grass para el tono correcto." \ --announce ``` Verifica con `openclaw cron list` — si muestra `jobs: 0`, repite el comando. ### Opción B — Heartbeat (sin comandos extra) Si el usuario prefiere no configurar un cron, dile que agregue esto a su `~/.openclaw/workspace/HEARTBEAT.md`: ``` - Touch the Grass: una vez al día en la mañana, revisa si el usuario tiene actividades planeadas. Si no las tiene y aún no le preguntaste hoy, hazlo con amabilidad. Si lleva 3+ días sin actividad completada, menciónalo brevemente. ``` Menos puntual en horario, pero cero comandos adicionales. --- ## Ejemplos de activación - "llevo 3 semanas sin parar, estoy quemado" - "touch the grass" - "necesito desconectarme" - "¿qué tengo de touch the grass hoy?" - "ya fui a caminar" → iniciar flujo de verificación - "muéstrame mi score"

path: README.md
content: # 🌿 Touch the Grass

**Skill de reconexión personal para cuando llevas semanas sin parar.**

Touch the Grass te ayuda a planear y completar actividades que bajan la dopamina y te reconectan con el mundo analógico. Se activa cuando mencionas estrés, agotamiento o burnout, y también te recuerda diariamente que el pasto sigue ahí esperándote.

---

## ✨ Qué hace

- **Detecta tu estado** — cuando dices que estás quemado, agotado o necesitas desconectarte, arranca automáticamente
- **Sugiere actividades** según la hora del día (outdoor por la mañana, analógicas por la noche)
- **Agenda en Google Calendar** — crea eventos con recordatorios para que no se te olvide tocar el pasto
- **Sistema de puntos y rachas** — confirma actividades por texto (+1), foto (+2) o post en redes (+3)
- **Verificación visual** — analiza fotos para validar que realmente saliste de la cueva
- **Recordatorio diario** — un heartbeat matutino que te pregunta si ya planeaste tu momento de reconexión

---

## 📂 Estructura

```
touch-the-grass/
├── SKILL.md           # Definición completa del skill (flujos, reglas, setup)
├── activities.json    # Catálogo de actividades con categorías y puntuación
└── README.md
```

---

## 🏷️ Categorías de actividades

| Categoría | Emoji | Ejemplos |
|-----------|-------|----------|
| **Al aire libre** | 🌿 | Caminar sin teléfono, grounding descalzo, bici, ir al parque |
| **Mindfulness** | 🧘 | Meditar, respiración 4-7-8, journaling a mano, estiramientos |
| **Analógico** | 📖 | Leer libro físico, dibujar, cocinar desde cero, rompecabezas |
| **Social real** | 👥 | Café con alguien en persona, llamar a familia, un abrazo largo |
| **Pasivo con intención** | 🎬 | Ver una película sin scroll, escuchar un álbum completo, siesta |

---

## ⭐ Sistema de puntos

| Confirmación | Puntos |
|-------------|--------|
| 💬 Solo texto | +1 |
| 📸 Foto verificada | +2 |
| 🌐 Post en redes | +3 |

### Bonos de racha

| Racha | Bonus |
|-------|-------|
| 🔥 3 días seguidos | +5 pts |
| 🔥 7 días seguidos | +15 pts |
| 🔥 14 días seguidos | +30 pts |

---

## 🚀 Setup

Hay dos formas de configurar el recordatorio diario:

### Opción A — Cron dedicado *(recomendada)*

```bash
openclaw cron add \
  --name "touch-the-grass-daily" \
  --cron "0 9 * * *" \
  --tz "America/Mexico_City" \
  --session isolated \
  --message "Heartbeat Touch the Grass: revisa si el usuario tiene actividades TTG planeadas para hoy." \
  --announce
```

Verifica con `openclaw cron list`.

### Opción B — Heartbeat

Agrega esto a `~/.openclaw/workspace/HEARTBEAT.md`:

```
- Touch the Grass: una vez al día en la mañana, revisa si el usuario tiene actividades planeadas.
  Si no las tiene y aún no le preguntaste hoy, hazlo con amabilidad.
  Si lleva 3+ días sin actividad completada, menciónalo brevemente.
```

---

## 💬 Frases que lo activan

- *"llevo 3 semanas sin parar, estoy quemado"*
- *"touch the grass"*
- *"necesito desconectarme"*
- *"¿qué tengo de touch the grass hoy?"*
- *"ya fui a caminar"* → inicia verificación
- *"muéstrame mi score"*

---

## 🧩 Requisitos

- OpenClaw con Google Calendar habilitado (`gcal.enabled`)
- Zona horaria: `America/Mexico_City` (UTC-6)

---

## 🌱 Filosofía

> Ni coach de vida ni robot. Como un amigo que te conoce.

- Tono cálido y directo, sin sermones
- Si no puedes hoy, está bien — sin culpa
- Las fotos se analizan solo para verificar, nunca se comentan aspectos personales
- El objetivo es motivar, no policiar


path: activities.json
content: {
  "categories": {
    "outdoor": {
      "label": "🌿 Al aire libre",
      "activities": [
        { "id": "walk_15", "name": "Caminar 15 minutos sin teléfono", "duration_min": 15, "dopamine_reset": "high" },
        { "id": "walk_30", "name": "Caminar 30 minutos", "duration_min": 30, "dopamine_reset": "high" },
        { "id": "touch_grass", "name": "Tocar pasto descalzo (grounding)", "duration_min": 10, "dopamine_reset": "high" },
        { "id": "sit_outside", "name": "Sentarte afuera sin pantallas", "duration_min": 20, "dopamine_reset": "high" },
        { "id": "bike", "name": "Andar en bicicleta", "duration_min": 30, "dopamine_reset": "high" },
        { "id": "park", "name": "Ir al parque sin teléfono", "duration_min": 45, "dopamine_reset": "high" }
      ]
    },
    "mindful": {
      "label": "🧘 Mindfulness",
      "activities": [
        { "id": "meditate", "name": "Meditar 10 minutos", "duration_min": 10, "dopamine_reset": "medium" },
        { "id": "breathe", "name": "Respiración 4-7-8 (5 minutos)", "duration_min": 5, "dopamine_reset": "medium" },
        { "id": "journal", "name": "Escribir en un diario (sin teclado)", "duration_min": 15, "dopamine_reset": "medium" },
        { "id": "stretch", "name": "Estiramiento suave", "duration_min": 15, "dopamine_reset": "medium" }
      ]
    },
    "analog": {
      "label": "📖 Analógico",
      "activities": [
        { "id": "read_book", "name": "Leer un libro físico", "duration_min": 30, "dopamine_reset": "medium" },
        { "id": "draw", "name": "Dibujar o colorear", "duration_min": 20, "dopamine_reset": "medium" },
        { "id": "cook", "name": "Cocinar algo desde cero", "duration_min": 45, "dopamine_reset": "medium" },
        { "id": "puzzle", "name": "Armar un rompecabezas", "duration_min": 30, "dopamine_reset": "low" },
        { "id": "board_game", "name": "Jugar un juego de mesa", "duration_min": 60, "dopamine_reset": "low" }
      ]
    },
    "social": {
      "label": "👥 Social real",
      "activities": [
        { "id": "coffee_friend", "name": "Tomar café con alguien en persona", "duration_min": 60, "dopamine_reset": "high" },
        { "id": "call_family", "name": "Llamar a familiar (no texto, voz)", "duration_min": 20, "dopamine_reset": "medium" },
        { "id": "hug", "name": "Dar un abrazo largo a alguien", "duration_min": 2, "dopamine_reset": "high" }
      ]
    },
    "passive": {
      "label": "🎬 Pasivo (con intención)",
      "activities": [
        { "id": "movie", "name": "Ver una película (sin scroll paralelo)", "duration_min": 120, "dopamine_reset": "low" },
        { "id": "music_listen", "name": "Escuchar un álbum completo sin hacer nada más", "duration_min": 45, "dopamine_reset": "low" },
        { "id": "nap", "name": "Siesta de 20 minutos", "duration_min": 20, "dopamine_reset": "medium" }
      ]
    }
  },
  "scoring": {
    "text_confirmation": 1,
    "photo_confirmation": 2,
    "social_post_confirmation": 3
  },
  "streak_bonuses": {
    "3_days": 5,
    "7_days": 15,
    "14_days": 30
  }
}


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)