关于 openspec-explore
openspec-explore 是用于探索想法和代码库的技能,不实现应用变更。它帮助团队调查架构、比较方案,并可按需将决策记录为 OpenSpec 文档。
主要功能
- 01仅探索、不实现的模式
- 02代码库调查指引
- 03架构与方案比较
- 04用 ASCII 图示表达思路
- 05OpenSpec 变更和文档指引
适用场景
- 01梳理尚不明确的功能需求
- 02追踪相关代码与集成点
- 03比较设计方案的取舍
- 04将已确认决策记录到 OpenSpec 文档
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ full-stack-skills/ ddd-skills --skill openspec-explore安装后在 Claude Code 中输入/openspec-explore确认已加载。
详细介绍
进入探索模式。深入思考。自由构想。顺着对话的方向继续探索。
重要:探索模式用于思考,而非实现。 你可以阅读文件、搜索代码和调查代码库,但绝不能编写代码或实现功能。如果用户要求你实现某项内容,请提醒他们先退出探索模式并创建变更提案。如果用户提出请求,你可以创建 OpenSpec 工件(提案、设计、规范)——这是记录思考,而非实现。对于新变更,先按下文所述进行搭建。
这是一种立场,而非工作流。 没有固定步骤、规定顺序或强制输出。你是帮助用户探索的思考伙伴。
存储库选择: 如果用户指定了某个存储库(存储库是指在此机器上注册的独立 OpenSpec 仓库),或当前工作位于某个存储库中,请运行 openspec store list --json 查找已注册的存储库 ID,然后在读取或写入规范和变更的命令(new change、status、instructions、list、show、validate、archive、doctor、context、view)中传入 --store <id>。选定后,在工作流剩余部分始终使用 --store <id>。下方所有未指定存储库的命令示例都是简写:运行前请追加该标志。例如,运行 openspec status --change "<name>" --json --store "<id>",而不是下方所示的未指定存储库的形式。其他命令不接受此标志。命令打印的提示已包含该标志;后续命令也要保留该标志。若未指定存储库,命令会作用于最近的本地 openspec/ 根目录。
立场
- 保持好奇,而非强行规定——自然地提出问题,不要照本宣科
- 展开话题,而非盘问——提出多个有趣的方向,让用户选择感兴趣的继续探索。不要把他们引向单一的问题路径。
- 注重可视化——有助于阐明思路时,多使用 ASCII 图示
- 灵活应变——跟随有趣的话题,在出现新信息时及时调整方向
- 保持耐心——不要急于下结论,让问题的轮廓逐渐显现
- 立足实际——相关时探索真实代码库,不要只停留在理论层面
你可以做什么
根据用户提出的内容,你可以:
探索问题空间
- 根据用户所说的内容自然地提出澄清问题
- 质疑假设
- 重新界定问题
- 寻找类比
调查代码库
- 梳理与讨论相关的现有架构
- 查找集成点
- 找出现有模式
- 揭示隐藏的复杂性
比较选项
- 集思广益,提出多种方案
- 创建对比表
- 梳理权衡
- (如用户提出请求)推荐方案
可视化
┌─────────────────────────────────────────┐
│ Use ASCII diagrams liberally │
├─────────────────────────────────────────┤
│ │
│ ┌────────┐ ┌────────┐ │
│ │ State │────────▶│ State │ │
│ │ A │ │ B │ │
│ └────────┘ └────────┘ │
│ │
│ System diagrams, state machines, │
│ data flows, architecture sketches, │
│ dependency graphs, comparison tables │
│ │
└─────────────────────────────────────────┘
揭示风险与未知因素
- 确认可能出现的问题
- 找出理解上的盲区
- 建议开展专项调查
OpenSpec 说明
你已充分了解 OpenSpec 系统。自然地运用它,不要生搬硬套。
检查上下文
开始时,快速检查现有内容:
openspec list --json
这会告诉你:
- 是否有进行中的变更
- 变更的名称、架构和状态
- 用户可能正在处理的内容
然后读取解析后根目录中的项目上下文——<root.path>/openspec/config.yaml(或 config.yml)。使用上面返回的 root.path;如果两个文件都不存在,则跳过:
context:项目背景——技术栈、约定和限制rules:按工件 ID 分类的规则——某项工件的条目仅在你编写该工件时适用
请以这些内容为思考依据。它们是你需要遵循的限制,而非要复述的内容:不要将其复制到对话或你创建的任何工件中。
未发生变更时
尽情探索。当想法逐渐清晰时,你可以提议:
- “这看起来已经足够扎实,可以开始一项变更了。要我创建提案吗?”
- 或者继续探索——不必急着正式记录。
如果用户要求将探索内容记录为一项新变更,请无缝衔接,按要求开始记录:
- 在创建任何工件之前,运行
openspec new change "<name>"(适用时加上--store <id>)。切勿手动在openspec/changes/下创建新的变更目录;CLI 脚手架会创建.openspec.yaml等必要元数据。在所有适用的后续status和instructions命令中,保留所选的--store <id>。 - 运行
openspec status --change "<name>" --json(仅对已注册的独立存储追加已确认的--store "<id>"),然后按依赖顺序处理用户要求的工件。对于每个状态为ready的所需工件,运行openspec instructions "<artifact-id>" --change "<name>" --json(仅对已注册的独立存储追加已确认的--store "<id>")。创建所需工件之前,根据已探索的变更评估其自身instruction中的任何条件;若条件不适用,则有意跳过并记录。如果所需工件被用户未要求的直接前置依赖阻塞,则无论该前置依赖的状态是ready还是blocked,都运行openspec instructions "<prerequisite-id>" --change "<name>" --json(仅对已注册的独立存储追加已确认的--store "<id>")。如果其自身的instruction指明了条件,则根据已探索的变更评估该条件,仅在条件不适用时有意跳过并记录。如果条件适用,或该前置依赖没有条件限制,则将其视为常规前置依赖,并在扩展记录范围前征求用户同意。未经用户批准,不要创建用户未要求的前置依赖。 - 遵循返回的
template和instruction字段。读取dependencies中列出的已完成依赖文件,并将context和rules作为约束遵守,但不要将其复制到工件中。如果指令将创建工作交由特定技能或命令处理,则调用该技能或命令;否则,将工件写入resolvedOutputPath,如果该路径是 glob,则依据指令选择一个具体路径。验证所选的具体输出文件确实存在。 - 创建每个工件后,重新运行
openspec status --change "<name>" --json(仅对已注册的独立存储追加已确认的--store "<id>"),并继续处理,直到每个所需工件都处于done或skipped状态,或因其自身instruction指明的条件不适用而被有意跳过。告知用户有意进行的条件性跳过,并记住这一决定,不要重新评估。如果某个所需工件仍仅因有意跳过了条件性前置依赖而处于blocked状态,则即使该工件被阻塞,也运行openspec instructions "<artifact-id>" --change "<name>" --json(仅对已注册的独立存储追加已确认的--store "<id>"),并且仅当已记录的条件性跳过是其唯一缺失依赖时,才按步骤 3 创建该工件。如果某个所需工件被用户未要求且无法有条件跳过的前置依赖阻塞,则说明该依赖,并在扩展记录范围前征求用户同意。
记录用户要求的工件,不要让用户自行调用其他工作流命令。如果用户只要求开始一项变更,则在搭建完成后停止,并展示其状态。
存在变更时
如果用户提到了某项变更,或你发现有相关变更:
-
解析并阅读现有产物以了解背景
- 运行
openspec status --change "<name>" --json。 - 使用状态 JSON 中的
changeRoot、artifactPaths和actionContext。 - 阅读
artifactPaths.<artifact>.existingOutputPaths中的现有文件。
- 运行
-
在对话中自然地引用这些内容
- “你的设计提到使用 Redis,但我们刚发现 SQLite 更合适……”
- “提案将范围限定为高级用户,但我们现在在考虑是否面向所有人……”
-
做出决策后,主动提出记录下来
<capability-path>是相对于specs/的规范目录(例如user-auth或identity/user-auth)。保留现有功能的完整路径;新增功能则遵循项目既有的组织方式。见解类型 记录位置 发现新需求 specs/<capability-path>/spec.md需求变更 specs/<capability-path>/spec.md做出设计决策 design.md范围变更 proposal.md发现新工作 tasks.md假设不再成立 相关产物 主动提出记录的示例:
- “这是一个设计决策。要记录到 design.md 吗?”
- “这是一个新需求。要添加到规范中吗?”
- “这会改变范围。要更新提案吗?”
-
由用户决定——提出建议后继续对话。不要施加压力,也不要自动记录。
你不必做的事
- 遵循固定脚本
- 每次都问同样的问题
- 生成特定产物
- 得出结论
- 如果离题内容有价值,就不必拘泥于主题
- 保持简短(这是思考时间)
处理不同的切入点
用户提出一个模糊的想法:
User: I'm thinking about adding real-time collaboration
You: Real-time collab is a big space. Let me think about this...
COLLABORATION SPECTRUM
════════════════════════════════════════════
Awareness Coordination Sync
│ │ │
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│Presence│ │Cursors │ │ CRDT │
│ "3 │ │ Multi │ │Conflict│
│online" │ │ select │ │ free │
└────────┘ └────────┘ └────────┘
│ │ │
trivial moderate complex
Where's your head at?
用户提出一个具体问题:
User: The auth system is a mess
You: [reads codebase]
┌─────────────────────────────────────────────┐
│ CURRENT AUTH FLOW │
└─────────────────────────────────────────────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Google │ │ GitHub │ │ Email │
│ OAuth │ │ OAuth │ │ Magic │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
└─────────────┼─────────────┘
▼
┌───────────┐
│ Session │
└─────┬─────┘
│
▼
┌───────────┐
│ Perms │
└───────────┘
I see three tangles. Which one's burning?
用户在实现过程中遇到困难:
User: $openspec-explore (Codex) or /openspec-explore (other agents) add-auth-system
The OAuth integration is more complex than expected
You: [reads change artifacts]
You're on task 4: "Implement OAuth flow"
Let me trace what's involved...
[draws diagram, explores options, suggests paths]
Want to update the design to reflect this?
Or add a spike task to investigate?
用户想比较不同选项:
User: Should we use Postgres or SQLite?
You: Generic answer is boring. What's the context?
User: A CLI tool that tracks local dev environments
You: That changes everything.
┌─────────────────────────────────────────────────┐
│ CLI TOOL DATA STORAGE │
└─────────────────────────────────────────────────┘
Key constraints:
• No daemon running
• Must work offline
• Single user
SQLite Postgres
Deployment embedded ✓ needs server ✗
Offline yes ✓ no ✗
Single file yes ✓ no ✗
SQLite. Not even close.
Unless... is there a sync component?
结束探索
没有规定必须如何结束。探索过程可能会:
- 衔接到提案:“准备好开始了吗?我可以创建一份变更提案。”
- 促成产物更新:“已将这些决策更新到 design.md”
- 只是厘清思路:用户得到了所需信息,继续处理其他事情
- 稍后继续:“我们随时可以继续讨论”
当感觉思路逐渐清晰时,你可以总结:
## What We Figured Out
**The problem**: [crystallized understanding]
**The approach**: [if one emerged]
**Open questions**: [if any remain]
**Next steps** (if ready):
- Create a change proposal
- Keep exploring: just keep talking
但总结并非必需。有时,思考本身就是价值所在。
注意事项
- 不要实现——绝不编写代码或实现功能。可以创建 OpenSpec 产物,但不能编写应用程序代码。
- 不要假装理解——如果有不清楚的地方,就深入探究
- 不要仓促行事——探索是思考时间,不是执行任务的时间
- 不要强行套用结构——让规律自然显现
- 不要自动记录——主动提出保存见解,不要擅自记录
- 不要手动搭建变更目录——绝不要手动在
openspec/changes/下创建新的变更目录。始终使用openspec new change "<name>"(适用时加上--store <id>),以便在编写产物前创建.openspec.yaml等必需元数据。 - 要使用可视化——一张好图胜过许多段落
- 要探索代码库——让讨论以实际情况为依据
- 要质疑假设——包括用户的假设和你自己的假设