My-Skills-team

我为什么做了一个四角色 AI 编程团队

现在openspec应用的很广泛,但是我觉得他比较“重”,我每次只想改一小点东西的时候,他老是写很多文档,比较慢(并不是说不好,这当然有利于项目的长期维护),但是有时候追求速度的时候,总是感觉心里比较“急”,于是,最近整理了一个小仓库:[ttt-aiteam](田广伟/TTT-aiteam),用来做一些小需求,去解决前面的问题,也算是自己aicoding的一些心得

它没有网页界面,也没有自己训练模型,核心文件基本都是 Markdown、YAML 和两个 Shell 脚本。说得直白一点,它不是一个新的 AI 编程工具,而是一套给 Claude Code 使用的工作流程。

我想解决的问题也不复杂:不要让 AI 一上来就写代码。

很多时候,我们只说一句“帮我加个登录功能”,模型马上开始改文件。代码可能写得很快,但需求边界、接口设计、异常情况,往往都没有真正想清楚。等到测试失败,才发现最开始的理解就偏了。

所以我把这个过程拆成了四个角色:

– Story:先把需求问清楚,拆成可以验收的功能。

– Arch:确定技术方案、文件结构和接口。

– Dev:按照设计实现代码。

– QA:写测试、真正执行测试,并反馈问题。

整个流程大概是这样:

用户需求

  ↓

Story 拆解需求

  ↓

Arch 输出设计方案

  ↓

用户确认设计

  ↓

Dev 实现代码

  ↓

QA 编写并执行测试

  ↓

失败则修复,最多循环 3 轮

  ↓

完成交付

“`

先把需求写下来

Story 阶段对应的是 `requirement.yaml`。

它不负责决定用 Go 还是 Python,而是负责回答几个问题:到底要做什么、谁会使用、什么结果算完成、哪些内容不在范围内。

仓库里还规定了一条比较实用的规则:如果验收标准超过 5 条,或者需求里包含多个独立功能,就必须拆成多个模块。每个模块单独实现、单独测试,避免一个大需求从头到尾混在一起。

需求不清楚时,Story 不能直接猜。它需要继续向用户提问,直到有足够把握再开始写文档。

这个规则看起来有点啰嗦,但确实能挡住不少返工。很多代码问题,最早并不是代码写错了,而是需求根本没有说清楚。

设计完成后,先让人看一眼

Arch 阶段会读取需求文档,生成 `design.yaml`。

里面需要写清楚技术栈、项目结构、函数签名、接口、依赖、设计取舍和潜在风险。Dev 不应该拿到一句“你自己看着办”,而是拿到一份尽可能明确的施工图。

这里有一个我比较坚持的点:Arch 设计完成后,必须等用户确认,不能直接进入开发。

AI 的速度很快,但快不代表方向一定对。技术方案如果一开始就选错了,后面写得越快,返工越多。让人先看一眼,至少可以在代码产生之前发现问题。

Dev 不能自由发挥

Dev 的约束比较严格。

设计文档里定义了什么文件路径,就按什么路径创建;接口里写了什么函数签名,就不能自己改成另一种写法。多模块需求也要按照顺序处理,当前模块没完成之前,不提前修改后面的模块。

这可能会让开发过程显得没那么“聪明”,但我觉得这是有必要的。一个角色负责做设计,另一个角色负责落地,如果 Dev 一边实现一边重新设计,前面的文档就失去了意义。

QA 必须真的跑测试

QA 阶段不是简单地看一遍代码,然后说“应该没问题”。

它需要根据验收标准写测试,执行项目实际的测试命令,并把结果写进 `test-report.yaml`。测试报告里除了通过和失败数量,还要求记录错误输出、相关文件、运行环境和修复建议。

测试失败之后,结果会交回 Dev 修复,再由 QA 重新执行。最多循环三轮,三轮之后还没解决,就停止并报告问题。

这里的“四角色”并不是四个独立运行的程序,实际上还是 Claude Code 在不同阶段读取不同的角色说明。更准确地说,这是给 AI 加了一套比较明确的工作纪律。

用一个命令把 Skill 放进项目

为了方便使用,我又写了两个 Shell 脚本。

安装:

“`bash

chmod +x install.sh team

./install.sh

“`

安装脚本会把 `.claude` 目录复制到:

“`text

~/.local/share/ai-coding-team

“`

同时把 `team` 命令安装到:

“`text

~/.local/bin/team

“`

进入任意项目根目录后,可以执行:

“`bash

team init

“`

它会把 Skill 复制到当前项目的 `.claude/` 下,而且使用的是不覆盖策略,已经存在的文件会保留。

另外还有两个命令:

“`bash

team list

team clean

“`

一个用来查看 Skill 文件,一个用来清理当前项目的 `.claude/` 目录。清理前会要求确认,不会直接删除。

我更看重中间产物

这个项目里我比较看重的,其实不是 `team init` 这个命令,而是过程中的几个文件:

“`text

.ai-team/

├── requirement.yaml

├── design.yaml

├── test-report.yaml

└── logs/

“`

以前很多决定都散落在聊天记录里,过几天再回头看,很难知道当时为什么这么设计。现在至少可以留下需求、方案和测试结果,出了问题也有地方可查。

说白了,就是把容易飘走的对话,变成项目里能留下来的文件。

目前还不算完美

这个仓库现在还比较像一个可用的原型。

另外,仓库本身没有单独的自动化测试。QA 的测试能力取决于目标项目有没有合适的测试命令。对于一个 Go 项目,可以跑 `go test ./… -v`;对于 Python、JavaScript 项目,则需要根据项目自身情况处理。

还有一点,小需求不一定值得完整走完四个角色。改一个按钮颜色,没必要先写需求文档再出架构方案。但当功能开始变复杂,或者多人一起协作时,这套流程就有价值了。

最后

我不觉得 AI 编程一定要设计成很复杂的系统。相反,我做这个工具时一直在想,能不能只增加一些必要的步骤,让 AI 少一点跳跃,多一点确认。

`ttt-aiteam` 现在做的事情很朴素:先问清楚,再设计;先确认,再编码;写完代码,真的跑测试。

它不能替我思考,也不能保证每次都写对。但至少会提醒我,把那些本来容易被忽略的事情,放到代码之前处理掉。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注