v0.9.9 基线版本

main
mula.liu 2026-08-19 18:05:22 +08:00
parent 4ef3c92d65
commit f92fff6546
85 changed files with 1655 additions and 920 deletions

View File

@ -1,6 +1,8 @@
# 部署配置更新日志 # 部署配置更新日志
## v1.0.1 (2024-12-23) > ⚠️ 版本对齐git 发布线当前为 v0.9.9(无 v1.0.x tag下列 v1.0.1 为早期文案占位。详见 SDD `docs/sdd/releases/`
## v1.0.1 (2024-12-23遗留占位)
### 🔧 配置变更 ### 🔧 配置变更

View File

@ -336,6 +336,6 @@ CREATE TABLE `operation_logs` (
--- ---
**文档版本**: v1.0 **文档版本**: v1.0(与代码版本 v0.9.9 的 git 基线无直接对应,见 SDD releases/
**最后更新**: 2023-12-20 **最后更新**: 2023-12-20
**维护人**: Mula.liu **维护人**: Mula.liu

View File

@ -316,7 +316,9 @@ find backend/logs -name "*.log" -mtime +30 -delete
## 📝 更新日志 ## 📝 更新日志
### v1.0.0 (2024-12-20) > ⚠️ 版本对齐git 发布线当前为 v0.9.9(无 v1.0.0 tag下列 v1.0.0 为早期文案占位。详见 SDD `docs/sdd/releases/`
### v1.0.0 (2024-12-20遗留占位)
- ✨ 完整的 Docker 部署方案 - ✨ 完整的 Docker 部署方案
- ✨ 一键初始化和升级 - ✨ 一键初始化和升级
- ✨ 数据库备份恢复 - ✨ 数据库备份恢复

View File

@ -231,7 +231,9 @@ npm run dev
## 🔄 版本历史 ## 🔄 版本历史
### v1.0.0 (2023-12-20) > ⚠️ 版本对齐git 发布线为 v0.9.1 → v0.9.2 → v0.9.6 → v0.9.7 → v0.9.8 → v0.9.9(当前基线,提交 `416ef48`),仓库未打 tag。下列 v1.0.0 为早期文案占位,与 git 不符;详见 SDD `docs/sdd/releases/`
### v1.0.0 (2023-12-20遗留占位见上方对齐说明)
- ✅ 完整的用户认证系统 - ✅ 完整的用户认证系统
- ✅ 项目管理功能 - ✅ 项目管理功能

View File

@ -12,7 +12,7 @@ class Settings(BaseSettings):
# 应用信息 # 应用信息
APP_NAME: str = "NEX Docus" APP_NAME: str = "NEX Docus"
APP_VERSION: str = "1.0.0" APP_VERSION: str = "0.9.9"
DEBUG: bool = True DEBUG: bool = True
# 服务器配置 # 服务器配置

View File

@ -1,370 +0,0 @@
# 文档目录 Docker 部署方案
## 问题描述
应用中 `/design` 路由通过 `fetch('/docs/...')` 加载项目根目录下 `docs/` 文件夹中的 Markdown 文档。在 Docker 容器中运行时,需要确保这些文档能够被访问。
## 解决方案Docker 卷挂载
采用 Docker 卷挂载方式,将宿主机的 `docs/` 目录直接映射到容器内,实现文档的实时更新和灵活管理。
### 配置方式
#### docker-compose.yml 配置
```yaml
version: '3.8'
services:
nex-design:
build:
context: .
dockerfile: Dockerfile
volumes:
- ./logs:/app/logs # 日志目录挂载
- ./docs:/app/dist/docs:ro # 文档目录挂载(只读)
```
**说明:**
- `./docs:/app/dist/docs` - 将宿主机当前目录的 `docs` 映射到容器的 `/app/dist/docs`
- `:ro` - 只读挂载,提高安全性,防止容器内进程修改文档
### 方案优势
**实时更新**
- 修改 MD 文件后立即生效
- 无需重新构建 Docker 镜像
- 无需重启容器
**方便维护**
- 在宿主机直接编辑文档
- 使用熟悉的编辑器和工具
- 支持版本控制
**轻量镜像**
- Docker 镜像不包含文档内容
- 镜像体积更小
- 构建速度更快
**灵活部署**
- 可以独立管理文档版本
- 支持多环境部署(开发、测试、生产使用不同文档)
- 易于更新和回滚
### 目录结构
**宿主机:**
```
nex-design/
├── docs/ # 文档源文件Git 管理)
│ ├── DESIGN_COOKBOOK.md
│ ├── components/
│ │ ├── PageTitleBar.md
│ │ ├── ListTable.md
│ │ └── ...
│ └── pages/
├── dist/ # 构建产物(容器内)
│ ├── index.html
│ └── assets/
└── docker-compose.yml
```
**容器内:**
```
/app/
├── dist/ # 应用构建产物
│ ├── index.html
│ ├── assets/
│ └── docs/ # 挂载点 → 宿主机 docs/
├── logs/ # 日志目录(挂载)
└── ecosystem.config.js # PM2 配置
```
### 使用流程
#### 1. 启动服务
```bash
# 第一次启动(构建镜像)
docker-compose up -d --build
# 后续启动(使用已有镜像)
docker-compose up -d
```
#### 2. 修改文档
```bash
# 在宿主机直接编辑文档
vim docs/DESIGN_COOKBOOK.md
# 或使用 VS Code 等编辑器
code docs/components/PageTitleBar.md
```
#### 3. 验证更新
```bash
# 文档修改后立即生效,无需任何操作
# 浏览器刷新即可看到最新内容
# 或使用 curl 验证
curl http://localhost:3000/docs/DESIGN_COOKBOOK.md
```
### 验证挂载
```bash
# 检查容器内的挂载情况
docker exec nex-design-app ls -la /app/dist/docs/
# 查看某个文档内容
docker exec nex-design-app cat /app/dist/docs/DESIGN_COOKBOOK.md
# 验证文件同步
# 在宿主机修改文件
echo "# Test" >> docs/test.md
# 立即在容器内查看
docker exec nex-design-app cat /app/dist/docs/test.md
```
### 部署注意事项
#### 1. 生产环境部署
**方式一:携带 docs 目录**
```bash
# 使用 git clone 或 scp 上传整个项目
git clone <repo> /path/to/deploy
cd /path/to/deploy
docker-compose up -d
```
**方式二:单独管理文档**
```bash
# 文档单独部署在某个目录
mkdir -p /var/www/nex-design-docs
# 上传文档到该目录
# 修改 docker-compose.yml
volumes:
- /var/www/nex-design-docs:/app/dist/docs:ro
```
#### 2. 权限管理
```bash
# 确保 docs 目录有正确的权限
chmod -R 755 docs/
# 只读挂载可防止容器内修改,但宿主机权限仍需控制
```
#### 3. 多环境配置
可以为不同环境创建不同的 docker-compose 文件:
```bash
# docker-compose.dev.yml - 开发环境
volumes:
- ./docs:/app/dist/docs:ro
# docker-compose.prod.yml - 生产环境
volumes:
- /var/www/docs:/app/dist/docs:ro
```
使用时指定配置文件:
```bash
docker-compose -f docker-compose.prod.yml up -d
```
### 故障排查
#### 问题 1文档无法加载
```bash
# 检查挂载是否成功
docker inspect nex-design-app | grep -A 10 Mounts
# 检查容器内文件
docker exec nex-design-app ls -la /app/dist/docs/
# 检查文件权限
ls -la docs/
```
#### 问题 2修改后未生效
```bash
# 确认使用的是卷挂载而不是 COPY
docker exec nex-design-app cat /app/dist/docs/DESIGN_COOKBOOK.md
# 检查浏览器缓存
# 使用 Ctrl+Shift+R 强制刷新
# 检查 serve 是否缓存了静态文件
docker-compose restart
```
#### 问题 3Windows 路径问题
Windows 下需要注意路径格式:
```yaml
# 错误
volumes:
- .\docs:/app/dist/docs:ro
# 正确
volumes:
- ./docs:/app/dist/docs:ro
```
### 性能考虑
#### 1. 卷挂载性能
- **Linux/macOS**: 性能很好,几乎无损耗
- **Windows/macOS + Docker Desktop**: 可能有轻微性能损耗
- **生产环境**: 使用 Linux 主机,性能最佳
#### 2. 优化建议
如果文档很多且访问频繁,可考虑:
1. **使用命名卷**
```yaml
volumes:
docs-data:
driver: local
driver_opts:
type: none
o: bind
device: /path/to/docs
services:
nex-design:
volumes:
- docs-data:/app/dist/docs:ro
```
2. **缓存策略**
在 Nginx 反向代理中添加缓存:
```nginx
location /docs/ {
proxy_pass http://nex_design;
proxy_cache_valid 200 10m;
add_header X-Cache-Status $upstream_cache_status;
}
```
## 替代方案对比
### 方案 A: 构建时复制(未采用)
```dockerfile
# Dockerfile
COPY docs /app/dist/docs
```
❌ 缺点:
- 修改文档需要重新构建镜像
- 镜像体积更大
- 更新流程复杂
✅ 优点:
- 镜像自包含
- 适合不常修改的场景
### 方案 B: prebuild 脚本(未采用)
```json
{
"scripts": {
"prebuild": "cp -r docs public/"
}
}
```
❌ 缺点:
- 需要重新构建才能更新
- 增加构建时间
- 文档和代码耦合
### 方案 C: 卷挂载(✅ 当前采用)
```yaml
volumes:
- ./docs:/app/dist/docs:ro
```
✅ 优点:
- 实时更新
- 灵活管理
- 镜像轻量
⚠️ 注意:
- 需要保持 docs 目录结构
- 部署时需要文档文件
## 最佳实践
### 1. 文档版本管理
```bash
# 使用 Git 管理文档版本
cd docs
git log DESIGN_COOKBOOK.md
# 回滚到特定版本
git checkout <commit-hash> DESIGN_COOKBOOK.md
```
### 2. 文档自动化部署
```bash
#!/bin/bash
# scripts/update-docs.sh
echo "更新文档..."
cd /path/to/nex-design
# 拉取最新文档
git pull origin main -- docs/
# 无需重启容器,文档即时生效
echo "文档已更新!"
```
### 3. 监控文档访问
可以在 Nginx 中记录文档访问日志:
```nginx
location /docs/ {
access_log /var/log/nginx/docs-access.log;
proxy_pass http://nex_design;
}
```
## 总结
使用 Docker 卷挂载方案是最灵活、最适合本项目的解决方案:
**实时更新** - 修改即生效
**简单维护** - 直接编辑文件
**轻量镜像** - 更快的构建和部署
**灵活部署** - 支持多种场景
**核心配置只需一行:**
```yaml
volumes:
- ./docs:/app/dist/docs:ro
```
## 相关文件
- `docker-compose.yml:16` - 卷挂载配置
- `DEPLOYMENT.md:14-35` - 部署文档说明
- `QUICKSTART.md` - 快速参考

View File

@ -1,297 +0,0 @@
# NexDocs MCP 使用文档
## 1. 方案说明
NexDocs 现在不再使用项目根目录下的独立 `mcp_server/`
当前方案为后端内集成 MCP
- 业务 REST API 继续走 `/api/v1/...`
- MCP 入口挂载在同一个 backend 服务上
- 传输协议为 `streamableHttp`
- MCP 地址为 `/mcp``/mcp/` 也兼容)
- 认证方式为 `X-Bot-Id` + `X-Bot-Secret`
这意味着:
- 不需要单独部署一套 MCP 服务
- 不需要让 MCP client 传业务账号密码
- 不需要让远程 agent 访问本地脚本进程
## 2. 接口地址
MCP 对外地址:
```text
http://<backend-host>:<backend-port>/mcp
```
例如:
```text
http://backend.internal:8000/mcp
```
说明:
- 推荐优先使用 `/mcp`
- `/mcp/` 也兼容
- 如果前面还有 Nginx/网关,请不要对 `/mcp``301`/`302` 重定向
- 未携带 bot 凭证时,访问 `/mcp``/mcp/` 都会返回 `401`
## 3. 认证模型
MCP client 只需要传两个 header
- `X-Bot-Id`
- `X-Bot-Secret`
后端会执行以下逻辑:
1. 根据 `X-Bot-Id` 查询 `mcp_bots`
2. 校验 `X-Bot-Secret`
3. 将该 bot 映射到 NexDocs 用户
4. 以该用户身份执行 MCP 工具
因此 client 不需要再传:
- NexDocs 用户名
- NexDocs 密码
- NexDocs access token
## 4. 用户如何获取凭证
每个用户可在个人中心管理自己的 MCP 凭证。
页面位置:
1. 登录 NexDocs
2. 打开个人中心
3. 进入 `MCP 接入` 标签页
可执行操作:
- 查看 `X-Bot-Id`
- 查看并复制 `X-Bot-Secret`
- 重新生成 `X-Bot-Secret`
后端接口:
- `GET /api/v1/auth/mcp-credentials`
- `POST /api/v1/auth/mcp-credentials/rotate-secret`
## 5. 当前支持的 MCP Tools
### 5.1 获取当前用户创建的项目列表
工具名:
```text
list_created_projects
```
参数:
- `keyword`: 可选,按项目名/描述过滤
- `limit`: 可选,默认 100
### 5.2 获取指定项目文件树
工具名:
```text
get_project_tree
```
参数:
- `project_id`: 必填
### 5.3 获取指定文件内容
工具名:
```text
get_file
```
参数:
- `project_id`: 必填
- `path`: 必填,项目内相对路径
### 5.4 在项目中创建新文件
工具名:
```text
create_file
```
参数:
- `project_id`: 必填
- `path`: 必填,项目内相对路径
- `content`: 可选,文件初始内容,默认空字符串
说明:
- 目标路径已存在时会报错
- 会自动创建缺失的上级目录
- 会校验项目写权限
- 写入 Markdown 文件时会更新搜索索引
- 会记录操作日志
- 会通知项目成员
### 5.5 修改指定文件
工具名:
```text
update_file
```
参数:
- `project_id`: 必填
- `path`: 必填,项目内相对路径
- `content`: 必填,新的文件内容
说明:
- 目标文件不存在时会报错
- 只允许更新文件,不允许更新目录
- 会校验项目写权限
- 写入 Markdown 文件时会更新搜索索引
- 会记录操作日志
- 会通知项目成员
### 5.6 删除指定文件
工具名:
```text
delete_file
```
参数:
- `project_id`: 必填
- `path`: 必填,项目内相对路径
说明:
- 目标文件不存在时会报错
- 只允许删除文件,不允许删除目录
- 删除 Markdown 文件时会同步删除搜索索引
- 会记录操作日志
- 会通知项目成员
## 6. 调用端配置示例
如果调用端内置的是 MCP client并支持 `streamableHttp`,可以这样配置:
```json
{
"tools": {
"mcpServers": {
"biz_mcp": {
"type": "streamableHttp",
"url": "http://backend.internal:8000/mcp",
"headers": {
"X-Bot-Id": "nexbot_xxxxxxxxxxxxxxxx",
"X-Bot-Secret": "nxbotsec_xxxxxxxxxxxxxxxxxxxxxxxx"
},
"toolTimeout": 60
}
}
}
}
```
注意:
- `url` 建议使用 `/mcp`
- `headers` 中不需要再放业务用户名密码
- `X-Bot-Secret` 只应发给受信任的调用端
- 如果客户端运行在浏览器环境,记得把对应站点加入后端 `CORS_ORIGINS`
## 7. 后端部署要求
### 7.1 Python 版本
后端运行环境需要 Python 3.12。
本地开发建议:
```bash
cd backend
/opt/homebrew/bin/python3.12 -m venv venv312
env -u HTTP_PROXY -u HTTPS_PROXY ./venv312/bin/pip install -r requirements.txt
./venv312/bin/uvicorn main:app --host 0.0.0.0 --port 8000
```
说明:
- 当前 backend 的 MCP 依赖要求 Python 3.10+
- 本项目已在本地按 Python 3.12 调试通过
### 7.2 Docker
`backend/Dockerfile` 已切换到 Python 3.12 基线。
### 7.3 数据表
`mcp_bots` 表需要存在。
如果你已经执行过建表脚本,这一步可以跳过。
相关文件:
- [create_mcp_bots_table.sql](/Users/jiliu/工作/projects/NexDocus/backend/scripts/create_mcp_bots_table.sql)
- [init_database.sql](/Users/jiliu/工作/projects/NexDocus/backend/scripts/init_database.sql)
## 8. 已验证结果
本地调试已验证:
- Python 3.12 环境可正常启动 backend
- `/health` 返回 `200`
- `/mcp``/mcp/` 均可访问
- 未传 `X-Bot-Id` / `X-Bot-Secret` 时返回 `401`
调试使用地址:
```text
http://127.0.0.1:8012/mcp
```
生产或测试环境请替换为你的 backend 实际域名或 IP。
## 9. 相关代码位置
- MCP 挂载入口:
[main.py](/Users/jiliu/工作/projects/NexDocus/backend/main.py)
- MCP 服务实现:
[server.py](/Users/jiliu/工作/projects/NexDocus/backend/app/mcp/server.py)
- MCP Bot 模型:
[mcp_bot.py](/Users/jiliu/工作/projects/NexDocus/backend/app/models/mcp_bot.py)
- 用户凭证管理接口:
[auth.py](/Users/jiliu/工作/projects/NexDocus/backend/app/api/v1/auth.py)
- 个人中心凭证管理页面:
[ProfilePage.jsx](/Users/jiliu/工作/projects/NexDocus/frontend/src/pages/Profile/ProfilePage.jsx)

View File

@ -1,61 +0,0 @@
# 文档迁移说明
## 📦 按钮扩展组件文档已迁移
`docs/` 目录下的按钮扩展相关文档已整合并迁移至:
**新位置:** `src/components/docs/ButtonExtensions.md`
---
## 🗂️ 迁移的文档
以下文档已整合到新文档中:
| 原文档 | 状态 |
|--------|------|
| ~~ButtonHelpDesign.md~~ | ✅ 已整合 |
| ~~ButtonDesignFixes.md~~ | ✅ 已整合 |
| ~~ButtonDesignUpdate.md~~ | ✅ 已整合 |
| ~~ButtonDesignLatestFixes.md~~ | ✅ 已整合 |
| ~~ActionHelpPanelFix.md~~ | ✅ 已整合 |
---
## 📖 新文档包含
- ✅ 5种设计方案完整说明
- ✅ 所有组件的API文档
- ✅ 详细的使用指南和示例
- ✅ 最佳实践和性能优化建议
- ✅ 完整的更新日志和变更记录
---
## 🔗 快速链接
- **文档路径:** `/src/components/docs/ButtonExtensions.md`
- **在线演示:** http://localhost:5173/design/button-designs
- **菜单路径:** 组件设计 → 扩展按钮
---
## 📅 迁移时间
**2025-11-17** - 所有文档已完成整合
---
## 💡 文档组织原则
今后组件文档将遵循以下原则:
1. **统一位置** - 所有组件文档放在 `src/components/docs/`
2. **就近原则** - 文档与组件代码保持近距离
3. **单一文档** - 同一功能的文档整合到一个文件
4. **版本控制** - 使用版本号和更新日志记录变更
这样可以:
- ✅ 更容易找到和维护文档
- ✅ 避免文档分散和重复
- ✅ 与代码保持同步更新

View File

@ -1,184 +0,0 @@
# NexDocs v0.9.6 升级日志
## 版本信息
- 版本号:`v0.9.6`
- 更新时间:`2026-03-11`
## 本次升级摘要
`v0.9.6` 主要完成了以下升级:
1. 新增后端内集成的 MCP Server 能力
2. 新增用户级 MCP 凭证管理
3. 打通通过 Nginx 统一入口访问 MCP
4. 调整部署运行环境到 Python 3.12
5. 将 MySQL、Redis 数据目录改为项目根目录 `storage/` 持久化
6. 优化个人中心与文档页面部分交互体验
## 功能升级
### 1. MCP Server 内集成
系统已支持直接在 backend 中提供 MCP `streamableHttp` 服务,不再依赖项目根目录下的独立 `mcp_server/` 进程。
当前 MCP 入口:
```text
/mcp
```
当前支持的工具:
1. `list_created_projects`:列出当前用户的项目
2. `get_project_tree`:列出项目文件树结构
3. `get_file`:获取指定文件
4. `create_file`:在项目中创建新文件
5. `update_file`:修改指定文件
6. `delete_file`:删除指定文件
### 2. MCP 认证与用户凭证管理
新增基于 `X-Bot-Id``X-Bot-Secret` 的 MCP 认证模型。
能力包括:
- 每个用户可拥有自己的 MCP 凭证
- 通过数据库表 `mcp_bots` 维护 bot 与用户的映射
- 支持在个人中心查看和重新生成凭证
- 服务端自动按凭证映射到对应 NexDocs 用户身份执行工具
相关接口:
- `GET /api/v1/auth/mcp-credentials`
- `POST /api/v1/auth/mcp-credentials/rotate-secret`
### 3. Nginx 统一入口支持 MCP
前端 Nginx 已新增 `/mcp``/mcp/` 兼容的反向代理配置。
现在在只暴露一个公网入口端口的部署模式下,可以通过统一入口访问:
```text
http(s)://<host>/mcp
```
不再要求调用端直连 backend 容器端口。
## 前端与交互优化
### 1. 个人中心布局调整
个人中心由上下结构调整为左右结构:
- 左侧为纵向导航
- 右侧为内容区域
- 移动端会自动回退为上下布局
### 2. 文档浏览/编辑切换优化
本轮已对项目文档页做过一组交互统一:
- 浏览/编辑模式切换样式统一
- 页面头部高度与操作区对齐
- 切换时保留当前文件上下文
- 登录跳转回原目标页的逻辑补齐
### 3. 认证异常提示优化
对未登录和 token 失效场景做了重复错误提示抑制:
- 避免并发请求弹出多条重复 Toast
- 统一 401 处理与跳转逻辑
## 部署与运行环境变更
### 1. Python 运行环境升级
backend 运行环境已调整为:
```text
Python 3.12
```
原因:
- MCP Python SDK 需要 Python 3.10+
- 当前版本已按 Python 3.12 完成调试与验证
### 2. Docker 构建链调整
backend Docker 镜像构建已做以下处理:
- 基础镜像切换为 `python:3.12-slim`
- 增加 pip 构建工具升级
- pip 安装支持国内源失败后回退官方源
- Nginx 已补充 `/mcp``/mcp/` 兼容代理配置
### 3. 数据持久化目录调整
本次升级将 MySQL、Redis 的数据目录改为挂载到项目根目录下的 `storage/`
```text
storage/
├── mysql/
├── redis/
├── projects/
└── temp/
```
当前挂载关系:
- `storage/mysql -> /var/lib/mysql`
- `storage/redis -> /data`
- `storage -> /data/nex_docus_store`
这样做的目的:
- 宿主机可直接看到数据库与缓存数据目录
- 便于整体备份
- 避免数据只留在 Docker named volume 中
## 升级迁移注意事项
### 1. MCP 调用地址调整
如果原先通过 backend 端口直连 MCP可以继续使用。
如果当前部署是通过前端 Nginx 暴露统一入口,推荐改为:
```text
http(s)://<host>/mcp
```
调用头保持不变:
- `X-Bot-Id`
- `X-Bot-Secret`
### 部署与文档
- [docker-compose.yml](/Users/jiliu/工作/projects/NexDocus/docker-compose.yml)
- [MCP_HTTP_INTEGRATION.md](/Users/jiliu/工作/projects/NexDocus/docs/MCP_HTTP_INTEGRATION.md)
## 升级建议
建议升级到 `v0.9.6` 后按以下顺序验证:
1. 验证 backend `/health` 是否正常
2. 验证统一入口 `/api/`、`/mcp` 与 `/mcp/` 是否可访问
3. 验证 MCP client 是否能正常完成 `initialize`
4. 验证个人中心的 MCP 凭证展示与轮换功能

79
docs/sdd/README.md 100644
View File

@ -0,0 +1,79 @@
# NEX Docus 规格驱动开发SDD中心
本目录是 NEX Docus **规格驱动的开发中心**Spec-Driven Development。它把「产品意图 → 架构决策 → 功能规格 → 实施任务 → 验证证据」放进同一条可追踪链路,并作为团队讨论、开发与验收的**唯一真相源single source of truth**。
## 文档结构
```text
docs/sdd/
├── README.md # 入口、状态与工作流(本文件)
├── governance.md # 编号、审批、变更与追踪规则
├── archive.md # 遗留文档归档说明(整合/弃置追踪)
├── product/
│ ├── vision.md # 产品愿景、用户与边界
│ ├── principles.md # 产品与工程原则
│ └── roadmap.md # 阶段性路线图
├── architecture/
│ ├── overview.md # 当前架构方向与系统边界
│ ├── constraints.md # 已知约束与待决事项
│ ├── standards/
│ │ ├── README.md # 代码结构规范索引
│ │ ├── code-structure-standards.md # 代码结构规范(整合自 docs/
│ │ └── code-structure-audit-2026-04-08.md # 结构审计记录(整合自 docs/
│ └── decisions/
│ ├── README.md # ADR 索引与规则
│ └── ADR-0001-*.md # 持久架构决策(逐条一文件)
├── integrations/
│ ├── mcp.md # MCP Streamable HTTP 接入(含详细使用文档)
│ └── git.md # 项目 Git 仓库集成
├── releases/
│ ├── README.md # 公开版本与资产索引
│ ├── v0.9.6.md # v0.9.6 历史升级记录(整合自 docs/
│ └── v0.9.9.md # 当前基线发布(对齐 git
└── specs/
├── README.md # 功能规格索引
├── _template/ # 新规格模板
└── DV-NNNN-short-name/ # 一个功能或变更单元spec/design/tasks/verification
```
## 当前状态Status
- **SDD 文档状态**基线Baseline· 对齐 git 当前版本 v0.9.9
- **适用代码基线**当前仓库backend + frontend + docker-compose 部署)
- **规格覆盖**11 个功能单元DV-0001 ~ DV-0011价值主张 PO-1~5架构决策 ADR-0001~0008
- **已知整改项**:见 governance「开放问题」与各规格 tasks.md 中的“待整改/待决”标记(如敏感日志脱敏 TS-12、Compose v2 官方化 TS-13
- **版本基线**:以 git 为准(当前 v0.9.9;见 releases/README.md 与 v0.9.9.md 版本对齐说明;代码字段 1.0.0 为遗留占位)
## 如何使用本中心(工作流)
### 读者
| 角色 | 入口 |
| --- | --- |
| 产品/方案 | `product/vision.md`、`product/roadmap.md` |
| 架构评审 | `architecture/overview.md`、`architecture/standards/README.md`、`architecture/decisions/README.md` |
| 功能负责人 | `specs/README.md` → 对应 `DV-NNNN/spec.md` |
| 开发 | `DV-NNNN/design.md` + `tasks.md` |
| 测试/验收 | `DV-NNNN/verification.md` |
| 发布 | `releases/README.md` |
| 遗留文档去向 | `archive.md` |
### 作者(新增/改功能)
1. 在 `governance.md` 读取编号规则申请下一个规格编号DV-NNNN与 ADR 编号。
2. 复制 `specs/_template/``specs/DV-NNNN-short-name/`,先写 `spec.md`(为什么、做什么)。
3. 评审通过后写 `design.md`;实现过程中维护 `tasks.md` 勾选切片。
4. 完成后在 `verification.md` 登记验收证据,并回填 `specs/README.md` 索引。
5. 涉及跨文件刚性承诺ADR变更的`architecture/decisions` 审批。
### 最小变更bug 修复)
- 若属于既有 DV 规格范围:直接在该单元 `tasks.md` 追加切片并更新 `verification.md`
- 若超出所有现有范围:新建 DV 规格。
## 与外部文档的关系
SDD 中心**汇总并指向**仓库既有的详细材料,而非重复复制全部内容:
- 数据库细节 → 仓库根 `DATABASE.md`SDD 只保留 ER 概览与规格化的链路表)
- 部署运维 → `DEPLOY.md`、`README_DOCKER.md`、`CHANGELOG_DEPLOY.md`(及已并入的 docs/DOCKER_DOCS_SETUP 历史,见 archive.md
- 历史变更 → `docs/UPGRADE_v0.9.6.md`、`docs/MIGRATION.md`(已整合/弃置,见 archive.md
- 结构规范 → `architecture/standards/`(原 docs/code-structure-* 已迁入)
> 本中心是入口与追踪层;具体逐表 DDL、逐配置项说明等细节仍以被指向的源文档为准。

View File

@ -0,0 +1,30 @@
# 约束与待决事项Constraints & Open Points
## 技术约束(当前代码库既定)
1. **Python 3.12 + FastAPI 0.109**:异步栈;`requirements.txt` 固定大部分版本。
2. **SQLAlchemy 2.0async+ aiomysql**;同步连接供 Alembic 风格脚本pymysql
3. **MySQL 5.7.5+ / 生产镜像 MySQL 8.0**utf8mb4。
4. **Redis**Token 缓存、会话状态、通知等。
5. **JWT**python-jose HS256+ **bcrypt**passlib
6. **前端 React 18 + Vite 5 + Ant Design 5 + Tailwind + Zustand**;路由 React Router v6。
7. **Whoosh3**(全文)+ **ZVec**(向量)+ **jieba**(中文分词)。
8. **WeasyPrint**PDF 导出)、**pdfjs-dist/react-pdf**(前端 PDF 预览)、**react-virtuoso/react-window**(虚拟列表)。
9. **部署**Docker Compose v2 + Engine ≥ 25ADR-0008
## 约束来源
- 依赖锁定:`backend/requirements.txt`、`frontend/package.json`。
- 配置默认:`backend/app/core/config.py`、`.env.example`、`docker-compose.yml`。
## 待决事项Open Points
| 编号 | 事项 | 现状 | 建议 |
| --- | --- | --- | --- |
| OP-1 | Alembic vs 幂等 ALTER | 采用幂等 ALTER`migrations.py` | 评估引入 Alembic 以支撑大规模结构变更 |
| OP-2 | 敏感日志 | `security.py`/`deps.py` 记录 SECRET_KEY 前缀/JWT 载荷 | 脱敏,见 OI-1 |
| OP-3 | Compose v2 官方化 | deploy.sh 探测 v2 但根文档仍提及 v1 | 统一 v2 路径,见 OI-2 |
| OP-4 | 测试覆盖 | 仅 3 个后端单测 | 增加集成/E2E见 OI-3 |
| OP-5 | 实时协同编辑 | 明确不在此版本做vision 边界) | 另立项评估 OT/CRDT |
| OP-6 | 多实例/高可用 | 单机部署无状态服务仅后端Redis/DB 独立) | 若需要再评估 |
## 约束的规格化引用
- 以上条目若成为刚性承诺,须固化为 ADR 并登记到 `decisions/README.md`

