Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 152 additions & 0 deletions .claude/commands/opsx/apply.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
---
name: "OPSX: 应用"
description: 实现 OpenSpec 变更中的任务(实验性)
category: 工作流
tags: [workflow, artifacts, experimental]
---

实现 OpenSpec 变更中的任务。

**输入**:可选择指定变更名称(例如,`/opsx:apply add-auth`)。如果省略,检查是否可以从对话上下文中推断出来。如果模糊或不明确,你必须提示可用的变更。

**步骤**

1. **选择变更**

如果提供了名称,使用它。否则:
- 如果用户提到了某个变更,从对话上下文中推断
- 如果只存在一个活动变更,自动选择
- 如果不明确,运行 `openspec-cn list --json` 获取可用变更,并使用 **AskUserQuestion tool** 让用户选择

始终宣布:"正在使用变更:<name>"以及如何覆盖(例如,`/opsx:apply <other>`)。

2. **检查状态以了解 Schema**
```bash
openspec-cn status --change "<name>" --json
```
解析 JSON 以了解:
- `schemaName`:正在使用的工作流(例如:"spec-driven")
- 哪个产出物包含任务(对于 spec-driven 通常是 "tasks",检查其他产出物的状态)

3. **获取应用指令**

```bash
openspec-cn instructions apply --change "<name>" --json
```

这返回:
- 上下文文件路径(因 Schema 而异)
- 进度(总计,完成,剩余)
- 带有状态的任务列表
- 基于当前状态的动态指令

**处理状态:**
- 如果 `state: "blocked"`(缺少产出物):显示消息,建议使用 `/opsx:continue`
- 如果 `state: "all_done"`:祝贺,建议归档
- 否则:继续实现

4. **阅读上下文文件**

阅读 apply instructions 输出中 `contextFiles` 列出的文件。
文件取决于正在使用的 Schema:
- **spec-driven**: proposal, specs, design, tasks
- 其他模式:遵循 CLI 输出中的 contextFiles

5. **显示当前进度**

显示:
- 正在使用的 Schema
- 进度:"N/M 任务已完成"
- 剩余任务概览
- 来自 CLI 的动态指令

6. **实现任务(循环直到完成或受阻)**

对于每个待处理任务:
- 显示正在处理哪个任务
- 进行所需的代码更改
- 保持更改最小化且专注
- 在任务文件中标记任务完成:`- [ ]` → `- [x]`
- 继续下一个任务

**暂停如果:**
- 任务不清楚 → 询问澄清
- 实现揭示了设计问题 → 建议更新产出物
- 遇到错误或阻碍 → 报告并等待指导
- 用户中断

7. **完成或暂停时,显示状态**

显示:
- 本次会话完成的任务
- 总体进度:"N/M 任务已完成"
- 如果全部完成:建议归档
- 如果暂停:解释原因并等待指导

**实现期间的输出**

```
## 正在实现:<change-name> (schema: <schema-name>)

正在处理任务 3/7:<task description>
[...正在进行实现...]
✓ 任务完成

正在处理任务 4/7:<task description>
[...正在进行实现...]
✓ 任务完成
```

**完成时的输出**

```
## 实现完成

**变更:** <change-name>
**Schema:** <schema-name>
**进度:** 7/7 任务已完成 ✓

### 本次会话已完成
- [x] 任务 1
- [x] 任务 2
...

所有任务已完成!您可以使用 `/opsx:archive` 归档此变更。
```

**暂停时的输出(遇到问题)**

```
## 实现暂停

**变更:** <change-name>
**Schema:** <schema-name>
**进度:** 4/7 任务已完成

### 遇到的问题
<问题描述>

**选项:**
1. <选项 1>
2. <选项 2>
3. 其他方法

您想怎么做?
```

**护栏**
- 继续执行任务直到完成或受阻
- 开始前始终阅读上下文文件(来自 apply instructions 输出)
- 如果任务模棱两可,暂停并在实现前询问
- 如果实现揭示了问题,暂停并建议更新产出物
- 保持代码更改最小化并限定在每个任务范围内
- 完成每个任务后立即更新任务复选框
- 遇到错误、阻碍或不清楚的需求时暂停 - 不要猜测
- 使用 CLI 输出中的 contextFiles,不要假设特定的文件名

**流畅的工作流集成**

此技能支持"变更上的操作"模型:

- **可以随时调用**:在所有产出物完成之前(如果存在任务),部分实现之后,与其他操作交错
- **允许产出物更新**:如果实现揭示了设计问题,建议更新产出物 - 不是阶段锁定的,流畅地工作
157 changes: 157 additions & 0 deletions .claude/commands/opsx/archive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
---
name: "OPSX: 归档"
description: 归档实验性工作流中已完成的变更
category: 工作流
tags: [workflow, archive, experimental]
---

