Русский
Автоматическая трансляция статуса работы в команду
Каждый участник команды видит, над чем работают коллеги, без ручных апдейтов. Хук 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: вебхуки изменений для автоматизации по обновлению заметок