Русский
Автоматическая трансляция статуса работы в команду
Каждый участник команды видит, над чем работают коллеги, без ручных апдейтов. Хук 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, указывающую на командный хаб. После этого вручную:
- Установите
TEAM_VAULT_DIRиTEAM_MEMBER_NAMEв профиле командной оболочки. - Убедитесь, что для общего волта запущен
trip2g-sync --watch. Подробнее: ru/user/agent-memory, раздел «4а. Непрерывная синхронизация». - Обменяйтесь HMAC-секретами с коллегами, если используете приватный пир хаба. Подробнее: ru/user/federation, раздел «Добавить приватного пира».
Актуальность и ограничения
Заметка статуса актуальна настолько, насколько свежа дата последнего завершения сессии или тика крона. Если кто-то посреди сессии, его заметка отражает то место, где он находился при закрытии предыдущей. Это неотъемлемое свойство подхода: нельзя суммировать сессию, которая ещё не завершилась.
Резервный крон на 3-4 часа отлавливает сессии, оставленные открытыми на ночь. Он суммирует с той же позиции курсора: если новых строк нет, вывод будет «нет новой активности», что соответствует действительности.
Что это не делает: трекинг активности в реальном времени, демонстрация экрана или любой вид слежки. Хук суммирует завершённую работу, а не текущие нажатия клавиш.
Смотрите также
- ru/user/agent-memory: волт и настройка синхронизации, на которых строится эта схема
- ru/user/federation: как хаб федерирует командные статусы между инстансами
- ru/user/change_webhooks: вебхуки изменений для автоматизации по обновлению заметок