OpenTBook
OpenTBook 产品需求文档 (PRD)
OpenTBook 项目的完整产品需求文档,包含技术架构、项目结构、工作流设计与扩展规划
版本:1.0.0 | 最后更新:2026-04-13 | 维护者:UUAILab/AITeaM
1. 项目概述
1.1 项目名称
OpenTBook — 开放团队知识手册(Open Team Book)
1.2 项目定位
基于 Git 仓库管理的团队知识库,使用 Docus v5
生成可预览的文档站点。团队成员通过任意编辑器撰写 Markdown 文档,通过 Git 工作流协作,
本地运行 npm run dev 即可实时预览。
1.3 核心理念
- 胶水代码优先:不造轮子,用开源工具粘合工作流,零业务逻辑代码
- Git 即真相:所有内容以 Git 仓库为单一事实来源(Single Source of Truth)
- 编辑器无关:VS Code、Vim、Typora、任何 Markdown 编辑器均可
- AI 辅助标准化:通过 Claude Code 技能(Skills)和规则(Rules)确保文档质量一致
1.4 项目目标
| 目标 | 衡量标准 |
|---|---|
| 知识沉淀 | 团队核心知识以结构化文档形式持久化 |
| 低门槛协作 | 新成员 10 分钟内完成环境搭建并开始编辑 |
| 实时预览 | 文件保存后 < 1s 热更新到浏览器 |
| 质量一致 | 所有文档通过 markdownlint + frontmatter 校验 |
| 可追溯 | 每次变更有清晰的 commit 记录和审核流程 |
2. 目标用户
2.1 用户画像
主要用户:UUAILab/AITeaM 团队成员
| 角色 | 使用场景 | 技术要求 |
|---|---|---|
| 研发工程师 | 撰写技术文档、API 说明、架构决策记录 | 熟悉 Git、Markdown |
| 算法研究员 | 记录实验笔记、论文阅读笔记、模型文档 | 基本 Git 操作 |
| 项目管理 | 维护项目规范、流程文档、会议纪要 | 基本 Markdown |
| 新成员 | 查阅入职指南、学习团队规范 | 能浏览网页即可 |
2.2 使用场景
- 日常写作:在本地编辑器中撰写/修改 Markdown 文件
- 实时预览:运行
npm run dev在浏览器中查看渲染效果 - 提交审核:通过 Git 提交、发起合并请求、团队评审
- 知识检索:通过文档站点内置搜索快速定位内容
3. 技术架构
3.1 架构总览
┌─────────────────────────────────────────────────────────┐
│ OpenTBook 项目 │
├──────────┬──────────────┬──────────────┬────────────────┤
│ 内容层 │ 展示层 │ 工具链层 │ AI 辅助层 │
│ content/ │ Docus v5 │ markdownlint│ Claude Code │
│ Markdown │ Nuxt 4 │ commitlint │ Skills/Rules │
│ MDC 语法 │ HMR 预览 │ husky hooks │ 文档生成/校验 │
└──────────┴──────────────┴──────────────┴────────────────┘
│ │
▼ ▼
Git 仓库(Alibaba Cloud Codeup) 本地开发环境
3.2 技术选型
| 组件 | 选型 | 版本 | 用途 |
|---|---|---|---|
| 文档框架 | Docus | v5.9.0 | 文档站点生成与预览 |
| 运行时 | Nuxt | ^4.3.1 | Docus 底层框架 |
| 数据库 | better-sqlite3 | ^12.6.2 | Nuxt Content 内容索引 |
| 包管理 | pnpm(推荐)或 npm | ^9.x / ^10.x | 依赖管理 |
| Node.js | Node.js | ^20 LTS | 运行环境 |
| Markdown 校验 | markdownlint-cli2 | latest | Markdown 格式规范 |
| 提交规范 | commitlint | latest | Git commit message 校验 |
| Git 钩子 | husky | ^9.x | pre-commit / commit-msg 钩子 |
| 暂存区校验 | lint-staged | latest | 仅校验暂存文件 |
3.3 胶水代码原则
本项目不编写业务逻辑代码,仅通过配置文件将开源工具粘合:
| 配置文件 | 功能 |
|---|---|
nuxt.config.ts | 扩展 Docus 层,一行即可 |
app.config.ts | 主题配置(标题、logo、社交链接等) |
.markdownlint.jsonc | Markdown 格式校验规则 |
commitlint.config.js | 提交信息格式规则 |
.husky/ | Git 钩子脚本(自动校验) |
.claude/ | Claude Code 技能与规则 |
3.4 Docus 如何工作
Docus v5 是一个 Nuxt Layer,核心机制:
content/目录下的 Markdown 文件通过 Nuxt Content v3 自动解析为页面- 文件系统路由 — 文件路径即 URL 路径
- 数字前缀控制导航排序(如
1.guide/→/guide/,数字不出现在 URL) nuxt dev启动开发服务器,Vite HMR 实现文件保存后浏览器即时刷新- 内置搜索、暗色模式、目录导航、"编辑此页" 链接等功能开箱即用
4. 项目结构
OpenTBook/
├── .claude/ # Claude Code 配置
│ ├── rules/ # 自定义规则
│ │ ├── markdown-standards.md # Markdown 写作标准
│ │ └── frontmatter-schema.md # frontmatter 规范
│ └── skills/ # 自定义技能
│ ├── new-doc.md # 创建新文档
│ └── review-doc.md # 审查文档质量
├── .husky/ # Git 钩子
│ ├── pre-commit # lint-staged → markdownlint
│ └── commit-msg # commitlint
├── content/ # 文档内容(核心目录)
│ ├── 0.index.md # 站点首页(Landing Page)
│ ├── 1.guide/ # 入门指南
│ │ ├── _dir.yml # 分区元数据
│ │ ├── 1.introduction.md # 项目介绍
│ │ ├── 2.quick-start.md # 快速开始
│ │ └── 3.writing-guide.md # 写作规范
│ ├── 2.engineering/ # 工程技术
│ │ ├── _dir.yml
│ │ ├── architecture/ # 架构设计
│ │ ├── development/ # 开发规范
│ │ └── devops/ # 运维部署
│ ├── 3.research/ # 研究笔记
│ │ ├── _dir.yml
│ │ ├── papers/ # 论文阅读
│ │ ├── experiments/ # 实验记录
│ │ └── models/ # 模型文档
│ ├── 4.projects/ # 项目文档
│ │ └── _dir.yml
│ ├── 5.processes/ # 流程规范
│ │ ├── _dir.yml
│ │ ├── code-review.md # 代码审查流程
│ │ ├── release.md # 发版流程
│ │ └── onboarding.md # 入职指南
│ └── 6.resources/ # 资源参考
│ ├── _dir.yml
│ ├── tools.md # 工具推荐
│ ├── links.md # 常用链接
│ └── glossary.md # 术语表
├── public/ # 静态资源
│ └── images/ # 文档图片
├── templates/ # 文档模板(不被 Docus 渲染)
│ ├── tech-doc.md # 技术文档模板
│ ├── paper-note.md # 论文笔记模板
│ ├── experiment-log.md # 实验记录模板
│ ├── meeting-note.md # 会议纪要模板
│ └── adr.md # 架构决策记录模板
├── .gitignore # Git 忽略规则
├── .markdownlint.jsonc # markdownlint 规则
├── app.config.ts # Docus 主题配置
├── CLAUDE.md # Claude Code 项目指南
├── commitlint.config.js # 提交信息规范
├── nuxt.config.ts # Nuxt/Docus 核心配置
├── package.json # 项目依赖与脚本
├── prd.md # 本文档
└── tsconfig.json # TypeScript 配置
4.1 内容分类设计
| 编号 | 目录 | 用途 | 典型内容 |
|---|---|---|---|
| 1 | guide/ | 入门指南 | 项目介绍、快速开始、写作规范 |
| 2 | engineering/ | 工程技术 | 架构设计、开发规范、运维部署 |
| 3 | research/ | 研究笔记 | 论文阅读、实验记录、模型文档 |
| 4 | projects/ | 项目文档 | 各项目的需求/设计/复盘 |
| 5 | processes/ | 流程规范 | 代码审查、发版、入职流程 |
| 6 | resources/ | 资源参考 | 工具推荐、常用链接、术语表 |
4.2 文件命名规范
- 目录名:数字前缀 + 英文短横线命名 →
2.engineering/ - 文件名:数字前缀 + 英文短横线命名 →
1.introduction.md - 中文标题:通过 frontmatter 的
title字段设置 - 图片路径:
public/images/{section}/{filename}.png,Markdown 中引用/images/{section}/{filename}.png
为什么用英文目录名?中文路径在 URL 中会被编码为
%E6%8C%87%E5%8D%97等,不利于分享和 SEO。英文目录名 + frontmatter 中文标题是最佳实践。
5. 核心配置设计
5.1 package.json
{
"name": "opentbook",
"private": true,
"type": "module",
"scripts": {
"dev": "nuxt dev",
"build": "nuxt build",
"preview": "nuxt preview",
"generate": "nuxt generate",
"lint:md": "markdownlint-cli2 \"content/**/*.md\"",
"lint:md:fix": "markdownlint-cli2 --fix \"content/**/*.md\"",
"prepare": "husky"
},
"devDependencies": {
"nuxt": "^4.3.1",
"docus": "^5.9.0",
"better-sqlite3": "^12.6.2",
"markdownlint-cli2": "^0.17.0",
"lint-staged": "^15.0.0",
"@commitlint/cli": "^19.0.0",
"@commitlint/config-conventional": "^19.0.0",
"husky": "^9.0.0"
},
"lint-staged": {
"content/**/*.md": [
"markdownlint-cli2"
]
}
}
5.2 nuxt.config.ts
export default defineNuxtConfig({
extends: ['docus'],
})
仅一行配置 — Docus 层会自动注册 Nuxt Content、Nuxt UI、Nuxt Image 等所有模块。
5.3 app.config.ts
export default defineAppConfig({
docus: {
locale: 'zh-CN',
},
ui: {
colors: {
primary: 'emerald',
neutral: 'zinc',
},
},
header: {
title: 'OpenTBook',
},
toc: {
title: '本页目录',
},
github: {
url: 'https://codeup.aliyun.com/uueic/UUAILab/AITeaM/OpenTBook',
branch: 'master',
},
})
5.4 .markdownlint.jsonc
{
"default": true,
"MD013": {
"line_length": 120,
"heading_line_length": 80,
"code_block_line_length": 120,
"tables": false
},
"MD024": {
"siblings_only": true
},
"MD033": {
"allowed_elements": ["br", "details", "summary", "sup", "sub"]
},
"MD041": false
}
规则说明:
- MD013 行长度放宽至 120:中文字符密度高,80 太短
- MD024 允许不同层级同名标题
- MD033 允许部分 HTML 元素(MDC 语法需要)
- MD041 关闭"首行必须为标题":Docus 从 frontmatter
title生成 H1
5.5 commitlint.config.js
export default {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [
2,
'always',
[
'docs', // 文档内容变更(最常用)
'feat', // 新功能/新模板
'fix', // 修正错误内容
'style', // 格式调整
'refactor', // 重构文档结构
'chore', // 工具链/配置变更
'ci', // CI/CD 变更
],
],
'subject-max-length': [2, 'always', 100],
'subject-case': [0], // 允许中文 subject
},
}
5.6 Frontmatter 规范
每篇文档必须包含以下 frontmatter:
---
title: 页面中文标题 # 必填
description: 简短描述(50-160 字符) # 必填
authors: # 必填
- name: 作者姓名
date: 2026-04-13 # ISO 日期格式
navigation:
title: 侧边栏短标题 # 可选
icon: i-lucide-book-open # 可选
---
6. Claude Code 技能与规则设计
6.1 规则(Rules)
规则文件放在 .claude/rules/ 目录下,Claude Code 自动加载。
规则 1:Markdown 写作标准(markdown-standards.md)
| 规则 | 说明 |
|---|---|
| Frontmatter | 每个 .md 文件必须以 YAML frontmatter 开头,包含 title、description、authors |
| 标题层级 | 使用 ATX 风格(# 开头),正文从 H2 开始(H1 由 Docus 自动生成) |
| 中英混排 | 中文与英文/数字之间加空格(如"使用 Git 管理") |
| 代码块 | 必须指定语言标识(python、bash 等) |
| 列表 | 使用 - 而非 * |
| 文件末尾 | 保留一个空行 |
| MDC 语法 | 使用 ::note、::tip、::warning、::caution 做提示框 |
| 文件命名 | 数字前缀 + 英文短横线:1.getting-started.md |
| 图片 | 放在 public/images/{section}/,引用路径 /images/{section}/{filename} |
规则 2:Frontmatter Schema(frontmatter-schema.md)
必填字段:
title: string # 页面标题(中文)
description: string # 页面描述(50-160 字符)
authors: array # 至少一个作者
- name: string # 作者姓名
date: string # YYYY-MM-DD
可选字段:
navigation.title: string # 侧边栏短标题
navigation.icon: string # 图标名称
toc: boolean # 是否显示目录(默认 true)
draft: boolean # 草稿(不出现在导航中)
6.2 技能(Skills)
技能 1:创建新文档(new-doc)
当用户需要创建新文档时:
- 确定文档类型(如未指定则询问):
- 技术文档 →
templates/tech-doc.md - 论文笔记 →
templates/paper-note.md - 实验记录 →
templates/experiment-log.md - 会议纪要 →
templates/meeting-note.md - 架构决策记录 →
templates/adr.md
- 技术文档 →
- 确定目标目录:
- 技术文档 →
content/2.engineering/ - 论文笔记 →
content/3.research/papers/ - 实验记录 →
content/3.research/experiments/ - 会议纪要 →
content/5.processes/ - 项目文档 →
content/4.projects/{project-name}/
- 技术文档 →
- 生成文件:自动填充 title、description、authors.name(从 git config)、authors.date(当天日期)
- 校验:运行 markdownlint 检查新文件
技能 2:审查文档质量(review-doc)
检查维度:
- Frontmatter 完整性(必填字段齐全)
- 标题层级正确性(从 H2 开始,无跳级)
- 中英文混排空格
- 代码块语言标识
- 内部链接格式正确
- 图片引用路径正确
- markdownlint 格式校验
输出审查报告,按严重程度分类。
7. 工作流设计
7.1 文档编写全流程
撰写 ──▶ 预览 ──▶ 提交 ──▶ 审核 ──▶ 合并
│ │ │ │ │
│ │ │ │ │
任意 npm husky Codeup master
编辑器 run dev 钩子 MR 评审 分支
自动校验
7.2 详细步骤
步骤 1:撰写文档
# 方式一:手动创建,参照 templates/ 中的模板
# 方式二:使用 Claude Code(推荐)
# 在终端中使用 /new-doc 技能从模板创建
步骤 2:本地预览
pnpm dev # 或 npm run dev
# 浏览器访问 http://localhost:3000
# 文件保存后自动热更新(HMR),无需手动刷新
步骤 3:提交变更
git add content/2.engineering/1.new-feature.md
git commit -m "docs(engineering): 添加新功能技术方案"
pre-commit钩子 → lint-staged → markdownlint 校验暂存的 .md 文件commit-msg钩子 → commitlint 校验提交信息格式- 校验不通过则提交被阻止
步骤 4:发起审核
git push origin docs/my-feature
# 在 Codeup 上创建合并请求(Merge Request)
步骤 5:合并发布
审核通过后合并到 master 分支。
7.3 Git 分支策略
| 分支 | 用途 | 示例 |
|---|---|---|
master | 主分支,保护分支 | — |
docs/{topic} | 文档编写分支 | docs/quick-start |
chore/{task} | 工具链/配置变更 | chore/update-lint-rules |
7.4 Commit Message 规范
格式:type(scope): subject
| type | 用途 | 示例 |
|---|---|---|
docs | 文档内容变更 | docs(guide): 添加快速开始指南 |
feat | 新模板/新功能 | feat(template): 添加实验记录模板 |
fix | 修正错误内容 | fix(research): 修正算法公式错误 |
style | 格式调整 | style: 统一标题层级格式 |
refactor | 重构文档结构 | refactor: 重新组织工程文档分类 |
chore | 工具链变更 | chore: 更新 markdownlint 规则 |
8. 快速开始指南
8.1 环境要求
- Node.js >= 20 LTS
- pnpm >= 9(推荐)或 npm >= 10
- Git >= 2.30
8.2 初始化步骤
# 1. 克隆仓库
git clone https://codeup.aliyun.com/uueic/UUAILab/AITeaM/OpenTBook.git
cd OpenTBook
# 2. 安装依赖
pnpm install # 或 npm install
# 3. 启动开发服务器
pnpm dev # 或 npm run dev
# 4. 打开浏览器访问
# http://localhost:3000
8.3 编写第一篇文档
# 1. 创建分支
git checkout -b docs/my-first-doc
# 2. 在 content/ 对应目录下创建 .md 文件
# 参照 templates/ 中的模板,添加完整 frontmatter
# 3. 保存后浏览器自动刷新预览
# 4. 提交
git add content/1.guide/4.my-first-doc.md
git commit -m "docs(guide): 添加我的第一篇文档"
git push origin docs/my-first-doc
# 5. 在 Codeup 上发起合并请求
9. 文档模板
9.1 技术文档模板
---
title: 文档标题
description: 简短描述(50-160 字符)
authors:
- name: 作者姓名
date: YYYY-MM-DD
---
## 概述
简要说明本文档的目的和背景。
## 问题/需求
描述要解决的问题或需求。
## 方案设计
### 技术选型
### 架构设计
### 关键实现
## 影响评估
### 性能影响
### 兼容性
## 参考资料
- [链接名称](URL)
9.2 论文笔记模板
---
title: '论文标题'
description: 论文核心贡献的一句话总结
authors:
- name: 笔记作者
date: YYYY-MM-DD
---
## 论文信息
- **标题**:
- **作者**:
- **发表**:会议/期刊 + 年份
- **链接**:[arXiv](URL) | [PDF](URL)
## 核心贡献
## 方法概述
## 实验结果
## 个人思考
## 与团队工作的关联
9.3 实验记录模板
---
title: '实验名称'
description: 实验目标的一句话总结
authors:
- name: 实验者
date: YYYY-MM-DD
---
## 实验目标
## 实验设置
### 数据集
### 模型配置
### 超参数
## 实验结果
## 分析与结论
## 后续计划
9.4 会议纪要模板
---
title: 'YYYY-MM-DD 会议主题'
description: 会议核心议题总结
authors:
- name: 记录人
date: YYYY-MM-DD
---
## 会议信息
- **时间**:YYYY-MM-DD HH:MM
- **参与者**:
- **地点/链接**:
## 议题与讨论
### 议题 1
### 议题 2
## 决议事项
| 事项 | 负责人 | 截止日期 |
|------|-------|---------|
## 待办跟踪
9.5 架构决策记录(ADR)模板
---
title: 'ADR-NNN: 决策标题'
description: 决策的一句话总结
authors:
- name: 提议者
date: YYYY-MM-DD
---
## 状态
提议中 | 已采纳 | 已废弃 | 已替代
## 背景
什么情况下需要做这个决策?
## 决策
我们决定...
## 理由
为什么选择这个方案?考虑了哪些替代方案?
## 影响
这个决策带来什么后果?
10. 未来扩展规划
10.1 短期(v1.1)
| 功能 | 说明 | 优先级 |
|---|---|---|
| 静态部署 | nuxt generate 生成静态站点,部署至内部服务器 | P1 |
| CI 流水线 | Codeup CI 配置:自动 lint + 构建 + 部署 | P1 |
| 全文搜索优化 | Docus 内置搜索已支持,可优化中文分词 | P2 |
10.2 中期(v1.2)
| 功能 | 说明 | 优先级 |
|---|---|---|
| 国际化 (i18n) | Docus 原生支持多语言,按需启用 | P2 |
| 文档统计 | 页面字数、更新频率、贡献者排行 | P3 |
| 评论系统 | 集成 Giscus 或类似方案 | P3 |
10.3 长期(v2.0)
| 功能 | 说明 | 优先级 |
|---|---|---|
| AI 语义搜索 | 基于向量检索的智能问答 | P3 |
| 自动摘要 | AI 生成文档摘要与关联推荐 | P3 |
| 多仓库聚合 | 聚合多个项目文档到统一知识库 | P3 |
附录 A:为什么选择 Docus?
| 对比维度 | Docus v5 | VitePress | Docusaurus |
|---|---|---|---|
| 底层框架 | Nuxt 4 | Vite + Vue | React |
| 组件扩展 | MDC 语法 + 全部 Nuxt UI 组件 | Vue 组件 | React 组件 |
| 样式系统 | Tailwind CSS v4(开箱即用) | 自定义 CSS | CSS Modules |
| 实时预览 | HMR,< 1s | HMR | HMR |
| 中文支持 | 好 | 好 | 好 |
| 扩展为应用 | Nuxt 全栈能力 | 仅静态站 | 有限 |
| AI 集成 | 内置 AI 助手、llms.txt | 无 | 无 |
| 学习曲线 | 低(纯 Markdown 即可) | 低 | 中 |
选择理由:Docus 基于 Nuxt 生态,未来可无缝扩展为完整 Web 应用。MDC 语法和 Nuxt UI 组件提供丰富的文档表现力。内置 AI 集成符合团队 AI 方向。
附录 B:MDC 语法速查
<!-- 提示框 -->
::note
这是一条信息提示。
::
::tip
这是一条建议。
::
::warning
这是一条警告。
::
::caution
这是一条危险提示。
::
<!-- 代码组 -->
::code-group
```bash [pnpm]
pnpm install
npm
npm install
::
标题
卡片内容描述。
## 附录 C:常见问题
**Q: 可以用 npm 代替 pnpm 吗?**
A: 可以。所有 `package.json` scripts 兼容 npm。运行 `npm install` + `npm run dev` 即可。
**Q: 图片应该放在哪里?**
A: 放在 `public/images/{section}/` 目录下,在 Markdown 中用 `/images/{section}/{filename}.png` 引用。
**Q: 如何添加新的内容分类?**
A: 在 `content/` 下创建新目录(如 `7.new-section/`),添加 `_dir.yml` 设置标题和图标,Docus 会自动识别。
**Q: 能否离线使用?**
A: 可以。安装依赖后所有功能均在本地运行,不依赖外部服务。