Community编程与开发github.com

引导式演练

通过只读检查引导用户解决复杂技术问题(如配置故障、Git分支混乱、命令失败、工具误解等),解释问题根源,并提供可复制粘贴的分步操作指南。适用于用户要求“不要编辑任何东西”、“只告诉我”等场景。

引导式演练 是什么?

引导式演练(Guided Walkthrough)是一种AI代理技能,专门用于帮助因技术问题而困惑的用户自己解决问题。适用于Claude Code、Cursor、Codex等支持工具调用的AI代理平台。核心原则是“只读不写”:AI代理仅执行不影响系统状态的只读检查(如查看版本、Git状态、配置文件等),绝不进行文件编辑、Git状态修改、安装或服务启停等操作。通过向用户呈现验证过的事实、解释问题真正原因,并提供编号的、可直接粘贴运行的命令步骤来引导用户自主修复。该技能特别适用于用户要求指导而非代办的情况,例如“不要编辑任何东西”、“只告诉我步骤”、“我来做,你看着我”等请求。技能文件详细说明了如何组织回复结构、编写适合用户操作系统和Shell的命令、以及如何清晰解释技术概念,同时纠正用户的误解而不指责。

兼容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/FarsinRex/guided-walkthrough/tree/HEAD/skills/guided-walkthrough

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

引导式演练 是做什么的?

用户希望自己动手修复问题,而你充当向导。通常他们有点迷茫。出了问题,他们尝试了一个基于合理但错误猜测的修复,现在他们不确定实际情况是什么。三件事最有帮助:

  • 对他们所处位置的准确描述
  • 问题发生的真正原因
  • 一组简短、无需费力推导语法的可执行步骤

基本规则

不要改变任何东西。 用户要求自己动手,通常是为了学习,有时是因为他们还不信任自动化更改。请完全尊重这一点:

  • 不要编辑文件
  • 不要执行改变状态的Git命令(commit、restore、checkout、switch、stash、reset、pull、push)
  • 不要安装
  • 不要启动或停止容器或服务
  • 不要写入数据库

当你找到修复方法时,将其放入用户自行运行的步骤中。

先观察,再建议。 只读检查能让建议针对他们的具体机器,而不是泛泛而谈。亲自执行这些检查,而不是要求用户粘贴输出。好的检查包括:

  • 版本和 PATH(node -v、Get-Command npm、where python)
  • git status、git diff、git log、git branch -a -vv、git stash list、git check-ignore -v <path>
  • 读取配置文件、脚本和 README
  • 检查文件夹或文件是否存在
  • docker ps
  • 访问本地健康检查URL

git fetch 也是可以的:它只刷新远程仓库的视图,不改变分支或文件。开始时先用一句话告知用户你只执行只读检查,这样工具调用不会让他们感到不安。

某些检查会创建内容:构建镜像、安装包、运行会写入文件的测试。如果你需要这些中的某一个来确认某个问题,请将其作为用户的一个步骤,并说明成功的结果是什么样子。

说明你无法验证的内容。 有些事情超出了你的能力范围,比如之前终端会话中的错误消息。用“通常”或“可能”给出合理的解释,并用一句话提及其他可能性。

当修复方法取决于目标时,询问目标。 如果他们尝试的操作只对某个你看不到的目标有意义,先给出无论哪种目标都安全的步骤,比如撤销已造成的破坏。然后询问他们想要达到什么目的,而不是猜测。

回复的结构

  1. 他们所处的位置。 以一两个基于已验证事实的句子开头。如果是好消息,先说出来(“你的环境没问题:Node v24 和 npm 11 已安装并位于 PATH 中”)。具体的证据比泛泛的“别担心”更能安抚人心。
  2. 编号步骤,每个步骤以 ## Step N:<步骤目标的通俗描述> 为标题,内容包括:
    • 一行说明为什么这个步骤很重要
    • 适用于他们Shell的命令代码块
    • 之后应该看到的结果,以便他们知道操作成功
    • 任何需要避免的陷阱,直接在此处说明
  3. 按合理顺序排列步骤:
    • 先撤销已造成的破坏
    • 然后解释事情真正的运作方式
    • 然后是他们应该遵循的新流程
    • 最后是可选清理,标记为“(可选)”
  4. 即将出现的陷阱。 如果检查发现某些问题会导致下一个麻烦,将其放在相关的步骤中。例如:新分支需要重置的数据库,或者会触发已损坏路径的脚本。

以最后一步结束。不需要回顾或列出你检查的所有内容。当需要时,一句结束语是有帮助的,例如“如果任何步骤显示了不同的结果,请粘贴到这里。”

编写命令

  • 匹配他们的Shell和操作系统。 在Windows上,VS Code终端通常是PowerShell。使用反斜杠路径和 venv\Scripts\activate。将命令放在单独的行上,而不是用 && 连接,因为Windows PowerShell 5.1不识别它。在macOS和Linux上,针对bash或zsh编写。
  • 在需要指定目录的地方以 cd <绝对路径> 开头。 人们经常在不同文件夹中打开多个终端。
  • 当他们需要同时运行多个终端时(数据库、API、前端),为每个终端使用一个代码块,并用注释标记。
  • 优先使用命令的安全形式,并用几个词说明原因:
    • 使用 git restore <指定的文件> 而不是 git checkout .
    • 使用 git add <指定的文件> 而不是 git add .
    • 在lockfile不应更改时使用 npm ci 而不是 npm install
  • 在步骤内部明确标注破坏性命令(“这会删除数据库卷及其中的所有内容”)。

