中文 EN

let-it-go 使用指南

AI-driven development workflow — from PRD to shipped code

github.com/9Ashwin/let-it-go

Usage Guide — 六步闭环研发工作流:规划、设计、拆解、实现、审查、交付。

目录

1. 概述

let-it-go 是一套研发工作流技能集:27 个技能,把「想法 → 交付」拆成标准步骤——需求、设计、拆解、实现、审查、交付——每一步由一个技能负责。

它让 AI Agent 能够像一个有经验的工程师一样——从理解需求、拆解任务、编写代码、审查质量,到最终提交合入——全流程自主完成。你只需描述功能想法,剩下的交给工作流。

入口:不记得该用哪个技能?直接敲 /ask-flow——说清你现在的处境(一个还没成形的想法、一堆进来的 issue、一段调不通的代码、一次漫长的实现),它挑出该走的那一步并直接开始,只有两条路真接近、或下一步越过人的判断边界(开 PR、合入、产品验收)时才停下来问。

/ask-flow

技能路由(入口):路由之后直接开始那一步

  • 在技能图上做路由,然后读该技能的正文并照着做
  • 只有两条路真接近、或下一步越过人的判断边界(开 PR / 合入 / 产品验收)时才停下来问
  • 模型可调用:没有 disable-model-invocation

/prd

需求文档生成

  • 澄清问题 → 结构化 PRD(可验证的验收标准)
  • 审阅确认后保存到 tasks/prd-*.md
  • 交给 /to-issues 拆解为 Issue

/to-issues

把 PRD 拆成垂直切片 Issue(正文即契约)

  • 垂直切片(tracer bullet),非按层拆分
  • 显式依赖边 + 阻塞者优先创建
  • 支持 GitHub / Local,可独立使用

/triage

把外面进来的原始 issue 分流成可执行卡片

  • 复现 / 理解 → 定角色(ready / needs-info / bug-confirmed / duplicate / wontfix)
  • 把 ready 的补成 agent 可执行卡片
  • 只处理外部条目,不 triage /to-issues 的产出

/goal

DSH 的持久目标命令

  • 由人类在命令行输入;模型侧是 create_goal / update_goal
  • 持久目标 + 自动续跑轮次
  • 只在顶层直接的人类回合执行,不是 skill,也不是流水线步骤

/review-it

双轴代码审查收尾

  • Spec 轴:diff 有没有做「要求的事」(缺的 / 多做的 / 做错的)
  • Standards 轴:8 个维度查代码质量
  • 两轴分开报告;按波 / 批调用一次

/ship-it

提交 → PR → 合入 → 关闭

  • PR body 的唯一产出者
  • Squash merge + delete branch
  • 一次写出实现总结评论(设计决策 / 偏离 / 权衡 / 待确认)并关闭卡片

/understand

交互式审阅新生成的(AI)改动

  • 把未提交 / 分支变更扫描成网页
  • 文件树 + 语法高亮 diff + 逐段注释
  • 每段配上对应单位需求与代码解释

/svg-diagram

SVG 制图规范与机械校验(vendor)

  • 布局 / 连接线 / 箭头 / 配色 / CJK 字体栈
  • XML 转义、重叠与裁切等硬约束
  • 自带 tools/svg-lint(12 项检查)

/refactor

专家级代码重构(audit / fix 两种模式)

  • audit 只报不改:列出坏味道与架构问题
  • fix(默认):按 Fowler 目录重构
  • 22 种代码坏味道 + 40+ 种重构手法 + 安全协议

/modern-go

Go 代码现代化改造

  • 35+ 条 gofix 风格转换规则
  • Go 1.0 到 1.27+ 全覆盖
  • 自动检测版本 + 安全保护

/walkthrough

交付前走查(只提供证据)

  • 变更摘要 + 真实验证输出
  • demo 路径的视觉证据
  • 风险点 + 人工验收状态(PR body 与合并清单归 /ship-it)

/loop-it

自动化 Issue 批量实现循环

  • 获取 Issue → 依赖拓扑排序 → 内联实现 → 记 evidence → supervisor 检查 → commit;批末统一评审、走查 + 交付
  • 检查点恢复(.loop-state.json),crash 不丢进度;结构化证据与 follow-up 台账写在同一检查点里
  • 10 类错误分类,结构化恢复策略

/to-design

PRD 转设计文档(Go 提案风格),主线的有条件第 2 步

  • 只在跨两个及以上服务、改数据模型或迁移、涉及两条以上对外契约时写;不命中就跳过
  • 主产物是 Markdown 设计提案
  • HTML 只是可选的呈现层
  • 主动列出被放弃的方案及理由

/graph

任务图并发实现(DAG + 超步)

  • 任务/PRD → DAG → 分层为超步 wave
  • 每波独立节点由子代理并发实现
  • 每节点独立 worktree:内联实现 → commit;波末统一评审、走查 + 交付

/implement

单个单元的内联闭环

  • 内联实现 → 项目门禁自证 → /review-it → /ship-it
  • 不建 worktree、不派子代理、不建波分支
  • 只做一个单元,不扩张范围

/test-first

红 → 绿循环的参考

  • 好测试:通过公开接口验证行为
  • 接缝要预先与用户约定
  • 三个反模式 + 循环规则(红先于绿、一次一片)

/diagnose

难 bug 的排障循环

  • 先拿到一条已经在「这个」bug 上变红的命令
  • 最小化复现 → 3–5 条可证伪假设 → 一次一个变量地埋点
  • 在正确的接缝上补回归测试;不做 review / ship

/conflict

解进行中的 merge / rebase 冲突

  • 查清两边意图 → 逐 hunk 解(能同留就都留)
  • 跑项目门禁,把这次操作做完
  • 永远解,绝不 --abort

/find-skills

发现并安装生态里的技能(vendor)

  • 「有没有能做 X 的技能」时用它
  • 检索 open agent skills 生态
  • 来源:vercel-labs/skills

/frontend-design

前端视觉设计方向(vendor)

  • 新 UI 或改造现有界面时的审美取向
  • 排版与视觉决策
  • 避开模板化的默认样式

/humanizer-zh