View File

@ -0,0 +1,18 @@
# ADR-0001混合架构「DB 权限 + FS 内容」
- **状态**Accepted
- **日期**:对应仓库基线
## 背景
需要平衡权限管理的可控性与内容数据的可迁移/透明性。
## 决策
结构化元数据(用户/项目/权限/菜单/日志/向量状态等)存 MySQL文档内容、图片、附件以原生文件存于服务器磁盘`STORAGE_ROOT` 下 `projects/<storage_key>`)。
## 后果
- 正向:文件即真理,备份/迁移只需拷贝目录 + 导出 DB。
- 代价:需要自行实现严格的路径安全校验(见 DV-0002 / NFR-3
## 关联
PO-1, PO-2, PO-3DV-0002NFR-3。

View File

@ -0,0 +1,17 @@
# ADR-0002磁盘目录用 UUIDstorage_key映射
- **状态**Accepted
## 背景
中文文件名、重名项目在文件系统层面易出乱码与冲突。
## 决策
磁盘文件夹名使用 `storage_key`UUID36 字符),数据库 `projects.storage_key` 保存映射;对外展示名 `projects.name` 与磁盘名解耦。
## 后果
- 展示名可随时改,磁盘标识不变。
- 资源路径以 uuid 为根,天然隔离且无中文。
## 关联
DV-0002。

