@coralai/sps-cli 0.8.1 → 0.9.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 (43) hide show
  1. package/README.md +820 -47
  2. package/dist/commands/doctor.d.ts.map +1 -1
  3. package/dist/commands/doctor.js +140 -1
  4. package/dist/commands/doctor.js.map +1 -1
  5. package/dist/commands/workerDashboard.d.ts +2 -0
  6. package/dist/commands/workerDashboard.d.ts.map +1 -0
  7. package/dist/commands/workerDashboard.js +415 -0
  8. package/dist/commands/workerDashboard.js.map +1 -0
  9. package/dist/core/state.d.ts +6 -0
  10. package/dist/core/state.d.ts.map +1 -1
  11. package/dist/core/state.js +1 -0
  12. package/dist/core/state.js.map +1 -1
  13. package/dist/engines/CloseoutEngine.d.ts +7 -0
  14. package/dist/engines/CloseoutEngine.d.ts.map +1 -1
  15. package/dist/engines/CloseoutEngine.js +85 -38
  16. package/dist/engines/CloseoutEngine.js.map +1 -1
  17. package/dist/engines/ExecutionEngine.d.ts +10 -2
  18. package/dist/engines/ExecutionEngine.d.ts.map +1 -1
  19. package/dist/engines/ExecutionEngine.js +46 -50
  20. package/dist/engines/ExecutionEngine.js.map +1 -1
  21. package/dist/engines/SchedulerEngine.d.ts +5 -0
  22. package/dist/engines/SchedulerEngine.d.ts.map +1 -1
  23. package/dist/engines/SchedulerEngine.js +15 -5
  24. package/dist/engines/SchedulerEngine.js.map +1 -1
  25. package/dist/interfaces/RepoBackend.d.ts +1 -0
  26. package/dist/interfaces/RepoBackend.d.ts.map +1 -1
  27. package/dist/interfaces/WorkerProvider.d.ts +16 -0
  28. package/dist/interfaces/WorkerProvider.d.ts.map +1 -1
  29. package/dist/main.js +12 -2
  30. package/dist/main.js.map +1 -1
  31. package/dist/providers/ClaudeWorkerProvider.d.ts +13 -3
  32. package/dist/providers/ClaudeWorkerProvider.d.ts.map +1 -1
  33. package/dist/providers/ClaudeWorkerProvider.js +21 -8
  34. package/dist/providers/ClaudeWorkerProvider.js.map +1 -1
  35. package/dist/providers/CodexWorkerProvider.d.ts +11 -1
  36. package/dist/providers/CodexWorkerProvider.d.ts.map +1 -1
  37. package/dist/providers/CodexWorkerProvider.js +19 -4
  38. package/dist/providers/CodexWorkerProvider.js.map +1 -1
  39. package/dist/providers/GitLabRepoBackend.d.ts +1 -0
  40. package/dist/providers/GitLabRepoBackend.d.ts.map +1 -1
  41. package/dist/providers/GitLabRepoBackend.js +36 -0
  42. package/dist/providers/GitLabRepoBackend.js.map +1 -1
  43. package/package.json +1 -1
package/README.md CHANGED
@@ -1,90 +1,863 @@
1
- # @coralai/sps-cli
1
+ # SPS CLI — AI 驱动的全自动开发流水线
2
2
 
