cs-bots 0.1.1 → 0.7.5
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/CHANGELOG.md +539 -0
- package/README.md +65 -10
- package/docs/01-/346/236/266/346/236/204/346/226/207/346/241/243.md +364 -0
- package/docs/02-/351/234/200/346/261/202/350/247/204/346/240/274/344/271/246.md +284 -0
- package/docs/03-/350/257/246/347/273/206/350/256/276/350/256/241.md +567 -0
- package/docs/04-/346/223/215/344/275/234/346/211/213/345/206/214.md +569 -0
- package/docs/ARCHITECTURE.md +277 -0
- package/docs/adr/ADR-001-/351/241/265/347/255/276/347/273/223/346/236/204/345/233/236/345/210/260/344/270/203/351/241/265.md +70 -0
- package/docs/steps/step-01-/345/216/237/346/236/266/346/236/204/345/244/215/345/216/237/344/270/216IA/350/257/212/346/226/255.md +80 -0
- package/docs/steps/step-02-/351/241/265/347/255/276/346/224/266/346/225/233/344/270/216/345/215/207/347/272/247/351/200/232/351/201/223.md +51 -0
- package/docs/steps/step-03-/346/236/266/346/236/204/350/265/204/346/226/231/346/210/220/346/226/207.md +16 -0
- package/docs/steps/step-04-/344/270/212/347/272/277/344/270/216/351/252/214/350/257/201.md +46 -0
- package/docs//344/272/244/344/273/230/350/257/264/346/230/216-v0.2.0.md +95 -0
- package/docs//346/223/215/344/275/234/346/211/213/345/206/214-v1.md +509 -0
- package/docs//350/277/201/347/247/273/346/226/271/346/241/210-v1.md +64 -0
- package/docs//351/225/277/346/234/237/350/256/260/345/277/206/346/226/271/346/241/210-v1.md +85 -0
- package/package.json +4 -2
- package/src/admission.js +365 -0
- package/src/api.js +4097 -420
- package/src/board.js +883 -14
- package/src/botprofile.js +190 -3
- package/src/client.js +6596 -1082
- package/src/cycle.js +516 -0
- package/src/delivery-watch.js +255 -0
- package/src/dirbrowse.js +20 -0
- package/src/discipline.js +1188 -0
- package/src/fence.js +142 -0
- package/src/index.js +387 -4
- package/src/kernel.js +636 -24
- package/src/library.js +1224 -11
- package/src/memory.js +617 -37
- package/src/metrics.js +339 -0
- package/src/prompts.js +1318 -0
- package/src/reviewer.js +709 -0
- package/src/room.js +655 -14
- package/src/roster.js +346 -26
- package/src/routing/complexity.js +320 -0
- package/src/routing/hints.js +707 -0
- package/src/scratch.js +477 -0
- package/src/settings.js +97 -0
- package/src/stage.js +263 -0
- package/src/store.js +133 -1
- package/src/subscription.js +571 -0
- package/src/suggest.js +1203 -0
- package/src/teams.js +527 -0
- package/src/todo.js +1301 -0
- package/src/tools.js +734 -10
- package/src/verify.js +356 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# cs-bots 设计架构(v0.6 历史快照 · **勿引用**)
|
|
2
|
+
|
|
3
|
+
> ⚠️ **本文已过期,不要当作现状依据**(2026-11-09 标注)。
|
|
4
|
+
>
|
|
5
|
+
> 它是 **2026-11-06 的 v0.6 快照**,且自相矛盾:§1 写「38 个 bot_* 工具」、
|
|
6
|
+
> §8 又写「28 模型工具 / 93 HTTP 端点 / 24 源文件 / 656 用例」。
|
|
7
|
+
>
|
|
8
|
+
> **当前实测(2026-11-09,v0.7.3)**:
|
|
9
|
+
>
|
|
10
|
+
> | 项 | 本文写的 | 实际 |
|
|
11
|
+
> |---|---|---|
|
|
12
|
+
> | 模型工具 `bot_*` | 38 / 28(自相矛盾) | **41** |
|
|
13
|
+
> | HTTP 端点 | 114 / 93(自相矛盾) | **156** |
|
|
14
|
+
> | 源文件 | 24 | **34**(含 `src/routing/`) |
|
|
15
|
+
> | 源码行数 | 24,736 | **37,774** |
|
|
16
|
+
> | 测试文件 | 30 | **59** |
|
|
17
|
+
> | 测试用例 | 656 | **1,163** |
|
|
18
|
+
>
|
|
19
|
+
> 现状以 `docs/01-架构文档.md`、`docs/03-详细设计.md` 与实测为准。
|
|
20
|
+
> 本文件保留是为了追溯 v0.6 的设计意图(分层思路本身仍然成立)。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 0. 一句话定位
|
|
25
|
+
|
|
26
|
+
**cs-bots = 装在 DSH 里的自足多智能体协作平台。** 装上它,你就有了:
|
|
27
|
+
跨会话任务板、可维护的 Bot 注册表(每个 Bot 独立工作目录)、房间群聊、
|
|
28
|
+
分层记忆与纪律、以及一套「AI 该怎么做事」的资产库。
|
|
29
|
+
|
|
30
|
+
**它不是**记忆进化的插件替代品,也不依赖任何其他插件。
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 1. 四层结构(严格分层,禁止跨层调用)
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
┌─ L4 模型面 src/tools.js 38 个 bot_* 工具(模型能调什么)
|
|
38
|
+
├─ L3 页面面 src/client.js Web UI(10 页签 / 人话文案)
|
|
39
|
+
│ src/api.js 114 个 HTTP 端点(页面数据面)
|
|
40
|
+
├─ L2 领域面 board/roster/room/memory/discipline/todo/scratch/
|
|
41
|
+
│ prompts/suggest/reviewer/library/dispatcher(16 个服务)
|
|
42
|
+
└─ L1 内核面 kernel.js(宿主适配唯一出口) store.js(原子写/JSONL 回放)
|
|
43
|
+
registry.js settings.js fence.js compat.js
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**分层铁律**
|
|
47
|
+
1. **L1 是唯一宿主耦合点**。`kernel.js` 是 `src/` 里唯一允许真实 import
|
|
48
|
+
`@deepseek-ai/*` 的文件(CI 检查 1 机械强制)。
|
|
49
|
+
2. **L2 不知道 L3/L4 存在**。域服务是纯对象,不 import api/client/tools。
|
|
50
|
+
3. **L3 的 api 与 client 互不 import**。api 只产出 JSON;client 只消费 JSON。
|
|
51
|
+
4. **L4 不写业务逻辑**。工具层是薄适配:取服务 → 调方法 → 统一包装成
|
|
52
|
+
`{ok:true,...}` / `{ok:false, reason, ...}`。
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 2. 三条不可协商的设计原则
|
|
57
|
+
|
|
58
|
+
### 原则 1 · 零第三方运行时依赖
|
|
59
|
+
- `package.json` 的 `dependencies` **必须不存在或为空**;
|
|
60
|
+
- 只允许 `node:*` 内置 + DSH 自带官方包(随 DSH 安装,不算第三方);
|
|
61
|
+
- 生态里的任何插件(含 `dsh-memory-evolve`)**一律不许 import**;
|
|
62
|
+
- 由 `test/ci-zero-dep.sh` 5 项检查机械强制(禁依赖、禁插件 id、覆盖行必须列全 config、
|
|
63
|
+
禁 `window.prompt/confirm`)。
|
|
64
|
+
|
|
65
|
+
**为什么**:新机器只装本插件就能跑。一旦 import 别的插件,安装顺序、版本、
|
|
66
|
+
对方重构都会变成你的故障源。
|
|
67
|
+
|
|
68
|
+
### 原则 2 · 绝不静默失败
|
|
69
|
+
- 写失败**必须抛错**并从内存回滚(不允许「只改内存不落盘」);
|
|
70
|
+
- 快照写失败降级为 `warn` + 计数器,但**事件流必须已落盘**;
|
|
71
|
+
- 回放跳过坏行**必须计数并 warn**,不静默丢数据;
|
|
72
|
+
- 缺服务的工具返回**可读失败**(`memory-unavailable`),不抛崩、不假装成功。
|
|
73
|
+
|
|
74
|
+
**依据(真实事故)**:`my-free-model` 曾因 `costOfCall` 里 `catch { return 0 }`
|
|
75
|
+
把 ReferenceError 吞成 0 元,导致全站费用恒为 0 潜伏 4 天。
|
|
76
|
+
|
|
77
|
+
### 原则 3 · 事件流是真相源
|
|
78
|
+
```
|
|
79
|
+
写入:append(jsonl) → 更新内存 → 写快照(失败只 warn)
|
|
80
|
+
启动:读 jsonl 回放 → jsonl 为空才回落 snapshot → 都空 = 空态
|
|
81
|
+
```
|
|
82
|
+
- 快照是**派生缓存**,不是真相源;
|
|
83
|
+
- 回放只接受 `rev` 递增事件(同 rev 重放幂等,容忍重复投递);
|
|
84
|
+
- **只追加,绝不改写历史**。彻底删除(`memory.purge`)也只在流里追加一条
|
|
85
|
+
`after:null` 墓碑,而不是抹掉旧行 —— 否则「谁在什么时候删了什么」永久丢失。
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 3. 领域服务清单(16 个)
|
|
90
|
+
|
|
91
|
+
| # | 服务 | 文件 | 一句话 | 持久化 |
|
|
92
|
+
|---|---|---|---|---|
|
|
93
|
+
| 1 | `board` 任务板 | `board.js` | 跨会话任务:依赖 DAG、CAS 状态机、验收 | `board.jsonl` + `.snap.json` |
|
|
94
|
+
| 2 | `roster` Bot 注册表 | `roster.js` | 持久 Bot,**独立 cwd = 写入边界**;档案/技能/记忆 | `roster.jsonl` + 档案文件 |
|
|
95
|
+
| 3 | `room` 房间 | `room.js` | 群聊消息流 + `seq` 游标 + 长正文旁路 + 角色/归档 | `rooms/<id>/log.jsonl` |
|
|
96
|
+
| 4 | `memory` 分层记忆 | `memory.js` | L0–L5、注入、FTS5 检索、按项目隔离、彻底删除 | `memory.jsonl` + FTS5 |
|
|
97
|
+
| 5 | `dispatcher` 唤醒桥 | `dispatcher.js` | 定向唤醒 + `dedupKey` 去重 + 节流 | `wakes.jsonl` |
|
|
98
|
+
| 6 | `library` 资产库 | `library.js` | 技能/工作流;来源分层、启停、导入导出、目录扫描 | `library.jsonl` |
|
|
99
|
+
| 7 | `discipline` 分级纪律 | `discipline.js` | 全局/工作区/房间/Bot 四级,合并去重 + 预算裁剪 | `discipline.jsonl` |
|
|
100
|
+
| 8 | `todo` 四轨待办 | `todo.js` | 生活/工作/项目/每日 + 四象限 + 智能视图 | `todo.jsonl` |
|
|
101
|
+
| 9 | `scratch` 便签 | `scratch.js` | 单文件随手记,原子写 | `scratch/<scope>.md` |
|
|
102
|
+
| 10 | `prompts` 提示词库 | `prompts.js` | 模板 CRUD + 注入轨(每 N 回合/次数/立即) | `prompts.jsonl` |
|
|
103
|
+
| 11 | `suggest` 建议确认队列 | `suggest.js` | 模型只能提议,人点采纳才落库 | `suggestions.jsonl` |
|
|
104
|
+
| 12 | `reviewer` 自审调度 | `reviewer.js` | 每 N 回合提醒模型做记忆自检(纯计数,不越权写库) | `reviewer.jsonl` |
|
|
105
|
+
| 13 | `metrics` 测量 | `metrics.js` | PDCA 的 Check 数据面:周期/吞吐/驳回率等指标 | `metrics.jsonl` + `.snap.json` |
|
|
106
|
+
| 14 | `verify` 验收证据 | `verify.js` | PDCA 的 Check 证据自动化:文件/命令/测试声明式检查 | `verify.jsonl` + `.snap.json` |
|
|
107
|
+
| 15 | `cycle` 复盘与标准化 | `cycle.js` | PDCA 的 Act:planned→doing→checking→acting→done,不许跳步 | `cycle.jsonl` + `.snap.json` |
|
|
108
|
+
| 16 | `teams` 大/小团队 | `teams.js` | Lead 聚合管理:big(人建稳定结构)/ small(智能体自建临时小组) | `teams.jsonl` + `.snap.json` |
|
|
109
|
+
|
|
110
|
+
### 「建议确认制」是记忆安全的核心机制
|
|
111
|
+
```
|
|
112
|
+
模型想记住 X → suggest.propose(kind, layer, payload, reason) [只入队]
|
|
113
|
+
↓
|
|
114
|
+
人 在「记忆 → 事实与偏好」看到红条,点「采纳」
|
|
115
|
+
↓
|
|
116
|
+
api.applySuggestion()(同步)真正写入 memory/library/discipline
|
|
117
|
+
```
|
|
118
|
+
- `accept` 的 `apply` 回调**必须是同步的**:返回 Promise 会在真正落库前就标记
|
|
119
|
+
accepted(假采纳),因此 `suggest.js` 显式拒绝异步 apply(`SUGGEST_ASYNC_APPLY`)。
|
|
120
|
+
- apply 抛错 → 该条**保持 pending** + 记 `lastError` 落盘 + 抛给调用方,可修复后重试。
|
|
121
|
+
- 这是模型修改长期记忆的**唯一合法途径**。
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 4. 页面层信息架构(10 页签,与原架构一致)
|
|
126
|
+
|
|
127
|
+
**判据(新增功能先过这一关)**
|
|
128
|
+
> 新能力若没有独立生命周期、不需要多人/多 Bot 共同引用、不产生可点进去的详情,
|
|
129
|
+
> **不许新开页签**,只能作为既有页签内的子视图。
|
|
130
|
+
|
|
131
|
+
| 主页签 | 子视图 | 一句人话 | 对应服务 |
|
|
132
|
+
|---|---|---|---|
|
|
133
|
+
| **任务** | 协作看板 / 我的待办 / 便签 | 要做的活 | board + todo + scratch |
|
|
134
|
+
| **Bot** | — | 谁来做 | roster |
|
|
135
|
+
| **房间** | — | 在哪商量 | room |
|
|
136
|
+
| **记忆** | 事实与偏好 / 纪律与要求 / 提示词 | AI 该知道什么 | memory + discipline + prompts |
|
|
137
|
+
| **技能库** | — | 怎么做 | library(skills) |
|
|
138
|
+
| **工作流库** | — | 按什么步骤做 | library(workflows) |
|
|
139
|
+
| **设置** | — | 平台怎么跑 | settings + reviewer + 诊断 |
|
|
140
|
+
|
|
141
|
+
**为什么这样分**(详见 `docs/adr/ADR-001`):
|
|
142
|
+
- 页签只有两种:**协作对象**(多个、有生命周期、要点进去)与**配置资产**(配一次、多处引用);
|
|
143
|
+
- 待办/便签/纪律/提示词都不是对象,是既有对象的**视图或属性** ⇒ 只能做子视图;
|
|
144
|
+
- 记忆是高频浏览的**对象**(要增删改查),所以放顶层而不是塞进设置。
|
|
145
|
+
|
|
146
|
+
**三种粒度是一条漏斗**:便签(想到就记)→ 待办(决定要做)→ 任务(决定交给谁做)。
|
|
147
|
+
待办条目上的「派下去」就是这个漏斗的收口(`POST /todos/promote`,幂等)。
|
|
148
|
+
|
|
149
|
+
### UI 文案纪律(人类视角,不是程序员视角)
|
|
150
|
+
| 禁止出现 | 改为 |
|
|
151
|
+
|---|---|
|
|
152
|
+
| `L0/L3`、`rev`、`cwd`、`CAS`、`jsonl` | 人格/项目记忆、第 N 版、工作目录、版本冲突、事件流 |
|
|
153
|
+
| 裸错误码 | 一句人话 + 怎么修 |
|
|
154
|
+
| 无引导的空列表 | 空态说明「这里是什么、下一步点什么」 |
|
|
155
|
+
| `window.confirm` | 站内 `ConfirmModal`(沙箱里 confirm 被静默屏蔽) |
|
|
156
|
+
| 破坏性操作无后果说明 | 明确写「会怎样、能不能恢复」 |
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 5. 权限与安全
|
|
161
|
+
|
|
162
|
+
### API 认证围栏(`fence.js`)
|
|
163
|
+
公网暴露的 API 必须有门。判定顺序:
|
|
164
|
+
1. `Origin` 与 `Host` 不同源 → **403**(防 CSRF);
|
|
165
|
+
2. 宿主 `connection` 服务可用 → 交它做**真实会话校验**(401/403);
|
|
166
|
+
3. 宿主校验缺失 → **拒绝一切经代理请求**(fail-closed),非代理直连/测试替身放行。
|
|
167
|
+
|
|
168
|
+
**为什么第 3 条不是一律拒绝**:测试用假 req/res 直接调 handler,没有 socket;
|
|
169
|
+
一律拒绝会逼人关掉围栏 —— 那才是真隐患。区分「经代理」与「非经代理」是准确边界。
|
|
170
|
+
|
|
171
|
+
实测:`curl -X POST /cs-bots/api/fs/mkdir`(无 cookie)→ **401**,目录未创建;
|
|
172
|
+
带浏览器同款会话 cookie → **200**。
|
|
173
|
+
|
|
174
|
+
### 超级管理员
|
|
175
|
+
`OWNER='user'` 在 api 层代表「人」。房间归档/删除/角色/踢人、Bot 档案写入、
|
|
176
|
+
记忆 L0 修改等,Bot 侧的 `byId` 永远不等于 `user`,因此天然无法自我提权。
|
|
177
|
+
|
|
178
|
+
### 受保护区
|
|
179
|
+
`dirbrowse.js` 有 `DIR_PROTECTED` 白名单:状态目录、`~/.ssh`、`~/.dsh` 等不可被
|
|
180
|
+
`fs/mkdir|rename` 触碰(实测 P0 曾可写入 `~/.dsh/cs-bots/PWN-PROOF`,已修)。
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 6. 关键实现模式(照抄即可,勿另起炉灶)
|
|
185
|
+
|
|
186
|
+
### 6.1 事件流 + 快照
|
|
187
|
+
```js
|
|
188
|
+
commit(id, action, by, at, before, after) {
|
|
189
|
+
appendJsonl(file, event) // 1. 真相源,失败即抛(不允许只改内存)
|
|
190
|
+
entries.set(id, clone(after)) // 2. 内存
|
|
191
|
+
events.push(event) // 3. 审计
|
|
192
|
+
indexUpsert(after) // 4. 派生索引
|
|
193
|
+
writeJsonAtomic(snap, snapshot()) // 5. 快照,失败只 warn + 计数
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
原子写:`tmp-<pid>-<rand>` → `fsync` → `rename` → `fsync(dir)`。
|
|
197
|
+
|
|
198
|
+
### 6.2 CAS 并发
|
|
199
|
+
所有可变对象带 `rev`;更新必须带 `expectedRev`,不匹配抛 `*_REV_CONFLICT`。
|
|
200
|
+
**绝不静默覆盖**。缺 `expectedRev` 时按模块契约:必填的抛 `MISSING_EXPECTED_REV`。
|
|
201
|
+
|
|
202
|
+
| 服务 | 变更入口的 `expectedRev` | 冲突错误码 |
|
|
203
|
+
|---|---|---|
|
|
204
|
+
| `room` | **可选**(不传即不拦,兼容 §3.2 冻结签名):`update` / `join` / `leave` / `archiveRoom` / `unarchiveRoom` / `removeRoom` / `setMemberRole` / `kickMember` | `ROOM_REV_CONFLICT` |
|
|
205
|
+
| `memory` | **必填**(`update`/`remove`):`update` / `remove`;**可选**:`archive` / `purge` / `restore` | `MEMORY_CAS_CONFLICT` |
|
|
206
|
+
| `todo` | **必填**:`updateTodo` / `removeTodo` | `TODO_REV_CONFLICT` |
|
|
207
|
+
| `roster` | **必填**:`rename` / `setCwd` / `setProfile` / `addProfileMemory` / `linkSkills` / `claim` / `release` / `heartbeat`;**无 CAS**:`retire`(签名无该参数,但拒绝重复退役) | `ROSTER_REV_CONFLICT` |
|
|
208
|
+
|
|
209
|
+
每次成功变更后,四个服务都调用 `store.appendAudit(stateDir, {ts,actor,action,target,before,after})`
|
|
210
|
+
(软用:拿不到/写失败只 `warn` 一次 + 计入 `diagnostics.auditWriteFailures`,绝不阻断主流程)。
|
|
211
|
+
|
|
212
|
+
### 6.3 错误码
|
|
213
|
+
`<DOMAIN>_<KIND>`:`MEMORY_CAS_CONFLICT` / `TODO_CWD_REQUIRED` / `ROOM_NOT_EMPTY` /
|
|
214
|
+
`LIB_BAD_DIR` / `SUGGEST_ASYNC_APPLY` / `REVIEW_BAD_INTERVAL` …
|
|
215
|
+
错误对象同时带 `code`(机器读)与中文 `reason`(人读)。API 层把 `code` 一并返回。
|
|
216
|
+
|
|
217
|
+
### 6.4 降级
|
|
218
|
+
`apply()` 绝不抛:任一服务装配失败只 `warn` 并把 `services[key] = undefined`;
|
|
219
|
+
`GET /status` 如实上报 16 个服务的 `available`,缺哪个页面就显示降级,不假装正常。
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 7. 目录与数据布局
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
~/.dsh/cs-bots/
|
|
227
|
+
├── board.jsonl / board.snap.json
|
|
228
|
+
├── roster.jsonl / roster.snap.json
|
|
229
|
+
├── memory.jsonl / memory.snap.json / memory-fts.db
|
|
230
|
+
├── discipline.jsonl / discipline.snap.json
|
|
231
|
+
├── todo.jsonl / todo.snap.json
|
|
232
|
+
├── prompts.jsonl / prompts.snap.json
|
|
233
|
+
├── suggestions.jsonl / suggestions.snap.json
|
|
234
|
+
├── reviewer.jsonl
|
|
235
|
+
├── library.jsonl / library-skill-dirs.json
|
|
236
|
+
├── wakes.jsonl
|
|
237
|
+
├── scratch/<scope>.md
|
|
238
|
+
└── rooms/<roomId>/{log.jsonl,bodies/*.txt}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
每条 Bot 的档案落在**它自己的 cwd**(写作边界):
|
|
242
|
+
`<cwd>/AGENTS.md`(受管区块)+ `<cwd>/.agents/skills/*/SKILL.md`。
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 8. 接口规模(**v0.6 时的实测,已过期**)
|
|
247
|
+
|
|
248
|
+
> ⚠️ 下表是 2026-11-06 的数字,**不是现在的**。当前数字见本文件开头。
|
|
249
|
+
|
|
250
|
+
| 层 | 数量(v0.6) | 说明 |
|
|
251
|
+
|---|---|---|
|
|
252
|
+
| HTTP 端点 | 93 | `src/api.js`,全部经围栏 |
|
|
253
|
+
| 模型工具 | 28 | 前缀 `bot_`,避免与其他插件撞名 |
|
|
254
|
+
| 域服务 | 12 | 见 §3 |
|
|
255
|
+
| 源文件 | 24 | `src/*.js`,合计 24,736 行 |
|
|
256
|
+
| 测试文件 | 30 | 656 用例全绿(v0.6 时) |
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 9. 开发与验收
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
bash test/run-all.sh # 单入口:零依赖 CI + 全部单测;任一失败退出码非 0
|
|
264
|
+
bash test/ci-zero-dep.sh # 只跑零依赖 CI(5 项)
|
|
265
|
+
bash install.sh --channel npm # 装 + 自检(exit=2 表示装了但自检不过)
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**交付验收口径**:只认证据 —— 文件存在、退出码、真实输出。不接受「我完成了」。
|
|
269
|
+
|
|
270
|
+
**已知环境坑**
|
|
271
|
+
1. `~/.dsh/profiles/web/node_modules/cs-bots` 是**真实拷贝**(不是 symlink)⇒
|
|
272
|
+
改源码后必须 `rsync` + `sudo systemctl restart dsh-web.service` 才生效;
|
|
273
|
+
而 `cs-guard`/`cs-myfree` 是 symlink,改完即生效。
|
|
274
|
+
2. 重启会杀掉当前会话的 cgroup ⇒ 重启+验证脚本必须用
|
|
275
|
+
`sudo systemd-run --unit=... --collect` 独立单元运行,日志写独立文件。
|
|
276
|
+
3. bundle 层序:本插件必须排在 `agent-team-profile` **之后**,否则
|
|
277
|
+
`maxMembers` 覆盖会在目标行不存在时被静默跳过(`install.sh` 会检测并重排)。
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# ADR-001 · 页签结构回到 7 个(能力增长,页签不增长)
|
|
2
|
+
|
|
3
|
+
- 状态:已采纳(2026-11-05)
|
|
4
|
+
- 决策人:主管(用户)提问 + Lead 分析
|
|
5
|
+
- 影响面:`src/client.js` 的 `TABS`、全部页面文案
|
|
6
|
+
|
|
7
|
+
## 背景
|
|
8
|
+
|
|
9
|
+
v0.1.1 的原架构是 **7 个页签**:任务 / Bot / 房间 / 记忆 / 技能库 / 工作流库 / 设置。
|
|
10
|
+
|
|
11
|
+
v2 为对齐「记忆进化」的能力(`ANALYSIS-memory-evolve-parity.md`),补齐了
|
|
12
|
+
待办、便签、纪律、提示词四块能力,并**各开了一个页签**,页签变成 11 个:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
任务 · 待办 · Bot · 房间 · 纪律 · 记忆 · 便签 · 提示词 · 技能库 · 工作流库 · 设置
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
主管质疑:**「待办和便签为什么单列 UI,是仿照记忆进化吗?和任务的关系是什么。」**
|
|
19
|
+
这个质疑命中了真问题。
|
|
20
|
+
|
|
21
|
+
## 分析:原架构的页签只有两种
|
|
22
|
+
|
|
23
|
+
| 类型 | 判据 | 例 |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| **协作对象** | 你有多个;每个有生命周期;需要点进去看详情;会被别的对象引用 | 任务、Bot、房间 |
|
|
26
|
+
| **配置资产** | 配置一次;被多处引用;不需要"逐个点进去操作" | 技能库、工作流库、设置 |
|
|
27
|
+
|
|
28
|
+
对照后发现,v2 新增的四个页签**两类都不属于**:
|
|
29
|
+
|
|
30
|
+
- **待办** = 任务的个人视图(同一件事的两种粒度,不是两种对象)
|
|
31
|
+
- **便签** = 一次性草稿(没有生命周期,甚至不算对象)
|
|
32
|
+
- **纪律** = AI 的规矩(记忆的同族:AI 该知道什么)
|
|
33
|
+
- **提示词** = AI 的指令模板(同上)
|
|
34
|
+
|
|
35
|
+
**根因**:把「能力对等」误当成「页面也对等」——memory-evolve 有独立页面,
|
|
36
|
+
这边就也各开一个。但页面结构应对齐**本平台的领域模型**,不是对齐别的插件的页面。
|
|
37
|
+
|
|
38
|
+
## 决策
|
|
39
|
+
|
|
40
|
+
**新增能力一律不新开页签**,只能作为既有页签内的子视图。页签数回到 **7**:
|
|
41
|
+
|
|
42
|
+
| 主页签 | 子视图 | 一句人话 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| 任务 | 协作看板 / 我的待办 / 便签 | 要做的活 |
|
|
45
|
+
| Bot | — | 谁来做 |
|
|
46
|
+
| 房间 | — | 在哪商量 |
|
|
47
|
+
| 记忆 | 事实与偏好 / 纪律与要求 / 提示词 | AI 该知道什么 |
|
|
48
|
+
| 技能库 | — | 怎么做 |
|
|
49
|
+
| 工作流库 | — | 按什么步骤做 |
|
|
50
|
+
| 设置 | — | 平台怎么跑 |
|
|
51
|
+
|
|
52
|
+
## 对主管两个具体建议的回应
|
|
53
|
+
|
|
54
|
+
1. **「待办/便签融合到任务栏」→ 采纳**。理由:三者是**一条漏斗**——
|
|
55
|
+
便签(想到就记)→ 待办(决定要做)→ 任务(决定交给谁做)。
|
|
56
|
+
并且补了 **`POST /todos/promote`**(待办「派下去」按钮)把漏斗收口,
|
|
57
|
+
否则只是换了个位置,没解决"两种东西并存"的困惑。
|
|
58
|
+
|
|
59
|
+
2. **「记忆/纪律/提示词融合到一个设置页」→ 采纳分组,但不放进设置**。
|
|
60
|
+
理由:**记忆是高频操作的对象**(要增删改查、要归档、要按项目切),
|
|
61
|
+
塞进设置页会让最常用的功能多点两层。改为在顶层**记忆**页下做三个子视图,
|
|
62
|
+
分组逻辑正是主管说的那个分组(AI 该知道什么),只是不叫"设置"。
|
|
63
|
+
|
|
64
|
+
## 后果
|
|
65
|
+
|
|
66
|
+
- 页签数 7,与 v0.1.1 原架构一致;新增能力全部落子视图。
|
|
67
|
+
- 新增代码判据(写进 ARCHITECTURE.md §4):
|
|
68
|
+
> 新能力若没有独立生命周期、不需要多人/多 Bot 共同引用、不产生可点进去的详情,
|
|
69
|
+
> 不许新开页签。
|
|
70
|
+
- 代价:子视图多一次点击才能到「便签」;用「一条漏斗」的心智抵消。
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Step 01 · 原架构复原与信息架构(IA)诊断
|
|
2
|
+
|
|
3
|
+
> 存档目的:后续所有改动都以「原架构」为准绳。本文件锁定原架构的事实,以及
|
|
4
|
+
> 为什么会出现「待办/便签单列」这种越界,避免重复讨论。
|
|
5
|
+
|
|
6
|
+
## 1. 原架构(事实,来自 README + git 历史,不是回忆)
|
|
7
|
+
|
|
8
|
+
**领域层 = 5 个协作对象/服务**(`src/` 一一对应):
|
|
9
|
+
|
|
10
|
+
| 域服务 | 文件 | 职责 | 持久化 |
|
|
11
|
+
|---|---|---|---|
|
|
12
|
+
| `board` 任务板 | `board.js` | 跨会话任务:依赖 DAG、CAS 状态机、验收 | `board.jsonl` + `.snap.json` |
|
|
13
|
+
| `roster` Bot 注册表 | `roster.js` | 持久 Bot,**独立 cwd = 写入边界** | `roster.jsonl` + `.snap.json` |
|
|
14
|
+
| `room` 房间群聊 | `room.js` | 消息流 + `seq` 游标 + 长正文旁路 | `rooms/<id>/log.jsonl` |
|
|
15
|
+
| `memory` 分层记忆 | `memory.js` | L0–L5、注入、检索 | `memory.jsonl` + FTS5 |
|
|
16
|
+
| `dispatcher` 唤醒桥 | `dispatcher.js` | 定向唤醒 + `dedupKey` 去重 | `wakes.jsonl` |
|
|
17
|
+
|
|
18
|
+
**页面层 = 7 个页签**(v0.1.1 之前):
|
|
19
|
+
|
|
20
|
+
`任务` / `Bot` / `房间` / `记忆` / `技能库` / `工作流库` / `设置`
|
|
21
|
+
|
|
22
|
+
**页签与域的映射关系只有两种**:
|
|
23
|
+
1. **协作对象**(任务、Bot、房间)——你有多个、每个有生命周期、需要点进去看详情;
|
|
24
|
+
2. **配置资产**(技能库、工作流库、设置)——你配置一次、被多对象引用。
|
|
25
|
+
|
|
26
|
+
**三条原始设计原则**(README「设计要点」+ 代码注释):
|
|
27
|
+
1. **独立工作目录**:持久 Bot 走 `ctx.agents.create({meta:{cwd}})`,因为官方
|
|
28
|
+
`spawn_teammate` 无 `cwd` 字段、子会话强制继承父 cwd,而 cwd 同时是 fs 写入边界。
|
|
29
|
+
2. **自建而非寄生**:官方任务板 `TeamId=SessionId`(每会话一块)、roster 是
|
|
30
|
+
flat immutable(无改名/删除/复用)⇒ 跨会话任务板与可维护 Bot 注册表必须自建。
|
|
31
|
+
3. **零第三方运行时依赖**:`test/ci-zero-dep.sh` 机械强制(5 项检查)。
|
|
32
|
+
生态里任何插件(含 `dsh-memory-evolve`)都**不许 import**。
|
|
33
|
+
|
|
34
|
+
## 2. 越界是怎么发生的
|
|
35
|
+
|
|
36
|
+
v2 按 `ANALYSIS-memory-evolve-parity.md` 补齐「记忆进化」对等能力时,
|
|
37
|
+
**把"能力对等"误当成"页面也对等"**:memory-evolve 有独立页面,于是这边也各开一个页签。
|
|
38
|
+
|
|
39
|
+
结果页签从 **7 → 11**:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
任务 · 待办 · Bot · 房间 · 纪律 · 记忆 · 便签 · 提示词 · 技能库 · 工作流库 · 设置
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**这违反了原架构的第 1 条映射规则**:待办、便签、纪律、提示词都不是「有生命周期的协作对象」,
|
|
46
|
+
它们是**某个既有对象的属性/视图**:
|
|
47
|
+
|
|
48
|
+
- 待办 = 任务的**个人视图**(同一件事的两种粒度);
|
|
49
|
+
- 便签 = 个人的**临时草稿**(不是对象,是一次性的);
|
|
50
|
+
- 纪律 = AI 的**规矩**(和记忆同一心智:AI 该知道什么);
|
|
51
|
+
- 提示词 = AI 的**指令模板**(同上)。
|
|
52
|
+
|
|
53
|
+
**判据(以后新增功能都用它自查)**:
|
|
54
|
+
> 新能力若没有独立生命周期、不需要多人/多 Bot 共同引用、不产生可点进去的详情,
|
|
55
|
+
> 就**不许新开页签**,只能作为既有页签内的子视图。
|
|
56
|
+
|
|
57
|
+
## 3. 结论:回到 7 个页签(不是新增,是归位)
|
|
58
|
+
|
|
59
|
+
| 主页签 | 子视图 | 归并为一句人话 |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| **任务** | 看板 / 我的待办 / 便签 | 「要做的活」 |
|
|
62
|
+
| **Bot** | (不变) | 「谁来做」 |
|
|
63
|
+
| **房间** | (不变) | 「在哪商量」 |
|
|
64
|
+
| **记忆** | 记忆 / 纪律 / 提示词 | 「AI 该知道什么」 |
|
|
65
|
+
| **技能库** | (不变) | 「怎么做」 |
|
|
66
|
+
| **工作流库** | (不变) | 「按什么步骤做」 |
|
|
67
|
+
| **设置** | (不变,新增自审间隔) | 「平台怎么跑」 |
|
|
68
|
+
|
|
69
|
+
页签数 **回到 7**,与 v0.1.1 原架构一致;新增能力全部落在子视图里。
|
|
70
|
+
|
|
71
|
+
## 4. 与「任务」的关系(用户直接问的那个问题)
|
|
72
|
+
|
|
73
|
+
不是同一件事,但**必须在同一个页面里**:
|
|
74
|
+
|
|
75
|
+
- `board` 任务:**协作单元**。有依赖 DAG、CAS 状态、验收人、可被 Bot 领取。跨会话可见。
|
|
76
|
+
- `todo` 待办:**个人备忘**。四轨(生活/工作/本项目/每日)+ 四象限 + 截止日。不参与协作。
|
|
77
|
+
- `scratch` 便签:**临时草稿**。一个文件,随手写,不整理。
|
|
78
|
+
|
|
79
|
+
关系是**漏斗的上游到下游**:便签(想到就记)→ 待办(决定要做)→ 任务(决定交给谁做)。
|
|
80
|
+
所以同页不同视图,并在待办条目上提供「升级为任务」的入口(后续增量)。
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Step 02 · 页签收敛(11 → 7)与「待办 → 任务」升级通道
|
|
2
|
+
|
|
3
|
+
## 1. 代码层实现(`src/client.js`)
|
|
4
|
+
|
|
5
|
+
### 页签结构改为「主页签 + 子视图」
|
|
6
|
+
```js
|
|
7
|
+
TABS = [
|
|
8
|
+
{ id:'tasks', label:'任务', subs:[
|
|
9
|
+
{id:'board', label:'协作看板', Comp:TasksTab},
|
|
10
|
+
{id:'todo', label:'我的待办', Comp:TodoTab},
|
|
11
|
+
{id:'scratch', label:'便签', Comp:ScratchTab} ] },
|
|
12
|
+
{ id:'bots', label:'Bot' },
|
|
13
|
+
{ id:'rooms', label:'房间' },
|
|
14
|
+
{ id:'memory', label:'记忆', subs:[
|
|
15
|
+
{id:'facts', label:'事实与偏好', Comp:MemoryTab},
|
|
16
|
+
{id:'rules', label:'纪律与要求', Comp:DisciplineTab},
|
|
17
|
+
{id:'prompts', label:'提示词', Comp:PromptsTab} ] },
|
|
18
|
+
{ id:'skills', label:'技能库' },
|
|
19
|
+
{ id:'workflows',label:'工作流库' },
|
|
20
|
+
{ id:'settings', label:'设置' },
|
|
21
|
+
]
|
|
22
|
+
```
|
|
23
|
+
- `viewsOf(tab)`:单页页签返回 `[自身]`;`subs.length > 1` 才渲染子页签行。
|
|
24
|
+
- 切主页签时 `setView(null)`,避免「停在任务/便签,切到记忆还是便签」的串位 bug。
|
|
25
|
+
- ErrorBoundary 的 `tab` 名带上子视图(`记忆/纪律与要求`),出错时能定位到具体子页。
|
|
26
|
+
|
|
27
|
+
**结果:页签数 7,与 v0.1.1 原架构一致。**
|
|
28
|
+
|
|
29
|
+
## 2. 「待办 → 任务」升级通道(新增,不是搬位置)
|
|
30
|
+
|
|
31
|
+
原架构里没有这条通道,直接把待办塞进任务页只会是「换了个位置」。真正的关系是
|
|
32
|
+
**漏斗上下游**:便签(想到就记)→ 待办(决定要做)→ 任务(决定交给谁做)。
|
|
33
|
+
所以补了服务端一步:
|
|
34
|
+
|
|
35
|
+
`POST /todos/promote { id, expectedRev?, priority?, by? }`
|
|
36
|
+
1. 取待办 → 用第一行做任务标题、全文做描述、截止日转 `dueAt`;
|
|
37
|
+
2. `board.create({ sourceSeq: 'todo:<id>' })` —— **幂等**,连点两次只产生一个任务;
|
|
38
|
+
3. 待办状态 `pending → doing`(不再出现在「要关注」里被重复安排);
|
|
39
|
+
4. 返回 `{ task, todo }`。
|
|
40
|
+
|
|
41
|
+
### 实测(真跑,非自述)
|
|
42
|
+
```
|
|
43
|
+
建待办: td-5fc328e7 状态= pending
|
|
44
|
+
升级#1: 200 | task= 把发布流程写成脚本 | 待办状态= doing
|
|
45
|
+
升级#2 幂等: 200 | 同一任务= true
|
|
46
|
+
任务总数: 1 (应为 1)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 3. UI 文案(人话)
|
|
50
|
+
- 待办页标题「我的待办」,说明里点明「要交给 Bot 或别人做的,点「派下去」就会出现在「协作看板」里」;
|
|
51
|
+
- 按钮叫 **「派下去」** 而不是「升级为任务」——用户心智里这是"派活",不是"改类型"。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Step 03 · 架构资料成文
|
|
2
|
+
|
|
3
|
+
产出:
|
|
4
|
+
- `docs/ARCHITECTURE.md`(245 行)——唯一架构真相源:四层结构、三条原则、12 域服务、
|
|
5
|
+
7 页签 IA、权限、实现模式、数据布局、实测数字、开发验收
|
|
6
|
+
- `docs/adr/ADR-001-页签结构回到七页.md`——页签收敛的决策记录(背景/分析/决策/后果)
|
|
7
|
+
- `docs/steps/step-01..03`——每步存档,避免重复劳动
|
|
8
|
+
|
|
9
|
+
实测数字(写入文档,均可复核):
|
|
10
|
+
| 指标 | 值 | 复核命令 |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| HTTP 端点 | 93 | `grep -oE "path === '[^']+'" src/api.js \| sort -u \| wc -l` |
|
|
13
|
+
| 模型工具 | 27 | `grep -cE " name: 'bot_" src/tools.js` |
|
|
14
|
+
| 域服务 | 12 | `GET /cs-bots/api/status` → `services` |
|
|
15
|
+
| 源文件 | 24 / 24,736 行 | `wc -l src/*.js` |
|
|
16
|
+
| 测试 | 30 文件 / 656 用例全绿 | `bash test/run-all.sh` |
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Step 04 · 上线与线上验证(只认证据)
|
|
2
|
+
|
|
3
|
+
## 1. 部署动作(安装副本是真实拷贝,必须 rsync + 重启)
|
|
4
|
+
```bash
|
|
5
|
+
rsync -a --delete src/ ~/.dsh/profiles/web/node_modules/cs-bots/src/
|
|
6
|
+
cp -f package.json README.md ~/.dsh/profiles/web/node_modules/cs-bots/
|
|
7
|
+
rsync -a docs/ ~/.dsh/profiles/web/node_modules/cs-bots/docs/
|
|
8
|
+
diff -rq src <副本>/src # → 无输出 = 一致
|
|
9
|
+
sudo systemd-run --unit=csbots-v3-restart --collect /bin/bash restart-verify-v3.sh
|
|
10
|
+
```
|
|
11
|
+
**为什么用 systemd-run 独立单元**:重启 dsh-web 会连带杀掉发起者的 cgroup,
|
|
12
|
+
脚本自身被清理、日志断在 restart 那一行(前两次踩过)。
|
|
13
|
+
|
|
14
|
+
重启实测:
|
|
15
|
+
```
|
|
16
|
+
旧 MainPID: 1059257
|
|
17
|
+
restart 返回: 0
|
|
18
|
+
就绪: 第 1 次探测 active=active
|
|
19
|
+
新 MainPID: 1156272 更换=YES
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 2. 线上验证结果(逐项,可复跑)
|
|
23
|
+
|
|
24
|
+
| 检查 | 结果 |
|
|
25
|
+
|---|---|
|
|
26
|
+
| 服务状态 | `active`,MainPID 已更换 |
|
|
27
|
+
| 域服务装配 | **12/12 就绪**:roster, board, dispatcher, room, memory, library, discipline, todo, scratch, prompts, suggest, reviewer |
|
|
28
|
+
| 鉴权围栏 | 无 cookie 的 `POST /fs/mkdir` → **401**,目录未创建 |
|
|
29
|
+
| 带会话访问 | `GET /status` → **200** |
|
|
30
|
+
| `POST /memory/purge` | 存在(空参返回 `MEMORY_MISSING_FIELD` 校验错误,不是 404) |
|
|
31
|
+
| `POST /todos/promote` | **200**,`task.subject=「V3-线上验证:写发布脚本」` |
|
|
32
|
+
| 页面加载的客户端 bundle | `HTTP=200`,**191,958 字节** |
|
|
33
|
+
| bundle 内页签结构 | 实测为 7 个页签 + `subs`,`id:'todos'` 顶层页签 **0 处** |
|
|
34
|
+
| 新 UI 关键字 | 协作看板 / 我的待办 / 事实与偏好 / 纪律与要求 / csb-subtabs / 派下去 / 来源目录 / 分类管理 / 记忆自审 —— 全部命中 |
|
|
35
|
+
|
|
36
|
+
> 客户端 bundle 地址形如 `/plugins/??cs-bots/client.js&rev=<hash>`;
|
|
37
|
+
> 重启后 `rev` 变化,浏览器刷新即拿到新版(不需要清缓存)。
|
|
38
|
+
|
|
39
|
+
## 3. 测试数据已清理
|
|
40
|
+
线上验证产生的待办(`td-58b2af70`)与任务(`t-20`)均已删除,未留残留。
|
|
41
|
+
|
|
42
|
+
## 4. 全量测试
|
|
43
|
+
```
|
|
44
|
+
bash test/run-all.sh → 656 tests / 656 pass / 0 fail
|
|
45
|
+
bash test/ci-zero-dep.sh → CI PASS(5 项机械检查)
|
|
46
|
+
```
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# cs-bots v0.2.0 · 交付说明
|
|
2
|
+
|
|
3
|
+
日期:2026-11-05 | 状态:已上线并线上验证
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 一、这一版回答了你问的那个问题
|
|
8
|
+
|
|
9
|
+
> **「待办和便签为什么单列 UI,是仿照记忆进化吗?和任务的关系是什么。」**
|
|
10
|
+
|
|
11
|
+
**是,也不是。** 事实经过:v2 补齐「记忆进化」的对等能力时,把**能力对等**
|
|
12
|
+
误当成了**页面也对等**——memory-evolve 有独立页面,这边就也各开一个页签,
|
|
13
|
+
于是页签从 7 涨到 11。这是**越界**,不是设计。
|
|
14
|
+
|
|
15
|
+
**原架构的页签只有两种**:
|
|
16
|
+
1. **协作对象**(任务 / Bot / 房间)——你有多个、有生命周期、要点进去看详情;
|
|
17
|
+
2. **配置资产**(技能库 / 工作流库 / 设置)——配一次、被多处引用。
|
|
18
|
+
|
|
19
|
+
待办、便签、纪律、提示词**两类都不属于**:它们是既有对象的视图或属性。
|
|
20
|
+
|
|
21
|
+
**与任务的关系**:三者是一条**漏斗**——
|
|
22
|
+
便签(想到就记)→ 待办(决定要做)→ 任务(决定交给谁做)。
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 二、做了什么
|
|
27
|
+
|
|
28
|
+
### 1. 页签从 11 收敛回 7(与原架构一致)
|
|
29
|
+
|
|
30
|
+
| 页签 | 子视图 | 一句人话 |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| 任务 | 协作看板 / 我的待办 / 便签 | 要做的活 |
|
|
33
|
+
| Bot | — | 谁来做 |
|
|
34
|
+
| 房间 | — | 在哪商量 |
|
|
35
|
+
| 记忆 | 事实与偏好 / 纪律与要求 / 提示词 | AI 该知道什么 |
|
|
36
|
+
| 技能库 | — | 怎么做 |
|
|
37
|
+
| 工作流库 | — | 按什么步骤做 |
|
|
38
|
+
| 设置 | — | 平台怎么跑 |
|
|
39
|
+
|
|
40
|
+
### 2. 不只是搬位置:补了「漏斗收口」
|
|
41
|
+
待办条目新增按钮 **「派下去」** → `POST /todos/promote`:
|
|
42
|
+
把待办变成协作看板上的正式任务(第一行做标题、全文做描述、截止日转 dueAt),
|
|
43
|
+
并把待办标成"进行中",避免被重复安排。**幂等**(`sourceSeq=todo:<id>`,连点两次只出一个任务)。
|
|
44
|
+
|
|
45
|
+
### 3. 记忆补上真删除(原来只有归档)
|
|
46
|
+
- `remove` 现在诚实地叫**软删除**:进归档区、显示「已删除(可恢复)」、可恢复;
|
|
47
|
+
- 新增 `purge`(**彻底删除**):内存 + 快照 + 重启后都不存在,不可恢复;
|
|
48
|
+
事件流只留一条 `after:null` 墓碑记录"谁在何时删了什么",审计不丢、内容不留。
|
|
49
|
+
- 归档区里删过的条目会明确标注,并给「彻底删除」按钮(强确认 + 后果说明)。
|
|
50
|
+
|
|
51
|
+
### 4. UI 补齐(人类视角)
|
|
52
|
+
技能来源目录管理、提示词分类管理、记忆自审间隔设置、Bot 档案「从记忆库导入」、
|
|
53
|
+
项目记忆切换与「归到当前项目」。
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 三、验收证据(不是自述)
|
|
58
|
+
|
|
59
|
+
| 指标 | 值 | 复核方式 |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| 单元测试 | **656 / 656 通过** | `bash test/run-all.sh` |
|
|
62
|
+
| 零依赖 CI | **PASS(5 项)** | `bash test/ci-zero-dep.sh` |
|
|
63
|
+
| 线上域服务 | **12/12 就绪** | `GET /cs-bots/api/status` |
|
|
64
|
+
| 线上页签结构 | 7 个页签 + 子视图,无独立待办页签 | 抓取实际下发的 client bundle |
|
|
65
|
+
| 线上 promote | 200,任务 `t-20` 已建(验证后已清理) | `POST /todos/promote` |
|
|
66
|
+
| 鉴权围栏 | 无会话 → 401,目录未创建 | `POST /fs/mkdir` |
|
|
67
|
+
| HTTP 端点 / 工具 / 服务 | 93 / 27 / 12 | 代码扫描 + `/status` |
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 四、设计资料清单
|
|
72
|
+
|
|
73
|
+
| 文件 | 内容 |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `docs/ARCHITECTURE.md` | **唯一架构真相源**:四层结构、三条原则、12 域服务、7 页签 IA、权限、实现模式、数据布局、验收口径 |
|
|
76
|
+
| `docs/adr/ADR-001-页签结构回到七页.md` | 页签收敛的决策记录(背景/分析/决策/后果/判据) |
|
|
77
|
+
| `docs/steps/step-01~04` | 每步存档:原架构复原 → 页签收敛与升级通道 → 资料成文 → 上线验证 |
|
|
78
|
+
| `README.md` | 对外说明:安装、27 个工具、7 页签、安全 |
|
|
79
|
+
| `docs/ANALYSIS-memory-evolve-parity.md` | 与记忆进化的能力对等分析(旧,保留) |
|
|
80
|
+
| `DESIGN-v2.md` | v2 详细设计(旧,保留;与 ARCHITECTURE.md 冲突时以后者为准) |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 五、以后新增功能的判据(写进架构文档,防止再长回去)
|
|
85
|
+
|
|
86
|
+
> 新能力若**没有独立生命周期**、**不需要多人/多 Bot 共同引用**、
|
|
87
|
+
> **不产生可点进去的详情** —— 就**不许新开页签**,只能做既有页签内的子视图。
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 六、遗留与建议
|
|
92
|
+
|
|
93
|
+
1. **发布**:`package.json` 已升 0.2.0。发布需经「插件发布管理员」角色,尚未执行。
|
|
94
|
+
2. **待办→任务的反向同步**:任务完成后暂不回写待办状态(单向)。需要的话下一步补。
|
|
95
|
+
3. **旧文档**:`DESIGN-v2.md` 与本文有重叠,建议后续合并进 `ARCHITECTURE.md` 后删除。
|