中文文本去模板化润色(vendor)

  • 删空话、去重复与模板化表达
  • 保留事实、确定程度与作者声音
  • 只润色文本,不做 AI 检测判定

/pptx

PowerPoint 读写与编辑(vendor)

  • 创建、解析、编辑 .pptx / .potx
  • 模板、版式、演讲者备注与评论
  • 拆分 / 合并幻灯片文件

/skill-creator

创建与改进技能(vendor)

  • 从零写一个新技能,或优化现有技能
  • 跑评测、做方差分析
  • 优化 description 的触发准确率

/ui-ux-pro-max

可检索的 UI/UX 设计知识库(vendor)

  • 风格、产品配色与字体搭配
  • UX 规范、图标、GSAP 预设、图表类型
  • 覆盖 22 种技术栈的实现建议

/web-design-guidelines

按 Web Interface Guidelines 审 UI(vendor)

  • 审 UI 代码的无障碍与交互规范
  • 对照最佳实践做设计审计
  • 来源:vercel-labs/agent-skills

/resume-optimizer

简历审计与优化(vendor)

  • 把职责型表述改写成成果型表述,突出量化结果与业务价值
  • 结合目标岗位 JD 调整关键词、项目重点与职业叙事
  • 产出修改后的简历草稿与行动清单,按需压成一页

/teach

以教学方式讲清一个概念(vendor)

  • 把当前目录当教学工作区,学习状态落成文件
  • 每课一份自包含 HTML,围绕 MISSION.md 里的学习动机
  • 按 learning-records 判断最近发展区,跨会话持续推进
技能分组:27 个技能按「在流程里扮演什么角色」分三个桶——flow(流水线本身,10 个)、bonus(中途因为出事了、要保证质量、或需要一个非代码产物伸手拿的,7 个)、vendor(第三方技能的逐字副本,由 manifest 钉住 commit,10 个)。

2. 安装

两条安装路径,二选一即可。

方式一(推荐):作为 skill 目录安装

# 安装全部 skills 到 ~/.agents/skills
npx skills add 9Ashwin/let-it-go

# 之后按来源更新
npx skills update -g

手动拷贝时要自己完成拍平这一步——不要连桶一起拷:

# 拍平到 ~/.agents/skills/<技能>
cp -R <let-it-go>/skills/flow/graph ~/.agents/skills/graph

方式二(可选):作为 bundle 安装

# 安装到 web profile
dsh plugin --profile web add -w github:9Ashwin/let-it-go

# 生产环境建议锁定到某个 commit
dsh plugin --profile web add -w github:9Ashwin/let-it-go#<sha>

# 验证安装
dsh --profile web --dump-config | grep -A3 let-it-go
两条路怎么选:Web 这类面由 shipped preset 提供技能目录,而 ~/.agents/skills 本来就在它的技能根里,所以「只想要技能」时方式一就够了——两个来源的同名技能按近层优先去重,目录副本会赢过插件包副本,两条都装也不会重复出现,只是在 Web 面上 bundle 赢不了目录。方式二的增量价值是随包携带 preset:一个 preset 可以同时决定这个 agent 挂哪些技能、以及它的子代理带不带技能目录(toolFilter)与 persona,把「这套流程怎么跑」变成部署层的一等配置。反过来,若你用没挂 preset 的面(某些 minimal profile),方式二才是技能可见的来源。

前置要求

工具用途安装
npxnpm package runner(推荐方式)Node.js 自带
ghGitHub CLI (Issue/PR 操作)brew install gh && gh auth login
dshDeepSeek Harness CLI(仅方式二需要)参见 DSH 官方安装说明
Tip:安装后输入 /ask-flow、/prd、/to-design、/to-issues、/implement、/loop-it、/graph、/review-it、/walkthrough、/ship-it(flow 10 个)、/test-first、/triage、/diagnose、/conflict、/refactor、/modern-go、/understand(bonus 7 个)、/svg-diagram、/find-skills、/frontend-design、/humanizer-zh、/pptx、/resume-optimizer、/skill-creator、/teach、/ui-ux-pro-max、/web-design-guidelines(vendor 10 个)即可直接调用对应技能。其中 /goal 是 DSH 的命令(不是 skill):模型侧是 create_goal / update_goal,但只在顶层直接的人类回合执行。
模型目录:27 个技能的目录总量是 6446 字符,模型实际看到 6385 字符。唯一带 disable-model-invocation 的是 vendor 的 /teach(上游的选择,不进模型目录),省下每个会话与每个子代理都要付的那份固定成本;/ask-flow 是模型可调用的。

3. 工作流总览

从需求到交付的闭环工作流:

1 /prd
→
1.5 /to-issues
→
2 /implement
/
2 /loop-it · /graph
→
3 /review-it
→
4 /ship-it
/prd → [跨两个及以上服务 / 改数据模型或迁移 / 两条以上对外契约 → /to-design] → /to-issues ─┬─→ /implement  (单单元:内联实现 → 门禁自证 → /review-it → /ship-it)
                                             ├─→ /loop-it    (串行:一次一个 Issue,带检查点恢复)
                                             └─→ /graph      (并行:按波次 fan-out,每节点独立 git worktree,波次间 fan-in 屏障)
                                                     节点:内联实现 → 门禁自证 → commit;波末:集成 → /review-it → /walkthrough → /ship-it
Step 1: /prd 描述功能想法 澄清问题 生成 PRD Output: PRD 1.5: /to-issues 读取 PRD 拆解 Issue 创建卡片 Output: Issues Step 2 /loop-it · /graph 读取 Issue / DAG 内联实现 运行测试 Output: Code Step 3: /review-it 自动审查 验证发现 迭代修复 Output: ✓ Review Step 4: /ship-it Commit + Push Create PR Merge + Close Output: Shipped
步骤命令输入输出
1. 规划 /prd 功能描述 / 产品想法 PRD 文档(交给 /to-issues 拆解)
1.5 拆解 /to-issues PRD / 需求描述 Issue 卡片
2. 实现 /implement / /loop-it / /graph 一个或多个 Issue 卡片 可运行的代码实现
3. 审查 /review-it 代码变更 (dirty / branch) 通过审查的干净代码
3.5 走查 /walkthrough 已评审的变更 tasks/walkthrough-<feature>.md 走查文档(可选)
4. 交付 /ship-it 已审查的代码 已合入的 PR + 已关闭的 Issue
Tip:这条主线不必按顺序走:一个单元直接 /implement,有 bug / 偶发 flake / 性能回归先 /diagnose,外面进来的原始 issue 先 /triage,正在解 merge / rebase 冲突用 /conflict。选不准就敲 /ask-flow。

