<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Блог NeuroSquad</title>
    <link>https://neurosquad.ai/ru/blog/</link>
    <description>Заметки о разработке NeuroSquad — десктопного приложения, где агентские CLI работают карточками на одном холсте: решения, замеры, найденные баги и что изменилось в каждом выпуске.</description>
    <language>ru</language>
    <lastBuildDate>Sat, 26 Sep 2026 14:31:27 GMT</lastBuildDate>
    <atom:link href="https://neurosquad.ai/ru/blog.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Девятнадцать агентских CLI, одна глубина интеграции</title>
      <link>https://neurosquad.ai/ru/blog/nineteen-agent-clis/</link>
      <guid isPermaLink="true">https://neurosquad.ai/ru/blog/nineteen-agent-clis/</guid>
      <pubDate>Sat, 26 Sep 2026 14:31:27 GMT</pubDate>
      <category>Выпуск</category>
      <category>Интеграции</category>
      <category>Инженерия</category>
      <description>Как NeuroSquad довёл 19 агентских CLI до уровня Claude Code: чеклист примерно из сорока возможностей, свой механизм для каждого инструмента и доказательство там, где что-то невозможно.</description>
      <content:encoded>&lt;p&gt;&lt;img src=&quot;https://neurosquad.ai/blog/nineteen-agent-clis/add-menu-ru.webp&quot; alt=&quot;Меню добавления карточки в NeuroSquad: агентские CLI с иконками, установленные отмечены&quot;/&gt;&lt;/p&gt;&lt;p&gt;NeuroSquad 0.1.137 добавляет девять агентских CLI — Gemini CLI, GitHub Copilot CLI, Amp, Factory Droid, aider, Goose, Kimi Code, Cline и Auggie — и дотягивает Cursor CLI и Crush до уровня остальных. Итого девятнадцать, и впервые слово «поддерживается» значит для всех одно и то же.&lt;/p&gt;
