@coralai/sps-cli 0.8.0 → 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.
- package/README.md +820 -47
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +140 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/workerDashboard.d.ts +2 -0
- package/dist/commands/workerDashboard.d.ts.map +1 -0
- package/dist/commands/workerDashboard.js +415 -0
- package/dist/commands/workerDashboard.js.map +1 -0
- package/dist/core/state.d.ts +6 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +1 -0
- package/dist/core/state.js.map +1 -1
- package/dist/engines/CloseoutEngine.d.ts +7 -0
- package/dist/engines/CloseoutEngine.d.ts.map +1 -1
- package/dist/engines/CloseoutEngine.js +85 -38
- package/dist/engines/CloseoutEngine.js.map +1 -1
- package/dist/engines/ExecutionEngine.d.ts +10 -2
- package/dist/engines/ExecutionEngine.d.ts.map +1 -1
- package/dist/engines/ExecutionEngine.js +46 -50
- package/dist/engines/ExecutionEngine.js.map +1 -1
- package/dist/engines/SchedulerEngine.d.ts +5 -0
- package/dist/engines/SchedulerEngine.d.ts.map +1 -1
- package/dist/engines/SchedulerEngine.js +15 -5
- package/dist/engines/SchedulerEngine.js.map +1 -1
- package/dist/interfaces/RepoBackend.d.ts +1 -0
- package/dist/interfaces/RepoBackend.d.ts.map +1 -1
- package/dist/interfaces/WorkerProvider.d.ts +16 -0
- package/dist/interfaces/WorkerProvider.d.ts.map +1 -1
- package/dist/main.js +12 -2
- package/dist/main.js.map +1 -1
- package/dist/providers/ClaudeWorkerProvider.d.ts +13 -3
- package/dist/providers/ClaudeWorkerProvider.d.ts.map +1 -1
- package/dist/providers/ClaudeWorkerProvider.js +21 -8
- package/dist/providers/ClaudeWorkerProvider.js.map +1 -1
- package/dist/providers/CodexWorkerProvider.d.ts +11 -1
- package/dist/providers/CodexWorkerProvider.d.ts.map +1 -1
- package/dist/providers/CodexWorkerProvider.js +19 -4
- package/dist/providers/CodexWorkerProvider.js.map +1 -1
- package/dist/providers/GitLabRepoBackend.d.ts +1 -0
- package/dist/providers/GitLabRepoBackend.d.ts.map +1 -1
- package/dist/providers/GitLabRepoBackend.js +36 -0
- package/dist/providers/GitLabRepoBackend.js.map +1 -1
- package/package.json +2 -2
- package/project-template/batch_scheduler.sh +2 -4
- package/project-template/conf.template +6 -1
- package/project-template/batch_scheduler.legacy.sh +0 -165
- package/project-template/project-template/README.md +0 -10
- package/project-template/project-template/batch_scheduler.legacy.sh +0 -165
- package/project-template/project-template/batch_scheduler.sh +0 -8
- package/project-template/project-template/conf.template +0 -78
- package/project-template/project-template/deploy.sh +0 -3
- package/project-template/project-template/logs/.gitkeep +0 -0
- package/project-template/project-template/pm_meta/.gitkeep +0 -0
package/README.md
CHANGED
|
@@ -1,90 +1,863 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SPS CLI — AI 驱动的全自动开发流水线
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@coralai/sps-cli)
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
61
|
+
## 快速开始
|
|
14
62
|
|
|
15
63
|
```bash
|
|
16
|
-
|
|
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
|
-
|
|
131
|
+
| 选项 | 说明 |
|
|
132
|
+
|------|------|
|
|
133
|
+
| `--json` | 输出结构化 JSON(供脚本/cron 消费) |
|
|
134
|
+
| `--dry-run` | 预览操作,不实际执行 |
|
|
135
|
+
| `--help` | 显示帮助 |
|
|
136
|
+
| `--version` | 显示版本号 |
|
|
20
137
|
|
|
21
|
-
|
|
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
|
-
|
|
140
|
+
| 退出码 | 含义 |
|
|
141
|
+
|-------|------|
|
|
142
|
+
| `0` | 成功 |
|
|
143
|
+
| `1` | 业务失败 / 校验失败 |
|
|
144
|
+
| `2` | 参数错误 |
|
|
145
|
+
| `3` | 外部依赖不可用(GitLab / PM / Worker) |
|
|
35
146
|
|
|
36
|
-
|
|
37
|
-
- `--dry-run` — Preview actions without executing
|
|
38
|
-
- `--help` — Show help
|
|
39
|
-
- `--version` — Show version
|
|
147
|
+
---
|
|
40
148
|
|
|
41
|
-
|
|
149
|
+
### sps setup
|
|
150
|
+
|
|
151
|
+
全局环境初始化向导,配置各外部系统凭据。
|
|
42
152
|
|
|
43
153
|
```bash
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
48
|
-
sps doctor my-project
|
|
197
|
+
**示例:**
|
|
49
198
|
|
|
50
|
-
|
|
51
|
-
sps
|
|
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
|
-
|
|
54
|
-
sps tick my-project --once
|
|
256
|
+
---
|
|
55
257
|
|
|
56
|
-
|
|
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
|
-
|
|
379
|
+
---
|
|
61
380
|
|
|
62
|
-
|
|
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
|
-
|
|
760
|
+
每个项目完全隔离:
|
|
761
|
+
- 独立的 ProjectContext、Provider 实例、Engine 实例
|
|
762
|
+
- 独立的 tick.lock(互不阻塞)
|
|
763
|
+
- 独立的 state.json(Worker slot 不混淆)
|
|
764
|
+
- 一个项目出错不影响其他项目
|
|
765
|
+
|
|
766
|
+
多 Worker 并行配置:
|
|
69
767
|
|
|
70
|
-
|
|
768
|
+
```bash
|
|
769
|
+
# 在项目 conf 中设置
|
|
770
|
+
MAX_CONCURRENT_WORKERS=3
|
|
771
|
+
CONFLICT_DEFAULT=parallel
|
|
772
|
+
```
|
|
71
773
|
|
|
72
|
-
|
|
774
|
+
---
|
|
775
|
+
|
|
776
|
+
## 架构概览
|
|
777
|
+
|
|
778
|
+
### 四层架构
|
|
73
779
|
|
|
74
780
|
```
|
|
75
|
-
|
|
781
|
+
Layer 3 Commands + Engines CLI 命令 + 状态机引擎
|
|
782
|
+
Layer 2 Providers 具体后端实现
|
|
783
|
+
Layer 1 Interfaces 抽象接口
|
|
784
|
+
Layer 0 Core Runtime 配置、路径、状态、锁、日志
|
|
76
785
|
```
|
|
77
786
|
|
|
78
|
-
###
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
798
|
+
| 引擎 | 职责 |
|
|
799
|
+
|------|------|
|
|
800
|
+
| SchedulerEngine | Planning → Backlog(选卡、排序、准入检查) |
|
|
801
|
+
| ExecutionEngine | Backlog → Todo → Inprogress(准备环境、启动 Worker、检测完成) |
|
|
802
|
+
| CloseoutEngine | QA → merge → Done(CI 检查、自动 merge、资源释放) |
|
|
803
|
+
| MonitorEngine | 异常检测(孤儿清理、超时、阻塞、状态对齐) |
|
|
84
804
|
|
|
85
|
-
|
|
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
|
-
|
|
860
|
+
---
|
|
88
861
|
|
|
89
862
|
## License
|
|
90
863
|
|