@coralai/sps-cli 0.52.3 → 0.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README-CN.md +457 -131
  2. package/README.md +460 -131
  3. package/dist/commands/agentCommand.js +1 -1
  4. package/dist/commands/agentCommand.js.map +1 -1
  5. package/dist/commands/agentDaemon.d.ts.map +1 -1
  6. package/dist/commands/agentDaemon.js +3 -9
  7. package/dist/commands/agentDaemon.js.map +1 -1
  8. package/dist/commands/agentRenderer.d.ts +1 -1
  9. package/dist/commands/agentRenderer.d.ts.map +1 -1
  10. package/dist/commands/setup.d.ts.map +1 -1
  11. package/dist/commands/setup.js +0 -4
  12. package/dist/commands/setup.js.map +1 -1
  13. package/dist/commands/skillCommand.js +14 -14
  14. package/dist/commands/skillCommand.js.map +1 -1
  15. package/dist/console/routes/chat.d.ts.map +1 -1
  16. package/dist/console/routes/chat.js +14 -18
  17. package/dist/console/routes/chat.js.map +1 -1
  18. package/dist/console/routes/fs.js +2 -2
  19. package/dist/console/routes/fs.js.map +1 -1
  20. package/dist/console-assets/assets/index-CoAkaUkW.css +10 -0
  21. package/dist/console-assets/assets/index-p6b8pcpR.js +557 -0
  22. package/dist/console-assets/index.html +2 -2
  23. package/dist/core/claudeJsonl.d.ts +43 -0
  24. package/dist/core/claudeJsonl.d.ts.map +1 -0
  25. package/dist/core/claudeJsonl.js +187 -0
  26. package/dist/core/claudeJsonl.js.map +1 -0
  27. package/dist/core/runtimeSnapshot.d.ts +1 -1
  28. package/dist/core/runtimeSnapshot.d.ts.map +1 -1
  29. package/dist/core/runtimeStore.d.ts +1 -1
  30. package/dist/core/runtimeStore.d.ts.map +1 -1
  31. package/dist/core/sessionContext.d.ts +1 -1
  32. package/dist/core/sessionContext.d.ts.map +1 -1
  33. package/dist/core/sessionLiveness.d.ts +1 -1
  34. package/dist/core/sessionLiveness.d.ts.map +1 -1
  35. package/dist/core/state.d.ts +1 -1
  36. package/dist/core/state.d.ts.map +1 -1
  37. package/dist/core/wiki/hot.js +2 -2
  38. package/dist/core/wiki/hot.js.map +1 -1
  39. package/dist/core/wiki/reader.js +4 -4
  40. package/dist/core/wiki/reader.js.map +1 -1
  41. package/dist/core/wiki/scaffold.js +1 -1
  42. package/dist/core/wiki/types.d.ts +50 -50
  43. package/dist/daemon/daemonClient.d.ts +2 -2
  44. package/dist/daemon/daemonClient.d.ts.map +1 -1
  45. package/dist/engines/MonitorEngine.js.map +1 -1
  46. package/dist/main.js +40 -40
  47. package/dist/main.js.map +1 -1
  48. package/dist/manager/worker-manager-impl.d.ts +1 -1
  49. package/dist/manager/worker-manager-impl.d.ts.map +1 -1
  50. package/dist/providers/ACPWorkerRuntime.d.ts +5 -5
  51. package/dist/providers/ACPWorkerRuntime.d.ts.map +1 -1
  52. package/dist/providers/ACPWorkerRuntime.js +1 -1
  53. package/dist/providers/ACPWorkerRuntime.js.map +1 -1
  54. package/dist/providers/MarkdownTaskBackend.d.ts +2 -6
  55. package/dist/providers/MarkdownTaskBackend.d.ts.map +1 -1
  56. package/dist/providers/MarkdownTaskBackend.js +20 -32
  57. package/dist/providers/MarkdownTaskBackend.js.map +1 -1
  58. package/dist/providers/registry.d.ts +1 -1
  59. package/dist/providers/registry.d.ts.map +1 -1
  60. package/dist/services/CardService.js +11 -11
  61. package/dist/services/CardService.js.map +1 -1
  62. package/dist/services/ChatService.d.ts +31 -1
  63. package/dist/services/ChatService.d.ts.map +1 -1
  64. package/dist/services/ChatService.js +149 -33
  65. package/dist/services/ChatService.js.map +1 -1
  66. package/dist/services/LogService.js +2 -2
  67. package/dist/services/LogService.js.map +1 -1
  68. package/dist/services/PipelineService.js +29 -29
  69. package/dist/services/PipelineService.js.map +1 -1
  70. package/dist/services/ProjectService.js +16 -16
  71. package/dist/services/ProjectService.js.map +1 -1
  72. package/dist/services/SkillService.js +9 -9
  73. package/dist/services/SkillService.js.map +1 -1
  74. package/dist/services/SystemService.js +9 -9
  75. package/dist/services/SystemService.js.map +1 -1
  76. package/dist/services/WorkerService.js +7 -7
  77. package/dist/services/WorkerService.js.map +1 -1
  78. package/dist/services/executors.d.ts +1 -0
  79. package/dist/services/executors.d.ts.map +1 -1
  80. package/dist/services/executors.js +7 -0
  81. package/dist/services/executors.js.map +1 -1
  82. package/dist/shared/runtimePaths.d.ts +8 -0
  83. package/dist/shared/runtimePaths.d.ts.map +1 -1
  84. package/dist/shared/runtimePaths.js +22 -0
  85. package/dist/shared/runtimePaths.js.map +1 -1
  86. package/dist/shared/runtimeSchemas.d.ts +14 -14
  87. package/package.json +7 -3
  88. package/skills/sps-memory/SKILL.md +1 -1
  89. package/skills/sps-pipeline/SKILL.md +19 -19
  90. package/LICENSE +0 -21
  91. package/dist/console-assets/assets/index-Bf8zeTg0.js +0 -566
  92. package/dist/console-assets/assets/index-j5Dtsmq0.css +0 -10