4. Step 1: /prd — 需求规划

/prd 将一个模糊的功能想法转化为结构化的产品需求文档(PRD):先把歧义问清楚,再把需求写成可验证的验收条件。它只产出 PRD,不拆 Issue——拆解交给 /to-issues。

触发方式

# 直接输入
/prd 给我们的任务管理系统加一个优先级功能

# 或使用触发词
写PRD:用户注册功能,支持邮箱和手机号
需求分析:为 API 增加限流能力

工作流程

输出示例

# 保存 PRD 后给出的下一步
✅ PRD saved to tasks/prd-priority-system.md

/to-issues    (把 PRD 拆成有阻塞关系的 Issue)
Tip:PRD 里写的是「要什么」,每条需求都要落成可验证的验收条件——这是后面 /review-it 的 Spec 轴能证伪的依据。Issue 粒度由 /to-issues 负责:一个 Issue 应是单个 Agent 在单次会话里能完成的量(通常 1-3 个文件)。

5. Step 1.5: /to-issues — 拆解 Issue 卡片

/to-issues 把 PRD(或任何一段需求描述)拆解为垂直切片的可独立实施 Issue,并创建到你选择的平台。可独立使用,不需要先运行 /prd。

每条 Issue 正文就是契约。目标、非目标、验收条件、必须收集的证据、外部边界、完成定义、未决问题都写在正文里——所以流程里没有「先写一份 SPEC 文档」这一步。一个不共享本次对话上下文的子代理,凭这条正文就能独立开工。
核心原则:垂直切片,而非按层拆分。每个 Issue 是一条贯穿各层(schema + API + UI + 测试)的窄而完整的可演示路径,落地即可单独演示;而不是"后端一张卡、前端一张卡"。检验标准:"完成后我能演示什么?"——答案若是某一层而非一个行为,就要重新切。若整个改动放得下一个上下文窗口,则无需拆 Issue,直接由 agent 内联实现。

触发方式

# 直接输入
/to-issues

# 或使用触发词
创建issue:基于 prd-user-auth.md 创建 Issue
拆解issue:把这段需求拆成可实施的卡片
生成卡片:把 PRD 拆成带阻塞关系的 Issue

输入来源

选项说明
自动检测扫描 tasks/ 目录,列出可用的 PRD
指定 PRD只基于 PRD 的 User Stories 拆解
直接粘贴没有 PRD 时,直接给一段需求描述也能拆

创建平台

平台工具说明
GitHubgh issue create原生依赖边 --blocked-by、子 issue --parent(需 gh v2.94+)
LocalMarkdown 文件一 Issue 一文件、按依赖排序,存于 per-feature 目录

工作流程

可证伪的验收标准:每条验收标准都要能在起始 commit 上为红(fail)。宽范围机械重构(重命名列、改共享类型)走 expand → migrate → contract 序列,作为垂直切片规则的唯一例外。
Note:/to-issues 是从需求到实现的关键桥梁。它可以独立使用——即使你没有用 /prd 生成 PRD,只要有一个需求文档(甚至直接粘贴),就能拆出 Issue。

边界:/triage 只管从外面进来的条目

/to-issues 拆的是你自己的需求,产出已经是 agent-ready 的卡片;从外面进来的 bug 报告、用户反馈、别人提的需求归 /triage——先复现 / 理解,再定角色(ready / needs-info / bug-confirmed / duplicate / wontfix),并把 ready 的补成 agent 可执行的卡片。不要 triage /to-issues 产出的卡片。详见 18. /triage。

6. Step 2: /implement · /loop-it · /graph — 功能实现

实现步骤由正在运行的 agent 内联完成:它读取 Issue 的标题、正文与验收标准(含其中引用的 PRD/SPEC),自己写代码、跑测试与 lint,直到验收条件全部满足。技能提供三条实现路线:只有一个单元时内联走 /implement,串行走 /loop-it,并行走 /graph。

Note:/goal 不再是流水线步骤。在 DSH 中,/goal 是命令而不是 skill——由人类在命令行输入,创建一个带自动续跑轮次的持久目标。这条能力的模型侧是 create_goal / update_goal,但 create_goal 只在顶层直接的人类回合执行:子代理铸造不了长期目标,技能在编排中途也不行。因此「实现 Issue」这一步由 agent 内联完成,而不是调用 /goal。若想要一个自动续跑的长目标,应由人类自己输入 /goal <objective>。

/implement — 单单元内联闭环

一条 issue、一张卡片、spec 里的一项——只有一个单元时走这条路,闭环是:内联实现 → 项目门禁自证 → /review-it → /ship-it。它明确不建 worktree、不派子代理、不建波分支——那些是 /loop-it 与 /graph 的编排,单点上图或开循环只是多付编排成本。

参考:/test-first — 红 → 绿

需要先把行为定下来再写实现时用它:一个测试 → 一段实现 → 再一个测试,一次一个接缝。它同样是 /implement 内部会用到的参考,可以单独调用。

节点作用域:实现 → 自证 → 只 commit

/loop-it — 串行实现

适合节点之间大量共享文件、必须串行保证安全的场景;一次只处理一个 Issue。批末 PR 关闭多个 Issue,需按逐项证据表列出每项的 commit、关闭编号、验收证据与人工验收状态。

/graph — 并行实现

适合 DAG 中存在真正并行度(相互独立的子系统)的场景。单节点波没有可集成的对象,跳过 wave 分支与 merge 仪式,直接对该节点分支 review + ship。详见 13. /loop-it 与 15. /graph。

失败节点:原地重试 → 重跑 → 剔除

