Skip to content
Go back

Claude Code 的 spawn_task 和 show_widget 是做什么的

Updated:
Edit page
Claude Code 桌面版 · 两个小工具 · 科普

一个把顺路发现的问题记成卡片,另开会话去修;一个把选项画在聊天里,让你直接点。

环境 Claude Code 桌面版 工具 spawn_task 工具 show_widget
简单说 顺路看到的问题,不塞进这次的改动;要你挑的东西,直接摆在聊天里。

spawn_task:Claude 干活时发现一件“该修、但不归这次管”的事,就在界面上放一张小卡片。你点一下,它变成一个新的独立会话去修。当前这一轮照常往下走。

show_widget:Claude 把一张图或一小段可以点的网页,直接画在回答旁边。你在里面点的选择,会像你自己打字一样发回聊天。

1 次点击卡片变成新会话
0 打断当前这一轮继续干
sendPrompt控件把你的选择发回聊天

01先打两个比方

spawn_task贴在工单上的便利贴

修车师傅给你换轮胎,发现刹车片快磨完了。他不顺手去拆刹车——那会把今天的活越搞越大。他在工单上贴一张便利贴:“刹车片该换了,要的话另开一单。”开不开,你说了算。

show_widget摆在你面前的样板

装修师傅不用嘴给你描述三种瓷砖,而是把三块样板直接摆在桌上。你用手一指:“这块。”比来回打字说“第二种偏灰那个”快得多,也不会听岔。

02spawn_task:顺路看到的事,交给你决定

它管的是“范围”。这次的改动只做这次该做的事,其他值得修的事记下来,变成一张卡片。

1
Claude 在做 A,发现了 B
B 是真问题,但跟 A 无关。比如:没人用的死代码、过期的文档、缺的测试、确认过的 TODO、顺路看到的安全问题。
2
调用 spawn_task,写好一张卡片
填标题、一两句说明,以及一份给新会话看的完整任务说明(见下表)。
3
卡片出现在你的界面上,这一轮不停
Claude 接着做 A,不跑题,也不等你。
4
你点一下,B 变成一个新会话
新会话在一个新的 git worktree(同一个仓库的另一份独立工作目录)里开工,跟你现在的改动互不干扰。
5
卡片过时了,就撤回
如果 B 在这次里已经顺手修了,或者有了更好的版本,Claude 用 dismiss_task 把卡片撤掉。你已经点过或关掉的卡片,撤不回来。

一张卡片有四样东西

字段给谁看要求
title你(卡片标题)60 个字符以内,动词开头,比如 “Fix stale README badge”。
tldr你(卡片正文)一两句大白话:为什么现在提、新会话会做什么。不放文件路径。
prompt新会话(你在界面上看不到)必须自己站得住:文件路径、背景全写进去。新会话看不到这次的聊天记录。
cwd系统可选。问题在另一个仓库时,填那个项目的根目录。
示意:一张卡片大概长这样(不是真截图)
+
Fix the 530 error on the custom domain
发这篇博客时发现,自定义域名一直返回 530,而 pages.dev 地址是好的。新会话会去查 Cloudflare 的域名绑定和 DNS。
点一下,另开会话

这个例子是真的:给这个博客发文章时,自定义域名一直打不开,但它跟“发文章”这件事无关。正确的做法就是记一张卡片,而不是在发文章的改动里顺手去改 DNS。

新会话怎么知道自己是谁开出来的

它自己不知道。这层关系由桌面 app 记录:spawn_task 的参数里没有父会话,新会话的聊天记录里也没有。app 把来历写进自己的会话档案。下面是一张真实卡片点开后,新会话档案里的字段:

字段记的是什么
spawnedFrom.sessionId父会话的 ID
spawnedFrom.taskId那张卡片的编号,形如 task_cc891ed4
spawnedFrom.title卡片标题,也就是新会话的名字
worktreePath / branch新建的 worktree 和分支

新会话做完后,app 再按这条记录通知父会话。

为什么这层关系值得记:项目和线程都靠它

Claude Code 里的“项目”,正在从一个文件夹变成一段对话:

阶段“项目”是什么会话之间的关系
1. 文件夹命令行版按启动目录归档会话(~/.claude/projects/)。没有。spawn 出来的会话跑在新 worktree 里,被当成另一个项目。
2. 侧栏分组桌面 app 按 originCwd(最初的仓库)归组。app 记下 spawnedFrom、forkedFromSessionId、parentSessionId。子会话进父会话的分组,做完通知父会话。
3. Projects2026 年 9 月公测。项目是一段由 Claude 当协调人的对话。协调人为每件事开一个 thread 并跟踪它;thread 做完向项目汇报。

有了“谁开了谁”这条线,一个项目里的会话会长成一棵树:

示意:一个项目里的会话关系
▦博客改版项目 · 协调对话
  • 首页重新排版派活进行中
    • 修复自定义域名 530卡片开出✓ 已向上汇报
    • 换一套配色试试从第 12 条消息分叉进行中
  • 给旧文章补封面图派活✓ 已向上汇报
    • 压缩过大的图片卡片等你点开
派活 协调人开的 thread卡片开出 spawnedFrom分叉 forkedFromSessionId

spawn_task 像 thread 的手动版:Claude 提议,你点卡片开工。但这只是类比:thread 默认跑在云端,你在本机自己开的会话加不进项目。