package/README-CN.md CHANGED
@@ -1,218 +1,544 @@
1
- # SPS CLI
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) [![license](https://img.shields.io/npm/l/@coralai/sps-cli)](./LICENSE)
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
- > English docs: [README.md](./README.md)
5
+ > **English**:[README.md](./README.md)
6
6
 
7
- ## 1. 简介
7
+ **v0.51.3**
8
8
 
9
- SPS(Smart Pipeline System)是一个开源的 **AI Agent Harness**(智能体执行壳),把"一句话需求"自动驱动到"已审、已提交、可部署的产出"。任务以卡片形式经过多阶段流水线 —— 计划、执行、审核、交付 —— 每个 prompt 都自动注入项目级知识库。
9
+ SPS(Smart Pipeline System)驱动 Claude Code worker 走完任务卡 写代码、commit、push、QA、合并,全自动。三种模式:
10
10
 
11
- ### 7×24 小时无人值守开发
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+)。 |
12
16
 
13
- 把任务丢进 Backlog,Harness 全天候不间断推进 —— 计划、编码、测试、提交、开 MR,只在真的卡住时才升级人工。你睡觉时流水线在 tick;第二天早会看到的是已合并的 commitSPS 存在的意义是:一个人能在不守在聊天窗口前的情况下,跑出一个研发团队的工作量。
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)
14
18
 
15
- ### 不止软件 —— 通过 skill 扩展到任何行业
19
+ ---
16
20
 
17
- Pipeline、Skills、知识层是刻意做成通用的。任何能表达成"任务进 → 已审输出出"的流程,换一套 skill bundle 就能跑:
21
+ ## 目录
18
22
 
19
- - **会计** —— 发票录入 → 归类 → 账务对账 → 期末结账
20
- - **自媒体** —— 选题调研 → 起草 → 审核 → 发布
21
- - **AI 视频生成** —— 脚本 → 分镜 → 渲染 → 剪辑 → 审核
22
- - **写作** —— 调研 → 提纲 → 初稿 → 修订 → 发布
23
- - **其他工作流** —— 阶段在 YAML 里定义,skill 在 markdown 里写,Harness 运行它们
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)
24
35
 
25
- 一个 CLI、一套控制台、一个基于文件系统的工作流。不绑死任何 AI 厂商。
36
+ ---
26
37
 
27
- ![CLI](docs/screenshots/01-cli-banner.png)
38
+ ## 安装与初始化
28
39
 
