Read in:
Русский

Автоматическая трансляция статуса работы в команду

Каждый участник команды видит, над чем работают коллеги, без ручных апдейтов. Хук Claude Code перехватывает сессию при завершении, удаляет чувствительные данные, просит LLM сформировать структурированную заметку статуса и синхронизирует её в общий волт. Коллеги запрашивают хаб и получают статусы всех одним вызовом.

Стендапы и ручные обновления больше не нужны.

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

Сессия Claude Code завершается
        │
        ▼
Срабатывает хук SessionEnd
        │
        ▼
Редакция: удалить ключи, секреты, клиентские пути
        │
        ▼
LLM суммирует только новые строки транскрипта (по курсору)
        │
        ▼
Записывает status/{ваше-имя}.md в волт
        │
        ▼
trip2g-sync --watch подхватывает → сервер
        │
        ▼
Хаб федерирует → коллеги запрашивают federated_search

Каждый шаг реализован небольшим скриптом. Хук связывает их вместе.

Почему триггер по завершению сессии, а не по таймеру

Подход с кроном раз в 2-4 часа работает, но крон срабатывает по часам, а не в момент завершения работы. Между тиками статус устаревший, а при активной сессии дублирующий.

Хук SessionEnd срабатывает в момент, когда Claude Code закрывается. Статус отражает то, что вы только что сделали: свежесть измеряется секундами, а не часами. Ресурсы в простое не тратятся.

Крон оставьте как запасной вариант для сессий, которые зависли или были убиты без корректного завершения. Настройте на 3-4 часа и пропускайте запуск, если заметка статуса уже обновлялась в течение последнего часа.

# .claude/hooks/SessionEnd.sh  (упрощённо)
#!/usr/bin/env bash
set -euo pipefail

VAULT_DIR="${TEAM_VAULT_DIR:-$HOME/team-vault}"
MY_NAME="${TEAM_MEMBER_NAME:-$(whoami)}"
SESSION_LOG="$1"   # путь, который передаёт Claude Code в хук

# 1. читаем курсор, извлекаем только новые строки
CURSOR_FILE="$VAULT_DIR/.status-cursor-$MY_NAME"
CURSOR=$(cat "$CURSOR_FILE" 2>/dev/null || echo "0")
NEW_LINES=$(tail -n +"$CURSOR" "$SESSION_LOG")
NEW_CURSOR=$(wc -l < "$SESSION_LOG")

# 2. редакция до того, как LLM что-либо увидит
CLEAN=$(echo "$NEW_LINES" | sed -E \
  's/(API_KEY|SECRET|PASSWORD|Bearer |sk-|ghp_)[^\s"]*/[REDACTED]/g')

# 3. суммаризация
STATUS_JSON=$(echo "$CLEAN" | llm -s \
  'Верни только JSON: {"status":"одно предложение","area":"feat|bug|refactor|blocked|exploring","confidence":"high|low"}')

# 4. записываем заметку
cat > "$VAULT_DIR/status/$MY_NAME.md" <<EOF
---
title: "$MY_NAME — статус"
free: false
team-share: true
updated: "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
---
$(echo "$STATUS_JSON" | jq -r '"**Статус:** \(.status)\n**Область:** \(.area)\n**Уверенность:** \(.confidence)"')
EOF

# 5. сдвигаем курсор
echo "$NEW_CURSOR" > "$CURSOR_FILE"

Зарегистрируйте хук в .claude/settings.json:

{
  "hooks": {
    "Stop": [
      { "type": "command", "command": "bash .claude/hooks/SessionEnd.sh $CLAUDE_SESSION_LOG" }
    ]
  }
}

Stop срабатывает при корректном завершении сессии. Для длительных сессий добавьте хук PostToolUse, если нужны промежуточные обновления, хотя покрытия по завершению обычно достаточно.

Редакция до LLM

LLM — ненадёжный детектор секретов. Он редактирует то, что вы явно попросили его убрать в промпте, но не знает, что вы считаете чувствительным, если вы об этом не сказали. Запустите regex-очистку первым шагом, до того как транскрипт попадёт в модель.

Минимальный набор паттернов для удаления:

API_KEY|SECRET|PASSWORD|Bearer |sk-|ghp_|t2g_

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

Структурированный вывод

Просите LLM вернуть три поля, а не свободный текст:

Поле Значения Назначение
status Одно предложение Что завершили или где находитесь
area feat, bug, refactor, blocked, exploring Коллеги видят суть с первого взгляда
confidence high, low Была сессия продуктивной или исследовательской?

Когда confidence равен low (сессия прошла за чтением, слепой отладкой или изучением незнакомой территории), ставьте exploring в поле area, а не придумывайте завершение. Выдуманный «починил баг авторизации» при сессии, которую вы провели читая логи, хуже, чем «исследую проблему авторизации».

Явное согласие на публикацию

Добавьте team-share: true во frontmatter заметки статуса. Без этого поля заметка остаётся приватной, даже если попадёт в волт. Каждый сам решает: сессия по клиентскому проекту не транслируется автоматически.

Хук можно полностью отключить на время сессии через переменную окружения:

TEAM_SHARE_OFF=1 claude

Проверьте её в скрипте хука и завершайте работу досрочно, если она установлена.

Общий вид через хаб

Коллеги не читают файлы каждого участника напрямую. Они делают запрос к хабу федерации:

federated_search(query="над чем работает команда", kb_id="team-status")

Хаб возвращает сводку из всех синхронизированных заметок статуса одним вызовом.

Настройте это через KB-заметку в общем волте:

---
title: "Статусы команды"
free: false
mcp_federation_kb_url: https://your-hub.example.com/_system/mcp
mcp_federation_kb_id: team-status
---
Использовать когда: нужно узнать, над чем работают коллеги или кто заблокирован.

Полная настройка федерации описана в ru/user/federation.

Чек-лист настройки

Скилл OMC team-activity выполняет основную часть настройки. Запустите:

/oh-my-claudecode:team-activity setup

Команда создаёт файл хука, регистрирует его в .claude/settings.json, записывает начальный файл курсора и добавляет KB-заметку hub.md, указывающую на командный хаб. После этого вручную:

  1. Установите TEAM_VAULT_DIR и TEAM_MEMBER_NAME в профиле командной оболочки.
  2. Убедитесь, что для общего волта запущен trip2g-sync --watch. Подробнее: ru/user/agent-memory, раздел «4а. Непрерывная синхронизация».
  3. Обменяйтесь HMAC-секретами с коллегами, если используете приватный пир хаба. Подробнее: ru/user/federation, раздел «Добавить приватного пира».

Актуальность и ограничения

Заметка статуса актуальна настолько, насколько свежа дата последнего завершения сессии или тика крона. Если кто-то посреди сессии, его заметка отражает то место, где он находился при закрытии предыдущей. Это неотъемлемое свойство подхода: нельзя суммировать сессию, которая ещё не завершилась.

Резервный крон на 3-4 часа отлавливает сессии, оставленные открытыми на ночь. Он суммирует с той же позиции курсора: если новых строк нет, вывод будет «нет новой активности», что соответствует действительности.

Что это не делает: трекинг активности в реальном времени, демонстрация экрана или любой вид слежки. Хук суммирует завершённую работу, а не текущие нажатия клавиш.

Смотрите также

  • ru/user/agent-memory: волт и настройка синхронизации, на которых строится эта схема
  • ru/user/federation: как хаб федерирует командные статусы между инстансами
  • ru/user/change_webhooks: вебхуки изменений для автоматизации по обновлению заметок