一个把顺路发现的问题记成卡片,另开会话去修;一个把选项画在聊天里,让你直接点。
spawn_task:Claude 干活时发现一件“该修、但不归这次管”的事,就在界面上放一张小卡片。你点一下,它变成一个新的独立会话去修。当前这一轮照常往下走。
show_widget:Claude 把一张图或一小段可以点的网页,直接画在回答旁边。你在里面点的选择,会像你自己打字一样发回聊天。
01先打两个比方
spawn_task贴在工单上的便利贴
修车师傅给你换轮胎,发现刹车片快磨完了。他不顺手去拆刹车——那会把今天的活越搞越大。他在工单上贴一张便利贴:“刹车片该换了,要的话另开一单。”开不开,你说了算。
show_widget摆在你面前的样板
装修师傅不用嘴给你描述三种瓷砖,而是把三块样板直接摆在桌上。你用手一指:“这块。”比来回打字说“第二种偏灰那个”快得多,也不会听岔。
02spawn_task:顺路看到的事,交给你决定
它管的是“范围”。这次的改动只做这次该做的事,其他值得修的事记下来,变成一张卡片。
spawn_task,写好一张卡片dismiss_task 把卡片撤掉。你已经点过或关掉的卡片,撤不回来。一张卡片有四样东西
| 字段 | 给谁看 | 要求 |
|---|---|---|
title | 你(卡片标题) | 60 个字符以内,动词开头,比如 “Fix stale README badge”。 |
tldr | 你(卡片正文) | 一两句大白话:为什么现在提、新会话会做什么。不放文件路径。 |
prompt | 新会话(你在界面上看不到) | 必须自己站得住:文件路径、背景全写进去。新会话看不到这次的聊天记录。 |
cwd | 系统 | 可选。问题在另一个仓库时,填那个项目的根目录。 |
这个例子是真的:给这个博客发文章时,自定义域名一直打不开,但它跟“发文章”这件事无关。正确的做法就是记一张卡片,而不是在发文章的改动里顺手去改 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. Projects | 2026 年 9 月公测。项目是一段由 Claude 当协调人的对话。 | 协调人为每件事开一个 thread 并跟踪它;thread 做完向项目汇报。 |
有了“谁开了谁”这条线,一个项目里的会话会长成一棵树:
- 首页重新排版派活进行中
- 修复自定义域名 530卡片开出✓ 已向上汇报
- 换一套配色试试从第 12 条消息分叉进行中
- 给旧文章补封面图派活✓ 已向上汇报
- 压缩过大的图片卡片等你点开
spawnedFrom分叉 forkedFromSessionIdspawn_task 像 thread 的手动版:Claude 提议,你点卡片开工。但这只是类比:thread 默认跑在云端,你在本机自己开的会话加不进项目。
两者靠的是同一条线:谁开了谁。官方文档写明,一个 thread 只属于开它的项目,归档项目时会一起归档。AI 会自己生出新会话,会话就长成一棵树;记住来历,软件才管得住这棵树。
一句话:项目从“一个文件夹”变成“一段对话”,靠的就是 app 记下的“谁开了谁”。
参考:Claude Code 文档:Projects,Projects redesigned: from folder to conversation。
把子会话挪到顶层,变成平级会话
Claude 开出来的会话,一开始总挂在开它的会话下面。Claude 不能一步开出一个平级的会话,但可以分两步做到:
- 用
start_session开一个新会话。这时它是子会话。 - 再用
detach_session把它挪到顶层(侧栏里叫 “Detach to top level”)。挪完它就和原来的会话平级了。
- 首页重新排版派活进行中
- 换一套配色试试从第 12 条消息分叉进行中
- 修复自定义域名 530原来在这里
- 修复自定义域名 530已挪到顶层,做完不再通知原会话
- 给旧文章补封面图派活✓ 已向上汇报
- 压缩过大的图片卡片等你点开
| 挪到顶层以后 | 说明 |
|---|---|
| 会变 | 侧栏里它不再缩在原会话下面;归档原会话时,它不会被一起归档;它每轮结束,原会话不再收到通知;这一步撤不回来。 |
| 不变 | 它的对话、文件夹、设置都和原来一样。 |
| 不能挪 | 你手动 fork 出来的会话;和别的会话共用一个 worktree 的会话。只有 Claude 自己开的会话能挪。 |
挪到顶层,就是剪断上面那条“谁开了谁”的线。代价是原会话不再自动跟进它,它做没做完要你自己去看。
什么时候不该用
- 只是觉得“代码有点丑”,说不出具体问题。
- 一行就能顺手改好的小事——直接改就行。
- 没把握的猜测。卡片要指向确定的问题。
它和另外两种“分活”有什么不同
| 谁启动 | 结果回到哪 | 适合 | |
|---|---|---|---|
| Agent 子代理 | Claude 自己 | 回到 Claude,这一轮里就用上 | 帮当前任务查资料、并行干活 |
| Workflow | Claude(你同意之后) | 回到 Claude | 按脚本编排一大批子代理 |
| spawn_task | 你点卡片 | 一个新的独立会话 | 跟当前任务无关、但值得修的事 |
一句话:前两种是“帮我把这件事做完”,spawn_task 是“这件事以后再说,先记下来交给你”。
03show_widget:把要比较的东西直接摆出来
它管的是“看”。有些东西用文字说半天,不如画出来让你看一眼、点一下。
read_meshow_widgetwidget_code(以 <svg 开头就按图画,否则按网页画)、title(下划线命名,也是下载时的文件名)、loading_messages(画出来之前显示的 1–4 句提示)。<html>、<body> 这些外壳;背景透明;颜色用 CSS 变量,所以深色、浅色模式都会跟着变。sendPrompt(text)read_widget_context 读控件现在的状态。真实例子:这个博客的图标就是这么选出来的
原来标签页上是 Astro 自带的图标。Claude 把一轮候选画成一个可以点的选择器。第一轮都不满意,于是点了“都不要,再出一轮”,还在输入框里补了一句要求。这两样被 sendPrompt 一起发回聊天,Claude 照着出了第二轮,最后选了 K。
再出一轮
自己写要求
K 是一个绿色的小写 f,旁边的 u 被画成一张笑脸——“fu”就是 FunFun 的 fu。现在你在浏览器标签上看到的就是它。
它和 Artifact 有什么不同
| show_widget | Artifact | |
|---|---|---|
| 在哪 | 聊天里,回答旁边 | claude.ai 上的一个独立网页,有自己的链接 |
| 寿命 | 跟着这段对话 | 一直在,可以更新,可以分享 |
| 适合 | 当场看一眼、当场选 | 要留下来、给别人看的成品 |
| 怎么回话 | sendPrompt 直接把选择发回聊天 | 靠评论,或者页面自己声明的能力 |
一句话:要你当场挑,用 show_widget;要留下来给人看,用 Artifact。
04放在一起看
共同点:两样都不替你做决定。一个把“要不要修”交给你,一个把“选哪个”交给你。Claude 只负责把选择摆清楚。