29
- ## 2. 核心概念
40
+ ```bash
41
+ npm install -g @coralai/sps-cli # 最新 0.51.x
42
+ sps setup # 交互式向导(首次必跑)
43
+ ```
30
44
 
31
- ### Harness(执行壳)
32
- 围绕 AI Agent 的长生命进程外壳:daemon、supervisor、传输层、profile 管理、文件系统任务生命周期。Agent 只关心写代码,基础设施由 Harness 接管。
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`。
33
51
 
34
- ### Pipeline(流水线)
35
- 每个任务是一张**卡片**,流经 `Backlog → Planning → Todo → Inprogress → QA → Done` 各阶段。每阶段有独立 prompt、工具白名单、出场条件 —— 全部 YAML 可配。
52
+ `sps setup --force` 重跑(保留旧值作默认)。**升级 sps-cli 后必须跑 `sps skill sync --force`** 才能拉新版 skill SOP(默认 sync 是非破坏性的,不会覆盖已有 skill)。
36
53
 
37
- ### Skills(技能指派)
38
- 阶段按需分派**原子 skill** 来驱动每个任务执行 —— 内建 `sps-pipeline`、`wiki-update`、`git-commit`,加 24 个开发 skill 与 persona skill。Skill 可组合而不会撑爆 system prompt,Harness 只加载当前阶段需要的部分。
54
+ **前置条件**:Node ≥ 18;Anthropic API key(或 Claude Pro / Max 订阅);`claude` CLI 在 PATH。
39
55
 
40
- ### Memory(记忆系统)
41
- 跨会话持久化"非显然、可复用"事实的三层 markdown 文件库。全部在 `~/.coral/memory/`,Pipeline 模式下由 `StageEngine` 自动注入到每个 Worker prompt。
56
+ ---
42
57
 
43
- | | 路径 | 作用域 |
44
- |---|---|---|
45
- | **User** | `~/.coral/memory/user/` | 跨项目用户偏好(编码风格、语言、工作习惯) |
46
- | **Agent** | `~/.coral/memory/agents/<id>/` | 单个 Agent 实例观察到的人机交互模式 |
47
- | **Project** | `~/.coral/memory/projects/<name>/` | 项目级约定、架构决策、教训、外部资源指针 |
58
+ ## Harness 模式(`sps agent`)
59
+
60
+ 直接和 Claude 对话,单次或多轮。无项目、无 PM、无 git。
61
+
62
+ ```bash
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
+ ```
48
80
 
49
- 四种条目类型 —— `convention`(永不衰减)、`decision`(缓慢衰减)、`lesson`(30 天衰减)、`reference`(永不衰减)。每层一个扁平目录装 `*.md` + 一份 `MEMORY.md` 索引。Agent 按需读、有发现时回写 —— 稀疏的私有飘移;与下文密集的团队共享 Wiki 互补。
81
+ **`--profile <name>`**:查 `~/.coral/skills/dev-worker/references/<name>.md`,作为 system prompt 注入。(注意区别 `sps skill add` 那是项目级 skill 链接。)
50
82
 
51
- ### Knowledge Base(知识库)—— LLM Wiki
83
+ **Built-in agent**:仅 `claude`(Codex / Gemini 支持已在 v0.38 移除)。Worker 通过 ACP JSON-RPC over stdio 与 `claude-agent-acp` 通信。
52
84
 
53
- 借鉴 Andrej Karpathy "LLM Wiki" 思路:让 Agent 把项目知识**提炼**成持久化的结构化 wiki,而不是每次会话都重新读源码、重新踩坑、重新发现已有抽象。
85
+ **Agent skill Claude Code 自己加载**:`~/.claude/skills/` `claude` 自己扫的目录 — 含 `sps-pipeline`、`sps-memory`、`wiki-update`、以及 24 个 dev / persona skill。Skill description 触发懒加载,harness 模式不需要 SPS 主动注入。
54
86
 
55
- **问题**:AI Agent 每次从零探索代码库会烧 token、漏掉非显然的决策、反复撞同一个坑。代码里的知识大多是**隐式的** —— 藏在 commit 上下文里、藏在设计权衡里、藏在没有回写到源码的事故复盘里。
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`,从目标目录发起。
56
88
 
57
- **Wiki 方案**:Worker 把代码、设计文档、完成的卡片持续提炼成原子化、互相 wikilink 的页:
89
+ ---
58
90
 
