@coralai/sps-cli 0.51.11 → 0.52.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/LICENSE +21 -0
- package/README-CN.md +131 -457
- package/README.md +131 -460
- package/dist/commands/skillCommand.js +17 -17
- package/dist/commands/skillCommand.js.map +1 -1
- package/dist/console/routes/chat.js +3 -3
- package/dist/console/routes/chat.js.map +1 -1
- package/dist/console/routes/fs.js +2 -2
- package/dist/console/routes/fs.js.map +1 -1
- package/dist/console-assets/assets/index-DVmciGET.css +10 -0
- package/dist/console-assets/assets/index-mm4gDnm8.js +553 -0
- package/dist/console-assets/index.html +2 -2
- package/dist/core/wiki/hot.js +2 -2
- package/dist/core/wiki/hot.js.map +1 -1
- package/dist/core/wiki/reader.js +4 -4
- package/dist/core/wiki/reader.js.map +1 -1
- package/dist/core/wiki/scaffold.js +1 -1
- package/dist/main.js +79 -79
- package/dist/main.js.map +1 -1
- package/dist/providers/MarkdownTaskBackend.d.ts +6 -2
- package/dist/providers/MarkdownTaskBackend.d.ts.map +1 -1
- package/dist/providers/MarkdownTaskBackend.js +32 -20
- package/dist/providers/MarkdownTaskBackend.js.map +1 -1
- package/dist/services/CardService.js +14 -14
- package/dist/services/CardService.js.map +1 -1
- package/dist/services/ChatService.js +11 -11
- package/dist/services/ChatService.js.map +1 -1
- package/dist/services/LogService.js +2 -2
- package/dist/services/LogService.js.map +1 -1
- package/dist/services/PipelineService.js +33 -33
- package/dist/services/PipelineService.js.map +1 -1
- package/dist/services/ProjectService.js +16 -16
- package/dist/services/ProjectService.js.map +1 -1
- package/dist/services/SkillService.js +9 -9
- package/dist/services/SkillService.js.map +1 -1
- package/dist/services/SystemService.js +11 -11
- package/dist/services/SystemService.js.map +1 -1
- package/dist/services/WorkerService.js +11 -11
- package/dist/services/WorkerService.js.map +1 -1
- package/package.json +2 -2
- package/skills/sps-memory/SKILL.md +1 -1
- package/skills/sps-pipeline/SKILL.md +19 -19
- package/dist/console-assets/assets/index-BJ1T4p1K.css +0 -10
- package/dist/console-assets/assets/index-DKc9idxO.js +0 -553
package/README-CN.md
CHANGED
|
@@ -1,544 +1,218 @@
|
|
|
1
|
-
# SPS CLI
|
|
1
|
+
# SPS CLI
|
|
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 docs: [README.md](./README.md)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## 1. 简介
|
|
8
8
|
|
|
9
|
-
SPS(Smart Pipeline System
|
|
9
|
+
SPS(Smart Pipeline System)是一个开源的 **AI Agent Harness**(智能体执行壳),把"一句话需求"自动驱动到"已审、已提交、可部署的产出"。任务以卡片形式经过多阶段流水线 —— 计划、执行、审核、交付 —— 每个 prompt 都自动注入项目级知识库。
|
|
10
10
|
|
|
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+)。 |
|
|
16
|
-
|
|
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)。
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## 目录
|
|
11
|
+
### 7×24 小时无人值守开发
|
|
22
12
|
|
|
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)
|
|
13
|
+
把任务丢进 Backlog,Harness 全天候不间断推进 —— 计划、编码、测试、提交、开 MR,只在真的卡住时才升级人工。你睡觉时流水线在 tick;第二天早会看到的是已合并的 commit。SPS 存在的意义是:一个人能在不守在聊天窗口前的情况下,跑出一个研发团队的工作量。
|
|
35
14
|
|
|
36
|
-
|
|
15
|
+
### 不止软件 —— 通过 skill 扩展到任何行业
|
|
37
16
|
|
|
38
|
-
|
|
17
|
+
Pipeline、Skills、知识层是刻意做成通用的。任何能表达成"任务进 → 已审输出出"的流程,换一套 skill bundle 就能跑:
|
|
39
18
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
19
|
+
- **会计** —— 发票录入 → 归类 → 账务对账 → 期末结账
|
|
20
|
+
- **自媒体** —— 选题调研 → 起草 → 审核 → 发布
|
|
21
|
+
- **AI 视频生成** —— 脚本 → 分镜 → 渲染 → 剪辑 → 审核
|
|
22
|
+
- **写作** —— 调研 → 提纲 → 初稿 → 修订 → 发布
|
|
23
|
+
- **其他工作流** —— 阶段在 YAML 里定义,skill 在 markdown 里写,Harness 运行它们
|
|
44
24
|
|
|
45
|
-
|
|
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`。
|
|
25
|
+
一个 CLI、一套控制台、一个基于文件系统的工作流。不绑死任何 AI 厂商。
|
|
51
26
|
|
|
52
|
-
|
|
27
|
+

|
|
53
28
|
|
|
54
|
-
|
|
29
|
+
## 2. 核心概念
|
|
55
30
|
|
|
56
|
-
|
|
31
|
+
### Harness(执行壳)
|
|
32
|
+
围绕 AI Agent 的长生命进程外壳:daemon、supervisor、传输层、profile 管理、文件系统任务生命周期。Agent 只关心写代码,基础设施由 Harness 接管。
|
|
57
33
|
|
|
58
|
-
|
|
34
|
+
### Pipeline(流水线)
|
|
35
|
+
每个任务是一张**卡片**,流经 `Backlog → Planning → Todo → Inprogress → QA → Done` 各阶段。每阶段有独立 prompt、工具白名单、出场条件 —— 全部 YAML 可配。
|
|
59
36
|
|
|
60
|
-
|
|
37
|
+
### Skills(技能指派)
|
|
38
|
+
阶段按需分派**原子 skill** 来驱动每个任务执行 —— 内建 `sps-pipeline`、`wiki-update`、`git-commit`,加 24 个开发 skill 与 persona skill。Skill 可组合而不会撑爆 system prompt,Harness 只加载当前阶段需要的部分。
|
|
61
39
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
sps agent "解释这个 repo"
|
|
65
|
-
sps agent --output summary.md "总结架构"
|
|
66
|
-
|
|
67
|
-
# 多轮(daemon 后端,会话持久化)
|
|
68
|
-
sps agent --chat # 交互 REPL
|
|
69
|
-
sps agent --chat --name reviewer # 命名会话,下次可继续
|
|
70
|
-
sps agent status # 列活跃会话
|
|
71
|
-
sps agent close --name reviewer
|
|
72
|
-
|
|
73
|
-
# Profile + 上下文文件
|
|
74
|
-
sps agent --profile reviewer "审这个模块" --context src/auth.ts --context src/auth.test.ts
|
|
75
|
-
sps agent --system "你是发布工程师" "规划 v0.52 切版"
|
|
76
|
-
|
|
77
|
-
# Verbose
|
|
78
|
-
sps agent --verbose "为什么构建失败"
|
|
79
|
-
```
|
|
40
|
+
### Memory(记忆系统)
|
|
41
|
+
跨会话持久化"非显然、可复用"事实的三层 markdown 文件库。全部在 `~/.coral/memory/`,Pipeline 模式下由 `StageEngine` 自动注入到每个 Worker prompt。
|
|
80
42
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
**
|
|
43
|
+
| 层 | 路径 | 作用域 |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| **User** | `~/.coral/memory/user/` | 跨项目用户偏好(编码风格、语言、工作习惯) |
|
|
46
|
+
| **Agent** | `~/.coral/memory/agents/<id>/` | 单个 Agent 实例观察到的人机交互模式 |
|
|
47
|
+
| **Project** | `~/.coral/memory/projects/<name>/` | 项目级约定、架构决策、教训、外部资源指针 |
|
|
84
48
|
|
|
85
|
-
|
|
49
|
+
四种条目类型 —— `convention`(永不衰减)、`decision`(缓慢衰减)、`lesson`(30 天衰减)、`reference`(永不衰减)。每层一个扁平目录装 `*.md` + 一份 `MEMORY.md` 索引。Agent 按需读、有发现时回写 —— 稀疏的私有飘移;与下文密集的团队共享 Wiki 互补。
|
|
86
50
|
|
|
87
|
-
|
|
51
|
+
### Knowledge Base(知识库)—— LLM Wiki
|
|
88
52
|
|
|
89
|
-
|
|
53
|
+
借鉴 Andrej Karpathy 的 "LLM Wiki" 思路:让 Agent 把项目知识**提炼**成持久化的结构化 wiki,而不是每次会话都重新读源码、重新踩坑、重新发现已有抽象。
|
|
90
54
|
|
|
91
|
-
|
|
55
|
+
**问题**:AI Agent 每次从零探索代码库会烧 token、漏掉非显然的决策、反复撞同一个坑。代码里的知识大多是**隐式的** —— 藏在 commit 上下文里、藏在设计权衡里、藏在没有回写到源码的事故复盘里。
|
|
92
56
|
|
|
93
|
-
|
|
57
|
+
**Wiki 方案**:Worker 把代码、设计文档、完成的卡片持续提炼成原子化、互相 wikilink 的页:
|
|
94
58
|
|
|
95
|
-
|
|
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 模式(开发用)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
页面:
|
|
104
|
-
|
|
105
|
-
| 路径 | 用途 |
|
|
59
|
+
| 页类型 | 装什么 |
|
|
106
60
|
|---|---|
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
|
|
|
112
|
-
| `/logs` | 实时 SSE 日志查看器 |
|
|
113
|
-
| `/skills` | User-level skill 管理 |
|
|
114
|
-
| `/system` | 全局设置 + daemon 状态 |
|
|
115
|
-
| `/chat` | Agent 聊天(多会话,持久化) |
|
|
116
|
-
|
|
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)。
|
|
61
|
+
| `modules/` | 每个模块做什么、怎么被使用 |
|
|
62
|
+
| `concepts/` | 反复出现的模式与架构原语 |
|
|
63
|
+
| `decisions/` | 某个选择背后的原因(带版本锚定) |
|
|
64
|
+
| `lessons/` | 事故中浮现的非显然教训 |
|
|
65
|
+
| `sources/` | 用户拖入 `.raw/` 的外部材料(PDF/文章/转录)的密集摘要 |
|
|
118
66
|
|
|
119
|
-
|
|
67
|
+
**自维护**:每张卡完成后,Worker 自动回写新增 lessons / module 变更,无需人工维护。SOP 在 `skills/wiki-update/`,按 4 问题判定(改了模块?做了决策?踩了坑?看到模式?)—— 四个 NO 就不写。
|
|
120
68
|
|
|
121
|
-
|
|
69
|
+
**自检索**:每张新卡的 prompt 自动注入 5 层(~2K token),Worker 启动即带知识:
|
|
122
70
|
|
|
123
|
-
|
|
71
|
+
- **L1** `hot.md` —— 最近上下文(~500 token)
|
|
72
|
+
- **L2** `index.md` 节选 —— top-30 页 TL;DR(~500 token)
|
|
73
|
+
- **L3** pinned 页 —— 卡片 frontmatter 显式引用
|
|
74
|
+
- **L4** skill-tag 匹配 —— 与卡片激活 skill 相符的页
|
|
75
|
+
- **L5** BM25F 关键词回退 —— title/desc top-3
|
|
124
76
|
|
|
125
|
-
|
|
77
|
+
**复利效应**:每张完成的卡都在累加知识。项目跑得越久,Worker 越懂这个项目,不再需要重读原代码。老 Worker 留下的 lesson 是新 Worker 的免费先验 —— Wiki 就是项目的**机构记忆**。
|
|
126
78
|
|
|
127
|
-
|
|
128
|
-
sps project init my-app
|
|
129
|
-
# 或用 Console /projects/new — 表单含 Wiki 开关(v0.51+)
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
会问:项目目录、合并分支、最大 worker 数、ACK 超时、可选 GitLab 远程、可选 Matrix 房间。
|
|
133
|
-
|
|
134
|
-
生成:
|
|
79
|
+
**Obsidian 兼容**:存在 `<repo>/wiki/`,用 `[[wikilink]]` 语法 + 扁平 YAML frontmatter —— 把目录用 Obsidian 打开就有 graph view、双向链接、全文搜索。
|
|
135
80
|
|
|
136
|
-
|
|
137
|
-
|
|
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 指针
|
|
144
|
-
```
|
|
81
|
+
### Agent Mode(代理接入)
|
|
82
|
+
SPS 是**代理无关**的。任何能读 skill + 执行 shell 的编码代理 —— Claude Code、Codex、OpenClaw、你自己写的 —— 都可以通过内置 `sps-pipeline` skill 来驱动 SPS。Harness 适配代理,不是反过来。接入新代理只需扔一个 skill 文件,SPS 代码无需改动。见 [§6](#6-支持列表) 接入矩阵。
|
|
145
83
|
|
|
146
|
-
|
|
84
|
+
## 3. 控制台
|
|
147
85
|
|
|
148
|
-
|
|
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
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### 运行
|
|
86
|
+
启动本地 Web UI:
|
|
157
87
|
|
|
158
88
|
```bash
|
|
159
|
-
sps
|
|
160
|
-
sps
|
|
161
|
-
sps
|
|
162
|
-
sps
|
|
163
|
-
sps status # 看所有项目
|
|
89
|
+
sps console # 打开 http://127.0.0.1:4311
|
|
90
|
+
sps console --port 5000 # 自定义端口
|
|
91
|
+
sps console --no-open # 不自动开浏览器
|
|
92
|
+
sps console --kill # 停掉运行中的 console
|
|
164
93
|
```
|
|
165
94
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
`~/.coral/projects/<n>/pipelines/project.yaml` — stage 单一来源。
|
|
169
|
-
|
|
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 }
|
|
182
|
-
```
|
|
95
|
+
一条命令,无需额外服务 —— 看板、Chat、Skills、Workers、日志、项目全在一处。
|
|
183
96
|
|
|
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 位置自动推导。
|
|
97
|
+
**看板 —— 卡片流转一目了然**
|
|
190
98
|
|
|
191
|
-
|
|
99
|
+

