Skip to main content
Glama

claude-handoff

claude-handoff: шумный транскрипт проходит через chf и превращается в чистый handoff.md и постоянную память проекта

PyPI Python CI Downloads License: MIT

Превратите любую сессию Claude Code — даже упавшую — в чистый handoff.md, с которого другой ИИ сможет продолжить работу. И дайте Claude Code постоянную память проекта, извлечённую из вашей собственной истории.

chf

Вот и всё. Ваша последняя сессия становится handoff.md: разговор без шума, изменённые файлы, выполненные команды — в начале документа идут инструкции для принимающего ассистента, так что вы можете вставить его прямо в Gemini, GPT, claude.ai или новую сессию Claude Code без какого-либо дополнительного промпта.

chf -o clipboard в действии — пять секунд от сессии до готового к вставке handoff

Claude Code хранит каждую сессию локально в формате JSONL (~/.claude/projects/…/*.jsonl) — с вызовами инструментов, результатами, блоками размышлений и системными напоминаниями. Существующие экспортёры выгружают всё это в markdown. claude-handoff вместо этого создаёт документ handoff — и, поскольку он умеет читать всю вашу историю, также краткую памятку по проекту.

  • Ноль зависимостей. Только стандартная библиотека, Python 3.9+. Пакет из девяти модулей — также поставляется в виде готового однострочного скрипта, который можно curl-нуть и проверить.

  • Детерминированность по умолчанию. Никаких API-вызовов, никаких затрат, работает офлайн.

  • --llm, когда нужна настоящая сводка. Claude, OpenAI или Gemini по вашему собственному API-ключу — или --llm claude-cli, который запускает локально установленный CLI Claude Code по вашему существующему плану Pro/Max: вообще без API-ключа.

  • Без шума. Отбрасывает результаты инструментов, блоки размышлений, системные напоминания, болтовню субагентов, обёртки слэш-команд. Сохраняет намерения пользователя, ответы ассистента, изменённые файлы, выполненные команды — включая файлы и команды субагентов (agent-*.jsonl), чьи полные транскрипты остаются за --include-sidechains.

  • Память проекта. chf --brief превращает ВСЮ историю сессий проекта в одну живую памятку (решения, исправления, соглашения, открытые вопросы — со ссылками на сессии); --install-brief-hook внедряет её в каждую новую сессию Claude Code, так что Claude начинает работу, уже зная проект.

  • Безопасно для вставки. Строки, похожие на секреты (API-ключи, токены, password=…) удаляются из всех выходных данных — handoff, который вы вставляете в веб-чат, тоже является исходящим трафиком. --anonymize идёт дальше для публичного распространения.


Предварительные требования

Требование

Минимум

Проверка

Примечания

Python

3.9+

python3 --version

Единственное жёсткое требование

Claude Code

любая

claude --version

Только для --llm claude-cli (использует ваш вход Pro/Max)

pipx (рекомендуется)

любая

pipx --version

pip install pipx — или через brew / обычный pip

Никаких сторонних Python-пакетов, никогда — всё работает на стандартной библиотеке.

Related MCP server: Longhand

Установка

pipx install claude-handoff        # or: pip install claude-handoff
brew install Vasilispapg/tap/claude-handoff   # Homebrew
# or just grab the generated single-file build — stdlib-only, auditable:
curl -O https://raw.githubusercontent.com/Vasilispapg/claude-handoff/main/single/claude_handoff.py
python3 claude_handoff.py --list

Установка пакета даёт две одинаковые команды: claude-handoff и короткий алиас chf. Автодополнение по табуляции:

eval "$(claude-handoff --completions zsh)"    # bash works too

60 секунд: выберите свою ситуацию

Сессия упала, достигнут лимит использования или вы закрыли терминал:

chf -o clipboard

…затем вставьте в claude.ai, ChatGPT, Gemini — или в новую сессию claude. Работает с любой старой сессией; ничего не нужно было устанавливать до сбоя.

Перенос работы из Claude Code в другую модель:

chf --fit 32k -o clipboard         # sized to the receiver's context window

«В какой сессии мы говорили про CORS?»

chf --list --grep "CORS"           # every match, with a 🔍 context preview
chf --grep "CORS"                  # or export the newest match directly

Дать Claude Code постоянную память об этом проекте:

chf --brief --llm claude-cli       # distill ALL sessions → one cited brief
chf --install-brief-hook           # every new session starts knowing it

Настоящая сводка вместо транскрипта (цель / решения / состояние / далее):

chf --llm claude-cli               # your Claude Code login — no API key

Веб-чат claude.ai или ChatGPT вместо терминальной сессии:

chf conversations.json --list      # each app's data export works as input
chf conversations.json --name "webhook bug"

Память проекта (--brief)

Claude Code забывает всё между сессиями — но вся история лежит на вашем диске. chf --brief читает все сессии текущего проекта и записывает один документ памяти в ~/.claude/briefs/<project>.md:

  • фактологическая хронология сессий + самые часто изменяемые файлы (детерминированно, бесплатно);

  • с --llmдистиллированная память: решения с их причинами, исправленные баги, соглашения, открытые вопросы — каждый пункт снабжён ссылкой на исходную сессию (chf --name <id> открывает источник).

chf --brief в действии — вся история проекта, превращённая в цитируемую память

Заметки по сессиям кэшируются, так что обновление после новых сессий оплачивается только для новых — а огромная сессия (свыше ~120 тыс. символов) обрабатывается в стиле map-reduce внутри заметки, так что путь памяти никогда не обрезается: ничего не теряется молча, при любом размере.

chf --install-brief-hook

устанавливает два хука: SessionStart внедряет памятку как контекст (Claude начинает работу, уже зная проект — повторно внедряется и после /compact), SessionEnd автоматически обновляет фактологическую часть бесплатно. Никакой LLM никогда не запускается из хука; дистиллированная часть обновляется только по вашему запросу. Памятка несёт отметку свежести, и файл, и внедрение предупреждают, когда есть более новые сессии. Полностью локально; редактирование применяется как везде.

→ Пошаговая механика, честная таблица затрат и полное описание дня с ней: docs/GUIDE.md.

Автоматизируйте

chf --install-hook                 # SessionEnd + PreCompact → handoff to ~/.claude/handoffs/
chf --install-brief-hook           # SessionStart/End + PreCompact → project memory (above)

PreCompact важен: непосредственно перед сжатием контекста длинной сессии оба хука делают снимок состояния — handoff сохраняет детали, которые сжатие вот-вот уберёт, а каркас памятки остаётся свежим в середине сессии.

Оба хука неразрушающе редактируют ~/.claude/settings.json, идемпотентны и имеют парные флаги --uninstall-*. Сбои хуков никогда не нарушают основную сессию, и хуки сами по себе не запускают LLM-вызовы и не создают файлы.


Как выглядит результат

# Conversation handoff

> To the receiving assistant: … you are taking over …

## Session
- Project: /home/you/myapp (branch main)
- When: 2026-08-20 09:00 → 09:04
- Activity: 2 user messages, 4 assistant replies, 4 tool calls

## Files created / modified
- /home/you/myapp/auth.py

## Commands run
- python -m pytest tests/test_auth.py -q

_🤖 2 subagent(s) contributed to the work above (--include-sidechains for their transcripts)._

## Conversation
### 🧑 User
the login breaks on unicode passwords…
### 🤖 Assistant
Found it — ascii encoding. Changed to utf-8, tests pass.

Часто используемые команды

chf                                # latest session → handoff.md
chf -i                             # numbered picker; "1,3" or "2-4" merges several
chf --list                         # what sessions do I have? (title · first prompt)
chf --list --format json           # the same, machine-readable
chf --name "login bug"             # newest session whose title/prompt matches
chf "login bug"                    # same — a non-path argument is a name search
chf --grep "CORS"                  # newest session that *talked about* CORS
chf --grep CORS --grep auth        # …that talked about BOTH (AND)
chf a.jsonl b.jsonl                # several paths → ONE merged handoff
chf --project myrepo               # latest session of a specific project
chf path/to/session.jsonl -o -     # explicit file → stdout
chf -o clipboard                   # straight to the clipboard — go paste it
chf --last 5                       # only the last 5 user turns
chf --since 2h                     # only the last 2 hours of the session
chf --fit 32k                      # sized to fit a 32k-token context
chf --include-tools                # keep collapsed per-tool-call detail
chf --include-sidechains           # append full subagent transcripts
chf --anonymize                    # public-safe: ~ paths, no emails/IPs/username
chf --project myrepo --merge       # whole project in ONE handoff, oldest → newest
chf --format json -o session.json  # machine-readable handoff

# LLM summaries (goal / decisions / current state / next steps):
chf --llm claude-cli               # your Claude Code login — no API key
chf --llm ollama                   # local model — fully offline
chf --llm claude                   # Anthropic API   (ANTHROPIC_API_KEY)
chf --llm openai --model gpt-4o    # OpenAI API      (OPENAI_API_KEY)
chf --llm gemini --with-transcript # Google API      (GEMINI_API_KEY)
chf --llm claude-cli --focus "emphasize the API decisions"

# project memory:
chf --brief                        # free factual brief (timeline + files)
chf --brief --llm claude-cli       # + distilled decisions/fixes/conventions

Где ищет? Сессии хранятся в глобальном хранилище Claude Code (~/.claude/projects), так что chf можно запускать откуда угодно. Если ваша текущая директория является проектом (или подпапкой проекта), инструмент ограничивается сессиями этого проекта; родительская «главная папка» ограничивает всеми проектами внутри неё; --any вообще игнорирует директорию. Автовыбор пропускает почти пустые сессии (например, заглушку, оставляемую claude /login), так что «последняя» означает вашу последнюю реальную беседу — явный путь, --name или -i всегда выигрывают.

Большие сессии. Транскрипты, выходящие за один проход (~400 тыс. символов), резюмируются в стиле map-reduce: заметки по частям, затем один синтез — ничего не теряется молча, а готовые части кэшируются в ~/.cache/claude-handoff, так что прерванный запуск бесплатно возобновляется. Части обрабатываются в 4 потока параллельно у API-провайдеров; claude-cli и ollama по замыслу остаются последовательными. В терминале вы видите живой индикатор прогресса:

[█████████░░░░░░░░░░░░░░░] 3/9 chunks | 4m12s elapsed | ~8m left | summarizing part 4/8 (199,867 chars)…

Сессии с данными об использовании API также получают строку Tokens в заголовке, и каждый запуск сообщает приблизительный размер результата в токенах.

Приватность и нулевое доверие

  • Ничего никуда не отправляется, если вы не передадите --llm — детерминированный режим полностью офлайн.

  • Редактирование включено для всех выходных данных, а не только для LLM-трафика: строки, похожие на секреты (API-ключи, токены, JWT, password=…) удаляются из самого handoff, файлов хуков и MCP-ответов — вставленный документ тоже является исходящим трафиком. --no-redact отключает редактирование для конкретного запуска (и намеренно не разрешён в файле конфигурации).

  • --anonymize дополнительно заменяет ваш домашний каталог на ~, а email, IPv4-адреса и ваше имя пользователя — на заглушки; для вставки в публичные issues и форумы.

  • --llm claude-cli и --llm ollama остаются в рамках учётной записи и машин, которыми вы уже управляете.

  • Защита от prompt-инъекций: в транскриптах регулярно встречается непроверенный текст (веб-страницы в результатах инструментов, вставленные README-файлы). Каждый промпт, который потребляет транскрипт, вводная часть handoff и обёртка внедрения памятки — всё это обрамляет такой контент как данные, а не инструкции; это закреплено тестами. Митигация, а не доказательство; сам парсер никогда ничего не выполняет.

Конфигурация (необязательно)

Поместите параметры по умолчанию, которые вы всегда используете, в ~/.config/claude-handoff/config.json (флаги CLI всегда выигрывают; CLAUDE_HANDOFF_CONFIG переопределяет путь):

{ "llm": "claude-cli", "fit": "32k", "include_tools": true }

Допустимые ключи: llm, model, fit, output, include_tools, include_sidechains, max_chars, anonymize, focus. Защитные переключатели (no_redact) намеренно не конфигурируются — ослабление редактирования должно быть явным выбором при каждом запуске. Сломанная конфигурация предупреждает и игнорируется, но не приводит к фатальной ошибке.

Переменные окружения

Переменная

Назначение

ANTHROPIC_API_KEY / CLAUDE_API

ключ для --llm claude (побеждает первый установленный)

OPENAI_API_KEY / GPT_API

ключ для --llm openai

GEMINI_API_KEY / GOOGLE_API_KEY / GEMINI_API

ключ для --llm gemini

OLLAMA_MODEL / OLLAMA_BASE_URL

локальная модель и конечная точка Ollama

CLAUDE_HOME

домашний каталог Claude Code (по умолчанию ~/.claude) — где живут сессии, handoff и памятки

CLAUDE_HANDOFF_CACHE

каталог кэша частей/заметок (по умолчанию ~/.cache/claude-handoff)

CLAUDE_HANDOFF_CONFIG

путь к файлу конфигурации (по умолчанию ~/.config/claude-handoff/config.json)

CLAUDE_HANDOFF_DEBUG

1 = то же, что --debug; также включает логирование в хуках (добавьте в команду хука или в env шелла)

claude-cli не требует переменных — он вызывает установленный вами CLI Claude Code и оплачивается по вашему плану Pro/Max (один раз войдите через claude).

MCP-сервер

Любой MCP-клиент (Claude Desktop, Claude Code, …) может получать handoff напрямую:

claude mcp add claude-handoff -- claude-handoff --mcp

Инструменты: list_sessions (что на этой машине) и handoff (создать документ для сессии по имени/проекту/пути; передайте anonymize для версии, доступной для распространения). По умолчанию детерминирован — MCP-клиент может запускать LLM-сводки только если вы запустили сервер с --allow-llm.

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

claude-handoff: command not found после pip install pip кладёт скрипты в пользовательский каталог bin, который может не быть в PATH. Используйте pipx install claude-handoff или brew — оба управляют PATH — или добавьте ~/.local/bin (Linux) / ~/Library/Python/3.x/bin (macOS) в PATH.

«Не найдено сессий в ~/.claude/projects» Вы на машине (или под пользователем), где ещё не запускали Claude Code, или ваше хранилище находится в другом месте — укажите CLAUDE_HOME. Внутри папки проекта инструмент ограничивается этим проектом; передайте --any, чтобы искать везде.

Выбрана не та сессия «Последняя» пропускает почти пустые заглушки, но всё равно просто самый новый файл. Используйте -i (выбор), --name "часть названия" или --grep "что-то сказанное".

--llm claude-cli не работает или запрашивает аутентификацию Запустите claude один раз и войдите (/login). Это работает даже при вызове изнутри сессии Claude Code — унаследованные переменные окружения CLAUDE* очищаются, так что вложенный CLI аутентифицируется как новый.

«Set ANTHROPIC_API_KEY … to use --llm claude» Провайдерам API нужен ключ в окружении — см. таблицу выше. Ключа нет вообще? Используйте --llm claude-cli (по подписке) или --llm ollama (локально).

--fit отказывается сочетаться с --llm / --max-chars --fit сам определяет размер детерминированного вывода. Если вы не вводили его, вероятно, ваш конфигурационный файл задаёт fit — переопределите, явно убрав --max-chars, или удалите ключ.

Инъекция брифа предупреждает «sessions newer than this brief exist» Это работает штамп свежести: запустите chf --brief --llm claude-cli, чтобы пере-дистиллировать (кэшируется — оплачиваются только новые сессии). Фактическая часть обновляется сама, если установлен хук SessionEnd.

Что-то молча ничего не сделало? Пути, устойчивые по замыслу (битые строки JSONL, нечитаемые файлы, проблемы с кэшем), никогда не прерывают выполнение — добавьте --debug (или CLAUDE_HANDOFF_DEBUG=1), чтобы увидеть, что именно было пропущено и почему. Хуки всегда сообщают об ошибках в stderr, при этом завершаясь с кодом 0.

Искажённые символы в Windows Установите PYTHONUTF8=1 (CI запускает весь набор тестов именно так).

Полный справочник флагов

Флаг

Значение

--list

список сессий (дата, размер, проект, заголовок · первый промпт); при наличии conversations.json — список его чатов

--name QUERY

выбрать самую новую сессию (или веб-беседу), чей заголовок/первый промпт содержит QUERY

--grep TEXT

выбрать самую новую сессию, чей разговор содержит TEXT (повторите флаг, чтобы требовать ВСЕ термины); с --list/-i показывает каждое совпадение с предпросмотром 🔍

--project NAME

выбрать последнюю сессию, чей путь проекта содержит NAME (повторяемый — несколько проектов вместе)

-i / --interactive

выбрать сессию(и) из нумерованного списка — 1,3 или 2-4 объединяет несколько в одну передачу

--any

игнорировать текущий каталог; рассматривать сессии всех проектов

--last N / --since 2h

оставить только хвост разговора (N пользовательских ходов / временное окно)

--merge

объединить все сессии в области видимости в ОДНУ передачу (маркеры разрыва сессии, суммированная активность)

--brief

дистиллировать всю историю проекта в ~/.claude/briefs/<project>.md (детерминированно; --llm для настоящей дистилляции)

--install-brief-hook / --uninstall-brief-hook

хуки памяти проекта: внедрять бриф при SessionStart, автообновлять факты при SessionEnd

--install-hook / --uninstall-hook

автоматически записывать передачу в ~/.claude/handoffs/ при завершении каждой сессии

--format md|json

markdown (по умолчанию) или машиночитаемый JSON — также применяется к --list

-o FILE / -o - / -o clipboard

выходной файл / stdout / буфер обмена (по умолчанию handoff.md)

--fit TOKENS

подогнать детерминированную передачу под бюджет токенов (32k, 128k, 1m) за счёт ужесточения усечения транскрипта

--max-chars N

ограничить раздел транскрипта (по умолчанию 80 000; сохраняет начало + недавний конец)

--include-tools

свёрнутые блоки <details> с каждым вызовом инструмента

--include-sidechains

добавить полные транскрипты субагентов (встроенные сайдчейны и <session-id>/subagents/agent-*.jsonl); их активность по файлам/командам всегда учитывается

--llm claude|openai|gemini|claude-cli|ollama

LLM-резюме вместо сырого очищенного транскрипта

--model ID

переопределить модель LLM

--focus TEXT

дополнительные инструкции для резюме (например, --focus "emphasize the API decisions")

--with-transcript

с --llm также добавить очищенный транскрипт

--anonymize

удалить идентифицирующую информацию для публичного обмена: домашние пути → ~, email/IP/имя пользователя → заглушки

--no-redact

сохранять строки, похожие на секреты (по умолчанию: редактируются во всех выводах, LLM или нет)

--no-cache

отключить кэш заметок по чанкам (~/.cache/claude-handoff)

--mcp

запуск как MCP-сервер через stdio

--allow-llm

с --mcp: разрешить инструменту handoff выполнять LLM-резюме (явное согласие)

--completions bash|zsh

вывести сниппет для автодополнения по табуляции

--debug

сообщать о терпимых сбоях (битые строки, нечитаемые файлы) в stderr — ничего не становится фатальным

Дорожная карта

  • Экспорты Gemini как входные данные (Google Takeout поставляет только HTML — нужен настоящий, отредактированный экспорт для разработки)

  • Цепочки сессий: автоматически определять сессии, продолженные через /compact, и предлагать объединить родословную (--follow)

PR приветствуются.

Сравнение с аналогами

Это пространство не пусто — оно фрагментировано. Выберите инструмент, соответствующий вашей ситуации:

  • Экспортёрыclaude-conversation-extractor, claude-code-log, claude-code-transcripts, claude-to-markdown — превращают транскрипты в читаемый Markdown/HTML, включая шум инструментов, без рамок передачи.

  • Переносчики сессий между CLIcli-continues (npm i -g continues) читает нативные хранилища сессий 16 кодинг-CLI (включая Claude Code) и внедряет контекстный документ в другой терминальный инструмент. Отлично для Claude Code → Codex/Cursor/Gemini CLI; но не может работать с веб-чатами, не делает LLM-резюмирование и требует Node 22.5+.

  • Навыки/плагины передачи внутри сессииthepushkarp/handoff, claude-session-handoff, claude-code-handoff — отлично если вы не забудете запустить их до конца сессии; модель пишет резюме, используя контекст вашей сессии, а вывод предназначен для следующей сессии Claude.

  • Браузерные расширения — Handoff, LLM Context Bridge, ContextSwitch — переносят веб-чаты между ChatGPT/Claude/Gemini; они не видят сессии Claude Code.

claude-handoff — это постфактумный, вставляемый куда угодно угол этой карты: он работает с JSONL после факта — старые сессии, упавшие сессии, сессии, достигшие лимита использования — не требует ничего установленного заранее, по умолчанию стоит ноль токенов, может написать настоящее резюме, когда вы попросите (--llm), и создаёт документ, который может подхватить любая принимающая модель, включая claude.ai, ChatGPT и Gemini в браузере или на телефоне. А с --brief это единственный инструмент, который превращает эту историю в постоянную память проекта.

Разработка

git clone https://github.com/Vasilispapg/claude-handoff && cd claude-handoff
python3 -m unittest discover -s tests -v      # the whole suite (no deps needed)
python3 -m claude_handoff tests/fixtures/agent_session.jsonl -o -   # smoke run
python3 scripts/build_single.py --check       # single-file build is fresh
uvx ruff check claude_handoff scripts tests   # lint (config in pyproject)

Код выполнения находится в пакете claude_handoff/; single/claude_handoff.py генерируется — пересоберите его с помощью python3 scripts/build_single.py после любого изменения пакета (CI падает, если он устарел). Новое поведение парсера начинается с отредактированного фикстура в tests/fixtures/ — см. CONTRIBUTING.md и AGENTS.md (инструкции и инварианты для людей и ИИ-контрибьюторов).

Узнать больше

docs/GUIDE.mdдень с claude-handoff: пошаговое руководство, как работает --brief шаг за шагом, честная таблица стоимости, шпаргалка · INDEX.md — карта файлов · docs/DEVELOPMENT.md — архитектура, заметки по схеме JSONL, дизайн-решения · AGENTS.md — руководство для ИИ-агентов-контрибьюторов · CONTRIBUTING.md · CHANGELOG.md

Лицензия

MIT


Install Server
A
license - permissive license
A
quality
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
18Releases (12mo)
Commit activity

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Persistent memory for Claude Code. Automatically indexes every conversation and provides production-grade hybrid search (BM25 + vectors + reranker) via MCP tools. 100% local, zero config, zero API keys, zero invoice.
    16
    55
    7
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Persistent local memory for Claude Code that indexes every session's JSONL file verbatim into SQLite + ChromaDB. Exposes 17 MCP tools for semantic recall, deterministic file replay, and fuzzy "do you remember when..." queries across your entire session history — no API calls, nothing leaves the machine.
    17
    12
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Persistent memory + FTS5 full-text search for Claude Code conversation history. Indexes ~/.claude/projects/ JSONL into SQLite, exposes 10 MCP tools (store/recall/search memories, browse sessions, get summaries) plus prompts. Includes a web UI for visual exploration
    10
    89
    92
    MIT

View all related MCP servers

Related MCP Connectors

  • Hosted MCP memory: save sessions/decisions once, search from Claude, Cursor, ChatGPT. EU-hosted FTS.

  • Persistent context for Claude. Your AI always knows your projects and next actions across sessions.

  • One memory, every AI: Claude, ChatGPT, Perplexity, Gemini, Cursor, OpenClaw, Hermes, any MCP client.

View all MCP Connectors

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/Vasilispapg/claude-handoff'

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