View File

@ -0,0 +1,15 @@
# ADR-0003技术栈选型
- **状态**Accepted
## 决策
- **后端**Python 3.12 + FastAPI异步+ SQLAlchemy 2.0async+ aiomysql/PyMySQL + Redisaioredis+ JWTpython-jose/bcrypt+ Uvicorn。
- **前端**React 18 + Vite 5 + Ant Design 5 + Tailwind + Zustand + React Router v6Markdown bytemdPDF pdfjs-dist/react-pdf虚拟列表 react-virtuoso/react-window。
- **搜索/向量**Whoosh3 + jieba全文ZVec + 可配置 embedding语义
## 后果
依赖锁定在 `requirements.txt``package.json`;更换组件须评审。
## 关联
全部 DV。

View File

@ -0,0 +1,18 @@
# ADR-0004全文Whoosh+ 语义ZVec双检索引擎
- **状态**Accepted
## 背景
既需要全文关键词检索,又需要语义向量检索支撑 RAG。
## 决策
1. 全文检索Whoosh3 本地索引(`search_index`),中文自定义 `ChineseAnalyzer`(基于 jieba
2. 语义向量ZVec 本地向量库(`vector_index`,每项目一个 collection+ 可配置 embedding 模型LLMModelConfig 的 `model_type=embedding`)。
## 后果
- 两套索引需在文件变更时同步维护ADR-0006
- 向量维度变更时需重建 collection 并全量重向量化。
## 关联
DV-0005, DV-0006, DV-0007。

View File

@ -0,0 +1,15 @@
# ADR-0005RAG 答案可溯源(编号引用 + 支撑句对齐)
- **状态**Accepted
## 决策
- 每条知识使用必须紧跟 `[n]` 编号引用。
- 采用“答案论断句 ↔ 原文候选句”向量对齐(`align_citation_quotes`),为每次 `[n]` 出现回填支撑句(`quote_occurrences`)。
- 同文件多个分块命中在展示层合并为同一 `citation_id` 并重新编号(`_canonicalize_message_citations`)。
## 后果
- 提升可验证性,但依赖 embedding 可用对齐失败时降级为不返回支撑句NFR-10
## 关联
DV-0007, DV-0011。

View File

@ -0,0 +1,17 @@
# ADR-0006写路径异步索引同步
- **状态**Accepted
## 背景
文件变更(创建/修改/删除/移动)需同步维护向量索引与全文索引,但不能阻塞主请求线程。
## 决策
文件操作经 `ProjectFileService``FileVectorSyncService`(独立 DB 会话、按项目串行、后台 `asyncio.Task`)触发 ZVec 重向量化/删除;全文索引经 `search_service` 同步更新。整项目向量化走 `ProjectVectorizationTaskService`(后台任务 + 进度表)。
## 后果
- 写请求返回快,索引最终一致。
- 需处理并发同一项目的串行化与任务去重。
## 关联
DV-0002, DV-0006, DV-0010。

View File

@ -0,0 +1,17 @@
# ADR-0007轻量幂等数据库迁移非破坏性
- **状态**Accepted
## 背景
项目未引入 Alembic 可执行迁移链。
## 决策
启动时lifespan执行 `migrate_schema()`:查询 `information_schema` 判断列是否存在,仅对缺失列执行幂等 `ALTER TABLE`。只做“新增列”这类非破坏性变更。
## 后果
- 多实例/重复启动安全。
- 大规模结构变更缺少回放/回滚(见 OP-1 / OI-4
## 关联
DV-0010, NFR-7。

View File

@ -0,0 +1,15 @@
# ADR-0008部署仅支持 Docker Compose v2 + Engine ≥ 25
- **状态**Accepted
- **触发背景**:服务器上旧版 docker-compose v1Python 实现)在 Docker Engine 25+ 上因读取 `ContainerConfig` 字段崩溃(`KeyError: 'ContainerConfig'`)。
## 决策
仅支持 **Docker Compose v2**`docker compose` 子命令)部署;弃用 v1。`deploy.sh` 中 `get_compose_cmd` 优先探测 v2回退 v1 仅作兼容提示。
## 后果
- 升级路径:安装 `docker-compose-plugin`v2并卸载 v1 后即可用 `./deploy.sh upgrade``docker compose up -d --build`
- `docker-compose.yml` 顶部 `version:` 仅产生弃用警告,不影响功能。
## 关联
NFR-6, OI-2部署细节见 `DEPLOY.md`、`README_DOCKER.md`。

View File

