8 8
9当 mod 的模块或其中一个 hook 失败时,Claude Code 会跳过它,会话继续进行,因此损坏的 mod 看起来像什么都不做的 mod。首先检查 Claude Code 从 mod 读取了什么以及它在哪里报告问题,然后找到您遇到的症状或消息。9当 mod 的模块或其中一个 hook 失败时,Claude Code 会跳过它,会话继续进行,因此损坏的 mod 看起来像什么都不做的 mod。首先检查 Claude Code 从 mod 读取了什么以及它在哪里报告问题,然后找到您遇到的症状或消息。
10 10
11<h2 id="find-out-why-a-mod-does-nothing">11## 找出为什么 mod 不起作用
12 找出为什么 mod 不起作用
13</h2>
14 12
15当 mod 不起作用时,请检查 Claude Code 从 mod 文件读取的内容,以及它在跳过某些内容时写入的行。对于第一项,在您的 shell 中运行 [`claude plugin validate`](/docs/zh-CN/plugins/mods/create#check-what-claude-code-reads-from-your-mod),使用 mod 的目录,如 `claude plugin validate ./first-mod`。它可以捕获拼写错误的事件、错误的清单和 Claude Code 无法读取的模块,而无需启动会话。13当 mod 不起作用时,请检查 Claude Code 从 mod 文件读取的内容,以及它在跳过某些内容时写入的行。对于第一项,在您的 shell 中运行 [`claude plugin validate`](/docs/zh-CN/plugins/mods/create#check-what-claude-code-reads-from-your-mod),使用 mod 的目录,如 `claude plugin validate ./first-mod`。它可以捕获拼写错误的事件、错误的清单和 Claude Code 无法读取的模块,而无需启动会话。
16 14
20* **任何其他交互式会话,例如运行您从市场安装的 mod 的会话**:[调试日志](#read-the-debug-log) 仅。要获取一个,请使用 `claude --debug` 启动会话。18* **任何其他交互式会话,例如运行您从市场安装的 mod 的会话**:[调试日志](#read-the-debug-log) 仅。要获取一个,请使用 `claude --debug` 启动会话。
21* **带有 `--plugin-dir` 的 `claude -p` 运行**:stderr,采用默认文本输出格式。另一个 mod 的拒绝仅进入调试日志。19* **带有 `--plugin-dir` 的 `claude -p` 运行**:stderr,采用默认文本输出格式。另一个 mod 的拒绝仅进入调试日志。
22 20
23<h2 id="check-whether-mods-can-load">21## 检查 mod 是否可以加载
24 检查 mod 是否可以加载
25</h2>
26 22
27要检查您的设置是否允许 mod 加载,而无需安装一个,请在您的 shell 中从不包含 mod 的目录运行 `claude plugin test`。您不需要会话。它打印的消息告诉您状态:23要检查您的设置是否允许 mod 加载,而无需安装一个,请在您的 shell 中从不包含 mod 的目录运行 `claude plugin test`。您不需要会话。它打印的消息告诉您状态:
28 24
35 31
36组织还可以设置 `allowManagedModsOnly` 以仅允许其自己的 mod,此命令不会报告。在这种情况下,Claude Code 会拒绝您安装的 mod,并且[会有消息说明原因](/docs/zh-CN/plugins/mods/troubleshoot#messages-from-the-built-in-guard)。32组织还可以设置 `allowManagedModsOnly` 以仅允许其自己的 mod,此命令不会报告。在这种情况下,Claude Code 会拒绝您安装的 mod,并且[会有消息说明原因](/docs/zh-CN/plugins/mods/troubleshoot#messages-from-the-built-in-guard)。
37 33
38<h2 id="the-mod-doesn’t-load">34## mod 不加载
39 mod 不加载
40</h2>
41 35
42mod 添加的任何内容都不会出现:没有命令、没有绘图,也没有行为改变。36mod 添加的任何内容都不会出现:没有命令、没有绘图,也没有行为改变。
43 37
44<h3 id="your-version-is-too-old">38### 您的版本过旧
45 您的版本过旧
46</h3>
47 39
48请参阅[应使用哪个版本以及如何检查您的版本](/docs/zh-CN/plugins/mods/overview#turn-mods-on-or-off)。40请参阅[应使用哪个版本以及如何检查您的版本](/docs/zh-CN/plugins/mods/overview#turn-mods-on-or-off)。
49 41
50<h3 id="the-mods-active-line-doesn’t-name-the-mod">42### `mods active` 行不命名 mod
51 `mods active` 行不命名 mod
52</h3>
53 43
54mod 添加的任何内容都不会出现,`/plugin` 中的 [`mods active` 行](/docs/zh-CN/plugins/mods/overview#see-which-mods-a-session-loaded) 不命名它。hooks 模块未加载。当 Claude Code 拒绝它时,调试日志有一行以 `hooks module`、mod 的名称和 `not loaded:` 开头,如 `hooks module first-mod@inline not loaded: disableAllHooks in managed settings`,用于使用 `--plugin-dir` 加载的 mod。44mod 添加的任何内容都不会出现,`/plugin` 中的 [`mods active` 行](/docs/zh-CN/plugins/mods/overview#see-which-mods-a-session-loaded) 不命名它。hooks 模块未加载。当 Claude Code 拒绝它时,调试日志有一行以 `hooks module`、mod 的名称和 `not loaded:` 开头,如 `hooks module first-mod@inline not loaded: disableAllHooks in managed settings`,用于使用 `--plugin-dir` 加载的 mod。
55 45
57 47
58某些设置会阻止 mod,同时让其插件的其余部分继续工作。[启用或关闭 mod](/docs/zh-CN/plugins/mods/overview#turn-mods-on-or-off) 列出了这些设置。48某些设置会阻止 mod,同时让其插件的其余部分继续工作。[启用或关闭 mod](/docs/zh-CN/plugins/mods/overview#turn-mods-on-or-off) 列出了这些设置。
59 49
60<h3 id="a-claude-p-run-prints-hooks-module-not-loaded">50### `claude -p` 运行打印 `hooks module not loaded`
61 `claude -p` 运行打印 `hooks module not loaded`
62</h3>
63 51
64该行以 mod 的名称开头并进入 stderr。hooks 模块被拒绝。非交互式运行没有成绩单,因此消息进入 stderr。52该行以 mod 的名称开头并进入 stderr。hooks 模块被拒绝。非交互式运行没有成绩单,因此消息进入 stderr。
65 53
66读取冒号后的原因。[拒绝消息](#refusal-messages) 部分列出了每一个。54读取冒号后的原因。[拒绝消息](#refusal-messages) 部分列出了每一个。
67 55
68<h3 id="refusal-messages">56### 拒绝消息
69 拒绝消息
70</h3>
71 57
72这些消息中的每一个都遵循调试日志中的 `hooks module`、mod 的名称和 `not loaded:`。58这些消息中的每一个都遵循调试日志中的 `hooks module`、mod 的名称和 `not loaded:`。
73 59
80| `installed plugins that are not managed load no hooks module in this mode (--bare)` | 您使用 `--bare` 启动了 Claude Code |66| `installed plugins that are not managed load no hooks module in this mode (--bare)` | 您使用 `--bare` 启动了 Claude Code |
81| `another plugin of that name loads first` | 另一个已启用的插件与您的 mod 同名,并且[占用了该名称](/docs/zh-CN/plugins/loading#hooks-when-two-enabled-plugins-share-a-name),因此您的 hook 模块不会加载 |67| `another plugin of that name loads first` | 另一个已启用的插件与您的 mod 同名,并且[占用了该名称](/docs/zh-CN/plugins/loading#hooks-when-two-enabled-plugins-share-a-name),因此您的 hook 模块不会加载 |
82 68
83<h3 id="messages-from-the-built-in-guard">69### 来自内置保护的消息
84 来自内置保护的消息
85</h3>
86 70
87在具有托管设置的机器上,或对于使用 Team 或 Enterprise 计划登录的用户,[内置保护](/docs/zh-CN/plugins/mods/admin#know-what-happens-by-default) 可以拒绝 mod 或其答案之一。每条消息都命名您的组织管理员设置以更改规则的选项。71在具有托管设置的机器上,或在凭据为 Team 或 Enterprise `/login` 的会话中,[内置守卫](/docs/zh-CN/plugins/mods/admin#know-what-happens-by-default) 可以拒绝 mod 或其答案之一。每条消息都会指明您的组织管理员为更改该规则而设置的选项。
88 72
89| 消息包含 | 这意味着什么 | 它出现在哪里 |73| 消息包含 | 这意味着什么 | 它出现在哪里 |
90| :- | :- | :- |74| :- | :- | :- |
92| `tried to lift a deny rule in your settings` | 您的 mod 的 [`tool.check`](/docs/zh-CN/plugins/mods/reference#tools) hook 批准了 `deny` 规则拒绝的调用。该调用保持被拒绝。 | 成绩单和调试日志,会话中每个 mod 一次。在 `claude -p` 运行中,仅调试日志。 |76| `tried to lift a deny rule in your settings` | 您的 mod 的 [`tool.check`](/docs/zh-CN/plugins/mods/reference#tools) hook 批准了 `deny` 规则拒绝的调用。该调用保持被拒绝。 | 成绩单和调试日志,会话中每个 mod 一次。在 `claude -p` 运行中,仅调试日志。 |
93| `the deny rules in your settings could not be checked for this call, so it is refused` | 保护在检查 mod 批准的调用时失败,因此它拒绝了该调用 | Claude 为被拒绝的调用读取的原因 |77| `the deny rules in your settings could not be checked for this call, so it is refused` | 保护在检查 mod 批准的调用时失败,因此它拒绝了该调用 | Claude 为被拒绝的调用读取的原因 |
94 78
95<h3 id="validate-passes-and-lists-no-hooks-line">79### `validate` 通过且不列出 `hooks` 行
96 `validate` 通过且不列出 `hooks` 行
97</h3>
98 80
99`hooks/hooks.json` 没有 `modules` 键,或键拼写错误。81`hooks/hooks.json` 没有 `modules` 键,或键拼写错误。
100 82
101添加 `"modules": ["./register.js"]`。83添加 `"modules": ["./register.js"]`。
102 84
103<h3 id="hooks-module-did-not-load">85### `hooks module did not load`
104 `hooks module did not load`
105</h3>
106 86
107该行以 mod 的名称开头,然后是 `hooks module did not load:` 和一个原因,当问题在您的代码中时,它给出文件和行。Claude Code 无法加载模块,例如因为其顶级代码抛出了异常。87该行以 mod 的名称开头,然后是 `hooks module did not load:` 和一个原因,当问题在您的代码中时,它给出文件和行。Claude Code 无法加载模块,例如因为其顶级代码抛出了异常。
108 88
109修复原因命名的错误。89修复原因命名的错误。
110 90
111<h3 id="options-do-not-fit-plugin-json-userconfig">91### `options do not fit plugin.json userConfig`
112 `options do not fit plugin.json userConfig`
113</h3>
114 92
115该行以 mod 的名称开头,然后是 `hooks module did not load: options do not fit plugin.json userConfig:` 和一个原因。某个选项未通过其 [`userConfig`](/docs/zh-CN/plugins/components#user-configuration) 字段的验证,例如高于字段 `max` 的数字,或必需字段没有值。93该行以 mod 的名称开头,然后是 `hooks module did not load: options do not fit plugin.json userConfig:` 和一个原因。某个选项未通过其 [`userConfig`](/docs/zh-CN/plugins/components#user-configuration) 字段的验证,例如高于字段 `max` 的数字,或必需字段没有值。
116 94
117设置或更改值。该行的末尾命名其在 `settings.json` 中的 `pluginConfigs` 条目。95设置或更改值。该行的末尾命名其在 `settings.json` 中的 `pluginConfigs` 条目。
118 96
119<h3 id="code-nested-too-deep-to-scan-more-than-2000-scopes">97### `code nested too deep to scan: more than 2000 scopes`
120 `code nested too deep to scan: more than 2000 scopes`
121</h3>
122 98
123该行以 mod 的名称开头,然后是 `hooks module did not load:`、文件,以及 `code nested too deep to scan: more than 2000 scopes`。hook 模块中的文件不能将作用域(例如函数、块和循环)嵌套超过 [2,000 层](/docs/zh-CN/plugins/mods/reference#limits)。[`claude plugin validate`](/docs/zh-CN/plugins/mods/create#check-what-claude-code-reads-from-your-mod) 会报告相同的原因。99该行以 mod 的名称开头,然后是 `hooks module did not load:`、文件,以及 `code nested too deep to scan: more than 2000 scopes`。hook 模块中的文件不能将作用域(例如函数、块和循环)嵌套超过 [2,000 层](/docs/zh-CN/plugins/mods/reference#limits)。[`claude plugin validate`](/docs/zh-CN/plugins/mods/create#check-what-claude-code-reads-from-your-mod) 会报告相同的原因。
124 100
125重写代码,减少其作用域的嵌套深度。101重写代码,减少其作用域的嵌套深度。
126 102
127<h3 id="no-mod-loads-in-a-directory-you-opened-for-the-first-time">103### 没有 mod 在您首次打开的目录中加载
128 没有 mod 在您首次打开的目录中加载
129</h3>
130 104
131您还没有回答该目录的信任提示。105您还没有回答该目录的信任提示。
132 106
133使用 `claude` 在该目录中启动交互式会话,并接受它打开的信任提示。107使用 `claude` 在该目录中启动交互式会话,并接受它打开的信任提示。
134 108
135<h3 id="no-installed-plugin-loads-at-all">109### 没有已安装的插件加载
136 没有已安装的插件加载
137</h3>
138 110
139您使用 `--safe-mode` 启动了 Claude Code。111您使用 `--safe-mode` 启动了 Claude Code。
140 112
141启动时不使用该标志。113启动时不使用该标志。
142 114
143<h3 id="claude-code-stops-asking-to-enable-hot-reloading">115### Claude Code 不再询问是否启用热重载
144 Claude Code 不再询问是否启用热重载
145</h3>
146 116
147Claude 在交互式会话中编写了 mod,但没有任何内容加载,而且 Claude Code 不再询问[是否启用热重载](/docs/zh-CN/plugins/mods/create#ask-claude-for-a-mod)。如果该问题有三次在未选择任何答案的情况下结束,热重载将保持关闭。例如,当您设置了 [`askUserQuestionTimeout`](/docs/zh-CN/settings-reference#askuserquestiontimeout) 并且在您回答之前时间已到时,问题就会以这种方式结束。该设置在此适用,是因为 Claude Code 使用与 [`AskUserQuestion` 相同的问题对话框](/docs/zh-CN/tools-reference#question-auto-continue-timeout)进行询问。您自己关闭的问题不计入这三次。117Claude 在交互式会话中编写了 mod,但没有任何内容加载,而且 Claude Code 不再询问[是否启用热重载](/docs/zh-CN/plugins/mods/create#ask-claude-for-a-mod)。如果该问题有三次在未选择任何答案的情况下结束,热重载将保持关闭。例如,当您设置了 [`askUserQuestionTimeout`](/docs/zh-CN/settings-reference#askuserquestiontimeout) 并且在您回答之前时间已到时,问题就会以这种方式结束。该设置在此适用,是因为 Claude Code 使用与 [`AskUserQuestion` 相同的问题对话框](/docs/zh-CN/tools-reference#question-auto-continue-timeout)进行询问。您自己关闭的问题不计入这三次。
148 118
149要运行该 mod,请[将其目录从 mods 文件夹中复制出来](/docs/zh-CN/plugins/mods/create#use-the-mod-in-other-sessions),然后在 shell 中使用 `--plugin-dir` 启动新会话,例如 `claude --plugin-dir ~/mods/git-branch`。119要运行该 mod,请[将其目录从 mods 文件夹中复制出来](/docs/zh-CN/plugins/mods/create#use-the-mod-in-other-sessions),然后在 shell 中使用 `--plugin-dir` 启动新会话,例如 `claude --plugin-dir ~/mods/git-branch`。
150 120
151<h2 id="a-hook-is-skipped-or-a-mod-is-unloaded">121## hook 被跳过或 mod 被卸载
152 hook 被跳过或 mod 被卸载
153</h2>
154 122
155mod 已加载,然后 Claude Code 跳过了其中一个 hooks 或卸载了它。123mod 已加载,然后 Claude Code 跳过了其中一个 hooks 或卸载了它。
156 124
157<h3 id="hook-skipped">125### `hook skipped`
158 `hook skipped`
159</h3>
160 126
161该行命名 mod 和事件,然后说 `hook skipped:` 和一个原因,如 `first-mod: tool.call hook skipped: threw Error: boom`。hook 抛出了异常、运行超过了其[时间限制](/docs/zh-CN/plugins/mods/reference#limits),或返回了错误形状的结果。该行对每个事件和失败类型出现一次,直到 mod 重新加载。127该行命名 mod 和事件,然后说 `hook skipped:` 和一个原因,如 `first-mod: tool.call hook skipped: threw Error: boom`。hook 抛出了异常、运行超过了其[时间限制](/docs/zh-CN/plugins/mods/reference#limits),或返回了错误形状的结果。该行对每个事件和失败类型出现一次,直到 mod 重新加载。
162 128
163修复错误。调试日志对每次出现都有一行。129修复错误。调试日志对每次出现都有一行。
164 130
165<h3 id="no-command-run-hook-answered-it">131### `no command.run hook answered it`
166 `no command.run hook answered it`
167</h3>
168 132
169您运行了 mod 添加的命令,回复命名了 mod 和命令,如 `first-mod registered /tally but no command.run hook answered it`,然后告诉您添加一个 hook。当命令到达链的末尾而没有答案时,Claude Code 会打印该回复,这发生在两种情况下:133您运行了 mod 添加的命令,回复命名了 mod 和命令,如 `first-mod registered /tally but no command.run hook answered it`,然后告诉您添加一个 hook。当命令到达链的末尾而没有答案时,Claude Code 会打印该回复,这发生在两种情况下:
170 134
173 137
174如果模块已经有回复描述的 hook,请查找命名 `command.run` 的 `hook skipped` 行,它给出了原因。运行命令的 [test](/docs/zh-CN/plugins/mods/test) 失败,原因相同。138如果模块已经有回复描述的 hook,请查找命名 `command.run` 的 `hook skipped` 行,它给出了原因。运行命令的 [test](/docs/zh-CN/plugins/mods/test) 失败,原因相同。
175 139
176<h3 id="it-crashed-the-hooks-worker">140### `it crashed the hooks worker`
177 `it crashed the hooks worker`
178</h3>
179 141
180该行以 mod 的名称开头,如 `first-mod was unloaded: it crashed the hooks worker`。已安装的 mod 共享一个工作线程。工作线程停止响应或崩溃,Claude Code 将其追踪到此 mod 并卸载了它。阻止线程的 hook(例如永不等待的循环)是一个原因。142该行以 mod 的名称开头,如 `first-mod was unloaded: it crashed the hooks worker`。已安装的 mod 共享一个工作线程。工作线程停止响应或崩溃,Claude Code 将其追踪到此 mod 并卸载了它。阻止线程的 hook(例如永不等待的循环)是一个原因。
181 143
182修复 hook。144修复 hook。
183 145
184<h3 id="its-session-start-ran-again-in-a-fresh-copy">146### `its session.start ran again in a fresh copy`
185 `its session.start ran again in a fresh copy`
186</h3>
187 147
188该行以 mod 的名称开头,并指出一个 `$.prompt.submit`、`$.command.run` 或 `$.agent.spawn` 调用,如 `first-mod: its session.start ran again in a fresh copy; the $.prompt.submit call it had already made was not made again`。Claude Code 再次加载了该 mod 的模块(例如在 hooks worker 崩溃并被替换之后),新副本的 [`session.start`](/docs/zh-CN/plugins/mods/reference#session) hook 运行了。该行指出的调用以其首次运行的结果完成,而没有再次运行,因此您的 mod 不会重复提交提示词、运行命令或启动子代理。hook 的其余部分照常运行。148该行以 mod 的名称开头,并指出一个 `$.prompt.submit`、`$.command.run` 或 `$.agent.spawn` 调用,如 `first-mod: its session.start ran again in a fresh copy; the $.prompt.submit call it had already made was not made again`。Claude Code 再次加载了该 mod 的模块(例如在 hooks worker 崩溃并被替换之后),新副本的 [`session.start`](/docs/zh-CN/plugins/mods/reference#session) hook 运行了。该行指出的调用以其首次运行的结果完成,而没有再次运行,因此您的 mod 不会重复提交提示词、运行命令或启动子代理。hook 的其余部分照常运行。
189 149
191 151
192在 v2.1.292 之前,该调用会再运行一次,因此提示词会被提交两次、命令会被运行两次,或子代理会被启动两次。152在 v2.1.292 之前,该调用会再运行一次,因此提示词会被提交两次、命令会被运行两次,或子代理会被启动两次。
193 153
194<h3 id="$-agent-register-refused-the-hooks-module-that-made-the-call-is-no-longer-loaded">154### `$.agent.register refused: the hooks module that made the call is no longer loaded`
195 `$.agent.register refused: the hooks module that made the call is no longer loaded`
196</h3>
197 155
198该行以您的 mod 名称开头,如 `first-mod: $.agent.register refused: the hooks module that made the call is no longer loaded (it was reloaded or removed)`,且该 Agent 未被注册。您的 mod 在该调用之前被重新加载或卸载。重新加载会加载 hook 模块的新副本,而此调用来自仍在旧副本中运行的代码,例如尚未返回的 hook。156该行以您的 mod 名称开头,如 `first-mod: $.agent.register refused: the hooks module that made the call is no longer loaded (it was reloaded or removed)`,且该 Agent 未被注册。您的 mod 在该调用之前被重新加载或卸载。重新加载会加载 hook 模块的新副本,而此调用来自仍在旧副本中运行的代码,例如尚未返回的 hook。
199 157
200如果该 hook 未捕获此拒绝,它会失败,Claude Code 会[跳过它](#hook-skipped)。要从保持加载的副本注册该 Agent,请在您的 [`session.start`](/docs/zh-CN/plugins/mods/reference#session) hook 中进行该调用,该 hook 会在重新加载后的每个新副本中再次运行。158如果该 hook 未捕获此拒绝,它会失败,Claude Code 会[跳过它](#hook-skipped)。要从保持加载的副本注册该 Agent,请在您的 [`session.start`](/docs/zh-CN/plugins/mods/reference#session) hook 中进行该调用,该 hook 会在重新加载后的每个新副本中再次运行。
201 159
202<h3 id="mods-that-run-in-the-hooks-worker-are-off-for-this-session">160### `mods that run in the hooks worker are off for this session`
203 `mods that run in the hooks worker are off for this session`
204</h3>
205 161
206该行读取 `hooks: mods that run in the hooks worker are off for this session: it crashed 3 times`。工作线程停止了三次,Claude Code 无法将停止追踪到一个 mod,因此它卸载了每个不是内置的 mod,包括您的组织安装的 mod。此行在每个交互式会话中到达成绩单。162该行读取 `hooks: mods that run in the hooks worker are off for this session: it crashed 3 times`。工作线程停止了三次,Claude Code 无法将停止追踪到一个 mod,因此它卸载了每个不是内置的 mod,包括您的组织安装的 mod。此行在每个交互式会话中到达成绩单。
207 163
208运行 `/reload-plugins` 以再次加载它们。164运行 `/reload-plugins` 以再次加载它们。
209 165
210<h2 id="a-tool-call-is-denied">166## 工具调用被拒绝
211 工具调用被拒绝
212</h2>
213 167
214mod 已加载,其 hooks 运行,它接触的工具调用被拒绝。168mod 已加载,其 hooks 运行,它接触的工具调用被拒绝。
215 169
216<h3 id="a-hook-changed-this-call’s-input-after-the-model-wrote-it">170### `a hook changed this call's input after the model wrote it`
217 `a hook changed this call's input after the model wrote it`
218</h3>
219 171
220在自动模式下,被拒绝的工具调用给出此原因。hook 在 [服务器端分类器](/docs/zh-CN/permission-modes#server-side-classifier-review) 审查后更改了工具调用的输入,因此该审查不涵盖将运行的内容。hook 可以是 mod 的 [`tool.call`](/docs/zh-CN/plugins/mods/reference#tools) 或 [`turn.step`](/docs/zh-CN/plugins/mods/reference#turns) hook,或 [`PreToolUse`](/docs/zh-CN/hooks#pretooluse) 设置 hook。消息不说明是哪一个。172在自动模式下,被拒绝的工具调用给出此原因。hook 在 [服务器端分类器](/docs/zh-CN/permission-modes#server-side-classifier-review) 审查后更改了工具调用的输入,因此该审查不涵盖将运行的内容。hook 可以是 mod 的 [`tool.call`](/docs/zh-CN/plugins/mods/reference#tools) 或 [`turn.step`](/docs/zh-CN/plugins/mods/reference#turns) hook,或 [`PreToolUse`](/docs/zh-CN/hooks#pretooluse) 设置 hook。消息不说明是哪一个。
221 173
222消息告诉 Claude 再次发出记录的调用。如果也被拒绝,hook 每次都更改输入,因此关闭 mod 或 hook,或离开自动模式并自己批准调用。174消息告诉 Claude 再次发出记录的调用。如果也被拒绝,hook 每次都更改输入,因此关闭 mod 或 hook,或离开自动模式并自己批准调用。
223 175
224<h3 id="a-message-about-the-deny-rules-in-your-settings">176### 关于您的设置中的拒绝规则的消息
225 关于您的设置中的拒绝规则的消息
226</h3>
227 177
228`tried to lift a deny rule in your settings` 和 `the deny rules in your settings could not be checked for this call, so it is refused` 都来自内置保护。178`tried to lift a deny rule in your settings` 和 `the deny rules in your settings could not be checked for this call, so it is refused` 都来自内置保护。
229 179
230在 [来自内置保护的消息](#messages-from-the-built-in-guard) 中查找它们。180在 [来自内置保护的消息](#messages-from-the-built-in-guard) 中查找它们。
231 181
232<h2 id="a-drawing-doesn’t-appear-or-respond">182## 停止轮次后出现提示
233 绘图不出现或不响应183
234</h2>184### `Stopped: type a message to continue; a mod cannot resume work after Stop`
185
186此提示表示,在您停止轮次之后(例如按下 Esc),某个 mod 试图自行开始工作,而 Claude Code 没有允许它这样做。无需进行任何修复。在您发送下一条消息后,mod 可以再次开始工作,并且[其中部分工作会自行恢复](/docs/zh-CN/plugins/mods/api#work-your-mod-started-before-the-interruption)。如果您期望从该 mod 获得的结果没有恢复,请再次提出请求,或再次运行该 mod 的命令。
187
188如果该 mod 是您编写的,请参阅[用户中断轮次后的调用和后台工作](/docs/zh-CN/plugins/mods/api#calls-and-background-work-after-the-user-interrupts-a-turn)。
189
190## 绘图不出现或不响应
235 191
236mod 已加载,其窗格、带、toast 或控件的行为不符合您的预期。192mod 已加载,其窗格、带、toast 或控件的行为不符合您的预期。
237 193
238<h3 id="another-mods-band-shows-and-yours-doesnt">194### 显示了另一个 mod 的带,而您的带没有显示
239 显示了另一个 mod 的带,而您的带没有显示
240</h3>
241 195
242输入框上方只有一个带,所有 mod 共用它。在[您的 mod 之前](/docs/zh-CN/plugins/mods/events#the-order-mods-run-in)运行的 mod 如果返回的树中不包含 `next(e)` 的结果,就会替换您的带。要同时显示两个带,请修改该 mod 的 hook,或请其作者修改:196输入框上方只有一个带,所有 mod 共用它。在[您的 mod 之前](/docs/zh-CN/plugins/mods/events#the-order-mods-run-in)运行的 mod 如果返回的树中不包含 `next(e)` 的结果,就会替换您的带。要同时显示两个带,请修改该 mod 的 hook,或请其作者修改:
243 197
248 202
249进行更改后,如果任一 mod 返回的树未通过验证,带中将不显示任何内容。要了解原因,请在 `--plugin-dir` 会话的会话记录中查找 `ui.render (AbovePrompt) refused:` 行,或在调试日志中搜索 `does not validate`。当带中有多个 mod 时,这两行都不会指明具体的 mod,因此请检查每个 mod 的树。203进行更改后,如果任一 mod 返回的树未通过验证,带中将不显示任何内容。要了解原因,请在 `--plugin-dir` 会话的会话记录中查找 `ui.render (AbovePrompt) refused:` 行,或在调试日志中搜索 `does not validate`。当带中有多个 mod 时,这两行都不会指明具体的 mod,因此请检查每个 mod 的树。
250 204
251<h3 id="a-pane-or-band-is-empty-or-shows-claude-code’s-usual-content">205### 窗格或带为空或显示 Claude Code 的常规内容
252 窗格或带为空或显示 Claude Code 的常规内容
253</h3>
254 206
255您的 hook 返回的 [树](/docs/zh-CN/plugins/mods/interface#build-a-tree-from-elements) 未通过验证。使用 `--plugin-dir` 时,会话记录会显示 `ui.render (Pane) refused:` 及原因,如 `first-mod: ui.render (Pane) refused: Box prop "flexDirection" must be one of row, column, row-reverse, column-reverse; the engine drew its own`。调试日志中有 `a hook returned a tree that does not validate` 及相同的原因。207您的 hook 返回的 [树](/docs/zh-CN/plugins/mods/interface#build-a-tree-from-elements) 未通过验证。使用 `--plugin-dir` 时,会话记录会显示 `ui.render (Pane) refused:` 及原因,如 `first-mod: ui.render (Pane) refused: Box prop "flexDirection" must be one of row, column, row-reverse, column-reverse; the engine drew its own`。调试日志中有 `a hook returned a tree that does not validate` 及相同的原因。
256 208
257读取该行上的原因。常见原因是元素不接受的 prop 和应用没有的元素。209读取该行上的原因。常见原因是元素不接受的 prop 和应用没有的元素。
258 210
259<h3 id="a-ui-render-line-says-threw-while-drawn">211### `ui.render` 行显示 `threw while drawn`
260 `ui.render` 行显示 `threw while drawn`
261</h3>
262 212
263该行会指明[渲染位置](/docs/zh-CN/plugins/mods/reference#render-sites),然后显示 `threw while drawn:` 及错误,如 `first-mod: ui.render (ToolUse) threw while drawn: <error>; the engine drew its own`。Claude Code 在绘制您的 [`ui.render`](/docs/zh-CN/plugins/mods/reference#interface) hook 返回的树时,或在根据[您的 hook 传递给 `next` 的 `props`](/docs/zh-CN/plugins/mods/interface#change-what-claude-code-already-draws) 绘制该位置时,遇到了该错误。结尾的 `the engine drew its own` 表示该位置显示 Claude Code 的常规内容。213该行会指明[渲染位置](/docs/zh-CN/plugins/mods/reference#render-sites),然后显示 `threw while drawn:` 及错误,如 `first-mod: ui.render (ToolUse) threw while drawn: <error>; the engine drew its own`。Claude Code 在绘制您的 [`ui.render`](/docs/zh-CN/plugins/mods/reference#interface) hook 返回的树时,或在根据[您的 hook 传递给 `next` 的 `props`](/docs/zh-CN/plugins/mods/interface#change-what-claude-code-already-draws) 绘制该位置时,遇到了该错误。结尾的 `the engine drew its own` 表示该位置显示 Claude Code 的常规内容。
264 214
266 216
267在 v2.1.289 之前,会话记录行中出现此错误会导致会话以 [`Claude Code exited after an unrecoverable interface error`](/docs/zh-CN/errors#exited-after-an-unrecoverable-interface-error) 结束。217在 v2.1.289 之前,会话记录行中出现此错误会导致会话以 [`Claude Code exited after an unrecoverable interface error`](/docs/zh-CN/errors#exited-after-an-unrecoverable-interface-error) 结束。
268 218
269<h3 id="the-module-failed-without-a-message">219### `the module failed without a message`
270 `the module failed without a message`
271</h3>
272 220
273某个 [`Client`](/docs/zh-CN/plugins/mods/interface#when-a-client-fails) 因一个没有消息的错误而失败,例如 `throw new Error()`。在其位置显示的行类似 `my-mod: Client client/spinner.js: the module failed without a message`。221某个 [`Client`](/docs/zh-CN/plugins/mods/interface#when-a-client-fails) 因一个没有消息的错误而失败,例如 `throw new Error()`。在其位置显示的行类似 `my-mod: Client client/spinner.js: the module failed without a message`。
274 222
276 224
277在 v2.1.289 之前,该行改为显示 `Error` 作为原因。225在 v2.1.289 之前,该行改为显示 `Error` 作为原因。
278 226
279<h3 id="$-ui-open-runs-and-no-pane-appears">227### `$.ui.open` 运行且没有窗格出现
280 `$.ui.open` 运行且没有窗格出现
281</h3>
282 228
283调用不是来自用户做的事情,且终端宽度小于[该窗格所需的宽度](/docs/zh-CN/plugins/mods/interface#when-a-pane-waits-for-a-wider-terminal)。229调用不是来自用户做的事情,且终端宽度小于[该窗格所需的宽度](/docs/zh-CN/plugins/mods/interface#when-a-pane-waits-for-a-wider-terminal)。
284 230
285从命令或按钮打开窗格,或检查调用的 `isPlaced` 结果。请参阅 [在正确的时间打开窗格](/docs/zh-CN/plugins/mods/interface#open-a-pane-at-the-right-time)。231从命令或按钮打开窗格,或检查调用的 `isPlaced` 结果。请参阅 [在正确的时间打开窗格](/docs/zh-CN/plugins/mods/interface#open-a-pane-at-the-right-time)。
286 232
287<h3 id="a-toast-doesn’t-appear">233### toast 不出现
288 toast 不出现
289</h3>
290 234
291您的 mod 在交互式终端会话中调用了 [`$.ui.toast`](/docs/zh-CN/plugins/mods/api#show-something-without-starting-a-turn),但您没有看到该 toast。要确认调用已运行,请在[调试日志](#read-the-debug-log)中查找包含您的 mod 名称和 toast 文本的行,如 `$.ui.toast (first-mod): build finished`。然后检查以下原因:235您的 mod 在交互式终端会话中调用了 [`$.ui.toast`](/docs/zh-CN/plugins/mods/api#show-something-without-starting-a-turn),但您没有看到该 toast。要确认调用已运行,请在[调试日志](#read-the-debug-log)中查找包含您的 mod 名称和 toast 文本的行,如 `$.ui.toast (first-mod): build finished`。然后检查以下原因:
292 236
298 242
299在 v2.1.290 之前,如果某个 toast 是在 Claude Code 为您的 mod 显示上一个 toast 后两秒内发出的,Claude Code 会丢弃该 toast,且调试日志中针对被丢弃 toast 的行会显示 `within 2000ms of the last; dropped`。243在 v2.1.290 之前,如果某个 toast 是在 Claude Code 为您的 mod 显示上一个 toast 后两秒内发出的,Claude Code 会丢弃该 toast,且调试日志中针对被丢弃 toast 的行会显示 `within 2000ms of the last; dropped`。
300 244
301<h3 id="hotkeys-do-nothing">245### 热键不起作用
302 热键不起作用
303</h3>
304 246
305您的窗格没有键盘焦点,或者绘图位于 VS Code 扩展中,而该扩展中的按钮没有热键。请按对应的情况操作:247您的窗格没有键盘焦点,或者绘图位于 VS Code 扩展中,而该扩展中的按钮没有热键。请按对应的情况操作:
306 248
307* **没有键盘焦点**:按 Ctrl+X 然后 Tab,或单击窗格。要让窗格在打开时获得焦点,请从命令中使用 `focus: true` 打开它。249* **没有键盘焦点**:按 Ctrl+X 然后 Tab,或单击窗格。要让窗格在打开时获得焦点,请从命令中使用 `focus: true` 打开它。
308* **在 VS Code 扩展中**:单击按钮,或在按钮获得焦点后按 Enter250* **在 VS Code 扩展中**:单击按钮,或在按钮获得焦点后按 Enter
309 251
310<h3 id="a-drawing-works-in-the-terminal-and-not-in-the-desktop-app-or-vs-code">252### 绘图在终端中有效,在桌面应用或 VS Code 中无效
311 绘图在终端中有效,在桌面应用或 VS Code 中无效
312</h3>
313 253
314要么该应用不绘制该位置或元素,要么该会话属于 VS Code 扩展不为 mod 绘制任何内容的会话。该 mod 的其他 hook 仍会运行。请检查以下原因:254要么该应用不绘制该位置或元素,要么该会话属于 VS Code 扩展不为 mod 绘制任何内容的会话。该 mod 的其他 hook 仍会运行。请检查以下原因:
315 255
317* **VS Code 扩展版本低于 2.1.299**:从[扩展版本](/docs/zh-CN/vs-code#install-the-extension) 2.1.299 起,聊天面板才会为 mod 进行绘制。请在 VS Code 的扩展视图中检查版本,并在该处更新扩展。257* **VS Code 扩展版本低于 2.1.299**:从[扩展版本](/docs/zh-CN/vs-code#install-the-extension) 2.1.299 起,聊天面板才会为 mod 进行绘制。请在 VS Code 的扩展视图中检查版本,并在该处更新扩展。
318* **扩展版本低于 2.1.304,且该会话不获取功能标志**:请更新扩展,或改为在 VS Code 的集成终端中运行 `claude`。在 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 上的会话会跳过此获取步骤。对于跳过此步骤的其他会话,例如 [Claude apps 网关](/docs/zh-CN/claude-apps-gateway)会话,请参阅[需要获取功能标志的功能](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)。258* **扩展版本低于 2.1.304,且该会话不获取功能标志**:请更新扩展,或改为在 VS Code 的集成终端中运行 `claude`。在 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 上的会话会跳过此获取步骤。对于跳过此步骤的其他会话,例如 [Claude apps 网关](/docs/zh-CN/claude-apps-gateway)会话,请参阅[需要获取功能标志的功能](/docs/zh-CN/env-vars#features-that-need-feature-flag-fetching)。
319 259
320<h2 id="an-edit-or-a-value-is-lost">260## 编辑或值丢失
321 编辑或值丢失
322</h2>
323 261
324mod 运行,您所做的更改或它保留的值不存在。262mod 运行,您所做的更改或它保留的值不存在。
325 263
326<h3 id="your-edits-don’t-take-effect">264### 您的编辑不生效
327 您的编辑不生效
328</h3>
329 265
330您正在编辑您安装的插件。Claude Code 运行已安装版本的缓存副本。266您正在编辑您安装的插件。Claude Code 运行已安装版本的缓存副本。
331 267
332使用指向您的工作副本的 `--plugin-dir` 进行开发,如 `claude --plugin-dir ./first-mod`,它在您保存时重新加载。268使用指向您的工作副本的 `--plugin-dir` 进行开发,如 `claude --plugin-dir ./first-mod`,它在您保存时重新加载。
333 269
334<h3 id="a-value-resets-when-the-module-reloads">270### 模块重新加载时值重置
335 模块重新加载时值重置
336</h3>
337 271
338模块级变量在每次重新加载时重新初始化。272模块级变量在每次重新加载时重新初始化。
339 273
340[将值保留在 `$.state` 或 `$.store` 中](/docs/zh-CN/plugins/mods/interface#keep-state)。274[将值保留在 `$.state` 或 `$.store` 中](/docs/zh-CN/plugins/mods/interface#keep-state)。
341 275
342<h3 id="a-value-resets-after-/clear-/resume-or-/branch">276### 值在 `/clear`、`/resume` 或 `/branch` 后重置
343 值在 `/clear`、`/resume` 或 `/branch` 后重置
344</h3>
345 277
346值重置,或保存的值被其默认值替换。这些命令中的每一个都将 `$.state` 重置为其默认值,`session.start` 不再触发。278值重置,或保存的值被其默认值替换。这些命令中的每一个都将 `$.state` 重置为其默认值,`session.start` 不再触发。
347 279
348[在 `classic.SessionStart` hook 中再次加载保存的值](/docs/zh-CN/plugins/mods/interface#load-a-saved-value-again-after-clear)。280[在 `classic.SessionStart` hook 中再次加载保存的值](/docs/zh-CN/plugins/mods/interface#load-a-saved-value-again-after-clear)。
349 281
350<h2 id="read-the-debug-log">282## 阅读调试日志
351 阅读调试日志
352</h2>
353 283
354调试日志对 Claude Code 加载或拒绝的每个模块、每个失败的 hook 以及它拒绝的每个结果都有一行,因此当会话记录中没有任何显示时,这是查看的地方。要写入一个,在您的 shell 中使用 `--debug` 启动 Claude Code,或使用 `--debug-file <path>` 选择它的位置:284调试日志对 Claude Code 加载或拒绝的每个模块、每个失败的 hook 以及它拒绝的每个结果都有一行,因此当会话记录中没有任何显示时,这是查看的地方。要写入一个,在您的 shell 中使用 `--debug` 启动 Claude Code,或使用 `--debug-file <path>` 选择它的位置:
355 285
373 303
374当您编辑使用 `--plugin-dir` 加载的 mod 时,会话记录为每次重新加载显示一行,命名 mod 并列出其 hook。如果保存破坏了模块,该行会显示 `reload failed, the previous version stays loaded:` 及原因,最后一个可用版本会继续运行,直到 Claude Code 下次重新加载插件,例如当您运行 `/reload-plugins` 时。304当您编辑使用 `--plugin-dir` 加载的 mod 时,会话记录为每次重新加载显示一行,命名 mod 并列出其 hook。如果保存破坏了模块,该行会显示 `reload failed, the previous version stays loaded:` 及原因,最后一个可用版本会继续运行,直到 Claude Code 下次重新加载插件,例如当您运行 `/reload-plugins` 时。
375 305
376<h2 id="next-steps">306## 后续步骤
377 后续步骤
378</h2>
379 307
380* [测试 mod](/docs/zh-CN/plugins/mods/test):在问题到达会话之前捕获它们308* [测试 mod](/docs/zh-CN/plugins/mods/test):在问题到达会话之前捕获它们
381* [排查插件问题](/docs/zh-CN/plugins/troubleshooting):与安装和加载不特定于 mod 的插件相关的问题309* [排查插件问题](/docs/zh-CN/plugins/troubleshooting):与安装和加载不特定于 mod 的插件相关的问题