&lt;p&gt;Три дня назад это было не так. Первый выпуск запускал в карточках десять CLI, но глубоко был интегрирован только Claude Code: его статусы приходили из его собственных хуков, его сессия продолжалась после перезапуска, он получал инструменты по стрелкам. Остальные работали в терминале, и за ними в основном следила эвристика. Эта запись — о том, как этот разрыв закрылся за три выпуска в пределах суток.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;У каких CLI была полная интеграция — выпуск за выпуском. Пройдите по шагам.&lt;/em&gt; &lt;a href=&quot;https://neurosquad.ai/ru/blog/nineteen-agent-clis/&quot;&gt;Живая копия — попробуйте&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Что значит «та же глубина»&lt;/h2&gt;
&lt;p&gt;Мы записали всё, что приложение делает для Claude Code, в чеклист примерно из сорока возможностей, и у каждого CLI есть свой документ, который проходит по этому списку строка за строкой. Каждая строка — одно из трёх: &lt;strong&gt;нативно&lt;/strong&gt; (у CLI это есть, и приложение этим пользуется), &lt;strong&gt;эмулировано&lt;/strong&gt; (собрано из другого механизма этого CLI — и как именно) или &lt;strong&gt;невозможно&lt;/strong&gt; — с доказательством, обычно строкой из исходников самого CLI.&lt;/p&gt;
&lt;p&gt;Строки, которые важнее всего тому, кто работает на холсте:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Возобновление сессии&lt;/strong&gt;: перезапустите приложение или карточку — и агент продолжит тот же разговор.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Точные статусы&lt;/strong&gt;: работает, ждёт вас, закончил — по собственным событиям CLI и с текстом того, о чём он спрашивает.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Инструменты по стрелкам&lt;/strong&gt;: MCP-инструменты приложения плюс подключённые MCP-серверы и скиллы.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Режим карточек&lt;/strong&gt;: агент работает через карточки (терминал для команд, браузер для веба), а не через свои встроенные инструменты, — и это держится даже в опасном режиме.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Безопасное прерывание&lt;/strong&gt; тормозом бюджета, без потери сессии.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Расход и модель&lt;/strong&gt; по карточке, &lt;strong&gt;индикатор контекста&lt;/strong&gt; и сжатие, &lt;strong&gt;продолжение&lt;/strong&gt; после лимита.&lt;/li&gt;&lt;/ul&gt;
&lt;h2&gt;К каждому CLI — свой вход&lt;/h2&gt;
&lt;p&gt;Чеклист один, а механизм почти никогда не совпадает. Для Claude Code приложение передаёт файл настроек поверх ваших, и его хуки сообщают о каждой смене состояния одной строкой &lt;code&gt;curl&lt;/code&gt;. Вот как туда добрались некоторые другие.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenCode&lt;/strong&gt; получает плагин — один файл на все карточки, — который сообщает о состоянии сессии и о запросах разрешений. Конфиг передаётся через одну переменную окружения, выбранную методом исключения: переменная для встроенного JSON уже несла заголовки атрибуции OpenRouter, а два писателя одной переменной затирают друг друга; переменная для &lt;em&gt;папки&lt;/em&gt; конфига спрятала бы ваш глобальный файл инструкций. С прерыванием тоже пришлось быть аккуратнее: Ctrl+C в OpenCode при пустом поле ввода &lt;strong&gt;закрывает приложение&lt;/strong&gt;, а тормоз бюджета раньше слал именно его. Теперь он дважды нажимает Escape.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hermes Agent&lt;/strong&gt; читает слой конфигурации уровня администратора, и приложение направляет его на собственный файл для каждой карточки, который сливается с вашим по листьям. Живая проверка показала, что интерактивный режим подключает MCP-серверы, только если они есть в вашем исходном конфиге, — поэтому карточка сама набирает &lt;code&gt;/reload-mcp&lt;/code&gt;, как только готово приглашение, а первый промпт ждёт строки &lt;code&gt;Agent updated&lt;/code&gt;, прежде чем вставиться. Ещё одна находка: когда падает провайдер модели, Hermes так и не присылает событие конца сессии, и карточка навсегда застревала на «работает»; пока ход открыт, приложение теперь ещё и следит в терминале за ошибками провайдера, которые печатает Hermes.&lt;/p&gt;
&lt;p&gt;У &lt;strong&gt;Gemini CLI&lt;/strong&gt;, как и у его форка Qwen Code, есть путь к системным настройкам, но этот файл он загружает, только если тот принадлежит администраторам и недоступен пользователям на запись. Файл в папке приложения пропускается с предупреждением безопасности. Зато Gemini честно уважает подмену домашней папки, поэтому каждая карточка Gemini работает со своим домом, где лежит её слой настроек, — а всё остальное из вашего настоящего &lt;code&gt;~/.gemini&lt;/code&gt;, включая сессии и вход, подключено через связи каталогов (junction). Сессия карточки — это ваша сессия: &lt;code&gt;gemini --resume&lt;/code&gt; работает из обычного терминала и обратно.&lt;/p&gt;
&lt;p&gt;У &lt;strong&gt;aider&lt;/strong&gt; нет ни MCP-клиента, ни хуков, ни API плагинов. Зато это программа на Python, а Python раньше всего остального импортирует модуль &lt;code&gt;sitecustomize&lt;/code&gt; из пути поиска. Карточка aider стартует с одной папкой в начале &lt;code&gt;PYTHONPATH&lt;/code&gt;, чей модуль по мере загрузки патчит шесть модулей aider — каждый патч с защитой, так что если будущая версия aider переименует метод, отключится только эта одна функция, — а затем убирает свои переменные, чтобы их не унаследовало ничего, что запускает aider.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kilo Code&lt;/strong&gt; по умолчанию подключается к уже запущенному демону Kilo вместо того, чтобы стартовать свой рабочий процесс, а у демона своё окружение — и карточка молча теряла бы конфиг, инструменты и MCP-токен. Теперь каждая карточка Kilo стартует с ключом, отключающим подключение. &lt;strong&gt;Codex CLI&lt;/strong&gt; раньше переживал остановку своей карточки: npm-шим умирал, а &lt;code&gt;codex.exe&lt;/code&gt; продолжал жить. Теперь карточка запускает настоящий исполняемый файл напрямую.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/nineteen-agent-clis/new-agent-ru.webp&quot; alt=&quot;Диалог «Новый агент» с открытым списком агентских CLI&quot;/&gt;&lt;figcaption&gt;При создании агента выберите CLI, провайдера и модель. Установленные CLI ищутся по текущему PATH этого компьютера.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;«Невозможно» — тоже ответ&lt;/h2&gt;
&lt;p&gt;Некоторые строки заполнить нельзя, и сказать об этом прямо — часть работы. Несколько CLI — Auggie, Droid, Goose, Kimi — не дают вызывающей стороне выбрать id сессии; приложение перехватывает id, который они выдают сами, и продолжает сессию по нему. У Auggie нет команды сжатия, потому что он сам сворачивает историю, когда окно заполняется, — у его карточки просто нет кнопки Compact. Cline читает список инструментов сервера один раз, при старте сессии, и ничто его не обновляет, — поэтому стрелка, нарисованная посреди сессии, начинает действовать со следующего запуска, и в документации так и написано.&lt;/p&gt;
&lt;p&gt;У Kimi Code то же ограничение, и там оно эмулировано: карточке Kimi с самого начала предлагаются все встроенные группы инструментов, а стрелки решают в момент вызова, разрешён ли он. В карточку заметки, созданную посреди сессии, агент записал в той же сессии.&lt;/p&gt;
&lt;p&gt;Amp — самый честный случай. Его агентский цикл, включая вызовы модели, работает на серверах Amp; локальный CLI только выполняет инструменты. Поэтому OpenRouter и атрибуция для Amp невозможны, а всё, что приложение делает вокруг него, проверено на локальной подделке сервера Amp.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Найдено вживую: строка, разорванная терминалом&lt;/strong&gt; Когда сессия Goose удалена, Goose печатает &lt;code&gt;no such session exists&lt;/code&gt;, и приложение должно восстановиться, начав новую. Первая версия это пропускала: консоль Windows перенесла строку как &lt;code&gt;no suc / h session exists&lt;/code&gt;. Теперь маркеры восстановления сравниваются с полностью удалёнными пробелами.&lt;/p&gt;
&lt;h2&gt;Как это проверяли&lt;/h2&gt;
&lt;p&gt;Каждый CLI ставился во временную папку, никогда глобально, и запускался отдельной сборкой приложения со своим профилем и временной домашней папкой, так что ничей настоящий конфиг не читался и не записывался. Большинство CLI были направлены на маленький сервер модели со сценарием на loopback-интерфейсе — он отвечает на &lt;code&gt;PING&lt;/code&gt;, вызывает инструменты, зависает на пятнадцать секунд, возвращает 429, — чтобы лимиты, зависания и запросы разрешений можно было вызвать по требованию, а не ждать.&lt;/p&gt;
&lt;p&gt;Тот же сервер записывал заголовки запросов — так и проверялась атрибуция OpenRouter: каждый CLI, который работает с OpenRouter, теперь отправляет заголовки NeuroSquad, включая карточки на собственном входе CLI в OpenRouter, и каждый из них &lt;strong&gt;измерен на перехватывающем сервере&lt;/strong&gt;, а не взят из документации.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/nineteen-agent-clis/add-menu-ru.webp&quot; alt=&quot;Меню добавления карточки: сначала агентские CLI, поиск, установленные отмечены&quot;/&gt;&lt;figcaption&gt;Меню добавления начинается с агентов; установленные на этом компьютере отмечены.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;По дороге прибавились два исправления поменьше: карточки Kilo Code больше не теряют настройки из-за общего демона, а токен Qwen Code для MCP-сервера приложения больше не пишется на диск. Полные списки — в журнале изменений &lt;a href=&quot;https://neurosquad.ai/ru/changelog/#v0.1.128&quot;&gt;0.1.128&lt;/a&gt;, &lt;a href=&quot;https://neurosquad.ai/ru/changelog/#v0.1.133&quot;&gt;0.1.133&lt;/a&gt; и &lt;a href=&quot;https://neurosquad.ai/ru/changelog/#v0.1.137&quot;&gt;0.1.137&lt;/a&gt;.&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>Карточки сообщества, MCP-серверы и скиллы — всё подключается стрелкой</title>
      <link>https://neurosquad.ai/ru/blog/cards-mcp-skills-by-arrow/</link>
      <guid isPermaLink="true">https://neurosquad.ai/ru/blog/cards-mcp-skills-by-arrow/</guid>
      <pubDate>Fri, 25 Sep 2026 10:25:35 GMT</pubDate>
      <category>Выпуск</category>
      <category>Расширения</category>
      <category>Безопасность</category>
      <description>NeuroSquad открывается: карточки, которые может сделать кто угодно, MCP-серверы и скиллы из публичных каталогов, проверенные карточки. Как всё изолировано и почему стрелка остаётся разрешением.</description>
      <content:encoded>&lt;p&gt;&lt;img src=&quot;https://neurosquad.ai/blog/cards-mcp-skills-by-arrow/catalog-ru.webp&quot; alt=&quot;Каталог MCP-серверов и скиллов в NeuroSquad с результатами поиска по официальному реестру MCP&quot;/&gt;&lt;/p&gt;&lt;p&gt;До этой недели каждая карточка на холсте NeuroSquad была нашей. 0.1.123 изменил это сразу в трёх местах: &lt;strong&gt;карточки сообщества&lt;/strong&gt;, которые может сделать и опубликовать на GitHub кто угодно, &lt;strong&gt;MCP-серверы&lt;/strong&gt; из официального реестра MCP и &lt;strong&gt;скиллы&lt;/strong&gt; со skills.sh — и каждое из этого выдаётся конкретному агенту стрелкой. Через полтора часа 0.1.125 добавил &lt;strong&gt;проверенные карточки&lt;/strong&gt;: отрецензированный список со значком, у которого точный смысл.&lt;/p&gt;