Tip:「实现」由 agent 内联完成——单个单元走 /implement(内联实现 → 门禁自证 → /review-it → /ship-it,不建 worktree、不派子代理);/goal 是 DSH 的命令而不是 skill:模型侧是 create_goal / update_goal,但 create_goal 只在顶层直接的人类回合执行——子代理和编排中途都铸造不了长期目标;/review-it、/ship-it 是真实 skill,由编排器在波级各调用一次。子代理要付出父级完整 prompt、工具 schema 与技能目录的固定成本,所以节点止于 commit、琐碎工作内联做;并发上限默认 3–4,波内节点数建议 2–3。

7. Step 3: /review-it — 代码审查

/review-it 是提交前的审查收尾:先跑门禁自证,再评审 diff,发现真实问题并迭代修复,直到没有可操作的发现。在当前契约里它按波 / 批调用一次,审的是集成后的 diff,而不是每个节点各自审自己刚写完的代码。

双轴:Spec 与 Standards,分开报告

每次评审回答两个不同的问题,分成两节报告,绝不合并成一张排序表——一旦合并,「命名与风格」的意见就会把「漏掉一条验收条件」淹没掉:

#维度看什么
1隐藏副作用是否在非显而易见的地方产生级联影响、改了共享状态或外部依赖的行为
2破坏兼容性API 签名、数据结构、配置文件格式、命令行接口是否被改,现有调用方是否受影响
3边界情况null / 空值 / 空集合、极大极小值、并发竞态、异常路径
4性能风险嵌套循环、N+1 查询、大对象分配、阻塞 I/O、锁竞争
5安全风险注入、越权、敏感信息泄露、不安全反序列化、依赖漏洞
6命名误导名字与实际行为不符、名不副实或语义模糊
7测试不足关键路径、边界条件、错误处理是否缺覆盖,现有测试是否真的验证了期望行为
8未来维护成本不必要的抽象、重复代码、隐式耦合、难追踪的控制流
为什么两轴分开:一个改动可以通过全部 8 个标准,却实现了错的东西;合并排序会让风格意见挤掉缺失的需求。先报 Spec 轴,再报 Standards 轴,各自成节。

评审路径

没有外部 review CLI——/review-it 加载后,由正在运行的 agent 亲自按下面的审查原则审当前 diff,不会 shell out 任何 review 命令。

# 未提交变更(默认):直接审工作树,含未跟踪文件
git status --short
git diff
git diff --cached

# 分支 / PR:先生成相对 base 的 diff,再逐段审
# base 取 PR 的 base,否则取仓库默认分支——不写死 main
base=$(gh pr view --json baseRefName --jq .baseRefName 2>/dev/null || git symbolic-ref -q --short refs/remotes/origin/HEAD | sed 's|^origin/||')
diff_file=$(mktemp)  # 固定 /tmp 名可被预创建,别用
git diff "origin/$base"...HEAD > "$diff_file"

diff 较大、或更看重独立性时,可把 diff 文件交给一个全新的子代理审——它看不到本会话的上下文,因此提示词必须自包含。

审查原则

原则说明
Advisory审查结果视为建议,不盲目应用
Verify每个发现都通过读取真实代码路径验证
Reject noise拒绝不切实际的边界情况、投机性风险、过度重构
Iterate修复后重新审查,直到无可操作发现
Minimal优先小修复,不做不必要的大重构

审查模式

工作树状态模式操作
有未提交变更local由当前 agent 直接审查工作树(含未跟踪文件)
已提交未推送branchgit diff origin/main...HEAD + 审这份 diff
已推送 / PRbranch同上,相对的 base 用 PR 的实际 base
干净工作树skip确实没有可审的内容时跳过

波级评审:一次、逐节点分节

8. Step 4: /ship-it — 提交交付

/ship-it 是实现完成后的标准收尾流程:提交代码、创建 PR、合入、关闭 Issue,并一次写出实现总结评论(设计决策 / 偏离 / 权衡 / 待确认)。它是 PR body 的唯一产出者——/walkthrough 只提供证据,由它一次写进 body。在 /graph 一波或 /loop-it 一批的收尾里,它只调用一次:一个分支、一个 PR、一次 CI、一次 merge,关闭该波 / 该批满足的多个 Issue。

触发方式

# 直接调用
/ship-it

# 或使用触发词
提交代码
创建PR并合入

完整流程

# Step 1: 提交代码(关联 Issue)
git add <related files>
git commit -m "Add priority field to database (#42)"

# Step 2: 推送分支
git push -u origin feat/issue-42-priority-field

# Step 3: 创建 PR(body 包含 Closes #42)
gh pr create --title "Add priority field" \
  --body "Closes #42 ..."

# Step 4: 合入
gh pr merge --squash --delete-branch

# Step 5: 关闭 Issue(如未自动关闭)
gh issue close 42 --reason completed

多个 issue 共用一个 PR(波 / 批末模式)

/graph 一波与 /loop-it 一批默认把多个 Issue 收进同一个 PR(squash 后只剩一个 commit)。此时 PR body 必须逐项列出证据,不能只写一行 Closes #1 #2 #3——否则单项特性既没法审计,也没法单独回滚。

项commit关闭的 issue验收证据(测试名 / 命令)人工验收
节点 3abc1234Closes #12TestFooBar尚未人工验收
节点 4def5678Closes #13mise run check + TestBaz尚未人工验收

单项 PR(一个 Issue 一个 PR)不需要这张表,按上面的「完整流程」即可。

错误处理

场景处理方式
CI checks 失败查看失败原因,修复后追加 commit 推送
Merge conflict交给 /conflict 逐 hunk 按意图解,跑通项目门禁再收尾(绝不 --abort),解决后再 force push
Branch protection确认 required reviews 已满足
Issue 未自动关闭确认 PR body 包含 Closes #N,或手动关闭
Note:解进行中的 merge / rebase 用 /conflict——能同时保留两边意图就都保留,真不兼容时选与本次合并目标一致的一边并把权衡写进 commit message,永远解,不 --abort。详见 20. /conflict。
Note:/ship-it 依赖 gh CLI。确保已通过 gh auth login 完成认证。

9. Vendor: /svg-diagram — SVG 制图规范与机械校验

