Skip to main content
Glama

🌿 touch-grass

Плагин для Claude Code, который напоминает вам выйти на улицу.

Учет погоды · учет заката · учет сессий · никогда не прерывает ваш рабочий процесс.

CI License: MIT Stars Last commit MCP Claude Code

Установка · Как это работает · Инструменты · Конфиденциальность · Сайт


Зачем это нужно

Таймеры Pomodoro прерывают ваш поток. Блоки в календаре игнорируются. Лучшее время, чтобы отойти от редактора — это переменная величина, зависящая от погоды, времени суток, вашей серии и того, чем вы заняты в данный момент — чего не знает обычный интервальный таймер.

Ваш AI-агент для кодинга уже знает, когда вы делаете естественную паузу. Он закончил задачу. Он ждет, пока вы ответите на вопрос. Тесты прошли успешно. Это идеальный момент для напоминания — а не каждые 25 минут ровно.

touch-grass превращает вашего агента в контекстно-зависимого напарника по отдыху. Хук SessionStart передает ему актуальную погоду и время заката в начале каждой сессии. Навык учит его тону «заботливой мамы» (теплый, конкретный, никогда не поучающий). MCP-сервер позволяет ему записывать, когда вы действительно вышли на улицу. Вы сохраняете поток. Он помогает вам оставаться честным с самим собой.

Что он делает

Как таймер Pomodoro, но он знает погоду, время заката и вашу серию кодинга — и общается с вашим AI-агентом, вместо того чтобы прерывать вас.

  • Хук SessionStart внедряет актуальную погоду, время заката и состояние серии в контекст вашего агента каждый раз, когда начинается сессия Claude Code.

  • MCP-сервер предоставляет четыре инструмента, которые ваш агент (Claude Code, Cursor, Claude Desktop, Codex) может вызвать по требованию.

  • Навык учит агента, когда стоит напомнить, когда лучше промолчать и какой тон использовать (заботливый, а не поучающий).

Это замена Pomodoro для Claude Code для тех, кто предпочитает, чтобы агент по кодингу советовал выйти на улицу, а не таймер, блокирующий экран, прерывал рабочий процесс.

Установка

Claude Code (полный функционал — хук + MCP + навык):

/plugin install nalediym/touch-grass

Вот и все. Откройте новую сессию — хук сработает, контекст будет добавлен, и ваш агент возьмет управление на себя.

git clone https://github.com/nalediym/touch-grass
cd touch-grass/plugin/mcp-server && npm install

Затем добавьте в конфигурацию MCP вашего клиента:

{
  "mcpServers": {
    "touch-grass": {
      "command": "node",
      "args": ["/absolute/path/to/touch-grass/plugin/mcp-server/index.mjs"]
    }
  }
}

Вы получите четыре MCP-инструмента, но потеряете хук SessionStart, который специфичен для Claude Code. Ваш агент будет упоминать траву только тогда, когда вы прямо об этом спросите.

Как это работает

flowchart LR
  A[Claude Code<br/>session starts] --> B[SessionStart hook fires]
  B --> C[ip-api.com<br/>location]
  B --> D[open-meteo.com<br/>weather + sunset]
  B --> E[~/.touch-grass/state.json<br/>streak + sessions]
  C --> F[Context injection]
  D --> F
  E --> F
  F --> G[Agent<br/>decides when to nudge]
  G -.calls.-> H[MCP tools]
  H --> E

При запуске сессии выполняется скрипт-хук. Он определяет ваше местоположение по публичному IP (кэшируется на 24 часа), получает текущую погоду и время заката с open-meteo, считывает ваш локальный файл серии и синтезирует короткий блок контекста для агента. Агент считывает его и в момент естественной паузы — когда функция готова, баг исправлен или он ждет ввода — мягко подталкивает вас выйти на улицу, используя язык, соответствующий реальным условиям.

Когда вы подтверждаете, что вышли на улицу, агент вызывает log_touch_grass через MCP-сервер, который увеличивает вашу серию в локальном файле состояния.

MCP-инструменты

Инструмент

Цель

Возвращает

check_grass_conditions

Погода, температура, минуты до заката и состояние серии пользователя. Контекст для принятия решения.

JSON-блок с weather, sunset, isNice, minutesToSunset, state

suggest_activity

Рекомендация случайной активности, взвешенная по времени суток. В «золотой час» дает советы, связанные с закатом.

Обычный текст, например "🌅 встретить закат"

log_touch_grass

Записывает, что пользователь вышел на улицу. Обновляет серию. Вызывать только после подтверждения.

Подтверждение с новым количеством дней в серии

get_stats

Сырая телеметрия сессий и история серий.

JSON-блок

Все четыре инструмента доступны для вызова из любого MCP-совместимого агента. В Claude Code агент в основном использует их через контекст, который внедряет хук — вам редко придется вызывать их вручную.

Примеры промптов

Плагин работает фоново, но эти фразы хорошо работают, если вы хотите поднять тему самостоятельно:

  • "Стоит ли мне выйти на улицу прямо сейчас?"

  • "Какая у меня серия?"

  • "Напомни мне выйти на улицу до заката."

  • "Я только что сходил на прогулку, запиши это."

  • "Хорошая ли погода на улице?"

