by Riccardo8888 (community) Claude Code, Codex, OpenCode, любой MCP-клиент, Python 3.10+, Windows, macOS, Linux
End-to-end зашифрованный канал связи между coding-агентами, где бы они ни находились.
HTTP-native чат и заметки для агентов, чей sandbox разрешает только webfetch — каждая запись — обычный …
MCP-сервер для доступа к актуальной документации библиотек прямо в контексте LLM. Вместо устаревших обучающих данных — …
Официальный MCP от команды Chrome DevTools: дает AI-агентам полный доступ к инструментам разработчика браузера. Автоматизация через …
Официальный MCP-сервер от Microsoft для управления браузером через Playwright. Использует accessibility tree вместо скриншотов — быстрее, …
# требуется авторизованный git-доступ к приватному репозиторию (gh auth login, ssh-ключ или PAT) python3 -m pip install --user pipx python3 -m pipx ensurepath pipx install git+https://github.com/Riccardo8888/agent-link.git agent-link install agent-link config --set git_remote="git@github.com:you/your-project.git" # либо из клона репозитория ./install.sh # Linux / macOS powershell -ExecutionPolicy Bypass -File install.ps1 # Windows
Два агента кодирования на двух разных машинах, общающиеся друг с другом напрямую.
Вы и ваш коллега оба работаете с Claude Code, или один из вас использует Codex. Вместо того чтобы вручную пересылать друг другу фразы вроде «я возьму модуль аутентификации, а ты — фронтенд», агенты говорят это друг другу сами. Они распределяют работу, передают задачи и сообщают о прогрессе в комнате со сквозным шифрованием.
Развёртывать нечего, и платить не за что. Один приватный репозиторий, в который вы оба можете пушить, — это вся инфраструктура. Никакого сервера, никакого аккаунта, никаких открытых портов.
Репозиторием может быть тот, в котором вы уже работаете вместе. Для этого ничего не нужно создавать.
Одна зависимость Python, Python 3.10+ и git. Windows, Linux и macOS.
Пока репозиторий приватный: вы должны быть коллаборатором и авторизованы в git (gh auth login, ssh-ключ или PAT), чтобы команда установки сработала.
На каждой машине. Клонировать ничего не нужно и хранить ничего не нужно:
pipx install git+https://github.com/Riccardo8888/agent-link.git
agent-link install
pipx обычно ещё не установлен: python3 -m pip install --user pipx, затем python3 -m pipx ensurepath, и перезапустите оболочку. Обычный pip install тоже работает, и тогда python3 -m link.install также сработает.
Или из клона, если он у вас есть:
./install.sh # Linux / macOS
powershell -ExecutionPolicy Bypass -File install.ps1 # Windows
pwsh -File install.ps1 # or PowerShell 7+
Это вся установка. Она находит Python, устанавливает пакет, проверяет, что эта машина действительно может запечатать сообщение, и подключает найденных агентов (Claude Code, Codex или обоих). Повторный запуск безопасен, и каждый файл, который она редактирует, сначала резервируется.
MCP-сервер и хук уведомлений регистрируются как -m link.mcp_server и -m link.hook_notify, поэтому после завершения установки ничто не указывает на каталог на диске, и клон, если вы его создали, можно удалить. Используйте --dev (-Dev в Windows) для установки в режиме editable — это то, что нужно, если вы изменяете этот код.
Затем перезапустите редактор и укажите ему приватный репозиторий, который вы и ваш коллега уже используете. Подойдёт ваш проектный репозиторий:
agent-link config --set git_remote="git@github.com:you/your-project.git"
agent-link doctor проверяет, что репозиторий доступен, что у git есть учётные данные для него и что он приватный.
Ничего не нужно создавать, и ничто ваше не затрагивается. Канал — это orphan-ветка с именем agent-link, корневой коммит без родителя, и всё, что он пишет, хранится в claude-link/ в этой ветке. Ваш код никогда не затрагивается и даже не загружается: транспорт выполняет git init и refspec для этой одной ветки, поэтому он никогда не клонирует вашу историю.
Единственное, что ветка не защищает, — это ваш CI. Heartbeat-сигналы присутствия пушатся примерно каждые 45 секунд, и workflow с on: push без фильтра по веткам будет запускаться на каждом из них. Прежде чем направлять это на репозиторий, в котором выполняется сборка, добавьте branches-ignore: [claude-link] в эти workflow. doctor и config --set git_remote=... оба проверяют это и сообщают об этом.
Опции и что делать, когда что-то идёт не так
./install.sh --agent codex # just Codex (or: claude, both, auto)
./install.sh --skip-hook # no notification hook
./install.sh --self-test suite # run the test suite too, not just a smoke test
./install.sh --dev # editable, for working on agent-link itself
./install.sh --help
Если после этого agent-link не найден, консольный скрипт оказался в месте, которого нет в вашем PATH; установщик выводит, где именно. После установки через pip всё также работает как python3 -m link.cli ... из любого каталога. После pipx это не работает, и в этом суть pipx: пакет живёт в изолированном virtualenv, так что agent-link — единственный способ взаимодействия. Запустите pipx ensurepath, если shim отсутствует.
agent-link doctor — это то, что нужно запускать, когда связь не работает. Он проверяет зависимость, демон, git-remote и ретранслятор и сообщает, что делать с каждым из них.
Обновление. SKILL.md копируется в каталог навыков каждого агента при установке, поэтому обновление пакета оставляет эти копии в точности такими, какими они были, со всем их содержимым. Запустите agent-link update после любого обновления, и doctor сообщит вам, если вы забудете.
Один из вас создаёт комнату. Попросите своего агента или выполните команду сами:
agent-link join --room auth-review
Это выводит одну строку:
auth-review#K7PQ2M4XBVWZ9NRTYD3JFHCS8A
Отправьте её коллеге любым обычным способом. Он вставляет её:
agent-link join --invite 'auth-review#K7PQ2M4XBVWZ9NRTYD3JFHCS8A'
Теперь вы в одной комнате. Присоединение сохраняется — сделайте это один раз.
Затем скажите своему агенту: «проверь link_status и поздоровайся с комнатой».
Если вы оказались в комнате одни, когда ожидали компанию, значит приглашения различаются. Опечатка в секрете создаёт действительную, пустую, другую комнату вместо ошибки, потому что идентификатор комнаты выводится из секрета, и ему не с чем сравнивать.
link_joinсообщает, сколько других находится там для именно по этой причине.
Приглашение выше и есть ключ комнаты: передавайте его только тогда, когда вы именно это имеете в виду. Обычно передают код двери (agent-link invite --door, также печатается при создании): он выглядит как auth-review#DOOR-... и не содержит секретов. Тот, кто присоединяется с ним, стучится — называет своё имя, агент каждого участника спрашивает одну строку («София хочет присоединиться к auth-review. Впустить её?»), и первое «да» отправляет ключ комнаты, запечатанный, только ей и никому другому. Ошибочно введённый код двери отклоняется, а не создаёт пустую комнату, и поддельный ответ не может привести вас не в ту комнату: ключ внутри должен соответствовать точному идентификатору комнаты, к которой вы постучались. При первом входе в любую комнату ваш агент спрашивает ваше имя; после этого в комнатах отображаются люди, а не идентификаторы устройств.
| Инструмент | Блокирует? | Что делает |
|---|---|---|
link_status |
нет | Комнаты, кто онлайн, количество непрочитанных, живой транспорт |
link_join |
нет | Создаёт или открывает комнату; возвращает приглашение и список участников |
link_send |
нет | Отправляет в комнату; ставится в очередь, если никто не доступен |
link_inbox |
нет | Забирает новые сообщения, обрезанные до 400 символов |
link_read |
нет | Полный текст одного сообщения |
link_wait |
да, с ограничением | Ждёт сообщение до timeout_ms |
link_channel |
нет | Побочные каналы для субагентов: открыть / закрыть / перечислить |
link_history |
нет | Воспроизводит с диска после перезапуска или /clear |
link_leave |
нет | Покидает комнату |
link_send и link_inbox возвращаются примерно за миллисекунду — они передают работу локальному демону и сразу возвращаются, так что агент может проверить комнату между шагами своей собственной работы без затрат. Блокирует только link_wait.
Хук уведомлений также подталкивает входящие сообщения в сессию по мере их поступления, поэтому ни одному агенту не нужно опрашивать. Это позволяет двоим из них работать без присмотра.
Каждое сообщение записывается на каждой машине участника в .conv/<room>/ — .jsonl для машин, transcript.md для людей.
Claude Code Codex CLI Claude Code
│ MCP stdio │ MCP stdio │ MCP stdio
┌────▼─────┐ ┌────▼─────┐ ┌────▼─────┐
│ mcp srv │ │ mcp srv │ │ mcp srv │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ 127.0.0.1 ctrl │ │
┌────▼─────┐ ┌────▼─────┐ ┌────▼─────┐
│ daemon │ │ daemon │ │ daemon │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└──────────────┬───────┴──────────────────────┘
one private repo you all push to
(or an optional relay)
Каждый агент общается с локальным демоном через loopback-сокет. Демоны перемещают запечатанные кадры через репозиторий. Демон владеет всем медленным — переподключениями, циклом синхронизации, входящими сообщениями, журналами — поэтому вызов инструмента никогда не ждёт сеть.
git — переносчик. Репозиторий, в который пушит каждый участник, включая тот, в котором вы уже работаете. Отделённая ветка, ограниченная claude-link/, и ваш код никогда не извлекается.relay — необязательно, для доставки за доли секунды. Размещение стоит несколько долларов в месяц, и никогда не размещалось. Этот репозиторий содержит только клиентскую часть; сервер поставляется отдельно.direct — WebSocket напрямую между участниками в доверенной сети. Выключен по умолчанию: это означает привязку порта, чего канал git и существует, чтобы избежать.Синхронизированная папка раньше была по умолчанию и больше не предлагается. Это был наименее проверенный путь здесь: каждый тест проводился против локальной временной папки, которая мгновенна, атомарна и не имеет собственного мнения, а OneDrive и Dropbox приносят задержку синхронизации в минуты, конфликтные копии, которые ничего не разбирают, и частичные записи, которые видит пир. Он никогда не переносил реальное сообщение между двумя машинами, а репозиторий переносил. Код остаётся, потому что GitTransport построен на нём, и существующий shared_dir продолжает работать, а не замолкает, но doctor скажет вам прекратить его использовать.
Комнаты ключуются сгенерированным секретом, а не паролем, который вы придумали. link_join(room="name") создаёт 128 случайных бит и печатает приглашение; эта строка — единственное, что должно путешествовать, и она никогда не попадает в репозиторий, репозиторий или ретранслятор.
Всё, что переносит сообщения, считается враждебным. Кадры запечатаны AES-256-GCM под ключом, который переносчик никогда не видит, и подписаны отправляющим устройством, поэтому ни один участник не может подделать другого. Заголовок маршрутизации привязан как к подписи, так и к тегу AEAD, поэтому ретранслятор не может переименовать то, что пересылает.
| Противник | Может | Не может |
|---|---|---|
| Сетевой наблюдатель | Видеть, что устройство общается с ретранслятором, и сколько | Прочитать что-либо |
| Враждебный ретранслятор | Отбрасывать, задерживать, переупорядочивать; видеть идентификаторы комнат и устройств; видеть, кто с кем общается | Прочитать сообщения, подделать отправителя, войти в комнату |
| Тот, кто размещает репозиторий | Всё, что может ретранслятор, и хранить это: история git фиксирует каждый обмен задним числом | Прочитать сообщения, подделать отправителя, войти в комнату |
| Участник комнаты | Чтение и публикация | Выдать себя за другого участника или переупаковать сообщение в другую комнату |
Честные ограничения, потому что они важнее гарантий:
doctor выдаёт ошибку для публичного, если не установлен allow_public_carrier, что означает согласие с тем, что граф становится доступным всему миру навсегда; контент в любом случае остаётся запечатанным..conv/ в открытом виде на каждой машине участника.Против модели угроз были проведены две независимые проверки безопасности; всё, что они нашли, либо исправлено, либо указано выше как известное ограничение. Нашли уязвимость? В SECURITY.md описано, как сообщить о ней конфиденциально, и какие из указанных выше ограничений являются особенностями дизайна.
agent-link status # full state as JSON
agent-link doctor # diagnose: dependency, daemon, relay, share, repo
agent-link install # wire up the agents on this machine
agent-link update # refresh the SKILL.md each agent reads, after an upgrade
agent-link whoami # this device's label, id and fingerprint
agent-link join # create or join a room (door codes knock)
agent-link invite # print a room's invite; --door for the secretless code
agent-link name # show or set the name rooms ask for
agent-link knocks # who is waiting at your rooms' doors
agent-link grant/deny # answer a knock
agent-link watch # live tail of incoming messages
agent-link send "..." # send from the terminal
agent-link read <id> # one message in full, past the inbox preview
agent-link wake # block until a message lands, then exit
agent-link logs / restart / git-prune
python3 -m unittest discover -s tests # 509 tests, six or so minutes
python3 -m unittest tests.test_transport_git # the git channel alone, ~2 min of that
Сеть не требуется: набор запускает реальные демоны в отдельных процессах и управляет двумя реальными клонами git относительно голого репозитория. CI запускает его на Linux (3.10–3.14), macOS и Windows, и запускает установщик от начала до конца на всех трёх платформах.
link/
crypto.py room derivation, sealing, signatures, invites, id shapes
identity.py this device's keypair and which agent is driving it
envelope.py wire format, sealed and in clear
room.py roster, sequencing, dedupe, transport choice
transport_file.py delivery through a directory; the engine GitTransport rides
transport_git.py the same, against a git repo everyone pushes to
transport_relay.py outbound wss:// to the relay
transport_direct.py WebSocket straight between members, opt-in
wsproto.py RFC 6455 over asyncio streams
daemon.py rooms, routing, inbox, channels, control socket
client.py control-socket client, daemon autostart
mcp_server.py MCP stdio server for Claude Code and Codex
cli.py human CLI
hook_notify.py pushes incoming messages into the session
store.py config, state, .conv/ logging
text.py rendering text a remote party wrote
install.py the installer, for every agent and platform
util.py time, ids, atomic writes
SKILL.md what the agent itself reads; ships inside the package so
an install from a URL carries it
SECURITY.md how to report a break in private, and what is by design
install.sh, install.ps1
Riccardo Bertamini riccardo.bertamini@studbocconi.it Niccolò Maria Pagano niccolo.pagano@studbocconi.it