|
|
192
100
|
|
|
193
|
-
|
|
101
|
+
**Chat —— 多轮对话 + 工具调用流式渲染**
|
|
194
102
|
|
|
195
|
-
|
|
103
|
+

|
|
196
104
|
|
|
197
|
-
|
|
198
|
-
Backlog → Todo → Inprogress → [QA / Review] → Done
|
|
199
|
-
↑↓ ↓ 失败
|
|
200
|
-
Planning NEEDS-FIX (halt)
|
|
201
|
-
(人工暂存,v0.51.9+)
|
|
202
|
-
```
|
|
105
|
+
**Skills —— 内置与项目级 skill 管理**
|
|
203
106
|
|
|
204
|
-
|
|
205
|
-
- **`sps card add`(CLI / agent / 直接调 API)** → **Backlog**(自动跑)
|
|
206
|
-
- **Console "新卡片" 表单(人在 UI 操作)** → **Planning**(暂存,等用户拖到 Backlog 派发)
|
|
107
|
+

|
|
207
108
|
|
|
208
|
-
|
|
209
|
-
卡片严格按 seq 排序;不再有 pipeline_order.json。
|
|
210
|
-
|
|
211
|
-
默认状态(可在 YAML `pm.card_states` 自定义)。
|
|
212
|
-
|
|
213
|
-
```bash
|
|
214
|
-
sps card add <p> "标题" "描述"
|
|
215
|
-
sps card add <p> "T" "D" --skills python,backend --labels feature
|
|
109
|
+
**Workers —— 容量、运行时、按阶段日志**
|
|
216
110
|
|
|
217
|
-
|
|
218
|
-
# console: /board?project=<n>
|
|
111
|
+

