Bỏ qua để đến nội dung

Tham chiếu Mods

Tra cứu mọi event mà một mod có thể xử lý, mọi method của mods API mà nó có thể gọi, và mọi render site mà nó có thể vẽ vào, cho Claude Code CLI và ứng dụng Desktop tính đến v2.1.289. Mỗi mục có tên và mô tả một dòng, kèm link tới phần hướng dẫn giải thích nó nếu có.

Một mod là một thư mục plugin với các file sau:

FileBắt buộcNội dung
.claude-plugin/plugin.jsonCóManifest của plugin. Mods không thêm field bắt buộc nào.
hooks/hooks.jsonCómodules: một mảng gồm một đường dẫn, tương đối so với file này, tới hooks module, như "modules": ["./register.js"]. Cũng có thể chứa settings hooks dưới key hooks.
Hooks module, như hooks/register.jsCóEntry point của mod. Export register(on, options). Đuôi file là .js, .mjs, .cjs, .jsx, .ts, .mts, .cts hoặc .tsx. Là một ES module.
types/index.d.ts, được trỏ tới bởi types trong manifestKhi mod dùng $.state hoặc thêm namespace vào mods APIKhai báo các giá trị PluginState và mọi namespace mà mod thêm vào
Các file có tên kết thúc bằng .test.ts hoặc .test.tsxKhôngCác test mà claude plugin test chạy

register nhận on và options. options chứa giá trị của các field userConfig mà manifest khai báo, đã điền sẵn giá trị mặc định.

Một mod đăng ký từng hook, tức event handler, bằng cách gọi on bên trong register. on nhận tên event, một matcher tùy chọn, tức một bộ lọc trên các field của event, và hook, như on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e)). on trả về một registration có một method, .catch(handler), dùng để đặt error handler cho hook.

Tham sốLà gì
$Mods API: mọi method trong phương thức mods API. Viết đầy đủ mỗi lời gọi, namespace rồi method, như $.fs.read('notes.md').
eInput của event, dưới dạng dữ liệu thuần bị đóng băng sâu. Để thay đổi, truyền một bản copy cho next.
next(e)Handler kế tiếp, như trong middleware. Chạy các hook phía sau hook này, rồi tới hành vi của Claude Code. Trả về kết quả của event.
next.signalMột AbortSignal bị abort khi event bị bỏ dở
next.origin{ plugin, tier } của bên đã kích hoạt event. Bản thân Claude Code là { plugin: 'engine', tier: 'core' }. tier của một mod là nhóm ưu tiên của nó trong thứ tự chạy của các mod: prepend, user, append hoặc builtin.
next.budgetGiới hạn thời gian của hook tính bằng mili giây: next.budget.ms là toàn bộ giới hạn, next.budget.remainingMs là phần còn lại ở thời điểm hiện tại
next.to(e, tier)Nhảy tới một tier phía sau, là append, builtin hoặc core. next.to(e, 'append') bỏ qua các mod do user cài. Chỉ mod nằm trong prependPlugins hoặc appendPlugins mới gọi được.
next.error, next.calledChỉ có trong .catch handler. next.error.kind là throw hoặc timeout, next.error.message là nội dung lỗi, và next.called là true khi hook bị lỗi đã gọi next.

Các event được nhóm theo chủ đề, mỗi event kèm thời điểm kích hoạt và những gì một hook trên nó có thể trả về. Hook trên turn.step và process.spawn là async generator, các hook khác là async function.

Cột cuối của mỗi bảng dùng cách viết tắt. next(e) chuyển event đi tiếp nguyên vẹn. next({ ...e, text }) chuyển đi một bản copy với field được nêu tên đã thay đổi, như next({ ...e, text: e.text.trim() }). Một object nghĩa là trả lời event mà không gọi next, và một từ như reason đại diện cho một chuỗi do bạn viết, như { deny: 'Use the file tools.' }.

Các event tool kích hoạt xung quanh mỗi tool call của Claude, từ mô tả mà Claude đọc tới quyết định call có được chạy hay không:

EventKích hoạt khiHook có thể trả về
tool.callMột tool sắp chạynext(e), { deny: reason }, hoặc { result }
tool.checkClaude Code quyết định một tool call có được chạy không, sau các hook tool.call và PreToolUse. next(e) trả về quyết định mà các rule, permission mode và các hook đó đưa ra.{ decision }, là allow, ask hoặc deny
tool.describeMột lần cho mỗi tool, khi mô tả của nó được gửi cho Claude lần đầu{ description }, có thể kèm isDeferred là true để đưa tool vào sau tool search hoặc false để nạp nó ngay từ đầu

Các event prompt bao gồm text mà user gõ và text mà Claude Code tự gửi cho Claude, như system prompt và các lời nhắc (reminder):

EventKích hoạt khiHook có thể trả về
prompt.submitMột prompt được gửinext({ ...e, text }), next({ ...e, context }), hoặc { drop: reason }
prompt.fill, prompt.suggestText sắp được đưa vào ô prompt dưới dạng bản nháp, hoặc dưới dạng gợi ý mờnext(e) với text đã thay đổi
prompt.editUser sửa nội dung ô promptnext(e)
prompt.composeClaude Code render một system prompt{ sections }, một danh sách { id, text, scope } theo thứ tự được gửi
prompt.sectionMột lần cho mỗi phần có tên của system prompt. e.name là id của phần đó trong prompt.compose.{ text }, hoặc { text: null } để bỏ phần đó
prompt.contextMột lần cho mỗi cuộc hội thoại, cho context gửi kèm message đầu tiên{ blocks }
prompt.attachmentClaude Code tự thêm một message cho Claude, như một lời nhắc. e.type cho biết loại, và với các loại mà type có khai báo, e.detail chứa các dữ kiện dùng để viết text đó.{ text }, hoặc { text: null } để bỏ nó
skill.promptNội dung của một skill được mở rộng cho Claude{ text }
attribution.textClaude Code soạn text attribution cho commit hoặc pull request{ text }

Các event command và cấu hình kích hoạt khi một command chạy hoặc được liệt kê, và khi một dòng trong /config được hiển thị hoặc thay đổi:

EventKích hoạt khiHook có thể trả về
command.runMột command sắp chạy{ text }, {}, hoặc next(e)
command.describeMột lần cho mỗi command, cho danh sách command{ description, argumentHint, isHidden }
config.setMột dòng trong /config sắp thay đổinext({ ...e, value }) hoặc { deny: reason }
config.describeMột lần cho mỗi dòng trong /config{ label, description, isHidden }

Các event turn theo dõi một câu trả lời từ đầu đến cuối, bao gồm từng request tới model trong đó:

EventKích hoạt khiHook có thể trả về
turn.startMột turn bắt đầunext(e)
turn.stepMột request sắp được gửi tới modelyield* next(e), hoặc next({ ...e, model }), next({ ...e, effort })
turn.completeMột turn đã kết thúcnext(e), hoặc { text } để hiện một dòng dưới câu trả lời

Các event session đánh dấu session bắt đầu, kết thúc, compact, và trao đổi tin nhắn với session khác:

EventKích hoạt khiHook có thể trả về
session.startMột lần cho mỗi mod đã nạp, trước prompt đầu tiên, và một lần nữa sau mỗi lần mod đó reload. Không chạy sau /clear, /resume hay /branch.next(e)
session.endSession kết thúc, hoặc /clear, /resume hay /branch chạy. e.reason là clear, resume, logout, prompt_input_exit hoặc other. /branch báo là resume.next(e)
session.compactCuộc hội thoại sắp được compact{ skip: reason }
session.receive, session.sendMột tin nhắn đến từ, hoặc sắp được gửi tới, một agent hay session khác. Xem Gửi và nhận tin nhắn giữa các session.{ consumed: reason } với receive, { isDelivered: false, reason } với send
session.appendMột lần cho mỗi dòng mà cuộc hội thoại giữ lại, như một prompt, một khối response, một kết quả tool hay một thông báo, trước khi nó được lưunext({ ...e, message }) để viết lại content của dòng
session.attach, session.detachMột ứng dụng khác kết nối hoặc ngắt kết nối với sessionnext(e)
session.measureSau mỗi turn, và khi phần trăm sử dụng của một giới hạn gói thay đổinext(e)

