Skip to content

对变更进行编辑和迭代

一个变更中的所有工件(artifact)都是你可以随时编辑的 Markdown 文件。 没有锁定式的“规划阶段”,没有审批门槛,也没有特殊的编辑模式需要进入。想在开始构建后修改提案?打开 proposal.md 并修改它。实现过程中发现设计有误?修复 design.md 然后继续进行。这就是全部答案,也是其设计的初衷。

本页面是针对你产生“等等,我能回去修改那个吗?”这种想法的时刻。答案是肯定的。以下是针对每种常见情况的操作方法。

两种编辑任何内容的方式

你始终拥有这两种方式:

  1. 直接编辑文件。 工件位于 openspec/changes/<name>/ 下,它们都是纯粹的 Markdown 文件。在编辑器中打开 proposal.mddesign.mdtasks.mdspecs/ 下的 delta spec 进行修改。无需其他操作。

  2. 请你的 AI 协助修订。 在聊天中,只需说明你想要什么:“将提案更新为移除缓存想法并添加一个速率限制(rate-limit)部分,”或者“设计应该使用队列而不是轮询。”AI 会利用整个变更作为上下文来为你编辑该工件。

根据当时的需要选择最合适的方式。只是措辞上的微调?编辑文件。实质性的重新思考?让 AI 在完整的上下文中进行修订。

“在开始后,我如何更新提案(或规范)?”

直接更新它。保持相同的变更,但有所完善。

如果你使用的是扩展命令(expanded commands),自然流程是:编辑工件,然后运行 /opsx:continue 以承接新的状态,或者运行 /opsx:apply 以继续根据更新后的计划进行实现。如果你使用的是默认的 core 命令,请编辑工件并运行 /opsx:apply;它会读取当前文件,因此会基于工件现在所描述的内容进行构建。

心智模型:工件是活生生的计划,而不是一份已签署的合同。AI 总是从这些工件的当前内容中工作,因此编辑它们就是在引导工作方向。

text
你: 我想修改这个变更中的方法。

你: [编辑 design.md,或告诉 AI:]
     将 design.md 更新为使用后台任务(background job)而不是同步调用。

AI:  已更新 design.md。任务列表仍然适用;是否需要我继续应用?

你: /opsx:apply

这回答了一个非常常见的问题:没有单独的“更新提案”命令,因为你不需要它。文件是真相来源(source of truth),而编辑它(无论是手动还是通过 AI)就是更新过程。

“在实现之后,我如何回去审查?”

你不需要“回去”,因为你从未离开过。工作流程是流动的:审查、编辑和实现不是你被困住的顺序阶段。

具体来说,在执行了一些 /opsx:apply 工作后:

  • 想重新审视计划?打开工件并阅读它们,或者在终端中运行 openspec show <change> 以获得整合视图。
  • 发现需要修改的内容?编辑该工件(或请 AI 进行),然后继续进行。
  • 是否想要一个结构化的检查来确保代码与计划一致?运行 /opsx:verify(扩展命令)。它会报告完整性、正确性和连贯性,而不会阻塞任何事情。参见 工作流程:验证你的工作

不存在需要返回的“审查阶段”,因为审查是你可以在任何时间进行的,包括在实现之后。

“我手动编辑了代码。这如何与 OpenSpec 协调?”

这种情况会不断发生,这是正常的。你在编辑器中微调了一些内容,现在代码和工件之间出现了分歧。将它们同步回一致状态,无论朝哪个方向是正确的:

  • 代码现在是正确的,规范(spec)已过时。 更新 delta spec(如果相关,也更新 tasks)来描述你实际交付的行为。在归档之前,规范应该与现实相符,因为归档会将规范合并到你的真相来源中。
  • 规范是正确的,代码发生了漂移(drift)。 继续构建或修复,直到代码与规范一致。

一个快速发现不匹配的方法是使用 /opsx:verify:它会读取你的工件和你的代码,并告诉你它们在哪里分歧。将它的输出视为一个需要完成的待办事项列表进行协调,然后当它们达成一致时再归档。

原则是:在归档时,你的规范将成为记录的真相。因此,在你归档之前,请让规范诚实地反映代码的功能。手动编辑是受欢迎的;只是不要让它悄悄地使规范脱节(desync)。

如何完善一个你不满意的提案

如果生成的提案不尽如人意,你有三种好的做法:

  • 原地迭代(Iterate in place)。 告诉 AI 哪里不对(“范围太广了,移除管理员功能”)让它进行修订。这是成本最低、通常最对的做法。
  • 先探索,再重新提案(Explore first, then re-propose)。 如果问题在于想法本身不够清晰,则退回到 /opsx:explore,深思熟虑后,让一个更清晰的提案诞生。参见 先探索
  • 从零开始(Start fresh)。 如果意图发生了根本性的变化,一个新的变更可能比修补旧的方案更清晰。

最后一个做法有自己的决策指南,敬请查阅。

何时更新 vs. 启动新的变更

简而言之:工作内容相同但有所完善时进行更新;当意图发生根本性改变或范围爆炸到不同的工作时,则启动新的变更。

  • 目标相同,方法更好?更新。
  • 缩小范围(先交付 MVP,后期再做更多)?更新,然后归档,再为第二阶段启动一个新的变更。
  • 问题本身发生了变化(“添加深色模式”变成了“构建一套完整的主题系统”)?新的变更。

工作流程:何时更新 vs. 从零开始 中有完整的流程图和案例示例,而 OPSX: 何时更新 vs. 从零开始 中有更深入的阐述。

关于任务(Tasks)的一点说明

tasks.md 是一个活着的清单,而不是一个固定的计划。在实现过程中,你可以添加新发现的任务,移除不必要的任务,或重新排序它们。AI 在 /opsx:apply 期间完成任务时会勾选项目,如果你稍后回来,它将从第一个未勾选的任务处恢复。中途编辑清单是预料之中的事情。

下一步去哪里

  • 工作流程 - 模式,以及更新 vs. 新建的决策指南
  • 先探索 - 当一个想法需要重新思考时应退回的地方
  • 命令 - /opsx:continue/opsx:apply/opsx:verify 的详细说明
  • 概念:工件 - 每个工件的作用是什么