Skip to main content
Мод может рисовать свой собственный интерфейс в Claude Code и изменять части интерфейса, которые уже рисует Claude Code. Каждое место, где мод может рисовать, называется сайтом рендеринга, например панель, полоса над промптом или спиннер. Claude Code вызывает событие ui.render каждый раз, когда собирается рисовать сайт рендеринга, и ваш хук для этого события возвращает то, что нужно рисовать там. На этой карте показано, где мод может рисовать в сессии терминала: Карта сессии терминала Claude Code в полноэкранном режиме отрисовки. Мод может добавить панель в виде боковой панели справа, всплывающее уведомление в правом верхнем углу транскрипта, строку лога в транскрипте, полосу над промптом и строку состояния под промптом. Мод может перерисовывать сообщения, строки вызовов инструментов и спиннер. Промпт принадлежит самому Claude Code. Карта сессии терминала Claude Code в полноэкранном режиме отрисовки. Мод может добавить панель в виде боковой панели справа, всплывающее уведомление в правом верхнем углу транскрипта, строку лога в транскрипте, полосу над промптом и строку состояния под промптом. Мод может перерисовывать сообщения, строки вызовов инструментов и спиннер. Промпт принадлежит самому Claude Code. В более узком терминале панель находится над промптом вместо того, чтобы находиться рядом с транскриптом. Создайте свой первый мод перед тем, как начать здесь. Начните с рабочего примера, который создает панель с двумя вкладками и счетчиком, затем прочитайте раздел для каждой части, которую вы хотите изменить.
Чтобы найти одно свойство или ограничение, см. справку.

Создание панели с вкладками

В этом разделе вы создаете мод, который добавляет команду /hello-tabs, и команда открывает панель. Панель — это боковая панель рядом с транскриптом в широком полноэкранном терминале или обрамленная область над промптом в противном случае. Эта панель показывает две вкладки, и вторая вкладка имеет кнопку, которая добавляет единицу к счетчику. Счет остается там после перезагрузки Claude Code. Готовый мод выглядит так. Запись открывает панель, переключается на вторую вкладку, нажимает кнопку несколько раз и возвращается на первую вкладку:
Вкладки — это две кнопки в ряду. Мод отслеживает, какая из них активна, и рисует содержимое этой вкладки под рядом.
1

Создание плагина

Мод — это плагин с манифестом, hooks.json, который указывает на ваш код, и файл кода. Создание мода объясняет каждый из них. Создайте каталог с именем hello-tabs с каталогами .claude-plugin и hooks внутри него, затем сохраните первые два файла.Сохраните манифест как hello-tabs/.claude-plugin/plugin.json:
hello-tabs/.claude-plugin/plugin.json
Назовите точку входа в hello-tabs/hooks/hooks.json:
hello-tabs/hooks/hooks.json
2

Написание кода

В этом списке указано, что делает каждый хук, в том порядке, в котором они появляются в коде:
  • Добавляет команду /hello-tabs и загружает счет, сохраненный предыдущей сессией
  • Открывает панель при запуске этой команды
  • Рисует содержимое панели: ряд вкладок и тело открытой вкладки
Две переменные уровня модуля, tab и count, содержат состояние панели.Сохраните это как hello-tabs/hooks/register.js:
hello-tabs/hooks/register.js
Каждый хук также делает что-то, что код не делает явным:
  • session.start также читает сохраненный счет из $.store, хранилища ключ-значение, которое сохраняется между сессиями.
  • command.run только сообщает Claude Code, что панель существует. Открытие панели ничего не рисует само по себе: Claude Code затем вызывает ui.render, чтобы спросить, что в ней находится.
  • ui.render возвращает дерево элементов, Box, который содержит другие боксы, текст и кнопки, и создает его заново из tab и count каждый раз, когда он запускается.
Нажатие кнопки запускает ее обратный вызов onPress, который изменяет переменную и вызывает redraw. Claude Code затем запускает хук ui.render снова, и хук создает новое дерево из новых значений. Каждое интерактивное рисование использует этот цикл рендеринга: обратный вызов изменяет состояние, и хук рисует снова из нового состояния.
3

Открытие панели

В вашей оболочке запустите Claude Code с помощью claude --plugin-dir ./hello-tabs. В промпте Claude Code запустите /hello-tabs. Панель открывается с 1: One и 2: Two в верхней части. Нажмите 2, затем нажмите a, горячую клавишу для Add one, несколько раз. Счет растет.
4

Проверка того, что счет был сохранен