归档实验性工作流中已完成的变更。

**输入**:可选择在 `/opsx:archive` 后指定变更名称(例如,`/opsx:archive add-auth`)。如果省略,检查是否可以从对话上下文中推断出来。如果模糊或不明确,你必须提示可用的变更。

**步骤**

1. **如果没有提供变更名称,提示选择**

运行 `openspec-cn list --json` 获取可用变更。使用 **AskUserQuestion tool** 让用户选择。

仅显示活动变更(未归档的)。
如果可用,包括每个变更使用的 Schema。

**重要提示**:不要猜测或自动选择变更。始终让用户选择。

2. **检查产出物完成状态**

运行 `openspec-cn status --change "<name>" --json` 检查产出物完成情况。

解析 JSON 以了解:
- `schemaName`:正在使用的工作流
- `artifacts`:产出物列表及其状态(`done` 或其他)

**如果有任何产出物未 `done`:**
- 显示列出未完成产出物的警告
- 提示用户确认是否继续
- 如果用户确认,则继续

3. **检查任务完成状态**

阅读任务文件(通常是 `tasks.md`)以检查未完成的任务。

统计标记为 `- [ ]`(未完成)与 `- [x]`(已完成)的任务。

**如果发现未完成的任务:**
- 显示警告,显示未完成任务的数量
- 提示用户确认是否继续
- 如果用户确认,则继续

**如果没有任务文件存在:** 继续,无需任务相关警告。

4. **评估增量规格说明同步状态**

在 `openspec/changes/<name>/specs/` 检查增量规格说明。如果不存在,不提示同步直接继续。

**如果存在增量规格说明:**
- 将每个增量规格说明与其在 `openspec/specs/<capability>/spec.md` 的相应主规格说明进行比较
- 确定将应用哪些更改(添加、修改、删除、重命名)
- 在提示前显示合并摘要

**提示选项:**
- 如果需要更改:"立即同步(推荐)","不同步直接归档"
- 如果已同步:"立即归档","仍要同步","取消"

如果用户选择同步,执行 `/opsx:sync` 逻辑。无论选择如何都继续归档。

5. **执行归档**

如果归档目录不存在,则创建它:
```bash
mkdir -p openspec/changes/archive
```

使用当前日期生成目标名称:`YYYY-MM-DD-<change-name>`

**检查目标是否已存在:**
- 如果是:失败并报错,建议重命名现有归档或使用不同日期
- 如果否:将变更目录移动到归档

```bash
mv openspec/changes/<name> openspec/changes/archive/YYYY-MM-DD-<name>
```

6. **显示摘要**

显示归档完成摘要,包括:
- 变更名称
- 使用的 Schema
- 归档位置
- 规格说明同步状态(已同步 / 跳过同步 / 无增量规格说明)
- 任何警告的注释(未完成的产出物/任务)

**成功时的输出**

```
## 归档完成

**变更:** <change-name>
**Schema:** <schema-name>
**归档至:** openspec/changes/archive/YYYY-MM-DD-<name>/
**规范:** ✓ 已同步到主规范

所有产出物已完成。所有任务已完成。
```

**成功时的输出(无增量规范)**

```
## 归档完成

**变更:** <change-name>
**Schema:** <schema-name>
**归档至:** openspec/changes/archive/YYYY-MM-DD-<name>/
**规范:** 无增量规范

所有产出物已完成。所有任务已完成。
```

**成功时的输出(带警告)**

```
## 归档完成(带警告)

**变更:** <change-name>
**Schema:** <schema-name>
**归档至:** openspec/changes/archive/YYYY-MM-DD-<name>/
**规格说明:** 跳过同步(用户选择跳过)

**警告:**
- 带有 2 个未完成产出物的归档
- 带有 3 个未完成任务的归档
- 增量规格说明同步已跳过(用户选择跳过)

如果这不是故意的,请检查归档。
```

**错误时的输出(归档已存在)**

```
## 归档失败

**变更:** <change-name>
**目标:** openspec/changes/archive/YYYY-MM-DD-<name>/

目标归档目录已存在。

**选项:**
1. 重命名现有归档
2. 如果是重复的,删除现有归档
3. 等待不同的日期再归档
```

**防护措施**
- 如果未提供变更,始终提示选择
- 使用产出物图(openspec-cn status --json)进行完成度检查
- 不要在警告时阻止归档 - 只需告知并确认
- 移动到归档时保留 .openspec.yaml(它与目录一起移动)
- 显示清晰的操作摘要
- 如果请求同步,使用 Skill tool 调用 `openspec-sync-specs`(代理驱动)
- 如果存在增量规格说明,请始终运行同步评估,并在提示前显示综合摘要
Loading
Loading