Các event subagent kích hoạt khi một loại subagent được đề xuất cho Claude, và khi một subagent hoặc một thành viên agent team sắp khởi động:

EventKích hoạt khiHook có thể trả về
agent.offerMột loại subagent được đề xuất cho Claude{ isOffered: false } để giữ lại không đề xuất
agent.spawnMột subagent hoặc một thành viên agent team sắp khởi động. Với thành viên team, e.isTeammate là true.next({ ...e, model }) để chọn model cho nó, hoặc { deny: reason }

Các event giao diện kích hoạt khi Claude Code vẽ một render site và khi user dùng một control mà mod đã vẽ. Trang Vẽ giao diện bằng mod cho thấy một hook ui.render trả về gì:

EventKích hoạt khi
ui.renderMột render site sắp được vẽ
ui.resolveCác mod được nạp, một lần cho mỗi ứng dụng, render site và mod. Kết quả là bảng element mà $.ui.resolve(e) đọc.
ui.press, ui.input, ui.selectMột Button, Input hoặc Select mà mod đã vẽ được sử dụng
ui.focus, ui.scrollControl đang được focus hoặc vị trí cuộn của một pane hay band sắp thay đổi
ui.closeMột pane sắp đóng. e.id là pane và e.origin.kind là plugin, person hoặc unload.
ui.messageMột element Client post dữ liệu tới mod của nó
ui.faultMột element Client mà mod đã vẽ không nạp được, không vẽ được hoặc lỗi khi chạy. e.phase là load, render hoặc run, và e.reason là thông báo lỗi. Yêu cầu Claude Code v2.1.289 trở lên.

Các event này cho phép một mod tác động lên các mod khác khi chúng được nạp, để từ chối một mod hoặc thay đổi mods API mà nó nhận:

EventKích hoạt khiHook có thể trả về
plugin.registerMột hooks module sắp được nạp. e.uses liệt kê các event, lời gọi mods API, biến môi trường và state của nó, đúng như claude plugin validate in ra. Mỗi lời gọi được viết không có tiền tố $., như fs.read.{ refuse: reason }
engine.createMods API đang được dựng cho mod nàyMột mods API đã thay đổi, để thêm hoặc giữ lại một namespace

Các event telemetry kích hoạt cho các bản ghi usage mà Claude Code ghi lại:

EventKích hoạt khiHook có thể trả về
telemetry.log, telemetry.markMột bản ghi telemetry sắp được ghi, hoặc một lần dùng tính năng được đánh dấu. Trong một mod bạn cài, hãy cho hook telemetry bộ lọc { to: 'collector' }, như on('telemetry.log', { to: 'collector' }, hook). Không có bộ lọc, mod sẽ không vượt qua claude plugin validate. * không khớp các event này.next(e), hoặc { deny: reason }

Mỗi event của settings hook là một event có tên classic.<Event>, như classic.Stop hoặc classic.PostToolUse. e là JSON stdin của hook.

Mỗi method của mods API cũng là một event, đặt tên theo namespace và method, như fs.read, model.complete hoặc ui.open. Một hook trên event đó chặn được các lời gọi từ những mod chạy sau nó, và có thể trả về next(e), { deny: reason }, hoặc { value }.

Mods API là tham số $ mà mọi hook nhận được. Các method của nó được nhóm theo namespace, như $.ui. Bảng dưới liệt kê method của từng namespace theo tên, nên open ở dòng $.ui là lời gọi $.ui.open(...). Các bài hướng dẫn trình bày cách dùng những method phổ biến, còn type cho bản build của bạn mô tả mọi method kèm ví dụ.

