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.
Files changed (74) hide show
  1. package/README.md +630 -0
  2. package/bin/install.js +2089 -0
  3. package/bin/specops.js +35 -0
  4. package/dist/__e2e__/01-state-engine.e2e.test.d.ts +10 -0
  5. package/dist/__e2e__/01-state-engine.e2e.test.js +1 -0
  6. package/dist/acceptance/lazyDetector.d.ts +10 -0
  7. package/dist/acceptance/lazyDetector.js +1 -0
  8. package/dist/acceptance/lazyDetector.test.d.ts +1 -0
  9. package/dist/acceptance/lazyDetector.test.js +1 -0
  10. package/dist/acceptance/reporter.d.ts +12 -0
  11. package/dist/acceptance/reporter.js +1 -0
  12. package/dist/acceptance/reporter.test.d.ts +1 -0
  13. package/dist/acceptance/reporter.test.js +1 -0
  14. package/dist/acceptance/runner.d.ts +26 -0
  15. package/dist/acceptance/runner.js +2 -0
  16. package/dist/acceptance/runner.test.d.ts +1 -0
  17. package/dist/acceptance/runner.test.js +1 -0
  18. package/dist/acceptance/types.d.ts +44 -0
  19. package/dist/acceptance/types.js +1 -0
  20. package/dist/cli.d.ts +2 -0
  21. package/dist/cli.js +2 -0
  22. package/dist/context/index.d.ts +2 -0
  23. package/dist/context/index.js +1 -0
  24. package/dist/context/promptTemplate.d.ts +2 -0
  25. package/dist/context/promptTemplate.js +1 -0
  26. package/dist/context/promptTemplate.test.d.ts +1 -0
  27. package/dist/context/promptTemplate.test.js +1 -0
  28. package/dist/context/techContextLoader.d.ts +2 -0
  29. package/dist/context/techContextLoader.js +1 -0
  30. package/dist/context/techContextLoader.test.d.ts +1 -0
  31. package/dist/context/techContextLoader.test.js +1 -0
  32. package/dist/engine.d.ts +35 -0
  33. package/dist/engine.js +1 -0
  34. package/dist/evolution/distiller.d.ts +22 -0
  35. package/dist/evolution/distiller.js +1 -0
  36. package/dist/evolution/index.d.ts +8 -0
  37. package/dist/evolution/index.js +1 -0
  38. package/dist/evolution/memoryGraph.d.ts +34 -0
  39. package/dist/evolution/memoryGraph.js +1 -0
  40. package/dist/evolution/selector.d.ts +30 -0
  41. package/dist/evolution/selector.js +1 -0
  42. package/dist/evolution/signals.d.ts +18 -0
  43. package/dist/evolution/signals.js +1 -0
  44. package/dist/evolution/solidify.d.ts +20 -0
  45. package/dist/evolution/solidify.js +1 -0
  46. package/dist/evolution/store.d.ts +37 -0
  47. package/dist/evolution/store.js +1 -0
  48. package/dist/evolution/types.d.ts +350 -0
  49. package/dist/evolution/types.js +1 -0
  50. package/dist/init.d.ts +19 -0
  51. package/dist/init.js +1 -0
  52. package/dist/machines/agentMachine.d.ts +57 -0
  53. package/dist/machines/agentMachine.js +1 -0
  54. package/dist/machines/agentMachine.test.d.ts +1 -0
  55. package/dist/machines/agentMachine.test.js +1 -0
  56. package/dist/machines/supervisorMachine.d.ts +103 -0
  57. package/dist/machines/supervisorMachine.js +1 -0
  58. package/dist/machines/supervisorMachine.test.d.ts +1 -0
  59. package/dist/machines/supervisorMachine.test.js +1 -0
  60. package/dist/persistence/schema.d.ts +95 -0
  61. package/dist/persistence/schema.js +1 -0
  62. package/dist/persistence/stateFile.d.ts +17 -0
  63. package/dist/persistence/stateFile.js +1 -0
  64. package/dist/persistence/stateFile.test.d.ts +1 -0
  65. package/dist/persistence/stateFile.test.js +1 -0
  66. package/dist/plugin-engine.d.ts +42 -0
  67. package/dist/plugin-engine.js +1 -0
  68. package/dist/plugin.d.ts +9 -0
  69. package/dist/plugin.js +1 -0
  70. package/dist/types/index.d.ts +49 -0
  71. package/dist/types/index.js +1 -0
  72. package/dist/utils/id.d.ts +1 -0
  73. package/dist/utils/id.js +1 -0
  74. 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)