&lt;p&gt;У холста есть одно правило, благодаря которому его можно читать: агент пользуется ровно тем, на что указывают его стрелки. Открывать холст для чужого кода имело смысл, только если это правило уцелеет. Большая часть работы в этих выпусках — о том, чтобы оно уцелело.&lt;/p&gt;
&lt;h2&gt;Сначала — сделать карточку дешёвой в добавлении&lt;/h2&gt;
&lt;p&gt;Первые карточки вшивались в приложение руками: тип карточки в объединении типов, ветка на холсте, подписи, иконки, запись в таблицах MCP-сервера, шаг в каскаде удаления — около десятка мест на карточку. По одной это терпимо, а при параллельной работе над несколькими — гарантированный конфликт.&lt;/p&gt;
&lt;p&gt;Поэтому сначала встроенные карточки стали плагинами: одна папка на стороне страницы, один модуль в главном процессе, IPC-каналы под общим префиксом, MCP-инструменты, которые регистрирует сама карточка, строки в собственном файле. Холст, сайдбар, стрелки и удаление обращаются с любой плагин-карточкой одинаково. Когда карточка — плагин, дать написать её кому-то другому — вопрос изоляции, а не проводки.&lt;/p&gt;
&lt;h2&gt;Карточки сообщества: песочница, из которой не выбраться за пределы карточки&lt;/h2&gt;
&lt;p&gt;Карточка сообщества — это маленькое веб-приложение. Его можно было бы запускать в отдельном нативном веб-представлении, но это оверлей уровня ОС: он лежал бы поверх холста, а не внутри него, и не масштабировался и не обрезался бы вместе с ним. Вместо этого карточка работает в изолированном iframe с непрозрачным origin, который отдаётся через собственный протокол приложения. Прежде чем строить на этом, мы проверили, что такой фрейм может и чего не может в этой конкретной версии Electron:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Он работает в &lt;strong&gt;отдельном процессе ОС&lt;/strong&gt;. Карточка, крутившая пустой цикл четыре секунды, не заморозила холст: таймер хоста продолжал тикать, самый большой разрыв — 63 мс.&lt;/li&gt;&lt;li&gt;&lt;code&gt;window.api&lt;/code&gt;, Node и &lt;code&gt;require&lt;/code&gt; там просто нет, а обращение к родительской странице бросает ошибку безопасности.&lt;/li&gt;&lt;li&gt;&lt;code&gt;localStorage&lt;/code&gt; и IndexedDB недоступны (отсюда собственный API хранилища), а внешние запросы блокирует политика безопасности контента фрейма.&lt;/li&gt;&lt;li&gt;Он не может открывать окна, уходить в полноэкранный режим, читать буфер обмена и включать микрофон.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Две проверки не прошли, и именно они самые ценные. WebRTC полностью игнорирует политику безопасности контента: WebRTC-соединение дотянулось до TCP-порта на локальной машине. Исправление прямолинейное — загрузочный скрипт карточки удаляет конструктор WebRTC до того, как выполнится любой код карточки. Вторая была в приложении, а не во фрейме: его обработчик разрешений выдавал микрофон любому, кто попросит. Теперь он выдаёт его только собственной странице приложения верхнего уровня — это строка «Доступ к микрофону выдаётся только самому приложению» в журнале изменений.&lt;/p&gt;
&lt;p&gt;Карточка никогда не общается со страницей, на которой нарисована. Она получает порт сообщений в главный процесс, привязанный к одному экземпляру карточки, и каждый запрос проверяется там по правам, которые пакет объявил, а вы выдали при установке. Всё, что доходит до другой карточки или агента, — передача данных через порт, промпт агенту, ввод в терминал, — требует &lt;strong&gt;и&lt;/strong&gt; права, &lt;strong&gt;и&lt;/strong&gt; стрелки между двумя карточками. Стрелка — это согласие именно на этот поток данных.&lt;/p&gt;
&lt;p&gt;Установка — по адресу на GitHub, с привязкой к коммиту и сверкой с хэшем дерева файлов пакета. Обновления происходят только по вашему клику и сначала показывают, что изменилось в правах. Как сделать свою карточку — на &lt;a href=&quot;https://neurosquad.ai/ru/card-sdk/&quot;&gt;странице Card SDK&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Проверенные карточки: значок, который значит одно&lt;/h2&gt;
&lt;p&gt;У установки по адресу есть очевидная дыра: как найти карточку, которую стоит ставить? 0.1.125 добавляет каталог карточек, проверенных командой NeuroSquad; он лежит в публичном репозитории и пополняется через пул-реквесты. Искать по нему можно в меню «Своя карточка…» или в настройках.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/cards-mcp-skills-by-arrow/verified-ru.webp&quot; alt=&quot;Вкладка «Проверенные» в выборе своей карточки: проверенная карточка с зелёным значком-щитом&quot;/&gt;&lt;figcaption&gt;Проверенные карточки в меню выбора. Щит означает, что проверен именно этот код, — а не что он никогда не может навредить.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Значок решает главный процесс, и значит он ровно следующее: установленная карточка взята из проверенного репозитория, на проверенном коммите, &lt;strong&gt;и&lt;/strong&gt; хэш её файлов, посчитанный при установке, совпадает с хэшем в каталоге. Локальная папка разработки, другой коммит или другие файлы — значка нет.&lt;/p&gt;
&lt;p&gt;Установка из каталога идёт на шаг дальше: если имя, версия или хэш не совпадают с записью каталога, установка &lt;strong&gt;отклоняется&lt;/strong&gt;. Выбирать приходилось между «поставить без значка» и «не ставить», а подменённый пакет — не то, что стоит тихо ставить. Более новая проверенная версия предлагается как обновление с обычным сравнением прав и никогда не ставится сама; карточка, пропавшая из списка, теряет значок, и с вашего холста ничего не удаляется.&lt;/p&gt;
&lt;h2&gt;MCP-серверы и скиллы — по стрелке&lt;/h2&gt;
&lt;p&gt;Каталог в приложении ищет по официальному реестру MCP (около 35 тысяч серверов) и по skills.sh (20 тысяч самых устанавливаемых скиллов). Поиск локальный, прямо в приложении, по снимкам, которые идут вместе с ним и обновляются инкрементально, — поэтому он работает без сети и мгновенно.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/cards-mcp-skills-by-arrow/catalog-ru.webp&quot; alt=&quot;Вкладка MCP-серверов в каталоге с результатами поиска&quot;/&gt;&lt;figcaption&gt;Поиск по реестру MCP прямо в приложении. Перед установкой видно, что будет запущено, и согласие спрашивается один раз.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Очевидный способ дать агенту MCP-сервер — прописать его в конфиг агентского CLI. Мы сознательно так не сделали. NeuroSquad сам выступает MCP-клиентом каждого установленного сервера и отдаёт его инструменты через собственный MCP-сервер как &lt;code&gt;&amp;lt;alias&amp;gt;__&amp;lt;tool&amp;gt;&lt;/code&gt; — только агентам, у которых есть стрелка к карточке сервера, и только пока эта стрелка существует. В папки настроек вашего CLI ничего не пишется, а секреты сервера не покидают главный процесс. Claude Code подхватывает новую стрелку без перезапуска; остальные CLI видят её при следующем старте.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Копия: установленный MCP-сервер, два агента и стрелка, которая отдаёт сервер ровно одному из них.&lt;/em&gt; &lt;a href=&quot;https://neurosquad.ai/ru/blog/cards-mcp-skills-by-arrow/&quot;&gt;Живая копия — попробуйте&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Скиллы устроены так же — через один инструмент, &lt;code&gt;skill_load&lt;/code&gt;, в описании которого перечислены подключённые к агенту скиллы и когда какой применять. Один флаг отделил функцию от демонстрации: агенты прячут MCP-инструменты за поиском инструментов, и в живой проверке свежий агент ни разу не загрузил подходящий скилл. С пометкой «загружать всегда» он сам загрузил нужный.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;То же для скилла: подключён стрелкой, загружается, когда этого требует задача.&lt;/em&gt; &lt;a href=&quot;https://neurosquad.ai/ru/blog/cards-mcp-skills-by-arrow/&quot;&gt;Живая копия — попробуйте&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Что изменил аудит безопасности&lt;/h2&gt;
&lt;p&gt;Оба выпуска перед выходом прошли аудит безопасности, и три его результата стоит описать:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;У каждого агента свой токен&lt;/strong&gt; для MCP-сервера приложения, выведенный из секрета текущего запуска и id агента. Раньше один агент теоретически мог действовать от имени другого; теперь чужой путь отвечает 401.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Сторонние инструменты живут на втором MCP-сервере&lt;/strong&gt;, которого нет в списке заранее разрешённых инструментов CLI. Поэтому CLI спрашивает вас перед каждым вызовом инструмента с чужого сервера, — а список инструментов при установке запоминается отпечатком, так что сервер, который позже поменяет свои инструменты, ждёт, пока вы примете изменения.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Скилл берётся целиком, с одного коммита.&lt;/strong&gt; Собственный хэш содержимого skills.sh не воспроизводится по файлам, которые он отдаёт, поэтому приложение закрепляет свой SHA-256 ровно тех файлов, которые вы просмотрели, и ставит именно их.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Не всё встаёт на место. Официальный удалённый сервер Figma отвечает 403 на динамическую регистрацию клиента — он принимает только одобренных клиентов, — поэтому каталог предлагает вместо него сервер сообщества, который работает с личным токеном. Пакеты, которым нужен локальный HTTP-сервер, пока не поддерживаются. И то и другое записано, а не обойдено.&lt;/p&gt;
&lt;p&gt;Подробнее — на страницах &lt;a href=&quot;https://neurosquad.ai/ru/mcp/&quot;&gt;MCP-серверов&lt;/a&gt; и &lt;a href=&quot;https://neurosquad.ai/ru/skills/&quot;&gt;скиллов&lt;/a&gt;, полный список — в журнале изменений &lt;a href=&quot;https://neurosquad.ai/ru/changelog/#v0.1.123&quot;&gt;0.1.123&lt;/a&gt; и &lt;a href=&quot;https://neurosquad.ai/ru/changelog/#v0.1.125&quot;&gt;0.1.125&lt;/a&gt;.&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>Пятьдесят карточек на одном холсте: куда уходил процессор, и карточка «Команда»</title>
      <link>https://neurosquad.ai/ru/blog/fifty-cards-one-canvas/</link>
      <guid isPermaLink="true">https://neurosquad.ai/ru/blog/fifty-cards-one-canvas/</guid>
      <pubDate>Thu, 24 Sep 2026 19:07:33 GMT</pubDate>
      <category>Выпуск</category>
      <category>Производительность</category>
      <category>Инженерия</category>
      <description>Как NeuroSquad снизил нагрузку простаивающего холста на процессор со ~100% до ~15%: замеренные причины, пул WebGL-контекстов, семантический зум и новая карточка «Команда».</description>
      <content:encoded>&lt;p&gt;&lt;img src=&quot;https://neurosquad.ai/blog/fifty-cards-one-canvas/overview-ru.webp&quot; alt=&quot;Воркспейс «Launch day» издалека: каждая карточка показывает крупную плитку-сводку вместо содержимого&quot;/&gt;&lt;/p&gt;&lt;p&gt;NeuroSquad 0.1.117 — выпуск, который замечаешь в основном по тому, что прекратилось: вентилятор, разгоняющийся, когда ничего не происходит, рывки при перетаскивании рамки, полной карточек, подвисание каждый раз, когда отдаляешь холст за порог, после которого карточки становятся плитками. А ещё в нём появилась карточка «Команда» — одна доска, где видно, чем занят каждый агент воркспейса.&lt;/p&gt;
