@coralai/sps-cli 0.51.2 → 0.51.4
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-CN.md +386 -924
- package/README.md +388 -1331
- package/dist/commands/skillCommand.js +19 -7
- package/dist/commands/skillCommand.js.map +1 -1
- package/dist/console/routes/chat.d.ts.map +1 -1
- package/dist/console/routes/chat.js +12 -3
- package/dist/console/routes/chat.js.map +1 -1
- package/dist/console-assets/assets/{index-WUGCBcyb.js → index-CIvfseMu.js} +139 -139
- package/dist/console-assets/assets/index-DKjevFID.css +10 -0
- package/dist/console-assets/index.html +2 -2
- package/dist/core/skillStore.d.ts +11 -2
- package/dist/core/skillStore.d.ts.map +1 -1
- package/dist/core/skillStore.js +18 -5
- package/dist/core/skillStore.js.map +1 -1
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/services/ChatService.d.ts +9 -0
- package/dist/services/ChatService.d.ts.map +1 -1
- package/dist/services/ChatService.js +30 -0
- package/dist/services/ChatService.js.map +1 -1
- package/package.json +1 -1
- package/dist/console-assets/assets/index-DRhdpvew.css +0 -10
package/README-CN.md
CHANGED
|
@@ -1,1074 +1,536 @@
|
|
|
1
|
-
# SPS CLI — AI
|
|
1
|
+
# SPS CLI — AI Agent 流水线编排器
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@coralai/sps-cli)
|
|
3
|
+
[](https://www.npmjs.com/package/@coralai/sps-cli) [](../../LICENSE)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> **English**:[README.md](./README.md)
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
创建卡片 → 启动 pipeline → AI 自动编码 → 自动合并到目标分支 → 通知完成
|
|
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
|
-
- [sps stop](#sps-stop)
|
|
30
|
-
- [sps reset](#sps-reset)
|
|
31
|
-
- [sps logs](#sps-logs)
|
|
32
|
-
- [Worker 规则文件](#worker-规则文件)
|
|
33
|
-
- [项目配置](#项目配置)
|
|
34
|
-
- [多项目并行](#多项目并行)
|
|
35
|
-
- [架构概览](#架构概览)
|
|
36
|
-
- [目录结构](#目录结构)
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## 安装
|
|
7
|
+
**v0.51.3**
|
|
41
8
|
|
|
42
|
-
|
|
43
|
-
npm install -g @coralai/sps-cli
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
本地开发:
|
|
9
|
+
SPS(Smart Pipeline System)驱动 Claude Code worker 走完任务卡 — 写代码、commit、push、QA、合并,全自动。三种模式:
|
|
47
10
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
```
|
|
11
|
+
| 模式 | 命令 | 适用场景 |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| **Harness** | `sps agent` | 零配置 — 与 Claude 一次性对话或多轮 chat。无需建项目、无需 PM。 |
|
|
14
|
+
| **Pipeline** | `sps tick <project>` | 自动化 — 卡片按 YAML 走完 stage 直到 Done。 |
|
|
15
|
+
| **Console** | `sps console` | Web UI — 看板、日志、worker、项目、聊天(v0.44+)。 |
|
|
54
16
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
| 依赖 | 最低版本 | 说明 |
|
|
58
|
-
|------|---------|------|
|
|
59
|
-
| Node.js | 18+ | CLI 运行环境 |
|
|
60
|
-
| git | 2.x | 分支与 worktree 管理 |
|
|
61
|
-
| Claude Code CLI 或 Codex CLI | 最新 | AI Worker |
|
|
62
|
-
| tmux | 3.x | 仅 `WORKER_MODE=interactive` 时需要 |
|
|
63
|
-
|
|
64
|
-
## 快速开始
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
# 1. 全局环境初始化(首次使用,配置 GitLab/PM/通知凭据)
|
|
68
|
-
sps setup
|
|
69
|
-
|
|
70
|
-
# 2. 克隆业务仓库(前置条件)
|
|
71
|
-
git clone git@gitlab.example.com:team/my-project.git ~/projects/my-project
|
|
72
|
-
|
|
73
|
-
# 3. 初始化 SPS 项目管理目录
|
|
74
|
-
sps project init my-project
|
|
75
|
-
|
|
76
|
-
# 4. 编辑项目配置
|
|
77
|
-
vim ~/.coral/projects/my-project/conf
|
|
78
|
-
|
|
79
|
-
# 5. 健康检查 + 自动修复(生成 CLAUDE.md、AGENTS.md、初始化 state.json 等)
|
|
80
|
-
sps doctor my-project --fix
|
|
81
|
-
|
|
82
|
-
# 6.(可选)编辑 Worker 规则,加入项目特有的编码规范
|
|
83
|
-
vim ~/projects/my-project/CLAUDE.md
|
|
84
|
-
|
|
85
|
-
# 7. 创建任务卡片
|
|
86
|
-
sps card add my-project "实现用户登录" "JWT 登录接口"
|
|
87
|
-
sps card add my-project "实现订单系统" "CRUD API + 分页"
|
|
88
|
-
|
|
89
|
-
# 8. 启动 pipeline(全自动,所有卡片完成后自动退出)
|
|
90
|
-
sps tick my-project
|
|
91
|
-
|
|
92
|
-
# 9.(可选)实时监控 Worker 运行状态
|
|
93
|
-
sps worker dashboard
|
|
94
|
-
```
|
|
17
|
+
v0.51 头条特性是 **Wiki 知识库** — per-project 可选,结构化互链 page(modules / concepts / decisions / lessons / sources),自动注入 worker prompt 的 5 层检索结果。详见 [doc-28](../../docs/design/28-wiki-system.md) 和 [`ATTRIBUTION.md`](./ATTRIBUTION.md)。
|
|
95
18
|
|
|
96
19
|
---
|
|
97
20
|
|
|
98
|
-
##
|
|
99
|
-
|
|
100
|
-
每张任务卡片按以下状态机流转,全程由 SPS 自动驱动:
|
|
101
|
-
|
|
102
|
-
### MR_MODE=none(默认,推荐)
|
|
103
|
-
|
|
104
|
-
Worker 完成编码后直接合并到目标分支,跳过 MR/CI/QA 环节:
|
|
105
|
-
|
|
106
|
-
```
|
|
107
|
-
Planning → Backlog → Todo → Inprogress → Done
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
| 阶段 | 触发引擎 | 操作 |
|
|
111
|
-
|------|---------|------|
|
|
112
|
-
| Planning → Backlog | SchedulerEngine | 选卡入队,检查准入条件 |
|
|
113
|
-
| Backlog → Todo | ExecutionEngine | 创建分支、创建 worktree、生成 `.sps/merge.sh` |
|
|
114
|
-
| Todo → Inprogress | ExecutionEngine | 分配 Worker slot、构建任务上下文、启动 AI Worker |
|
|
115
|
-
| Inprogress → Done | ExecutionEngine | 检测 Worker 完成(代码已合并到目标分支)、释放资源、清理 worktree |
|
|
116
|
-
|
|
117
|
-
Worker 执行的最后一步是运行 `bash .sps/merge.sh`,该脚本自动将 feature branch rebase 并合并到目标分支。
|
|
118
|
-
|
|
119
|
-
### MR_MODE=create(可选)
|
|
120
|
-
|
|
121
|
-
Worker 完成编码后创建 MR,任务即完成。MR 审核由后续流程处理(待开发):
|
|
122
|
-
|
|
123
|
-
```
|
|
124
|
-
Planning → Backlog → Todo → Inprogress → Done(MR 已创建)
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
| 阶段 | 触发引擎 | 操作 |
|
|
128
|
-
|------|---------|------|
|
|
129
|
-
| Inprogress → Done | ExecutionEngine | 检测 Worker 完成(MR 已创建)、释放资源、清理 worktree |
|
|
130
|
-
|
|
131
|
-
### 辅助状态标签
|
|
132
|
-
|
|
133
|
-
卡片可能被标记以下标签,表示需要特殊处理:
|
|
134
|
-
|
|
135
|
-
| 标签 | 含义 | 处理方式 |
|
|
136
|
-
|------|------|---------|
|
|
137
|
-
| `BLOCKED` | 被外部依赖阻塞 | 跳过,等待人工处理 |
|
|
138
|
-
| `NEEDS-FIX` | Worker 失败或 CI 失败 | 自动修复或人工介入 |
|
|
139
|
-
| `WAITING-CONFIRMATION` | Worker 等待破坏性操作确认 | 通知人工确认 |
|
|
140
|
-
| `CONFLICT` | 合并冲突 | Worker 自动解冲突或人工处理 |
|
|
141
|
-
| `STALE-RUNTIME` | Worker 运行时异常 | MonitorEngine 清理 |
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## 命令参考
|
|
146
|
-
|
|
147
|
-
### 全局选项
|
|
148
|
-
|
|
149
|
-
所有命令均支持:
|
|
150
|
-
|
|
151
|
-
| 选项 | 说明 |
|
|
152
|
-
|------|------|
|
|
153
|
-
| `--json` | 输出结构化 JSON(供脚本/cron 消费) |
|
|
154
|
-
| `--dry-run` | 预览操作,不实际执行 |
|
|
155
|
-
| `--help` | 显示帮助 |
|
|
156
|
-
| `--version` | 显示版本号 |
|
|
157
|
-
|
|
158
|
-
### 退出码
|
|
159
|
-
|
|
160
|
-
| 退出码 | 含义 |
|
|
161
|
-
|-------|------|
|
|
162
|
-
| `0` | 成功 |
|
|
163
|
-
| `1` | 业务失败 / 校验失败 |
|
|
164
|
-
| `2` | 参数错误 |
|
|
165
|
-
| `3` | 外部依赖不可用(GitLab / PM / Worker) |
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
### sps setup
|
|
170
|
-
|
|
171
|
-
全局环境初始化向导,配置各外部系统凭据。
|
|
172
|
-
|
|
173
|
-
```bash
|
|
174
|
-
sps setup [--force]
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
**交互式配置项:**
|
|
178
|
-
|
|
179
|
-
- GitLab:`GITLAB_URL`、`GITLAB_TOKEN`、`GITLAB_SSH_HOST`、`GITLAB_SSH_PORT`
|
|
180
|
-
- Plane:`PLANE_URL`、`PLANE_API_KEY`、`PLANE_WORKSPACE_SLUG`
|
|
181
|
-
- Trello:`TRELLO_API_KEY`、`TRELLO_TOKEN`
|
|
182
|
-
- Matrix:`MATRIX_HOMESERVER`、`MATRIX_TOKEN`、`MATRIX_ROOM_ID`
|
|
183
|
-
|
|
184
|
-
凭据写入 `~/.coral/env`(权限 0600),所有项目共享。
|
|
185
|
-
|
|
186
|
-
| 选项 | 说明 |
|
|
187
|
-
|------|------|
|
|
188
|
-
| `--force` | 覆盖已有的 `~/.coral/env` |
|
|
189
|
-
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
### sps project init
|
|
193
|
-
|
|
194
|
-
初始化 SPS 项目管理目录。
|
|
195
|
-
|
|
196
|
-
```bash
|
|
197
|
-
sps project init <project> [--force]
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
**创建的目录结构:**
|
|
201
|
-
|
|
202
|
-
```
|
|
203
|
-
~/.coral/projects/<project>/
|
|
204
|
-
├── conf # 项目配置文件(从模板生成)
|
|
205
|
-
├── logs/ # 日志目录
|
|
206
|
-
├── pm_meta/ # PM 元数据缓存
|
|
207
|
-
├── runtime/ # 运行时状态
|
|
208
|
-
├── pipeline_order.json # 卡片执行顺序
|
|
209
|
-
├── batch_scheduler.sh # cron 兼容入口脚本
|
|
210
|
-
└── deploy.sh # 部署脚本模板
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
| 选项 | 说明 |
|
|
214
|
-
|------|------|
|
|
215
|
-
| `--force` | 覆盖模板文件(conf 不会被覆盖) |
|
|
216
|
-
|
|
217
|
-
**示例:**
|
|
218
|
-
|
|
219
|
-
```bash
|
|
220
|
-
sps project init accounting-agent
|
|
221
|
-
# → 生成 ~/.coral/projects/accounting-agent/
|
|
222
|
-
# → 下一步:编辑 conf 填入配置值
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
### sps doctor
|
|
228
|
-
|
|
229
|
-
项目健康检查与自动修复。
|
|
230
|
-
|
|
231
|
-
```bash
|
|
232
|
-
sps doctor <project> [--fix] [--json] [--skip-remote]
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
等价于 `sps project doctor <project>`。
|
|
236
|
-
|
|
237
|
-
**检查项:**
|
|
238
|
-
|
|
239
|
-
| 检查项 | 说明 | --fix |
|
|
240
|
-
|-------|------|-------|
|
|
241
|
-
| global-env | `~/.coral/env` 是否存在 | — |
|
|
242
|
-
| global-env-vars | GITLAB_URL / GITLAB_TOKEN 是否已加载 | — |
|
|
243
|
-
| conf-load | 配置文件是否可加载 | — |
|
|
244
|
-
| conf-fields | 必填字段是否完整 | — |
|
|
245
|
-
| instance-dir / logs-dir / runtime-dir / pm-meta-dir | 目录结构 | 创建缺失目录 |
|
|
246
|
-
| repo-dir | 业务仓库是否存在且为 git 仓库 | — |
|
|
247
|
-
| gitignore-sps | `.sps/` 是否在 .gitignore 中 | 追加 |
|
|
248
|
-
| worker-rules | CLAUDE.md / AGENTS.md 是否存在于仓库根目录 | 生成并提交(含 .gitignore) |
|
|
249
|
-
| skill-profiles | DEFAULT_WORKER_SKILLS 指定的 profile 文件是否存在 | — |
|
|
250
|
-
| state-json | 运行时状态文件是否有效 | 初始化 |
|
|
251
|
-
| pipeline-order | 执行顺序文件是否存在 | 创建空 |
|
|
252
|
-
| conf-cli-fields | CLI 所需的 Provider 字段映射是否完整(仅 Plane) | 追加映射 |
|
|
253
|
-
| gitlab | GitLab API 连通性 | — |
|
|
254
|
-
| plane | Plane API 连通性(仅 PM_TOOL=plane) | — |
|
|
255
|
-
| pm-states / pm-lists | PM 状态/列表 UUID 是否有效 | 自动创建 + 写入 conf |
|
|
256
|
-
| worker-tool | Claude Code / Codex CLI 是否在 PATH 中 | — |
|
|
257
|
-
| tmux | tmux 是否可用(仅 WORKER_MODE=interactive) | — |
|
|
258
|
-
|
|
259
|
-
| 选项 | 说明 |
|
|
260
|
-
|------|------|
|
|
261
|
-
| `--fix` | 自动修复可修复的问题(创建目录、生成文件、初始化状态) |
|
|
262
|
-
| `--json` | 输出 JSON 格式的检查结果 |
|
|
263
|
-
| `--skip-remote` | 跳过远程连通性检查(GitLab/Plane) |
|
|
264
|
-
|
|
265
|
-
**示例:**
|
|
21
|
+
## 目录
|
|
266
22
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
sps
|
|
270
|
-
#
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
# - tmux Not required (WORKER_MODE=print)
|
|
280
|
-
|
|
281
|
-
# JSON 输出
|
|
282
|
-
sps doctor my-project --json
|
|
283
|
-
```
|
|
23
|
+
- [安装与初始化](#安装与初始化)
|
|
24
|
+
- [Harness 模式(`sps agent`)](#harness-模式sps-agent)
|
|
25
|
+
- [Console 模式(`sps console`)](#console-模式sps-console)
|
|
26
|
+
- [Pipeline 模式(`sps tick`)](#pipeline-模式sps-tick)
|
|
27
|
+
- [卡片生命周期](#卡片生命周期)
|
|
28
|
+
- [Memory + Wiki](#memory--wiki)
|
|
29
|
+
- [Skills](#skills)
|
|
30
|
+
- [命令参考](#命令参考)
|
|
31
|
+
- [项目配置(conf)](#项目配置conf)
|
|
32
|
+
- [目录布局](#目录布局)
|
|
33
|
+
- [架构](#架构)
|
|
34
|
+
- [Troubleshooting](#troubleshooting)
|
|
284
35
|
|
|
285
36
|
---
|
|
286
37
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
创建任务卡片。
|
|
38
|
+
## 安装与初始化
|
|
290
39
|
|
|
291
40
|
```bash
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
卡片创建在 Planning 状态,自动添加 `AI-PIPELINE` 标签,并追加到 `pipeline_order.json` 中。
|
|
296
|
-
|
|
297
|
-
创建后需要打一个 `skill:` 标签,指定 Worker 的专业技能(见下方标签说明)。
|
|
298
|
-
|
|
299
|
-
| 选项 | 说明 |
|
|
300
|
-
|------|------|
|
|
301
|
-
| `--json` | 输出 JSON 格式的创建结果 |
|
|
302
|
-
|
|
303
|
-
**示例:**
|
|
304
|
-
|
|
305
|
-
```bash
|
|
306
|
-
# 创建卡片 + 打 skill 标签
|
|
307
|
-
sps card add my-project "实现用户登录" "使用 JWT 的认证接口"
|
|
308
|
-
sps pm addLabel my-project 1 "skill:backend"
|
|
309
|
-
|
|
310
|
-
sps card add my-project "实现订单列表" "CRUD API + 分页查询"
|
|
311
|
-
sps pm addLabel my-project 2 "skill:backend"
|
|
312
|
-
|
|
313
|
-
sps card add my-project "写 API 文档" "用户和订单接口文档"
|
|
314
|
-
sps pm addLabel my-project 3 "skill:writer"
|
|
41
|
+
npm install -g @coralai/sps-cli # 最新 0.51.x
|
|
42
|
+
sps setup # 交互式向导(首次必跑)
|
|
315
43
|
```
|
|
316
44
|
|
|
317
|
-
|
|
45
|
+
`sps setup` 做的事:
|
|
46
|
+
1. 创建 `~/.coral/` 目录树(`projects/`、`memory/{user,agents}/`)。
|
|
47
|
+
2. 把 bundled skills 复制到 `~/.coral/skills/`。
|
|
48
|
+
3. 询问 `GITLAB_URL` / `GITLAB_TOKEN` / `MATRIX_*`(可跳过),写到 `~/.coral/env`。
|
|
49
|
+
4. 把 user skill symlink 到 `~/.claude/skills/`。
|
|
50
|
+
5. 全局安装 `@agentclientprotocol/claude-agent-acp`。
|
|
318
51
|
|
|
319
|
-
|
|
52
|
+
`sps setup --force` 重跑(保留旧值作默认)。**升级 sps-cli 后必须跑 `sps skill sync --force`** 才能拉新版 skill SOP(默认 sync 是非破坏性的,不会覆盖已有 skill)。
|
|
320
53
|
|
|
321
|
-
|
|
322
|
-
|------|------------|--------|
|
|
323
|
-
| `skill:architect` | 架构设计 | ADR、设计文档、目录结构 |
|
|
324
|
-
| `skill:frontend` | 前端开发 | 组件、页面、前端测试 |
|
|
325
|
-
| `skill:backend` | 后端开发 | API、DB migration、后端测试 |
|
|
326
|
-
| `skill:fullstack` | 全栈开发 | 前后端 + DB 一体化 |
|
|
327
|
-
| `skill:prototyper` | 快速原型 | 可运行的 MVP |
|
|
328
|
-
| `skill:reviewer` | 代码审查 | Review 报告 + 修复 commit |
|
|
329
|
-
| `skill:security` | 安全审计 | 审计报告 + 漏洞修复 |
|
|
330
|
-
| `skill:writer` | 技术文档 | README、API 文档、PRD |
|
|
331
|
-
| `skill:optimizer` | 性能优化 | Benchmark 报告 + 优化 commit |
|
|
332
|
-
| `skill:senior` | 通用(兜底) | 高质量通用实现 |
|
|
333
|
-
|
|
334
|
-
Profile 文件位于 `~/.coral/profiles/<name>.md`。无标签时 fallback 到项目 conf 中的 `DEFAULT_WORKER_SKILLS`。
|
|
54
|
+
**前置条件**:Node ≥ 18;Anthropic API key(或 Claude Pro / Max 订阅);`claude` CLI 在 PATH。
|
|
335
55
|
|
|
336
56
|
---
|
|
337
57
|
|
|
338
|
-
|
|
58
|
+
## Harness 模式(`sps agent`)
|
|
339
59
|
|
|
340
|
-
|
|
60
|
+
直接和 Claude 对话,单次或多轮。无项目、无 PM、无 git。
|
|
341
61
|
|
|
342
62
|
```bash
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
**执行顺序(每轮 tick):**
|
|
347
|
-
|
|
348
|
-
1. **scheduler tick** — Planning → Backlog(选卡入队)
|
|
349
|
-
2. **qa tick** — QA → merge → Done(优先释放 Worker slot)
|
|
350
|
-
3. **pipeline tick** — Backlog → Todo → Inprogress(准备环境 + 启动 Worker)
|
|
351
|
-
4. **monitor tick** — 异常巡检与对齐
|
|
352
|
-
|
|
353
|
-
**运行模式:**
|
|
354
|
-
|
|
355
|
-
| 模式 | 行为 |
|
|
356
|
-
|------|------|
|
|
357
|
-
| 持续模式(默认) | 每 30 秒循环一次,所有卡片完成后自动退出 |
|
|
358
|
-
|
|
359
|
-
**并发互斥:**
|
|
360
|
-
|
|
361
|
-
同一项目同一时刻只允许一个 `tick` 实例运行。通过 `runtime/tick.lock`(PID + 时间戳)实现互斥,超过 `TICK_LOCK_TIMEOUT_MINUTES`(默认 30 分钟)视为死锁可强制接管。
|
|
362
|
-
|
|
363
|
-
**失败分类:**
|
|
63
|
+
# 一次性
|
|
64
|
+
sps agent "解释这个 repo"
|
|
65
|
+
sps agent --output summary.md "总结架构"
|
|
364
66
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
67
|
+
# 多轮(daemon 后端,会话持久化)
|
|
68
|
+
sps agent --chat # 交互 REPL
|
|
69
|
+
sps agent --chat --name reviewer # 命名会话,下次可继续
|
|
70
|
+
sps agent status # 列活跃会话
|
|
71
|
+
sps agent close --name reviewer
|
|
370
72
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
| `--json` | 输出 JSON 格式的聚合结果 |
|
|
375
|
-
| `--dry-run` | 预览操作,不实际执行 |
|
|
73
|
+
# Profile + 上下文文件
|
|
74
|
+
sps agent --profile reviewer "审这个模块" --context src/auth.ts --context src/auth.test.ts
|
|
75
|
+
sps agent --system "你是发布工程师" "规划 v0.52 切版"
|
|
376
76
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
```bash
|
|
380
|
-
# 单项目持续运行
|
|
381
|
-
sps tick my-project
|
|
382
|
-
|
|
383
|
-
# 多项目同时管理
|
|
384
|
-
sps tick project-a project-b project-c
|
|
385
|
-
|
|
386
|
-
# JSON 输出(适合 cron)
|
|
387
|
-
sps tick my-project --json
|
|
388
|
-
|
|
389
|
-
# 预览模式
|
|
390
|
-
sps tick my-project --dry-run
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
**JSON 输出格式:**
|
|
394
|
-
|
|
395
|
-
```json
|
|
396
|
-
{
|
|
397
|
-
"project": "my-project",
|
|
398
|
-
"component": "tick",
|
|
399
|
-
"status": "ok",
|
|
400
|
-
"exitCode": 0,
|
|
401
|
-
"steps": [
|
|
402
|
-
{ "step": "scheduler", "status": "ok", "actions": [...] },
|
|
403
|
-
{ "step": "qa", "status": "ok", "actions": [...] },
|
|
404
|
-
{ "step": "pipeline", "status": "ok", "actions": [...] },
|
|
405
|
-
{ "step": "monitor", "status": "ok", "checks": [...] }
|
|
406
|
-
]
|
|
407
|
-
}
|
|
77
|
+
# Verbose
|
|
78
|
+
sps agent --verbose "为什么构建失败"
|
|
408
79
|
```
|
|
409
80
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
### sps scheduler tick
|
|
81
|
+
**`--profile <name>`**:查 `~/.coral/skills/dev-worker/references/<name>.md`,作为 system prompt 注入。(注意区别 `sps skill add` — 那是项目级 skill 链接。)
|
|
413
82
|
|
|
414
|
-
|
|
83
|
+
**Built-in agent**:仅 `claude`(Codex / Gemini 支持已在 v0.38 移除)。Worker 通过 ACP JSON-RPC over stdio 与 `claude-agent-acp` 通信。
|
|
415
84
|
|
|
416
|
-
|
|
417
|
-
sps scheduler tick <project> [--json] [--dry-run]
|
|
418
|
-
```
|
|
85
|
+
**Agent skill 由 Claude Code 自己加载**:`~/.claude/skills/` 是 `claude` 自己扫的目录 — 含 `sps-pipeline`、`sps-memory`、`wiki-update`、以及 24 个 dev / persona skill。Skill description 触发懒加载,harness 模式不需要 SPS 主动注入。
|
|
419
86
|
|
|
420
|
-
|
|
421
|
-
- 检查准入条件(Worker 可用性、冲突域等)
|
|
422
|
-
- 将符合条件的卡片从 Planning 推入 Backlog
|
|
423
|
-
|
|
424
|
-
**示例:**
|
|
425
|
-
|
|
426
|
-
```bash
|
|
427
|
-
sps scheduler tick my-project
|
|
428
|
-
sps scheduler tick my-project --dry-run
|
|
429
|
-
```
|
|
87
|
+
**Daemon cwd 注意**:`sps console` 和 `sps agent --chat` 启动 session daemon(`~/.coral/sessions/daemon.sock`),daemon 启动时捕获 `process.cwd()` 作为所有 chat worker 的默认工作目录。要切目录必须重启 daemon:`sps agent daemon stop && sps agent daemon start`,从目标目录发起。
|
|
430
88
|
|
|
431
89
|
---
|
|
432
90
|
|
|
433
|
-
|
|
91
|
+
## Console 模式(`sps console`)
|
|
434
92
|
|
|
435
|
-
|
|
93
|
+
本机 web UI,打包进二进制。`~/.coral/console.lock` 单实例保证。
|
|
436
94
|
|
|
437
95
|
```bash
|
|
438
|
-
sps
|
|
96
|
+
sps console # 打开 http://127.0.0.1:4311
|
|
97
|
+
sps console --port 5000
|
|
98
|
+
sps console --no-open # 不自动开浏览器
|
|
99
|
+
sps console --kill # 停止运行中的 console
|
|
100
|
+
sps console --dev # vite dev 模式(开发用)
|
|
439
101
|
```
|
|
440
102
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
1. **检查 Inprogress 卡片** — 检测 Worker 完成状态,MR_MODE=none 直接推入 Done,MR_MODE=create 确认 MR 后推入 Done
|
|
444
|
-
2. **处理 Backlog 卡片** — 创建分支 + 创建 worktree + 生成 `.sps/merge.sh` → 推入 Todo
|
|
445
|
-
3. **处理 Todo 卡片** — 分配 Worker slot + 构建任务上下文 + 启动 Worker → 推入 Inprogress
|
|
446
|
-
|
|
447
|
-
受 `MAX_ACTIONS_PER_TICK` 限制(默认 1),防止单轮 tick 同时启动过多 Worker。多个 Worker 启动之间有间隔(print 模式 2 秒,interactive 模式 10 秒)。
|
|
103
|
+
页面:
|
|
448
104
|
|
|
449
|
-
|
|
105
|
+
| 路径 | 用途 |
|
|
106
|
+
|---|---|
|
|
107
|
+
| `/projects` | 项目列表 + 状态摘要 |
|
|
108
|
+
| `/projects/new` | 新建项目(含 Wiki 开关,v0.51+) |
|
|
109
|
+
| `/projects/<n>` | Pipeline 编辑器 + conf 编辑器 + 删除 |
|
|
110
|
+
| `/board` | 看板(列内独立滚动,v0.51.1+) |
|
|
111
|
+
| `/workers` | 跨项目聚合 worker 仪表板 |
|
|
112
|
+
| `/logs` | 实时 SSE 日志查看器 |
|
|
113
|
+
| `/skills` | User-level skill 管理 |
|
|
114
|
+
| `/system` | 全局设置 + daemon 状态 |
|
|
115
|
+
| `/chat` | Agent 聊天(多会话,持久化) |
|
|
450
116
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
```bash
|
|
454
|
-
sps pipeline tick my-project
|
|
455
|
-
sps pipeline tick my-project --json
|
|
456
|
-
```
|
|
117
|
+
技术栈:Hono server on `127.0.0.1:4311`、chokidar 推 SSE 给 React 19 + Vite + Tailwind v4 + shadcn/ui 前端。设计系统:Pastel Neubrutalism,规范在 [`console/DESIGN.md`](./console/DESIGN.md)。
|
|
457
118
|
|
|
458
119
|
---
|
|
459
120
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
Worker 生命周期管理。
|
|
121
|
+
## Pipeline 模式(`sps tick`)
|
|
463
122
|
|
|
464
|
-
|
|
123
|
+
全自动卡片驱动。**单 worker,单卡,串行**。每卡走 YAML 定义的若干 stage(如 `develop → review → Done`);失败 → halt pipeline 直到你移除 `NEEDS-FIX` 标签。
|
|
465
124
|
|
|
466
|
-
|
|
125
|
+
### 建项目
|
|
467
126
|
|
|
468
127
|
```bash
|
|
469
|
-
sps
|
|
128
|
+
sps project init my-app
|
|
129
|
+
# 或用 Console /projects/new — 表单含 Wiki 开关(v0.51+)
|
|
470
130
|
```
|
|
471
131
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
**启动流程:**
|
|
475
|
-
|
|
476
|
-
1. 分配空闲 Worker slot
|
|
477
|
-
2. 写入 `.sps/task_prompt.txt` 到 worktree
|
|
478
|
-
3. 启动 Worker 进程
|
|
479
|
-
4. 卡片推入 Inprogress
|
|
480
|
-
|
|
481
|
-
**Worker 执行模式(`WORKER_MODE`):**
|
|
482
|
-
|
|
483
|
-
| 模式 | 默认 | 说明 |
|
|
484
|
-
|------|------|------|
|
|
485
|
-
| `print` | **是** | 一次性执行,进程退出 = 任务完成,不依赖 tmux |
|
|
486
|
-
| `interactive` | 否 | 传统 tmux TUI 交互模式(降级方案) |
|
|
132
|
+
会问:项目目录、合并分支、最大 worker 数、ACK 超时、可选 GitLab 远程、可选 Matrix 房间。
|
|
487
133
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
Worker 以子进程方式运行,prompt 通过 stdin 传入,输出写入 JSONL 文件:
|
|
134
|
+
生成:
|
|
491
135
|
|
|
492
136
|
```
|
|
493
|
-
|
|
494
|
-
|
|
137
|
+
~/.coral/projects/my-app/
|
|
138
|
+
├── conf # mode 600 — 当前活动配置
|
|
139
|
+
├── conf.example # 字段全参考(自动生成)
|
|
140
|
+
├── pipelines/
|
|
141
|
+
│ ├── project.yaml # 默认 1-stage(develop → Done)
|
|
142
|
+
│ └── sample.yaml.example # YAML 完整带注释参考
|
|
143
|
+
└── pipeline_order.json # 当前 active pipeline 指针
|
|
495
144
|
```
|
|
496
145
|
|
|
497
|
-
|
|
498
|
-
- **不会卡住** — 无 TUI 交互,进程退出即完成
|
|
499
|
-
- **不需要确认** — 权限参数跳过所有确认弹窗
|
|
500
|
-
- **上下文延续** — 通过 `--resume <sessionId>` 实现跨任务上下文复用(命中 prompt cache,节省 token)
|
|
501
|
-
- **不依赖 tmux** — 纯进程管理,适合 CI/CD 环境
|
|
502
|
-
|
|
503
|
-
**Session Resume 链:**
|
|
504
|
-
|
|
505
|
-
同一 worktree 上的多次任务(初始实现 → CI 修复 → 冲突解决)共享同一个 session:
|
|
146
|
+
在目标 repo(PROJECT_DIR)下:
|
|
506
147
|
|
|
507
148
|
```
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
149
|
+
.claude/CLAUDE.md # Worker 规则(自动安装)
|
|
150
|
+
.claude/skills/ # 从 ~/.coral/skills/ symlink
|
|
151
|
+
.claude/settings.local.json # Claude Code 本地配置
|
|
152
|
+
wiki/ # 若 WIKI_ENABLED — 见 doc-28
|
|
153
|
+
ATTRIBUTION.md # 若 WIKI_ENABLED
|
|
511
154
|
```
|
|
512
155
|
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
设置 `WORKER_MODE=interactive` 回退到 tmux 交互模式。此模式下复用策略:
|
|
516
|
-
|
|
517
|
-
| 场景 | 行为 |
|
|
518
|
-
|------|------|
|
|
519
|
-
| Session 存在 + Claude 运行中 | 复用:`/clear` + `cd worktree` |
|
|
520
|
-
| Session 存在 + Claude 未运行 | 复用 session:`cd` + 启动 Claude |
|
|
521
|
-
| 无 session | 创建新 session + 启动 Claude |
|
|
522
|
-
|
|
523
|
-
**示例:**
|
|
156
|
+
### 运行
|
|
524
157
|
|
|
525
158
|
```bash
|
|
526
|
-
sps
|
|
527
|
-
sps
|
|
159
|
+
sps tick my-app # 前台 tick 循环
|
|
160
|
+
sps pipeline start my-app # 别名
|
|
161
|
+
sps pipeline stop my-app # 优雅停(别名 sps stop my-app)
|
|
162
|
+
sps stop --all # 停所有运行中的 tick
|
|
163
|
+
sps status # 看所有项目
|
|
528
164
|
```
|
|
529
165
|
|
|
530
|
-
|
|
166
|
+
### Pipeline YAML
|
|
531
167
|
|
|
532
|
-
|
|
168
|
+
`~/.coral/projects/<n>/pipelines/project.yaml` — stage 单一来源。
|
|
533
169
|
|
|
534
|
-
```
|
|
535
|
-
|
|
170
|
+
```yaml
|
|
171
|
+
mode: project
|
|
172
|
+
git: true # false = 非代码项目,无 git 操作
|
|
173
|
+
stages:
|
|
174
|
+
- name: develop
|
|
175
|
+
profile: fullstack
|
|
176
|
+
on_complete: "move_card Review"
|
|
177
|
+
on_fail: { action: "label NEEDS-FIX", halt: true }
|
|
178
|
+
- name: review
|
|
179
|
+
profile: reviewer
|
|
180
|
+
on_complete: "move_card Done"
|
|
181
|
+
on_fail: { action: "label REVIEW-FAILED", halt: true }
|
|
536
182
|
```
|
|
537
183
|
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
**实时模式:**
|
|
545
|
-
|
|
546
|
-
- 默认每 3 秒刷新(可通过 `SPS_DASHBOARD_INTERVAL` 环境变量调整)
|
|
547
|
-
- 按 `q` 退出,按 `r` 强制刷新
|
|
548
|
-
- 使用 alternate screen buffer(不污染终端 scrollback)
|
|
549
|
-
- 自适应网格布局,每个 Worker 一个面板
|
|
550
|
-
- Print 模式面板显示:PID、exit code、JSONL 渲染后的可读输出
|
|
551
|
-
- Interactive 模式面板显示:tmux pane 实时输出
|
|
184
|
+
关键规则:
|
|
185
|
+
1. `mode: project` 是状态机式 pipeline;`mode: steps` 是一次性脚本,用 `sps pipeline run <name>` 触发。
|
|
186
|
+
2. 每个 stage 的 `on_complete` 必须指向**下一个** stage 的目标 state。
|
|
187
|
+
3. 最后一个 stage `on_complete: "move_card Done"`。
|
|
188
|
+
4. 别写 `agent:` 字段 — v0.38+ 起被静默忽略(Claude 是唯一 worker)。
|
|
189
|
+
5. `trigger` 和 `card_state` 按 stage 位置自动推导。
|
|
552
190
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
```bash
|
|
556
|
-
# 监控所有项目
|
|
557
|
-
sps worker dashboard
|
|
558
|
-
|
|
559
|
-
# 监控指定项目
|
|
560
|
-
sps worker dashboard my-project
|
|
561
|
-
|
|
562
|
-
# 单次快照
|
|
563
|
-
sps worker dashboard --once
|
|
564
|
-
|
|
565
|
-
# JSON 输出(供脚本消费)
|
|
566
|
-
sps worker dashboard --json
|
|
567
|
-
|
|
568
|
-
# 自定义刷新间隔
|
|
569
|
-
SPS_DASHBOARD_INTERVAL=5000 sps worker dashboard
|
|
570
|
-
```
|
|
191
|
+
字段全集见 `~/.coral/projects/<n>/pipelines/sample.yaml.example`(自动生成,注释丰富)或 [doc-17](../../docs/design/17-pipeline-configuration-design.md)。
|
|
571
192
|
|
|
572
193
|
---
|
|
573
194
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
PM 后端操作。
|
|
577
|
-
|
|
578
|
-
#### sps pm scan
|
|
195
|
+
## 卡片生命周期
|
|
579
196
|
|
|
580
|
-
查看卡片列表。
|
|
581
|
-
|
|
582
|
-
```bash
|
|
583
|
-
sps pm scan <project> [state]
|
|
584
197
|
```
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
**示例:**
|
|
589
|
-
|
|
590
|
-
```bash
|
|
591
|
-
# 查看所有卡片
|
|
592
|
-
sps pm scan my-project
|
|
593
|
-
|
|
594
|
-
# 按状态筛选
|
|
595
|
-
sps pm scan my-project Inprogress
|
|
596
|
-
sps pm scan my-project Planning
|
|
198
|
+
Planning → Backlog → Todo → Inprogress → [QA / Review] → Done
|
|
199
|
+
↓ 失败
|
|
200
|
+
NEEDS-FIX (halt)
|
|
597
201
|
```
|
|
598
202
|
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
手动移动卡片状态。
|
|
203
|
+
默认状态(可在 YAML `pm.card_states` 自定义)。
|
|
602
204
|
|
|
603
205
|
```bash
|
|
604
|
-
sps
|
|
605
|
-
|
|
206
|
+
sps card add <p> "标题" "描述"
|
|
207
|
+
sps card add <p> "T" "D" --skills python,backend --labels feature
|
|
606
208
|
|
|
607
|
-
|
|
209
|
+
sps card dashboard <p> # CLI 表格
|
|
210
|
+
# console: /board?project=<n>
|
|
608
211
|
|
|
609
|
-
|
|
610
|
-
sps
|
|
611
|
-
sps pm move my-project 25 Done
|
|
612
|
-
```
|
|
613
|
-
|
|
614
|
-
#### sps pm comment
|
|
615
|
-
|
|
616
|
-
给卡片添加评论。
|
|
212
|
+
sps card mark-started <p> <seq> # 由 Claude Code UserPromptSubmit hook 调用
|
|
213
|
+
sps card mark-complete <p> <seq> # 由 Claude Code Stop hook 调用
|
|
617
214
|
|
|
618
|
-
|
|
619
|
-
sps
|
|
215
|
+
sps reset <p> # 重置非 Done 卡
|
|
216
|
+
sps reset <p> --card 5,6,7
|
|
217
|
+
sps reset <p> --all # 全重置含 Done + worktree + branch
|
|
620
218
|
```
|
|
621
219
|
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
```bash
|
|
625
|
-
sps pm comment my-project 24 "CI 已通过,等待 review"
|
|
626
|
-
```
|
|
220
|
+
### 卡片标签词典
|
|
627
221
|
|
|
628
|
-
|
|
222
|
+
| 标签 | 含义 | 设置者 |
|
|
223
|
+
|---|---|---|
|
|
224
|
+
| `AI-PIPELINE` | 进入 pipeline 的必备标签 | 创建时由用户加 |
|
|
225
|
+
| `STARTED-<stage>` | ACK 信号 — Claude 收到了 prompt | UserPromptSubmit hook |
|
|
226
|
+
| `COMPLETED-<stage>` | Worker 完成了某 stage | Stop hook |
|
|
227
|
+
| `CLAIMED` | StageEngine 占了 worker slot | Engine |
|
|
228
|
+
| `NEEDS-FIX` | Worker 失败;pipeline halt | Engine |
|
|
229
|
+
| `BLOCKED` | 外部依赖阻塞;pipeline 跳过 | 用户 |
|
|
230
|
+
| `WAITING-CONFIRMATION` | Worker 等用户输入 | Engine |
|
|
231
|
+
| `STALE-RUNTIME` | Inprogress 超时 | MonitorEngine |
|
|
232
|
+
| `ACK-TIMEOUT` | Claude 在 `WORKER_ACK_TIMEOUT_S` 内没 ACK | MonitorEngine |
|
|
233
|
+
| `skill:<name>` | 强制加载某 skill | 用户 |
|
|
234
|
+
| `conflict:<domain>` | 同 domain 内串行 | 用户 |
|
|
629
235
|
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
```bash
|
|
633
|
-
# 创建清单
|
|
634
|
-
sps pm checklist create <project> <seq> "item1" "item2" "item3"
|
|
635
|
-
|
|
636
|
-
# 查看清单
|
|
637
|
-
sps pm checklist list <project> <seq>
|
|
638
|
-
|
|
639
|
-
# 勾选/取消勾选
|
|
640
|
-
sps pm checklist check <project> <seq> <item-id>
|
|
641
|
-
sps pm checklist uncheck <project> <seq> <item-id>
|
|
642
|
-
```
|
|
643
|
-
|
|
644
|
-
**示例:**
|
|
645
|
-
|
|
646
|
-
```bash
|
|
647
|
-
sps pm checklist create my-project 24 "单元测试" "集成测试" "代码审查"
|
|
648
|
-
sps pm checklist list my-project 24
|
|
649
|
-
sps pm checklist check my-project 24 item-001
|
|
650
|
-
```
|
|
236
|
+
活动 stage 会在 `~/.coral/projects/<p>/runtime/worker-<slot>-current.json` 写 marker 文件(v0.50.21+),Stop hook 读它判断 worker 刚刚做完哪张卡。
|
|
651
237
|
|
|
652
238
|
---
|
|
653
239
|
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
QA 闭环与 worktree 清理。
|
|
657
|
-
|
|
658
|
-
```bash
|
|
659
|
-
sps qa tick <project> [--json]
|
|
660
|
-
```
|
|
661
|
-
|
|
662
|
-
**MR_MODE=none 时:** QA 阶段主要负责 worktree 清理。Worker 完成后由 ExecutionEngine 直接推入 Done。
|
|
663
|
-
|
|
664
|
-
**MR_MODE=create 时:** QA 作为遗留兼容路径,处理到达 QA 状态的卡片(自动创建 MR 或标记 `NEEDS-FIX`)。
|
|
665
|
-
|
|
666
|
-
**Worktree 自动清理:**
|
|
667
|
-
|
|
668
|
-
每轮 qa tick 结束后,自动处理 `state.worktreeCleanup` 队列中的待清理项:
|
|
240
|
+
## Memory + Wiki
|
|
669
241
|
|
|
670
|
-
|
|
671
|
-
2. `git branch -d <branch>` — 删除已合并的本地分支
|
|
672
|
-
3. `git worktree prune` — 清理残留引用
|
|
242
|
+
两套互补的持久化系统,都自动注入 worker prompt。
|
|
673
243
|
|
|
674
|
-
|
|
244
|
+
| | **Memory** | **Wiki**(v0.51+) |
|
|
245
|
+
|---|---|---|
|
|
246
|
+
| 路径 | `~/.coral/memory/{user,agents,projects/<p>}/` | `<repo>/wiki/`(per-project,进 repo) |
|
|
247
|
+
| 格式 | 平铺 markdown + YAML frontmatter | 5 类 page,zod 校验的 frontmatter |
|
|
248
|
+
| 互链 | 无(平铺索引) | `[[type/Title]]` wikilink |
|
|
249
|
+
| 自动注入 | prompt 的 `knowledge` 段 | `wikiContext` 段(5 层检索) |
|
|
250
|
+
| 开关 | 默认开(`ENABLE_MEMORY=false` 关) | per-project(`WIKI_ENABLED=true` 开) |
|
|
251
|
+
| 适合 | 个人偏好、零散决策、坑 | 结构化项目知识:modules、concepts、decisions、lessons |
|
|
675
252
|
|
|
676
|
-
|
|
253
|
+
### Memory CLI
|
|
677
254
|
|
|
678
255
|
```bash
|
|
679
|
-
sps
|
|
680
|
-
sps
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
---
|
|
684
|
-
|
|
685
|
-
### sps monitor tick
|
|
686
|
-
|
|
687
|
-
手动执行异常检测与健康巡检。
|
|
256
|
+
sps memory list <p> # 看项目 memory 索引
|
|
257
|
+
sps memory list # 看全局 user + agents
|
|
258
|
+
sps memory context <p> --card <seq> # 预览注入内容
|
|
688
259
|
|
|
689
|
-
|
|
690
|
-
|
|
260
|
+
sps memory add <p> --type convention --name "API 用 camelCase" \
|
|
261
|
+
--description "REST 接口用 camelCase" --body "..."
|
|
691
262
|
```
|
|
692
263
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
| 检查 | 说明 |
|
|
696
|
-
|------|------|
|
|
697
|
-
| 孤儿 slot 清理 | 进程/tmux session 已死但 slot 仍标记 active |
|
|
698
|
-
| 超时检测 | Inprogress 超过 `INPROGRESS_TIMEOUT_HOURS` |
|
|
699
|
-
| 等待确认检测 | Worker 等待用户确认(仅 interactive 模式;print 模式无确认) |
|
|
700
|
-
| 阻塞检测 | Worker 遇到 error/fatal/stuck 等(仅 interactive 模式) |
|
|
701
|
-
| 状态对齐 | PM 状态与 runtime 状态是否一致 |
|
|
264
|
+
类型:`convention`(不衰减)、`decision`(缓慢衰减)、`lesson`(30 天衰减)、`reference`(不衰减)。
|
|
702
265
|
|
|
703
|
-
|
|
266
|
+
### Wiki CLI(`WIKI_ENABLED=true` 时)
|
|
704
267
|
|
|
705
268
|
```bash
|
|
706
|
-
sps
|
|
707
|
-
sps
|
|
269
|
+
sps wiki init <p> # scaffold wiki/(开了 toggle 时建项目自动跑)
|
|
270
|
+
sps wiki update <p> # 看 source diff
|
|
271
|
+
sps wiki update <p> --finalize # worker 写完 page 后刷新 manifest
|
|
272
|
+
sps wiki check <p> # lint:orphan / dead-link / fm-gap / stale
|
|
273
|
+
sps wiki list <p> --type lesson --tag pipeline
|
|
274
|
+
sps wiki get <p> lessons/Stop-Hook-Race
|
|
275
|
+
sps wiki status <p> # source ↔ manifest ↔ pages 差异
|
|
276
|
+
sps wiki add <p> ~/notes.md --category transcripts
|
|
277
|
+
sps wiki read <p> "<query>" # 预览 5 层检索
|
|
708
278
|
```
|
|
709
279
|
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
### sps stop
|
|
280
|
+
5 层检索:hot.md / index 节选 / pinned / skill-tag / BM25F keyword。类型优先级:lesson = 3、decision = 3、concept = 2、module = 1、source = 1。Token 预算硬上限 ~2000。
|
|
713
281
|
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
```bash
|
|
717
|
-
sps stop <project> # 停止指定项目
|
|
718
|
-
sps stop --all # 停止所有运行中的 tick
|
|
719
|
-
```
|
|
282
|
+
Worker SOP:[`skills/wiki-update/SKILL.md`](./skills/wiki-update/SKILL.md)(300 行,单一来源)。
|
|
720
283
|
|
|
721
284
|
---
|
|
722
285
|
|
|
723
|
-
|
|
286
|
+
## Skills
|
|
724
287
|
|
|
725
|
-
|
|
288
|
+
User-level skill 在 `~/.coral/skills/`(28 个 bundled,`sps setup` 时从 npm 包拷贝)。Symlink 到 `~/.claude/skills/`,Claude Code 自动加载。
|
|
726
289
|
|
|
727
290
|
```bash
|
|
728
|
-
sps
|
|
729
|
-
sps
|
|
730
|
-
sps
|
|
731
|
-
sps
|
|
291
|
+
sps skill list # 列可用 + 项目链接状态
|
|
292
|
+
sps skill add <name> --project <p> # symlink 到 <repo>/.claude/skills/
|
|
293
|
+
sps skill remove <name> --project <p>
|
|
294
|
+
sps skill freeze <name> --project <p> # symlink → 真实副本(项目可定制)
|
|
295
|
+
sps skill unfreeze <name> --project <p> # 改回 symlink
|
|
296
|
+
sps skill sync # ① bundled (npm 包) → ~/.coral/skills/
|
|
297
|
+
# ② ~/.coral/skills/ → ~/.claude/skills/
|
|
298
|
+
sps skill sync --force # ⭐ 覆盖已存在的 user skill(升级 sps-cli 后用)
|
|
732
299
|
```
|
|
733
300
|
|
|
734
|
-
|
|
301
|
+
Bundled skill 列表(v0.51.3):
|
|
735
302
|
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
sps tick my-project # 重新跑
|
|
740
|
-
```
|
|
303
|
+
- **开发类(23 个)**:`frontend`、`frontend-developer`、`backend`、`backend-architect`、`typescript`、`golang`、`rust`、`python`、`java`、`kotlin`、`swift`、`mobile`、`database`、`database-optimizer`、`qa-tester`、`security-engineer`、`architecture-decision-records`、`coding-standards`、`debugging-workflow`、`devops`、`devops-automator`、`git-workflow`、`code-reviewer`
|
|
304
|
+
- **Worker profile(3 个)**:`dev-worker`、`tax-worker`、`reviewer`(通过 `--profile` 引用)
|
|
305
|
+
- **SPS 专用(5 个)**:`sps-pipeline`、`sps-memory`、`wiki-update`
|
|
741
306
|
|
|
742
307
|
---
|
|
743
308
|
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
实时日志查看器。
|
|
747
|
-
|
|
748
|
-
```bash
|
|
749
|
-
sps logs [project] # 跟踪 pipeline 日志
|
|
750
|
-
sps logs <project> --err # 跟踪 error 日志
|
|
751
|
-
sps logs <project> --lines 50 # 显示最近 50 行
|
|
752
|
-
sps logs <project> --no-follow # 打印后退出
|
|
753
|
-
```
|
|
754
|
-
|
|
755
|
-
---
|
|
756
|
-
|
|
757
|
-
## Worker 规则文件
|
|
758
|
-
|
|
759
|
-
`sps doctor --fix` 会根据 `WORKER_TOOL` 配置在业务仓库根目录生成规则文件并自动提交:
|
|
760
|
-
|
|
761
|
-
| 文件 | 用途 | 要求 | 提交到 git |
|
|
762
|
-
|------|------|------|-----------|
|
|
763
|
-
| `CLAUDE.md` | Claude Code Worker 的项目规则 | `WORKER_TOOL=claude` 时必需 | 是 |
|
|
764
|
-
| `AGENTS.md` | Codex Worker 的项目规则 | `WORKER_TOOL=codex` 时必需 | 是 |
|
|
765
|
-
| `.sps/development_prompt.txt` | Development 阶段提示词(调试存档) | 自动生成 | 否(.gitignore) |
|
|
766
|
-
| `.sps/integration_prompt.txt` | Integration 阶段提示词(调试存档) | 自动生成 | 否(.gitignore) |
|
|
767
|
-
| `docs/DECISIONS.md` | 项目知识库——架构决策和技术选择 | — | 是(Worker 自动维护) |
|
|
768
|
-
| `docs/CHANGELOG.md` | 项目知识库——变更记录 | — | 是(Worker 自动维护) |
|
|
769
|
-
|
|
770
|
-
> **注意(v0.25.0+):** 提示词在内存中生成,通过 stdin 传递给 worker。`.sps/` 下的文件仅为调试存档,缺失不影响流程。
|
|
771
|
-
|
|
772
|
-
**Skill Profile 注入(v0.16+):**
|
|
773
|
-
|
|
774
|
-
| 文件 | 用途 |
|
|
775
|
-
|------|------|
|
|
776
|
-
| `~/.coral/profiles/<name>.md` | 通过 `skill:<name>` 标签加载到 Worker prompt |
|
|
777
|
-
|
|
778
|
-
Prompt 组装顺序:Skill Profile → CLAUDE.md/AGENTS.md → DECISIONS.md/CHANGELOG.md → 任务描述
|
|
779
|
-
|
|
780
|
-
### 工作原理
|
|
781
|
-
|
|
782
|
-
1. `CLAUDE.md` 和 `AGENTS.md` 提交到仓库主分支
|
|
783
|
-
2. 创建 git worktree 时自动继承这些文件
|
|
784
|
-
3. Worker 启动时读取 CLAUDE.md 了解项目规则(interactive 模式自动发现;print 模式在 cwd 中自动加载)
|
|
785
|
-
4. 任务特有信息(seq、分支名、描述)写入 `.sps/task_prompt.txt`,通过 stdin 传给 Worker(print 模式)或通过 tmux paste 传入(interactive 模式)
|
|
786
|
-
5. `.sps/merge.sh` 在每个 worktree 中自动生成,Worker 在 push 后运行此脚本完成合并或 MR 创建
|
|
787
|
-
|
|
788
|
-
### 项目知识库
|
|
789
|
-
|
|
790
|
-
每个 Worker 在任务 prompt 中被要求:
|
|
791
|
-
|
|
792
|
-
- **开始前**:阅读 `docs/DECISIONS.md` 和 `docs/CHANGELOG.md`,了解前序任务的决策和变更
|
|
793
|
-
- **完成后**:将自己的架构决策追加到 `docs/DECISIONS.md`,变更摘要追加到 `docs/CHANGELOG.md`
|
|
794
|
-
|
|
795
|
-
这些文件随代码一起合并到目标分支,下一个 Worker 创建 worktree 时自动继承,实现跨任务的知识传递。
|
|
796
|
-
|
|
797
|
-
### 自定义项目规则
|
|
798
|
-
|
|
799
|
-
生成的 CLAUDE.md 包含"Project-Specific Rules"占位区,你可以在此添加:
|
|
800
|
-
|
|
801
|
-
```markdown
|
|
802
|
-
## Project-Specific Rules
|
|
803
|
-
- 语言:TypeScript strict mode
|
|
804
|
-
- 测试框架:vitest,覆盖率 80%+
|
|
805
|
-
- 架构:src/modules/<domain>/ 目录结构
|
|
806
|
-
- Linting:eslint + prettier,提交前必须通过
|
|
807
|
-
```
|
|
808
|
-
|
|
809
|
-
SPS 不会覆盖已存在的 CLAUDE.md / AGENTS.md。
|
|
810
|
-
|
|
811
|
-
---
|
|
812
|
-
|
|
813
|
-
## 项目配置
|
|
814
|
-
|
|
815
|
-
配置分两层:
|
|
816
|
-
|
|
817
|
-
| 文件 | 作用域 | 说明 |
|
|
818
|
-
|------|-------|------|
|
|
819
|
-
| `~/.coral/env` | 全局 | 所有项目共享的凭据(GitLab token、PM API key 等) |
|
|
820
|
-
| `~/.coral/projects/<project>/conf` | 项目级 | 项目特有配置(仓库、分支、Worker 参数等) |
|
|
821
|
-
|
|
822
|
-
项目 conf 可以引用全局变量(如 `${PLANE_URL}`)。
|
|
823
|
-
|
|
824
|
-
### 配置字段一览
|
|
825
|
-
|
|
826
|
-
#### 项目基础
|
|
827
|
-
|
|
828
|
-
| 字段 | 必填 | 默认值 | 说明 |
|
|
829
|
-
|------|------|-------|------|
|
|
830
|
-
| `PROJECT_NAME` | 是 | — | 项目名称 |
|
|
831
|
-
| `PROJECT_DIR` | 否 | `~/projects/<project>` | 业务仓库路径 |
|
|
832
|
-
|
|
833
|
-
#### GitLab
|
|
834
|
-
|
|
835
|
-
| 字段 | 必填 | 默认值 | 说明 |
|
|
836
|
-
|------|------|-------|------|
|
|
837
|
-
| `GITLAB_PROJECT` | 是 | — | GitLab 项目路径(如 `group/repo`) |
|
|
838
|
-
| `GITLAB_PROJECT_ID` | 是 | — | GitLab 项目数字 ID |
|
|
839
|
-
| `GITLAB_MERGE_BRANCH` | 是 | `develop` | MR 目标分支 |
|
|
840
|
-
|
|
841
|
-
#### PM 后端
|
|
842
|
-
|
|
843
|
-
| 字段 | 必填 | 默认值 | 说明 |
|
|
844
|
-
|------|------|-------|------|
|
|
845
|
-
| `PM_TOOL` | 否 | `trello` | PM 后端类型:`plane` / `trello` / `markdown` |
|
|
846
|
-
| `PIPELINE_LABEL` | 否 | `AI-PIPELINE` | Pipeline 卡片标签 |
|
|
847
|
-
| `MR_MODE` | 否 | `none` | 合并模式:`none`(直接合并到目标分支) / `create`(创建 MR,审核流程待开发) |
|
|
848
|
-
|
|
849
|
-
#### Worker
|
|
850
|
-
|
|
851
|
-
| 字段 | 必填 | 默认值 | 说明 |
|
|
852
|
-
|------|------|-------|------|
|
|
853
|
-
| `WORKER_TOOL` | 否 | `claude` | Worker 类型:`claude` / `codex` |
|
|
854
|
-
| `WORKER_TRANSPORT` | 否 | `acp-sdk` | Worker 传输方式:`acp-sdk`(ACP JSON-RPC,默认)/ `proc`(一次性进程降级) |
|
|
855
|
-
| `MAX_CONCURRENT_WORKERS` | 否 | `3` | 最大并行 Worker 数 |
|
|
856
|
-
| `WORKER_RESTART_LIMIT` | 否 | `2` | Worker 死亡后最大重启次数 |
|
|
857
|
-
| `MAX_ACTIONS_PER_TICK` | 否 | `1` | 每轮 tick 最大操作数 |
|
|
858
|
-
|
|
859
|
-
#### 超时与策略
|
|
860
|
-
|
|
861
|
-
| 字段 | 必填 | 默认值 | 说明 |
|
|
862
|
-
|------|------|-------|------|
|
|
863
|
-
| `INPROGRESS_TIMEOUT_HOURS` | 否 | `8` | Inprogress 超时小时数 |
|
|
864
|
-
| `MONITOR_AUTO_QA` | 否 | `false` | Monitor 是否自动将完成的卡推入 QA |
|
|
865
|
-
| `CONFLICT_DEFAULT` | 否 | `serial` | 冲突域默认策略:`serial` / `parallel` |
|
|
866
|
-
| `TICK_LOCK_TIMEOUT_MINUTES` | 否 | `30` | tick 锁超时分钟数 |
|
|
867
|
-
|
|
868
|
-
#### 路径
|
|
869
|
-
|
|
870
|
-
| 字段 | 必填 | 默认值 | 说明 |
|
|
871
|
-
|------|------|-------|------|
|
|
872
|
-
| `WORKTREE_DIR` | 否 | `~/.coral/worktrees/` | worktree 根目录 |
|
|
873
|
-
|
|
874
|
-
### 配置示例
|
|
309
|
+
## 命令参考
|
|
875
310
|
|
|
876
311
|
```bash
|
|
877
|
-
#
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
#
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
312
|
+
# Setup & 项目
|
|
313
|
+
sps setup [--force]
|
|
314
|
+
sps project init <name>
|
|
315
|
+
sps project doctor <name> [--fix] [--json] [--reset-state] [--skip-remote]
|
|
316
|
+
sps doctor <name> --fix # 别名
|
|
317
|
+
|
|
318
|
+
# Pipeline
|
|
319
|
+
sps tick <project> [--json]
|
|
320
|
+
sps pipeline start|stop|status|reset|workers|board|card|logs|list|run|use [project] [args]
|
|
321
|
+
sps pipeline run <name> "<prompt>" # 用于 mode: steps pipeline
|
|
322
|
+
sps pipeline tick <project> # 单次 StageEngine pass
|
|
323
|
+
sps scheduler tick <project> # Planning → Backlog 提升
|
|
324
|
+
sps qa tick <project> # QA → Done 收尾
|
|
325
|
+
sps monitor tick <project> # 健康探测(ACK timeout、stale)
|
|
326
|
+
sps pm scan <project> # 从磁盘重建卡片索引
|
|
327
|
+
|
|
328
|
+
# 卡片
|
|
329
|
+
sps card add <p> "title" ["description"] [--skills a,b] [--labels x,y]
|
|
330
|
+
sps card dashboard <p>
|
|
331
|
+
sps card mark-started <p> [seq] [--stage <name>]
|
|
332
|
+
sps card mark-complete <p> <seq> [--stage <name>]
|
|
891
333
|
|
|
892
334
|
# Worker
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
335
|
+
sps worker ps <project>
|
|
336
|
+
sps worker dashboard <project>
|
|
337
|
+
sps worker kill <project> <seq>
|
|
338
|
+
sps worker launch <project> <seq>
|
|
339
|
+
|
|
340
|
+
# 状态 / 日志
|
|
341
|
+
sps status [--json]
|
|
342
|
+
sps stop <project> [--all]
|
|
343
|
+
sps reset <project> [--all] [--card N,N,N]
|
|
344
|
+
sps logs [project] [--err] [--lines N] [--no-follow]
|
|
345
|
+
|
|
346
|
+
# Memory
|
|
347
|
+
sps memory list [project] [--agent <id>]
|
|
348
|
+
sps memory context <project> [--card <seq>] [--agent <id>]
|
|
349
|
+
sps memory add <project> --type <T> --name "title" [--body "content"]
|
|
350
|
+
|
|
351
|
+
# Wiki(v0.51+)
|
|
352
|
+
sps wiki init <p>
|
|
353
|
+
sps wiki update <p> [--finalize] [--json]
|
|
354
|
+
sps wiki read <p> "<query>" [--skills a,b] [--pinned id1,id2] [--budget N]
|
|
355
|
+
sps wiki check <p> [--json] [--fix]
|
|
356
|
+
sps wiki add <p> <file> [--category <name>] [--no-ingest]
|
|
357
|
+
sps wiki list <p> [--type T] [--tag T] [--json]
|
|
358
|
+
sps wiki get <p> <pageId> [--json]
|
|
359
|
+
sps wiki status <p> [--json]
|
|
360
|
+
|
|
361
|
+
# Skill
|
|
362
|
+
sps skill list [--project <p>]
|
|
363
|
+
sps skill add <name> [--project <p>]
|
|
364
|
+
sps skill remove <name> [--project <p>]
|
|
365
|
+
sps skill freeze <name> [--project <p>]
|
|
366
|
+
sps skill unfreeze <name> [--project <p>]
|
|
367
|
+
sps skill sync [--force]
|
|
368
|
+
|
|
369
|
+
# Console
|
|
370
|
+
sps console [--port N] [--host H] [--no-open] [--dev] [--kill]
|
|
371
|
+
|
|
372
|
+
# Agent
|
|
373
|
+
sps agent "<prompt>" [--profile <p>] [--system "..."] [--context file] [--output file] [--verbose]
|
|
374
|
+
sps agent --chat [--name <session>]
|
|
375
|
+
sps agent status|close|list|add [args]
|
|
376
|
+
sps agent daemon start|stop|status
|
|
377
|
+
|
|
378
|
+
# Hook(由 Claude Code 调用,不是用户)
|
|
379
|
+
sps hook stop
|
|
380
|
+
sps hook user-prompt-submit
|
|
381
|
+
|
|
382
|
+
# ACP 控制(高级 debug 用)
|
|
383
|
+
sps acp <ensure|run|prompt|status|stop|pending|respond> <project> [args]
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
任何命令后加 `--help` 看具体用法;支持的命令加 `--json` 输出结构化结果。
|
|
900
387
|
|
|
901
388
|
---
|
|
902
389
|
|
|
903
|
-
##
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
-
|
|
390
|
+
## 项目配置(conf)
|
|
391
|
+
|
|
392
|
+
文件位置 `~/.coral/projects/<name>/conf`(shell `export VAR="value"` 语法,mode 600)。完整字段参考自动生成在 `~/.coral/projects/<name>/conf.example`。
|
|
393
|
+
|
|
394
|
+
| 字段 | 默认 | 说明 |
|
|
395
|
+
|---|---|---|
|
|
396
|
+
| `PROJECT_NAME` | (必填) | 内部 id |
|
|
397
|
+
| `PROJECT_DIR` | (必填) | repo 绝对路径 |
|
|
398
|
+
| `GITLAB_PROJECT` | — | `user/repo`(可选,用 GitLab API 时必填) |
|
|
399
|
+
| `GITLAB_PROJECT_ID` | — | 数字 ID(GitLab 才需,按路径首次 MR 时自动解析) |
|
|
400
|
+
| `GITLAB_MERGE_BRANCH` | `main` | Worker push 的目标分支 |
|
|
401
|
+
| `PM_TOOL` | `markdown` | **v0.42 起只支持 `markdown`**。卡片在 `~/.coral/projects/<n>/cards/<state>/<seq>.md` |
|
|
402
|
+
| `PIPELINE_LABEL` | `AI-PIPELINE` | 卡片进入 pipeline 必备标签 |
|
|
403
|
+
| `MR_MODE` | `none` | `none`(直接 push)/ `create`(开 MR,需要 `GITLAB_PROJECT_ID`) |
|
|
404
|
+
| `WORKER_TRANSPORT` | `acp-sdk` | 固定,不要改 |
|
|
405
|
+
| `MAX_CONCURRENT_WORKERS` | `1` | Slot 数;同一项目内卡仍是串行 |
|
|
406
|
+
| `MAX_ACTIONS_PER_TICK` | `3` | 单次 tick 可领多少新任务 |
|
|
407
|
+
| `INPROGRESS_TIMEOUT_HOURS` | `2` | 超时后 MonitorEngine 标 STALE-RUNTIME |
|
|
408
|
+
| `WORKER_ACK_TIMEOUT_S` | `300` | 派发后等 STARTED-<stage> 标签的最长时间(v0.50.24 提到 5min) |
|
|
409
|
+
| `WORKER_ACK_MAX_RETRIES` | `1` | ACK 超时后最多重试次数 |
|
|
410
|
+
| `MONITOR_AUTO_QA` | `true` | 检测到 stale runtime 时自动迁到 QA |
|
|
411
|
+
| `CONFLICT_DEFAULT` | `serial` | 卡上无 `conflict:` 标签时的兜底策略 |
|
|
412
|
+
| `MATRIX_ROOM_ID` | — | 项目级 Matrix 覆盖 |
|
|
413
|
+
| `WORKTREE_DIR` | `~/.coral/worktrees/<p>` | Worker 工作树根 |
|
|
414
|
+
| `DEFAULT_WORKER_SKILLS` | — | 逗号分隔;卡上无 `profile:` 也无 `card.skills` 时兜底 |
|
|
415
|
+
| `ENABLE_MEMORY` | `true` | `false` 跳过 prompt 里的 memory 写指引 |
|
|
416
|
+
| **`WIKI_ENABLED`** | 未设(关) | **v0.51+**:`true` 启用 wiki context 注入 + reminder |
|
|
417
|
+
| `COMPLETION_SIGNAL` | `done` | Stop hook 监听的完成关键词 |
|
|
418
|
+
|
|
419
|
+
全局凭证 `~/.coral/env`:`GITLAB_URL`、`GITLAB_TOKEN`、`GITLAB_SSH_HOST`、`GITLAB_SSH_PORT`、`MATRIX_HOMESERVER`、`MATRIX_ACCESS_TOKEN`、`MATRIX_ROOM_ID`。`sps setup` 写或 `vim` 改。
|
|
916
420
|
|
|
917
|
-
|
|
421
|
+
---
|
|
918
422
|
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
423
|
+
## 目录布局
|
|
424
|
+
|
|
425
|
+
```
|
|
426
|
+
~/.coral/ # 用户全局状态
|
|
427
|
+
├── env # 全局凭证(mode 600)
|
|
428
|
+
├── skills/ # User-level skill(从 npm 同步)
|
|
429
|
+
├── memory/{user,agents,projects}/ # 3 层 memory 存储
|
|
430
|
+
├── projects/<name>/ # 项目状态
|
|
431
|
+
│ ├── conf # 项目配置(mode 600)
|
|
432
|
+
│ ├── conf.example # 字段全参考(自动生成)
|
|
433
|
+
│ ├── pipelines/{project,*}.yaml # Pipeline 定义
|
|
434
|
+
│ ├── pipeline_order.json # 当前 active pipeline 指针
|
|
435
|
+
│ ├── runtime/state.json # Worker slot + 当前卡状态
|
|
436
|
+
│ ├── runtime/worker-<slot>-current.json # Per-slot 卡 marker(v0.50.21+)
|
|
437
|
+
│ ├── runtime/tick.lock # tick 锁
|
|
438
|
+
│ ├── runtime/acp-state.json # ACP 会话状态
|
|
439
|
+
│ ├── cards/<state>/<seq>.md # 卡片文件(markdown PM 后端)
|
|
440
|
+
│ ├── cards/seq.txt # 序列号
|
|
441
|
+
│ ├── logs/ # 每次 tick 的日志
|
|
442
|
+
│ └── pm_meta/ # 卡片索引
|
|
443
|
+
├── sessions/ # Agent daemon(chat 会话)
|
|
444
|
+
│ ├── daemon.sock daemon.pid
|
|
445
|
+
│ └── chat-sessions/<id>.json # 持久化 chat 会话
|
|
446
|
+
├── console.lock # console 单实例 guard
|
|
447
|
+
└── worktrees/<project>/<seq>/ # 每张活动卡一个 worktree
|
|
448
|
+
|
|
449
|
+
<目标 repo>/ # 你的项目 repo
|
|
450
|
+
├── .claude/
|
|
451
|
+
│ ├── CLAUDE.md # Worker 规则(项目相关 + SPS 注入)
|
|
452
|
+
│ ├── settings.local.json # Claude Code 本地配置
|
|
453
|
+
│ ├── skills/ # 从 ~/.coral/skills/ symlink
|
|
454
|
+
│ └── hooks/{start,stop}.sh # 生命周期 hook(call sps)
|
|
455
|
+
├── wiki/ # 若 WIKI_ENABLED — 见 doc-28
|
|
456
|
+
└── ATTRIBUTION.md # 若 WIKI_ENABLED
|
|
923
457
|
```
|
|
924
458
|
|
|
925
459
|
---
|
|
926
460
|
|
|
927
|
-
##
|
|
461
|
+
## 架构
|
|
928
462
|
|
|
929
|
-
|
|
463
|
+
4 层服务架构(v0.50+):
|
|
930
464
|
|
|
931
465
|
```
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
466
|
+
Delivery (commands/, console/routes/) 参数解析 + I/O 编排(薄)
|
|
467
|
+
↓
|
|
468
|
+
Service (services/) ProjectService / ChatService / PipelineService /
|
|
469
|
+
SkillService / WikiService — Result<T> + DomainEvent
|
|
470
|
+
↓
|
|
471
|
+
Domain (engines/) SchedulerEngine / StageEngine / MonitorEngine /
|
|
472
|
+
CloseoutEngine / EventHandler — pipeline 逻辑
|
|
473
|
+
↓
|
|
474
|
+
Infrastructure WorkerManager(单 worker)、ACPWorkerRuntime、
|
|
475
|
+
(manager/, providers/, daemon/) sessionDaemon、TaskBackend、RepoBackend
|
|
936
476
|
```
|
|
937
477
|
|
|
938
|
-
|
|
478
|
+
引擎职责:
|
|
939
479
|
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
| AI Worker (print) | ClaudePrintProvider / CodexExecProvider | WorkerProvider |
|
|
945
|
-
| AI Worker (interactive) | ClaudeTmuxProvider / CodexTmuxProvider | WorkerProvider |
|
|
946
|
-
| 通知 | Matrix | Notifier |
|
|
480
|
+
- **SchedulerEngine** — 见 `AI-PIPELINE` 标签时把 Planning → Backlog 提升。
|
|
481
|
+
- **StageEngine** — 驱动卡走 stage;构造 prompt(skill + projectRules + memory + **wikiContext** + task description + **wikiUpdateReminder**);通过 ACP 拉起 worker。
|
|
482
|
+
- **MonitorEngine** — ACK 超时检测、stale runtime、自动 QA 提升。
|
|
483
|
+
- **CloseoutEngine** + **EventHandler** — 完成卡的收尾。
|
|
947
484
|
|
|
948
|
-
|
|
485
|
+
**单 worker 是刻意设计**:v0.37.2 已删除多 worker 并发代码。不要提议"加并行模式" — 架构依赖串行执行保证状态一致。要更高吞吐,跑多个项目并行。
|
|
949
486
|
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
487
|
+
深入阅读:
|
|
488
|
+
- [doc-27:Service Layer Architecture](../../docs/design/27-service-layer-architecture.md) — 当前架构
|
|
489
|
+
- [doc-26:Console Architecture](../../docs/design/26-console-architecture.md) — Console 内部
|
|
490
|
+
- [doc-28:Wiki System](../../docs/design/28-wiki-system.md) — Wiki 设计
|
|
491
|
+
- [doc-13:Development Guardrails](../../docs/design/13-development-guardrails.md) — 贡献者硬规则
|
|
492
|
+
- [doc-17:Pipeline Configuration](../../docs/design/17-pipeline-configuration-design.md) — YAML 字段语义
|
|
493
|
+
- [docs/design/](../../docs/design/) — 完整设计树(v0.15-v0.32 时代的多数文档已标 HISTORICAL)
|
|
956
494
|
|
|
957
495
|
---
|
|
958
496
|
|
|
959
|
-
##
|
|
497
|
+
## Troubleshooting
|
|
960
498
|
|
|
961
|
-
```
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
│ │ ├── setup.ts # sps setup
|
|
967
|
-
│ │ ├── projectInit.ts # sps project init
|
|
968
|
-
│ │ ├── doctor.ts # sps doctor
|
|
969
|
-
│ │ ├── cardAdd.ts # sps card add
|
|
970
|
-
│ │ ├── tick.ts # sps tick
|
|
971
|
-
│ │ ├── schedulerTick.ts # sps scheduler tick
|
|
972
|
-
│ │ ├── pipelineTick.ts # sps pipeline tick
|
|
973
|
-
│ │ ├── workerLaunch.ts # sps worker launch
|
|
974
|
-
│ │ ├── workerDashboard.ts # sps worker dashboard
|
|
975
|
-
│ │ ├── pmCommand.ts # sps pm *
|
|
976
|
-
│ │ ├── qaTick.ts # sps qa tick
|
|
977
|
-
│ │ └── monitorTick.ts # sps monitor tick
|
|
978
|
-
│ ├── core/ # 核心运行时
|
|
979
|
-
│ │ ├── config.ts # 配置加载(shell conf 解析)
|
|
980
|
-
│ │ ├── context.ts # ProjectContext
|
|
981
|
-
│ │ ├── paths.ts # 路径解析
|
|
982
|
-
│ │ ├── state.ts # 运行时状态(state.json)
|
|
983
|
-
│ │ ├── lock.ts # tick 锁
|
|
984
|
-
│ │ ├── logger.ts # 日志 + 结构化事件
|
|
985
|
-
│ │ └── queue.ts # Pipeline 队列
|
|
986
|
-
│ ├── engines/ # 状态机引擎
|
|
987
|
-
│ │ ├── SchedulerEngine.ts # 选卡入队
|
|
988
|
-
│ │ ├── ExecutionEngine.ts # 执行链
|
|
989
|
-
│ │ ├── CloseoutEngine.ts # QA 闭环
|
|
990
|
-
│ │ └── MonitorEngine.ts # 异常检测
|
|
991
|
-
│ ├── manager/ # Worker 进程管理模块(v0.16.0)
|
|
992
|
-
│ │ ├── supervisor.ts # fd 重定向 spawn, child handle, exit 回调
|
|
993
|
-
│ │ ├── completion-judge.ts # git 产出检查, marker/keyword 检测
|
|
994
|
-
│ │ ├── post-actions.ts # merge + PM update + slot release + notify
|
|
995
|
-
│ │ ├── pm-client.ts # 轻量 PM 操作 (Plane/Trello/Markdown)
|
|
996
|
-
│ │ ├── resource-limiter.ts # 全局 worker 数上限 + 内存检查
|
|
997
|
-
│ │ └── recovery.ts # tick 重启后 PID 扫描恢复
|
|
998
|
-
│ ├── interfaces/ # 抽象接口
|
|
999
|
-
│ │ ├── TaskBackend.ts # PM 后端接口
|
|
1000
|
-
│ │ ├── WorkerProvider.ts # Worker 接口
|
|
1001
|
-
│ │ ├── RepoBackend.ts # 代码仓库接口
|
|
1002
|
-
│ │ ├── Notifier.ts # 通知接口
|
|
1003
|
-
│ │ └── HookProvider.ts # Hook 接口
|
|
1004
|
-
│ ├── models/ # 类型定义
|
|
1005
|
-
│ │ └── types.ts # Card, CommandResult, WorkerStatus 等
|
|
1006
|
-
│ └── providers/ # 具体实现
|
|
1007
|
-
│ ├── registry.ts # Provider 工厂(按 WORKER_MODE × WORKER_TOOL 路由)
|
|
1008
|
-
│ ├── PlaneTaskBackend.ts
|
|
1009
|
-
│ ├── TrelloTaskBackend.ts
|
|
1010
|
-
│ ├── MarkdownTaskBackend.ts
|
|
1011
|
-
│ ├── ClaudePrintProvider.ts # claude -p 一次性执行(默认)
|
|
1012
|
-
│ ├── CodexExecProvider.ts # codex exec 一次性执行(默认)
|
|
1013
|
-
│ ├── ClaudeTmuxProvider.ts # tmux 交互模式(降级方案)
|
|
1014
|
-
│ ├── CodexTmuxProvider.ts # tmux 交互模式(降级方案)
|
|
1015
|
-
│ ├── outputParser.ts # JSONL 输出解析、进程管理工具
|
|
1016
|
-
│ ├── streamRenderer.ts # JSONL → 人类可读文本(Dashboard 用)
|
|
1017
|
-
│ ├── GitLabRepoBackend.ts
|
|
1018
|
-
│ └── MatrixNotifier.ts
|
|
1019
|
-
├── package.json
|
|
1020
|
-
└── tsconfig.json
|
|
1021
|
-
```
|
|
1022
|
-
|
|
1023
|
-
---
|
|
499
|
+
```bash
|
|
500
|
+
sps doctor <project> --fix # ★ 第一招
|
|
501
|
+
sps logs <project> --err # 只看 stderr / 错误
|
|
502
|
+
sps reset <project> --card <seq> # 重置卡死的卡
|
|
503
|
+
sps reset <project> --all # 全项目重置
|
|
1024
504
|
|
|
1025
|
-
|
|
505
|
+
# Worker / daemon 问题
|
|
506
|
+
sps worker ps <project>
|
|
507
|
+
sps agent daemon status # chat daemon 还在不?
|
|
508
|
+
sps agent daemon stop && sps agent daemon start # 重启(清旧 cwd)
|
|
1026
509
|
|
|
1027
|
-
|
|
510
|
+
# Wiki 问题
|
|
511
|
+
sps wiki check <project>
|
|
512
|
+
sps wiki status <project>
|
|
513
|
+
```
|
|
1028
514
|
|
|
1029
|
-
|
|
1030
|
-
|------|------|------|
|
|
1031
|
-
| `supervisor.ts` | 288 | fd 重定向 spawn(OS 级保证 output 写入),持有 child handle,exit 回调触发后置流程,三层环境变量合并(系统→全局凭据→项目配置) |
|
|
1032
|
-
| `completion-judge.ts` | 110 | git 产出检查(分支是否已推送/已合并),auto-push,marker 文件检测,完成关键词匹配 |
|
|
1033
|
-
| `post-actions.ts` | 412 | Worker 退出后完整后置链:merge → PM 状态更新 → slot 释放 → 通知 |
|
|
1034
|
-
| `pm-client.ts` | 294 | 轻量 PM 操作封装,支持 Plane/Trello/Markdown 三种后端 |
|
|
1035
|
-
| `resource-limiter.ts` | 103 | 全局 worker 数上限检查 + 内存检查 + 启动间隔控制 |
|
|
1036
|
-
| `recovery.ts` | 205 | tick 重启后通过 PID 扫描恢复 orphan worker 进程 |
|
|
515
|
+
常见问题:
|
|
1037
516
|
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
517
|
+
| 现象 | 原因 / 修复 |
|
|
518
|
+
|---|---|
|
|
519
|
+
| Pipeline halt 在 `NEEDS-FIX` | 打开失败的卡,修问题,移除标签。Console 上 2 步搞定。 |
|
|
520
|
+
| Worker 启动不了 | 先 `sps worker ps`,再 `sps logs --err`。多半是 Claude API key 缺、或 `claude-agent-acp` adapter 没装(`sps setup` 重装它)。 |
|
|
521
|
+
| 卡片卡在 Planning | 缺 `AI-PIPELINE` 标签。`sps card add` 自动加;外部加的需手动补。 |
|
|
522
|
+
| 每张卡都 ACK timeout | Claude 冷启动慢(skill / memory 多)。conf 里调高 `WORKER_ACK_TIMEOUT_S`(v0.50.24 起默认 300s)。 |
|
|
523
|
+
| Console 数据陈旧 | SSE 可能掉了;刷新页面;不行就 `sps console --kill && sps console`。 |
|
|
524
|
+
| Wiki context 不注入 | 检查 `WIKI_ENABLED=true` 在 conf 里、`wiki/WIKI.md` 存在。conf 开了但 scaffold 缺时 StageEngine 会 warn。 |
|
|
525
|
+
| 升级后 skill SOP 不更新 | `sps skill sync --force`(默认 sync 会跳过已存在的)。 |
|
|
526
|
+
| Daemon chat 用了错的 cwd | Daemon 启动时锁 cwd。`sps agent daemon stop && cd <repo> && sps agent daemon start`。 |
|
|
1042
527
|
|
|
1043
528
|
---
|
|
1044
529
|
|
|
1045
|
-
##
|
|
1046
|
-
|
|
1047
|
-
通过 PM 卡片标签驱动 Worker 专业能力注入,无需修改代码即可为不同任务定制 Worker 行为。
|
|
1048
|
-
|
|
1049
|
-
**机制:**
|
|
1050
|
-
- PM 卡片添加 `skill:xxx` 标签 → 自动加载 `skills/worker-profiles/xxx.md` 到 Worker prompt
|
|
1051
|
-
- 支持多个 `skill:` 标签叠加注入
|
|
1052
|
-
- 项目可通过 `DEFAULT_WORKER_SKILLS` 配置默认技能,卡片标签可覆盖项目默认
|
|
1053
|
-
|
|
1054
|
-
**Prompt 组装顺序:**
|
|
1055
|
-
1. Skill Profiles(技能模板)
|
|
1056
|
-
2. Project Rules(CLAUDE.md / AGENTS.md)
|
|
1057
|
-
3. Project Knowledge(docs/DECISIONS.md, docs/CHANGELOG.md)
|
|
1058
|
-
4. Task(.sps/task_prompt.txt)
|
|
530
|
+
## 许可证 & 致谢
|
|
1059
531
|
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
| 文件 | 用途 |
|
|
1063
|
-
|------|------|
|
|
1064
|
-
| `skills/worker-profiles/_template.md` | 创建新技能的模板 |
|
|
1065
|
-
| `skills/worker-profiles/typescript.md` | TypeScript 项目编码规范 |
|
|
1066
|
-
| `skills/worker-profiles/phaser.md` | Phaser 游戏框架开发指南 |
|
|
1067
|
-
|
|
1068
|
-
**新增技能零代码:** 只需创建 md 文件到 `skills/worker-profiles/` 目录,然后在 PM 卡片上添加对应的 `skill:xxx` 标签即可。
|
|
1069
|
-
|
|
1070
|
-
---
|
|
532
|
+
MIT,见 [`LICENSE`](../../LICENSE)。
|
|
1071
533
|
|
|
1072
|
-
|
|
534
|
+
Wiki 系统(v0.51+)~70% 借鉴 [claude-obsidian](https://github.com/kepano/claude-obsidian)(MIT)— 三层架构、manifest 增量、hot cache、ingest 流程、contradiction callout、wikilink。SPS 专属 30%:5 类 page、`sources={card,commit,path}`、5 层 reader、`sps wiki check` exit gate。心智模型来自 Karpathy "LLM Wiki" gist。
|
|
1073
535
|
|
|
1074
|
-
|
|
536
|
+
完整归属见 [`ATTRIBUTION.md`](./ATTRIBUTION.md)。
|