🐳 第四章 从Skill、Tool到Hook
📄 一句话概括

实测:用 --patch 停掉 Skill 那 4 件,整棵配置树只多 1 行,而界面面板(ui-skill)还挂着——删掉能力,删不掉按钮。

📝 本节和前面几节的关系

4.1.1 讲了 Skill 长什么样,这一节动手把它关掉——这是全书第一个真正的动手实验。

一、实验怎么做

用 --patch 传一份只有 4 行的覆盖文件,把 Skill 那几件全部 disabled: true;然后加 --dump-config 把配置树打出来,和基线做 diff。

为什么不真去删文件?因为要验证的是【能力从哪来】,不是【文件删了会不会报错】——补丁是可逆的,也不会污染安装目录。

这也是全课推荐的实验方式:用补丁做加减法,不动本体。

二、实测结果:只多 1 行

1260 行的配置树,diff 只有一处:- id: skill 下面多了一行 disabled: true。

为什么只多 1 行?因为另外 3 件(filesystem/badge/tool-skill)在 web profile 里本来就是停用的。

这说明一件事:你看到的【默认状态】已经是别人挑过一轮的结果——web 这个产品形态只留了技能的本体。

三、能力没了,按钮还在

同一份配置里,ui-skill 依然挂着、没有被停用。

所以问题的答案是:面板还在,能力没了。界面上的技能入口照旧显示,但它背后那套能力已经不在会话里了。

这正是 4.1.1 那句【面板归面板,能力归能力】的实测版:客户端渲染件和提供能力的插件,是两组完全独立的包。

四、这个实验证明了什么

三件事:

最后一条对日常排查特别有用:遇到【怎么没反应】,先 dump 配置树看那一件在不在。

五、动手 Demo:动手实验——把 Skill 关掉,能力还在吗

下面是真跑的原文(命令 + diff 结果):

# 1) 写一份只有 4 行的补丁
cat > exp_skill_off.yml <<'EOF'
- id: skill
  disabled: true
- id: skill-filesystem
  disabled: true
- id: skill-badge
  disabled: true
- id: tool-skill
  disabled: true
EOF

# 2) 带着补丁 dump 配置树,和基线对比
dsh --profile web --patch ./exp_skill_off.yml --dump-config > patched.txt
diff baseline.txt patched.txt

# 3) 看界面那一侧还在不在
grep -A1 "ui-skill" patched.txt

实跑输出:

--------------------------------------------------------------------
动手实验——把 Skill 关掉,能力还在吗
--------------------------------------------------------------------
  第一步,写一份只有 4 行的补丁:

        - id: skill
          disabled: true
        - id: skill-filesystem
          disabled: true
        (skill-badge、tool-skill 同理)

  然后是启动时挂上这个补丁、把配置树打出来做对比。整棵 1260 行的树,
  只多出这样一处差异:

  ------------------------------------------------------------------
        190a191
        >   disabled: true
  ------------------------------------------------------------------

  就 1 行。为什么只有 1 行?因为另外 3 件(filesystem/badge/tool-skill)
  在 web profile 里本来就已经是停用状态了——
  也就是说,web 这个产品形态只留了技能的本体在跑。

  再看界面那一侧,同一份配置里:

        - id: ui-skill
          name: '@deepseek-ai/dsh-client-ui-skill'    <- 没有 disabled

  结论:面板还挂在界面上,能力已经不在了。
  【删掉 Skill】删掉的是能力,不是那个按钮。

diff 里唯一的变化就是那行 disabled: true,再加一行标出【这个补丁来自哪个文件】的出处注释。 改的是能力,不是按钮——ui-skill 依然没有 disabled。 记住这个实验方法:补丁做加减法、dump 做对比——后面 4.7 还要用一次。

30 秒实验

  1. 在自己机器上跑一遍这个实验,把 diff 的完整输出存下来。
  2. 换个对象再试一次:把 tool-web 停掉,看配置树里少了什么。
  3. 不看界面,只靠配置树回答:当前这个 profile 里,技能能力到底开着没有?

常见误区

  1. 错误:要验证能力有没有,删掉插件文件最直接。——纠正:用补丁停用更干净——可逆、不污染安装目录、还能看见出处。
  2. 错误:配置树diff 只多 1 行,说明这次改动没用。——纠正:另外 3 件早就被停用了,本体这一下才是真正关掉整条链的那一刀。
  3. 错误:界面上技能入口还在,说明能力还在。——纠正:ui-skill 是渲染件;能力在不在,只看配置树。
自测三问(点开对答案) 1. 为什么用补丁而不是删文件做这个实验? —— **补丁可逆、不污染安装目录**;要验证的是能力从哪来,不是文件删了会不会报错。 2. 为什么 diff 只有 1 行? —— 因为 web profile 里另外 3 件本来就是停用的——**默认状态已经是别人挑过一轮的结果**。 3. 实验得出的三件事是什么? —— 能力可撤销、停用分层、**界面会骗人**(判断能力看配置树)。

相关笔记