Ты разворачиваешь у меня второй мозг бизнеса - базу знаний в обычных текстовых файлах, из которой ты и любая другая нейросеть будете работать со мной дальше. Веди меня по шагам ниже. Говори простым языком: я не программист. ОБЩИЕ ПРАВИЛА - Один шаг за раз. Не вываливай все вопросы сразу. - Ничего не выдумывай за меня. Не знаешь - спроси или поставь пометку «уточнить». - Каждый файл мозга показывай черновиком до записи и жди моего «да». Исключение - черновик-интервью.md: его сохраняй сразу (шаг 3). - Пароли, ключи и токены в файлы не пиши. Пиши только, где они лежат. - Цифры, которые меняются (цены, остатки, выручка), в карточки не пиши. Пиши, где лежит актуальное значение. - Если я вернулся после обрыва сессии - сначала прочитай черновик-интервью.md и log.md и продолжи с того места, где остановились. ШАГ 1. ГДЕ ЖИВЁТ МОЗГ Спроси, из какой папки я обычно запускаю Claude Code и работаю ли я из разных папок. Объясни простыми словами: ты подхватываешь правила из папки запуска и из папок выше неё, но не из соседних. - Работаю из одной папки - создай мозг в подпапке «второй-мозг» внутри неё, а правила положи в CLAUDE.md этой рабочей папки. - Работаю из разных - создай мозг там, где я скажу, а в мой личный файл ~/.claude/CLAUDE.md добавь короткий блок с абсолютным путём к мозгу. Перед правкой покажи, что именно добавишь. ШАГ 2. СТРУКТУРА Создай: - Правила мозга - в том CLAUDE.md, который выбрали в шаге 1: CLAUDE.md рабочей папки или блок в ~/.claude/CLAUDE.md. Отдельный CLAUDE.md внутри папки мозга не создавай: из другой папки он не загрузится. Правила короче 200 строк. Внутри обязательно: первым делом открыть INDEX.md и оттуда идти в нужный файл; не выдумывать, а открыть файл или спросить; цифры и реквизиты брать только из файла-источника; появился новый важный факт - предложить записать и дождаться «да»; держать INDEX.md в актуальном состоянии. - INDEX.md - единственная точка входа: по строке на файл, что внутри, и предупреждение, если оно есть. - бизнес.md - карточка бизнеса. - словарь.md - мои термины и адреса живых цифр, двумя разделами. - цели.md - указатель на таблицу целей (шаг 4). - документы/ - мои файлы (шаг 5). - log.md - журнал: одна строка на действие, дата и что сделано. - черновик-интервью.md - сюда пишутся ответы интервью. Пустых папок про запас не создавай. Покажи мне дерево и одной фразой объясни, зачем каждый файл. ШАГ 3. ИНТЕРВЬЮ Сначала объясни два режима и дай выбрать: - Короткое - самое важное о бизнесе, чтобы мозгом можно было пользоваться уже сегодня. Потом можно пройти расширенное, ответы короткого не пропадут. - Расширенное - около часа, все блоки подробно. В коротком - блоки 1, 2 и 3, по два-три главных вопроса. В расширенном - все блоки полностью. Блок 1. Бизнес. Чем занимаюсь и для кого. Что продаю и чем позиции отличаются друг от друга. Чем отличаюсь от конкурентов. Блок 2. Что я объясняю по десять раз. Что приходится повторять помощнику, подрядчику или тебе каждый раз заново. Как отвечаю на частые вопросы и возражения клиентов. Работа, которой я доволен, и где вышло плохо. Если затрудняюсь - приведи три примера чужих ответов для разгона. Блок 3. Цели. Чего хочу добиться в бизнесе за год и за ближайший квартал. Как пойму, что цель достигнута. Блок 4. Мои слова. Как я называю вещи по-своему: что у меня заявка, клиент, продукт, проба, когда затея считается закрытой. Спрашивай про мои формулировки, не подставляй общепринятые. Блок 5. Живые цифры и доступы. Какие числа у меня меняются и где лежат актуальные: таблица, банк, CRM. Какие реквизиты и ссылки я копирую из письма в письмо. Спрашивай, ГДЕ живёт значение, а не какое оно. Блок 6. Фирменное. Цвета, шрифты, где лежат логотип и фотографии, каким тоном я говорю с клиентами. Если у меня есть сайт - предложи прочитать его и вытащить стиль самому. После каждого блока сразу дописывай мои ответы в черновик-интервью.md, не держи их в памяти до конца разговора. Отмечай в файле, какие блоки пройдены. Если выбрано короткое интервью - в конце запиши туда, какие вопросы расширенного остались. ШАГ 4. ТАБЛИЦА ЦЕЛЕЙ Сначала коротко объясни, что это и зачем: - Таблица целей - одно место, где записаны мои цели: чего хочу, как пойму, что достиг, к какому сроку, что к цели ведёт, в каком она статусе и где смотреть факт. - Ты сверяешь с ней свои предложения: план недели, идеи, задачи. - Сроки, цифры и статусы живут только в таблице. В цели.md и в карточках - только ссылка на неё. Иначе файлы разойдутся с таблицей и начнут врать. Потом дай выбор, где будет таблица, и честно назови последствия: - Локально. Файл цели.csv в папке мозга. Открывается в Excel, Numbers или Google Таблицах. Настраивать ничего не надо. Ты сам читаешь и правишь файл, но каждую правку показываешь до записи. - Через Google. Google-таблица на моём Google Диске, через коннектор Google Drive из claude.ai. Скажи прямо: - подключается весь мой Google Диск, а не одна таблица: ты сможешь искать и читать мои файлы на Диске; - ты создашь таблицу и сможешь её читать, но ячейки уже созданной таблицы править не можешь: статусы, сроки и новые строки вношу я сам, руками; - коннектор работает, только если я вошёл в Claude Code аккаунтом claude.ai, а не по API-ключу. В WSL-сессиях десктоп-приложения коннекторов пока нет. На тарифах Team и Enterprise коннектор добавляет только администратор; - один раз придётся настроить подключение, ты проведёшь по шагам. - Не хочу заморачиваться - делаем локально. Это вариант по умолчанию: если я сомневаюсь или не выбрал, делай локально. Колонки в обоих вариантах одинаковые, ровно в таком порядке: Цель · Как пойму, что достиг · Срок · Что к ней ведёт · Статус · Где смотреть факт. Статус - только одно из четырёх: не начато, в работе, достигнуто, отложено. Черновик строк собери из блока 3 интервью (черновик-интервью.md). Одна цель - одна строка. Чего я не называл, пиши «уточнить»: не придумывай сроки, цифры и где смотреть факт. Если я не назвал статус, ставь «не начато». Покажи черновик таблицей в чате и жди моего «да». Если выбрано «локально»: - Создай цели.csv в папке мозга. Кодировка UTF-8 с BOM: так Excel на Windows правильно покажет русские буквы. Разделитель - запятая. Ячейку, в которой есть запятая, бери в кавычки. - Скажи, как открыть: двойной клик. Если в Excel вместо букв кракозябры или всё в одном столбце - открыть через меню «Данные», импорт из текстового или CSV-файла, кодировка UTF-8, разделитель запятая. - Если я правил файл в Excel или Numbers и сохранил, при следующем обращении сначала прочитай файл и проверь, что колонки на месте. Сломалось - скажи мне, молча не чини. Если выбрано «через Google» - веди по одному шагу, после каждого жди моего «готово»: 1. Перед настройкой запиши в log.md строку: шаг 4, выбран Google, идёт подключение. Сессию, скорее всего, придётся перезапустить. 2. Открыть в браузере claude.ai/customize/connectors, найти Google Drive, подключить. 3. Войти в свой Google-аккаунт и разрешить доступ. 4. Вернуться в Claude Code, набрать /mcp и найти Google Drive в разделе коннекторов claude.ai. Нет в списке - закрыть Claude Code и открыть заново в той же папке, снова /mcp. 5. Всё ещё нет - набрать /status и посмотреть, как я вошёл. Если по API-ключу - /login и выбрать аккаунт claude.ai. Если у меня WSL-сессия десктоп-приложения - коннектор там пока не работает, предложи сделать локально. 6. Коннектор виден - создай на моём Диске Google-таблицу «Цели - <мой бизнес>» из согласованного черновика и дай мне ссылку. 7. Проверка: прочитай таблицу обратно и процитируй одну строку. Не прочиталась - дальше не иди, разбирайся или предложи локально. Кроме таблицы целей ничего на моём Диске не открывай, не перемещай, не удаляй и никому не давай доступ без моей просьбы. Потом запиши цели.md - это не список целей, а указатель на таблицу: - где таблица: путь к цели.csv или ссылка на Google-таблицу; - что в колонках и какие бывают статусы; - как ты к ней обращаешься: читаешь файл или читаешь таблицу через коннектор; кто вносит правки (ты с показом до записи или я руками); - правило: цели, сроки, числа и статусы - только в таблице, в цели.md и карточках их не повторять. Покажи цели.md до записи. После «да» добавь строку в INDEX.md и строку в log.md. В конце объясни, как с таблицей работать дальше: - Предложи ритм, а не выдавай его за правило: например, раз в неделю обновлять статусы и раз в месяц пересматривать цели. Спроси, как удобно мне. - Что мне говорить тебе: «сверь план недели с целями», «что из задач ближе к цели на квартал», «обнови статус цели X», «добавь цель». - В локальном варианте правки вносишь ты, с показом до записи. В Google-варианте правки вношу я: ты подсказываешь, что поменять и в какой ячейке, потом перечитываешь таблицу. Два правила из опыта, для обоих вариантов: - Текст ячейки не начинай с «+», «=» или «-». Google Таблицы принимают такую ячейку за формулу и показывают ошибку #ERROR!. Нужен знак в начале - начни ячейку со слова. - В Google-варианте таблицу сразу оформи, по шагам вместе со мной: закрепить строку заголовков; в колонке «Статус» сделать выпадающий список из четырёх статусов; строки со статусом «достигнуто» подсвечивать зелёным (условное форматирование). Ячейки через коннектор ты не правишь, поэтому объясняй мне, куда нажать, и жди «готово» после каждого действия. В локальном цели.csv оформления нет - пропусти. ШАГ 5. ДОКУМЕНТЫ Предложи загрузить мои документы: это самый быстрый способ дать мозгу фактуру без долгих ответов. Приведи примеры под мой бизнес по итогам интервью, например: прайс, коммерческие предложения, скрипты продаж, выгрузки переписок с клиентами, регламенты и инструкции, отзывы, брендбук, шаблоны договоров. Объясни, как загрузить: положить файлы в папку «документы» и написать тебе «готово». По каждому файлу: оригинал оставь в «документы», короткий пересказ - в карточку по теме, строку - в INDEX.md. Устаревшее не выбрасывай, пометь «по этому уже не работаем». Персональные данные клиентов в пересказы не переноси. ШАГ 6. КАРТОЧКИ Из черновика интервью и документов собери файлы мозга. Показывай каждый до записи, жди моего «да», мои правки вноси дословно. ШАГ 7. АВТОНАПОЛНЕНИЕ Сначала объясни, зачем это, простыми словами: - Без этого шага мозг пополняется, только когда я вспомню. Я не вспомню, и через месяц мозг устареет. - Ты поставишь три вещи: скилл «пополнение мозга», правило в CLAUDE.md и маленький скрипт-счётчик (хук). - Хук ничего не пишет в мозг и никуда не ходит. Он считает мои сообщения и раз в 6 сообщений напоминает тебе сверить разговор с мозгом. - Ты показываешь мне список «факт → куда записать» и ждёшь ответа. Записываешь только то, на что я сказал «да». Нечего предложить - молчишь. - Хук работает, только когда я сижу в сессии. В запусках без человека (claude -p, скрипты) он молчит. - Раз в 6 сообщений уходит один лишний ход - это немного токенов. - Встроенную автопамять Claude Code это не трогает, но мозг на неё не опирается: факты о бизнесе живут только в файлах мозга. Спроси, ставим ли. Без моего «да» ничего не ставь. Отказался - запиши в log.md «автонаполнение не ставили» и переходи к шагу 8. Если я сказал «да»: 1. Определи сам, какая у меня система: macOS, Linux, WSL или Windows. Скажи мне, что определил. 2. Файлы ниже записывай дословно, байт в байт: всё, что стоит между строкой «===== ФАЙЛ: … =====» и строкой «===== КОНЕЦ ФАЙЛА =====», сами эти строки не входят. Ничего не переводи, не исправляй, не сокращай и не переформатируй. Скрипт по памяти не переписывай. Файлы с пометкой НАСТРОЙКИ и СТРОКА ПРАВИЛА - не отдельные файлы, это куски, которые вставляются в другие файлы (пункты 4 и 5). 3. Выбери место по тому, что решили в шаге 1: - Мозг в подпапке рабочей папки. Скилл - в .claude/skills/popolnenie-mozga/SKILL.md рабочей папки. Скрипт - в .claude/hooks рабочей папки. - Мозг в другом месте. Скилл - в ~/.claude/skills/popolnenie-mozga/SKILL.md. Скрипт - в ~/.claude/hooks. На macOS, Linux и WSL нужен скрипт mozg-sverka.sh, на Windows - mozg-sverka.ps1. Второй скрипт не записывай. 4. Хук. Возьми кусок НАСТРОЙКИ под мою систему и место: - macOS, Linux, WSL, мозг в подпапке - в файл .claude/settings.local.json рабочей папки; замени /АБСОЛЮТНЫЙ/ПУТЬ/К/РАБОЧЕЙ/ПАПКЕ на полный путь к рабочей папке. - macOS, Linux, WSL, мозг в другом месте - в ~/.claude/settings.json, без замен. - Windows - в .claude\settings.local.json рабочей папки (мозг в подпапке) или в %USERPROFILE%\.claude\settings.json (мозг в другом месте); замени C:\\Users\\ИМЯ\\.claude\\hooks\\mozg-sverka.ps1 на полный путь к записанному скрипту, обратные косые черты в JSON удваиваются. Путь в настройках меняй только этот, остальное - дословно. Если файл настроек уже есть - добавь хук к тому, что там есть, ничего не удаляя и не меняя. 5. СТРОКУ ПРАВИЛА добавь в тот CLAUDE.md, где записаны правила мозга (шаг 1): в CLAUDE.md рабочей папки или в блок про мозг в ~/.claude/CLAUDE.md. 6. Перед записью покажи мне, какие файлы и куда ты кладёшь и что добавишь в настройки и CLAUDE.md. Жди «да». 7. Проверь, что записал дословно: сравни записанные файлы с текстом между разделителями. Потом запусти скрипт на пустом вводе и убедись, что он ничего не выводит и не падает. На macOS, Linux, WSL: sh путь-к-скрипту < /dev/null. На Windows: powershell.exe -NoProfile -ExecutionPolicy Bypass -File путь-к-скрипту, ввод пустой. 8. Покажи, как это будет выглядеть: после шестого моего сообщения под твоим ответом появится строка «Stop hook feedback: Сверка со вторым мозгом…», дальше ты покажешь список «Что записать в мозг». 9. Скажи, что скилл и правило заработают в новой сессии, а проверим всё в шаге 8. ===== ФАЙЛ: popolnenie-mozga/SKILL.md ===== --- name: popolnenie-mozga description: | Сверить мои реплики в этой сессии со вторым мозгом: найти факты о бизнесе, которые стоит сохранить, проверить, нет ли их уже в мозге, предложить нумерованным списком «факт → файл» и записать только то, на что я ответил «да». Use when: «что записать в мозг», «сверь сессию с мозгом», «пополни мозг», «что из разговора сохранить», хук сверки с мозгом сообщил, что набрались новые реплики (№a–№b), конец рабочей сессии. --- # Пополнение второго мозга Задача скилла — предложить записи, а не записать. В мозг ничего не пишется молча. Встроенная автопамять Claude Code — не мозг. Не опирайся на неё: «уже сохранено в памяти» не значит «есть в мозге». Проверяй только файлы мозга. Факты мозга пиши только в файлы мозга и только после моего «да». ## 1. Какие реплики брать - Хук назвал номера «№a–№b» — считаются только реплики, набранные человеком. Бери последние `b − a + 1` таких реплик. - Позвали фразой — бери все мои реплики в этой сессии. Реплика человека бывает трёх видов, бери все три: 1. обычное сообщение, которое я отправил; 2. мой ответ в окне с вопросами и вариантами ответа; 3. сообщение, которое я отправил, пока ты ещё работал над прошлым ходом. Не реплики: результаты инструментов, системные вставки, сообщения хуков, уведомления фоновых задач. ## 2. Найти мозг - Открой CLAUDE.md, который действует в этой сессии: CLAUDE.md рабочей папки или блок о втором мозге в `~/.claude/CLAUDE.md`. Там написано, где лежит мозг. - В мозге первым делом открой `INDEX.md`. Файлы выбирай только через него. - Мои слова сверяй со `словарь.md`: называй вещи так, как называю их я. ## 3. Что считается фактом Бери то, что пригодится и через месяц и чего нет в файлах мозга: - о бизнесе: продукты, клиенты, люди, поставщики, как устроена работа; - мои решения и почему я их принял, что я отверг; - мои термины и что они значат; - где что лежит: таблица, CRM, папка, сервис; - цели и договорённости — но сроки, статусы и цифры целей живут в таблице целей, в файл пишется только ссылка на неё. Не бери: - ход текущей задачи и свои выводы, которых я не говорил; - пароли, ключи, токены — только где они лежат; - цифры, которые меняются (цены, остатки, выручка) — только где лежит актуальное значение; - персональные данные клиентов. ## 4. Проверить, нет ли уже По каждому кандидату поищи ключевые слова по папке мозга (Grep). Уже записано так же — не предлагай. Записано иначе или противоречит — предложи и скажи прямо: «в файле X сейчас написано так-то, в разговоре — иначе». ## 5. Показать и ждать Одним сообщением, нумерованно, по образцу: Что записать в мозг: 1. <факт одной строкой> «<мои слова из разговора>» → <файл мозга>, раздел 2. ... Ответь: «да» — записать всё, номера — только выбранное, или поправь формулировку. Дальше жди ответа. Без ответа не пиши ничего. ## 6. Записать одобренное - Только выбранные пункты, мои правки — дословно. - Появился новый файл — добавь строку в `INDEX.md`. - Добавь строку в `log.md`: дата и что куда записано. ## Если предлагать нечего Не пиши ничего: ни «ничего не нашёл», ни «сверка пройдена». Заверши ход без текста. ===== КОНЕЦ ФАЙЛА ===== ===== ФАЙЛ: mozg-sverka.sh ===== #!/bin/sh # Stop-хук «сверка с мозгом» (macOS, Linux, WSL, Git Bash). # # Раз в N новых реплик человека просит Claude вызвать скилл popolnenie-mozga. # Сам в мозг ничего не пишет и ничего не решает: без python, без jq, без сети. # Любая поломка — молчим и выходим с кодом 0: сессия важнее хука. # # Настройки через переменные окружения (все необязательные): # MOZG_SVERKA_POROG сколько новых реплик нужно для сверки, по умолчанию 6 # MOZG_SVERKA_OKNO сколько последних реплик максимум отдать в одну сверку, по умолчанию 30 # MOZG_SVERKA_DIR где хранить курсоры и журнал, по умолчанию ~/.cache/mozg-sverka # # Реплика человека — строка транскрипта, где есть "type":"user" и # "origin":{"kind":"human"} и нет isMeta / isSidechain / isCompactSummary и # слэш-команды. Внутри текста реплик кавычки экранированы (\"), поэтому эти # подстроки встречаются только в разметке записи, а не в словах человека. # Промпты `claude -p` поля origin не имеют и не считаются. # Байтовая локаль: grep/sed/tr не спотыкаются о русские буквы и не уходят в режим «binary file». LC_ALL=C export LC_ALL POROG="${MOZG_SVERKA_POROG:-6}" OKNO="${MOZG_SVERKA_OKNO:-30}" DIR="${MOZG_SVERKA_DIR:-${XDG_CACHE_HOME:-$HOME/.cache}/mozg-sverka}" case "$POROG" in ''|*[!0-9]*|0) POROG=6 ;; esac case "$OKNO" in ''|*[!0-9]*|0) OKNO=30 ;; esac vstup=$(cat 2>/dev/null | tr -d '\r\n') || exit 0 sid=$(printf '%s' "$vstup" | sed -n 's/.*"session_id" *: *"\([^"]*\)".*/\1/p') put=$(printf '%s' "$vstup" | sed -n 's/.*"transcript_path" *: *"\([^"]*\)".*/\1/p') zhurnal() { mkdir -p "$DIR" 2>/dev/null && printf '%s %s %s\n' "$(date '+%Y-%m-%dT%H:%M:%S')" "${sid:-?}" "$*" >> "$DIR/journal.log" 2>/dev/null return 0 } # 1. Claude уже продолжает ход по просьбе Stop-хука — не зацикливаемся. case "$vstup" in *'"stop_hook_active":true'*|*'"stop_hook_active": true'*) zhurnal skip_active; exit 0 ;; esac # 2. Запуск без человека (claude -p, скрипты): инжект сломал бы чужой вывод. if [ "${CLAUDE_CODE_SESSION_ATTENDED:-}" = "0" ] || [ "${CLAUDE_CODE_ENTRYPOINT:-}" = "sdk-cli" ]; then zhurnal skip_headless; exit 0 fi if [ -z "$sid" ] || [ -z "$put" ] || [ ! -f "$put" ]; then zhurnal error no_transcript; exit 0 fi # 3. Считаем реплики человека. Три канала: # k1 — обычное сообщение: "type":"user" + "origin":{"kind":"human"}; # k2 — ответ в окне вопросов (AskUserQuestion): "type":"user" + toolUseResult с questions и answers; # k3 — сообщение, отправленное посреди хода: "type":"attachment" + queued_command, # commandMode prompt, origin human (commandMode task-notification — не человек). # Служебные записи (isMeta, субагенты, пересказ после компакта) выкидываем сразу. chistye() { grep -a -v -F -e '"isMeta":true' -e '"isSidechain":true' -e '"isCompactSummary":true' "$put" 2>/dev/null } k1=$(chistye | grep -a -F '"type":"user"' | grep -a -F '"origin":{"kind":"human"}' | grep -a -v -F -e '"content":"/dev/null) case "$kursor" in ''|*[!0-9]*) kursor=0 ;; esac [ "$kursor" -gt "$vsego" ] && kursor=$vsego novyh=$((vsego - kursor)) if [ "$novyh" -lt "$POROG" ]; then zhurnal below_threshold "total=$vsego cursor=$kursor new=$novyh" exit 0 fi # 4. Порог набран: сдвигаем курсор и просим сверку. a=$((kursor + 1)) [ $((vsego - OKNO + 1)) -gt "$a" ] && a=$((vsego - OKNO + 1)) b=$vsego mkdir -p "$DIR" 2>/dev/null || exit 0 printf '%s\n' "$vsego" > "$DIR/$imya.tmp" 2>/dev/null && mv -f "$DIR/$imya.tmp" "$DIR/$imya" 2>/dev/null || exit 0 # Курсоры закрытых сессий старше 30 дней убираем. find "$DIR" -type f ! -name journal.log -mtime +30 -exec rm -f {} + 2>/dev/null zhurnal fired "total=$vsego cursor=$kursor new=$novyh range=$a-$b" # Текст — в виде \uXXXX, чтобы не зависеть от кодировки терминала. printf '{"hookSpecificOutput":{"hookEventName":"Stop","additionalContext":"%s%d%s%d%s%d%s"}}\n' \ '\u0421\u0432\u0435\u0440\u043a\u0430 \u0441\u043e \u0432\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0437\u0433\u043e\u043c: \u0441 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u0431\u0440\u0430\u043b\u043e\u0441\u044c ' \ "$novyh" \ ' \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u043f\u043b\u0438\u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u044d\u0442\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0438 \u2116' \ "$a" \ '\u2013\u2116' \ "$b" \ ' \u044d\u0442\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 (\u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043f\u043b\u0438\u043a\u0438, \u043d\u0430\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c). \u041f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u0438\u0437 CLAUDE.md \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0438\u043b\u043b popolnenie-mozga \u043f\u043e \u044d\u0442\u0438\u043c \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u043c. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043c\u043e\u0437\u0433 \u043d\u0435\u0447\u0435\u0433\u043e, \u0445\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u0430.' exit 0 ===== КОНЕЦ ФАЙЛА ===== ===== ФАЙЛ: mozg-sverka.ps1 ===== # Stop hook "mozg-sverka" for Windows (PowerShell 5.1 and 7+), works without Git Bash. # # Every N new human replies it asks Claude to run the popolnenie-mozga skill. # It never writes to the brain itself. Any failure: stay silent, exit 0. # # The file is ASCII only on purpose: Windows PowerShell 5.1 reads a .ps1 without # BOM in the ANSI code page, so Cyrillic literals would be garbled. The Russian # message is stored as JSON \uXXXX escapes. # # Optional environment variables: # MOZG_SVERKA_POROG new human replies needed for a check, default 6 # MOZG_SVERKA_OKNO max replies passed to one check, default 30 # MOZG_SVERKA_DIR state folder, default %LOCALAPPDATA%\mozg-sverka $ErrorActionPreference = 'Stop' $sid = '?' $dir = $env:MOZG_SVERKA_DIR if (-not $dir) { $dir = Join-Path ([Environment]::GetFolderPath('LocalApplicationData')) 'mozg-sverka' } function Write-Journal([string]$text) { try { if (-not (Test-Path -LiteralPath $dir)) { New-Item -ItemType Directory -Path $dir -Force | Out-Null } $line = (Get-Date -Format 'yyyy-MM-ddTHH:mm:ss') + ' ' + $script:sid + ' ' + $text + "`n" [System.IO.File]::AppendAllText((Join-Path $dir 'journal.log'), $line) } catch { } } try { $porog = 6; if ($env:MOZG_SVERKA_POROG -match '^[1-9][0-9]*$') { $porog = [int]$env:MOZG_SVERKA_POROG } $okno = 30; if ($env:MOZG_SVERKA_OKNO -match '^[1-9][0-9]*$') { $okno = [int]$env:MOZG_SVERKA_OKNO } # stdin is UTF-8 JSON; read it as UTF-8 so a Cyrillic user name in the path survives. $reader = New-Object System.IO.StreamReader([Console]::OpenStandardInput(), (New-Object System.Text.UTF8Encoding($false))) $raw = $reader.ReadToEnd() $inp = $raw | ConvertFrom-Json if ($inp.session_id) { $sid = [string]$inp.session_id } # 1. Claude is already continuing because of a Stop hook: do not loop. if ($inp.stop_hook_active -eq $true) { Write-Journal 'skip_active'; exit 0 } # 2. Run without a human (claude -p, scripts): an injection would break someone's output. if ($env:CLAUDE_CODE_SESSION_ATTENDED -eq '0' -or $env:CLAUDE_CODE_ENTRYPOINT -eq 'sdk-cli') { Write-Journal 'skip_headless'; exit 0 } $path = [string]$inp.transcript_path if (-not $path -or -not (Test-Path -LiteralPath $path -PathType Leaf)) { Write-Journal 'error no_transcript'; exit 0 } # 3. Count human replies, three channels: # 1) plain message: "type":"user" + "origin":{"kind":"human"} # 2) answer in a question window (AskUserQuestion): "type":"user" + toolUseResult with questions and answers # 3) message sent mid-turn: "type":"attachment" + queued_command, commandMode prompt, origin human # FileShare ReadWrite: Claude Code may hold the file open for writing. $total = 0 $fs = New-Object System.IO.FileStream($path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite) $sr = New-Object System.IO.StreamReader($fs, (New-Object System.Text.UTF8Encoding($false))) try { while ($null -ne ($line = $sr.ReadLine())) { if ($line.Contains('"isMeta":true') -or $line.Contains('"isSidechain":true') -or $line.Contains('"isCompactSummary":true')) { continue } $human = $line.Contains('"origin":{"kind":"human"}') if ($line.Contains('"type":"user"')) { if ($human -and -not $line.Contains('"content":"