3
- AI-driven development pipeline orchestrator. Automates the full development lifecycle from task creation to code merge and deployment.
3
+ [![npm](https://img.shields.io/npm/v/@coralai/sps-cli)](https://www.npmjs.com/package/@coralai/sps-cli)
4
4
 
5
- ## Install
5
+ SPS(Smart Pipeline System)是一套 AI Agent 驱动的全自动开发流水线 CLI 工具。从任务卡片创建到代码合并部署,全程无人值守。
6
+
7
+ ```
8
+ 创建卡片 → 启动 pipeline → AI 自动编码 → 自动创建 MR → 自动 merge → 通知完成
9
+ ```
10
+
11
+ ## 目录
12
+
13
+ - [安装](#安装)
14
+ - [前置条件](#前置条件)
15
+ - [快速开始](#快速开始)
16
+ - [状态机](#状态机)
17
+ - [命令参考](#命令参考)
18
+ - [sps setup](#sps-setup)
19
+ - [sps project init](#sps-project-init)
20
+ - [sps doctor](#sps-doctor)
21
+ - [sps card add](#sps-card-add)
22
+ - [sps tick](#sps-tick)
23
+ - [sps scheduler tick](#sps-scheduler-tick)
24
+ - [sps pipeline tick](#sps-pipeline-tick)
25
+ - [sps worker](#sps-worker)
26
+ - [sps pm](#sps-pm)
27
+ - [sps qa tick](#sps-qa-tick)
28
+ - [sps monitor tick](#sps-monitor-tick)
29
+ - [Worker 规则文件](#worker-规则文件)
30
+ - [项目配置](#项目配置)
31
+ - [多项目并行](#多项目并行)
32
+ - [架构概览](#架构概览)
33
+ - [目录结构](#目录结构)
34
+
35
+ ---
36
+
37
+ ## 安装
6
38
 
7
39
  ```bash
8
40
  npm install -g @coralai/sps-cli
9
41
  ```
10
42
 
11
- Requires Node.js >= 18.
43
+ 本地开发:
44
+
45
+ ```bash
46
+ cd coding-work-flow/workflow-cli
47
+ npm run build
48
+ # 或使用 tsx 直接运行
49
+ npx tsx src/main.ts --help
50
+ ```
51
+
52
+ ## 前置条件
53
+
54
+ | 依赖 | 最低版本 | 说明 |
55
+ |------|---------|------|
56
+ | Node.js | 18+ | CLI 运行环境 |
57
+ | git | 2.x | 分支与 worktree 管理 |
58
+ | tmux | 3.x | Worker 会话管理 |
59
+ | Claude Code CLI 或 Codex CLI | 最新 | AI Worker |
12
60
 
13
- ## Usage
61
+ ## 快速开始
14
62
 
15
63
  ```bash
16
- sps <command> [subcommand] <project> [options]
64
+ # 1. 全局环境初始化(首次使用,配置 GitLab/PM/通知凭据)
65
+ sps setup
66
+
67
+ # 2. 克隆业务仓库(前置条件)
68
+ git clone git@gitlab.example.com:team/my-project.git ~/projects/my-project
69
+
70
+ # 3. 初始化 SPS 项目管理目录
71
+ sps project init my-project
72
+
73
+ # 4. 编辑项目配置
74
+ vim ~/.projects/my-project/conf
75
+
76
+ # 5. 健康检查 + 自动修复(生成 CLAUDE.md、AGENTS.md、初始化 state.json 等)
77
+ sps doctor my-project --fix
78
+
79
+ # 6.(可选)编辑 Worker 规则,加入项目特有的编码规范
80
+ vim ~/projects/my-project/CLAUDE.md
81
+
82
+ # 7. 创建任务卡片
83
+ sps card add my-project "实现用户登录" "JWT 登录接口"
84
+ sps card add my-project "实现订单系统" "CRUD API + 分页"
85
+
86
+ # 8. 启动 pipeline(全自动,所有卡片完成后自动退出)
87
+ sps tick my-project
88
+
89
+ # 9.(可选)实时监控 Worker 运行状态
90
+ sps worker dashboard
91
+ ```
92
+
93
+ ---
94
+
95
+ ## 状态机
96
+
97
+ 每张任务卡片按以下状态机流转,全程由 SPS 自动驱动:
98
+
17
99
  ```
100
+ Planning → Backlog → Todo → Inprogress → QA → Done
101
+ ```
102
+
103
+ | 阶段 | 触发引擎 | 操作 |
104
+ |------|---------|------|
105
+ | Planning → Backlog | SchedulerEngine | 选卡入队,检查准入条件 |
106
+ | Backlog → Todo | ExecutionEngine | 创建分支、创建 worktree |
107
+ | Todo → Inprogress | ExecutionEngine | 分配 Worker slot、构建任务上下文、启动 AI Worker |
108
+ | Inprogress → QA | ExecutionEngine | 检测 Worker 完成、确认 MR 已创建 |
109
+ | QA → Done | CloseoutEngine | CI 检查、自动 merge、释放资源 |
110
+
111
+ ### 辅助状态标签
112
+
113
+ 卡片可能被标记以下标签,表示需要特殊处理:
114
+
115
+ | 标签 | 含义 | 处理方式 |
116
+ |------|------|---------|
117
+ | `BLOCKED` | 被外部依赖阻塞 | 跳过,等待人工处理 |
118
+ | `NEEDS-FIX` | Worker 失败或 CI 失败 | 自动修复或人工介入 |
119
+ | `WAITING-CONFIRMATION` | Worker 等待破坏性操作确认 | 通知人工确认 |
120
+ | `CONFLICT` | 合并冲突 | Worker 自动解冲突或人工处理 |
121
+ | `STALE-RUNTIME` | Worker 运行时异常 | MonitorEngine 清理 |
122
+
123
+ ---
124
+
125
+ ## 命令参考
126
+
127
+ ### 全局选项
128
+
129
+ 所有命令均支持:
18
130
 
19
- ### Commands
131
+ | 选项 | 说明 |
132
+ |------|------|
133
+ | `--json` | 输出结构化 JSON(供脚本/cron 消费) |
134
+ | `--dry-run` | 预览操作,不实际执行 |
135
+ | `--help` | 显示帮助 |
136
+ | `--version` | 显示版本号 |
20
137
 
21
- | Command | Description | Usage |
22
- |---------|-------------|-------|
23
- | `tick` | Run continuous pipeline | `sps tick <project> [--once]` |
24
- | `card` | Card management | `sps card add <project> "<title>" ["desc"]` |
25
- | `doctor` | Project health check | `sps doctor <project> [--json] [--skip-remote]` |
26
- | `scheduler` | Planning → Backlog promotion | `sps scheduler <tick\|inspect\|validate> <project>` |
27
- | `pipeline` | Execution chain (Backlog → Todo → Inprogress) | `sps pipeline <tick\|inspect> <project>` |
28
- | `worker` | Worker lifecycle management | `sps worker <launch\|release\|inspect> <project> [seq\|slot]` |
29
- | `pm` | PM backend operations | `sps pm <scan\|move\|comment\|checklist> <project> [args...]` |
30
- | `qa` | QA / closeout (QA → merge → Done) | `sps qa <tick\|inspect> <project>` |
31
- | `monitor` | Anomaly detection and diagnostics | `sps monitor <tick\|inspect-worker\|inspect-card> <project>` |
32
- | `project` | Project init and validation | `sps project <init\|doctor\|validate\|paths> <project>` |
138
+ ### 退出码
33
139
 
34
- ### Global Options
140
+ | 退出码 | 含义 |
141
+ |-------|------|
142
+ | `0` | 成功 |
143
+ | `1` | 业务失败 / 校验失败 |
144
+ | `2` | 参数错误 |
145
+ | `3` | 外部依赖不可用(GitLab / PM / Worker) |
35
146
 
36
- - `--json` — Output structured JSON
37
- - `--dry-run` — Preview actions without executing
38
- - `--help` — Show help
39
- - `--version` — Show version
147
+ ---
40
148
 
41
- ## Quick Start
149
+ ### sps setup
150
+
151
+ 全局环境初始化向导,配置各外部系统凭据。
42
152
 
43
153
  ```bash
44
- # Initialize a new project
45
- sps project init my-project
154
+ sps setup [--force]
155
+ ```
156
+
157
+ **交互式配置项:**
158
+
159
+ - GitLab:`GITLAB_URL`、`GITLAB_TOKEN`、`GITLAB_SSH_HOST`、`GITLAB_SSH_PORT`
160
+ - Plane:`PLANE_URL`、`PLANE_API_KEY`、`PLANE_WORKSPACE_SLUG`
161
+ - Trello:`TRELLO_API_KEY`、`TRELLO_TOKEN`
162
+ - Matrix:`MATRIX_HOMESERVER`、`MATRIX_TOKEN`、`MATRIX_ROOM_ID`
163
+
164
+ 凭据写入 `~/.jarvis.env`(权限 0600),所有项目共享。
165
+
166
+ | 选项 | 说明 |
167
+ |------|------|
168
+ | `--force` | 覆盖已有的 `~/.jarvis.env` |
169
+
170
+ ---
171
+
172
+ ### sps project init
173
+
174
+ 初始化 SPS 项目管理目录。
175
+
176
+ ```bash
177
+ sps project init <project> [--force]
178
+ ```
179
+
180
+ **创建的目录结构:**
181
+
182
+ ```
183
+ ~/.projects/<project>/
184
+ ├── conf # 项目配置文件(从模板生成)
185
+ ├── logs/ # 日志目录
186
+ ├── pm_meta/ # PM 元数据缓存
187
+ ├── runtime/ # 运行时状态
188
+ ├── pipeline_order.json # 卡片执行顺序
189
+ ├── batch_scheduler.sh # cron 兼容入口脚本
190
+ └── deploy.sh # 部署脚本模板
191
+ ```
192
+
193
+ | 选项 | 说明 |
194
+ |------|------|
195
+ | `--force` | 覆盖模板文件(conf 不会被覆盖) |
46
196
 
47
- # Run health check
48
- sps doctor my-project
197
+ **示例:**
49
198
 
50
- # Add a task card
51
- sps card add my-project "feat: implement user auth" "Add JWT-based authentication"
199
+ ```bash
200
+ sps project init accounting-agent
201
+ # → 生成 ~/.projects/accounting-agent/
202
+ # → 下一步:编辑 conf 填入配置值
203
+ ```
204
+
205
+ ---
206
+
207
+ ### sps doctor
208
+
209
+ 项目健康检查与自动修复。
210
+
211
+ ```bash
212
+ sps doctor <project> [--fix] [--json] [--skip-remote]
213
+ ```
214
+
215
+ 等价于 `sps project doctor <project>`。
216
+
217
+ **检查项:**
218
+
219
+ | 检查项 | 说明 |
220
+ |-------|------|
221
+ | conf-load | 配置文件是否可加载 |
222
+ | conf-fields | 必填字段是否完整 |
223
+ | instance-dir | 管理目录是否存在 |
224
+ | repo-dir | 业务仓库是否存在且为 git 仓库 |
225
+ | worker-rules | CLAUDE.md / AGENTS.md 是否存在于仓库根目录 |
226
+ | state-json | 运行时状态文件是否有效 |
227
+ | pipeline-order | 执行顺序文件是否存在 |
228
+ | conf-cli-fields | CLI 所需的 Provider 字段映射是否完整 |
229
+ | gitlab | GitLab API 连通性 |
230
+ | plane | Plane API 连通性(仅 PM_TOOL=plane) |
231
+ | worker-tool | Claude Code / Codex CLI 是否在 PATH 中 |
232
+ | tmux | tmux 是否可用 |
233
+
234
+ | 选项 | 说明 |
235
+ |------|------|
236
+ | `--fix` | 自动修复可修复的问题(创建目录、生成文件、初始化状态) |
237
+ | `--json` | 输出 JSON 格式的检查结果 |
238
+ | `--skip-remote` | 跳过远程连通性检查(GitLab/Plane) |
239
+
240
+ **示例:**
241
+
242
+ ```bash
243
+ # 检查 + 自动修复
244
+ sps doctor my-project --fix
245
+ # ✓ conf-load Loaded ~/.projects/my-project/conf
246
+ # ✓ conf-fields All required fields present
247
+ # ✓ repo-dir /home/user/projects/my-project
248
+ # ✓ worker-rules Generated and committed: CLAUDE.md, AGENTS.md, .gitignore
249
+ # ✓ state-json Initialized with 3 worker slots
250
+ # ✓ tmux tmux available
251
+
252
+ # JSON 输出
253
+ sps doctor my-project --json
254
+ ```
52
255
 
53
- # Run pipeline (single tick)
54
- sps tick my-project --once
256
+ ---
55
257
 
56
- # Run pipeline (continuous)
258
+ ### sps card add
259
+
260
+ 创建任务卡片。
261
+
262
+ ```bash
263
+ sps card add <project> "<title>" ["description"]
264
+ ```
265
+
266
+ 卡片创建在 Planning 状态,自动添加 `AI-PIPELINE` 标签,并追加到 `pipeline_order.json` 中。
267
+
268
+ | 选项 | 说明 |
269
+ |------|------|
270
+ | `--json` | 输出 JSON 格式的创建结果 |
271
+
272
+ **示例:**
273
+
274
+ ```bash
275
+ # 创建卡片
276
+ sps card add my-project "实现用户登录" "使用 JWT 的认证接口"
277
+
278
+ # 批量创建
279
+ sps card add my-project "实现订单列表" "CRUD API + 分页查询"
280
+ sps card add my-project "添加邮件通知" "订单状态变更时发送邮件"
281
+ ```
282
+
283
+ ---
284
+
285
+ ### sps tick
286
+
287
+ 统一主循环——编排全部引擎,依次执行 scheduler → qa → pipeline → monitor。
288
+
289
+ ```bash
290
+ sps tick <project> [project2] [project3] ... [--once] [--json] [--dry-run]
291
+ ```
292
+
293
+ **执行顺序(每轮 tick):**
294
+
295
+ 1. **scheduler tick** — Planning → Backlog(选卡入队)
296
+ 2. **qa tick** — QA → merge → Done(优先释放 Worker slot)
297
+ 3. **pipeline tick** — Backlog → Todo → Inprogress(准备环境 + 启动 Worker)
298
+ 4. **monitor tick** — 异常巡检与对齐
299
+
300
+ **运行模式:**
301
+
302
+ | 模式 | 行为 |
303
+ |------|------|
304
+ | 持续模式(默认) | 每 30 秒循环一次,所有卡片完成后自动退出 |
305
+ | 单次模式(`--once`) | 执行一轮 tick 后立即退出 |
306
+
307
+ **并发互斥:**
308
+
309
+ 同一项目同一时刻只允许一个 `tick` 实例运行。通过 `runtime/tick.lock`(PID + 时间戳)实现互斥,超过 `TICK_LOCK_TIMEOUT_MINUTES`(默认 30 分钟)视为死锁可强制接管。
310
+
311
+ **失败分类:**
312
+
313
+ | 类型 | 行为 | 示例 |
314
+ |------|------|------|
315
+ | 致命失败 | 短路整个 tick | conf 损坏、PM 不可用 |
316
+ | 降级继续 | 后续步骤有限运行 | scheduler 失败 → pipeline 不启动新卡 |
317
+ | 非关键失败 | 记录后继续 | 通知发送失败 |
318
+
319
+ | 选项 | 说明 |
320
+ |------|------|
321
+ | `--once` | 单次执行后退出 |
322
+ | `--json` | 输出 JSON 格式的聚合结果 |
323
+ | `--dry-run` | 预览操作,不实际执行 |
324
+
325
+ **示例:**
326
+
327
+ ```bash
328
+ # 单项目持续运行
57
329
  sps tick my-project
330
+
331
+ # 多项目同时管理
332
+ sps tick project-a project-b project-c
333
+
334
+ # 单次执行 + JSON 输出(适合 cron)
335
+ sps tick my-project --once --json
336
+
337
+ # 预览模式
338
+ sps tick my-project --once --dry-run
339
+ ```
340
+
341
+ **JSON 输出格式:**
342
+
343
+ ```json
344
+ {
345
+ "project": "my-project",
346
+ "component": "tick",
347
+ "status": "ok",
348
+ "exitCode": 0,
349
+ "steps": [
350
+ { "step": "scheduler", "status": "ok", "actions": [...] },
351
+ { "step": "qa", "status": "ok", "actions": [...] },
352
+ { "step": "pipeline", "status": "ok", "actions": [...] },
353
+ { "step": "monitor", "status": "ok", "checks": [...] }
354
+ ]
355
+ }
356
+ ```
357
+
358
+ ---
359
+
360
+ ### sps scheduler tick
361
+
362
+ 手动执行编排步骤:Planning → Backlog。
363
+
364
+ ```bash
365
+ sps scheduler tick <project> [--json] [--dry-run]
366
+ ```
367
+
368
+ - 读取 `pipeline_order.json` 确定卡片优先级
369
+ - 检查准入条件(Worker 可用性、冲突域等)
370
+ - 将符合条件的卡片从 Planning 推入 Backlog
371
+
372
+ **示例:**
373
+
374
+ ```bash
375
+ sps scheduler tick my-project
376
+ sps scheduler tick my-project --dry-run
58
377
  ```
59
378
 
60
- ## Multi-Project Support
379
+ ---
61
380
 
62
- Run multiple projects in a single process:
381
+ ### sps pipeline tick
382
+
383
+ 手动执行执行链:Backlog → Todo → Inprogress。
384
+
385
+ ```bash
386
+ sps pipeline tick <project> [--json] [--dry-run]
387
+ ```
388
+
389
+ **内部步骤:**
390
+
391
+ 1. **检查 Inprogress 卡片** — 检测 Worker 完成状态,完成的卡片推入 QA
392
+ 2. **处理 Backlog 卡片** — 创建分支 + 创建 worktree → 推入 Todo
393
+ 3. **处理 Todo 卡片** — 分配 Worker slot + 构建任务上下文 + 启动 Worker → 推入 Inprogress
394
+
395
+ 受 `MAX_ACTIONS_PER_TICK` 限制(默认 1),防止单轮 tick 同时启动过多 Worker。多个 Worker 启动之间有 10 秒间隔。
396
+
397
+ 带有 `BLOCKED`、`NEEDS-FIX`、`CONFLICT`、`WAITING-CONFIRMATION`、`STALE-RUNTIME` 标签的卡片会被跳过。
398
+
399
+ **示例:**
400
+
401
+ ```bash
402
+ sps pipeline tick my-project
403
+ sps pipeline tick my-project --json
404
+ ```
405
+
406
+ ---
407
+
408
+ ### sps worker
409
+
410
+ Worker 生命周期管理。
411
+
412
+ #### sps worker launch
413
+
414
+ 手动启动单个 Worker。
415
+
416
+ ```bash
417
+ sps worker launch <project> <seq> [--json] [--dry-run]
418
+ ```
419
+
420
+ 如果卡片在 Backlog 状态,会自动先执行 prepare(创建分支 + worktree),然后启动 Worker。
421
+
422
+ **启动流程:**
423
+
424
+ 1. 分配空闲 Worker slot(优先复用有存活 tmux session 的 slot)
425
+ 2. 写入 `.jarvis_task_prompt.txt` 到 worktree
426
+ 3. 在 tmux session 中启动 Claude Code / Codex
427
+ 4. 等待 Worker 就绪(最长 90 秒)
428
+ 5. 发送任务 prompt
429
+ 6. 卡片推入 Inprogress
430
+
431
+ **tmux session 复用策略(`WORKER_SESSION_REUSE=true`):**
432
+
433
+ | 场景 | 行为 |
434
+ |------|------|
435
+ | Session 存在 + Claude 运行中 | 复用:`/clear` + `cd worktree` |
436
+ | Session 存在 + Claude 未运行 | 复用 session:`cd` + 启动 Claude |
437
+ | 无 session | 创建新 session + 启动 Claude |
438
+
439
+ **示例:**
440
+
441
+ ```bash
442
+ sps worker launch my-project 24
443
+ sps worker launch my-project 24 --dry-run
444
+ ```
445
+
446
+ #### sps worker dashboard
447
+
448
+ 实时监控所有 Worker 运行状态的仪表盘。
449
+
450
+ ```bash
451
+ sps worker dashboard [project1] [project2] ... [--once] [--json]
452
+ ```
453
+
454
+ | 选项 | 说明 |
455
+ |------|------|
456
+ | (无参数) | 自动发现 `~/.projects/` 下所有项目 |
457
+ | `--once` | 输出一次快照后退出(不进入实时模式) |
458
+ | `--json` | 输出 JSON 格式(所有项目、所有 Worker slot 状态 + tmux pane 预览) |
459
+
460
+ **实时模式:**
461
+
462
+ - 默认每 3 秒刷新(可通过 `SPS_DASHBOARD_INTERVAL` 环境变量调整)
463
+ - 按 `q` 退出,按 `r` 强制刷新
464
+ - 自适应网格布局,每个 Worker 一个面板
465
+ - 面板显示:状态图标、项目名/slot、seq、分支名、运行时长、tmux 实时输出
466
+
467
+ **示例:**
468
+
469
+ ```bash
470
+ # 监控所有项目
471
+ sps worker dashboard
472
+
473
+ # 监控指定项目
474
+ sps worker dashboard my-project
475
+
476
+ # 单次快照
477
+ sps worker dashboard --once
478
+
479
+ # JSON 输出(供脚本消费)
480
+ sps worker dashboard --json
481
+
482
+ # 自定义刷新间隔
483
+ SPS_DASHBOARD_INTERVAL=5000 sps worker dashboard
484
+ ```
485
+
486
+ ---
487
+
488
+ ### sps pm
489
+
490
+ PM 后端操作。
491
+
492
+ #### sps pm scan
493
+
494
+ 查看卡片列表。
495
+
496
+ ```bash
497
+ sps pm scan <project> [state]
498
+ ```
499
+
500
+ 不指定 `state` 时列出所有卡片。
501
+
502
+ **示例:**
503
+
504
+ ```bash
505
+ # 查看所有卡片
506
+ sps pm scan my-project
507
+
508
+ # 按状态筛选
509
+ sps pm scan my-project Inprogress
510
+ sps pm scan my-project Planning
511
+ ```
512
+
513
+ #### sps pm move
514
+
515
+ 手动移动卡片状态。
516
+
517
+ ```bash
518
+ sps pm move <project> <seq> <state>
519
+ ```
520
+
521
+ **示例:**
522
+
523
+ ```bash
524
+ sps pm move my-project 24 QA
525
+ sps pm move my-project 25 Done
526
+ ```
527
+
528
+ #### sps pm comment
529
+
530
+ 给卡片添加评论。
531
+
532
+ ```bash
533
+ sps pm comment <project> <seq> "<text>"
534
+ ```
535
+
536
+ **示例:**
537
+
538
+ ```bash
539
+ sps pm comment my-project 24 "CI 已通过,等待 review"
540
+ ```
541
+
542
+ #### sps pm checklist
543
+
544
+ 管理卡片的检查清单。
545
+
546
+ ```bash
547
+ # 创建清单
548
+ sps pm checklist create <project> <seq> "item1" "item2" "item3"
549
+
550
+ # 查看清单
551
+ sps pm checklist list <project> <seq>
552
+
553
+ # 勾选/取消勾选
554
+ sps pm checklist check <project> <seq> <item-id>
555
+ sps pm checklist uncheck <project> <seq> <item-id>
556
+ ```
557
+
558
+ **示例:**
559
+
560
+ ```bash
561
+ sps pm checklist create my-project 24 "单元测试" "集成测试" "代码审查"
562
+ sps pm checklist list my-project 24
563
+ sps pm checklist check my-project 24 item-001
564
+ ```
565
+
566
+ ---
567
+
568
+ ### sps qa tick
569
+
570
+ 手动执行 QA 闭环:QA → merge → Done。
571
+
572
+ ```bash
573
+ sps qa tick <project> [--json]
574
+ ```
575
+
576
+ **每张 QA 卡片的决策树:**
577
+
578
+ | 条件 | 操作 |
579
+ |------|------|
580
+ | MR 不存在 | 标记 `NEEDS-FIX` |
581
+ | MR 已 merged | 释放资源 → Done |
582
+ | MR open + CI 成功 + 可合并 | 自动 merge |
583
+ | MR open + CI 失败 | 尝试自动修复或标记 `NEEDS-FIX` |
584
+ | MR open + CI 运行中 | 跳过,下轮再检查 |
585
+ | MR open + 不可合并 | 标记 `CONFLICT` |
586
+ | MR 已关闭(未 merge) | 标记 `NEEDS-FIX` |
587
+
588
+ **示例:**
589
+
590
+ ```bash
591
+ sps qa tick my-project
592
+ sps qa tick my-project --json
593
+ ```
594
+
595
+ ---
596
+
597
+ ### sps monitor tick
598
+
599
+ 手动执行异常检测与健康巡检。
600
+
601
+ ```bash
602
+ sps monitor tick <project> [--json]
603
+ ```
604
+
605
+ **巡检项:**
606
+
607
+ | 检查 | 说明 |
608
+ |------|------|
609
+ | 孤儿 slot 清理 | tmux session 已死但 slot 仍标记 active |
610
+ | 超时检测 | Inprogress 超过 `INPROGRESS_TIMEOUT_HOURS` |
611
+ | 等待确认检测 | Worker 等待用户确认(自动处理非破坏性确认) |
612
+ | 阻塞检测 | Worker 遇到 error/fatal/stuck 等 |
613
+ | 状态对齐 | PM 状态与 runtime 状态是否一致 |
614
+
615
+ **示例:**
616
+
617
+ ```bash
618
+ sps monitor tick my-project
619
+ sps monitor tick my-project --json
620
+ ```
621
+
622
+ ---
623
+
624
+ ## Worker 规则文件
625
+
626
+ `sps doctor --fix` 会在业务仓库根目录生成以下文件并自动提交:
627
+
628
+ | 文件 | 用途 | 提交到 git |
629
+ |------|------|-----------|
630
+ | `CLAUDE.md` | Claude Code Worker 的项目规则 | 是 |
631
+ | `AGENTS.md` | Codex Worker 的项目规则 | 是 |
632
+ | `.jarvis_task_prompt.txt` | 每次任务的具体描述(每个 worktree 独立生成) | 否(.gitignore) |
633
+
634
+ ### 工作原理
635
+
636
+ 1. `CLAUDE.md` 和 `AGENTS.md` 提交到仓库主分支
637
+ 2. 创建 git worktree 时自动继承这些文件
638
+ 3. Worker 启动时读取 CLAUDE.md 了解项目规则
639
+ 4. 任务特有信息(seq、分支名、描述)写入 `.jarvis_task_prompt.txt`
640
+
641
+ ### 自定义项目规则
642
+
643
+ 生成的 CLAUDE.md 包含"Project-Specific Rules"占位区,你可以在此添加:
644
+
645
+ ```markdown
646
+ ## Project-Specific Rules
647
+ - 语言:TypeScript strict mode
648
+ - 测试框架:vitest,覆盖率 80%+
649
+ - 架构:src/modules/<domain>/ 目录结构
650
+ - Linting:eslint + prettier,提交前必须通过
651
+ ```
652
+
653
+ SPS 不会覆盖已存在的 CLAUDE.md / AGENTS.md。
654
+
655
+ ---
656
+
657
+ ## 项目配置
658
+
659
+ 配置分两层:
660
+
661
+ | 文件 | 作用域 | 说明 |
662
+ |------|-------|------|
663
+ | `~/.jarvis.env` | 全局 | 所有项目共享的凭据(GitLab token、PM API key 等) |
664
+ | `~/.projects/<project>/conf` | 项目级 | 项目特有配置(仓库、分支、Worker 参数等) |
665
+
666
+ 项目 conf 可以引用全局变量(如 `${PLANE_URL}`)。
667
+
668
+ ### 配置字段一览
669
+
670
+ #### 项目基础
671
+
672
+ | 字段 | 必填 | 默认值 | 说明 |
673
+ |------|------|-------|------|
674
+ | `PROJECT_NAME` | 是 | — | 项目名称 |
675
+ | `PROJECT_DISPLAY` | 否 | PROJECT_NAME | 显示名称 |
676
+ | `PROJECT_DIR` | 否 | `~/projects/<project>` | 业务仓库路径 |
677
+
678
+ #### GitLab
679
+
680
+ | 字段 | 必填 | 默认值 | 说明 |
681
+ |------|------|-------|------|
682
+ | `GITLAB_PROJECT` | 是 | — | GitLab 项目路径(如 `group/repo`) |
683
+ | `GITLAB_PROJECT_ID` | 是 | — | GitLab 项目数字 ID |
684
+ | `GITLAB_MERGE_BRANCH` | 是 | `develop` | MR 目标分支 |
685
+ | `GITLAB_RELEASE_BRANCH` | 否 | `main` | 发布分支 |
686
+
687
+ #### PM 后端
688
+
689
+ | 字段 | 必填 | 默认值 | 说明 |
690
+ |------|------|-------|------|
691
+ | `PM_TOOL` | 否 | `trello` | PM 后端类型:`plane` / `trello` / `markdown` |
692
+ | `PIPELINE_LABEL` | 否 | `AI-PIPELINE` | Pipeline 卡片标签 |
693
+
694
+ #### Worker
695
+
696
+ | 字段 | 必填 | 默认值 | 说明 |
697
+ |------|------|-------|------|
698
+ | `WORKER_TOOL` | 否 | `claude` | Worker 类型:`claude` / `codex` |
699
+ | `MAX_CONCURRENT_WORKERS` | 否 | `3` | 最大并行 Worker 数 |
700
+ | `WORKER_RESTART_LIMIT` | 否 | `2` | Worker 死亡后最大重启次数 |
701
+ | `AUTOFIX_ATTEMPTS` | 否 | `2` | CI 失败自动修复尝试次数 |
702
+ | `WORKER_SESSION_REUSE` | 否 | `true` | 是否复用 tmux session |
703
+ | `MAX_ACTIONS_PER_TICK` | 否 | `1` | 每轮 tick 最大操作数 |
704
+
705
+ #### 超时与策略
706
+
707
+ | 字段 | 必填 | 默认值 | 说明 |
708
+ |------|------|-------|------|
709
+ | `INPROGRESS_TIMEOUT_HOURS` | 否 | `8` | Inprogress 超时小时数 |
710
+ | `MONITOR_AUTO_QA` | 否 | `false` | Monitor 是否自动将完成的卡推入 QA |
711
+ | `CONFLICT_DEFAULT` | 否 | `serial` | 冲突域默认策略:`serial` / `parallel` |
712
+ | `TICK_LOCK_TIMEOUT_MINUTES` | 否 | `30` | tick 锁超时分钟数 |
713
+ | `NEEDS_FIX_MAX_RETRIES` | 否 | `3` | NEEDS-FIX 最大重试次数 |
714
+ | `WORKTREE_RETAIN_HOURS` | 否 | `24` | worktree 保留小时数 |
715
+
716
+ #### 路径与部署
717
+
718
+ | 字段 | 必填 | 默认值 | 说明 |
719
+ |------|------|-------|------|
720
+ | `WORKTREE_DIR` | 否 | `~/.coral/worktrees/` | worktree 根目录 |
721
+ | `DEPLOY_ENABLED` | 否 | `false` | 是否启用自动部署 |
722
+ | `DEPLOY_SCRIPT` | 否 | — | 部署脚本路径 |
723
+
724
+ ### 配置示例
725
+
726
+ ```bash
727
+ # ~/.projects/my-project/conf
728
+
729
+ PROJECT_NAME="my-project"
730
+ PROJECT_DISPLAY="My Project"
731
+ PROJECT_DIR="/home/user/projects/my-project"
732
+
733
+ # GitLab
734
+ GITLAB_PROJECT="team/my-project"
735
+ GITLAB_PROJECT_ID="42"
736
+ GITLAB_MERGE_BRANCH="develop"
737
+
738
+ # PM(使用全局 .jarvis.env 中的变量)
739
+ PM_TOOL="plane"
740
+ PLANE_API_URL="${PLANE_URL}"
741
+ PLANE_PROJECT_ID="project-uuid-here"
742
+
743
+ # Worker
744
+ WORKER_TOOL="claude"
745
+ MAX_CONCURRENT_WORKERS=3
746
+ WORKER_SESSION_REUSE=true
747
+ MAX_ACTIONS_PER_TICK=1
748
+ ```
749
+
750
+ ---
751
+
752
+ ## 多项目并行
753
+
754
+ SPS 支持单进程同时管理多个项目:
63
755
 
64
756
  ```bash
65
757
  sps tick project-a project-b project-c
66
758
  ```
67
759
 
68
- Each project is fully isolated with its own context, providers, engines, lock, and state. One project's error does not affect others.
760
+ 每个项目完全隔离:
761
+ - 独立的 ProjectContext、Provider 实例、Engine 实例
762
+ - 独立的 tick.lock(互不阻塞)
763
+ - 独立的 state.json(Worker slot 不混淆)
764
+ - 一个项目出错不影响其他项目
765
+
766
+ 多 Worker 并行配置:
69
767
 
70
- ## Architecture
768
+ ```bash
769
+ # 在项目 conf 中设置
770
+ MAX_CONCURRENT_WORKERS=3
771
+ CONFLICT_DEFAULT=parallel
772
+ ```
71
773
 
72
- SPS orchestrates a state machine pipeline:
774
+ ---
775
+
776
+ ## 架构概览
777
+
778
+ ### 四层架构
73
779
 
74
780
  ```
75
- Backlog Todo InProgress QA → Done
781
+ Layer 3 Commands + Engines CLI 命令 + 状态机引擎
782
+ Layer 2 Providers 具体后端实现
783
+ Layer 1 Interfaces 抽象接口
784
+ Layer 0 Core Runtime 配置、路径、状态、锁、日志
76
785
  ```
77
786
 
78
- ### Supported Backends
787
+ ### 支持的后端
788
+
789
+ | 类型 | Provider | 接口 |
790
+ |------|----------|------|
791
+ | PM 后端 | Plane CE / Trello / Markdown | TaskBackend |
792
+ | 代码托管 | GitLab | RepoBackend |
793
+ | AI Worker | Claude Code / Codex CLI | WorkerProvider |
794
+ | 通知 | Matrix | Notifier |
795
+
796
+ ### 引擎
79
797
 
80
- - **Task Management**: Trello, Plane, Markdown
81
- - **Repository**: GitLab
82
- - **Workers**: Claude Code, OpenAI Codex
83
- - **Notifications**: Matrix
798
+ | 引擎 | 职责 |
799
+ |------|------|
800
+ | SchedulerEngine | Planning Backlog(选卡、排序、准入检查) |
801
+ | ExecutionEngine | Backlog → Todo → Inprogress(准备环境、启动 Worker、检测完成) |
802
+ | CloseoutEngine | QA → merge → Done(CI 检查、自动 merge、资源释放) |
803
+ | MonitorEngine | 异常检测(孤儿清理、超时、阻塞、状态对齐) |
84
804
 
85
- ## Configuration
805
+ ---
806
+
807
+ ## 目录结构
808
+
809
+ ```
810
+ workflow-cli/
811
+ ├── src/
812
+ │ ├── main.ts # CLI 入口、命令路由
813
+ │ ├── commands/ # 命令实现
814
+ │ │ ├── setup.ts # sps setup
815
+ │ │ ├── projectInit.ts # sps project init
816
+ │ │ ├── doctor.ts # sps doctor
817
+ │ │ ├── cardAdd.ts # sps card add
818
+ │ │ ├── tick.ts # sps tick
819
+ │ │ ├── schedulerTick.ts # sps scheduler tick
820
+ │ │ ├── pipelineTick.ts # sps pipeline tick
821
+ │ │ ├── workerLaunch.ts # sps worker launch
822
+ │ │ ├── workerDashboard.ts # sps worker dashboard
823
+ │ │ ├── pmCommand.ts # sps pm *
824
+ │ │ ├── qaTick.ts # sps qa tick
825
+ │ │ └── monitorTick.ts # sps monitor tick
826
+ │ ├── core/ # 核心运行时
827
+ │ │ ├── config.ts # 配置加载(shell conf 解析)
828
+ │ │ ├── context.ts # ProjectContext
829
+ │ │ ├── paths.ts # 路径解析
830
+ │ │ ├── state.ts # 运行时状态(state.json)
831
+ │ │ ├── lock.ts # tick 锁
832
+ │ │ ├── logger.ts # 日志 + 结构化事件
833
+ │ │ └── queue.ts # Pipeline 队列
834
+ │ ├── engines/ # 状态机引擎
835
+ │ │ ├── SchedulerEngine.ts # 选卡入队
836
+ │ │ ├── ExecutionEngine.ts # 执行链
837
+ │ │ ├── CloseoutEngine.ts # QA 闭环
838
+ │ │ └── MonitorEngine.ts # 异常检测
839
+ │ ├── interfaces/ # 抽象接口
840
+ │ │ ├── TaskBackend.ts # PM 后端接口
841
+ │ │ ├── WorkerProvider.ts # Worker 接口
842
+ │ │ ├── RepoBackend.ts # 代码仓库接口
843
+ │ │ ├── Notifier.ts # 通知接口
844
+ │ │ └── HookProvider.ts # Hook 接口
845
+ │ ├── models/ # 类型定义
846
+ │ │ └── types.ts # Card, CommandResult, WorkerStatus 等
847
+ │ └── providers/ # 具体实现
848
+ │ ├── registry.ts # Provider 工厂
849
+ │ ├── PlaneTaskBackend.ts
850
+ │ ├── TrelloTaskBackend.ts
851
+ │ ├── MarkdownTaskBackend.ts
852
+ │ ├── ClaudeWorkerProvider.ts
853
+ │ ├── CodexWorkerProvider.ts
854
+ │ ├── GitLabRepoBackend.ts
855
+ │ └── MatrixNotifier.ts
856
+ ├── package.json
857
+ └── tsconfig.json
858
+ ```
86
859
 
87
- Projects are configured via `~/.projects/<name>/conf`. Run `sps project init <name>` to generate a template.
860
+ ---
88
861
 
89
862
  ## License
90
863