59
- | 页类型 | 装什么 |
91
+ ## Console 模式(`sps console`)
92
+
93
+ 本机 web UI,打包进二进制。`~/.coral/console.lock` 单实例保证。
94
+
95
+ ```bash
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
+ | 路径 | 用途 |
60
106
  |---|---|
61
- | `modules/` | 每个模块做什么、怎么被使用 |
62
- | `concepts/` | 反复出现的模式与架构原语 |
63
- | `decisions/` | 某个选择背后的原因(带版本锚定) |
64
- | `lessons/` | 事故中浮现的非显然教训 |
65
- | `sources/` | 用户拖入 `.raw/` 的外部材料(PDF/文章/转录)的密集摘要 |
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 聊天(多会话,持久化) |
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)。
66
118
 
67
- **自维护**:每张卡完成后,Worker 自动回写新增 lessons / module 变更,无需人工维护。SOP 在 `skills/wiki-update/`,按 4 问题判定(改了模块?做了决策?踩了坑?看到模式?)—— 四个 NO 就不写。
119
+ ---
68
120
 
69
- **自检索**:每张新卡的 prompt 自动注入 5 层(~2K token),Worker 启动即带知识:
121
+ ## Pipeline 模式(`sps tick`)
70
122
 
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
123
+ 全自动卡片驱动。**单 worker,单卡,串行**。每卡走 YAML 定义的若干 stage(如 `develop review → Done`);失败 → halt pipeline 直到你移除 `NEEDS-FIX` 标签。
76
124
 
77
- **复利效应**:每张完成的卡都在累加知识。项目跑得越久,Worker 越懂这个项目,不再需要重读原代码。老 Worker 留下的 lesson 是新 Worker 的免费先验 —— Wiki 就是项目的**机构记忆**。
125
+ ### 建项目
78
126
 
79
- **Obsidian 兼容**:存在 `<repo>/wiki/`,用 `[[wikilink]]` 语法 + 扁平 YAML frontmatter —— 把目录用 Obsidian 打开就有 graph view、双向链接、全文搜索。
127
+ ```bash
128
+ sps project init my-app
129
+ # 或用 Console /projects/new — 表单含 Wiki 开关(v0.51+)
130
+ ```
131
+
132
+ 会问:项目目录、合并分支、最大 worker 数、ACK 超时、可选 GitLab 远程、可选 Matrix 房间。
133
+
134
+ 生成:
80
135
 
81
- ### Agent Mode(代理接入)
82
- SPS 是**代理无关**的。任何能读 skill + 执行 shell 的编码代理 —— Claude Code、Codex、OpenClaw、你自己写的 —— 都可以通过内置 `sps-pipeline` skill 来驱动 SPS。Harness 适配代理,不是反过来。接入新代理只需扔一个 skill 文件,SPS 代码无需改动。见 [§6](#6-支持列表) 接入矩阵。
136
+ ```
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 指针
144
+ ```
83
145
 
84
- ## 3. 控制台
146
+ 在目标 repo(PROJECT_DIR)下:
85
147
 
86
- 启动本地 Web UI:
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
+ ### 运行
87
157
 
88
158
  ```bash
89
- sps console # 打开 http://127.0.0.1:4311
90
- sps console --port 5000 # 自定义端口
91
- sps console --no-open # 不自动开浏览器
92
- sps console --kill # 停掉运行中的 console
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 # 看所有项目
93
164
  ```
94
165
 
95
- 一条命令,无需额外服务 —— 看板、Chat、Skills、Workers、日志、项目全在一处。
166
+ ### Pipeline YAML
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
+ ```
96
183
 
97
- **看板 —— 卡片流转一目了然**
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 位置自动推导。
98
190
 
99
- ![Console Board](docs/screenshots/02-kanban.png)
191
+ 字段全集见 `~/.coral/projects/<n>/pipelines/sample.yaml.example`(自动生成,注释丰富)或 [doc-17](../../docs/design/17-pipeline-configuration-design.md)
100
192
 
101
- **Chat —— 多轮对话 + 工具调用流式渲染**
193
+ ---
102
194
 
103
- ![控制台 — Chat](docs/screenshots/03-chat.png)
195
+ ## 卡片生命周期
104
196
 