&lt;p&gt;Цель для холста не менялась с первых недель: до пятидесяти живых карточек — терминалов, браузеров, агентов — с плавными паном, зумом, перетаскиванием и изменением размера. Правило, как к ней идти, тоже не менялось: сначала замерить. Каждое число в этой записи получено на отдельном экземпляре приложения со свежим профилем, которым управляли настоящими событиями ввода через протокол DevTools.&lt;/p&gt;
&lt;h2&gt;Первый раунд: пятьдесят терминалов&lt;/h2&gt;
&lt;p&gt;Первый проход случился ещё до публичного выпуска — на воркспейсе из пятидесяти карточек, где двенадцать терминалов печатали с максимальной скоростью. Зум тормозил по причине, которую легко пропустить: шапка каждой карточки держит постоянный экранный размер, и делала она это через &lt;code&gt;width&lt;/code&gt; и &lt;code&gt;margin&lt;/code&gt;. Это свойства раскладки. Каждый кадр зума менял размер каждой шапки, та меняла размер тела карточки, а оно дёргало &lt;code&gt;ResizeObserver&lt;/code&gt; каждого терминала — пятьдесят подгонок терминала, пятьдесят сообщений в главный процесс, пятьдесят ресайзов консоли. На каждый кадр.&lt;/p&gt;
&lt;p&gt;Исправление: фиксировать значение зума один раз за жест, а не на каждом кадре, менять размер терминала, только когда реально меняется его сетка из колонок и строк, и на время движения зума подменять живые сетки терминалов статичной заглушкой. Затем терминалы перешли с DOM-рендерера xterm на WebGL-рендерер — и именно туда уходила большая часть времени: медиана кадра зума упала с 18,2 до 6,1 мс, p95 — со 133 до 12 мс.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chromium держит ровно 16 WebGL-контекстов на процесс&lt;/strong&gt; Мы это измерили, а не предположили. С WebGL на всех пятидесяти терминалах за секунду получалось «live: 16, lost: 34» — причём выживали шестнадцать смонтированных первыми, а не те, на которые вы смотрите. Поэтому терминалы получают контексты из пула на пятнадцать: их выдают тем, что на экране, и забирают у тех, что с него ушли.&lt;/p&gt;
&lt;p&gt;Один замер того раунда определил правило, которое до сих пор живёт в коде. Заглушки вместо терминалов вдвое ускорили зум (медиана 6,1 против 12,0 мс) и замедлили пан (в среднем 19,8 против 16,3 мс): пан просто сдвигает уже нарисованные слои, и спрятать пятьдесят сеток, а потом вернуть их, стоит дороже, чем даёт. Поэтому заглушки появляются, только когда жест действительно меняет зум.&lt;/p&gt;
&lt;h2&gt;Второй раунд: холст в простое&lt;/h2&gt;
&lt;p&gt;Второй раунд начался с более странной жалобы: холст тяжёлый, даже когда &lt;em&gt;ничего&lt;/em&gt; не происходит. Четыре параллельных ревью кода и одна сессия живого профилирования на воркспейсе «Launch day» нашли не одну причину, а кучу мелких постоянных трат. Самой крупной оказался мультяшный персонаж.&lt;/p&gt;
&lt;p&gt;У карточек ИИ-агентов есть маленький маскот, который показывает состояние агента. Его анимации ожидания были бесконечными CSS-анимациями на дочерних элементах SVG — а их браузер перерисовывает в главном потоке, каждый кадр, вечно. С тремя карточками Claude Code на холсте при зуме 60% процесс рендерера занимал 98–104% ядра, а GPU — 32–36%, ничего при этом не делая. Теперь зациклено только состояние «работает», и двигается в нём HTML-обёртка, с которой композитор справляется сам; остальные состояния проигрываются несколько раз и замирают в позе, которая сама говорит, что происходит.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;~100% → 15%&lt;/strong&gt; — процессор рендерера, холст в простое с тремя карточками агентов&lt;/li&gt;&lt;li&gt;&lt;strong&gt;~34% → 3%&lt;/strong&gt; — GPU на том же холсте&lt;/li&gt;&lt;li&gt;&lt;strong&gt;180 → 66&lt;/strong&gt; — композитных слоёв после одного CSS-правила&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Остальное — список вещей, каждая из которых стоила немного, но все работали постоянно:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;**Селекторы с &lt;code&gt;&lt;em&gt;&lt;/code&gt; и &lt;code&gt;:has()&lt;/code&gt; внутри холста.&lt;/em&gt;* Переключение класса на панели холста каждый раз стоило 25–34 мс пересчёта стилей: правила вроде «каждый потомок жеста» приходилось заново сопоставлять с каждым узлом каждой карточки. Явный список элементов, которые действительно анимируются, свёл это примерно к 1,5 мс.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CSS-переменная на панели.&lt;/strong&gt; Уровень зума жил в кастомном свойстве на элементе, который содержит все карточки, и его изменение инвалидировало стили всего поддерева, терминалы включительно, — 22–34 мс на запись. Теперь это одно правило в теге &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;, которое касается только элементов, читающих это значение.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Кнопки со своими слоями.&lt;/strong&gt; Библиотека компонентов даёт кнопкам собственный GPU-слой. Внутри холста это означало десятки лишних слоёв; одно переопределение вне нажатого состояния снизило их число со 180 до 66.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Таймеры в карточках.&lt;/strong&gt; Карточки, которые что-то опрашивают, — порты, бюджет, стендап, наблюдение за страницей, — теперь тикают, только пока их воркспейс открыт и окно видно, и делят одни часы на период вместо собственного интервала у каждой.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Браузерная карточка, на которую никто не смотрел,&lt;/strong&gt; продолжала стримить кадры. Теперь кадры идут, только пока карточку показывает хоть одно окно: в обзоре и в скрытых воркспейсах — ноль, при возврате — снова идут.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Долгие задачи во время жестов исчезли из перетаскивания рамки, выделения рамкой, зума через порог обзора и пана в обзоре. Пану и перетаскиванию теперь нужно примерно вдвое меньше процессора рендерера; время стилей и раскладки в трассе пана упало с 311 до 53 мс и с 378 до 28 мс.&lt;/p&gt;
&lt;h2&gt;Когда карточки слишком мелкие, чтобы их читать&lt;/h2&gt;
&lt;p&gt;Отдалите холст как следует — и терминал станет серым прямоугольником. Ниже 55% (порог меняется в настройках) каждая карточка показывает вместо содержимого плитку: иконку, название и один факт, важный для её типа, — состояние агента, &lt;code&gt;3/11&lt;/code&gt; у списка задач, колонки доски, первую строку заметки.&lt;/p&gt;
&lt;p&gt;Тело карточки остаётся смонтированным под плиткой, в своём настоящем размере: терминал не убивается и даже не подгоняется заново. Плитка рисуется в экранных пикселях, поэтому читается при любом зуме. Пересечение порога перерисовывает ноль тел карточек и каждую плитку по одному разу; пан не перерисовывает вообще ничего.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/fifty-cards-one-canvas/overview-ru.webp&quot; alt=&quot;Воркспейс Launch day при зуме ниже 55%: каждая карточка — читаемая плитка с состоянием&quot;/&gt;&lt;figcaption&gt;«Launch day» издалека: каждая карточка превращается в плитку с главным фактом, а терминалы под ними продолжают работать.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Есть одна тонкость. Терминал за плиткой невидим, но не на паузе — собственная проверка видимости у библиотеки терминала не замечает CSS-свойство &lt;code&gt;visibility&lt;/code&gt;, — так что он продолжал бы рисовать вывод, который никто не видит. Вместо этого карточка копит вывод и записывает его одним махом, когда вы снова приближаете холст. Кроме одного вида фрагментов: вопрос, который программа задаёт терминалу («кто ты?», «где курсор?»), — часть диалога, и ответить на него нужно сразу. Запоздалый ответ появлялся в приглашении bash буквальным &lt;code&gt;1;2c&lt;/code&gt; — найдено вживую и исправлено.&lt;/p&gt;
&lt;h2&gt;Карточка «Команда»&lt;/h2&gt;
&lt;p&gt;Когда на холсте много агентов, вопрос «кто меня ждёт?» не должен требовать экскурсии по холсту. Карточка «Команда» отвечает на него одной доской: все ИИ-агенты воркспейса по группам &lt;em&gt;ждёт вас&lt;/em&gt;, &lt;em&gt;работает&lt;/em&gt;, &lt;em&gt;закончил&lt;/em&gt; и &lt;em&gt;свободен&lt;/em&gt; — с CLI, моделью и тем, сколько длится текущий ход. Нажмите на плитку, чтобы отфильтровать список; нажмите на строку — и камера перелетит к этой карточке.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Копия карточки «Команда» со строками самого приложения. Часы идут; нажмите на плитку, а потом на строку.&lt;/em&gt; &lt;a href=&quot;https://neurosquad.ai/ru/blog/fifty-cards-one-canvas/&quot;&gt;Живая копия — попробуйте&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Колонка модели аккуратнее, чем кажется. Она показывает модель последнего запроса агента, как она записана в его собственном журнале сессии; если такой записи нет — модель, заданную на карточке; если нет и её — модель по умолчанию из файла настроек самого CLI. Когда нет ничего из этого, там написано «Модель по умолчанию», а не догадка.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/fifty-cards-one-canvas/squad-ru.webp&quot; alt=&quot;Карточка «Команда» в воркспейсе Launch day: три агента Claude Code и их состояние&quot;/&gt;&lt;figcaption&gt;Настоящая карточка. Строка один раз вспыхивает янтарным, когда агент останавливается, чтобы что-то у вас спросить.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;«Команда» добавляется в каждый воркспейс один раз — левее самой левой карточки. Если её удалить, она останется удалённой; вернуть её можно из меню. Чтобы «один раз» работало правильно, понадобилось ещё одно исправление: первая версия ставила карточку раньше, чем загружалась сохранённая раскладка воркспейса, и холст раскладывал все карточки заново. Первое открытие существующего воркспейса могло сложить все его карточки в один угол. Это и есть баг из раздела «Исправлено» этого выпуска.&lt;/p&gt;
&lt;p&gt;Изменилось и меню добавления: агенты идут первыми, установленные на этом компьютере отмечены, есть поиск, а пустой холст открывается крупными плитками агентов. Полный список — в &lt;a href=&quot;https://neurosquad.ai/ru/changelog/#v0.1.117&quot;&gt;журнале изменений 0.1.117&lt;/a&gt;.&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>Мы написали свой установщик, и NeuroSquad теперь обновляется сам</title>
      <link>https://neurosquad.ai/ru/blog/own-installer-and-auto-updates/</link>
      <guid isPermaLink="true">https://neurosquad.ai/ru/blog/own-installer-and-auto-updates/</guid>
      <pubDate>Thu, 24 Sep 2026 06:17:11 GMT</pubDate>
      <category>Выпуск</category>
      <category>Установщик</category>
      <category>Инженерия</category>
      <description>Почему NeuroSquad заменил сгенерированный установщик своим: 550 МБ превратились в 96, мешающие процессы названы по PID, а обновление не оставляет недоустановленное приложение.</description>
      <content:encoded>&lt;p&gt;&lt;img src=&quot;https://neurosquad.ai/blog/own-installer-and-auto-updates/installer-welcome-ru.webp&quot; alt=&quot;Окно установщика NeuroSquad: выбор папки установки и ярлык на рабочем столе&quot;/&gt;&lt;/p&gt;&lt;p&gt;NeuroSquad 0.1.100 — первая версия, которая сама следит за своей актуальностью. Путь сюда занял три выпуска меньше чем за сутки и дал самый полезный урок недели: установщик — часть продукта. Это первое окно, которое видят люди, и когда он ломается, он ломается в худшем месте — между старой версией, которой уже нет, и новой, которой ещё нет.&lt;/p&gt;