@ -0,0 +1,23 @@
# ADR 索引与规则Architecture Decision Records
## 规则
- 每个持久架构决策一个文件:`ADR-NNNN-简短名称.md`。
- 内容固定:**背景 / 决策 / 后果 / 状态 / 关联规格**。
- 状态:`Proposed → Accepted → Deprecated / Superseded by ADR-NNNN`。
- 变更已 Accepted 的 ADR 须走 governance 审批矩阵。
## 索引
| ADR | 标题 | 状态 | 关联规格 |
| --- | --- | --- | --- |
| [ADR-0001](ADR-0001-hybrid-storage.md) | 混合架构DB 权限 + FS 内容 | Accepted | PO-1/2/3, DV-0002 |
| [ADR-0002](ADR-0002-uuid-storage-key.md) | 磁盘目录用 UUIDstorage_key映射 | Accepted | DV-0002 |
| [ADR-0003](ADR-0003-tech-stack.md) | 技术栈选型FastAPI/React/SQLAlchemy/Redis/JWT | Accepted | 全部 DV |
| [ADR-0004](ADR-0004-dual-search-engine.md) | 全文Whoosh+ 语义ZVec双检索引擎 | Accepted | DV-0005/0006/0007 |
| [ADR-0005](ADR-0005-rag-citations.md) | RAG 答案可溯源:编号引用 + 支撑句对齐 | Accepted | DV-0007/0011 |
| [ADR-0006](ADR-0006-async-index-sync.md) | 写路径异步索引同步(后台任务) | Accepted | DV-0002/0006/0010 |
| [ADR-0007](ADR-0007-idempotent-migrations.md) | 轻量幂等数据库迁移(非 Alembic | Accepted | DV-0010, NFR-7 |
| [ADR-0008](ADR-0008-compose-v2.md) | 部署仅支持 Docker Compose v2 + Engine ≥ 25 | Accepted | NFR-6, DV-0000(部署) |
> 注DV-0000 为「部署/环境」逻辑单元,对应 NFR-6/ADR-0008不生成独立功能规格文件仅作追踪占位。

View File

@ -0,0 +1,42 @@
# 架构概览Overview
## 系统定位
NEX Docus 是**单机可部署**的团队文档平台,后端 FastAPI 单体 + 前端 React SPA + MySQL + Redis + 本地文件系统 + 本地检索/向量引擎,全部由 docker-compose 编排为同网段容器。
## 逻辑架构
```mermaid
graph TD
Client[React SPA] -->|JSON/HTTP| API[FastAPI Backend :8000]
Agent[External Agent] -->|MCP streamableHttp| API
API --> DB[(MySQL)]
API --> RD[(Redis)]
API --> FS[文件系统 STORAGE_ROOT/projects/<uuid>]
API --> WH[Whoosh 全文索引 search_index]
API --> ZV[ZVec 向量库 vector_index/<project_id>]
API --> LLM[LLM Provider: chat/embedding]
FS -->|变更同步| SVC[FileVectorSyncService → ZVec / SearchService]
```
## 三层结构(物理/逻辑/应用映射)
| 层 | 载体 | 说明 |
| --- | --- | --- |
| 应用层 | FastAPI/api/v1 + /mcp+ React SPA | 业务 API 与前端 |
| 数据层 | MySQL元数据/权限/状态、RedisToken/会话、文件系统内容、Whoosh/ZVec索引 | 结构化 vs 非结构化分离 |
| 基础设施 | docker-composebackend/frontend/mysql/redis、nginxfrontend 内) | 容器化部署 |
## 关键子系统
1. **认证**JWT Bearer + Redis Token 缓存双校验(见 DV-0001
2. **权限**RBACroles/system_menus/role_menus+ 项目级角色admin/editor/viewer双维度DV-0002/0004
3. **文件系统**`StorageService` 统一封装含路径安全校验DV-0002
4. **检索**Whoosh 全文DV-0005+ ZVec 语义DV-0006双引擎写路径后台同步ADR-08
5. **知识库**RAG 检索 + LLM 生成 + 引用支撑句对齐DV-0007
6. **开放**MCP Streamable HTTP/mcpbot 凭据映射到用户DV-0011
## 系统边界
- 进程内单后端REST 与 MCP 同挂一个 service。
- 存储边界:内容永不进 DB BLOBDB 只存元数据。
- 网络边界:前端经 nginx 反代 /api可同域免跨域/mcp 不可 301/302 重定向MCP 客户端要求)。

View File

@ -0,0 +1,10 @@
# 代码结构规范Standards
本目录整合了仓库既有的**代码结构设计规范**与其落地审计记录。
| 文件 | 类型 | 说明 |
| --- | --- | --- |
| [code-structure-standards.md](code-structure-standards.md) | 规范(强制执行) | 通用代码结构边界、分层模型、前端/后端/CLI 规范、审计清单 |
| [code-structure-audit-2026-04-08.md](code-structure-audit-2026-04-08.md) | 审计记录 | 2026-04-08 前后端结构审计与已落地优化项 |
> 来源:原 `docs/code-structure-standards.md`、`docs/code-structure-audit-2026-04-08.md`,于 SDD 整合时迁入。

View File

@ -0,0 +1,33 @@
# 遗留文档归档说明Archive / Disposition
> 本文件记录项目根目录 `docs/` 下**遗留文档的处置结果**,作为整合与删除的追踪依据。原文件删除后,此文件保留其去向,保证可追溯。
## 处置汇总
| 原文件 | 评估 | 处置 | 落点 |
| --- | --- | --- | --- |
| `docs/code-structure-standards.md` | 现行、长期有效的工程规范 | **整合**(全量保留) | `architecture/standards/code-structure-standards.md` |
| `docs/code-structure-audit-2026-04-08.md` | 历史审计记录,有参考价值 | **整合**(全量保留) | `architecture/standards/code-structure-audit-2026-04-08.md` |
| `docs/MCP_HTTP_INTEGRATION.md` | 现行 MCP 使用文档,内容详实 | **合并**(内容并入,超集) | `integrations/mcp.md` |
| `docs/UPGRADE_v0.9.6.md` | 历史发布记录(多已吸收为基线) | **整合**为发布记录 | `releases/v0.9.6.md` |
| `docs/MIGRATION.md` | **过时**:指向已不存在的按钮文档/`/design` 路由 | **弃置**(归档说明,不保留实质内容) | 本文件 |
| `docs/DOCKER_DOCS_SETUP.md` | **过时**`/design` 文档功能已不在代码中,当前 compose 无 `./docs` 挂载 | **弃置**(归档说明,不保留实质内容) | 本文件 |
## 弃置内容说明
### `docs/MIGRATION.md`(弃置)
该文档描述「按钮扩展组件文档整合方案」,指向 `src/components/docs/ButtonExtensions.md``/design/button-designs` 路由。经核查:
- `frontend/src` 中无对应消费者,`docsMenuData.json` 引用的 `/docs/*.md` 文件在仓库中不存在;
- `/design` 相关文档功能已不在当前代码中;
- 故判定为**过时遗留**,实质内容不再保留。
### `docs/DOCKER_DOCS_SETUP.md`(弃置)
该文档描述「将 `./docs` 卷挂载到容器 `/app/dist/docs` 以服务设计文档」。经核查:
- 当前 `docker-compose.yml` 仅挂载 `./storage`、`./backend/logs`(及 mysql/redis storage**无 `./docs` 挂载**
- `/docs/*.md` 设计文档文件与消费方在当前仓库中不存在;
- 涉及的 `nex-design`、`/design`、PM2/ecosystem 等描述与当前项目结构不符;
- 故判定为**过时遗留**,实质内容不再保留。
## 相关提示
- 若未来重新引入「程序内文档中心」能力,须先在 SDD 登记规格DV/FR再落地避免再次产生无人消费的遗留文档。
- 敏感内容(如默认口令、历史地址)仅保留在相应发布/部署文档的历史上下文中,不鼓励据此推断现状。

View File

@ -0,0 +1,72 @@
# SDD 治理规则Governance
本文件定义 NEX Docus SDD 中心的**编号、审批、变更与追踪**规则,保证「产品意图 → 架构决策 → 功能规格 → 实施任务 → 验证证据」始终处于同一条可追踪链路。
## 1. 编号体系
| 前缀 | 含义 | 格式 | 范围 |
| --- | --- | --- | --- |
| PO | Product Outcome价值主张 | PO-N | 稳态常量,变更需评审 |
| ADR | Architecture Decision Record | ADR-NNNN | 持久架构决策,一决策一文件 |
| NFR | Non-Functional Requirement | NFR-N | 非功能需求,依附规格 |
| FR | Functional Requirement | FR-N | 功能需求,依附 DV 规格 |
| DV | Delivered Value功能/变更单元) | DV-NNNN-shot-name | 一个功能或变更单元 |
| TS | Task实施切片 | TS-N | 实施任务,从属于 DV |
| VER | Verification验证证据 | VER-N | 验收证据,从属于 DV |
编号由 sdd 维护人统一分配;申请人不得自行占用 DV/ADR 编号。
## 2. 文档生命周期
```text
草稿(Draft) → 评审(Review) → 批准(Approved) → 已实现(Implemented) → 已验收(Verified) → 归档(Archived)
```
- **Draft**spec.md 初稿,仅供讨论。
- **Review**:进入评审;架构影响大的须同时评审 ADR。
- **Approved**:批准为规格基线,可据此实现。
- **Implemented**tasks.md 所有切片完成。
- **Verified**verification.md 证据齐全且通过。
- **Archived**:功能下线/重构,移入归档,不再作为基线。
## 3. 审批矩阵
| 变更类型 | 需审批方 | 说明 |
| --- | --- | --- |
| 新增/修改 PO | 产品负责人 | 价值主张变化 |
| 新增/修改 ADR | 架构负责人 + 技术负责人 | 跨文件刚性承诺 |
| 新增 DV 规格 | 功能负责人 + 架构评审(涉架构时) | 新功能入口 |
| 修改已批准 spec/design | 相应 DV 负责人 | 变更影响追踪 |
| 只改 tasks/verification | DV 负责人 | 实施与验收细节 |
| 发布 | 发布负责人 | 见 releases/ |
## 4. 追踪规则Traceability
- **强制反向可追踪**每一条实施切片TS必须引用一个或多个规格FR/ADR/NFR每一条验收证据VER必须引用其证明的规格与任务。
- **双向矩阵**`specs/README.md` 维护「规格 ↔ 任务 ↔ 证据」索引;`architecture/decisions/README.md` 维护「ADR ↔ 规格」映射。
- **变更即更新**:任何 spec/design 改动或布局改动,须同步更新关联的 tasks 与 verification保持链路不断签。
- **孤儿项处理**:新增代码若无规格/任务支撑,属「未登记变更」,应在当次 SDD 评审中补登记或回滚。
## 5. 变更工作流
1. 在本中心提出变更(写明受影响 DV/ADR/NFR
2. 按审批矩阵过审。
3. 更新对应 spec/design/tasks/verification。
4. 回填索引specs/README、decisions/README
5. 若变更跨越发布边界,登记到 releases/。
## 6. 当前开放问题Open Items
| 编号 | 类型 | 内容 | 关联 | 状态 |
| --- | --- | --- | --- | --- |
| OI-1 | 安全 | `security.py`/`deps.py` 存在 SECRET_KEY 前缀、JWT 载荷、token 前缀等敏感日志,需脱敏 | NFR-9, DV-0001/TS-12 | 待整改 |
| OI-2 | 部署 | 统一官方化 Docker Compose v2 部署路径(升级 compose-plugin、移除外层 v1 工具链依赖/说明) | NFR-6, ADR-0008 | 待整改 |
| OI-3 | 测试 | 后端测试仅覆盖引用/模型配置/检索三处,缺集成与 E2E 测试 | DV-* verification | 待增强 |
| OI-4 | 迁移 | 未引入 Alembic迁移依赖幂等 ALTER大规模结构变更缺少回放/回滚机制 | ADR-000?(见 ADR-07 | 已记录,待评估 |
## 7. 维护约定
- 本目录变更遵循「小步提交」:一次合并只动一个逻辑单元。
- 每个新建 DV 单元必须包含完整的四文件spec/design/tasks/verification缺一不可。
- 每次功能合并,默认要求补齐对应 verification 证据或明确标注“将由 OI-3 覆盖”。

View File

@ -0,0 +1,18 @@
# 集成:项目 Git 仓库DV-0010 支撑)
## 能力
- 项目可绑定 Git 仓库(`project_git_repos`name、repo_url、branch、username、token、is_default
- 支持 `git pull` / `git push`
## 接口
- `GET/POST /api/v1/projects/{id}/git-repos`
- `PUT/DELETE /api/v1/projects/{id}/git-repos/{repo_id}`
- `POST /api/v1/projects/{id}/git/pull`
- `POST /api/v1/projects/{id}/git/push`
## 安全
- 凭据token/密码)以字段存储于 `project_git_repos.token`;注意避免日志泄露(关联 OI-1/NFR-9 敏感信息治理)。
## 关联
DV-0010, ADR-0006文件系统与外部仓库的边界分享/同步策略见具体实现)。

View File

@ -0,0 +1,121 @@
# 集成MCP Streamable HTTPDV-0011 支撑)
> 本页为 MCP 接入的规格化工作说明,**整合自原 `docs/MCP_HTTP_INTEGRATION.md`(已并入)** 与 DV-0011 规格。实现代码:`backend/app/mcp/server.py`、`backend/app/mcp/context.py`、`backend/app/models/mcp_bot.py`。
## 1. 方案说明(决策摘要)
- 不再使用项目根目录独立 `mcp_server/`;改为**后端内集成**。
- 业务 REST API 继续走 `/api/v1/...`MCP 入口挂载在同一个 backend 服务上。
- 传输协议:`streamableHttp`MCP 地址 `/mcp``/mcp/` 也兼容)。
- 认证:`X-Bot-Id` + `X-Bot-Secret`
这意味着:
- 不需要单独部署一套 MCP 服务;
- 不需要让 MCP client 传业务账号密码;
- 不需要让远程 agent 访问本地脚本进程。
## 2. 接口地址
```text
http://<backend-host>:<backend-port>/mcp
```
说明:
- 推荐优先使用 `/mcp``/mcp/` 也兼容。
- 前面有 Nginx/网关时,**不要对 `/mcp` 做 301/302 重定向**。
- 未携带 bot 凭证访问 `/mcp``/mcp/` 返回 `401`
## 3. 认证模型
MCP client 只传两个 header`X-Bot-Id`、`X-Bot-Secret`。后端逻辑:
1. 根据 `X-Bot-Id` 查询 `mcp_bots`
2. 校验 `X-Bot-Secret`
3. 将该 bot 映射到 NexDocs 用户;
4. 以该用户身份执行 MCP 工具。
因此 client 不需要再传NexDocs 用户名、密码、access token。
## 4. 用户如何获取凭证
个人中心 → `MCP 接入` 标签页:
- 查看 `X-Bot-Id`
- 查看并复制 `X-Bot-Secret`
- 重新生成 `X-Bot-Secret`
后端接口:
- `GET /api/v1/auth/mcp-credentials`
- `POST /api/v1/auth/mcp-credentials/rotate-secret`
## 5. 当前支持的 MCP 工具
| 工具 | 说明 | 关键参数 |
| --- | --- | --- |
| `list_created_projects` | 列出当前用户创建的项目 | keyword(可选), limit(默认100) |
| `get_project_tree` | 项目文件树 | project_id(必填) |
| `get_file` | 获取文件内容 | project_id, path |
| `create_file` | 创建新文件 | project_id, path, content(可选) |
| `update_file` | 修改文件 | project_id, path, content |
| `delete_file` | 删除文件 | project_id, path |
### 文件类工具的语义
- `create_file`:目标已存在报错;自动创建缺失上级目录;校验项目写权限;写 Markdown 更新搜索索引;记录操作日志;通知项目成员。
- `update_file`:目标不存在报错;只允许更新文件(非目录);校验写权限;写 Markdown 更新索引;记日志;通知。
- `delete_file`:目标不存在报错;只允许删除文件(非目录);删除 Markdown 同步删搜索索引;记日志;通知。
## 6. 调用端配置示例
支持 streamableHttp 的 MCP client
```json
{
"tools": {
"mcpServers": {
"biz_mcp": {
"type": "streamableHttp",
"url": "http://backend.internal:8000/mcp",
"headers": {
"X-Bot-Id": "nexbot_xxxxxxxxxxxxxxxx",
"X-Bot-Secret": "nxbotsec_xxxxxxxxxxxxxxxxxxxxxxxx"
},
"toolTimeout": 60
}
}
}
}
```
注意:
- `url` 建议使用 `/mcp`
- `headers` 中不需再放业务用户名密码;
- `X-Bot-Secret` 只应发给受信任调用端;
- 浏览器环境客户端需把站点加入后端 `CORS_ORIGINS`
## 7. 后端部署要求
- **Python 版本**backend 需要 Python 3.12MCP SDK 要求 3.10+;本项目按 3.12 调试)。
- **Docker**`backend/Dockerfile` 基于 Python 3.12。
- **数据表**:需要 `mcp_bots` 表(通过建表脚本/init 创建)。
- **Nginx 统一入口**:前端 Nginx 已加 `/mcp`、`/mcp/` 反代配置,可经统一入口访问。
本地开发建议:
```bash
cd backend
/opt/homebrew/bin/python3.12 -m venv venv312
env -u HTTP_PROXY -u HTTPS_PROXY ./venv312/bin/pip install -r requirements.txt
./venv312/bin/uvicorn main:app --host 0.0.0.0 --port 8000
```
## 8. 验证结果
本地已验证:
- Python 3.12 启动 backend 正常;
- `/health` 返回 200
- `/mcp`、`/mcp/` 均可访问;
- 未传 `X-Bot-Id`/`X-Bot-Secret` 返回 401。
## 9. 规格映射
- 关联 ADRADR-0005开放接入/可溯源)。
- 功能规格FR-18见 DV-0011
- 验证证据:见 DV-0011/verification.md详细集成说明已并入本页`docs/MCP_HTTP_INTEGRATION.md`)。