/svg-diagram 是一套手写 SVG 图的「房屋风格」:把技术感的外观与对 CJK 友好的排版固定下来,并用机械检查证明图确实守了规矩。流程图、架构图、时序图这类「画出来给人看」的图都走它。

触发方式

# 直接输入
/svg-diagram

# 或使用触发词
画架构图:为技能加载流程画一张 SVG 架构图
画流程图:把这个模块的调用流程画成 SVG

规范覆盖

方面约束
布局内容居中、左右视觉平衡、同级块间距 ≥25px、标题按内容中心而非 viewBox 中心对齐
连接线线不穿框、文字不压线(与线留 10–20px)、图例放在图体之外
箭头统一 marker 定义,箭头收在框边而不是扎进框内
配色固定调色板,并给出浅色底的回退色
CJK 字体栈字体栈同时覆盖中文与等宽,避免中文回退成衬线或方框
XML 转义& / < / > 按 XML 规则转义

机械校验:tools/svg-lint

技能自带零依赖的 tools/svg-lint,对 SVG 跑 12 项检查:重叠、块间距、框高、连接线几何、箭头 marker、文字溢出、viewBox 裁切、字体栈、调色板一致性、浅底回退、基线偏移、XML 转义。

工作流程

Tip:一次性出图时从子代理里调用它更省上下文——主上下文不必同时背着技能说明和 SVG XML;需要多轮微调时再在主上下文里直接用。

10. Bonus: /refactor — 专家级代码重构

/refactor 基于 Martin Fowler《重构》第 2 版的完整目录,提供专家级代码重构能力。通过识别代码坏味道并应用经过验证的重构手法,在不改变外部行为的前提下改善代码的可维护性、可读性和结构。

两种模式

模式做什么写代码吗
audit(只报不改)检测代码坏味道、架构反模式与复杂度热点,逐条验证后按严重级别排序,产出 tasks/ 下的 Markdown 报告与重构路线图否
fix(默认)针对一个已命名的坏味道,套用 Fowler 目录里最小的那一步重构,每步一个提交、测试保持绿色是

请求里同时含「找问题」和「改掉」时:先 audit,与用户确认发现,再在确认过的清单上切到 fix。

触发方式

# 直接输入
/refactor

# 或使用触发词
重构:重构 UserManager 类,它太大了
code smell:这个函数有 Feature Envy,修复它
extract method:把这个长方法拆分成更小的函数

代码坏味道目录

共识别 22 种代码坏味道,按五大类别组织:

类别坏味道主要重构手法
臃肿类过长方法Extract Method, Replace Temp with Query
过大的类Extract Class, Extract Subclass
基本类型偏执Replace Data Value with Object
过长参数列表Introduce Parameter Object
数据泥团Extract Class
OO 滥用类Switch 语句Replace Conditional with Polymorphism
临时字段Extract Class, Introduce Null Object
被拒绝的遗赠Replace Inheritance with Delegation
异曲同工的类Rename Method, Extract Superclass
变更阻碍类发散式变化Extract Class
霰弹式修改Move Method, Move Field
平行继承体系Move Method, Move Field
冗余类注释(代码自说明)Extract Method, Rename Variable
重复代码Extract Method, Pull Up Method
冗赘类Inline Class, Collapse Hierarchy
纯数据类Move Method, Encapsulate Field
死代码删除(Git 历史有记录)
夸夸其谈未来性Inline Class, Remove Parameter
耦合类依恋情节Move Method
狎昵关系Move Method, Move Field
消息链Hide Delegate
中间人Remove Middle Man
不完美的库类Introduce Foreign Method

重构手法目录

40+ 种重构手法,分 6 大类,每种附带机械步骤和对比示例:

类别手法数代表性手法
组合方法9Extract Method, Inline Method, Extract Variable, Replace Temp with Query, Substitute Algorithm
移动特性7Move Method, Move Field, Extract Class, Inline Class, Hide Delegate
组织数据13Replace Data Value with Object, Encapsulate Field, Replace Type Code with Subclasses, Replace Magic Number
简化条件8Decompose Conditional, Guard Clauses, Replace Conditional with Polymorphism, Introduce Null Object
方法调用13Rename Method, Separate Query from Modifier, Introduce Parameter Object, Replace Error Code with Exception
泛化9Pull Up Method, Push Down Method, Extract Interface, Form Template Method, Replace Inheritance with Delegation

安全协议

语言专属指南

语言核心建议
Javafinal 局部变量、IDE 自动重构、Records、Sealed Classes
TypeScript解构减少参数、const 优先、Union Types 替代类型码、?. 消除 null 检查
PythonType Hints、dataclasses、@property、Context Managers
Go小接口、命名返回值、表格驱动测试、early returns 消除嵌套
RustResult/Option 替代错误码和 null、Pattern Matching、From trait、Derive macros
Tip:每次重构只需告诉 AI "这个类的这个坏味道,请用对应的重构手法修复",AI 会按安全协议逐步执行,每步提交。

11. Bonus: /modern-go — Go 代码现代化改造

/modern-go 自动将 Go 代码升级为现代写法和 API,类似 go fix。扫描 go.mod 检测 Go 版本,对 Go 源文件批量应用版本适配的转换规则,覆盖从 Go 1.0 到 1.27+ 的 35+ 条规则。

触发方式

# 直接输入
/modern-go

# 或使用触发词
modernize:现代化改造这个项目的 Go 代码
升级Go代码:更新到 Go 1.22 的写法
gofix:扫描 pkg/ 目录并应用转换

工作流程

转换规则目录(按 Go 版本)