Конфиденциальность

Все работает по принципу «локально прежде всего».

  • Хранится на вашем компьютере: ~/.touch-grass/state.json (серия, количество сессий, дата последнего выхода) и ~/.touch-grass/config.json (кэшированное местоположение, порог погоды).

  • Покидает ваш компьютер: ваш публичный IP отправляется на ip-api.com раз в 24 часа для определения координат города, и эти координаты отправляются на api.open-meteo.com при запуске каждой сессии для получения погоды и времени заката.

  • Никогда не покидает ваш компьютер: ваша серия, ваши заметки об активности, ваш график кодинга, ваши промпты, что угодно из вашей сессии Claude Code.

Никаких аккаунтов. Никаких API-ключей. Никакой телеметрии. Никакой аналитики. Никакой авторизации. Если вы хотите полностью отключить доступ к сети, закрепите "location" вручную в ~/.touch-grass/config.json, и поиск по IP никогда не будет выполнен.

Конфигурация

{
  "location": {
    "lat": 40.7128,
    "lon": -74.0060,
    "city": "New York",
    "timezone": "America/New_York",
    "fetchedAt": 9999999999999
  },
  "niceWeatherThresholdC": 15,
  "breakIntervalHours": 2,
  "enabled": true,
  "customActivities": [
    { "label": "walk to the corner store", "emoji": "🛒" },
    { "label": "sit on the fire escape", "emoji": "🪜" }
  ]
}

Ключ

По умолчанию

Описание

location

auto (ip-api)

Закрепить за конкретным местоположением. Установите fetchedAt на будущую временную метку, чтобы отключить автообновление.

niceWeatherThresholdC

15

Температура (°C), ниже которой погода не считается «хорошей».

breakIntervalHours

2

После стольких часов непрерывного кодинга напоминания становятся настойчивее.

enabled

true

Установите false, чтобы отключить хук без удаления.

customActivities

null

Замените список активностей по умолчанию своим собственным. Каждая запись — это { "label": "...", "emoji": "..." } или просто строка. Бонус для спонсоров.

Устранение неполадок

Запустите хук вручную, чтобы убедиться, что он работает:

node plugin/hooks/session-start.mjs

Вы должны увидеть JSON-объект с hookSpecificOutput.additionalContext, содержащим напоминание. Если additionalContext — пустая строка, хук не смог связаться с ip-api.com или open-meteo.com — проверьте сеть. Если хук работает нормально, но Claude Code его не вызывает, плагин не подключен — перезапустите /plugin install nalediym/touch-grass в новой сессии.

Проверьте ~/.touch-grass/state.json. Поля sessionStart, lastSessionStart и totalCodingSessions обновляются каждый раз при запуске хука. Если sessionStart старше вашего последнего вызова claude, хук не работает.

Да. Закрепите свое местоположение вручную в ~/.touch-grass/config.json:

{
  "location": {
    "lat": 40.7128,
    "lon": -74.0060,
    "city": "New York",
    "timezone": "America/New_York",
    "fetchedAt": 9999999999999
  }
}

Высокая временная метка fetchedAt предотвращает истечение 24-часового кэша, поэтому поиск по IP никогда не запускается. Погода по-прежнему будет запрашиваться с open-meteo.com.

Установите "enabled": false в ~/.touch-grass/config.json. Хук по-прежнему будет записывать телеметрию сессий, но выдавать пустой контекст, поэтому агент перестанет видеть напоминания.

Удалите или отредактируйте ~/.touch-grass/state.json. Файл будет воссоздан при следующей сессии с настройками по умолчанию.

/plugin uninstall touch-grass
rm -rf ~/.touch-grass

Директория ~/.touch-grass содержит только ваше состояние и кэшированное местоположение — ее можно безопасно удалить.

Разработка

git clone https://github.com/nalediym/touch-grass
cd touch-grass/plugin/mcp-server && npm install

# Test the hook directly (outputs JSON context)
node ../hooks/session-start.mjs

# Test the MCP server with the inspector
npx @modelcontextprotocol/inspector node ./index.mjs

Три движущиеся части:

  • plugin/hooks/session-start.mjs — Node-скрипт без зависимостей. Вызывается Claude Code при запуске сессии. Выводит JSON в stdout.

  • plugin/mcp-server/index.mjs — MCP-сервер. Использует @modelcontextprotocol/sdk. Транспорт stdio.

  • plugin/lib/grass.mjs и plugin/lib/nudge.mjs — общая логика (погода, закат, состояние, текст напоминания).

Хук и MCP-сервер читают один и тот же файл состояния, поэтому они остаются синхронизированными.

Связанные проекты

Лицензия

MIT · Создано в тени.


Поддержка

touch-grass бесплатен и распространяется по лицензии MIT. Если он помог вам отойти от экрана, подумайте о поддержке:

Поддержать на Polar → — $9 единоразово. Ваше имя попадет в список спонсоров, вы получите приоритет в решении проблем и разблокируете пользовательские списки активностей в конфигурации.

Polar GitHub Sponsors

Спонсоры

Будьте первыми. Поддержать на Polar →

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nalediym/touch-grass'

If you have feedback or need assistance with the MCP directory API, please join our Discord server