NamespaceMethod
$.pluginname, root: tên và thư mục của plugin này
$.uiresolve, invalidate, open, close, panes, focus, scroll, toast, status, log, notice, ask, copy, selection, blit
$.commandregister, run, list
$.toolregister, call, check, list
$.agentregister, spawn, list
$.modelcomplete, fork, classify
$.promptsubmit, read, fill, suggest, compose. Claude đọc text từ submit({ text }) sau một câu nêu tên mod của bạn là người gửi. submit({ text, asUser: true }) gửi text như lời của chính user, không có câu đó.
$.turnabort
$.sessionmessages, cwd, root, model, turns, id, repo, surfaces, usage, version, compact, send, append, authorize. usage() trả về { startedAt, context, rateLimits, cost }: context có tokens, window và percent, còn rateLimits là danh sách { kind, percentUsed, resetsAt }.
$.configlist, set
$.settingsread
$.envget, set
$.fsread, write, list, exists, stat, ancestors. write không atomic: nó thay nội dung file tại chỗ, nên process khác có thể đọc phải một file mới ghi được một phần. Hãy giữ dữ liệu mà nhiều session cùng thay đổi trong $.store.
$.storeget, set, delete, keys. Một key-value store dùng chung cho mọi session trên máy. Xem Lưu từ nhiều session.
$.stateReactive state: get, set, cùng các helper atom, read, update, derive và memberOf import từ claude-code
$.clocknow, sleep, after, every
$.httpfetch
$.processrun, spawn
$.mcpcall, connect. connect(server) kết nối một MCP server mà manifest của chính plugin bạn liệt kê.
$.audioplay, speak
$.telemetrylog, mark. Bản ghi chỉ được gửi khi Claude Code hoặc một mod tích hợp sẵn thực hiện lời gọi.

Render site là một điểm mở rộng trong giao diện Claude Code. Mỗi dòng là một giá trị của e.component trong hook ui.render, kèm các field của e.props và các ứng dụng render nó. e.surface là terminal hoặc desktop. Phần Thay đổi những gì Claude Code đã vẽ sẵn cho thấy một hook có thể làm gì tại một site, kèm ví dụ cho từng lựa chọn.

Sitee.propse.requestIdĐược render trên
Panetitle, isFocused, bodyColumns, placement, scroll, viewid của paneTerminal, Desktop
AbovePrompthasSurvey, isWorking, maxRows, bodyColumns, scroll, viewMột instance duy nhấtTerminal, Desktop
UserMessagetext, origin, isExpanded, và task hoặc from tùy originid của messageTerminal, Desktop
AssistantMessageText của câu trả lờiid của messageTerminal, Desktop
ToolUse, ToolResult, ToolGroupTên, input và kết quả của toolid của tool callTerminal, Desktop
CommandOutputcommand, textid của messageTerminal, Desktop
AskUserQuestionCâu hỏi và các lựa chọnid của tool callTerminal, Desktop
ToolProgresskindid của tool callTerminal
Spinnerword, message, suffix, modeid của agentTerminal, Desktop
TurnDurationword, durationMsid của messageTerminal
InfoNoticetext, commandid của messageTerminal
SessionModemodesMột instance duy nhấtTerminal, Desktop
PromptHintisDraft, isWorking, hintMột instance duy nhấtTerminal, Desktop

e.viewport chứa columns, rows và isFullscreen. Nó không có mặt cho đến khi ứng dụng đã đo kích thước cửa sổ. rows của nó là chiều cao của toàn bộ cửa sổ, không phải của pane.

Để cây vừa với site, hãy đọc các prop sau trong hook:

  • Chiều rộng của Pane hoặc band: vẽ theo e.props.bodyColumns
  • Chiều cao của Pane nằm cạnh transcript: khi e.props.placement là 'dock', e.props.scroll.bodyRows là số hàng mà pane có
  • Chiều cao của Pane nằm phía trên prompt: khi e.props.placement là 'inline', pane cao dần theo cây của bạn tới một giới hạn, và bodyRows chỉ đếm các hàng đang hiển thị. Field rows của $.ui.open xin một giới hạn khác.

Một cây cao hơn pane sẽ được cuộn như một khối.