版本规则示例(Before → After)
1.0+time.Sincetime.Now().Sub(start) → time.Since(start)
1.8+time.Untildeadline.Sub(time.Now()) → time.Until(deadline)
1.10+strings.Builder循环内 s += item → strings.Builder
1.13+errors.Iserr == io.EOF → errors.Is(err, io.EOF)
1.18+any, strings.Cut, bytes.Cutinterface{} → any, Index+切片 → Cut
1.19+fmt.Appendf, 类型安全原子操作append(buf, fmt.Sprintf(...)...) → fmt.Appendf
1.20+strings.Clone, CutPrefix/CutSuffix, errors.Joinstring([]byte(s)) → strings.Clone(s)
1.21+min/max, clear, slices/maps 包手动循环 → slices.Contains, maps.Clone 等
1.22+range over int, cmp.Or, reflect.TypeForfor i:=0;i<n;i++ → for i:=range n
1.23+迭代器 helpers, SplitSeq/FieldsSeqfor _,p:=range strings.Split(s,sep) → SplitSeq
1.24+t.Context(), omitzero, b.Loop()测试中 context.Background() → t.Context()
1.25+wg.Go()wg.Add(1); go func(){defer wg.Done();fn()}() → wg.Go(fn)
1.26+new(expr), errors.AsTypev:=42; &v → new(42)
1.27+内嵌字段字面量(embedlit)、go fix 自动化改造器冗余的内嵌字段字面量 → 提升字段初始化

安全规则

Tip:可以在触发时指定范围,如 /modern-go pkg/ 仅改造 pkg/ 目录,或 /modern-go main.go 仅改造单个文件。

12. Bonus: /walkthrough — 交付前走查

/walkthrough 在实现、验证和 /review-it 都完成之后、/ship-it 之前,产出一份可以直接交给 reviewer 的走查文档:说清改了什么、真的跑过什么、打印了什么,并用视觉证据证明 demo 路径确实走通。它的重点是证据而不是断言——diff 说明代码长什么样,走查说明你实际运行了什么、看到了什么。

触发方式

# 直接输入
/walkthrough

# 或使用触发词
走查:为 user-auth 生成交付前走查
交付前走查:整理这次改动的验证证据

走查文档的四个部分

部分内容要点
1. 变更摘要面向没看过这份改动的人描述 diff3–6 条:做了什么、关键文件与组件、对应哪条需求 / Issue
2. 验证步骤真正跑过的命令与真实输出贴出确切命令和输出(保留 pass 数、截断噪声);UI 场景按「操作 → 观察结果 → 通过/失败」逐条记录
3. 视觉证据demo 路径的截图或短视频2–4 张证明主路径(前 → 操作 → 后),而不是截图堆
4. 风险与人工验收还没被证明的部分diff stat 与文件清单、高风险提示、人工验收状态;PR body 与合并清单归 /ship-it

输出

定位

/walkthrough 只负责证据:命令与真实输出、可视化、风险点、人工验收状态。PR body 与合并清单不在这里产出——那是 /ship-it 的产物,由它写一次即可;走查再写一份就是同一份内容维护两处。它记录门禁输出,但不替代项目自己的门禁;没有验证过的步骤要如实写成未验证或阻塞,绝不写成已通过。

Tip:一行或纯机械的改动不值得走查——没有 demo 路径、也没什么可让人追上的,直接给 diff 就好。走查也应在评审之后再写:给一份马上还要改的代码写走查,等于写完就重写。

13. Bonus: /loop-it — 自动化 Issue 批量实现循环

/loop-it 获取所有打开的 GitHub Issue,解析依赖顺序,一次一个 Issue 内联实现(读需求 → 写代码 → 跑门禁自证 → 记 evidence → supervisor 检查,判据是证据不是 diff 观感),只在该 Issue 自己的分支上 commit(不 push、不开 PR)。批末把各分支汇总成一条批次分支(failed 的分支不并入),只做一次 /review-it、一次 /walkthrough 与一次 /ship-it。进度持久化到 .loop-state.json,崩溃或中断后可从断点恢复。每条验收条件对应的观测以结构化 evidence 写进同一检查点,执行中发现的新任务以 followup 进队列——批次可以在跑的过程中长出新 issue,而不是被冻结在拆解那一刻的清单里。

如何调用

# 直接输入
/loop-it

# 或使用触发短语
批量实现: 实现所有issue
循环实现: 批量实现
恢复循环: resume loop

核心特性

流水线集成

# 从 PRD 到代码交付的完整流水线
/prd → /to-issues → /loop-it
                              │
                              └→ 每个 Issue:内联实现 → 门禁自证 → 记 evidence → supervisor 检查 → commit(× N)
                                 批末 ×1:follow-up 收口 → 汇总批次分支 → /review-it → /walkthrough → /ship-it
提示:将 .loop-state.json 添加到 .gitignore。如果循环崩溃,再次运行 /loop-it 即可检测状态文件并恢复。

14. Bonus: /to-design — PRD 转设计文档

/to-design 把一份 PRD(或一个粗略想法)转化为 设计文档(design doc),文风借鉴 Go 官方提案:朴素的语言、具体的示例,以及最重要的——诚实地交代为什么选这个方案而不是别的。Markdown 提案是主产物;渲染成单文件 HTML 只是可选的呈现层,默认不渲染。

它和 issue 里的契约字段块有什么区别?契约字段块是给工程师照着实现的实现契约(表结构、接口、Schema),由 /to-issues 写进 issue 正文;设计文档是一份决策文档——它论证一个方向、把取舍摆上桌面,让团队在动手写代码前先就同一套事实达成共识。问题是"应该怎么建、为什么"时产出设计文档;问题是"给我精确的实现契约"时走 /to-issues。

如何调用

# 直接输入
/to-design tasks/prd-priority-system.md

# 或使用触发词
生成设计文档:为优先级系统写一份 design doc
prd转设计文档:基于 prd-user-auth.md

什么时候用

设计文档结构(源自 5 篇 Go 官方提案)

章节作用
Abstract / 摘要一段话讲完全文,并埋入最重要的那个承诺(如向后兼容)
Background / 背景用具体例子或真实 bug 代码讲清"痛在哪",量化而非堆形容词
Design / 设计主体。声明 + 示例 + 边界三件套,从简到繁渐进式教学
Rationale / 取舍最关键章节:主动列出被放弃的备选方案及放弃原因
Compatibility / 兼容性凡破坏性变更正面承认,诚实列出代价与渐进迁移路径
Implementation / 实现用数据和工具支撑"可落地",而非空喊"风险可控"
Appendix / 附录(可选)完整 API、端到端示例、FAQ

工作流程

提示:设计文档的价值不取决于方案是否通过,而取决于它是否让讨论建立在同一套事实和取舍之上。即便方案被否决,把"这条路为什么走不通"记录下来本身就是高价值产物。