105
- **Skills —— 内置与项目级 skill 管理**
197
+ ```
198
+ Backlog → Todo → Inprogress → [QA / Review] → Done
199
+ ↑↓ ↓ 失败
200
+ Planning NEEDS-FIX (halt)
201
+ (人工暂存,v0.51.9+)
202
+ ```
106
203
 
107
- ![控制台 — Skills](docs/screenshots/04-skills.png)
204
+ **v0.51.10**:按调用方区分默认入场状态。
205
+ - **`sps card add`(CLI / agent / 直接调 API)** → **Backlog**(自动跑)
206
+ - **Console "新卡片" 表单(人在 UI 操作)** → **Planning**(暂存,等用户拖到 Backlog 派发)
108
207
 
109
- **Workers —— 容量、运行时、按阶段日志**
208
+ CLI 用户想暂存:`sps card add ... --draft`。Console 用户想立即跑:勾"立即派发执行"。
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
110
216
 
111
- ![控制台 Workers](docs/screenshots/05-workers.png)
217
+ sps card dashboard <p> # CLI 表格
218
+ # console: /board?project=<n>
112
219
 
113
- ## 4. 安装
220
+ sps card mark-started <p> <seq> # 由 Claude Code UserPromptSubmit hook 调用
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
114
262
 
115
263
  ```bash
116
- # 安装
117
- npm install -g @coralai/sps-cli
118
- sps setup # 一次性交互向导
264
+ sps memory list <p> # 看项目 memory 索引
265
+ sps memory list # 看全局 user + agents
266
+ sps memory context <p> --card <seq> # 预览注入内容
119
267
 
120
- # 更新
121
- npm update -g @coralai/sps-cli
122
- sps skill sync --force # 升级后拉最新 skill SOP
268
+ sps memory add <p> --type convention --name "API 用 camelCase" \
269
+ --description "REST 接口用 camelCase" --body "..."
123
270
  ```
124
271
 
125
- ### 本地编译
272
+ 类型:`convention`(不衰减)、`decision`(缓慢衰减)、`lesson`(30 天衰减)、`reference`(不衰减)。
273
+
274
+ ### Wiki CLI(`WIKI_ENABLED=true` 时)
126
275
 
127
276
  ```bash
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` 命令指向本地编译版
277
+ sps wiki init <p> # scaffold wiki/(开了 toggle 时建项目自动跑)
278
+ sps wiki update <p> # 看 source diff
279
+ sps wiki update <p> --finalize # worker 写完 page 后刷新 manifest
280
+ sps wiki check <p> # lint:orphan / dead-link / fm-gap / stale
281
+ sps wiki list <p> --type lesson --tag pipeline
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 层检索
133
286
  ```
134
287
 
135
- ### 前置要求
288
+ 5 层检索:hot.md / index 节选 / pinned / skill-tag / BM25F keyword。类型优先级:lesson = 3、decision = 3、concept = 2、module = 1、source = 1。Token 预算硬上限 ~2000。
136
289
 
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 支持的鉴权方式
290
+ Worker SOP:[`skills/wiki-update/SKILL.md`](./skills/wiki-update/SKILL.md)(300 行,单一来源)。
143
291
 
144
- SPS 通过 Agent Client Protocol 启动 `claude`,继承你已配的凭证。SPS 这边不需要再单独配 API key。
292
+ ---
145
293
 
146
- ## 5. 快速运行
294
+ ## Skills
147
295
 
148
- ### Step 1 —— 跑一次安装向导(只需一次)
296
+ User-level skill `~/.coral/skills/`(28 个 bundled,`sps setup` 时从 npm 包拷贝)。Symlink 到 `~/.claude/skills/`,Claude Code 自动加载。
149
297
 
150
298
  ```bash
151
- sps setup
299
+ sps skill list # 列可用 + 项目链接状态
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 后用)
152
307
  ```
153
308
 
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 通知等 —— 全部可选)
309
+ Bundled skill 列表(v0.51.3):
310
+
311
+ - **开发类(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`
312
+ - **Worker profile(3 个)**:`dev-worker`、`tax-worker`、`reviewer`(通过 `--profile` 引用)
313
+ - **SPS 专用(5 个)**:`sps-pipeline`、`sps-memory`、`wiki-update`
159
314
 