&lt;h2&gt;С 550 МБ до 96&lt;/h2&gt;
&lt;p&gt;Первый публичный установщик весил 550 МБ. Большую часть занимала модель диктовки — около 640 МБ в распакованном виде; её положили внутрь, чтобы голосовой ввод работал сразу после запуска. Но диктовка — вещь необязательная, и заставлять всех качать её ради того, чтобы попробовать холст с агентами, было неудачным компромиссом.&lt;/p&gt;
&lt;p&gt;В 0.1.92 модель из установщика убрали. Теперь она скачивается, когда вы её попросите, — на шаге «Диктовка» мастера настройки или позже в настройках, — а диктовка включается сама, как только загрузка закончится, без перезапуска. До тех пор строка состояния пишет «Диктовка: скачайте модель», а не показывает ошибку. Установщик похудел примерно до 110 МБ.&lt;/p&gt;
&lt;p&gt;Остальное нашлось в менее эффектном месте — в том, что упаковывается. Упаковщик целиком копирует каждую рабочую зависимость приложения, а десктопное приложение перечисляло там весь стек интерфейса — библиотеки компонентов, наборы иконок, инструментарий доступности, — хотя сборщик и так вкомпилирует всё это в страницу. Перенос всего, что нужно только странице, из рантайм-зависимостей сэкономил около 70 МБ файлов, которые никто никогда не загружал. 0.1.94 вышел на 96 МБ.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;550 МБ&lt;/strong&gt; — первый публичный установщик, 0.1.91&lt;/li&gt;&lt;li&gt;&lt;strong&gt;110 МБ&lt;/strong&gt; — без модели диктовки, 0.1.92&lt;/li&gt;&lt;li&gt;&lt;strong&gt;96 МБ&lt;/strong&gt; — только то, что приложение загружает при работе, 0.1.94&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Крюк через 1,7 ГБ&lt;/strong&gt; Один эксперимент раздул установщик до 1,7 ГБ. Список файлов, объявленный только для Windows, не дополняет общий список, а заменяет его — и сборка упаковала всё, что лежало в папке. Теперь это записанное правило сборки.&lt;/p&gt;
&lt;h2&gt;Почему сгенерированному установщику пришлось уйти&lt;/h2&gt;
&lt;p&gt;Первые установщики генерировал инструмент упаковки, и два бага в них были настолько неприятными, что оправдали написание собственного.&lt;/p&gt;
&lt;p&gt;Первый: он отказывался ставиться с сообщением «NeuroSquad не может быть закрыт», хотя NeuroSquad уже был закрыт. Проверка звучала как «запущен ли хоть какой-то процесс из папки установки» — без имён. А запущенными оставались консольные хосты терминалов из карточек агентов, пережившие выход из приложения. Их не было видно, сообщение их не называло, и нажать было не на что.&lt;/p&gt;
&lt;p&gt;Второй был хуже: прерванная установка могла оставить после себя недописанное приложение. В одном случае это был &lt;code&gt;neurosquad.exe&lt;/code&gt; на 8 МБ вместо 200 — и никакой записи в списке приложений Windows, через которую его можно было бы удалить.&lt;/p&gt;
&lt;h2&gt;Новый установщик&lt;/h2&gt;
&lt;p&gt;Это небольшая WPF-программа для .NET Framework 4.8, который уже входит в Windows 10 и 11, так что заранее ничего ставить не нужно. Сам исполняемый файл весит около 240 КБ; приложение дописано к нему LZMA-архивом, нарезанным на блоки по 32 МБ, которые упаковываются и распаковываются параллельно, с CRC-32 для каждого файла. Сборка один раз скачивает свой компилятор C# и сверяет его с закреплённым SHA-256; SDK на машине сборки тоже не нужен.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/own-installer-and-auto-updates/installer-welcome-ru.webp&quot; alt=&quot;Первая страница установщика: папка установки и ярлык на рабочем столе&quot;/&gt;&lt;figcaption&gt;Выберите папку — для папки по умолчанию права администратора не нужны — и нужен ли ярлык на рабочем столе. Установщик говорит по-английски, по-русски и по-китайски.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Отличается он в основном тем, что говорит вам правду:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Живой журнал каждого шага&lt;/strong&gt; — в окне и в файле в &lt;code&gt;%TEMP%&lt;/code&gt;, так что у любого сбоя есть строка, на которую можно показать пальцем.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Мешающие процессы перечислены по имени и PID&lt;/strong&gt; и завершаются только по нажатию кнопки. Никаких догадок и тихих убийств.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Обновление никогда не пишет поверх.&lt;/strong&gt; Новая версия распаковывается рядом со старой, проверяется, и папки меняются местами, только когда всё на месте. Сбой или отмена оставляют старую версию ровно такой, какой она была.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Удаление убирает то, что было установлено&lt;/strong&gt;, — файлы из списка, составленного при установке, ярлыки и запись в «Приложениях». Ваши данные удаляются, только если вы поставите галочку.&lt;/li&gt;&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/own-installer-and-auto-updates/installer-processes-ru.webp&quot; alt=&quot;Установщик показывает, что держит папку установки: neurosquad.exe и OpenConsole.exe с их PID&quot;/&gt;&lt;figcaption&gt;Что держит папку — по имени и PID: само приложение и терминалы его карточек. Завершаются, только когда вы нажмёте кнопку.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/own-installer-and-auto-updates/installer-failed-ru.webp&quot; alt=&quot;Установка не смогла заменить файл: ошибка, журнал и пометка, что прежняя версия на месте&quot;/&gt;&lt;figcaption&gt;Если файл всё равно не заменить, установка останавливается с открытым журналом, а прежняя версия остаётся как была.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Одна деталь невидима и при этом обязательна: ярлык в меню «Пуск» должен нести AppUserModelID приложения. Без него Windows не доставляет всплывающие уведомления приложения — а «ваш агент ждёт вас» и есть то уведомление, вокруг которого построен весь продукт.&lt;/p&gt;
&lt;p&gt;Проверять установщик на машине, где ведётся разработка, рискованно, поэтому у него есть два ключа как раз для этого. &lt;code&gt;--snapshot&lt;/code&gt; сохраняет каждую страницу в PNG на любом из трёх языков. &lt;code&gt;--sandbox&lt;/code&gt; кладёт ярлыки и запись «Приложений» в папку вместо меню «Пуск» и реестра, так что установку, обновление и удаление можно прогнать от начала до конца, не трогая систему.&lt;/p&gt;
&lt;h2&gt;Обновления, которые ставятся сами&lt;/h2&gt;
&lt;p&gt;Когда установщик умеет безопасно заменить работающую копию, автообновление становится возможным. NeuroSquad проверяет новый выпуск при каждом запуске и раз в час, скачивает его в фоне и сверяет SHA-256 с контрольной суммой, которую публикует сам выпуск. Нет контрольной суммы — нет установки.&lt;/p&gt;
&lt;p&gt;Обновления не отключаются; выбираете вы только время. Кольцо в заголовке окна показывает загрузку, затем значок с точкой позволяет обновиться в любой момент, а диалог один раз на версию спрашивает: сейчас или при следующем запуске. «Сейчас» закрывает приложение и передаёт работу установщику, который дожидается выхода приложения, ставит новую версию поверх и запускает её. Следующий запуск ставит известную более новую версию ещё до открытия приложения — а если сети нет, после трёх попыток сдаётся и открывает ту версию, что есть.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Копия заголовка окна и диалога обновления со строками самого приложения. Выберите «Обновить сейчас» или «При следующем запуске».&lt;/em&gt; &lt;a href=&quot;https://neurosquad.ai/ru/blog/own-installer-and-auto-updates/&quot;&gt;Живая копия — попробуйте&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Баг, который нашла проверка обновления&lt;/h2&gt;
&lt;p&gt;Обновление проверяли по-настоящему: две сборки, локальная лента выпусков, обновление при запуске, обновление посреди работы приложения и запуск без сети с уже скачанным обновлением. С «Обновить сейчас» новая версия появлялась на экране примерно через десять секунд.&lt;/p&gt;
&lt;p&gt;А до этого первый прогон упал — на обмене папок. Что-то всё ещё держало папку установки, и это было не приложение. Это был тот же осиротевший консольный хост, что сбивал с толку старый установщик: дочерний процесс терминала карточки, у которого &lt;em&gt;рабочей папкой&lt;/em&gt; была папка установки — потому что оттуда было запущено само приложение. Процесса, для которого папка является текущей, достаточно, чтобы Windows не дала её переименовать.&lt;/p&gt;
&lt;p&gt;Исправление — одна строка в самом начале запуска приложения: сменить рабочую папку на домашнюю. Дочерние процессы её наследуют, и папка установки больше ни для кого не текущая. Вторую половину закрыл 0.1.108: при обновлении со старой версии, чьи оставшиеся терминалы всё ещё держат папку, установщик теперь показывает их вместе с остальными процессами, а если файл держит что-то, что он не может опознать, — например, окно Проводника, — он не сдаётся, а заменяет файлы по одному и возвращает всё как было, если какой-то шаг не удался.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Установщик — единственная часть приложения, которую нельзя исправить следующим обновлением. Он должен работать правильно, пока ничего другого не запущено.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Если у вас 0.1.94 или старше, один раз запустите новый установщик поверх — дальше обновления будут приходить сами. Всё, что изменилось, — в &lt;a href=&quot;https://neurosquad.ai/ru/changelog/#v0.1.100&quot;&gt;журнале изменений 0.1.100&lt;/a&gt;.&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>Зачем NeuroSquad: агенты на холсте, а не в ряду вкладок</title>
      <link>https://neurosquad.ai/ru/blog/why-neurosquad/</link>
      <guid isPermaLink="true">https://neurosquad.ai/ru/blog/why-neurosquad/</guid>
      <pubDate>Wed, 23 Sep 2026 15:33:19 GMT</pubDate>
      <category>Выпуск</category>
      <category>Дизайн</category>
      <description>Первый публичный выпуск NeuroSquad: почему у каждого агентского CLI своя карточка на холсте, как приложение понимает, что агент закончил или ждёт вас, и почему стрелки — это инструменты.</description>
      <content:encoded>&lt;p&gt;&lt;img src=&quot;https://neurosquad.ai/blog/why-neurosquad/canvas-ru.webp&quot; alt=&quot;Окно NeuroSquad: холст с карточкой агента, терминалом, заметкой, списком задач и доской, соединёнными стрелками&quot;/&gt;&lt;/p&gt;&lt;p&gt;Сегодня вышел NeuroSquad 0.1.91 — установщик для Windows, десять агентских CLI и холст. Первый коммит был 3 сентября, и по ходу дела агенты, запущенные в карточках самого NeuroSquad, помогали его строить. Эта запись — о том, почему он устроен именно так.&lt;/p&gt;