两者靠的是同一条线:谁开了谁。官方文档写明,一个 thread 只属于开它的项目,归档项目时会一起归档。AI 会自己生出新会话,会话就长成一棵树;记住来历,软件才管得住这棵树。

一句话:项目从“一个文件夹”变成“一段对话”,靠的就是 app 记下的“谁开了谁”。

参考:Claude Code 文档:Projects,Projects redesigned: from folder to conversation。

把子会话挪到顶层,变成平级会话

Claude 开出来的会话,一开始总挂在开它的会话下面。Claude 不能一步开出一个平级的会话,但可以分两步做到:

  1. 用 start_session 开一个新会话。这时它是子会话。
  2. 再用 detach_session 把它挪到顶层(侧栏里叫 “Detach to top level”)。挪完它就和原来的会话平级了。
示意:把「修复自定义域名 530」挪到顶层
▦博客改版项目 · 协调对话
  • 首页重新排版派活进行中
    • 换一套配色试试从第 12 条消息分叉进行中
    • 修复自定义域名 530原来在这里
  • 修复自定义域名 530已挪到顶层,做完不再通知原会话
  • 给旧文章补封面图派活✓ 已向上汇报
    • 压缩过大的图片卡片等你点开
虚线框 → 实线框:从原来的位置挪到顶层
挪到顶层以后说明
会变侧栏里它不再缩在原会话下面;归档原会话时,它不会被一起归档;它每轮结束,原会话不再收到通知;这一步撤不回来。
不变它的对话、文件夹、设置都和原来一样。
不能挪你手动 fork 出来的会话;和别的会话共用一个 worktree 的会话。只有 Claude 自己开的会话能挪。

挪到顶层,就是剪断上面那条“谁开了谁”的线。代价是原会话不再自动跟进它,它做没做完要你自己去看。

什么时候不该用

  • 只是觉得“代码有点丑”,说不出具体问题。
  • 一行就能顺手改好的小事——直接改就行。
  • 没把握的猜测。卡片要指向确定的问题。

它和另外两种“分活”有什么不同

谁启动结果回到哪适合
Agent 子代理Claude 自己回到 Claude,这一轮里就用上帮当前任务查资料、并行干活
WorkflowClaude(你同意之后)回到 Claude按脚本编排一大批子代理
spawn_task你点卡片一个新的独立会话跟当前任务无关、但值得修的事

一句话:前两种是“帮我把这件事做完”,spawn_task 是“这件事以后再说,先记下来交给你”。

03show_widget:把要比较的东西直接摆出来

它管的是“看”。有些东西用文字说半天,不如画出来让你看一眼、点一下。

1
先读说明书:read_me
拿到聊天界面的配色变量、字体和布局规则。按要画的东西选模块:diagram、mockup、interactive、data_viz、art、chart、elicitation(让你做选择)。平台选 desktop 或 mobile。这一步你看不到。
2
再画:show_widget
给它三样东西:widget_code(以 <svg 开头就按图画,否则按网页画)、title(下划线命名,也是下载时的文件名)、loading_messages(画出来之前显示的 1–4 句提示)。
3
控件出现在回答旁边
网页里可以有脚本,等代码全部传完才执行。不写 <html>、<body> 这些外壳;背景透明;颜色用 CSS 变量,所以深色、浅色模式都会跟着变。
4
你点,它就收到:sendPrompt(text)
控件里有一个全局函数。调用它,等于你在聊天框里打了这段字并发送。Claude 也能用 read_widget_context 读控件现在的状态。

真实例子:这个博客的图标就是这么选出来的

原来标签页上是 Astro 自带的图标。Claude 把一轮候选画成一个可以点的选择器。第一轮都不满意,于是点了“都不要,再出一轮”,还在输入框里补了一句要求。这两样被 sendPrompt 一起发回聊天,Claude 照着出了第二轮,最后选了 K。

示意:选择器大概长这样
Favicon:选一个?
K · fu 笑脸
都不要,
再出一轮
其他:
自己写要求
点完之后发回聊天的是:Favicon: 都不要,再出一轮 · Favicon (other): include element fu

K 是一个绿色的小写 f,旁边的 u 被画成一张笑脸——“fu”就是 FunFun 的 fu。现在你在浏览器标签上看到的就是它。

它和 Artifact 有什么不同

show_widgetArtifact
在哪聊天里,回答旁边claude.ai 上的一个独立网页,有自己的链接
寿命跟着这段对话一直在,可以更新,可以分享
适合当场看一眼、当场选要留下来、给别人看的成品
怎么回话sendPrompt 直接把选择发回聊天靠评论,或者页面自己声明的能力

一句话:要你当场挑,用 show_widget;要留下来给人看,用 Artifact。

04放在一起看

spawn_task · 往外分
干 A 时看到 B
↓
B 变成一张卡片
↓
你点 → 新会话修 B
A 的改动保持干净
show_widget · 往里收
要你在几样东西里挑
↓
画成能点的控件
↓
你点 → 选择发回聊天
少打字,不会听岔

共同点:两样都不替你做决定。一个把“要不要修”交给你,一个把“选哪个”交给你。Claude 只负责把选择摆清楚。

写于 2026-10-14。依据 Claude Code 桌面版里这两个工具的说明,和一次真实的给博客换图标的过程。两处“示意”是按说明画的样子,不是真截图。

Edit page
Share this post on:

Previous Post
一台 VPS 两天跑掉 500GB:Open WebUI pipelines 被植入 DDoS 僵尸网复盘
Next Post
代码不值钱以后,钱流向了哪里