View File

@ -0,0 +1,18 @@
# 产品与工程原则Principles
## 产品原则
1. **文件即真理**:内容数据以文件为本,数据库只承载元数据/权限/状态。
2. **透明可迁移**:任何时刻都应能通过「拷贝目录 + 导出 DB」完成迁移。
3. **严格隔离**:项目级磁盘隔离 + RBAC 权限,双保险。
4. **答案可溯源**:知识库问答必须可验证,禁止无依据编造。
5. **开放接入**:优先用行业标准协议(如 MCP暴露能力。
## 工程原则
1. **异步优先**:后端 FastAPI + 异步 I/Oaiofiles/aiomysql/aioredis长任务走后台任务。
2. **写路径不阻塞**:索引/向量同步放后台(`FileVectorSyncService`、`ProjectVectorizationTaskService`),主请求线程不等待。
3. **路径安全第一**:任何文件访问必须先过 `get_secure_path` 校验。
4. **健壮降级**LLM/embedding/对齐失败不阻断主流程;无配置时跳过。
5. **幂等变更**:数据库结构演进用幂等 ALTER初始化脚本可重复执行。
6. **单一真相源**:本 SDD 中心是规格/追踪入口,细节指向源文档与代码。
7. **小步可追踪**一次合并一个逻辑单元切片TS可被证据VER验证。

View File

@ -0,0 +1,34 @@
# 阶段性路线图Roadmap
> 基于仓库现状IMPLEMENTATION_PLAN.md 三阶段已基本完成)与 SDD 梳理结果,重新组织为阶段化路线图。状态为 SDD 核对后的推断。
## 阶段一MVP 文档平台(已完成)
- 认证与会话DV-0001
- 项目与文件系统DV-0002
- 文档编辑与文件操作DV-0003
- RBAC 与系统管理DV-0004
## 阶段二:检索与知识库(已完成)
- 全文检索DV-0005
- ZVec 向量化DV-0006
- RAG 知识库对话DV-0007
- LLM 模型配置DV-0008
## 阶段三:协作与开放(已完成)
- 分享与公开预览DV-0009
- 通知、日志、Git 集成、导出DV-0010
- MCP 接入DV-0011
## 待决/增强Backlog
| 项 | 说明 | 关联 |
| --- | --- | --- |
| 安全整改 | 敏感日志脱敏、口令复杂度校验 | OI-1, NFR-9 |
| 部署官方化 | Compose v2 路径统一、清理 v1 依赖说明 | OI-2, ADR-08 |
| 测试增强 | 集成测试与 E2E提升回归覆盖 | OI-3 |
| 迁移体系评估 | 评估引入 Alembic 以支撑大规模结构变更 | OI-4 |
| 实时协同评估 | 若需多人实时编辑,另行立项(当前 exclude | vision 边界 |
## 里程碑原则
- 每个里程碑对应一组 DV 规格;合入前 verification.md 证据必须齐全(或明确标注 OI-3 覆盖)。
- 发布版本在 releases/ 登记。

View File

@ -0,0 +1,39 @@
# 产品愿景Vision
## 一句话愿景
**NEX Docus 是一款面向团队协作的轻量级文档管理平台**,以「数据库管理权限 + 文件系统存储内容」的混合架构,让团队在获得可控权限管理的同时,拥有文件级的数据透明性、可迁移性与可理解性(可检索、可问答、可溯源)。
## 产品价值主张PO
| 编号 | 价值主张 | 说明 |
| --- | --- | --- |
| PO-1 | **文件即真理File as Truth** | 文档内容、图片、附件以原生文件存于服务器磁盘,不落数据库 BLOB便于备份、迁移与 Git 版本控制。 |
| PO-2 | **三级模型** | 用户User→ 项目Project→ 文档/文件夹File/Folder的分层组织。 |
| PO-3 | **严格隔离与权限** | 基于项目的物理磁盘隔离 + 数据库 RBAC 权限的双重控制。 |
| PO-4 | **可理解内容库** | 文档可向量化构建知识库,支持基于 RAG 的问答,且答案可溯源(引用支撑句)。 |
| PO-5 | **开放接入** | 通过 MCP (Model Context Protocol) Streamable HTTP 让外部 Agent 访问项目/文档能力。 |
## 目标用户与角色
- **系统管理员super_admin**:全量菜单与权限,管理用户、角色、模型配置、日志。
- **管理员admin**:系统级管理人员。
- **普通用户user**:创建/参与项目、编辑文档、使用知识库对话。
- **访客(匿名分享访问者)**:通过公开分享链接访问项目/文件预览(受限)。
## 边界Scope
### 范围内In Scope
用户认证与 RBAC、项目管理与协作、文档/文件系统管理、全文检索、ZVec 向量化知识库、RAG 对话、分享/预览、Git 仓库集成、通知、系统日志、LLM 模型配置、后台导出/向量化任务、MCP 接入。
### 范围外Out of Scope
- 不做数据库内大文件二进制 BLOB 存储(文件一律落盘)。
- 不内置完整 Alembic 迁移链(见 ADR采用幂等 ALTER
- 不承诺 docker-compose v1 兼容(依赖 Compose v2 / Engine ≥ 25
- 不做实时多人协同编辑(当前为「保存即落盘 + 后台索引同步」,无 OT/CRDT
## 成功度量(建议)
- MVP 链路通:创建项目 → 编辑 MD → 保存 → 检索命中 → 向量化 → RAG 问答可溯源。
- 知识库引用准确率:答案中的 [n] 引用均可回填到原文支撑句(引用对齐覆盖率)。
- 部署/升级成功率Compose v2 一键 init/upgrade 无阻断。

View File

@ -0,0 +1,25 @@
# 发布索引Releases
本目录登记**公开版本与资产索引**。每个发布一个文件:`vX.Y.Z.md`,记录发布元数据、产物与验证边界。
## 发布规则
- 版本号语义化MAJOR.MINOR.PATCH
- 发布前必须:对应 DV verification.md 证据通过ADR 无未决的重大分歧。
- 发布文件中须给出「验证边界」:哪些 DV 被覆盖、如何复验、已知限制。
- 部署相关变更同步到 `DEPLOY.md` / `CHANGELOG_DEPLOY.md`
- **版本以 git 为准**:发布必须对应一个 git 版本标记(提交信息中的 vX.Y.Z 或 tag代码内版本字段应与 git 标记一致。
## 版本列表(对齐 git
| 版本 | 文件 | 对应 git 标记 | 主要规格覆盖 | 状态 |
| --- | --- | --- | --- | --- |
| v0.9.9 | [v0.9.9.md](v0.9.9.md) | `416ef48 v0.9.9`当前基线HEAD `4ef3c92` | 阶段一~三全部 DV | 当前基线 |
| v0.9.6 | [v0.9.6.md](v0.9.6.md) | `c005964 v0.9.6` | MCP 内集成/凭证管理/Python3.12/storage 持久化(历史) | 历史发布记录 |
> git 发布线v0.9.1 → v0.9.2 → v0.9.6 → v0.9.7 → v0.9.8 → **v0.9.9**。仓库**未打 git tag**;上表以提交信息中的版本标记为准。
>
> v0.9.6 为**历史发布记录**(整合自原 `docs/UPGRADE_v0.9.6.md`v0.9.9 为**当前基线**。
>
> ⚠️ 代码内版本字段(`APP_VERSION`、`package.json version`)与部分旧文档标注为 1.0.0,与 git 标记不符,属遗留占位,见 v0.9.9.md「版本对齐说明」。
## 历史部署变更参考(非发布、仅供追踪)
- `CHANGELOG_DEPLOY.md`v1.0.1 前端端口 80→8080、storage 目录映射STORAGE_PATH该记录与 git 发布线冲突,已标注意外,见 archive/版本对齐)。

View File

@ -0,0 +1,36 @@
# Release v0.9.6(历史升级记录)
> **文档性质**:历史发布记录。整合自原 `docs/UPGRADE_v0.9.6.md`(已并入)。内容多为当时的新增能力,绝大部分已被后续版本吸收为基线;此处仅作发布历史留存。
## 元数据
- **版本**v0.9.6
- **更新时间**2026-03-11
## 主要变更
1. 新增后端内集成的 MCP Server 能力(原生 `streamableHttp`,入口 `/mcp`,兼容 `/mcp/`)。
2. 新增用户级 MCP 凭证管理(`X-Bot-Id` / `X-Bot-Secret` 认证模型)。
3. 打通通过 Nginx 统一入口访问 MCP。
4. 调整部署运行环境到 Python 3.12MCP SDK 要求 3.10+)。
5. 将 MySQL、Redis 数据目录改为项目根目录 `storage/` 持久化(`storage/mysql`、`storage/redis`、`storage/projects`、`storage/temp`)。
6. 个人中心与文档页交互优化(左右布局、浏览/编辑切换、认证异常 Toast 抑制)。
## MCP 能力(当时新增)
- 工具:`list_created_projects`、`get_project_tree`、`get_file`、`create_file`、`update_file`、`delete_file`。
- 接口:`GET /api/v1/auth/mcp-credentials`、`POST /api/v1/auth/mcp-credentials/rotate-secret`。
## 部署变更
- backend 基础镜像切换为 `python:3.12-slim`pip 构建工具升级;国内源失败回退官方源。
- Nginx 补 `/mcp`、`/mcp/` 兼容反代。
- MySQL/Redis 数据目录挂载到 `storage/`
## 升级迁移注意事项
- MCP 调用地址:经前端 Nginx 统一入口改为 `http(s)://<host>/mcp`;调用头保持 `X-Bot-Id`/`X-Bot-Secret`。
## 验证边界(当时建议)
1. backend `/health` 正常;
2. 统一入口 `/api/`、`/mcp`、`/mcp/` 可访问;
3. MCP client 能完成 `initialize`
4. 个人中心 MCP 凭证展示与轮换正常。
## 关联
- 现规格映射FR-18 / DV-0011集成细节见 `integrations/mcp.md`

View File

@ -0,0 +1,35 @@
# Release v0.9.9(当前基线)
> 基于 `git log` 版本标记对应的最新发布提交(`416ef48 v0.9.9`)与当前 HEAD`4ef3c92 优化了显示`,位于 v0.9.9 之后)。仓库未打 git tag此记录以提交信息中的版本标记为准。
## 元数据
- **版本**v0.9.9(当前基线)
- **对应提交**v0.9.9 标记提交 `416ef48`;当前 HEAD `4ef3c92`
- **适用代码**backend + frontend + docker-composemain 分支)
- **代码内版本字段**:意外标注为 1.0.0,与 git 标记 v0.9.9 不符,见「已知差异」
## 主要能力
覆盖阶段一~三:认证/DV-0001、项目管理与文件系统/DV-0002、文档编辑/DV-0003、RBAC 与系统管理/DV-0004、全文检索/DV-0005、ZVec 向量化/DV-0006、RAG 对话/DV-0007、模型配置/DV-0008、分享预览/DV-0009、通知日志 Git 导出/DV-0010、MCP/DV-0011。
## 产物
- 后端镜像docker-compose backend build
- 前端镜像frontend buildnginx 托管静态资源)
- 部署编排:`docker-compose.yml` + `deploy.sh`
## 验证边界
- 自动化测试:`backend/tests/test_chat_citations.py`、`test_model_and_vector_configuration.py`、`test_search_service.py`。
- 运行验证:`/health` 返回 healthySwagger `/docs` 可用。
- 部署验证Compose v2 `docker compose up -d --build``./deploy.sh upgrade`。
- 已知限制单机部署无实时协同编辑测试覆盖待增强OI-3
## 已知问题
| 编号 | 内容 | 处置 |
| --- | --- | --- |
| OI-1 | 敏感日志脱敏 | 待整改 |
| OI-2 | Compose v2 官方化 | 待整改 |
| OI-4 | 版本字段 1.0.0 与 git 标记不符,需统一 | 待整改(见本文档「版本对齐」说明) |
## 版本对齐说明
- git 发布线v0.9.1 → v0.9.2 → v0.9.6 → v0.9.7 → v0.9.8 → v0.9.9`416ef48`)。
- **无 v1.0.0** 的 git 版本;代码 `APP_VERSION=1.0.0`、`package.json version=1.0.0` 与文档中的 v1.0.0/v1.0.1 均为遗留占位,与 git 不符。
- 建议:下次打 tag 时以 v0.9.9 为基线;若计划升级 v1.0.0 则应显式建 tag 并同步代码字段。

