修改变更的现有规划制品并保持它们之间的一致性。绝不编辑代码。
存储选择: 如果用户指定了一个存储(存储是在本机上注册的独立 OpenSpec 仓库)或者工作在其中,运行 openspec store list --json 来发现已注册的存储 ID,然后在读取或写入规范和变更的命令(new change、status、instructions、list、show、validate、archive、doctor、context)上传递 --store <id>。其他命令不需要此标志。命令打印的提示信息已经包含该标志;请在其后的操作中保留它。如果没有存储,命令将对最近的本地 openspec/ 根目录进行操作。
输入: 可选地指定变更名称。如果省略,检查是否可以从对话上下文中推断出来。如果含糊不清或模棱两可,你必须提示用户从可用的变更中选择。
步骤
-
如果没有提供变更名称,提示用户选择
运行
openspec list --json获取按最近修改时间排序的可用变更。然后使用 AskUserQuestion 工具 让用户选择要更新哪个变更。展示最近修改的前 3-4 个变更作为选项,显示:
- 变更名称
- 模式(来自
schema字段(如果存在),否则为 "spec-driven") - 状态(例如 "0/5 个任务"、"已完成"、"无任务")
- 最近修改时间(来自
lastModified字段)
将最近修改的变更标记为 "(推荐)",因为这很可能是用户想要更新的。
重要:不要猜测或自动选择变更。始终让用户选择。
-
获取变更的制品
openspec status --change "<名称>" --json解析 JSON 以了解当前状态。响应包括:
schemaName:正在使用的工作流模式(例如 "spec-driven")artifacts:制品数组,包含其状态("done"、"ready"、"blocked")isComplete:布尔值,指示所有制品是否已完成planningHome、changeRoot、artifactPaths和actionContext:路径和作用域上下文。使用这些而不是假定仓库本地路径。
制品 ID 和路径来自活动模式——不要假设它们,也不要根据硬编码的制品名称进行分支。自定义模式必须能够无需修改地工作。
要编辑的文件是
artifactPaths.<id>.existingOutputPaths——磁盘上存在的具体文件,已为通配符制品(例如specs/**/*.md)展开了通配符。不要写入resolvedOutputPath:对于通配符制品,它仍然是通配符模式,而不是真实文件。 -
理解请求
- 如果用户要求进行特定修订(“设计现在使用 X”),则以此为起始编辑。
- 如果他们只说“更新”/“保持一致性”,则将其视为一致性审查:读取现有制品并检查它们彼此之间是否存在矛盾、遗漏和重复。
-
读取并协调
- 读取请求涉及的制品以及变更的其他现有制品。
- 应用请求的编辑。然后对照检查每个其他现有制品——以任何方向:对后面制品的编辑可能需要修改前面的制品,反之亦然。构建顺序是建议的阅读顺序,而不是哪些制品可以修订的约束。
- 记录所有现在不一致、缺失或矛盾的内容。
- 仅修改已存在的文件(
existingOutputPaths)。不要创建尚不存在的制品,也不要在通配符制品下发明新文件——记录它们并提示用户使用/opsx:continue来创建它们。 - 如果变更已经一致,则说明情况并不做任何编辑。
-
确认并应用,一次一个制品
- 展示每个提议的修订及其原因。仅在用户确认后才写入。
- 如果用户拒绝修订,则不写入——保持该制品不变。
- 当需要大量重写时,首先获取该制品的规则和模板:
openspec instructions <制品-id> --change "<名称>" --json
-
指向下一步(仅指导——绝不执行)
- 仍然缺失的制品 -> 建议使用
/opsx:continue来创建它们。 - 变更已实施(任务已勾选/已应用)-> 代码可能不再与修订后的计划匹配;建议使用
/opsx:apply将差异引入代码。 - 所有内容已完成并已实施 -> 建议使用
/opsx:archive。
- 仍然缺失的制品 -> 建议使用
输出
每次调用后,显示:
- 哪些制品被修订(以及哪些提议的修订被拒绝)
- 任何推迟到
/opsx:continue的内容(尚未创建的制品或文件) - 变更的当前状态以及推荐的下一步命令
护栏
- 仅限规划制品——绝不编辑实现代码。如果修订后的计划意味着代码更改,立即停止并指向
/opsx:apply。 - 使用
openspec status报告的制品 ID 和路径;绝不要根据硬编码的制品名称进行分支。 - 仅编辑
existingOutputPaths中的具体文件;绝不要写入通配符的resolvedOutputPath。 - 不要推进构建前沿:没有新制品,通配符制品下没有新文件——这是
/opsx:continue的工作。 - 在写入之前与用户确认每个编辑。
- 如果请求更改了变更的意图而不是完善它,建议使用
/opsx:new重新开始(“更新 vs. 重新开始”启发式规则)。