&lt;h2&gt;Проблема: ряд вкладок, за которыми надо присматривать&lt;/h2&gt;
&lt;p&gt;Агентские CLI стали настолько хороши, что узким местом один из них уже не является. Вы запускаете второй на тесты, третий на документацию, может быть, четвёртый — в другом репозитории. И дальше работа превращается в наблюдение: какая вкладка закончила, какая десять минут висит на вопросе вроде «можно выполнить эту команду?», какая всё ещё работает.&lt;/p&gt;
&lt;p&gt;Вкладки для этого не годятся. Они прячут всё, кроме той, что перед глазами, ничего не говорят о состоянии и ничего не знают друг о друге. Агент в третьей вкладке не может заглянуть в браузер в пятой, даже когда ему нужно именно это.&lt;/p&gt;
&lt;p&gt;Поэтому NeuroSquad делает три ставки. Каждый агент — это &lt;strong&gt;карточка с настоящим терминалом&lt;/strong&gt; на холсте, который видно целиком. Приложение &lt;strong&gt;само сообщает&lt;/strong&gt;, когда агент закончил ход или ждёт вас, — больше не нужно проверять вручную. А &lt;strong&gt;стрелка&lt;/strong&gt; между двумя карточками даёт агенту пользоваться тем, на что она указывает.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/why-neurosquad/canvas-ru.webp&quot; alt=&quot;Демо-воркспейс в NeuroSquad: карточка агента в центре и стрелки от неё к терминалу, заметке и списку задач&quot;/&gt;&lt;figcaption&gt;Воркспейс, с которого начинается каждая новая установка: настоящая карточка Claude Code, настоящая оболочка, заметка, список задач и доска. Стрелки — это инструменты агента.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Карточка — это настоящий терминал, и он не должен умирать&lt;/h2&gt;
&lt;p&gt;Карточка — не окно чата, которое притворяется агентом. Это тот самый CLI, которым вы уже пользуетесь, — Claude Code, Codex CLI, OpenCode, Qwen Code и ещё шесть, — запущенный в настоящем псевдотерминале, со своим интерфейсом, своими клавишами и своими причудами. Если CLI обновится завтра, завтра же обновится и карточка.&lt;/p&gt;
&lt;p&gt;Этот выбор задал первый инвариант всей кодовой базы: &lt;strong&gt;компонент терминала нельзя размонтировать, пока его агент жив&lt;/strong&gt;, потому что размонтирование убивает процесс. Звучит очевидно. Оказалось, что это определяет почти каждую функцию холста:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Переключение воркспейса не заменяет холст. Каждый открытый за сессию воркспейс держит свой холст смонтированным, а неактивные просто скрыты.&lt;/li&gt;&lt;li&gt;Приближение к группе карточек — это полёт камеры к рамке группы, а не фильтр: фильтр размонтировал бы карточки за её пределами.&lt;/li&gt;&lt;li&gt;Разворот карточки на весь экран — это вьюпорт 1:1 плюс сохранённая геометрия, а не другой компонент.&lt;/li&gt;&lt;li&gt;Библиотека холста удаляет выделенную ноду по клавише Delete. Здесь это означало бы убить сессию одним нажатием, поэтому библиотеке удалять ноды не разрешено вовсе: наш собственный обработчик собирает выделение и один раз спрашивает в диалоге.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Под той же ставкой лежит много сантехники Windows. CLI резолвится в абсолютный путь штатным поиском системы, потому что десктопное приложение видит не тот PATH, что ваш терминал. Пути передаются с прямыми слэшами, потому что библиотека псевдотерминала портит обратные, — кроме &lt;code&gt;cmd.exe&lt;/code&gt;, который читает &lt;code&gt;C:/…&lt;/code&gt; как набор ключей. Переменные, которые родительский агент оставляет в окружении, вычищаются перед запуском дочернего, иначе тот молча перестаёт сохранять транскрипт. Ничего из этого не видно, и всё это пришлось находить, запуская настоящие программы.&lt;/p&gt;
&lt;h2&gt;«Закончил» и «ждёт вас» — разные события&lt;/h2&gt;
&lt;p&gt;Весь смысл холста в том, что вы отворачиваетесь. Значит, приложение должно знать, когда вас позвать, — и причины бывают две, очень разные. &lt;em&gt;Закончил&lt;/em&gt; — агент завершил ход, и ответ можно прочитать когда угодно. &lt;em&gt;Ждёт вас&lt;/em&gt; — агент заблокирован прямо сейчас, пока вы что-то не одобрите.&lt;/p&gt;
&lt;p&gt;Первая версия их не различала. Она следила за терминалом: если заголовок окна не менялся 1,2 секунды, а вывод молчал 2,5 секунды, ход считался законченным. Для «закончил» догадка неплохая — и ровно та же тишина, что у агента, который ждёт ответа на запрос разрешения.&lt;/p&gt;
&lt;p&gt;Решение — спросить самого агента. У Claude Code есть хуки жизненного цикла, поэтому каждая карточка запускает его с небольшим файлом настроек поверх ваших: когда вы отправляете промпт, он сообщает &lt;em&gt;работает&lt;/em&gt;, когда поднимает уведомление — &lt;em&gt;ждёт вас&lt;/em&gt;, когда останавливается — &lt;em&gt;закончил&lt;/em&gt;. Каждый хук — одна строка &lt;code&gt;curl&lt;/code&gt; к серверу, который приложение держит на loopback-интерфейсе, а токен карточки лежит в самом адресе, а не в заголовке, — так команда переживает любую оболочку.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Два маленьких, но важных правила&lt;/strong&gt; Уведомление «ждёт вас» несёт слова самого агента — «Claude needs your permission to use Bash», — потому что тост, по которому не отличить вопрос про &lt;code&gt;rm -rf&lt;/code&gt; от вопроса про чтение файла, — это шум. И оно не исчезает само: заблокированный агент не разблокируется через пять секунд.&lt;/p&gt;
&lt;p&gt;Агенты, которые сообщают о себе через хуки, выключают для себя старый угадывающий детектор, иначе пришло бы два оповещения, и угаданное «закончил» перезаписало бы настоящее «ждёт вас». CLI без хуков по-прежнему работают на эвристике. Клик по уведомлению переносит камеру холста к карточке, и та мигает зелёным достаточно долго, чтобы ещё мигать, когда камера долетит.&lt;/p&gt;
&lt;h2&gt;Стрелки — это инструменты&lt;/h2&gt;
&lt;p&gt;О третьей ставке спрашивают чаще всего. NeuroSquad держит собственный MCP-сервер на &lt;code&gt;127.0.0.1&lt;/code&gt;, и каждый агент, который умеет MCP, получает на нём сессию. Что в эту сессию входит, решают стрелки на холсте.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Стрелка к карточке браузера даёт агенту инструменты &lt;code&gt;browser_*&lt;/code&gt;: настоящий Chrome, видимый в карточке, в котором агент кликает и печатает у вас на глазах.&lt;/li&gt;&lt;li&gt;Стрелка к карточке терминала даёт &lt;code&gt;terminal_&lt;em&gt;&lt;/code&gt;: выполнить команду именно в &lt;/em&gt;этой* оболочке и прочитать её экран.&lt;/li&gt;&lt;li&gt;Стрелка к заметке даёт &lt;code&gt;note_&lt;em&gt;&lt;/code&gt;, к списку задач — &lt;code&gt;todo_&lt;/em&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Стрелка к другому агенту даёт &lt;code&gt;agent_*&lt;/code&gt;, и у этой стрелки есть направление: от ведущего к помощнику. Помощник не может отправить работу обратно наверх.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Стрелка и есть разрешение. Нет стрелки — нет инструмента, и поэтому холст честно показывает, до чего может дотянуться каждый агент. Каждый вызов рисуется на своей стрелке в момент вызова: видно, как ведущий передаёт задачу помощнику, и не нужно читать об этом в логе.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Копия холста, которая работает прямо на этой странице: ведущий агент раздаёт задачи трём помощникам по своим стрелкам, и каждый помощник двигает свою карточку на доске.&lt;/em&gt; &lt;a href=&quot;https://neurosquad.ai/ru/blog/why-neurosquad/&quot;&gt;Живая копия — попробуйте&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://neurosquad.ai/blog/why-neurosquad/arrows-ru.webp&quot; alt=&quot;Крупный план карточки агента со стрелками к терминалу, заметке и списку задач&quot;/&gt;&lt;figcaption&gt;Та же проводка в настоящем приложении. Каждая стрелка — набор инструментов агента; остальной холст ему недоступен.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Локально по умолчанию&lt;/h2&gt;
&lt;p&gt;Ни аккаунта, ни нашего сервера посередине. Воркспейсы, карточки и стрелки — JSON-файлы в папке данных приложения. Диктовка распознаётся на вашем компьютере — Parakeet или Whisper. Раздел расхода читает токены и стоимость из логов самих агентов, а не через прокси перед ними. Удаление карточки никогда не трогает папку проекта.&lt;/p&gt;
&lt;p&gt;В выпуске есть и то, что в эту запись не поместилось: &lt;a href=&quot;https://neurosquad.ai/ru/remote/&quot;&gt;удалённый доступ&lt;/a&gt;, который запускает всё приложение в браузере телефона, изолированные git worktree для каждого агента и тормоз бюджета, который прерывает всех агентов воркспейса, когда достигнут лимит трат, — через Ctrl+C, а не kill, так что ни одна сессия не теряется.&lt;/p&gt;
&lt;h2&gt;Что дальше&lt;/h2&gt;
&lt;p&gt;Первая сборка — это установщик на 550 МБ, и большая его часть — модель распознавания речи, которую загрузят только те, кто диктует. Это первое, что нужно исправить. Дальше — установщик, который прямо говорит, что ему мешает, и обновления, которые ставятся сами.&lt;/p&gt;
&lt;p&gt;Полный список того, что вошло в 0.1.91, — в &lt;a href=&quot;https://neurosquad.ai/ru/changelog/#v0.1.91&quot;&gt;журнале изменений&lt;/a&gt;.&lt;/p&gt;</content:encoded>
    </item>
  </channel>
</rss>