View File

@ -0,0 +1,28 @@
# DV-0001认证与会话 设计Design
## 上下文
涉及 `auth.py`API、`security.py`JWT/bcrypt、`deps.py`(依赖注入)、`redis_client.py`TokenCache
## 数据模型
- `users`id/username/password_hash/…)——细节见 DATABASE.md。
## 接口设计
- POST /api/v1/auth/{register,login,logout}
- GET /api/v1/auth/me
- PUT /api/v1/auth/profile
- POST /api/v1/auth/change-password
- POST /api/v1/auth/upload-avatar
- GET /api/v1/auth/avatar/{user_id}/{filename}
- GET/POST /api/v1/auth/mcp-credentials{,/rotate-secret}
## 认证流程
1. 登录成功bcrypt 校验 → 生成 JWTsub=user_id→ 写入 Redis TokenCache。
2. 每次请求:`get_current_user` 校验 Redis 中 token→user_id再 decode JWT两项一致且用户启用才放行。
3. 登出:移除 Redis 中的 token实现即时失效。
## 状态与降级
- Redis 不可用 → 认证失败(受 NFR-2 约束);可选认证(`get_current_user_optional`)返回 None 而非报错。
## 变更影响
- NFR-9 敏感日志security.py/deps.py 的 SECRET_KEY/JWT 载荷日志需脱敏TS-12

View File

@ -0,0 +1,32 @@
# DV-0001认证与会话 规格Spec
- **状态**Implemented
- **关联 ADR**ADR-0003
## 目标
提供安全的用户认证与会话管理,为所有受保护资源提供身份基础。
## 范围
- **In**注册、登录、登出、修改密码、个人资料、头像上传、JWT Bearer + Redis 双校验。
- **Out**:第三方 SSO/OAuth 登录。
## 用户故事
> 作为用户,我希望登录一次后持续访问项目/文档,以便高效工作而不反复输入凭据。
## 功能需求FR
| ID | 需求描述 | 验收要点 |
| --- | --- | --- |
| FR-1 | 注册/登录/登出、改密、资料、头像 | 登录返回 JWT退出后 token 失效 |
| FR-1a | 每次请求经 get_current_user 校验 | Redis 缓存 + JWT 完整性 + 用户状态;禁用即拒绝 |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-1 | 密码 bcrypt 哈希存储,绝不明文 |
| NFR-2 | JWT + Redis Token 缓存双校验token 存 Redis 可失效 |
| NFR-9 | 敏感日志脱敏(缺陷,见 OI-1 |
## 边界与约束
- 使用 OAuth2 password bearertoken 有效期 ACCESS_TOKEN_EXPIRE_MINUTES=1440。
- 用户被禁用status!=1即拒绝访问。

View File

@ -0,0 +1,9 @@
# DV-0001认证与会话 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-1 | 注册/登录/登出 + JWT + Redis | FR-1, NFR-2 | 已完成 |
| TS-1a | 修改密码、个人资料、头像上传 | FR-1 | 已完成 |
| TS-1b | mcp-credentials 接口 | FR-1/FR-18 | 已完成 |
| TS-12 | **敏感日志脱敏、口令复杂度** | NFR-1, NFR-9 | 待整改 |

View File

@ -0,0 +1,19 @@
# DV-0001认证与会话 验证Verification
## 自动化测试
- 结构性证据为主(认证逻辑无独立单测文件)。
## 手工验收清单
- [x] 登录返回 JWT携带后可访问受保护接口
- [x] 退出后同 token 返回 401
- [x] 禁用用户登录后请求被拒
- [x] 修改密码后旧密码失效
- [ ] 敏感日志脱敏TS-12 未完成)
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-10 | backend/app/models/user.py | FR-1 数据层 |
| VER-11 | backend/app/api/v1/auth.py | FR-1 API 层 |
| VER-15 | backend/app/core/security.py + deps.py | NFR-1/2揭示 NFR-9 |

View File

