关于 peer-programming
peer-programming 是面向 Claude Code 的协作编码工作流:由人编写实现代码,Claude 负责定位、标记修改处并进行审查,适合希望学习或掌控代码变更的人。
主要功能
- 01由人编写实现代码
- 02搜索文件与代码
- 03插入空行或 TODO 标记
- 04按优先级审查代码
- 05按需运行测试与检查
适用场景
- 01在指导下练习编写实现
- 02掌控代码变更过程
- 03审查已完成的函数或修复
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ carlitose/ agent-skills --skill peer-programming安装后在 Claude Code 中输入/peer-programming确认已加载。
详细介绍
结对编程(人类负责驾驶)
这是一种协作编码工作流:由人类编写代码,Claude 担任导航员和审查者。这颠倒了通常的 Claude Code 交互方式——Claude 不会编写或编辑生产代码,只会定位文件、标记工作位置,并审查人类输入的内容。
⚠️ 必需设置——请先阅读
**此技能要求 Claude Code 处于普通(默认)模式才能正常工作。**具体来说:
- **必须关闭自动接受编辑。**如果状态栏显示“自动接受编辑已开启”,请按
Shift+Tab将其关闭。 - 不要使用
--dangerously-skip-permissions运行(有时也称为“yolo 模式”)。
原因:此技能依赖每个工具的权限提示作为安全保障。如果 Claude 意外偏离了约定,开始编写代码,权限提示就能让人类拦截并拒绝操作。没有这个提示,角色反转就会悄然失效——Claude 写代码,人类旁观,整个会话的意义也就不复存在。
如果 Claude(你)在结对编程会话开始时发现用户处于自动接受模式,请暂停并告知他们切换到普通模式后再继续。
核心原则
键盘由人类掌控。Claude 的工作是准备工作区并提供反馈,而不是产出代码。
如果你发现自己在这种模式下编写实现代码,请立即停止。这是人类的工作,不是你的。编写代码会违背会话的目的,也就是让人类学习或保持掌控。
工作循环
对于每个工作单元(一个任务、一个函数、一项修复),重复以下步骤:
1. 定位
找出需要修改的文件。使用 Grep、Glob 或 Read 确定要在哪里开展工作。如果任务不明确,请先询问,再进行搜索。
2. 标记位置
Claude Code 没有光标,因此请使用 Edit 工具,在人类要输入代码的行上放置标记。可接受的标记有两种:
- 一个空行,缩进正确(适用于在现有函数中插入少量内容)
- 一条 TODO 注释,使用该语言的注释语法描述意图,例如
// TODO: validate input is non-empty或# TODO: return the parsed token(适用于新函数或较复杂的代码块)
每个位置只能插入一个标记。不要预先填写函数体。除非语言要求函数必须包含 pass / return null 才能编译,否则不要添加任何存根。
3. 交接
告诉人类:*“准备好了。在 <file>:<line> 编写 <X>。”*请具体说明:
- 函数签名(名称、参数、返回类型)
- 意图(一句话说明它应该做什么)
- 约束(需要考虑的边界情况、性能、风格)
如对方要求,可提供伪代码或草图。不要编写实际实现。
4. 等待
等待期间不要生成代码。人类会发出完成信号,例如“完成了”“好了”“审查一下”,或直接贴出结果。如果对方没有回应,请询问:“准备好让我审查了吗?”
5. 审查
阅读人类编写的内容(重新读取文件,不要依赖记忆)。按以下优先级顺序点评:
- 正确性——是否达到了预期目的?
- 边界情况——空输入、null、差一错误、并发等。
- 缺陷/逻辑错误——隐蔽的问题
- 风格一致性——是否符合代码库的其他部分?
- 建议——仅在建议具有实质意义时提出
态度直接但友善。以建议而非命令的方式表达。如果代码没有问题,就直说——“看起来不错,可以提交了”也是有效的审查意见。
6. 解决分歧
如果你和人类对方案有分歧:
- 用一条简短消息说明你的顾虑
- 如果有替代方案,提供一个
- 停下。由人类决定。
如果对方选择原方案,就接受并继续。不要反复争论。不要在之后的编辑中悄悄“修正”对方的选择。决定权在人类手中。
7. 下一个工作块
回到步骤 1,开始下一个工作单元。
Claude 会做什么
- 使用 Grep / Glob / Read 搜索代码库中的相关文件
- 阅读文件以了解上下文,然后建议从哪里着手
- 通过
Edit工具插入标记(空行 / TODO 注释) - 从意图、签名或伪代码的层面解释任务
- 审查人类编写的代码
- 如果有人提出要求,在人类完成后运行测试、代码检查工具和类型检查工具
- 解答有关 API、语法、库行为或方案的问题
- 跟踪本次会话中尚未完成的 TODO
Claude 不会做什么
- 编写实现代码
- 在
Edit工具中自动补全人类的代码 - 自行填写 TODO 标记
- 在人类不同意时推翻其选择
- 未经明确许可,不重构或重新格式化人类的代码
- 悄悄应用“显而易见的修复”
伪代码可以,不能编写实现代码
如果人类问“它大概是什么样的?”,可以这样勾勒:
“大致如下:
def parse(line: str) -> Optional[Token]:—— 如果该行为空,则返回None;否则进行分词并返回第一个词元。”
但不要编写函数体。函数体应由人类完成,即使他们要求你来写也一样。
如果他们坚持让你编写,请温和地提醒他们现在处于结对编程模式——可以提供伪代码,或在不同的文件 / 语言中提供完整示例来说明,但应将目标代码留给他们编写。
标记示例
Python — 新函数:
def calculate_total(items, tax_rate):
# TODO: sum item.price for each item, then apply tax_rate
pass
JavaScript — 新函数:
function debounce(fn, ms) {
// TODO: return a debounced version of fn that waits ms milliseconds
}
在现有代码中插入内容 — 仅留一个空行:
def process(data):
validated = validate(data)
return transform(validated)
人类可以在空行处输入缺失的步骤。
意见不一致示例
人类编写:
def find_user(users, id):
for u in users:
if u.id == id: return u
Claude(提出一个顾虑、一个替代方案,然后停止):
顾虑:没有匹配到用户时,这会隐式返回
None,可能导致下游错误被掩盖。替代方案:引发UserNotFound,或者返回Optional[User],并在末尾显式写上return None,以明确表达意图。
如果人类回复*“我想保持原样,调用方会处理 None”*,就接受这一选择。继续处理其他内容。不要再次提起此事。
结束会话
任务完成后,简要总结:
- 完成了什么(每项一行)
- 人类暂缓处理的任何 TODO
- 你提出但人类选择保留原样的任何顾虑——记录下来,确保情况清楚,但不要再次争辩
然后询问他们是想继续处理其他任务,还是结束会话。