解释

  • 使用通俗的语言。在术语第一次出现时简要定义它(“追踪分支:你的本地分支会记住它从哪个GitHub分支拉取和推送”)。
  • 通过解释实际发生了什么来纠正误解,而不是告诉他们错了。肯定他们推理中合理的部分(“运行 npm install 是正确的步骤”)。
  • 每次解释保持一两句话。他们来这是为了步骤。

示例(精简版)

示例1:npm install 和 Dockerfile 混淆

用户:“每次我输入 npm run dev 都有错误,然后我运行了 npm install,我以为这会反复在我的电脑上安装 node modules。所以我将 node modules 添加到了 Dockerfile 中以使其可丢弃,但我把它写在了 server/Dockerfile 中,而那里并不需要它们。不要编辑任何东西,只指导我”

执行的只读检查:

  • node -v、npm -v、Get-Command npm
  • Test-Path node_modules\.bin\vite.cmd、node_modules 的大小
  • package.json 中的脚本
  • git status、git check-ignore -v node_modules、git stash list

回复:

我没有更改任何东西。这些是只读检查,下面的步骤由你来执行。

你的环境没问题: Node v24.21.0 和 npm 11.19.0 已安装并位于 PATH 中。项目的 node_modules 文件夹存在(181 MB),并且Git已经忽略它,所以它永远不会被推送。

Step 1:撤销对Docker文件的三个修改

cd C:\Projects\budget-app
git restore server/Dockerfile server/docker-compose.yml server/.dockerignore
git status

你应该看到 nothing to commit, working tree clean。你不需要推送任何东西,因为这些文件将恢复到与GitHub上完全相同的状态。

Step 2:npm install 的实际作用

  • 它只影响当前项目。 包会放在 budget-app\node_modules 中,一个文件夹,不是整个电脑。
  • 为什么你一开始会看到错误: 克隆后,node_modules 还不存在,所以 npm run dev 会失败。它通常会显示 'vite' is not recognized…。运行一次 npm install 可以解决这个问题,这是一个正确的步骤。

Step 3:何时安装,以及使用哪个命令

…仅当 package.json 或 package-lock.json 更改时。使用 npm ci,它不会修改lockfile…

Step 4:你的日常启动(三个终端)

…数据库、API和前端,各自一个代码块…

Step 5(可选):清理旧的stash

…

这个回复之所以有效,是因为:

  • 经过验证的事实放在前面
  • 误解被澄清而不带指责
  • 在引入任何新内容之前先撤销了破坏
  • 每个命令都可以直接粘贴使用,且有预期结果
  • 可选步骤放在最后

示例2:一个突然什么都不知道的RAG聊天机器人

用户:“我的RAG聊天机器人(langchain + chroma)昨天还能用,但今天它对每个问题都回答‘我不知道’。我以为是OpenAI的嵌入向量有问题,所以我把 ingest.py 切换成了一个免费的huggingface模型并再次运行,现在ingest因为维度错误崩溃了。我会自己动手,只告诉我要做什么”

执行的只读检查:

  • git status、git diff ingest.py
  • ingest.py 和 app\chat.py 中的Chroma设置:persist_directory、集合名称、嵌入模型
  • Get-ChildItem -Recurse -Directory -Filter chroma_db,带有每个文件夹的大小和最后写入时间
  • git check-ignore -v chroma_db app\chroma_db

回复:

我没有更改任何东西。这些是只读检查,下面的步骤由你来执行。

你的文档是安全的: C:\Projects\rag-bot\chroma_db 大小为48 MB,最后写入时间是昨天,也就是你首次导入数据的时候。还有一个几乎空的 app\chroma_db,创建于今天上午09:12。这个第二个文件夹就是为什么机器人“什么都不知道”。

Step 1:撤销嵌入模型更改

cd C:\Projects\rag-bot
git restore ingest.py
git status

ingest.py 应该不再被列为已修改。git status 仍会显示 app/chroma_db/ 为未跟踪:留到第5步处理,不要运行 git add .,否则会将其提交。

Step 2:为什么机器人突然什么都不知道

  • ./chroma_db 是相对于你启动Python的文件夹,而不是相对于脚本。 昨天你大概从项目文件夹运行了 python app\chat.py。今天你从 app 文件夹内部启动,所以Chroma没有找到数据库,并悄悄创建了一个空的数据库。检索器返回了空结果,因此模型没有上下文来回答问题。
  • 维度错误是另一个问题,由切换模型引起。 你的集合是用 text-embedding-3-small 构建的,它将每个块转换为1536个数字。all-MiniLM-L6-v2 产生384个数字,Chroma不会在一个集合中混合使用两者。错误信息通常会包含这两个数字,类似于 expecting embedding with dimension of 1536, got 384。怀疑嵌入模型是合理的;它们只是不是原因。

Step 3:从项目文件夹启动机器人

…cd 到项目根目录,激活 .venv,运行 python app\chat.py,答案应该再次引用你的文档。要使其永久生效,在两个文件中基于 Path(__file__) 构建路径…

Step 4(可选):安全地切换到免费模型

…导入到一个新文件夹,比如 chroma_db_minilm,并在 ingest.py 和 chat.py 中使用相同的模型…

Step 5(可选):删除空数据库

…Remove-Item -Recurse app\chroma_db,这只删除今天早上创建的空文件夹…

这个回复之所以有效,是因为:

  • 检查找到了真正的原因,而不是处理症状
  • 原始问题和修复造成的问题被分别处理并解释清楚
  • 用户的直觉得到了肯定,相对路径陷阱得到解释而不是指责
  • 对 git add . 的警告放在了相关的步骤中

相关技能