|
|
219
112
|
|
|
220
|
-
|
|
221
|
-
sps card mark-complete <p> <seq> # 由 Claude Code Stop hook 调用
|
|
222
|
-
|
|
223
|
-
sps reset <p> # 重置非 Done 卡
|
|
224
|
-
sps reset <p> --card 5,6,7
|
|
225
|
-
sps reset <p> --all # 全重置含 Done + worktree + branch
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
### 卡片标签词典
|
|
229
|
-
|
|
230
|
-
| 标签 | 含义 | 设置者 |
|
|
231
|
-
|---|---|---|
|
|
232
|
-
| `AI-PIPELINE` | 进入 pipeline 的必备标签 | 创建时由用户加 |
|
|
233
|
-
| `STARTED-<stage>` | ACK 信号 — Claude 收到了 prompt | UserPromptSubmit hook |
|
|
234
|
-
| `COMPLETED-<stage>` | Worker 完成了某 stage | Stop hook |
|
|
235
|
-
| `CLAIMED` | StageEngine 占了 worker slot | Engine |
|
|
236
|
-
| `NEEDS-FIX` | Worker 失败;pipeline halt | Engine |
|
|
237
|
-
| `BLOCKED` | 外部依赖阻塞;pipeline 跳过 | 用户 |
|
|
238
|
-
| `WAITING-CONFIRMATION` | Worker 等用户输入 | Engine |
|
|
239
|
-
| `STALE-RUNTIME` | Inprogress 超时 | MonitorEngine |
|
|
240
|
-
| `ACK-TIMEOUT` | Claude 在 `WORKER_ACK_TIMEOUT_S` 内没 ACK | MonitorEngine |
|
|
241
|
-
| `skill:<name>` | 强制加载某 skill | 用户 |
|
|
242
|
-
| `conflict:<domain>` | 同 domain 内串行 | 用户 |
|
|
243
|
-
|
|
244
|
-
活动 stage 会在 `~/.coral/projects/<p>/runtime/worker-<slot>-current.json` 写 marker 文件(v0.50.21+),Stop hook 读它判断 worker 刚刚做完哪张卡。
|
|
245
|
-
|
|
246
|
-
---
|
|
247
|
-
|
|
248
|
-
## Memory + Wiki
|
|
249
|
-
|
|
250
|
-
两套互补的持久化系统,都自动注入 worker prompt。
|
|
251
|
-
|
|
252
|
-
| | **Memory** | **Wiki**(v0.51+) |
|
|
253
|
-
|---|---|---|
|
|
254
|
-
| 路径 | `~/.coral/memory/{user,agents,projects/<p>}/` | `<repo>/wiki/`(per-project,进 repo) |
|
|
255
|
-
| 格式 | 平铺 markdown + YAML frontmatter | 5 类 page,zod 校验的 frontmatter |
|
|
256
|
-
| 互链 | 无(平铺索引) | `[[type/Title]]` wikilink |
|
|
257
|
-
| 自动注入 | prompt 的 `knowledge` 段 | `wikiContext` 段(5 层检索) |
|
|
258
|
-
| 开关 | 默认开(`ENABLE_MEMORY=false` 关) | per-project(`WIKI_ENABLED=true` 开) |
|
|
259
|
-
| 适合 | 个人偏好、零散决策、坑 | 结构化项目知识:modules、concepts、decisions、lessons |
|
|
260
|
-
|
|
261
|
-
### Memory CLI
|
|
113
|
+
## 4. 安装
|
|
262
114
|
|
|
263
115
|
```bash
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
sps
|
|
116
|
+
# 安装
|
|
117
|
+
npm install -g @coralai/sps-cli
|
|
118
|
+
sps setup # 一次性交互向导
|
|
267
119
|
|
|
268
|
-
|
|
269
|
-
|
|
120
|
+
# 更新
|
|
121
|
+
npm update -g @coralai/sps-cli
|
|
122
|
+
sps skill sync --force # 升级后拉最新 skill SOP
|
|
270
123
|
```
|
|
271
124
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
### Wiki CLI(`WIKI_ENABLED=true` 时)
|
|
125
|
+
### 本地编译
|
|
275
126
|
|
|
276
127
|
```bash
|
|
277
|
-
|
|
278
|
-
sps
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
sps wiki get <p> lessons/Stop-Hook-Race
|
|
283
|
-
sps wiki status <p> # source ↔ manifest ↔ pages 差异
|
|
284
|
-
sps wiki add <p> ~/notes.md --category transcripts
|
|
285
|
-
sps wiki read <p> "<query>" # 预览 5 层检索
|
|
128
|
+
git clone https://github.com/edwardZhang/sps-cli.git
|
|
129
|
+
cd sps-cli
|
|
130
|
+
npm install
|
|
131
|
+
npm run build # tsc + console 静态资源
|
|
132
|
+
npm link # `sps` 命令指向本地编译版
|
|
286
133
|
```
|
|
287
134
|
|
|
288
|
-
|
|
135
|
+
### 前置要求
|
|
289
136
|
|
|
290
|
-
|
|
137
|
+
- **Node.js ≥ 18**
|
|
138
|
+
- **本地已经能正常运行的 Claude Code。** 先跑一下 `claude --help`,能跑通就 OK。SPS **不限制**你 Claude Code 怎么登录:
|
|
139
|
+
- Anthropic API key(`ANTHROPIC_API_KEY`)
|
|
140
|
+
- Claude Pro / Max 订阅
|
|
141
|
+
- 第三方 API gateway / 代理
|
|
142
|
+
- 任何其他 Claude Code 支持的鉴权方式
|
|
291
143
|
|
|
292
|
-
|
|
144
|
+
SPS 通过 Agent Client Protocol 启动 `claude`,继承你已配的凭证。SPS 这边不需要再单独配 API key。
|
|
293
145
|
|
|
294
|
-
##
|
|
146
|
+
## 5. 快速运行
|
|
295
147
|
|
|
296
|
-
|
|
148
|
+
### Step 1 —— 跑一次安装向导(只需一次)
|
|
297
149
|
|
|
298
150
|
```bash
|
|
299
|
-
sps
|
|
300
|
-
sps skill add <name> --project <p> # symlink 到 <repo>/.claude/skills/
|
|
301
|
-
sps skill remove <name> --project <p>
|
|
302
|
-
sps skill freeze <name> --project <p> # symlink → 真实副本(项目可定制)
|
|
303
|
-
sps skill unfreeze <name> --project <p> # 改回 symlink
|
|
304
|
-
sps skill sync # ① bundled (npm 包) → ~/.coral/skills/
|
|
305
|
-
# ② ~/.coral/skills/ → ~/.claude/skills/
|
|
306
|
-
sps skill sync --force # ⭐ 覆盖已存在的 user skill(升级 sps-cli 后用)
|
|
151
|
+
sps setup
|
|
307
152
|
```
|
|
308
153
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
-
|
|
312
|
-
-
|
|
313
|
-
-
|
|
154
|
+
向导会做:
|
|
155
|
+
- 创建 `~/.coral/{projects,memory,sessions,skills}/` 目录树
|
|
156
|
+
- 把内置 skill 复制到 `~/.coral/skills/`,并软链到 `~/.claude/skills/` 让 Claude Code 能看到
|
|
157
|
+
- 全局安装 `@agentclientprotocol/claude-agent-acp`,让 `claude` 能走 ACP 被驱动
|
|
158
|
+
- 可选写 `~/.coral/env`(GitLab token、Matrix 通知等 —— 全部可选)
|
|
314
159
|
|
|
315
|
-
|
|
160
|
+
可重复运行:`sps setup --force` 把已有值作为默认值。升级 sps-cli 后,跑 **`sps skill sync --force`** 拉最新 skill SOP。
|
|
316
161
|
|
|
317
|
-
|
|
162
|
+
### Step 2 —— 用 agent 冒烟测试(不需要项目)
|
|
318
163
|
|
|
319
164
|
```bash
|
|
320
|
-
|
|
321
|
-
sps
|
|
322
|
-
sps project init <name>
|
|
323
|
-
sps project doctor <name> [--fix] [--json] [--reset-state] [--skip-remote]
|
|
324
|
-
sps doctor <name> --fix # 别名
|
|
325
|
-
|
|
326
|
-
# Pipeline
|
|
327
|
-
sps tick <project> [--json]
|
|
328
|
-
sps pipeline start|stop|status|reset|workers|board|card|logs|list|run|use [project] [args]
|
|
329
|
-
sps pipeline run <name> "<prompt>" # 用于 mode: steps pipeline
|
|
330
|
-
sps pipeline tick <project> # 单次 StageEngine pass
|
|
331
|
-
sps scheduler tick <project> # v0.51.9 起 dormant(保留接口给 tick 编排器)
|
|
332
|
-
sps qa tick <project> # QA → Done 收尾
|
|
333
|
-
sps monitor tick <project> # 健康探测(ACK timeout、stale)
|
|
334
|
-
sps pm scan <project> # 从磁盘重建卡片索引
|
|
335
|
-
|
|
336
|
-
# 卡片
|
|
337
|
-
sps card add <p> "title" ["description"] [--skills a,b] [--labels x,y]
|
|
338
|
-
sps card dashboard <p>
|
|
339
|
-
sps card mark-started <p> [seq] [--stage <name>]
|
|
340
|
-
sps card mark-complete <p> <seq> [--stage <name>]
|
|
341
|
-
|
|
342
|
-
# Worker
|
|
343
|
-
sps worker ps <project>
|
|
344
|
-
sps worker dashboard <project>
|
|
345
|
-
sps worker kill <project> <seq>
|
|
346
|
-
sps worker launch <project> <seq>
|
|
347
|
-
|
|
348
|
-
# 状态 / 日志
|
|
349
|
-
sps status [--json]
|
|
350
|
-
sps stop <project> [--all]
|
|
351
|
-
sps reset <project> [--all] [--card N,N,N]
|
|
352
|
-
sps logs [project] [--err] [--lines N] [--no-follow]
|
|
353
|
-
|
|
354
|
-
# Memory
|
|
355
|
-
sps memory list [project] [--agent <id>]
|
|
356
|
-
sps memory context <project> [--card <seq>] [--agent <id>]
|
|
357
|
-
sps memory add <project> --type <T> --name "title" [--body "content"]
|
|
358
|
-
|
|
359
|
-
# Wiki(v0.51+)
|
|
360
|
-
sps wiki init <p>
|
|
361
|
-
sps wiki update <p> [--finalize] [--json]
|
|
362
|
-
sps wiki read <p> "<query>" [--skills a,b] [--pinned id1,id2] [--budget N]
|
|
363
|
-
sps wiki check <p> [--json] [--fix]
|
|
364
|
-
sps wiki add <p> <file> [--category <name>] [--no-ingest]
|
|
365
|
-
sps wiki list <p> [--type T] [--tag T] [--json]
|
|
366
|
-
sps wiki get <p> <pageId> [--json]
|
|
367
|
-
sps wiki status <p> [--json]
|
|
368
|
-
|
|
369
|
-
# Skill
|
|
370
|
-
sps skill list [--project <p>]
|
|
371
|
-
sps skill add <name> [--project <p>]
|
|
372
|
-
sps skill remove <name> [--project <p>]
|
|
373
|
-
sps skill freeze <name> [--project <p>]
|
|
374
|
-
sps skill unfreeze <name> [--project <p>]
|
|
375
|
-
sps skill sync [--force]
|
|
376
|
-
|
|
377
|
-
# Console
|
|
378
|
-
sps console [--port N] [--host H] [--no-open] [--dev] [--kill]
|
|
379
|
-
|
|
380
|
-
# Agent
|
|
381
|
-
sps agent "<prompt>" [--profile <p>] [--system "..."] [--context file] [--output file] [--verbose]
|
|
382
|
-
sps agent --chat [--name <session>]
|
|
383
|
-
sps agent status|close|list|add [args]
|
|
384
|
-
sps agent daemon start|stop|status
|
|
385
|
-
|
|
386
|
-
# Hook(由 Claude Code 调用,不是用户)
|
|
387
|
-
sps hook stop
|
|
388
|
-
sps hook user-prompt-submit
|
|
389
|
-
|
|
390
|
-
# ACP 控制(高级 debug 用)
|
|
391
|
-
sps acp <ensure|run|prompt|status|stop|pending|respond> <project> [args]
|
|
165
|
+
sps agent "解释这个仓库" # 单次问答
|
|
166
|
+
sps agent --chat # 多轮 REPL,会话持久化
|
|
392
167
|
```
|
|
393
168
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
---
|
|
169
|
+
跑通这一步说明 Claude Code 鉴权 OK,SPS 也接好了。
|
|
397
170
|
|
|
398
|
-
|
|
171
|
+
### Step 3 —— 启动控制台
|
|
399
172
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
| 字段 | 默认 | 说明 |
|
|
403
|
-
|---|---|---|
|
|
404
|
-
| `PROJECT_NAME` | (必填) | 内部 id |
|
|
405
|
-
| `PROJECT_DIR` | (必填) | repo 绝对路径 |
|
|
406
|
-
| `GITLAB_PROJECT` | — | `user/repo`(可选,用 GitLab API 时必填) |
|
|
407
|
-
| `GITLAB_PROJECT_ID` | — | 数字 ID(GitLab 才需,按路径首次 MR 时自动解析) |
|
|
408
|
-
| `GITLAB_MERGE_BRANCH` | `main` | Worker push 的目标分支 |
|
|
409
|
-
| `PM_TOOL` | `markdown` | **v0.42 起只支持 `markdown`**。卡片在 `~/.coral/projects/<n>/cards/<state>/<seq>.md` |
|
|
410
|
-
| `PIPELINE_LABEL` | `AI-PIPELINE` | 卡片进入 pipeline 必备标签 |
|
|
411
|
-
| `MR_MODE` | `none` | `none`(直接 push)/ `create`(开 MR,需要 `GITLAB_PROJECT_ID`) |
|
|
412
|
-
| `WORKER_TRANSPORT` | `acp-sdk` | 固定,不要改 |
|
|
413
|
-
| `MAX_CONCURRENT_WORKERS` | `1` | Slot 数;同一项目内卡仍是串行 |
|
|
414
|
-
| `MAX_ACTIONS_PER_TICK` | `3` | 单次 tick 可领多少新任务 |
|
|
415
|
-
| `INPROGRESS_TIMEOUT_HOURS` | `2` | 超时后 MonitorEngine 标 STALE-RUNTIME |
|
|
416
|
-
| `WORKER_ACK_TIMEOUT_S` | `300` | 派发后等 STARTED-<stage> 标签的最长时间(v0.50.24 提到 5min) |
|
|
417
|
-
| `WORKER_ACK_MAX_RETRIES` | `1` | ACK 超时后最多重试次数 |
|
|
418
|
-
| `MONITOR_AUTO_QA` | `true` | 检测到 stale runtime 时自动迁到 QA |
|
|
419
|
-
| `CONFLICT_DEFAULT` | `serial` | 卡上无 `conflict:` 标签时的兜底策略 |
|
|
420
|
-
| `MATRIX_ROOM_ID` | — | 项目级 Matrix 覆盖 |
|
|
421
|
-
| `WORKTREE_DIR` | `~/.coral/worktrees/<p>` | Worker 工作树根 |
|
|
422
|
-
| `DEFAULT_WORKER_SKILLS` | — | 逗号分隔;卡上无 `profile:` 也无 `card.skills` 时兜底 |
|
|
423
|
-
| `ENABLE_MEMORY` | `true` | `false` 跳过 prompt 里的 memory 写指引 |
|
|
424
|
-
| **`WIKI_ENABLED`** | 未设(关) | **v0.51+**:`true` 启用 wiki context 注入 + reminder |
|
|
425
|
-
| `COMPLETION_SIGNAL` | `done` | Stop hook 监听的完成关键词 |
|
|
426
|
-
|
|
427
|
-
全局凭证 `~/.coral/env`:`GITLAB_URL`、`GITLAB_TOKEN`、`GITLAB_SSH_HOST`、`GITLAB_SSH_PORT`、`MATRIX_HOMESERVER`、`MATRIX_ACCESS_TOKEN`、`MATRIX_ROOM_ID`。`sps setup` 写或 `vim` 改。
|
|
428
|
-
|
|
429
|
-
---
|
|
430
|
-
|
|
431
|
-
## 目录布局
|
|
432
|
-
|
|
433
|
-
```
|
|
434
|
-
~/.coral/ # 用户全局状态
|
|
435
|
-
├── env # 全局凭证(mode 600)
|
|
436
|
-
├── skills/ # User-level skill(从 npm 同步)
|
|
437
|
-
├── memory/{user,agents,projects}/ # 3 层 memory 存储
|
|
438
|
-
├── projects/<name>/ # 项目状态
|
|
439
|
-
│ ├── conf # 项目配置(mode 600)
|
|
440
|
-
│ ├── conf.example # 字段全参考(自动生成)
|
|
441
|
-
│ ├── pipelines/{project,*}.yaml # Pipeline 定义
|
|
442
|
-
│ ├── pipeline_order.json # 当前 active pipeline 指针
|
|
443
|
-
│ ├── runtime/state.json # Worker slot + 当前卡状态
|
|
444
|
-
│ ├── runtime/worker-<slot>-current.json # Per-slot 卡 marker(v0.50.21+)
|
|
445
|
-
│ ├── runtime/tick.lock # tick 锁
|
|
446
|
-
│ ├── runtime/acp-state.json # ACP 会话状态
|
|
447
|
-
│ ├── cards/<state>/<seq>.md # 卡片文件(markdown PM 后端)
|
|
448
|
-
│ ├── cards/seq.txt # 序列号
|
|
449
|
-
│ ├── logs/ # 每次 tick 的日志
|
|
450
|
-
│ └── pm_meta/ # 卡片索引
|
|
451
|
-
├── sessions/ # Agent daemon(chat 会话)
|
|
452
|
-
│ ├── daemon.sock daemon.pid
|
|
453
|
-
│ └── chat-sessions/<id>.json # 持久化 chat 会话
|
|
454
|
-
├── console.lock # console 单实例 guard
|
|
455
|
-
└── worktrees/<project>/<seq>/ # 每张活动卡一个 worktree
|
|
456
|
-
|
|
457
|
-
<目标 repo>/ # 你的项目 repo
|
|
458
|
-
├── .claude/
|
|
459
|
-
│ ├── CLAUDE.md # Worker 规则(项目相关 + SPS 注入)
|
|
460
|
-
│ ├── settings.local.json # Claude Code 本地配置
|
|
461
|
-
│ ├── skills/ # 从 ~/.coral/skills/ symlink
|
|
462
|
-
│ └── hooks/{start,stop}.sh # 生命周期 hook(call sps)
|
|
463
|
-
├── wiki/ # 若 WIKI_ENABLED — 见 doc-28
|
|
464
|
-
└── ATTRIBUTION.md # 若 WIKI_ENABLED
|
|
173
|
+
```bash
|
|
174
|
+
sps console # http://127.0.0.1:4311
|
|
465
175
|
```
|
|
466
176
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
## 架构
|
|
470
|
-
|
|
471
|
-
4 层服务架构(v0.50+):
|
|
177
|
+
### Step 4 —— 跑一条 pipeline
|
|
472
178
|
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
SkillService / WikiService — Result<T> + DomainEvent
|
|
478
|
-
↓
|
|
479
|
-
Domain (engines/) SchedulerEngine / StageEngine / MonitorEngine /
|
|
480
|
-
CloseoutEngine / EventHandler — pipeline 逻辑
|
|
481
|
-
↓
|
|
482
|
-
Infrastructure WorkerManager(单 worker)、ACPWorkerRuntime、
|
|
483
|
-
(manager/, providers/, daemon/) sessionDaemon、TaskBackend、RepoBackend
|
|
179
|
+
```bash
|
|
180
|
+
sps project init my-app --repo /path/to/repo # 初始化项目
|
|
181
|
+
sps card add my-app "加一个登录按钮" # 加一张卡
|
|
182
|
+
sps tick my-app # 推进活跃卡片一个阶段
|
|
484
183
|
```
|
|
485
184
|
|
|
486
|
-
|
|
185
|
+
**TUI Dashboard** —— 跨项目紧凑视图(`sps status`):
|
|
487
186
|
|
|
488
|
-
-
|
|
489
|
-
- **StageEngine** — 驱动卡走 stage;构造 prompt(skill + projectRules + memory + **wikiContext** + task description + **wikiUpdateReminder**);通过 ACP 拉起 worker。
|
|
490
|
-
- **MonitorEngine** — ACK 超时检测、stale runtime、自动 QA 提升。
|
|
491
|
-
- **CloseoutEngine** + **EventHandler** — 完成卡的收尾。
|
|
187
|
+

|
|
492
188
|
|
|
493
|
-
|
|
189
|
+
## 6. 支持列表
|
|
494
190
|
|
|
495
|
-
|
|
496
|
-
- [doc-27:Service Layer Architecture](../../docs/design/27-service-layer-architecture.md) — 当前架构
|
|
497
|
-
- [doc-26:Console Architecture](../../docs/design/26-console-architecture.md) — Console 内部
|
|
498
|
-
- [doc-28:Wiki System](../../docs/design/28-wiki-system.md) — Wiki 设计
|
|
499
|
-
- [doc-13:Development Guardrails](../../docs/design/13-development-guardrails.md) — 贡献者硬规则
|
|
500
|
-
- [doc-17:Pipeline Configuration](../../docs/design/17-pipeline-configuration-design.md) — YAML 字段语义
|
|
501
|
-
- [docs/design/](../../docs/design/) — 完整设计树(v0.15-v0.32 时代的多数文档已标 HISTORICAL)
|
|
191
|
+
SPS-CLI 是 shell 驱动的,任何能读 skill + 执行命令的编码代理都可以把它当任务 harness 用。我们随仓库发 `skills/sps-pipeline/` —— 把它放进代理的 skill 目录,代理就立即学会了 SPS 完整命令面(cards、pipeline tick、wiki、项目初始化、daemon 生命周期)。
|
|
502
192
|
|
|
503
|
-
|
|
193
|
+
| 代理 | 接入方式 |
|
|
194
|
+
|---|---|
|
|
195
|
+
| **Claude Code** | ✅ `sps skill sync` 把 `sps-pipeline` 软链到 `~/.claude/skills/`;按描述匹配自动加载 |
|
|
196
|
+
| **Codex** | ✅ 把 `skills/sps-pipeline/SKILL.md` 放进 Codex 的 skill 目录 |
|
|
197
|
+
| **OpenClaw** | ✅ 一样 —— 让它的 skill loader 指向 `skills/sps-pipeline/` |
|
|
198
|
+
| **Harness Agent** | ✅ 同模式 —— skill 内容代理无关 |
|
|
199
|
+
| **其他任何编码代理** | ✅ 只要能读指令 + 执行 shell,就能驱动 SPS |
|
|
504
200
|
|
|
505
|
-
|
|
201
|
+
skill 是纯 markdown —— 抄它、改它、fork 它。SPS 管编排,代理管意图。
|
|
506
202
|
|
|
507
|
-
|
|
508
|
-
sps doctor <project> --fix # ★ 第一招
|
|
509
|
-
sps logs <project> --err # 只看 stderr / 错误
|
|
510
|
-
sps reset <project> --card <seq> # 重置卡死的卡
|
|
511
|
-
sps reset <project> --all # 全项目重置
|
|
512
|
-
|
|
513
|
-
# Worker / daemon 问题
|
|
514
|
-
sps worker ps <project>
|
|
515
|
-
sps agent daemon status # chat daemon 还在不?
|
|
516
|
-
sps agent daemon stop && sps agent daemon start # 重启(清旧 cwd)
|
|
517
|
-
|
|
518
|
-
# Wiki 问题
|
|
519
|
-
sps wiki check <project>
|
|
520
|
-
sps wiki status <project>
|
|
521
|
-
```
|
|
522
|
-
|
|
523
|
-
常见问题:
|
|
203
|
+
## 7. 致谢
|
|
524
204
|
|
|
525
|
-
|
|
526
|
-
|---|---|
|
|
527
|
-
| Pipeline halt 在 `NEEDS-FIX` | 打开失败的卡,修问题,移除标签。Console 上 2 步搞定。 |
|
|
528
|
-
| Worker 启动不了 | 先 `sps worker ps`,再 `sps logs --err`。多半是 Claude API key 缺、或 `claude-agent-acp` adapter 没装(`sps setup` 重装它)。 |
|
|
529
|
-
| 卡片卡在 Planning | 缺 `AI-PIPELINE` 标签。`sps card add` 自动加;外部加的需手动补。 |
|
|
530
|
-
| 每张卡都 ACK timeout | Claude 冷启动慢(skill / memory 多)。conf 里调高 `WORKER_ACK_TIMEOUT_S`(v0.50.24 起默认 300s)。 |
|
|
531
|
-
| Console 数据陈旧 | SSE 可能掉了;刷新页面;不行就 `sps console --kill && sps console`。 |
|
|
532
|
-
| Wiki context 不注入 | 检查 `WIKI_ENABLED=true` 在 conf 里、`wiki/WIKI.md` 存在。conf 开了但 scaffold 缺时 StageEngine 会 warn。 |
|
|
533
|
-
| 升级后 skill SOP 不更新 | `sps skill sync --force`(默认 sync 会跳过已存在的)。 |
|
|
534
|
-
| Daemon chat 用了错的 cwd | Daemon 启动时锁 cwd。`sps agent daemon stop && cd <repo> && sps agent daemon start`。 |
|
|
205
|
+
SPS 站在以下开源项目肩上:
|
|
535
206
|
|
|
536
|
-
|
|
207
|
+
- **Andrej Karpathy** —— ["LLM Wiki"](https://gist.github.com/karpathy) 心智模型,是 SPS 知识层的根基
|
|
208
|
+
- **Anthropic Claude Agent SDK** —— ACP 传输层、子代理基础设施
|
|
209
|
+
- **kepano / claude-obsidian**(MIT)—— Wiki 架构、manifest、hot cache。完整归属见 [ATTRIBUTION.md](./ATTRIBUTION.md)
|
|
210
|
+
- **hono · chokidar · zod · yaml · vitest · biome** —— 运行时与工具链
|
|
537
211
|
|
|
538
|
-
##
|
|
212
|
+
## 8. 开源协议
|
|
539
213
|
|
|
540
|
-
MIT
|
|
214
|
+
[MIT](./LICENSE)
|
|
541
215
|
|
|
542
|
-
|
|
216
|
+
## 9. Copyright
|
|
543
217
|
|
|
544
|
-
|
|
218
|
+
Copyright (c) 2026 Coral AI
|