不太懂 openspec ,最近了解了一下。自己在某个仓库使用 openspec 写了一次需求,也观察了一下 openspec 自身是怎么使用的,发现 openspec 的 spec 似乎就是在用自然语言描述代码逻辑行为的各种 case 。以 openspec 仓库自身的 spec 为例,发现 spec.md 文件本身是在描述代码的行为逻辑。比如 openspec 的某个 spec.md 对应行为就是这个文件: https://github.com/Fission-AI/OpenSpec/blob/8332a098118a6584a7104ccfe8e46669a1c24b7d/src/utils/change-utils.ts#L112 ,spec.md 本身贴在末尾
我的问题是:
有没有实践比较多的朋友能给一些输入,分享一些经验,或者思考?
附上的 spec.md
提供用于以编程方式创建和校验 OpenSpec change 目录的工具函数。
系统 必须( SHALL ) 提供一个函数,用于以编程方式创建新的 change 目录。
createChange(projectRoot, 'add-auth')openspec/changes/add-auth/ 目录createChange(projectRoot, 'add-auth'),且 openspec/changes/add-auth/ 已存在createChange(projectRoot, 'add-auth'),且 openspec/changes/ 不存在createChange(projectRoot, 'Add Auth')系统 必须( SHALL ) 校验 change 名称符合 kebab-case 规范。
add-user-auth 的名称{ valid: true }add-feature-2 的名称{ valid: true }refactor 的名称{ valid: true }Add-Auth 的名称{ valid: false, error: "..." }add auth 的名称{ valid: false, error: "..." }add_auth 的名称{ valid: false, error: "..." }add-auth! 的名称{ valid: false, error: "..." }-add-auth 的名称{ valid: false, error: "..." }add-auth- 的名称{ valid: false, error: "..." }add--auth 的名称{ valid: false, error: "..." } 1
FarAhead 2 天前
就当个人或小团队开发对齐的工具吧,感觉相当于 Antigravity 的 Plan -> Task -> Walkthrough 流程标准化了
|
2
BeautifulSoap 1 天前 了解下 spec 驱动开发这个概念,引用我另一处的看法
------------------------ Spec 驱动开发绝对不是 ai 开发的未来。真做过项目的就知道 Spec 这东西本质上就是一个项目的详细设计书(尤其日本 it 开发喜欢这一套。开发项目先确定需求,然后做完整的系统的设计,这种设计可能详细到每个小功能逻辑步骤,然后开发照着设计书实现代码) 大部分是你用了 Spec 驱动开发,往往结果如下 1. 对于一个复杂功能,生成的 spec 过度复杂 2. 虽然能拆分功能 spec ,但是功能的复杂度是改变不了的,spec 的复杂和 ai 生成的大量 spec 结果就是根本懒得去看 3. spec 详细到了代码细节实现,review spec 本质上和 review 伪代码没区别,到后来就和 2 一样懒得去详细看 spec 了 4. spec 对各自的功能模块只适合功能变化不大、较为稳定的情况。当你的设计书经常动不动就发生大的变化(实际上开发中经常遇到),spec 也会经常会发生巨大变动,如何将最新的变动融入已经写下去的 spec 并且更新到代码也是个问题。而且每个 spec 之间都互相依赖,牵一发动全身。 |
3
maolon 1 天前 1. 文档即代码,是的你的理解没错
2. spec 主要是充当计划的文件化索引。 你的 agent 开始工作的时候一般都会启动一个 planner 然后开始计划并拆分的任务,当前 agent 驱动的大模型上下文太短,所以我们会在工程化里大量使用 compact 系统(包含 tool compact, history summrization 这些功能),这些 compact 系统会压缩上下文,导致信息丢失,(比如一开始 planner 详细的规划了要实现哪些细节需求,而在多次 compact 后这些细节丢失了),然后 agent 就会开始自由发挥。 如果我们了解 compact 的工作原理就会发现,比如 tool compact 是将 tool 返回的结果存在一个文件里(比如 xxx.log )然后将上下文里 tool 调用的那一条 message 改为 {is_compacted:true, file_path:"xxx.log"},那么如果 agent 需要重新查看之前的结果,他就能通过读取 file 无损的调用回 tool 的返回内容。 spec 也是同理,它充分利用了 agent 的 compact 系统会最大程度保留文件 path 的特性,从一开始就文件化了 planner 输出的细节,在多次 compact 后虽然需求被多次压缩损失,但是只要这个文件索引地址还在,agent 就能在需要的时候重新读取细节,从而保证在多任务,很长的工作流程里,细节和讨论的一致性,这就是 spec 的目的 3. 这是自主性的问题,你希望 agent 拥有多少自主权利,比如你允许他部分 design 一些页面的组件吗,还是你一点自主性都不允许,这是你对项目的预期和控制问题,不是 spec 的问题 |
4
liminany1 1 天前 via Android |
5
QingmuSanren 1 天前 我是在存量的项目中使用 openspec, 我使用一段时间后,整个使用体验是很好的,opspec 把提案和 task 规划的分厂好。
但是有一个问题卡在我这里,就是 archive 命令的使用上遇到了问题。 按我最开始的理解,任务完成后,我就 执行 archive 把任务归档。但是经常遇到 archive abort 的问题。后来去翻了文档,官方说只有 add 类型的 spec 才能回档。这跟我最开始的理解不一致。 spec 就像当前当前任务的一个场景快照,我认为用处并不是特别大,openspec 的最大优点应该是帮助开发者把 需求对齐(黑话,笑)。 |
6
yukinotech OP @BeautifulSoap 感谢分享。我也是比较认同这个观点的
|