@ -0,0 +1,27 @@
# DV-0002项目与文件系统 设计Design
## 上下文
`projects.py`、`storage.py`、`project_file_service.py`、`file_vector_sync_service.py`。
## 数据模型
- `projects`storage_key/owner_id/status/access_pass…
- `project_members`role: admin/editor/viewer
- `document_meta`、`document_vector`
- 细节见 DATABASE.md。
## 存储结构
`STORAGE_ROOT/projects/<storage_key>/` + `_assets/images|files` + 默认 README.md。
## 接口设计
- /api/v1/projects/*CRUD、my、shared、transfer、members
- /api/v1/files/{project_id}/tree
## 路径安全
`get_secure_path(storage_key, rel)`:以 project_root 为根,`relative_to` 校验,失败 403。
## 状态与降级
- 权限不足→403索引同步失败不阻塞文件写最终一致
## 变更影响
- ADR-0006文件变更触发向量/全文索引进后台同步。

View File

@ -0,0 +1,33 @@
# DV-0002项目与文件系统 规格Spec
- **状态**Implemented
- **关联 ADR**ADR-0001, ADR-0002, ADR-0003, ADR-0006
## 目标
建立「用户→项目→文档/文件夹」三级模型并以“DB 权限 + FS 内容”实现项目文档的文件级存储与严格隔离。
## 范围
- **In**:项目 CRUD/转移/归档、成员协作、StorageService 路径安全、目录树。
- **Out**:实时协同编辑。
## 用户故事
> 作为项目成员,我希望按权限访问项目文档,以便协同维护知识库。
## 功能需求FR
| ID | 需求 | 验收要点 |
| --- | --- | --- |
| FR-2 | 三级模型 + 项目 CRUD/转移 | 创建生成 UUID storage_key 并建磁盘结构 |
| FR-3 | 文件系统存储 + 路径安全 | get_secure_path 防穿越;隐藏文件/_assets 不进树 |
| FR-5 | 项目成员协作 | 按 admin/editor/viewer 判定读写 |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-3 | 所有路径经 get_secure_path 校验 |
| NFR-4 | 项目访问做 RBAC 校验 |
| NFR-11 | 索引在文件变更时同步维护 |
## 边界与约束
- 磁盘名用 UUIDstorage_key展示名解耦。
- 内容不进 DB BLOB。

View File

@ -0,0 +1,8 @@
# DV-0002项目与文件系统 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-2 | 三级模型、项目 CRUD、存储服务、路径安全、成员协作 | FR-2/3/5, NFR-3/4 | 已完成 |
| TS-2a | 项目转移/归档/访问密码 | FR-2 | 已完成 |
| TS-2b | 磁盘结构初始化uuid + _assets + README | FR-2 | 已完成 |

View File

@ -0,0 +1,15 @@
# DV-0002项目与文件系统 验证Verification
## 手工验收清单
- [x] 创建项目生成 uuid 目录 + README.md + _assets
- [x] 路径穿越(../)返回 403
- [x] 非成员访问返回 403
- [x] 目录树隐藏 . 开头的文件与 _assets
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-10 | models/project.py 等 | FR-2/5 数据层 |
| VER-11 | api/v1/projects.py, files.py | FR-2/3/5 API 层 |
| VER-12 | services/storage.py, project_file_service.py | ADR-0001/2/6, FR-3 |

View File

@ -0,0 +1,20 @@
# DV-0003文档编辑与文件操作 设计Design
## 上下文
`files.py`API、`storage.py`(读写)、前端 `DocumentPage/DocumentEditor`pages/Document、Markdown 组件 bytemd。
## 接口设计
- GET /api/v1/files/{project_id}/tree
- GET|POST /api/v1/files/{project_id}/file
- POST /api/v1/files/{project_id}/file/operate
- POST /api/v1/files/{project_id}/upload{,-document}
- POST /api/v1/files/{project_id}/import-documents
- GET /api/v1/files/{project_id}/export-directory
- GET /api/v1/files/{project_id}/export-pdf
## 前端
- 左侧目录树,右侧 Markdown 编辑/预览PDF 用 react-pdf长列表虚拟滚动。
## 状态与降级
- 写文件自动创建父目录重命名目标冲突→400。

View File

@ -0,0 +1,30 @@
# DV-0003文档编辑与文件操作 规格Spec
- **状态**Implemented
- **关联 ADR**ADR-0002
## 目标
提供无限层级目录树与完整的 Markdown 文档编辑/文件操作能力。
## 范围
- **In**:目录树、读/存文件、新建/重命名/删除/移动、上传图片/文档、导入/导出、导出 PDF。
- **Out**:富文本编辑器(仅 Markdown
## 用户故事
> 作为文档作者,我希望编辑 Markdown 并管理目录结构,以便维护有序的知识库。
## 功能需求FR
| ID | 需求 | 验收要点 |
| --- | --- | --- |
| FR-4 | 目录树 + 文件操作 + 上传/导入/导出 | 无限层级目录在前名称排序_assets 不展示 |
| FR-4a | 前端编辑器 + 保存 | Cmd+S 保存;图片/附件上传 |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-3 | 路径安全(所有文件操作复用 get_secure_path |
| NFR-5 | aiofiles 异步 I/OPDF/长文档虚拟滚动 |
## 边界与约束
- 隐藏文件不进入树_assets 不进入树。

View File

@ -0,0 +1,8 @@
# DV-0003文档编辑与文件操作 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-3 | tree/file/operate/upload/import/export 基础链路 | FR-4 | 已完成 |
| TS-3a | 前端编辑器与目录树 | FR-4a | 已完成 |
| TS-3b | PDF 预览与导出 | FR-4a | 已完成 |

View File

@ -0,0 +1,16 @@
# DV-0003文档编辑与文件操作 验证Verification
## 手工验收清单
- [x] 新建/重命名/删除/移动文件与文件夹
- [x] 文件内容保存后读回一致
- [x] 图片/文档上传成功
- [x] 目录导出 ZIP、文档导出 PDF
- [x] 隐藏文件与 _assets 不在树中
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-11 | api/v1/files.py | FR-4 |
| VER-12 | services/storage.py | FR-4 |
| VER-16 | frontend/src/pages/Document/* | FR-4a |

View File

@ -0,0 +1,18 @@
# DV-0004RBAC 与系统管理 设计Design
## 上下文
`roles.py`、`role_permissions.py`、`users.py`、`menu.py`、`dashboard.py`。
## 数据模型
- `roles`、`user_roles`、`system_menus`、`role_menus`。
- 细节见 DATABASE.md。
## 接口设计
- /api/v1/roles/*、/api/v1/role-permissions/*
- /api/v1/users/*
- /api/v1/menu/user-menus、/user-permissions
- /api/v1/dashboard/*
## 权限判定
- 前端按 user-permissions 渲染;后端依赖校验。超级管理员跳过细粒度检查。

View File

@ -0,0 +1,27 @@
# DV-0004RBAC 与系统管理 规格Spec
- **状态**Implemented
- **关联 ADR**ADR-0003
## 目标
提供基于角色的访问控制RBAC与系统管理能力用户、角色、权限、菜单、仪表盘
## 范围
- **In**:角色→菜单/权限点、用户管理、仪表盘统计。
- **Out**:细粒度字段级权限(当前为菜单/权限点/项目角色)。
## 用户故事
> 作为管理员,我希望按角色分配能力并量化系统使用情况,以便治理平台。
## 功能需求FR
| ID | 需求 | 验收要点 |
| --- | --- | --- |
| FR-6 | RBACroles/system_menus/role_menus超级管理员全量 | 用户多角色;菜单/权限点授权 |
| FR-7 | 用户管理:增删改查/启停/角色/重置密码 | 管理员可操作 |
| FR-8 | 仪表盘:统计与文档活跃度 | 数据正确 |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-4 | 权限判定统一走 RBAC 依赖 |

View File

@ -0,0 +1,7 @@
# DV-0004RBAC 与系统管理 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-4 | RBAC、角色/权限/菜单、用户管理、仪表盘统计 | FR-6/7/8 | 已完成 |
| TS-4a | 菜单/权限点初始化scripts/init_db.py | FR-6 | 已完成 |

View File

@ -0,0 +1,15 @@
# DV-0004RBAC 与系统管理 验证Verification
## 手工验收清单
- [x] 角色增删改、菜单/权限点授权
- [x] 用户增删改/启停/分配角色/重置密码
- [x] 超级管理员拥有全部权限
- [x] 仪表盘统计正确
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-10 | models/role.py, menu.py | FR-6 |
| VER-11 | api/v1/{roles,role_permissions,users,menu,dashboard}.py | FR-6/7/8 |
| VER-16 | frontend/src/pages/System/* | FR-6/7 |

View File

@ -0,0 +1,15 @@
# DV-0005全文检索 设计Design
## 上下文
`search_service.py`Whoosh + `ChineseAnalyzer`/jieba
## 接口设计
- GET /api/v1/search/documents
- POST /api/v1/search/rebuild-index
## 索引结构
- `search_index` 本地目录schemaproject_id/path/title/content`path` 用 `<project_id>:<path>` 唯一化。
## 变更同步
- 文件读写路径调用 `search_service.update_doc/delete_document`files.py 导入触发)。

View File

@ -0,0 +1,25 @@
# DV-0005全文检索 规格Spec
- **状态**Implemented
- **关联 ADR**ADR-0004
## 目标
基于本地 Whoosh 索引对文档内容/标题做中文关键词检索。
## 范围
- **In**:文档索引维护、关键词检索、重建索引。
- **Out**:语义向量检索(归 DV-0006
## 用户故事
> 作为用户,我希望按关键词搜到项目文档,以便快速定位。
## 功能需求FR
| ID | 需求 | 验收要点 |
| --- | --- | --- |
| FR-9 | Whoosh 中文检索 + 变更同步 + 重建 | 命中标题/内容jieba 中文分词 |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-11 | 文档变更时同步索引ADR-0006 |

View File

@ -0,0 +1,7 @@
# DV-0005全文检索 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-5 | Whoosh 中文索引 + 变更同步 + 重建 | FR-9 | 已完成 |
| TS-5a | 检索结果高亮/命中 | FR-9 | 已完成 |

View File

@ -0,0 +1,17 @@
# DV-0005全文检索 验证Verification
## 自动化测试
| VER | 测试 | 证明 | 结果 |
| --- | --- | --- | --- |
| VER-3 | test_search_service.py | FR-9, TS-5 | 通过 |
## 手工验收清单
- [x] 创建文档后立即可被关键词命中
- [x] 删除文档后不再命中
- [x] 重建索引可用
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-12 | services/search_service.py | ADR-0004, FR-9 |

View File

@ -0,0 +1,19 @@
# DV-0006ZVec 向量化 设计Design
## 上下文
`zvec_service.py`、`file_vector_sync_service.py`、`project_vectorization_task_service.py`。
## 分块
- 字符滑动窗口chunk_size默认 800/ overlap150每块生成 anchor、content_hash。
## 写入
- ZVec collection 每项目一个(`vector_index/<project_id>`embedding 用配置的 `model_type=embedding` 模型。
- `document_vector` 表逐块记录zvec_id/chunk_text/status/error
## 触发
- 写路径:`ProjectFileService → FileVectorSyncService`(后台、按项目串行)。
- 全量:`ProjectVectorizationTaskService`(后台任务 + 进度表)。
## 维度变更
- 检测现有 collection 维度与模型不一致 → 重建 collection旧向量作废需重向量化。

View File

@ -0,0 +1,27 @@
# DV-0006ZVec 向量化 规格Spec
- **状态**Implemented
- **关联 ADR**ADR-0004, ADR-0006
## 目标
将项目 MD 文档分块向量化,写入本地 ZVec 库并记录状态,为 RAG 提供语义检索基础。
## 范围
- **In**MD 分块向量化、增量同步、删除清理、整项目后台任务。
- **Out**:对话本身(归 DV-0007
## 用户故事
> 作为用户,我希望项目文档自动向量化,以便后续语义问答。
## 功能需求FR
| ID | 需求 | 验收要点 |
| --- | --- | --- |
| FR-10 | MD 分块 + embedding + ZVec 写入 + document_vector 记录 | 保存/新建/重命名触发删除清理PDF 不向量化;维度变更重建 |
| FR-11 | 整项目向量化后台任务 + 进度 | pending/running/success/failed 持久化 |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-10 | embedding 失败不阻断;无配置跳过 |
| NFR-11 | 向量维度变更重建 collection 并全量重向量化 |

View File

@ -0,0 +1,8 @@
# DV-0006ZVec 向量化 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-6 | 分块、embedding、collection、增量同步、进度 | FR-10/11 | 已完成 |
| TS-6a | MD 变更触发重向量化/删除清理 | FR-10 | 已完成 |
| TS-6b | 维度变更重建 collection | FR-10, NFR-11 | 已完成 |

View File

@ -0,0 +1,19 @@
# DV-0006ZVec 向量化 验证Verification
## 自动化测试
| VER | 测试 | 证明 | 结果 |
| --- | --- | --- | --- |
| VER-2 | test_model_and_vector_configuration.py | FR-10, TS-6 | 通过 |
## 手工验收清单
- [x] 保存 MD 触发向量化、document_vector 出现记录
- [x] 删除 MD 清理向量
- [x] PDF 不向量化
- [x] 维度变更后重建 collection
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-10 | models/document_vector.py, project_vectorization_task.py | FR-10/11 |
| VER-12 | services/zvec_service.py, file_vector_sync_service.py | ADR-0004/6 |

View File

@ -0,0 +1,27 @@
# DV-0007知识库 RAG 对话 设计Design
## 上下文
`chat.py`API、`rag_service.py`(检索/生成/对齐)、`zvec_service.search_similar`。
## 数据模型
- `chat_session`、`chat_message`status/duration_ms/thinking_log/referenced_files
## 接口设计
- POST /api/v1/chat/sessions、GET /chat/sessions、GET|PUT|DELETE /chat/sessions/{id}
- GET /chat/sessions/{id}/messages、DELETE /chat/messages/{id}
- POST /chat/send、/chat/send/stream、/chat/messages/{id}/interrupt
- GET /chat/search、向量化系列归 DV-0006
## 检索与生成
1. `search_similar`top_k*4 命中去重,每文件最多 MAX_CHUNKS_PER_DOCUMENT=3
2. 上下文围绕命中锚点截取CHUNK_CONTEXT_WINDOW=1200
3. 系统提示词约束:仅依知识库、必须 [n] 引用。
4. 历史仅注入最近用户问题HISTORY_USER_QUESTION_LIMIT=3作为指代。
## 引用对齐
- `align_citation_quotes`:答案论断句 ↔ 原文候选句向量对齐,回填 quote_occurrences。
## 状态与降级
- 中断status=interrupted旧数据按只读兼容判定不回溯改库
- 对齐/embedding 失败 → 降级不返回支撑句。

View File

@ -0,0 +1,26 @@
# DV-0007知识库 RAG 对话 规格Spec
- **状态**Implemented
- **关联 ADR**ADR-0004, ADR-0005
## 目标
基于向量检索 + LLM 生成可溯源的问答对话。
## 范围
- **In**:会话/消息管理、检索 + 生成、流式、中断、引用支撑句。
- **Out**:多轮复杂 Agent仅单轮检索增强 + 指代历史)。
## 用户故事
> 作为用户,我希望问知识库问题并看到带引用的可验证答案。
## 功能需求FR
| ID | 需求 | 验收要点 |
| --- | --- | --- |
| FR-12 | 向量检索 + LLM 生成 + 会话管理 + 流式 | 答案带 [n] 引用;检索按文件去重;历史仅注入最近用户问题 |
| FR-19 | 引用支撑句对齐 + 消息规范化 | [n] 按出现顺序回填 quote_occurrences旧数据只读兼容 |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-10 | 引用对齐/embedding 失败降级 |

View File

@ -0,0 +1,8 @@
# DV-0007知识库 RAG 对话 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-7 | 会话/消息/流式/中断/引用对齐 | FR-12/19 | 已完成 |
| TS-7a | 引用规范化与去重 | FR-19 | 已完成 |
| TS-7b | 历史指代处理 | FR-12 | 已完成 |

View File

@ -0,0 +1,20 @@
# DV-0007知识库 RAG 对话 验证Verification
## 自动化测试
| VER | 测试 | 证明 | 结果 |
| --- | --- | --- | --- |
| VER-1 | test_chat_citations.py | FR-12/19, TS-7 | 通过 |
## 手工验收清单
- [x] 创建会话、发消息、流式接收
- [x] 答案带 [n] 引用并可回填支撑句
- [x] 中断消息正确处理
- [x] 检索命中高亮
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-11 | api/v1/chat.py | FR-12 |
| VER-12 | services/rag_service.py | ADR-0004/5 |
| VER-16 | frontend/src/pages/Chat/* | FR-12 |

View File

@ -0,0 +1,18 @@
# DV-0008LLM 模型配置 设计Design
## 上下文
`llm_model_configs.py`、`llm_provider_service.py`、模型 `llm_model_config.py`
## 数据模型
- `llm_model_config`model_code/model_type/provider/endpoint/api_key/llm_model_name/llm_timeout/type_config/is_active/is_default
## type_config 差异字段
- chattemperature/top_p/max_tokens/system_prompt
- embeddingdimension/chunk_size/chunk_overlap
## 接口设计
- /api/v1/llm-model-configs/*CRUD、status、default、test、providers
## 默认选择
- embedding 默认取 is_active 且 model_type=embeddingis_default 优先。

View File

@ -0,0 +1,25 @@
# DV-0008LLM 模型配置 规格Spec
- **状态**Implemented
- **关联 ADR**ADR-0004
## 目标
管理 chat/embedding 两类模型配置,供对话与向量化使用。
## 范围
- **In**:模型配置 CRUD、启停、默认、连通性测试、类型差异参数。
- **Out**:密钥托管/加密(当前 API Key 明文字段,见 OI 关注)。
## 用户故事
> 作为管理员,我希望配置并测试大模型,以便对话与向量化使用。
## 功能需求FR
| ID | 需求 | 验收要点 |
| --- | --- | --- |
| FR-13 | 模型配置 CRUD/启停/默认/测试 | chat 与 embedding 分离存储;维度等差异参数 |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-10 | 无默认 embedding 时向量化跳过并告警 |

View File

@ -0,0 +1,7 @@
# DV-0008LLM 模型配置 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-8 | chat/embedding 配置、测试、默认标记 | FR-13 | 已完成 |
| TS-8a | provider 归一化与类型差异参数 | FR-13 | 已完成 |

View File

@ -0,0 +1,17 @@
# DV-0008LLM 模型配置 验证Verification
## 自动化测试
| VER | 测试 | 证明 | 结果 |
| --- | --- | --- | --- |
| VER-2 | test_model_and_vector_configuration.py | FR-13, TS-8 | 通过 |
## 手工验收清单
- [x] 新增/编辑/启停 chat 与 embedding 配置
- [x] 设置默认模型
- [x] 连通性测试
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-10 | models/llm_model_config.py | FR-13 |

View File

@ -0,0 +1,15 @@
# DV-0009分享与公开预览 设计Design
## 上下文
`shares.py`、`preview.py`、模型 `share.py`
## 数据模型
- `share_links`share_type: project/file、share_code、file_path、access_pass、status
## 接口设计
- /api/v1/shares/projects/{id}settings、/files/share文件分享
- /api/v1/shares/{project|file}/{share_code}/{verify,tree,file,document,export-pdf,assets}
## 预览
- 公开只读:树/文档/PDF 导出/资源读取,均以 share_code + 可选密码鉴权。

View File

@ -0,0 +1,24 @@
# DV-0009分享与公开预览 规格Spec
- **状态**Implemented
## 目标
通过公开分享链接(可带访问密码)让访客浏览项目/文件。
## 范围
- **In**:项目/文件分享链接、密码校验、公开预览树/文档/PDF/资源。
- **Out**:分享编辑权(分享为只读预览)。
## 用户故事
> 作为访客,我希望通过链接(+密码)预览文档,以便无需账号即可阅读。
## 功能需求FR
| ID | 需求 | 验收要点 |
| --- | --- | --- |
| FR-14 | 分享链接 + 密码 + 公开预览 | share_code 唯一;密码校验;预览树/文档/导出 |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-4 | 分享访问受密码保护;资源防盗链(鉴权) |

View File

@ -0,0 +1,7 @@
# DV-0009分享与公开预览 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-9 | 项目/文件分享、预览、导出 | FR-14 | 已完成 |
| TS-9a | 分享密码与资源防盗链 | FR-14, NFR-4 | 已完成 |

View File

@ -0,0 +1,14 @@
# DV-0009分享与公开预览 验证Verification
## 手工验收清单
- [x] 创建项目/文件分享链接
- [x] 密码校验通过后可预览
- [x] 预览树/文档正常、PDF 导出可用
- [x] 无密码/密码错误时资源访问受限
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-11 | api/v1/shares.py, preview.py | FR-14 |
| VER-16 | frontend/src/pages/Preview/* | FR-14 |

View File

@ -0,0 +1,17 @@
# DV-0010通知 / 日志 / Git / 导出 设计Design
## 上下文
`notifications.py`、`logs.py`、`git_repos.py`、`project_export_service.py`。
## 数据模型
- `notifications`、`operation_logs`、`project_git_repos`。
## 接口设计
- /api/v1/notifications/*unread-count/read/mark-all/system
- /api/v1/logs/*(列表/stats
- /api/v1/projects/{id}/git-repos + /git/{pull,push}
- /api/v1/files/{id}/export-*ZIP/PDF
## 导出
- `ProjectExportService` 后台线程打包 ZIP任务带进度/TTL 清理。

View File

@ -0,0 +1,28 @@
# DV-0010通知 / 日志 / Git / 导出 规格Spec
- **状态**Implemented
- **关联 ADR**ADR-0006, ADR-0007
## 目标
提供通知、操作审计日志、Git 仓库集成与 ZIP/PDF 导出能力。
## 范围
- **In**用户通知、操作日志、Git pull/push、后台导出。
- **Out**:第三方消息渠道(短信/邮件网关)。
## 用户故事
> 作为用户/管理员,我希望收到系统通知、查看审计日志并按需导出项目内容。
## 功能需求FR
| ID | 需求 | 验收要点 |
| --- | --- | --- |
| FR-15 | 通知 + 操作日志 | 通知分类operation_logs 记录用户/类型/资源/IP/UA |
| FR-16 | Git 仓库集成 | 绑定仓库 + pull/push |
| FR-17 | 导出 ZIP/PDF | 后台任务+进度WeasyPrint PDF |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-7 | 操作入库审计 |
| NFR-11 | export 后台任务同向量化模式ADR-0006 |

View File

@ -0,0 +1,7 @@
# DV-0010通知 / 日志 / Git / 导出 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-10 | 通知、日志、Git、导出 | FR-15/16/17 | 已完成 |
| TS-10a | 导出后台任务(进度/TTL | FR-17, ADR-0006 | 已完成 |

View File

@ -0,0 +1,16 @@
# DV-0010通知 / 日志 / Git / 导出 验证Verification
## 手工验收清单
- [x] 通知产生与已读标记
- [x] 操作日志记录正确
- [x] Git 仓库绑定与 pull/push
- [x] 项目导出 ZIP 带进度、文档导出 PDF
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-10 | models/{notification,log,git_repo}.py | FR-15/16 |
| VER-11 | api/v1/{notifications,logs,git_repos}.py | FR-15/16 |
| VER-12 | services/project_export_service.py | FR-17, ADR-0006 |
| VER-14 | core/migrations.py | ADR-0007, FR-15 |

View File

@ -0,0 +1,17 @@
# DV-0011MCP 接入 设计Design
## 上下文
`app/mcp/server.py`、`app/mcp/context.py`、模型 `mcp_bot.py`;挂载于 `main.py``/mcp`
## 数据模型
- `mcp_bots`user_id 唯一、bot_id、bot_secret、status、last_used_at
## 认证
1. X-Bot-Id 查 mcp_bots → 校验 X-Bot-Secret → 映射到用户 → 以该用户执行工具。
## 工具示例
- list_created_projects、create_project 等均经权限判定require_project_read/write_access
## 挂载
- `app.mount("/mcp", MCPHeaderAuthApp(mcp_http_app))`;前端 Nginx 不得对 /mcp 301/302。

View File

@ -0,0 +1,25 @@
# DV-0011MCP 接入 规格Spec
- **状态**Implemented
- **关联 ADR**ADR-0005可溯源/开放)
## 目标
通过 MCP Streamable HTTP 让外部 Agent 以用户身份访问 NexDocs 能力。
## 范围
- **In**:后端内嵌 MCP server、bot 凭据管理、工具暴露。
- **Out**:独立 MCP 部署(已废弃 mcp_server/)。
## 用户故事
> 作为外部 Agent我希望用 bot 凭据调用 NexDocs 工具管理项目/文档。
## 功能需求FR
| ID | 需求 | 验收要点 |
| --- | --- | --- |
| FR-18 | MCP /mcp + X-Bot-Id/Secret 认证 | streamableHttpbot 映射用户401 未带凭据 |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-4 | 工具以用户身份 + 权限判定执行 |

View File

@ -0,0 +1,7 @@
# DV-0011MCP 接入 任务Tasks
| TS全局/切片) | 切片 | 关联规格 | 状态 |
| --- | --- | --- | --- |
| TS-11 | MCP server 内嵌 + bot 凭据管理 | FR-18 | 已完成 |
| TS-11a | 工具权限判定 | FR-18, NFR-4 | 已完成 |

View File

@ -0,0 +1,15 @@
# DV-0011MCP 接入 验证Verification
## 手工验收清单
- [x] 携带 X-Bot-Id/Secret 可调用工具
- [x] 未带凭据 /mcp 返回 401
- [x] 工具以用户身份与权限执行
- [x] 前端不重定向 /mcp
## 结构性证据
| VER | 证据 | 证明 |
| --- | --- | --- |
| VER-11 | api/v1/auth.pymcp-credentials | FR-18 |
| VER-13 | main.py/mcp 挂载) | FR-18 |
| 集成 | integrations/mcp.md、integrations/mcp.md | FR-18 |

View File

@ -0,0 +1,27 @@
# 功能规格索引Specs
本目录登记每个功能/变更单元DV的四文件规格**spec为什么/做什么、design怎么做、tasks实施切片、verification验收证据**。
## 索引(规格 ↔ 任务 ↔ 证据)
| DV | 单元 | 主要规格(FR) | 关键任务(TS) | 关键证据(VER) | 状态 |
| --- | --- | --- | --- | --- | --- |
| [DV-0001](DV-0001-auth/spec.md) | 认证与会话 | FR-1 | TS-1 | VER-10/11/15 | Implemented |
| [DV-0002](DV-0002-project-filesystem/spec.md) | 项目与文件系统 | FR-2/3/5 | TS-2 | VER-10/11/12 | Implemented |
| [DV-0003](DV-0003-document-editing/spec.md) | 文档编辑与文件操作 | FR-4 | TS-3 | VER-11/12/16 | Implemented |
| [DV-0004](DV-0004-rbac-admin/spec.md) | RBAC 与系统管理 | FR-6/7/8 | TS-4 | VER-10/11/16 | Implemented |
| [DV-0005](DV-0005-fulltext-search/spec.md) | 全文检索 | FR-9 | TS-5 | VER-3/12 | Implemented |
| [DV-0006](DV-0006-zvec-vectorization/spec.md) | ZVec 向量化 | FR-10/11 | TS-6 | VER-2/10/12 | Implemented |
| [DV-0007](DV-0007-rag-chat/spec.md) | 知识库 RAG 对话 | FR-12/19 | TS-7 | VER-1/11/12/16 | Implemented |
| [DV-0008](DV-0008-llm-model-config/spec.md) | LLM 模型配置 | FR-13 | TS-8 | VER-2/10 | Implemented |
| [DV-0009](DV-0009-share-preview/spec.md) | 分享与公开预览 | FR-14 | TS-9 | VER-11/16 | Implemented |
| [DV-0010](DV-0010-notify-log-git-export/spec.md) | 通知/日志/Git/导出 | FR-15/16/17 | TS-10 | VER-10/11/12/14 | Implemented |
| [DV-0011](DV-0011-mcp-integration/spec.md) | MCP 接入 | FR-18 | TS-11 | VER-11/13 | Implemented |
> 说明:状态为 SDD 核对仓库实现后的推断。DOC 中列举的 TS 编号沿用原 SDD 单文件版的全局编号spec 内亦给出所属 DV 的切片编号。
## 新建规格流程
1. 复制 `_template/``DV-NNNN-short-name/`
2. 按 governance 申请编号、过审。
3. 补齐四文件后回填本索引。

View File

@ -0,0 +1,20 @@
# DV-NNNN<功能名> 设计Design
## 上下文
- 涉及模块、数据流、依赖。
## 结构设计
- 代码/模块组织。
## 数据模型
- 涉及表/字段(指向 DATABASE.md 细节)。
## 接口设计
- API 端点 / 交互。
## 状态与降级
- 边界情况、健壮降级(对齐 NFR-10
## 变更影响
- 对既有 DV/ADR 的影响。

View File

@ -0,0 +1,31 @@
# DV-NNNN<功能名> 规格Spec
- **状态**Draft | Review | Approved | Implemented | Verified
- **关联 ADR**ADR-NNNN
## 目标(为什么做)
一段话说明该功能要解决的业务问题或带来的价值(对齐 PO
## 范围
- **In**:……
- **Out**:……
## 用户故事
> 作为 <角色>,我希望 <能力>,以便 <收益>。
## 功能需求FR
| ID | 需求描述 | 验收要点 |
| --- | --- | --- |
| FR-N | … | … |
## 非功能需求NFR
| ID | 需求 |
| --- | --- |
| NFR-N | … |
## 边界与约束
- 约束(技术/数据/权限)。
## 开放问题
- 占位。

View File

@ -0,0 +1,10 @@
# DV-NNNN<功能名> 任务Tasks
| TS | 切片 | 关联规格 | 依赖 | 状态 |
| --- | --- | --- | --- | --- |
| TS-N | … | FR-N | … | 未开始 |
## 任务规则
- 每个切片可独立评审/合并。
- 完成勾选并同步更新 verification。

View File

@ -0,0 +1,17 @@
# DV-NNNN<功能名> 验证Verification
## 自动化测试
| VER | 测试 | 证明规格/任务 | 结果 |
| --- | --- | --- | --- |
| VER-N | … | FR-N / TS-N | 通过/未跑 |
## 手工验收清单
- [ ] 场景 1
- [ ] 场景 2
## 结构性证据
- 涉及文件/模块。
## 已知缺口
- 说明未覆盖项(可引用 OI-3

View File

@ -1,12 +1,12 @@
{ {
"name": "nex-docus-frontend", "name": "nex-docus-frontend",
"version": "1.0.0", "version": "0.9.9",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "nex-docus-frontend", "name": "nex-docus-frontend",
"version": "1.0.0", "version": "0.9.9",
"dependencies": { "dependencies": {
"@ant-design/icons": "^5.2.6", "@ant-design/icons": "^5.2.6",
"@bytemd/plugin-breaks": "^1.22.0", "@bytemd/plugin-breaks": "^1.22.0",

View File

@ -1,7 +1,7 @@
{ {
"name": "nex-docus-frontend", "name": "nex-docus-frontend",
"private": true, "private": true,
"version": "1.0.0", "version": "0.9.9",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",