@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 CHANGED
@@ -1,1074 +1,536 @@
1
- # SPS CLI — AI 驱动的全自动开发流水线
1
+ # SPS CLI — AI Agent 流水线编排器
2
2
 
3
- [![npm](https://img.shields.io/npm/v/@coralai/sps-cli)](https://www.npmjs.com/package/@coralai/sps-cli)
3
+ [![npm](https://img.shields.io/npm/v/@coralai/sps-cli)](https://www.npmjs.com/package/@coralai/sps-cli) [![license](https://img.shields.io/npm/l/@coralai/sps-cli)](../../LICENSE)
4
4
 
5
- SPS(Smart Pipeline System)是一套 AI Agent 驱动的全自动开发流水线 CLI 工具。从任务卡片创建到代码合并,全程无人值守。
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
- ```bash
43
- npm install -g @coralai/sps-cli
44
- ```
45
-
46
- 本地开发:
9
+ SPS(Smart Pipeline System)驱动 Claude Code worker 走完任务卡 — 写代码、commit、push、QA、合并,全自动。三种模式:
47
10
 
48
- ```bash
49
- cd coding-work-flow/workflow-cli
50
- npm run build
51
- # 或使用 tsx 直接运行
52
- npx tsx src/main.ts --help
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
- ```bash
268
- # 检查 + 自动修复
269
- sps doctor my-project --fix
270
- # ✓ global-env /home/user/.coral/env
271
- # ✓ global-env-vars GITLAB_URL and GITLAB_TOKEN set
272
- # ✓ conf-load Loaded ~/.coral/projects/my-project/conf
273
- # ✓ conf-fields All required fields present
274
- # ✓ repo-dir /home/user/projects/my-project
275
- # ✓ gitignore-sps .sps/ in .gitignore
276
- # ✓ worker-rules Generated and committed: CLAUDE.md, AGENTS.md
277
- # ✓ skill-profiles DEFAULT_WORKER_SKILLS="senior" — all profiles found
278
- # ✓ state-json Initialized with 3 worker slots
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
- ### sps card add
288
-
289
- 创建任务卡片。
38
+ ## 安装与初始化
290
39
 
291
40
  ```bash
292
- sps card add <project> "<title>" ["description"]
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
- #### Skill 标签
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
- 每张卡片打 **一个** `skill:` 标签,Pipeline 自动加载对应的 Worker skill profile 注入 prompt:
52
+ `sps setup --force` 重跑(保留旧值作默认)。**升级 sps-cli 后必须跑 `sps skill sync --force`** 才能拉新版 skill SOP(默认 sync 是非破坏性的,不会覆盖已有 skill)。
320
53
 
321
- | 标签 | Worker 角色 | 交付物 |
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
- ### sps tick
58
+ ## Harness 模式(`sps agent`)
339
59
 
340
- 统一主循环——编排全部引擎,依次执行 scheduler qa → pipeline → monitor
60
+ 直接和 Claude 对话,单次或多轮。无项目、无 PM、无 git
341
61
 
342
62
  ```bash
343
- sps tick <project> [project2] [project3] ... [--json] [--dry-run]
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
- | 致命失败 | 短路整个 tick | conf 损坏、PM 不可用 |
368
- | 降级继续 | 后续步骤有限运行 | scheduler 失败 → pipeline 不启动新卡 |
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
- | `--once` | 单次执行后退出 |
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
- 手动执行编排步骤:Planning Backlog。
83
+ **Built-in agent**:仅 `claude`(Codex / Gemini 支持已在 v0.38 移除)。Worker 通过 ACP JSON-RPC over stdio 与 `claude-agent-acp` 通信。
415
84
 
416
- ```bash
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
- - 读取 `pipeline_order.json` 确定卡片优先级
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
- ### sps pipeline tick
91
+ ## Console 模式(`sps console`)
434
92
 
435
- 手动执行执行链:Backlog Todo → Inprogress。
93
+ 本机 web UI,打包进二进制。`~/.coral/console.lock` 单实例保证。
436
94
 
437
95
  ```bash
438
- sps pipeline tick <project> [--json] [--dry-run]
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
- 带有 `BLOCKED`、`NEEDS-FIX`、`CONFLICT`、`WAITING-CONFIRMATION`、`STALE-RUNTIME` 标签的卡片会被跳过。
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
- ### sps worker
461
-
462
- Worker 生命周期管理。
121
+ ## Pipeline 模式(`sps tick`)
463
122
 
464
- #### sps worker launch
123
+ 全自动卡片驱动。**单 worker,单卡,串行**。每卡走 YAML 定义的若干 stage(如 `develop → review → Done`);失败 → halt pipeline 直到你移除 `NEEDS-FIX` 标签。
465
124
 
466
- 手动启动单个 Worker。
125
+ ### 建项目
467
126
 
468
127
  ```bash
469
- sps worker launch <project> <seq> [--json] [--dry-run]
128
+ sps project init my-app
129
+ # 或用 Console /projects/new — 表单含 Wiki 开关(v0.51+)
470
130
  ```
471
131
 
472
- 如果卡片在 Backlog 状态,会自动先执行 prepare(创建分支 + worktree),然后启动 Worker。
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
- **Print 模式(推荐):**
489
-
490
- Worker 以子进程方式运行,prompt 通过 stdin 传入,输出写入 JSONL 文件:
134
+ 生成:
491
135
 
492
136
  ```
493
- Claude: claude -p --output-format stream-json --dangerously-skip-permissions
494
- Codex: codex exec - --json --dangerously-bypass-approvals-and-sandbox
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
- 任务1: claude -p "实现功能" → session_id_1(存入 state.json)
509
- CI修复: claude -p "修复CI" --resume sid → 继承任务1的完整上下文
510
- 冲突: claude -p "解冲突" --resume sid → 继承所有历史上下文
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
- **Interactive 模式(降级方案):**
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 worker launch my-project 24
527
- sps worker launch my-project 24 --dry-run
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
- #### sps worker dashboard
166
+ ### Pipeline YAML
531
167
 
532
- 实时监控所有 Worker 运行状态的仪表盘。
168
+ `~/.coral/projects/<n>/pipelines/project.yaml` stage 单一来源。
533
169
 
534
- ```bash
535
- sps worker dashboard [project1] [project2] ... [--once] [--json]
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
- | (无参数) | 自动发现 `~/.coral/projects/` 下所有项目 |
541
- | `--once` | 输出一次快照后退出(不进入实时模式) |
542
- | `--json` | 输出 JSON 格式(所有项目、所有 Worker slot 状态 + 输出预览) |
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
- ### sps pm
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
- 不指定 `state` 时列出所有卡片。
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
- #### sps pm move
600
-
601
- 手动移动卡片状态。
203
+ 默认状态(可在 YAML `pm.card_states` 自定义)。
602
204
 
603
205
  ```bash
604
- sps pm move <project> <seq> <state>
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
- ```bash
610
- sps pm move my-project 24 QA
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
- ```bash
619
- sps pm comment <project> <seq> "<text>"
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
- #### sps pm checklist
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
- ### sps qa tick
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
- 1. `git worktree remove --force <path>` — 删除 worktree 目录
671
- 2. `git branch -d <branch>` — 删除已合并的本地分支
672
- 3. `git worktree prune` — 清理残留引用
242
+ 两套互补的持久化系统,都自动注入 worker prompt。
673
243
 
674
- 清理失败的条目保留在队列中,下轮 tick 自动重试。
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 qa tick my-project
680
- sps qa tick my-project --json
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
- ```bash
690
- sps monitor tick <project> [--json]
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 monitor tick my-project
707
- sps monitor tick my-project --json
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
- 停止运行中的 tick 进程。
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
- ### sps reset
286
+ ## Skills
724
287
 
725
- 重置卡片状态,准备重新执行。一键完成 5 步清理:停 tick、清 state、清 worktree+branch、移卡回 Planning、报告。
288
+ User-level skill `~/.coral/skills/`(28 bundled,`sps setup` 时从 npm 包拷贝)。Symlink 到 `~/.claude/skills/`,Claude Code 自动加载。
726
289
 
727
290
  ```bash
728
- sps reset <project> # 重置所有未完成的卡片(Done 保留)
729
- sps reset <project> --all # 重置全部卡片(包括 Done)
730
- sps reset <project> --card 5 # 重置指定卡片
731
- sps reset <project> --card 5,6,7 # 重置多张卡片
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
- ```bash
737
- npm i -g @coralai/sps-cli # 升级
738
- sps reset my-project # 一键清理
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
- ### sps logs
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
- # ~/.coral/projects/my-project/conf
878
-
879
- PROJECT_NAME="my-project"
880
- PROJECT_DIR="/home/user/projects/my-project"
881
-
882
- # GitLab
883
- GITLAB_PROJECT="team/my-project"
884
- GITLAB_PROJECT_ID="42"
885
- GITLAB_MERGE_BRANCH="develop"
886
-
887
- # PM(使用全局 .coral/env 中的变量)
888
- PM_TOOL="plane"
889
- PLANE_API_URL="${PLANE_URL}"
890
- PLANE_PROJECT_ID="project-uuid-here"
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
- WORKER_TOOL="claude"
894
- MAX_CONCURRENT_WORKERS=3
895
- MAX_ACTIONS_PER_TICK=1
896
-
897
- # 合并模式
898
- MR_MODE="none" # none(直接合并)或 create(创建 MR)
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
- SPS 支持单进程同时管理多个项目:
906
-
907
- ```bash
908
- sps tick project-a project-b project-c
909
- ```
910
-
911
- 每个项目完全隔离:
912
- - 独立的 ProjectContext、Provider 实例、Engine 实例
913
- - 独立的 tick.lock(互不阻塞)
914
- - 独立的 state.json(Worker slot 不混淆)
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
- 多 Worker 并行配置:
421
+ ---
918
422
 
919
- ```bash
920
- # 在项目 conf 中设置
921
- MAX_CONCURRENT_WORKERS=3
922
- CONFLICT_DEFAULT=parallel
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
- Layer 3 Commands + Engines CLI 命令 + 状态机引擎
933
- Layer 2 Providers 具体后端实现
934
- Layer 1 Interfaces 抽象接口
935
- Layer 0 Core Runtime 配置、路径、状态、锁、日志
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
- | 类型 | Provider | 接口 |
941
- |------|----------|------|
942
- | PM 后端 | Plane CE / Trello / Markdown | TaskBackend |
943
- | 代码托管 | GitLab | RepoBackend |
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
- | SchedulerEngine | Planning Backlog(选卡、排序、准入检查) |
953
- | ExecutionEngine | Backlog Todo → Inprogress → Done(准备环境、启动 Worker、检测完成、释放资源) |
954
- | CloseoutEngine | worktree 清理(MR_MODE=create 时兼容处理 QA 卡片) |
955
- | MonitorEngine | 异常检测(孤儿清理、超时、阻塞、状态对齐、死亡 Worker 完成检测) |
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
- workflow-cli/
963
- ├── src/
964
- │ ├── main.ts # CLI 入口、命令路由
965
- │ ├── commands/ # 命令实现
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
- ## Manager 模块 (v0.16.0)
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
- v0.16.0 新增 `src/manager/` 目录,将 Worker 进程管理从 Engine 中解耦为独立模块,作为 tick 内部模块运行(非独立守护进程)。
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
- - ExecutionEngine 从 1219 行缩减至 916 行(删除 attemptResume, completeAndRelease)
1040
- - MonitorEngine 974 行缩减至 750 行(删除直接 PID/tmux 检测)
1041
- - tick.ts 新增约 80 行(初始化共享 Manager 模块,启动时执行 Recovery)
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
- ## 标签技能注入 (v0.16.0)
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
- ## License
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
- MIT
536
+ 完整归属见 [`ATTRIBUTION.md`](./ATTRIBUTION.md)。