ui.render каждый раз, когда собирается рисовать сайт рендеринга, и ваш хук для этого события возвращает то, что нужно рисовать там.
На этой карте показано, где мод может рисовать в сессии терминала:
Чтобы найти одно свойство или ограничение, см. справку.
Создание панели с вкладками
В этом разделе вы создаете мод, который добавляет команду/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, с которым вы ее открыли.
Панель и полоса пусты, пока мод их не заполнит. Выберите вкладку, чтобы увидеть, что представляет собой каждая из них и как в ней рисовать:
- Pane
- Band above the prompt
Панель — это боковая панель рядом с транскриптом в широком полноэкранном терминале или обрамленная область над промптом в противном случае. При открытии нескольких панелей каждая получает вкладку, которая показывает ее название.Панель появляется, когда ваш мод вызывает
$.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, которую подсчитывает другой хук, как в учебном моде.
- Change a detail
- Replace the drawing
- Leave it alone
Чтобы сохранить рисование Claude Code и изменить одну его часть, передайте Спиннер сохраняет свою анимацию и свое слово, и ваш текст следует за словом:
next копию события с измененными props. Этот хук изменяет текст после слова спиннера:next(e) возвращает ссылку на рисование Claude Code, { type: 'engine', ref }, если только мод, который запускается после вашего, не вернул собственное дерево. Чтобы изменить то, что находится в этом рисовании, передайте next копию события с другими props, как это сделано на вкладке Change a detail. Вы можете вернуть ссылку как есть или поместить ее в Box рядом с собственными элементами:
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 не пусто: