Initial commit: company-kb framework

- 完整的知识库框架(P0-P5 路线图)
- 12篇治理文档
- 工具脚本(kb-init.sh, kb-lint-fm.py, feishu-sync.py, kb-bot)
- 7个 Claude 命令
- 示例项目和测试项目(wanniu-l1)
- 契约文件(meta/kb-contract.yaml)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
yangqianqian
2026-07-16 18:24:39 +08:00
commit 84f7950589
60 changed files with 4410 additions and 0 deletions

View File

@@ -0,0 +1,119 @@
# 08 · 飞书双向前端方案(群机器人 + 呈现)
> 把飞书从「单向导出源」升级为「双向前端」:采集入口 + 查询入口 + 呈现面。
> 状态:方案待批 | 底座已验证lark-cli 已装(bot 身份 cli_a9458d254e3a5bc3),鉴权可用。
## 关键技术验证结论(已实测)
| 能力 | 命令 | 状态 |
|---|---|---|
| 发消息 | `lark-cli im +messages-send --chat-id oc_xxx --markdown "..."` | ✅ bot 可用 |
| 回复(thread) | `lark-cli im +messages-reply` | ✅ |
| **收群消息** | `lark-cli event +subscribe --event-types im.message.receive_v1 --compact` | ✅ **WebSocket 长连接,无需公网回调** |
| 找群 chat_id | `lark-cli im +chat-search --query "群名"` | ✅ |
| 多维表格 | `lark-cli api POST /open-apis/bitable/v1/apps/...`(通用 apiCLI 1.0.3 无 bitable 子命令但通用 api 通鉴权) | ✅ |
| 云文档 | `lark-doc-manager` skill已激活/ `lark-cli docs` | ✅ |
> **最大收获**:能问能答走**长连接**而非公网 HTTP 回调——省掉 VPS 上常驻 web 服务5 人团队负担骤降。
---
## 一、群机器人:能问能答
### 架构(长连接,无公网)
```
同事在飞书群 @机器人 "客户A为什么不用一口价"
↓ 飞书事件 (im.message.receive_v1)
lark-cli event +subscribe ── WebSocket 长连接 ──> 本地/VPS 常驻进程
↓ NDJSON 每行一事件,--compact 提取文本
kb-bot 调度器:解析 → 剥离 @ → 得到问题
调 CC 跑 /kb-ask基于知识库检索强制溯源无据报 Gap
lark-cli im +messages-reply ── 回复到原消息 thread
```
### 落地组件
- `tools/kb-bot/subscribe.sh` — 起长连接:`lark-cli event +subscribe --event-types im.message.receive_v1 --compact --output-dir ./events/`
- `tools/kb-bot/handle.py` — 消费事件:过滤 @机器人 的消息 → 抽问题 → 调 CC headless (`claude -p "/kb-ask <问题>"`) → 取答案 → `lark-cli im +messages-reply`
- 防重event 有 idempotencyhandle 记已处理 message_id。
- 铁律继承:答案强制带 source_link无据回「知识库暂无可 /kb-link 补充」,绝不编造。
### 部署MVP
- 跑在**一台常开机器**(你的 Mac mini / LA VPS 均可,长连接不挑落点)。
- MVP 用 shell + 轮询 events 目录起步;稳定后再包成 launchd/systemd 常驻。
- **不建公网服务、不开端口**——这是刻意的反过度工程。
---
## 二、飞书呈现架构:三层投影
**核心原则:飞书是「读屏」不是「数据库」。** 真相源永远是 Git 仓库,飞书上所有内容都是从 Git **单向投影**的镜像;同事在飞书上看/问,不在飞书上改知识(改走 Obsidian/Git。飞书怎么动都不污染真相源。
三层对应同事三种消费姿势:
```
┌─────────────────────────────────────────────────────┐
│ 第3层 群机器人(问) "客户A为什么不用一口价" │ 找答案·秒回
│ @机器人 → /kb-ask → 带溯源回复(实时,读 Git 真相源) │
├─────────────────────────────────────────────────────┤
│ 第2层 多维表格(查) 全库一张表,按项目/状态筛选/看板 │ 扫全局·俯瞰
│ 每页一行type/status/source/项目/source_link │
├─────────────────────────────────────────────────────┤
│ 第1层 云文档(读) 项目概览、决策来龙去脉 │ 读故事·了解
│ projects/*/_index + 关键 decision → 飞书文档 │
└─────────────────────────────────────────────────────┘
↑ 三层都从同一 Git 仓库单向投影,飞书只读
```
**为什么分三层**:同事需求本就分三种——「了解一个项目」读云文档、「俯瞰筛选全局」用多维表格、「要一个具体答案」问机器人。一层满足不了三种姿势。
**更新节奏(反过度工程)**MVP 第 1/2 层**不做实时同步**——录入后手动跑一次 `feishu-render`,或每天定时同步一次即可;第 3 层机器人是实时的(读 Git 真相源本身,不依赖投影)。
---
### 载体 A云文档第 1 层·叙事型呈现)
- 用途:项目概览、决策来龙去脉——适合「读故事」。
- 同步:`projects/<代号>/_index.md` + 关键 decision 页 → 飞书云文档。
- 工具:`tools/feishu-render.py --docs <代号>`,调 lark-doc-manager / `lark-cli docs +create/+update`
- 频率:按需/手动触发MVP 不做实时)。
### 载体 B多维表格 Bitable第 2 层·结构型呈现)
- 用途:全库总览——每条 decision/doc/conversation 一行,带 `type/status/source/created/项目/source_link` 字段,同事可**筛选/分组/看板/仪表盘**。这是「呈现全库」的主力。
- 同步:扫 `projects/**/*.md` frontmatter → 每页一条记录 → 通用 api 写入 Bitable。
- 工具:`tools/feishu-render.py --bitable`,用 `lark-cli api POST /open-apis/bitable/v1/apps/{app}/tables/{table}/records`
- 字段严格对齐 `meta/kb-contract.yaml`type/status enum 一致)。
- 频率:录入后增量 upsert按 source_link 或页路径做唯一键)。
> Wiki 空间**暂不做**(用户判断现阶段不适合)。
---
## 三、对既有架构的影响(需回改的文档)
1. `docs/04-架构.md` L4 呈现层:飞书从「只读呈现」补充为「双向」——采集(群机器人收/kb-link)、查询(群@问答)、呈现(云文档+Bitable)。**写路径仍唯一(Obsidian/Git)**,机器人问答不写库、只读。
2. `docs/04-架构.md` §4 双前端映射表:飞书行的「写」列注明——群机器人问答是**读**操作(调/kb-ask),不构成第二条写路径。
3. `docs/05-路线图.md`:群机器人 + 呈现属 **P2**(原 P2 只有 feishu-pull现扩为完整双向
4. `docs/07-AI-native工作流.md`:新增「循环 E · 飞书问答」——群 @ → /kb-ask → 回复,人机分工同查询循环。
5. 命令面:无新 /kb 命令(机器人内部调 /kb-ask但新增 `tools/kb-bot/``tools/feishu-render.py`
---
## 四、安全与凭据
- lark-cli 凭据由其自身管理(非本仓环境变量),**不入库**。
- 机器人问答**只读知识库**,不执行写/删——继承「AI 永不擅自有损操作」铁律。
- 群机器人回答带 source_link同事可核。
- 长连接进程日志不含敏感 token--quiet 抑制 stderr
---
## 五、分步实施顺序(建议)
1. **P2-a 发消息打通**`kb-bot` 先做「只发」——手动触发把一条测试答案发到群,验证 chat-id/markdown 渲染。
2. **P2-b 收消息打通**:起 `event +subscribe`@机器人能在 events/ 看到事件。
3. **P2-c 闭环**handle.py 串起「收→/kb-ask→回复」群里问答跑通。
4. **P2-d 呈现-Bitable**:建一张多维表,把 _example 项目的页同步成记录。
5. **P2-e 呈现-云文档**:把 _example 的 _index 同步成飞书文档。
每步独立可验收,任一步卡住不影响已完成步骤。