specops 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +630 -0
- package/bin/install.js +2089 -0
- package/bin/specops.js +35 -0
- package/dist/__e2e__/01-state-engine.e2e.test.d.ts +10 -0
- package/dist/__e2e__/01-state-engine.e2e.test.js +1 -0
- package/dist/acceptance/lazyDetector.d.ts +10 -0
- package/dist/acceptance/lazyDetector.js +1 -0
- package/dist/acceptance/lazyDetector.test.d.ts +1 -0
- package/dist/acceptance/lazyDetector.test.js +1 -0
- package/dist/acceptance/reporter.d.ts +12 -0
- package/dist/acceptance/reporter.js +1 -0
- package/dist/acceptance/reporter.test.d.ts +1 -0
- package/dist/acceptance/reporter.test.js +1 -0
- package/dist/acceptance/runner.d.ts +26 -0
- package/dist/acceptance/runner.js +2 -0
- package/dist/acceptance/runner.test.d.ts +1 -0
- package/dist/acceptance/runner.test.js +1 -0
- package/dist/acceptance/types.d.ts +44 -0
- package/dist/acceptance/types.js +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +2 -0
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.js +1 -0
- package/dist/context/promptTemplate.d.ts +2 -0
- package/dist/context/promptTemplate.js +1 -0
- package/dist/context/promptTemplate.test.d.ts +1 -0
- package/dist/context/promptTemplate.test.js +1 -0
- package/dist/context/techContextLoader.d.ts +2 -0
- package/dist/context/techContextLoader.js +1 -0
- package/dist/context/techContextLoader.test.d.ts +1 -0
- package/dist/context/techContextLoader.test.js +1 -0
- package/dist/engine.d.ts +35 -0
- package/dist/engine.js +1 -0
- package/dist/evolution/distiller.d.ts +22 -0
- package/dist/evolution/distiller.js +1 -0
- package/dist/evolution/index.d.ts +8 -0
- package/dist/evolution/index.js +1 -0
- package/dist/evolution/memoryGraph.d.ts +34 -0
- package/dist/evolution/memoryGraph.js +1 -0
- package/dist/evolution/selector.d.ts +30 -0
- package/dist/evolution/selector.js +1 -0
- package/dist/evolution/signals.d.ts +18 -0
- package/dist/evolution/signals.js +1 -0
- package/dist/evolution/solidify.d.ts +20 -0
- package/dist/evolution/solidify.js +1 -0
- package/dist/evolution/store.d.ts +37 -0
- package/dist/evolution/store.js +1 -0
- package/dist/evolution/types.d.ts +350 -0
- package/dist/evolution/types.js +1 -0
- package/dist/init.d.ts +19 -0
- package/dist/init.js +1 -0
- package/dist/machines/agentMachine.d.ts +57 -0
- package/dist/machines/agentMachine.js +1 -0
- package/dist/machines/agentMachine.test.d.ts +1 -0
- package/dist/machines/agentMachine.test.js +1 -0
- package/dist/machines/supervisorMachine.d.ts +103 -0
- package/dist/machines/supervisorMachine.js +1 -0
- package/dist/machines/supervisorMachine.test.d.ts +1 -0
- package/dist/machines/supervisorMachine.test.js +1 -0
- package/dist/persistence/schema.d.ts +95 -0
- package/dist/persistence/schema.js +1 -0
- package/dist/persistence/stateFile.d.ts +17 -0
- package/dist/persistence/stateFile.js +1 -0
- package/dist/persistence/stateFile.test.d.ts +1 -0
- package/dist/persistence/stateFile.test.js +1 -0
- package/dist/plugin-engine.d.ts +42 -0
- package/dist/plugin-engine.js +1 -0
- package/dist/plugin.d.ts +9 -0
- package/dist/plugin.js +1 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/index.js +1 -0
- package/dist/utils/id.d.ts +1 -0
- package/dist/utils/id.js +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,630 @@
|
|
|
1
|
+
# SpecOps — AI Agent 工作流状态轮转引擎
|
|
2
|
+
|
|
3
|
+
> 让每个 Agent 在可配置的阶段间有序流转,并实时可视化展示各 Agent 的阶段、操作和工具使用情况。
|
|
4
|
+
|
|
5
|
+
## 当前版本
|
|
6
|
+
|
|
7
|
+
**v0.2.0** — Plugin 模式 + CI/CD
|
|
8
|
+
|
|
9
|
+
### 已完成功能
|
|
10
|
+
|
|
11
|
+
| 功能 | 阶段 | 说明 |
|
|
12
|
+
|------|------|------|
|
|
13
|
+
| ✅ Agent 状态机 | Phase 1 | 支持任意阶段序列的泛化状态机 |
|
|
14
|
+
| ✅ 多 Agent 并发 | Phase 1 | Supervisor 协调多个子 Agent |
|
|
15
|
+
| ✅ 状态持久化 | Phase 1 | JSON 原子写入 + 乐观锁 |
|
|
16
|
+
| ✅ CLI 命令行 | Phase 1 | 18 个命令覆盖完整工作流 |
|
|
17
|
+
| ✅ 技术守护 | Phase 2 | TECH-CONTEXT.md + 偏移检测脚本 |
|
|
18
|
+
| ✅ 验收框架 | Phase 2 | E2E 测试 + 偷懒检测 + 报告生成 |
|
|
19
|
+
| ✅ 上下文注入 | Phase 2 | Executor Agent 技术上下文自动注入 |
|
|
20
|
+
| ✅ OpenCode Plugin | v0.2.0 | 8 个工具,AI Agent 直接操作 specops 状态 |
|
|
21
|
+
| ⏳ Pipeline 编排 | Phase 3 | discuss→plan→execute→verify 全自动 |
|
|
22
|
+
| ⏳ Web 看板 | Phase 4 | WebSocket + 实时看板 UI |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 快速开始
|
|
27
|
+
|
|
28
|
+
### CLI 模式
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 安装依赖
|
|
32
|
+
cd kanban/v1
|
|
33
|
+
npm install
|
|
34
|
+
|
|
35
|
+
# 初始化新项目
|
|
36
|
+
npx tsx src/cli.ts new-project -p my-project
|
|
37
|
+
|
|
38
|
+
# 启动单个 Agent(默认分析阶段)
|
|
39
|
+
npx tsx src/cli.ts start -p my-project
|
|
40
|
+
|
|
41
|
+
# 启动 3 个 Agent(Supervisor 模式)
|
|
42
|
+
npx tsx src/cli.ts start -p my-project -n 3
|
|
43
|
+
|
|
44
|
+
# 查看状态
|
|
45
|
+
npx tsx src/cli.ts status
|
|
46
|
+
|
|
47
|
+
# 恢复中断的流转
|
|
48
|
+
npx tsx src/cli.ts resume
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Plugin 模式(OpenCode)
|
|
52
|
+
|
|
53
|
+
SpecOps 同时是一个 OpenCode Plugin。安装后,AI Agent 可以在 OpenCode 中直接调用 specops 工具,无需手动执行 CLI。
|
|
54
|
+
|
|
55
|
+
在项目的 `.opencode/config.json` 中添加:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"plugins": {
|
|
60
|
+
"specops": {
|
|
61
|
+
"type": "local",
|
|
62
|
+
"path": "/path/to/kanban/v1"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
加载后,Agent 可直接调用 `specops_status`、`specops_advance` 等 8 个工具。详见下方「Plugin 工具」章节。
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Plugin 工具
|
|
73
|
+
|
|
74
|
+
SpecOps 作为 OpenCode Plugin 暴露 8 个工具,供 AI Agent 在对话中直接调用:
|
|
75
|
+
|
|
76
|
+
| 工具名 | 功能 | 参数 |
|
|
77
|
+
|--------|------|------|
|
|
78
|
+
| `specops_status` | 获取项目当前状态(项目名、阶段、Agent 表格) | 无 |
|
|
79
|
+
| `specops_advance` | 推进指定 Agent 到下一个阶段 | `agent_id`(可选) |
|
|
80
|
+
| `specops_new_project` | 创建新项目,初始化 `.specops/state.json` | `project_name` |
|
|
81
|
+
| `specops_update_operation` | 更新 Agent 的当前操作描述和使用的工具 | `agent_id`, `operation`, `skill` |
|
|
82
|
+
| `specops_register_agent` | 注册新 Agent 到状态系统 | `agent_id`, `parent_id`(可选), `phase`(可选) |
|
|
83
|
+
| `specops_deregister_agent` | 从状态系统注销 Agent | `agent_id` |
|
|
84
|
+
| `specops_progress` | 显示详细进度(完成百分比、阶段分布、Agent 详情) | 无 |
|
|
85
|
+
| `specops_quick` | 快速任务模式,跳过完整 Pipeline 直接执行 | `task` |
|
|
86
|
+
|
|
87
|
+
Plugin 入口文件:`src/plugin.ts`,通过 `@opencode-ai/plugin` SDK 注册工具。
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## CLI 命令详解
|
|
92
|
+
|
|
93
|
+
SpecOps CLI 共 18 个命令(含 help),覆盖项目初始化、状态管理、Pipeline 编排、Agent 注册等完整工作流。
|
|
94
|
+
|
|
95
|
+
| 命令 | 说明 |
|
|
96
|
+
|------|------|
|
|
97
|
+
| `start` | 启动 Agent 工作流状态轮转 |
|
|
98
|
+
| `status` | 查看 Agent 当前状态 |
|
|
99
|
+
| `resume` | 恢复中断的 Agent 流转 |
|
|
100
|
+
| `advance` | 推进指定 Agent 到下一个阶段 |
|
|
101
|
+
| `update-operation` | 更新指定 Agent 的当前操作描述 |
|
|
102
|
+
| `register` | 注册外部 Agent 到 state.json |
|
|
103
|
+
| `deregister` | 从 state.json 注销指定 Agent |
|
|
104
|
+
| `new-project` | 初始化新项目,创建 `.specops/` 目录和初始状态 |
|
|
105
|
+
| `init` | 初始化项目,将 skill 和 agent 配置复制到 `.opencode/` |
|
|
106
|
+
| `discuss` | 进入讨论阶段,收集需求和讨论方案 |
|
|
107
|
+
| `plan` | 进入规划阶段,分解任务和制定计划 |
|
|
108
|
+
| `execute` | 进入执行阶段,执行具体任务 |
|
|
109
|
+
| `verify` | 进入验证阶段,验证成果和运行测试 |
|
|
110
|
+
| `analyze` | 分析输入(需求文本、GitHub URL、网站 URL) |
|
|
111
|
+
| `progress` | 显示详细项目进度(阶段分布、完成百分比) |
|
|
112
|
+
| `quick` | 快速任务模式,不走完整 Pipeline |
|
|
113
|
+
| `stop` | 停止引擎,清理所有 Actor |
|
|
114
|
+
| `help` | 显示帮助信息 |
|
|
115
|
+
|
|
116
|
+
### `specops start` — 启动 Agent 状态轮转
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
npx tsx src/cli.ts start [选项]
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
| 选项 | 说明 | 默认值 |
|
|
123
|
+
|------|------|--------|
|
|
124
|
+
| `-p, --project <name>` | 项目名称 | `default` |
|
|
125
|
+
| `-n, --agents <count>` | Agent 数量 | `1` |
|
|
126
|
+
|
|
127
|
+
**示例:**
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# 单 Agent 模式
|
|
131
|
+
npx tsx src/cli.ts start -p my-saas
|
|
132
|
+
|
|
133
|
+
# 输出:
|
|
134
|
+
# 🚀 启动 Kanban Agent 引擎
|
|
135
|
+
# 项目: my-saas
|
|
136
|
+
# Agent 数量: 1
|
|
137
|
+
#
|
|
138
|
+
# [agent_V1StGXR8] Agent 已启动
|
|
139
|
+
# [agent_V1StGXR8] 需求分析 → 竞品分析
|
|
140
|
+
# [agent_V1StGXR8] 竞品分析 → 功能分析
|
|
141
|
+
# [agent_V1StGXR8] 功能分析 → 技术选型
|
|
142
|
+
# [agent_V1StGXR8] 技术选型 → completed
|
|
143
|
+
#
|
|
144
|
+
# ✅ Agent agent_V1StGXR8 已完成全部阶段
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# 多 Agent 模式(自动使用 Supervisor)
|
|
149
|
+
npx tsx src/cli.ts start -p my-saas -n 3
|
|
150
|
+
|
|
151
|
+
# 输出:
|
|
152
|
+
# 🚀 启动 Kanban Agent 引擎
|
|
153
|
+
# 项目: my-saas
|
|
154
|
+
# Agent 数量: 3
|
|
155
|
+
#
|
|
156
|
+
# [agent_8f3kQ2Mx] Supervisor 已启动
|
|
157
|
+
# [agent_8f3kQ2Mx] 派发子 Agent: agent_Pn1xYz4W
|
|
158
|
+
# [agent_8f3kQ2Mx] 派发子 Agent: agent_Kj7mBv9R
|
|
159
|
+
# [agent_8f3kQ2Mx] 派发子 Agent: agent_Qs5tNw2L
|
|
160
|
+
# [agent_Pn1xYz4W] 需求分析 → 竞品分析
|
|
161
|
+
# [agent_Kj7mBv9R] 需求分析 → 竞品分析
|
|
162
|
+
# ...
|
|
163
|
+
# ✅ 所有 3 个 Agent 已完成
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### `specops status` — 查看当前状态
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
npx tsx src/cli.ts status
|
|
170
|
+
|
|
171
|
+
# 输出:
|
|
172
|
+
# 📊 项目状态: my-saas
|
|
173
|
+
# 当前阶段: completed
|
|
174
|
+
# 版本: 13
|
|
175
|
+
# 更新时间: 2026-02-25T10:30:00.000Z
|
|
176
|
+
#
|
|
177
|
+
# Agent ID | 阶段 | 操作 | 工具
|
|
178
|
+
# --------------------------------------------------------------------------------
|
|
179
|
+
# agent_V1StGXR8 | completed | - | -
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### `specops resume` — 恢复中断的流转
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
npx tsx src/cli.ts resume
|
|
186
|
+
|
|
187
|
+
# 如果有未完成的 Agent,从断点继续执行
|
|
188
|
+
# 输出:
|
|
189
|
+
# 🔄 恢复引擎执行
|
|
190
|
+
# 项目: my-saas
|
|
191
|
+
# 未完成 Agent: 1
|
|
192
|
+
#
|
|
193
|
+
# [agent_V1StGXR8] 从 竞品分析 恢复
|
|
194
|
+
# [agent_V1StGXR8] 竞品分析 → 功能分析
|
|
195
|
+
# ...
|
|
196
|
+
# ✅ 恢复完成,所有 Agent 已完成
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 质量工具
|
|
202
|
+
|
|
203
|
+
### 技术偏移检测 — `tech-guard`
|
|
204
|
+
|
|
205
|
+
检测代码是否偏离了 TECH-CONTEXT.md 中锁定的技术决策。
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
npx tsx scripts/tech-guard.ts
|
|
209
|
+
|
|
210
|
+
# 输出:
|
|
211
|
+
# 🔍 技术偏移检测报告
|
|
212
|
+
# ==================================================
|
|
213
|
+
# 状态: ✅ PASS
|
|
214
|
+
# 检查项: 4 项(通过 4,失败 0)
|
|
215
|
+
#
|
|
216
|
+
# ✅ 未批准依赖
|
|
217
|
+
# ✅ tsconfig 关键配置
|
|
218
|
+
# ✅ 禁止代码模式
|
|
219
|
+
# ✅ 导入路径 .js 后缀
|
|
220
|
+
#
|
|
221
|
+
# --- JSON 报告 ---
|
|
222
|
+
# { "timestamp": "...", "status": "PASS", ... }
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**检查项说明:**
|
|
226
|
+
|
|
227
|
+
| 检查项 | 检测内容 |
|
|
228
|
+
|--------|----------|
|
|
229
|
+
| 未批准依赖 | package.json 中出现了 TECH-CONTEXT.md 快照之外的新包 |
|
|
230
|
+
| tsconfig 关键配置 | target/module/moduleResolution/strict 被修改 |
|
|
231
|
+
| 禁止代码模式 | `as any`、`@ts-ignore`、`@ts-expect-error`、XState v4 API |
|
|
232
|
+
| 导入路径 .js 后缀 | 相对导入缺少 `.js` 后缀(ESM 要求) |
|
|
233
|
+
|
|
234
|
+
### 验收测试运行器 — `acceptance runner`
|
|
235
|
+
|
|
236
|
+
串联所有质量检查,生成验收报告。
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
npx tsx src/acceptance/runner.ts --phase 01-state-engine
|
|
240
|
+
|
|
241
|
+
# 输出:
|
|
242
|
+
# 🔍 验收测试运行器
|
|
243
|
+
# ==================================================
|
|
244
|
+
# 阶段: 01-state-engine
|
|
245
|
+
#
|
|
246
|
+
# 📋 运行 E2E 测试...
|
|
247
|
+
# ✅ E2E 测试
|
|
248
|
+
# 📋 运行单元测试...
|
|
249
|
+
# ✅ 单元测试
|
|
250
|
+
# 📋 运行 TypeScript 编译检查...
|
|
251
|
+
# ✅ TypeScript 编译
|
|
252
|
+
# 📋 运行技术偏移检测...
|
|
253
|
+
# ✅ 技术偏移检测
|
|
254
|
+
# 📋 运行偷懒检测...
|
|
255
|
+
# ✅ 偷懒检测
|
|
256
|
+
#
|
|
257
|
+
# 📄 报告已写入: .planning/phases/01-state-engine/ACCEPTANCE.md
|
|
258
|
+
#
|
|
259
|
+
# ==================================================
|
|
260
|
+
# 状态: ✅ PASS
|
|
261
|
+
# 检查项: 5 项(通过 5,失败 0)
|
|
262
|
+
# 总耗时: 12345ms
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**验收检查清单:**
|
|
266
|
+
|
|
267
|
+
| 步骤 | 说明 |
|
|
268
|
+
|------|------|
|
|
269
|
+
| E2E 测试 | 运行 `vitest.config.e2e.ts` 配置的端到端测试 |
|
|
270
|
+
| 单元测试 | 运行所有 `.test.ts` 单元测试 |
|
|
271
|
+
| TypeScript 编译 | `tsc --noEmit` 检查类型安全 |
|
|
272
|
+
| 技术偏移检测 | 调用 `tech-guard.ts` 脚本 |
|
|
273
|
+
| 偷懒检测 | 扫描测试文件中的低质量模式 |
|
|
274
|
+
|
|
275
|
+
### 偷懒检测说明
|
|
276
|
+
|
|
277
|
+
偷懒检测器(lazyDetector)扫描测试文件中的以下模式:
|
|
278
|
+
|
|
279
|
+
| 类型 | 示例 | 说明 |
|
|
280
|
+
|------|------|------|
|
|
281
|
+
| `trivial-assertion` | `expect(true).toBe(true)` | 无意义的断言,不验证任何逻辑 |
|
|
282
|
+
| `no-assertions` | `test('xxx', () => { /* 没有 expect */ })` | 测试块中没有断言 |
|
|
283
|
+
| `excessive-mocks` | 单文件超过 5 个 `vi.mock`/`vi.spyOn` | mock 过多,可能没测到真实逻辑 |
|
|
284
|
+
|
|
285
|
+
### 上下文注入 — `context` 模块
|
|
286
|
+
|
|
287
|
+
自动从 TECH-CONTEXT.md 加载技术约束,生成 Executor Agent prompt。
|
|
288
|
+
|
|
289
|
+
**核心功能:**
|
|
290
|
+
|
|
291
|
+
| 函数 | 说明 |
|
|
292
|
+
|------|------|
|
|
293
|
+
| `loadTechContext(filePath?)` | 加载并解析 TECH-CONTEXT.md,返回结构化 `TechContext` |
|
|
294
|
+
| `generateExecutorPrompt(context, task)` | 基于技术上下文生成 Executor Agent 完整 prompt |
|
|
295
|
+
|
|
296
|
+
**loadTechContext 解析内容:**
|
|
297
|
+
|
|
298
|
+
| 字段 | 来源 | 示例 |
|
|
299
|
+
|------|------|------|
|
|
300
|
+
| `lockedDependencies` | "锁定依赖" 表格 | `{ "xstate": "^5.28.0", ... }` |
|
|
301
|
+
| `forbiddenPatterns` | "禁止模式" 表格 | `["as any", "@ts-ignore", ...]` |
|
|
302
|
+
| `codingConventions` | "编码约定" 列表 | `["使用 Record<K, V> 代替 Map", ...]` |
|
|
303
|
+
| `projectStructure` | "项目结构" 代码块 | 目录树字符串 |
|
|
304
|
+
|
|
305
|
+
**使用示例:**
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
import { loadTechContext, generateExecutorPrompt } from './context/index.js'
|
|
309
|
+
|
|
310
|
+
// 加载技术上下文(TECH-CONTEXT.md 不存在时返回 null)
|
|
311
|
+
const techContext = loadTechContext()
|
|
312
|
+
|
|
313
|
+
// 生成 Executor Agent prompt
|
|
314
|
+
const prompt = generateExecutorPrompt(techContext, '实现用户登录功能')
|
|
315
|
+
console.log(prompt)
|
|
316
|
+
// 输出:
|
|
317
|
+
// ## 技术约束(不可违反)
|
|
318
|
+
// ### 锁定技术栈
|
|
319
|
+
// - xstate: ^5.28.0
|
|
320
|
+
// - write-file-atomic: ^7.0.0
|
|
321
|
+
// ...
|
|
322
|
+
// ### 禁止行为
|
|
323
|
+
// - as any
|
|
324
|
+
// - @ts-ignore
|
|
325
|
+
// ...
|
|
326
|
+
// ### 编码约定
|
|
327
|
+
// - 使用 Record<K, V> 代替 Map
|
|
328
|
+
// ...
|
|
329
|
+
// ## 当前任务
|
|
330
|
+
// 实现用户登录功能
|
|
331
|
+
// ## 验收要求
|
|
332
|
+
// - 所有新增代码必须通过 TypeScript 编译(strict mode)
|
|
333
|
+
// - 禁止引入未批准的依赖
|
|
334
|
+
// - 测试覆盖所有新增功能的核心路径
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
**注意:** TECH-CONTEXT.md 不存在时,`loadTechContext` 返回 `null` 并输出 warning,不会阻塞引擎启动。`generateExecutorPrompt` 在 context 为 null 时只输出任务部分。
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 验收配置
|
|
342
|
+
|
|
343
|
+
配置文件:`.specops/acceptance.config.json`
|
|
344
|
+
|
|
345
|
+
```json
|
|
346
|
+
{
|
|
347
|
+
"agent": {
|
|
348
|
+
"model": "claude-sonnet-4-20250514",
|
|
349
|
+
"maxRetries": 3,
|
|
350
|
+
"strictness": "normal"
|
|
351
|
+
},
|
|
352
|
+
"tests": {
|
|
353
|
+
"e2eDir": "src/__e2e__",
|
|
354
|
+
"unitDir": "src",
|
|
355
|
+
"timeout": 30000
|
|
356
|
+
},
|
|
357
|
+
"lazyDetection": {
|
|
358
|
+
"maxMocksPerFile": 5,
|
|
359
|
+
"forbiddenPatterns": [
|
|
360
|
+
"expect(true).toBe(true)",
|
|
361
|
+
"expect(false).toBe(false)",
|
|
362
|
+
"expect(1).toBe(1)"
|
|
363
|
+
]
|
|
364
|
+
},
|
|
365
|
+
"techGuard": {
|
|
366
|
+
"enabled": true,
|
|
367
|
+
"scriptPath": "scripts/tech-guard.ts"
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
| 字段 | 说明 |
|
|
373
|
+
|------|------|
|
|
374
|
+
| `agent.model` | 验收 Agent 使用的 LLM 模型 |
|
|
375
|
+
| `agent.maxRetries` | 验收失败后最多重试次数 |
|
|
376
|
+
| `agent.strictness` | 严格程度:`strict` / `normal` / `lenient` |
|
|
377
|
+
| `lazyDetection.maxMocksPerFile` | 单文件最大 mock 数量 |
|
|
378
|
+
| `lazyDetection.forbiddenPatterns` | 自定义的禁止断言模式 |
|
|
379
|
+
| `techGuard.enabled` | 是否启用技术偏移检测 |
|
|
380
|
+
|
|
381
|
+
---
|
|
382
|
+
|
|
383
|
+
## 测试
|
|
384
|
+
|
|
385
|
+
```bash
|
|
386
|
+
# 运行所有单元测试
|
|
387
|
+
npx vitest run
|
|
388
|
+
|
|
389
|
+
# 运行 E2E 测试
|
|
390
|
+
npx vitest run --config vitest.config.e2e.ts
|
|
391
|
+
|
|
392
|
+
# 监听模式
|
|
393
|
+
npx vitest
|
|
394
|
+
|
|
395
|
+
# 运行指定测试文件
|
|
396
|
+
npx vitest run src/machines/agentMachine.test.ts
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**测试统计:** 9 个文件,91 个测试
|
|
400
|
+
|
|
401
|
+
| 测试文件 | 测试数 | 说明 |
|
|
402
|
+
|----------|--------|------|
|
|
403
|
+
| `agentMachine.test.ts` | 12 | Agent 状态机:默认阶段 + SpecOps 阶段 + 自定义阶段 |
|
|
404
|
+
| `supervisorMachine.test.ts` | 7 | Supervisor:spawn/stop/生命周期 |
|
|
405
|
+
| `stateFile.test.ts` | 8 | 持久化:原子写入 + 乐观锁 |
|
|
406
|
+
| `tech-guard.test.ts` | 21 | 技术偏移:依赖/配置/代码模式/导入路径 |
|
|
407
|
+
| `lazyDetector.test.ts` | 14 | 偷懒检测:trivial/无断言/过多mock |
|
|
408
|
+
| `reporter.test.ts` | 5 | 报告生成:PASS/FAIL 格式 |
|
|
409
|
+
| `runner.test.ts` | 11 | 验收运行器:配置加载/命令执行/报告构建 |
|
|
410
|
+
| `techContextLoader.test.ts` | 7 | 技术上下文加载:解析依赖/禁止模式/编码约定 |
|
|
411
|
+
| `promptTemplate.test.ts` | 6 | Prompt 模板:完整/无上下文/验收要求 |
|
|
412
|
+
| `01-state-engine.e2e.test.ts` | 4 | Phase 1 端到端:四阶段流转/多Agent/状态文件/Supervisor |
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## 核心概念
|
|
417
|
+
|
|
418
|
+
### 可配置的阶段序列
|
|
419
|
+
|
|
420
|
+
状态机支持任意阶段序列,不只是硬编码的 4 个分析阶段。
|
|
421
|
+
|
|
422
|
+
```typescript
|
|
423
|
+
import { createAgentMachine } from './machines/agentMachine.js'
|
|
424
|
+
import { ANALYSIS_PHASES, PIPELINE_PHASES } from './types/index.js'
|
|
425
|
+
|
|
426
|
+
// 1. 默认分析阶段:需求分析 → 竞品分析 → 功能分析 → 技术选型
|
|
427
|
+
const analysisMachine = createAgentMachine(ANALYSIS_PHASES)
|
|
428
|
+
|
|
429
|
+
// 2. SpecOps Pipeline 阶段:讨论 → 规划 → 执行 → 验证
|
|
430
|
+
const pipelineMachine = createAgentMachine(PIPELINE_PHASES)
|
|
431
|
+
|
|
432
|
+
// 3. 自定义阶段:任意字符串数组
|
|
433
|
+
const customMachine = createAgentMachine(['research', 'design', 'implement', 'review'])
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
**预定义阶段:**
|
|
437
|
+
|
|
438
|
+
| 常量 | 阶段 | 用途 |
|
|
439
|
+
|------|------|------|
|
|
440
|
+
| `ANALYSIS_PHASES` | demand_analysis → competitor_analysis → feature_analysis → tech_selection | Agent 分析工作流 |
|
|
441
|
+
| `PIPELINE_PHASES` | discuss → plan → execute → verify | SpecOps 自动编排流程 |
|
|
442
|
+
|
|
443
|
+
### 状态机流转
|
|
444
|
+
|
|
445
|
+
```
|
|
446
|
+
idle → [阶段1] → [阶段2] → ... → [阶段N] → completed
|
|
447
|
+
│ │ │
|
|
448
|
+
│ UPDATE_OPERATION │
|
|
449
|
+
│ (更新操作/工具信息) │
|
|
450
|
+
│ │
|
|
451
|
+
└── START ──→ PHASE_COMPLETE ──→ ... ──→ PHASE_COMPLETE
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
- `START` 事件:从 idle 进入第一个阶段
|
|
455
|
+
- `PHASE_COMPLETE` 事件:推进到下一个阶段
|
|
456
|
+
- `UPDATE_OPERATION` 事件:更新当前操作描述和使用的工具
|
|
457
|
+
- 到达最后一个阶段后 `PHASE_COMPLETE` → `completed`(final 状态)
|
|
458
|
+
|
|
459
|
+
### 状态文件
|
|
460
|
+
|
|
461
|
+
运行后生成 `.specops/state.json`:
|
|
462
|
+
|
|
463
|
+
```json
|
|
464
|
+
{
|
|
465
|
+
"version": 5,
|
|
466
|
+
"updatedAt": "2026-02-25T10:30:00.000Z",
|
|
467
|
+
"project": {
|
|
468
|
+
"name": "my-project",
|
|
469
|
+
"currentPhase": "completed"
|
|
470
|
+
},
|
|
471
|
+
"agents": {
|
|
472
|
+
"agent_V1StGXR8": {
|
|
473
|
+
"agentId": "agent_V1StGXR8",
|
|
474
|
+
"parentId": null,
|
|
475
|
+
"childIds": [],
|
|
476
|
+
"phase": "completed",
|
|
477
|
+
"currentOperation": "",
|
|
478
|
+
"currentSkill": ""
|
|
479
|
+
}
|
|
480
|
+
},
|
|
481
|
+
"machineSnapshot": null
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
## 项目结构
|
|
488
|
+
|
|
489
|
+
```
|
|
490
|
+
kanban/v1/
|
|
491
|
+
├── package.json # 项目配置
|
|
492
|
+
├── tsconfig.json # TypeScript 配置
|
|
493
|
+
├── vitest.config.ts # 单元测试配置
|
|
494
|
+
├── vitest.config.e2e.ts # E2E 测试配置
|
|
495
|
+
├── bin/
|
|
496
|
+
│ └── specops.js # CLI 可执行入口
|
|
497
|
+
├── scripts/
|
|
498
|
+
│ ├── tech-guard.ts # 技术偏移检测脚本
|
|
499
|
+
│ └── tech-guard.test.ts # 偏移检测测试
|
|
500
|
+
├── src/
|
|
501
|
+
│ ├── cli.ts # CLI 入口(18 个命令)
|
|
502
|
+
│ ├── engine.ts # 引擎编排层
|
|
503
|
+
│ ├── plugin.ts # OpenCode Plugin 入口
|
|
504
|
+
│ ├── plugin-engine.ts # Plugin 专用引擎层
|
|
505
|
+
│ ├── init.ts # 项目初始化(.opencode/ 配置)
|
|
506
|
+
│ ├── types/
|
|
507
|
+
│ │ └── index.ts # 类型定义(PHASES、AgentContext 等)
|
|
508
|
+
│ ├── machines/
|
|
509
|
+
│ │ ├── agentMachine.ts # Agent 状态机(工厂函数)
|
|
510
|
+
│ │ ├── agentMachine.test.ts
|
|
511
|
+
│ │ ├── supervisorMachine.ts # Supervisor 状态机
|
|
512
|
+
│ │ └── supervisorMachine.test.ts
|
|
513
|
+
│ ├── persistence/
|
|
514
|
+
│ │ ├── schema.ts # 状态文件 Zod schema
|
|
515
|
+
│ │ ├── stateFile.ts # 原子写入 + 乐观锁
|
|
516
|
+
│ │ └── stateFile.test.ts
|
|
517
|
+
│ ├── acceptance/
|
|
518
|
+
│ │ ├── types.ts # 验收相关类型
|
|
519
|
+
│ │ ├── runner.ts # 验收运行器
|
|
520
|
+
│ │ ├── runner.test.ts
|
|
521
|
+
│ │ ├── reporter.ts # 报告生成器
|
|
522
|
+
│ │ ├── reporter.test.ts
|
|
523
|
+
│ │ ├── lazyDetector.ts # 偷懒检测
|
|
524
|
+
│ │ └── lazyDetector.test.ts
|
|
525
|
+
│ ├── context/
|
|
526
|
+
│ │ ├── index.ts # 上下文模块导出
|
|
527
|
+
│ │ ├── techContextLoader.ts # TECH-CONTEXT.md 加载/解析
|
|
528
|
+
│ │ ├── techContextLoader.test.ts
|
|
529
|
+
│ │ ├── promptTemplate.ts # Executor Agent prompt 模板
|
|
530
|
+
│ │ └── promptTemplate.test.ts
|
|
531
|
+
│ ├── __e2e__/
|
|
532
|
+
│ │ └── 01-state-engine.e2e.test.ts # Phase 1 E2E 测试
|
|
533
|
+
│ └── utils/
|
|
534
|
+
│ └── id.ts # Agent ID 生成(nanoid)
|
|
535
|
+
└── .specops/
|
|
536
|
+
└── state.json # 运行时状态(git忽略)
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
## 技术栈
|
|
542
|
+
|
|
543
|
+
| 技术 | 版本 | 用途 |
|
|
544
|
+
|------|------|------|
|
|
545
|
+
| XState | ^5.28.0 | 状态机引擎 + Actor 模型 |
|
|
546
|
+
| TypeScript | ^5.5.0 | 类型系统(strict mode) |
|
|
547
|
+
| Commander | ^13.0.0 | CLI 命令行解析 |
|
|
548
|
+
| Zod | ^3.23.0 | 运行时类型校验 |
|
|
549
|
+
| nanoid | ^5.0.0 | Agent ID 生成 |
|
|
550
|
+
| write-file-atomic | ^7.0.0 | JSON 原子写入 |
|
|
551
|
+
| @opencode-ai/plugin | ^1.2.6 | OpenCode Plugin SDK |
|
|
552
|
+
| vitest | ^3.0.0 | 测试框架 |
|
|
553
|
+
| tsx | ^4.0.0 | TypeScript 直接执行 |
|
|
554
|
+
|
|
555
|
+
**编码约定:**
|
|
556
|
+
- ESM(`type: module`)
|
|
557
|
+
- `Record<K,V>` 代替 `Map`
|
|
558
|
+
- XState v5 `setup()` API
|
|
559
|
+
- 中文注释和文档
|
|
560
|
+
- 2 空格缩进
|
|
561
|
+
|
|
562
|
+
---
|
|
563
|
+
|
|
564
|
+
## 版本记录
|
|
565
|
+
|
|
566
|
+
### v0.2.0 — Plugin 模式 + CI/CD
|
|
567
|
+
|
|
568
|
+
- 新增 OpenCode Plugin 模式:specops 可作为 OpenCode Plugin 加载,AI Agent 直接调用 8 个工具操作项目状态
|
|
569
|
+
- Plugin 入口 `src/plugin.ts`,基于 `@opencode-ai/plugin` SDK
|
|
570
|
+
- Plugin 专用引擎层 `src/plugin-engine.ts`,适配 Plugin 上下文
|
|
571
|
+
- 新增 `init` 命令:将 skill 和 agent 配置复制到目标项目的 `.opencode/` 目录
|
|
572
|
+
- CLI 扩展至 18 个命令(新增 advance, update-operation, register, deregister, discuss, plan, execute, verify, analyze, progress, quick, init, stop)
|
|
573
|
+
- `bin/specops.js` 可执行入口,支持 `npx specops` 直接调用
|
|
574
|
+
|
|
575
|
+
### v0.1.0 — Phase 1 + Phase 2 完成
|
|
576
|
+
|
|
577
|
+
**Phase 1: 状态轮转引擎** ✅
|
|
578
|
+
|
|
579
|
+
| 提交 | 说明 |
|
|
580
|
+
|------|------|
|
|
581
|
+
| `e857e5f` ~ `13cfa2d` | 项目骨架 + Agent 状态机(TDD) |
|
|
582
|
+
| `2fbb690` ~ `e0789a4` | 持久化层 + Supervisor 状态机(TDD) |
|
|
583
|
+
| `640bc09` ~ `47a382f` | CLI 入口 + 引擎编排层 |
|
|
584
|
+
| `2a8d297` | 修复多 Agent 乐观锁并发冲突 |
|
|
585
|
+
|
|
586
|
+
- 实现 6 状态 Agent 状态机(idle + 4 分析阶段 + completed)
|
|
587
|
+
- Supervisor 模式管理多子 Agent 生命周期
|
|
588
|
+
- JSON 文件原子写入 + 版本号乐观锁
|
|
589
|
+
- CLI 三命令:start / status / resume
|
|
590
|
+
- 21 个单元测试
|
|
591
|
+
|
|
592
|
+
**Phase 2: 质量基础设施** ✅
|
|
593
|
+
|
|
594
|
+
| 提交 | 说明 |
|
|
595
|
+
|------|------|
|
|
596
|
+
| `dc29923` | Roadmap 重构(11 phases),解决 6 个 SpecOps 痛点 |
|
|
597
|
+
| `d5efc13` | TECH-CONTEXT + 偏移检测 + 验收框架 + E2E 测试 |
|
|
598
|
+
| `75f776f` | PHASES 泛化:状态机支持任意阶段序列 |
|
|
599
|
+
| `e15fc8f` | README.md 完整中文文档 |
|
|
600
|
+
| `4863f65` | Executor Agent 上下文注入 + context 模块 |
|
|
601
|
+
|
|
602
|
+
- 创建 TECH-CONTEXT.md 锁定全部技术决策
|
|
603
|
+
- tech-guard.ts 技术偏移检测(4 项检查)
|
|
604
|
+
- 验收 Agent 框架(runner + reporter + lazyDetector)
|
|
605
|
+
- Phase 1 回溯 E2E 测试(4 个用例覆盖全部 SC)
|
|
606
|
+
- PHASES 泛化:支持 SpecOps Pipeline 阶段 + 自定义阶段
|
|
607
|
+
- 上下文注入模块:techContextLoader + promptTemplate + engine 集成
|
|
608
|
+
- 91 个测试(单元 87 + E2E 4)
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## 路线图
|
|
613
|
+
|
|
614
|
+
详见 [.planning/ROADMAP.md](../../.planning/ROADMAP.md)
|
|
615
|
+
|
|
616
|
+
```
|
|
617
|
+
Phase 1 ✅ 状态轮转引擎
|
|
618
|
+
Phase 2 ✅ 质量基础设施(验收 Agent + 技术守护 + 上下文注入)
|
|
619
|
+
Phase 3 ⏳ Pipeline 自动编排(discuss→plan→execute→verify)
|
|
620
|
+
Phase 4 ⏳ WebSocket 广播 + Web 看板
|
|
621
|
+
Phase 5 ⏳ 竞品搜索 Skill
|
|
622
|
+
Phase 6 ⏳ 代码搜索 Skills
|
|
623
|
+
Phase 7 ⏳ 需求分析模块
|
|
624
|
+
Phase 8 ⏳ 深度分析 + 技术选型
|
|
625
|
+
Phase 9 ⏳ 多入口编排
|
|
626
|
+
Phase 10 ⏳ SpecOps 文档生成
|
|
627
|
+
Phase 11 ⏳ 全流程集成测试
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
详细变更历史请看 [CHANGELOG.md](./CHANGELOG.md)
|