15. Bonus: /graph — 任务图并发实现

/graph 把一个任务(或 PRD / SPEC / Issue 集合)转化为有向无环图(DAG),按依赖关系分层为若干超步(wave),然后对每一层中相互独立的节点并发实现:每个节点由一个 subagent 在独立的 git worktree 中内联实现并 commit 到自己的分支;层与层之间用栅栏(fan-in barrier)汇聚——泄漏检查、逐节点过 evidence check、只合并 shipped 的节点、在集成后的树上跑门禁,然后评审一次、走查一次、ship 一次,并动态重规划下一层。PR body 与合并清单由 /ship-it 唯一产出,/walkthrough 只提供证据。

它和 /loop-it 有什么区别?/loop-it 是严格串行的——单个 worktree,一次处理一个 Issue;/graph 是它的并行版本——把同一层里所有独立节点一次性 fan-out 出去并发实现。当 DAG 中存在真正的并行度(相互独立的子系统)时用 /graph;当节点大量共享文件或必须串行保证安全时用 /loop-it。

设计思想借鉴了当下热议的 graph engineering、LangGraph 的 StateGraph / Pregel-BSP 超步模型,以及动态工作流(dynamic workflow)的编排理念。

如何调用

# 直接输入
/graph tasks/prd-url-shortener.md

# 或使用触发词
并发实现:把这些 issue 变成任务图并行实现
任务图:build a graph 并发跑

核心概念(借自 LangGraph / graph engineering)

概念含义
节点 Node一个可独立实现的工作单元(一个 issue / 子任务)
边 Edge依赖关系:B 依赖 A → 边 A → B
超步 / 波次 Wave依赖已全部满足的一组节点——并发执行
Fan-out为当前波次的每个节点派发一个 subagent
Fan-in(栅栏)等待本波全部节点完成,再开始下一波
状态通道.graph_state.json——波次之间共享的检查点,可断点恢复
实时看板graph.html——浅色风格仪表盘,每次检查点从 .graph_state.json 重新渲染
动态重规划一波结束后,若冒出新工作/新依赖则修订图

工作流程

核心特性

并发执行图

# 每波:fan-out → fan-in 栅栏
Wave 0 (并发×3):  #1 建表   #2 缓存层   #3 日志工具
Wave 1 (并发×2):  #4 API (依赖 #1)   #5 CLI (依赖 #2)
Wave 2 (并发×1):  #6 集成 (依赖 #4,#5)

# 每个节点在自己的 worktree 内:
内联实现 → 门禁自证 → commit 到自己的分支

# 每波末(只做一次):
泄漏检查 → 逐节点 evidence check → 只合并 shipped 节点 → 集成后跑门禁 → /review-it → /walkthrough → /ship-it

流水线集成

/prd → /to-issues ┬→ /loop-it  # 串行:一次一个节点
                                        └→ /graph    # 并行:整波一起跑
提示:把 nodes.json、.graph_state* 和 graph.html 加入 .gitignore(检查点用通配而不是列名字:默认名、改名前的 .graph_state、按次起的 --state .graph_state-prd015、以及写盘时的瞬时 .tmp 全都覆盖;nodes/graph 若用了非默认名,照原样补上),并在第一波之前提交这条忽略规则——/graph 的泄漏检查要求共享检出干净,未提交的 .gitignore 改动会让编排器把自己当成泄漏。派发 subagent 必须在同一个响应内发出多个调用才是并发——分成多个响应会退化为串行。

16. Bonus: /understand — 交互式变更审阅

/understand 把你刚生成的改动(通常是 AI 写的)变成一个单文件、可交互的审阅网页,帮你在审查或交付前真正吃透这次改了什么。它扫描仓库里未提交 / 分支变更,生成一个浅色主题的两栏页面:左侧是按真实项目布局排列的变更文件树,右侧是所选文件的语法高亮 diff,并在右侧边栏逐段给出相关单位需求与代码解释。

如何调用

# 直接输入
/understand

# 或使用触发短语
review 这次改动:解释一下这批新生成的代码
解释代码:带我过一遍刚生成的变更

页面构成

区域内容
左侧文件树按真实项目结构列出变更文件,含每文件 +/− 行数与 A/M/D/R 状态。该栏宽度可拖动调整(双击分隔条恢复默认)。
右侧 diff语法高亮 diff,增删与未变更代码明显区分,行号为文件真实行号。
右侧边栏逐段卡片:对应单位需求(推测时标灰色「推测意图」)+ 大白话代码解释;点击可定位并高亮闪动对应代码行。

工作流程

定位

/understand 是 /review-it 的理解型搭档:/review-it 负责发现并修复问题,/understand 则帮你在决定采纳前,看清新生成代码背后的意图与理由。

Tip:.understand/ 是产物目录,建议加入 .gitignore 以免误提交。解释与需求始终以中文产出。

17. Bonus: /ask-flow — 不知道该用哪个技能

/ask-flow 是整套技能集的入口:你想不起来这么多技能各自管什么,所以问。说清你现在的处境(一个还没成形的想法、一堆进来的 issue、一段调不通的代码、一次漫长的实现),它挑出该走的那一步,然后直接开始——读那个技能的正文并按它做,而不是只报一个名字让你再敲一遍。

触发方式

# 直接调用
/ask-flow

# 或直接问
该用哪个技能
这套流程怎么走

路由覆盖

Tip:/ask-flow 是模型可调用的——它没有 disable-model-invocation,模型可以主动挑它。27 个技能的目录总量是 6446 字符,其中模型实际看到的是 6385 字符;唯一不进模型目录的是 vendor 的 /teach(上游的选择)。

18. Bonus: /triage — 外部 issue 分诊

/triage 处理从外面进来的原始条目:bug 报告、用户反馈、别人提的需求。它先复现 / 理解,再给每条定一个角色,并把 ready 的补成 agent 可执行的卡片。/to-issues 产出的卡片不要 triage——那些已经 agent-ready。

角色(每条最后必须落到一个)