Нажмите Esc, чтобы закрыть панель, затем выйдите из сессии. В вашей оболочке запустите Claude Code снова с той же командой claude --plugin-dir ./hello-tabs, и в промпте Claude Code запустите /hello-tabs. Счет находится там, где вы его оставили.Чтобы очистить счет, попросите мод вызвать $.store.delete('count'). Сохранение состояния охватывает, как долго длится каждый вид значения.

Выбор места для рисования

Хук ui.render запускается для каждого сайта рендеринга, если вы не сузите его до того, в котором хотите рисовать. Чтобы выбрать сайт рендеринга, передайте фильтр, называемый matcher, в качестве второго аргумента для on. { component: 'Pane' } запускает хук только для панелей. В хуке e.component называет сайт, e.surface говорит, какое приложение рисует, а e.props содержит собственные данные сайта. Для панели e.requestId — это id, с которым вы ее открыли. Панель и полоса пусты, пока мод их не заполнит. Выберите вкладку, чтобы увидеть, что представляет собой каждая из них и как в ней рисовать:
Панель — это боковая панель рядом с транскриптом в широком полноэкранном терминале или обрамленная область над промптом в противном случае. При открытии нескольких панелей каждая получает вкладку, которая показывает ее название.Панель появляется, когда ваш мод вызывает $.ui.open с id, который вы выбираете, как в $.ui.open({ id: 'hello-tabs' }). Открытие панели в нужное время охватывает другие поля и случаи, когда панель ждет более широкого терминала.Чтобы рисовать в вашей панели, отфильтруйте по { component: 'Pane' } и проверьте, что e.requestId — это ваш id.

Изменение того, что уже рисует Claude Code

Claude Code рисует большую часть своего интерфейса сам: сообщения, строки вызовов инструментов, спиннер и многое другое. Каждая из этих частей также является сайтом рендеринга, поэтому мод может изменить ее стиль или заменить ее. Чтобы изменить одну из них, отфильтруйте ваш хук ui.render по ее имени из этой таблицы: Pane, AskUserQuestion, Spinner, UserMessage, AssistantMessage и точки отрисовки вызовов инструментов работают в терминале, приложении Desktop и расширении VS Code. Таблица точек отрисовки указывает, где вызывается каждая из остальных. На сайте, который Claude Code уже рисует, ваш хук может изменить деталь, заменить рисование или оставить его в покое. Выберите вкладку, чтобы увидеть каждый из вариантов, применяемый к спиннеру. Примеры читают переменную calls, которую подсчитывает другой хук, как в учебном моде.
Чтобы сохранить рисование Claude Code и изменить одну его часть, передайте next копию события с измененными props. Этот хук изменяет текст после слова спиннера:
Спиннер сохраняет свою анимацию и свое слово, и ваш текст следует за словом:
На этих сайтах next(e) возвращает ссылку на рисование Claude Code, { type: 'engine', ref }, если только мод, который запускается после вашего, не вернул собственное дерево. Чтобы изменить то, что находится в этом рисовании, передайте next копию события с другими props, как это сделано на вкладке Change a detail. Вы можете вернуть ссылку как есть или поместить ее в Box рядом с собственными элементами:
Пока Claude работает, спиннер анимируется как прежде, а под ним появляется under the spinner. Запрос разрешения не является сайтом рендеринга, поэтому мод не может изменить то, что он показывает. Диалог вопроса, AskUserQuestion, является таким сайтом, поэтому мод может его изменить. Дерево для диалога должно содержать ссылку ровно один раз, а ваши элементы — над ней. В противном случае Claude Code рисует собственный диалог.

Открытие панели в нужное время

Панель появляется только тогда, когда ваш мод ее открывает. То, как и когда вы ее открываете, определяет, получает ли она фокус клавиатуры, сколько места она запрашивает и появляется ли она вообще в узком терминале. Чтобы открыть панель, вызовите $.ui.open с id, который вы выбираете. id — это имя панели: ваш хук ui.render проверяет его, и вы передаете его снова, чтобы закрыть панель.
Чтобы закрыть панель, вызовите $.ui.close с id, с которым вы ее открыли:
Помимо id, $.ui.open принимает эти необязательные поля: Расширение VS Code игнорирует rows и columns и определяет размер панели само. focus, closeOnEscape и holdToasts являются необязательными и принимают только true. Чтобы не задавать одно из них, опустите его. Передача false выбрасывает ошибку, такую как ui.open: focus is true or left out. Чтобы установить одно из них условно, добавляйте поле только тогда, когда условие выполняется. Этот вызов запрашивает фокус клавиатуры, только когда items не пусто:
Чтобы позволить команде открыть панель, пока Claude работает, добавьте