Decision Sheet 的用途是把带有建议答案的问题清单转成一个网页,让用户在页面上做批量决策。它适合用户同时要处理多个决策(约 4 个或更多问题,每个问题都有建议答案)的情况,例如分类整理清单、保留或丢弃某项内容等。对于 1 到 3 个快速问题,作者建议仍使用 AskUserQuestion。
主要方式:把问题写入一个 JSON 文件(放在 scratchpad 中),每个问题给出建议,并在 summary 中写简短理由。只有当没有合理默认值时,才不填 suggested,此时页面会把这些问题标记为“needs you”。撰写问题时要面向没有参与对话的读者。
构建页面使用 bun 或 node,无依赖:bun ${CLAUDE_SKILL_DIR}/scripts/build.mjs questions.json,会写出 questions.html。构建过程会检查文件并列出所有问题及其路径,例如 groups[1].questions[3].suggested: "maybe" is not an option ("Keep", "Drop"),修正后需重新运行。它还会对过长的标签发出警告,标签过长在选择器中显示效果差,也应修正。
发布使用 Artifact 工具,icon 设为 "checklist",并附一句话描述。页面已设计好,按构建结果直接发布。如果 Artifact 工具不可用,则把文件路径交给用户在浏览器中打开。发送链接后停止,并告知用户把复制好的回复粘贴到聊天中。随后应用回复,并更新决策记录,例如产生这些问题的报告或计划。
后续修改问题时,编辑 JSON,构建到同一 HTML 路径并再次发布该路径,URL 保持不变。草稿保存在用户浏览器中,以问题 id 为键,因此仍存在的问题的答案会延续到新版本。
撰写问题的要求:用户可能是数小时后在脱离对话的情况下冷启动阅读。任何在对话中临时造出、或只在对话中才成立的术语,都是用户无法回答的问题。因此要用平实词语,说明会发生什么,而不是你给它起的名字,例如“值后面的 ? 会把值变成触发器”优于“值已 armed”。如果必须使用某个术语,就在 context 块中定义一次:整页通用术语放在页面自身的 context,组内通用术语放在该组的 context。summary 是一两句话的理由,始终可见。完整推理、被排除的替代方案、示例和代码放入 details,页面会以“In-depth look”折叠显示。resources 只列你手上已有的内容:读过或改过的文件(路径相对于仓库根)以及被给予或使用过的链接。绝不为了填它去搜索。没有内容时就省略。某个选项的 description 说明选择它意味着什么:会改变什么、代价是什么、排除了什么。
JSON 格式:顶层字段包括 title(必填,页面名称,也是回复的第一个词)、id(可选,命名保存的草稿,默认取 title 的 slug)、intro(可选,显示在问题上方,空行分段)、context(可选,整页依赖的术语与事实,折叠在 intro 下作为“Context”)、resources(可选,整页的文件与链接,折叠为“Related resources”)、options(可选,为未列选项的选择题提供默认选项)、other(可选,false 关闭每个选择题的 Something else 选项,默认开启)、groups(二选一,[{title, description, context, resources, questions}],按显示顺序;组的 context 与 resources 折叠在其标题下)、questions(二选一,扁平列表,question 的 group 字段按首次出现顺序分组)。
问题字段包括:id(必填,字符串或数字,唯一,回复通过它指代问题)、title(必填,用几个词说明决策)、summary(可选,你为何这样建议,一两句话,始终可见,detail 是其旧名)、details(可选,长版本:推理、替代方案、示例,折叠为“In-depth look”)、resources(可选,该问题的文件与链接,折叠为“Related resources”)、type(可选,"choice"(默认)或 "text" 自由回答)、options(choice 必填,至少 2 个,字符串或 {value, label, description})、suggested(可选,choice 为某个选项的 value,text 为预填文本)、placeholder(可选,仅文本题)、other(可选,仅选择题,覆盖顶层 other)。
每个选择题都会有一个最后的 Something else 选项,除非 other 为 false。选择它会使备注成为必填:该行会被标记,且 Copy reply 会拒绝,直到写入备注。不要自己添加同名选项;值 other 是保留的。title、summary、intro、标签和描述接受 code 和 bold。context、details 和 intro 还接受空行分段、- 列表行和 ``` 围栏代码块。其他内容按纯文本显示。
Resources:字符串或对象的列表。以 http:// 或 https:// 开头的字符串是链接;其他字符串是相对于仓库根的文件路径。对象为 {path, label, note} 或 {url, label, note}:label 替换显示的路径或地址,note 用几句话说明该资源为何重要。只列你已有的内容;该技能从不要求你去研究。
Options:label 是选项在选择器中的名称,1 到 4 个词,例如 "Per machine" 或 "Unsigned until 1.0"。解释放在 description。构建会对超过 32 个字符的 label 发出警告。当某题没有任何选项带 description 时,选项以按钮行的形式位于问题旁,标签较长时排成列。当任一选项带 description 时,选项变为标签列表,旁边有一个框。框显示已选选项的 description,并在指针或键盘焦点位于另一选项时预览它。手机上框位于列表下方。description 要写用户做选择所需的事实:该选项做什么、代价是什么、排除了什么。保持 value 在各次重建间稳定:草稿按 value 存储答案。
回复:用户粘贴的内容形如“zsh triage: 2 changed, 1 answered, 2 notes, 31 as suggested, 1 open.”,随后每行以问题 id 开头,例如“- 13 watch, the fswatch folder watcher: Keep (suggested: Drop).”“- 16 The 28 wt.* WezTerm CLI aliases: Keep (suggested: Drop). Note: I still use wt.split”“- 5 EDITOR=nano, VISUAL='zed --wait' where Zed is installed: Keep, as suggested. Note: try micro”“- 20 go-go, the Go project scaffold: Something else (suggested: Drop). Note: keep it, but as a just recipe”“- 36 API keys still in use: "OPENAI_API_KEY, GITHUB_TOKEN".”,末尾可能有“Still open: 34”。标题会被缩短,因此以 id 为准。未列出的问题表示沿用你的建议。Something else 总是附带说明用户想要什么;按备注执行;若不清楚,只就该问题提问。answered 表示原本没有建议的问题现在有了答案。文本答案带引号,换行显示为 /。Still open 列出既无建议也无答案的问题,可保持待定或再次询问。当没有任何改动时,回复只有一行:zsh triage: all 35 as suggested。如果用户勾选“Also list the answers that match my suggestion”,与建议一致的答案也会列出,每条以 as suggested 结尾。