角色含义动作
ready复现 / 需求清楚,验收条件写得出来补全正文(复现步骤、期望、验收条件、影响面),交给主线
needs-info缺关键信息,现在无法判断按模板发一条评论要信息
bug-confirmed确实是 bug,但根因未定记下症状与最小复现,转 /diagnose
duplicate已有同一条评论指路 → 关闭
wontfix明确不做评论写清理由(对应哪条产品边界)→ 关闭

处理一条

Note:ready 的条目交回主线——一串有依赖关系的用 /loop-it,互不共享文件的用 /graph,只有一个单元就用 /implement。

19. Bonus: /diagnose — 排障循环

难 bug、偶发 flake 与性能回归的纪律:在有一条已经在「这个」bug 上变红的命令之前,不许开始推理——直接跳到「我觉得是这里」正是这个技能要防的失败。它不做 /review-it / /ship-it,定位清楚后按单点改动回主线。

触发方式

# 直接调用
/diagnose

# 或直接说
排查一下这个偶发失败
这个性能回归怎么回事

循环

Note:排查通常是一个内联单元,不要为它开 /graph。定位清楚之后按单点改动回主线:/implement → 项目门禁 → /review-it → /ship-it。

20. Bonus: /conflict — 解 merge / rebase 冲突

/conflict 解进行中的 git merge / rebase 冲突:先查清两边意图,再逐 hunk 解,跑项目门禁,把这次操作做完。永远解,不 --abort。

步骤

Note:在 /graph 的节点里解冲突时,冲突在该节点的 worktree 内,用绝对路径与 workdir=;在共享检出上解冲突时,解完确认 git status 除了这次合并没有别的脏东西——共享检出的干净是编排器做泄漏检查的依据。

21. Vendor 技能与一键同步

skills/vendor/ 放的是第三方技能的逐字副本:它们不是这套技能集写的,只是被收进来一起安装。谁、从哪个 commit 收的,由 skills/vendor/vendor.json 这份 manifest 记录,每个技能目录里还有一份 NOTICE.md(来源 / commit / 许可 / 同步日期)。

技能来源钉住的 commit许可
/svg-diagrambybit-exchange/svg-diagramc30c9e3MIT
/skill-creatoranthropics/skills3337550MIT
/frontend-designanthropics/skills3337550未声明
/pptxanthropics/skills3337550未声明
/find-skillsvercel-labs/skills7407f38MIT
/ui-ux-pro-maxnextlevelbuilder/ui-ux-pro-max-skill823b0a1未声明
/web-design-guidelinesvercel-labs/agent-skills063bee9未声明
/humanizer-zhop7418/humanizer-zhf4518a8未声明
/resume-optimizerwyh0626/resume-optimizerfb16670未声明
/teachmattpocock/skillsc55ee46未声明
不要就地编辑。这些目录是逐字副本,就地改会在下次同步时被覆盖。要改就改 manifest,再重新同步;属于这套技能集自己的改动,应该写成一个 flow / bonus 技能。

维护命令

make vendor        # 按 vendor.json 里钉住的 commit 同步
make vendor-check  # 报告上游是否已前进
make vendor-update # 重新钉到上游默认分支 HEAD、同步、再校验
make vendor-list   # 列出已 vendor 的技能与 commit
make vendor-add URL=<git url> SKILL="名字 [名字...]"
make check          # 布局、frontmatter、交叉引用、bundle patch
make test           # 先 check,再跑各脚本自测
Note:vendor 和前两个桶一样,由 cordis.patch.yml 单独列为一个技能根,所以它里面的技能会随 bundle 一起装进 DSH;npx skills add 递归扫描时也会带上它们。

22. FAQ

Q: 必须按顺序使用所有步骤吗?

不必。每个 Skill 都是独立的,可以单独使用。比如你已经有 Issue 了,可以直接从实现开始——单个单元走 /implement,串行走 /loop-it,并行走 /graph;代码已经写好,可以直接用 /review-it 审查。但完整走一遍流程能获得最好的效果。

Q: /goal 是什么?为什么不在 skills 目录中?

在 DSH 中,/goal 是命令而不是 skill,因此不在 ~/.agents/skills 中。它由人类在命令行输入,创建一个带自动续跑轮次的持久目标;这条能力的模型侧是 create_goal / update_goal,但 create_goal 只在顶层直接的人类回合执行——子代理、或正在编排的技能,都无法给自己铸造一个长期目标。而「实现 Issue」这一动作与它无关,由 agent 内联完成(见 Step 2: /implement · /loop-it · /graph)。

Q: 可以在非 GitHub 项目中使用吗?

可以。/to-issues 支持把 Issue 保存为本地 Markdown 文件。/review-it 只需要本地 git 仓库。/ship-it 目前依赖 GitHub(gh CLI)。

Q: /review-it 和手动 code review 的区别?

/review-it 是自动化的自查(self-review),在提交前发现明显问题。它分两轴报告:Spec 轴查这份 diff 有没有做「要求的事」(缺的 / 多做的 / 做错的,每条引用对应的验收条件),Standards 轴按 8 个维度查代码质量。两轴分开报告、不合并排序。它不替代团队 code review,而是在 PR 创建前提升代码质量,减少 reviewer 需要指出的低级问题。

Q: Issue 粒度应该多大?

每个 Issue 应该是一个 Agent 在单次会话中可以完成的工作量——通常是 1-3 个文件的变更,有明确的验收标准。这个粒度由 /to-issues 把关,拆完你可以调整。

Q: skills/vendor/ 里的技能可以直接改吗?

不要。skills/vendor/ 下都是上游技能的逐字副本,就地编辑会在下次 make vendor 时被覆盖。要改就先改 skills/vendor/vendor.json 里的 manifest,再重新同步;如果你要做的是这套技能集自己的改动,那就写成一个 flow / bonus 技能。详见 21. Vendor 技能与一键同步。

Q: /svg-diagram 的机械校验包含哪些检查?

它自带零依赖的 tools/svg-lint,共 12 项检查:重叠、块间距、框高、连接线几何、箭头 marker、文字溢出、viewBox 裁切、字体栈、调色板一致性、浅底回退、基线偏移、XML 转义。规范本身还覆盖布局、连接线与箭头的画法,以及 CJK 字体栈。