Element là các khối xây dựng nên cây mà hook ui.render trả về, và bạn lấy chúng từ $.ui.resolve(e). Phần Dựng cây từ các element trình bày các element thường dùng cùng cách terminal vẽ chúng, và thư viện phần tử giao diện có ảnh chụp của hầu hết element. Dấu tích nghĩa là ứng dụng vẽ được element đó.

ElementProp chínhTerminalDesktop
Boxkey, flex layout, gap, padding, margin, width, height, borderStyle, backgroundColor, position, hover✓✓
Textcolor, backgroundColor, bold, italic, underline, dimColor, inverse, wrap✓✓
Buttonkey, label, onPress, hotkey, plain, dimColor, autoFocus, action✓✓
Linkhref, label✓✓
CodeĐoạn code, tối đa 10.000 ký tự✓✓
Markdowntext, tối đa 10.000 ký tự, key, dimColor, onLinkPress, pressableLinks✓✓
Inputkey, label, placeholder, value, submitLabel, onSubmit, onInput, autoFocus✓✓
Selectkey, label, options, value, onSelect, autoFocus✓✓
SvgMột tài liệu SVG, tối đa 131.072 ký tự✓
Clientmodule, key✓✓
Rasterkey, columns tối đa 512, rows tối đa 256, cells. Xem Vẽ lưới ô màu.✓
ImageByte PNG hoặc RGBA tối đa 2 MiB, hoặc một đường dẫn file✓

Các quy tắc khác của Button: action là tên một keybinding action của chính Claude Code, và phím tắt mà user gán cho action đó sẽ bấm nút khi phím tắt là một chord hoặc một phím có modifier. Một hotkey chữ số trên một nút trong band cũng được kích hoạt khi user gõ riêng chữ số đó vào ô prompt trống rồi dừng lại. Khi hai nút trong cùng một phần vẽ dùng chung một hotkey, nút sau sẽ nhận nó. autoFocus chỉ nhận true trên mọi control, nên hãy bỏ prop này đi để tắt nó.

Hook và các lời gọi mods API chạy dưới các giới hạn về thời gian và kích thước. Claude Code bỏ qua một hook vượt giới hạn thời gian và từ chối một lời gọi vượt giới hạn kích thước.

Giới hạnGiá trị
Thời gian thực thi riêng của một hook cho một event, không tính thời gian bên trong next hoặc một lời gọi mods API khác $.clock.sleep10 giây, hoặc 50 mili giây với hook prompt.edit
Thời gian thực thi của một .catch handler1 giây
Tổng tất cả hook session.endBằng ngân sách của SessionEnd hook, 1,5 giây trừ khi bạn thay đổi, tính từ lúc các settings hook SessionEnd của bạn chạy xong
Timeout của $.process.runMặc định 30 giây, tối đa 10 phút
maxTokens của $.model.completeMặc định 1024, tối đa 64.000 hoặc giới hạn output của model
$.fs.read và $.fs.write4 MiB cho một file
Một string child của Text10.000 ký tự
$.storeTổng cộng 4 MiB JSON
$.session.messages()4.096 mục mới nhất
Số lần vẽ lại bằng $.ui.invalidate('ui.render')Giới hạn 10 lần một giây, hoặc 30 lần trong terminal với pane đang hiển thị, band đang mở rộng, và dòng gợi ý dưới prompt. Các lời gọi đến sớm hơn sẽ được gộp lại.
$.ui.toastHiển thị 4 giây, trừ khi bạn truyền { timeoutMs }
Pane được mở khi user không yêu cầuĐược đặt từ 144 cột terminal, 110 cột sau khi user đã tự mở nó một lần
Tên command, tool, loại subagent và paneChữ cái, chữ số, _ và -, tối đa 64 ký tự
Một test claude plugin test5 giây, trừ khi test đặt timeoutMs

Đây là các setting và biến môi trường ảnh hưởng tới mods. Cột Đọc từ đâu cho biết mỗi cái được đọc từ settings file hay môi trường nào:

TênĐọc từ đâuTác dụng
CLAUDE_CODE_PLUGIN_DIRSMôi trường, hoặc env trong ~/.claude/settings.jsonCác thư mục plugin cần nạp giống như --plugin-dir, dành cho những ứng dụng mà bạn không truyền cờ được. Đường dẫn tuyệt đối phân cách bằng :, hoặc ; trên Windows.
CLAUDE_CODE_PLUGIN_DIR_WATCHMôi trường1 khiến một session non-interactive chạy lâu reload các mod --plugin-dir khi lưu file
prependPlugins, appendPluginsManaged settings. Chỉ đọc từ user settings trên máy không có managed settings, với user không đăng nhập bằng gói Team hoặc Enterprise.Danh sách plugin id, như acme-guard@acme-tools. Mod trong prependPlugins chạy trước mọi mod do user cài, mod trong appendPlugins chạy sau, theo thứ tự liệt kê. Xem Thứ tự chạy của các mod.
allowManagedModsOnlyManaged settings, dưới dạng option của guard tích hợp sẵnChỉ các mod được tính là của tổ chức, và các mod tích hợp sẵn trong Claude Code, được nạp. Settings hooks của user vẫn tiếp tục chạy.
allowModsToOverrideDenyRulesManaged settings, dưới dạng option của guard tích hợp sẵnCho phép mod do user cài duyệt một tool call mà rule deny từ chối
allowManagedHooksOnlyManaged settingsChặn hook và các mod đã cài không phải của tổ chức. Xem những gì vẫn chạy.
disableAllHooksBất kỳ settings file nàoTrong managed settings, không mod hay hook nào từ plugin đã cài được chạy. Trong settings của bạn, những gì tổ chức quản lý vẫn tiếp tục chạy. Xem disableAllHooks.
disableSideloadFlagsManaged settingsTừ chối --plugin-dir và --plugin-url lúc khởi động
pluginConfigsUser settings hoặc managed settingsChứa các giá trị userConfig cho một mod, theo key là plugin id, như acme-guard@acme-tools, hoặc tên kèm @inline, như first-mod@inline, với mod nạp bằng --plugin-dir

sec-default@builtin là một guard tích hợp sẵn trong Claude Code, được liệt kê là cc-plugin-sec-default trong /plugin và debug log. Nó được nạp trước mọi mod do một người cài trên máy có managed settings, hoặc với user đăng nhập bằng gói Team hay Enterprise. Nếu managed prependPlugins đã được đặt, guard chỉ được nạp khi danh sách đó có tên nó, tại vị trí được liệt kê. Mã nguồn của nó nằm trong thư mục mods/sec-default của repository Claude Code.

Các command và cờ sau dùng để nạp, kiểm tra và test một mod. Các lệnh claude chạy trong shell, còn các lệnh / chạy tại prompt của Claude Code. Trong bảng, <directory> là đường dẫn bạn gõ, như claude plugin validate ./first-mod. Ngoặc vuông đánh dấu tham số tùy chọn.

LệnhTác dụng
/pluginHiển thị một dòng như 1 mod active · first-mod dưới các tab khi có mod không phải tích hợp sẵn đã được nạp
claude plugin validate <directory>Đọc manifest và hooks module của một plugin, báo lỗi, các event nó xử lý, và các lời gọi mods API nó thực hiện. --strict coi warning là lỗi, còn --json in báo cáo dạng máy đọc được.
claude plugin test [directory]Chạy mọi file trong thư mục, hoặc thư mục hiện tại nếu không truyền, có tên kết thúc bằng .test.ts hoặc .test.tsx. Thoát với status 1 khi có test fail.
claude --plugin-dir <directory>Nạp một thư mục plugin cho một session và reload hooks module khi bạn lưu. Lặp lại cờ để nạp nhiều thư mục.
/reload-pluginsReload các plugin khi bạn chạy nó

Bài tiếp theo: Quản lý mods cho tổ chức - Kiểm soát mods bằng managed settings: chặn mod do user cài, chỉ cho phép mod của tổ chức, và thực thi policy bằng mod riêng.