160
- 可重复运行:`sps setup --force` 把已有值作为默认值。升级 sps-cli 后,跑 **`sps skill sync --force`** 拉最新 skill SOP。
315
+ ---
161
316
 
162
- ### Step 2 —— 用 agent 冒烟测试(不需要项目)
317
+ ## 命令参考
163
318
 
164
319
  ```bash
165
- sps agent "解释这个仓库" # 单次问答
166
- sps agent --chat # 多轮 REPL,会话持久化
320
+ # Setup & 项目
321
+ sps setup [--force]
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]
167
392
  ```
168
393
 
169
- 跑通这一步说明 Claude Code 鉴权 OK,SPS 也接好了。
394
+ 任何命令后加 `--help` 看具体用法;支持的命令加 `--json` 输出结构化结果。
170
395
 
171
- ### Step 3 —— 启动控制台
396
+ ---
397
+
398
+ ## 项目配置(conf)
399
+
400
+ 文件位置 `~/.coral/projects/<name>/conf`(shell `export VAR="value"` 语法,mode 600)。完整字段参考自动生成在 `~/.coral/projects/<name>/conf.example`。
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
+ ## 目录布局
172
432
 
173
- ```bash
174
- sps console # http://127.0.0.1:4311
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
175
465
  ```
176
466
 
177
- ### Step 4 —— 跑一条 pipeline
467
+ ---
178
468
 
179
- ```bash
180
- sps project init my-app --repo /path/to/repo # 初始化项目
181
- sps card add my-app "加一个登录按钮" # 加一张卡
182
- sps tick my-app # 推进活跃卡片一个阶段
469
+ ## 架构
470
+
471
+ 4 层服务架构(v0.50+):
472
+
473
+ ```
474
+ Delivery (commands/, console/routes/) 参数解析 + I/O 编排(薄)
475
+
476
+ Service (services/) ProjectService / ChatService / PipelineService /
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
183
484
  ```
184
485
 
185
- **TUI Dashboard** —— 跨项目紧凑视图(`sps status`):
486
+ 引擎职责:
186
487
 
187
- ![Card Dashboard](docs/screenshots/06-dashboard.png)
488
+ - **SchedulerEngine** — v0.51.9 起 dormant(卡 add 直接进 Backlog;Planning 是人工暂存)。class 保留为 no-op,给 tick 编排器接口稳定。
489
+ - **StageEngine** — 驱动卡走 stage;构造 prompt(skill + projectRules + memory + **wikiContext** + task description + **wikiUpdateReminder**);通过 ACP 拉起 worker。
490
+ - **MonitorEngine** — ACK 超时检测、stale runtime、自动 QA 提升。
491
+ - **CloseoutEngine** + **EventHandler** — 完成卡的收尾。
188
492
 
189
- ## 6. 支持列表
493
+ **单 worker 是刻意设计**:v0.37.2 已删除多 worker 并发代码。不要提议"加并行模式" — 架构依赖串行执行保证状态一致。要更高吞吐,跑多个项目并行。
190
494
 
191
- SPS-CLI 是 shell 驱动的,任何能读 skill + 执行命令的编码代理都可以把它当任务 harness 用。我们随仓库发 `skills/sps-pipeline/` —— 把它放进代理的 skill 目录,代理就立即学会了 SPS 完整命令面(cards、pipeline tick、wiki、项目初始化、daemon 生命周期)。
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)
192
502
 
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 |
503
+ ---
200
504
 
201
- skill 是纯 markdown —— 抄它、改它、fork 它。SPS 管编排,代理管意图。
505
+ ## Troubleshooting
202
506
 
203
- ## 7. 致谢
507
+ ```bash
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
+ 常见问题:
204
524
 
205
- SPS 站在以下开源项目肩上:
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`。 |
206
535
 
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** —— 运行时与工具链
536
+ ---
211
537
 
212
- ## 8. 开源协议
538
+ ## 许可证 & 致谢
213
539
 
214
- [MIT](./LICENSE)
540
+ MIT,见 [`LICENSE`](../../LICENSE)
215
541
 
216
- ## 9. Copyright
542
+ 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。
217
543
 
218
- Copyright (c) 2026 Coral AI
544
+ 完整归属见 [`ATTRIBUTION.md`](./ATTRIBUTION.md)