jvibe 1.0.1 → 1.0.2

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "jvibe",
3
- "version": "1.0.1",
4
- "description": "文档驱动的 AI 辅助开发系统 - Doc-driven AI-assisted development system for Claude Code",
3
+ "version": "1.0.2",
4
+ "description": "\u6587\u6863\u9a71\u52a8\u7684 AI \u8f85\u52a9\u5f00\u53d1\u7cfb\u7edf - Doc-driven AI-assisted development system for Claude Code",
5
5
  "main": "bin/jvibe.js",
6
6
  "bin": {
7
7
  "jvibe": "bin/jvibe.js"
@@ -43,9 +43,11 @@ description: 初始化 JVibe 项目文档结构
43
43
  - 8 个规范分类(编码规范、API规范、数据库规范等)
44
44
  - Links 字典
45
45
 
46
- ## 询问用户
46
+ ## 询问流程(分阶段引导)
47
47
 
48
- 在创建文档前,询问用户以下信息(使用 AskUserQuestion):
48
+ 采用**引导式询问**,帮助用户梳理需求,而不是直接让用户做技术决策。
49
+
50
+ ### 第一阶段:基本信息
49
51
 
50
52
  ```yaml
51
53
  questions:
@@ -56,25 +58,62 @@ questions:
56
58
  - label: "自定义项目名"
57
59
  description: "手动输入项目名称"
58
60
 
59
- - question: "主要技术栈是什么?"
60
- header: "技术栈"
61
- multiSelect: true
61
+ - question: "你想做什么项目?请简单描述一下项目目标"
62
+ header: "项目描述"
63
+ multiSelect: false
62
64
  options:
63
- - label: "前端:React + TypeScript"
64
- description: "现代前端技术栈"
65
- - label: "前端:Vue 3 + TypeScript"
66
- description: "Vue 生态"
67
- - label: "后端:Node.js + Express"
68
- description: "轻量级后端"
69
- - label: "后端:Node.js + NestJS"
70
- description: "企业级后端框架"
71
- - label: "数据库:PostgreSQL"
72
- description: "关系型数据库"
73
- - label: "数据库:MongoDB"
74
- description: "文档数据库"
75
- - label: "其他"
76
- description: "手动指定其他技术栈"
65
+ - label: "Web 应用"
66
+ description: "网站、管理后台、在线平台等"
67
+ - label: "移动端应用"
68
+ description: "iOS/Android App、小程序等"
69
+ - label: "API 服务"
70
+ description: "后端接口、微服务等"
71
+ - label: "CLI 工具"
72
+ description: "命令行工具、自动化脚本等"
73
+ ```
74
+
75
+ ### 第二阶段:AI 分析并推荐技术栈
76
+
77
+ 根据用户在第一阶段的描述,**AI 主动分析并推荐合适的技术栈**:
78
+
79
+ 1. **分析用户需求**:
80
+ - 项目类型(Web/移动端/API/工具)
81
+ - 复杂度(简单/中等/复杂)
82
+ - 特殊需求(实时通信、大数据、AI 等)
83
+
84
+ 2. **生成推荐方案**:
85
+ ```
86
+ 基于你的项目描述,我推荐以下技术栈:
87
+
88
+ 📦 推荐方案:
89
+ - 前端:React + TypeScript + Tailwind CSS
90
+ - 后端:Node.js + Express
91
+ - 数据库:PostgreSQL
92
+
93
+ 💡 推荐理由:
94
+ - React 生态成熟,适合 xxx 场景
95
+ - PostgreSQL 支持 xxx 特性,适合你的需求
96
+ ```
97
+
98
+ 3. **让用户确认或调整**:
99
+ ```yaml
100
+ questions:
101
+ - question: "是否采用推荐的技术栈?"
102
+ header: "技术栈确认"
103
+ multiSelect: false
104
+ options:
105
+ - label: "采用推荐方案(推荐)"
106
+ description: "使用 AI 推荐的技术栈组合"
107
+ - label: "我要自己指定"
108
+ description: "手动选择或输入技术栈"
109
+ - label: "帮我调整一下"
110
+ description: "在推荐基础上做一些修改"
111
+ ```
112
+
113
+ ### 第三阶段:初始模块(可选)
77
114
 
115
+ ```yaml
116
+ questions:
78
117
  - question: "是否需要创建初始模块?"
79
118
  header: "初始模块"
80
119
  multiSelect: true
@@ -87,15 +126,40 @@ questions:
87
126
  description: "稍后手动添加模块"
88
127
  ```
89
128
 
129
+ ## 技术栈推荐规则
130
+
131
+ 根据项目类型,AI 应参考以下推荐规则:
132
+
133
+ | 项目类型 | 前端推荐 | 后端推荐 | 数据库推荐 |
134
+ |---------|---------|---------|-----------|
135
+ | 简单 Web 应用 | Vue 3 + TypeScript | Node.js + Express | SQLite / MongoDB |
136
+ | 复杂 Web 应用 | React + TypeScript | Node.js + NestJS | PostgreSQL |
137
+ | 管理后台 | React + Ant Design | Node.js + NestJS | PostgreSQL |
138
+ | 移动端 App | React Native | Node.js + Express | PostgreSQL |
139
+ | 小程序 | Taro / uni-app | Node.js + Express | MongoDB |
140
+ | API 服务 | - | Node.js + NestJS / Go | PostgreSQL |
141
+ | CLI 工具 | - | Node.js / Python | SQLite |
142
+ | 实时应用 | React + Socket.io | Node.js + Socket.io | Redis + PostgreSQL |
143
+
90
144
  ## 执行步骤
91
145
 
92
- 1. 创建 `docs/` 目录
93
- 2. 从模板复制并填充项目信息:
94
- - 项目名称
95
- - 技术栈
96
- - 初始模块(如果用户选择了)
97
- 3. 创建 4 个核心文档
98
- 4. 输出确认信息
146
+ 1. **第一阶段询问**:获取项目名称和项目描述
147
+ 2. **AI 分析**:根据描述推荐技术栈并说明理由
148
+ 3. **第二阶段询问**:让用户确认或调整技术栈
149
+ 4. **第三阶段询问**:初始模块选择
150
+ 5. 创建 `docs/` 目录
151
+ 6. 从模板复制并填充项目信息
152
+ 7. 创建 4 个核心文档
153
+ 8. **创建状态标记文件** `.jvibe-state.json`:
154
+ ```json
155
+ {
156
+ "initialized": true,
157
+ "firstSessionAfterInit": true,
158
+ "version": "1.0.0",
159
+ "createdAt": "2026-01-11T10:00:00Z"
160
+ }
161
+ ```
162
+ 9. 输出确认信息
99
163
 
100
164
  ## 输出格式
101
165
 
@@ -110,6 +174,7 @@ questions:
110
174
 
111
175
  项目信息:
112
176
  - 项目名称:{项目名}
177
+ - 项目类型:{Web 应用 / API 服务 / ...}
113
178
  - 技术栈:{技术栈列表}
114
179
  - 初始模块:{模块列表}
115
180
 
@@ -123,3 +188,5 @@ questions:
123
188
  1. **不覆盖已存在的文档**:如果 docs/ 目录已存在文档,先询问用户是否覆盖
124
189
  2. **使用模板**:从项目根目录的 `模版-*.md` 和 `模板-*.md` 文件复制内容
125
190
  3. **填充占位符**:将模板中的占位符替换为用户提供的实际信息
191
+ 4. **引导而非询问**:对于技术选择,AI 应主动分析并给出建议,而不是让用户自己做决定
192
+ 5. **允许直接指定**:如果用户在初始化时已经明确说了技术栈,跳过推荐环节,直接使用用户指定的
@@ -3,14 +3,20 @@
3
3
  # load-context.sh - 会话开始时加载项目上下文
4
4
  # ============================================================================
5
5
  # 触发事件: SessionStart
6
- # 用途: 在会话开始时输出项目关键信息,帮助 AI 快速了解项目状态
6
+ # 用途: 在会话开始时输出项目关键信息,帮助 AI 快速了解项目状态
7
+ # 版本: 2.0 - 支持状态标记机制
7
8
  # ============================================================================
8
9
 
9
10
  set -euo pipefail
10
11
 
11
12
  # 项目根目录(相对于 .claude/hooks/)
12
13
  PROJECT_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
13
- DOCS_DIR="$PROJECT_ROOT/docs"
14
+ if [[ -d "$PROJECT_ROOT/docs/core" ]]; then
15
+ DOCS_DIR="$PROJECT_ROOT/docs/core"
16
+ else
17
+ DOCS_DIR="$PROJECT_ROOT/docs"
18
+ fi
19
+ STATE_FILE="$PROJECT_ROOT/.jvibe-state.json"
14
20
 
15
21
  # 颜色定义
16
22
  GREEN='\033[0;32m'
@@ -18,17 +24,54 @@ YELLOW='\033[1;33m'
18
24
  BLUE='\033[0;34m'
19
25
  NC='\033[0m' # No Color
20
26
 
27
+ # 读取状态文件
28
+ read_state() {
29
+ if [[ -f "$STATE_FILE" ]]; then
30
+ cat "$STATE_FILE"
31
+ else
32
+ echo '{"initialized":false,"firstSessionAfterInit":false}'
33
+ fi
34
+ }
35
+
36
+ # 更新状态文件
37
+ update_state() {
38
+ local key=$1
39
+ local value=$2
40
+ local state=$(read_state)
41
+ echo "$state" | jq --arg key "$key" --arg value "$value" '.[$key] = ($value | fromjson)' > "$STATE_FILE"
42
+ }
43
+
44
+ # 检查是否已初始化
45
+ STATE=$(read_state)
46
+ INITIALIZED=$(echo "$STATE" | jq -r '.initialized // false')
47
+ FIRST_SESSION=$(echo "$STATE" | jq -r '.firstSessionAfterInit // false')
48
+
21
49
  echo -e "${BLUE}========================================${NC}"
22
50
  echo -e "${BLUE} JVibe 项目上下文加载${NC}"
23
51
  echo -e "${BLUE}========================================${NC}"
24
52
 
25
- # 检查文档目录是否存在
26
- if [[ ! -d "$DOCS_DIR" ]]; then
27
- echo -e "${YELLOW}[提示] docs/ 目录不存在,跳过上下文加载${NC}"
53
+ # 未初始化:简洁提示
54
+ if [[ "$INITIALIZED" == "false" ]]; then
55
+ echo -e "${YELLOW}[提示] 功能清单.md 不存在${NC}"
56
+ echo -e "\n${BLUE}========================================${NC}"
57
+ echo -e "${BLUE} 上下文加载完成${NC}"
58
+ echo -e "${BLUE}========================================${NC}"
28
59
  exit 0
29
60
  fi
30
61
 
31
- # 检查功能清单是否存在
62
+ # 首次会话:显示欢迎信息
63
+ if [[ "$FIRST_SESSION" == "true" ]]; then
64
+ echo -e "\n${GREEN}✅ JVibe 项目已初始化!${NC}"
65
+ echo "----------------------------------------"
66
+ echo " 使用自然语言添加功能"
67
+ echo " 使用 /JVibe:status 查看项目状态"
68
+ echo " 使用 /JVibe:pr 生成 PR 描述"
69
+
70
+ # 更新状态:标记为非首次会话
71
+ update_state "firstSessionAfterInit" "false"
72
+ fi
73
+
74
+ # 常规会话:显示功能统计(如果功能清单存在)
32
75
  FEATURE_LIST="$DOCS_DIR/功能清单.md"
33
76
  if [[ -f "$FEATURE_LIST" ]]; then
34
77
  echo -e "\n${GREEN}📋 功能状态统计${NC}"
@@ -56,8 +99,6 @@ if [[ -f "$FEATURE_LIST" ]]; then
56
99
  echo "----------------------------------------"
57
100
  grep "^## F-[0-9]* 🚧" "$FEATURE_LIST" | sed 's/^## / /' || true
58
101
  fi
59
- else
60
- echo -e "${YELLOW}[提示] 功能清单.md 不存在${NC}"
61
102
  fi
62
103
 
63
104
  echo -e "\n${BLUE}========================================${NC}"
@@ -20,7 +20,7 @@ INPUT=$(cat)
20
20
  FILE_PATH=$(echo "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"file_path"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/' || echo "")
21
21
 
22
22
  # 只处理功能清单文件
23
- if [[ "$FILE_PATH" != *"功能清单.md" ]]; then
23
+ if [[ "$FILE_PATH" != *"docs/core/功能清单.md" && "$FILE_PATH" != *"docs/功能清单.md" ]]; then
24
24
  exit 0
25
25
  fi
26
26
 
@@ -10,7 +10,11 @@ set -euo pipefail
10
10
 
11
11
  # 项目根目录(相对于 .claude/hooks/)
12
12
  PROJECT_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
13
- DOCS_DIR="$PROJECT_ROOT/docs"
13
+ if [[ -d "$PROJECT_ROOT/docs/core" ]]; then
14
+ DOCS_DIR="$PROJECT_ROOT/docs/core"
15
+ else
16
+ DOCS_DIR="$PROJECT_ROOT/docs"
17
+ fi
14
18
  FEATURE_LIST="$DOCS_DIR/功能清单.md"
15
19
 
16
20
  # 颜色定义
@@ -1,28 +1,17 @@
1
1
  # [项目名称] 功能清单
2
2
 
3
- ## 📌 文档说明
3
+ > 功能状态的唯一来源(SoT),记录每个功能的描述和实现TODO
4
4
 
5
- 本文档是**功能状态的唯一来源(SoT)**,详细描述每个功能的:
6
- 1. **功能描述** - 该功能是什么,解决什么问题
7
- 2. **实现TODO** - 具体的开发任务清单
5
+ **编号规则**: `F-XXX`(F = Feature,XXX = 三位数字)
8
6
 
9
- **功能状态总览**: 见 [项目文档](./项目文档.md) §5 统计表(按 sprint/里程碑从本文档推导)
10
-
11
- **编号规则**: F-XXX (F = Feature,XXX = 三位数字)
12
-
13
- ---
14
-
15
- ## 状态说明
16
-
17
- - ✅ **已完成**: 功能开发完成、测试通过、已合并到主分支
18
- - 🚧 **开发中**: 正在开发中,TODO未全部完成
19
- - ❌ **未开始**: 已规划但尚未开始开发
20
-
21
- > ⚠️ **重要**: 功能状态只在本文档维护,项目文档的统计数据由本文档推导。
7
+ **状态说明**:
8
+ - ✅ 已完成 - 开发完成、测试通过、已合并
9
+ - 🚧 开发中 - 正在开发,TODO未全部完成
10
+ - ❌ 未开始 - 已规划但未开始
22
11
 
23
12
  ---
24
13
 
25
- # AuthModule (认证模块)
14
+ # 示例模块(AuthModule
26
15
 
27
16
  ## F-001 ✅ 用户注册
28
17
 
@@ -36,232 +25,10 @@
36
25
  - [x] 单元测试(邮箱格式、密码强度、加密函数)
37
26
  - [x] 集成测试(注册流程、异常情况)
38
27
  - [x] API文档更新
39
- - [x] 数据库Schema文档更新
40
-
41
- ---
42
-
43
- ## F-002 ✅ 用户登录
44
-
45
- **描述**:已注册用户通过邮箱和密码登录系统,登录成功后获得访问令牌(Access Token)和刷新令牌(Refresh Token)。支持登录失败锁定机制。
46
-
47
- **TODO**
48
- - [x] 实现 POST /api/auth/login 端点
49
- - [x] 实现登录失败计数器(Redis存储,5次失败锁定15分钟)
50
- - [x] 实现auth_tokens表存储refreshToken
51
- - [x] 单元测试(密码验证、Token生成、失败计数)
52
- - [x] 集成测试(登录流程、失败场景、锁定机制)
53
- - [x] API文档更新
54
-
55
- ---
56
-
57
- ## F-003 ✅ Token刷新
58
-
59
- **描述**:当accessToken过期后,客户端可使用refreshToken获取新的accessToken,无需用户重新登录。
60
-
61
- **TODO**
62
- - [x] 实现 POST /api/auth/refresh 端点
63
- - [x] 验证refreshToken有效性
64
- - [x] 生成新的accessToken
65
- - [x] 单元测试和集成测试
66
- - [x] API文档更新
67
-
68
- ---
69
-
70
- ## F-004 ✅ 密码重置
71
-
72
- **描述**:用户忘记密码时,可通过邮箱接收重置密码链接,点击链接后设置新密码。重置成功后旧token全部失效。
73
-
74
- **TODO**
75
- - [x] 实现 POST /api/auth/forgot-password 端点
76
- - [x] 实现 POST /api/auth/reset-password 端点
77
- - [x] 生成重置token(JWT,有效期1小时)
78
- - [x] 发送重置密码邮件
79
- - [x] 更新密码并使旧token失效
80
- - [x] 单元测试和集成测试
81
- - [x] API文档更新
82
-
83
- ---
84
-
85
- ## F-005 ✅ 邮箱验证
86
-
87
- **描述**:用户注册后需要验证邮箱,验证成功后才能登录系统。支持重新发送验证邮件(1分钟内限制1次)。
88
-
89
- **TODO**
90
- - [x] 实现 GET /api/auth/verify/:token 端点
91
- - [x] 实现 POST /api/auth/resend-verification 端点
92
- - [x] 验证token有效性(24小时有效期)
93
- - [x] 更新email_verified字段
94
- - [x] 单元测试和集成测试
95
- - [x] API文档更新
96
-
97
- ---
98
-
99
- # UserModule (用户管理模块)
100
-
101
- ## F-006 ✅ 用户信息查询
102
-
103
- **描述**:查询用户的基本信息和资料。支持查询自己的完整信息和其他用户的公开信息。
104
-
105
- **TODO**
106
- - [x] 实现 GET /api/users/:id 端点
107
- - [x] 实现 GET /api/users/me 端点
108
- - [x] 权限验证(需登录)
109
- - [x] 区分公开信息和私密信息
110
- - [x] 单元测试和集成测试
111
- - [x] API文档更新
112
-
113
- ---
114
-
115
- ## F-007 ✅ 用户资料编辑
116
-
117
- **描述**:用户可以编辑自己的资料,包括昵称(2-20字符)、简介(0-200字符)等信息。只能编辑自己的资料。
118
-
119
- **TODO**
120
- - [x] 实现 PUT /api/users/:id 端点
121
- - [x] 请求体验证和字段长度验证
122
- - [x] 权限验证(只能编辑自己)
123
- - [x] 单元测试和集成测试
124
- - [x] API文档更新
125
-
126
- ---
127
-
128
- ## F-008 ✅ 头像上传
129
-
130
- **描述**:用户可以上传自己的头像图片,支持JPG、PNG格式(最大5MB),自动裁剪为正方形并生成200x200缩略图。
131
-
132
- **TODO**
133
- - [x] 实现 POST /api/users/:id/avatar 端点
134
- - [x] 文件上传处理(multer)
135
- - [x] 图片格式验证
136
- - [x] 图片压缩和裁剪(sharp)
137
- - [x] 上传到云存储(S3/OSS)
138
- - [x] 更新user_profiles.avatar_url
139
- - [x] 单元测试和集成测试
140
- - [x] API文档更新
141
-
142
- ---
143
-
144
- ## F-009 ✅ 用户搜索
145
-
146
- **描述**:通过关键词搜索用户,支持按昵称模糊搜索和按邮箱精确搜索,返回匹配的用户列表。支持分页(默认20条/页)。
147
-
148
- **TODO**
149
- - [x] 实现 GET /api/users/search 端点
150
- - [x] 查询参数验证(q, page, limit)
151
- - [x] 数据库模糊查询和分页逻辑
152
- - [x] 权限验证(需登录)
153
- - [x] 单元测试和集成测试
154
- - [x] API文档更新
155
-
156
- ---
157
-
158
- ## F-010 ✅ 用户权限管理
159
-
160
- **描述**:管理员可以设置用户的角色(user/admin),支持角色变更日志记录。防止自我提权。
161
-
162
- **TODO**
163
- - [x] 实现 PUT /api/users/:id/role 端点
164
- - [x] 权限验证(需admin角色)
165
- - [x] 防止自我提权
166
- - [x] 记录角色变更日志
167
- - [x] 单元测试和集成测试
168
- - [x] API文档更新
169
-
170
- ---
171
-
172
- # ChatModule (实时聊天模块)
173
-
174
- ## F-011 ✅ 创建聊天室
175
-
176
- **描述**:用户可以创建聊天室,邀请其他用户加入。支持一对一聊天(direct,2人)和群聊(group,3-100人)。
177
-
178
- **TODO**
179
- - [x] 实现 POST /api/chat/rooms 端点
180
- - [x] 聊天室类型验证(direct/group)
181
- - [x] 成员列表验证(名称长度1-50字符)
182
- - [x] 创建chat_rooms和room_members记录
183
- - [x] 单元测试和集成测试
184
- - [x] API文档更新
185
-
186
- ---
187
-
188
- ## F-012 ✅ 发送文本消息
189
-
190
- **描述**:用户在聊天室内发送文本消息,消息实时推送给其他在线成员。
191
-
192
- **TODO**
193
- - [x] 实现 POST /api/chat/messages 端点
194
- - [x] WebSocket消息广播逻辑
195
- - [x] 消息内容验证和存储
196
- - [x] 单元测试和集成测试
197
- - [x] API文档更新
198
28
 
199
29
  ---
200
30
 
201
- ## F-013 接收实时消息
202
-
203
- **描述**:用户通过WebSocket连接实时接收聊天室消息,支持断线重连和消息补发。
204
-
205
- **TODO**
206
- - [x] 实现WebSocket连接管理
207
- - [x] 实现消息推送逻辑
208
- - [x] 实现断线重连机制
209
- - [x] 实现消息补发逻辑
210
- - [x] 单元测试和集成测试
211
-
212
- ---
213
-
214
- ## F-014 ✅ 历史消息查询
215
-
216
- **描述**:查询聊天室的历史消息,支持分页加载(默认50条/页)和时间范围筛选。
217
-
218
- **TODO**
219
- - [x] 实现 GET /api/chat/messages/:roomId 端点
220
- - [x] 分页查询逻辑
221
- - [x] 时间范围筛选
222
- - [x] 权限验证(只能查询已加入的聊天室)
223
- - [x] 单元测试和集成测试
224
- - [x] API文档更新
225
-
226
- ---
227
-
228
- ## F-015 ✅ 在线状态显示
229
-
230
- **描述**:显示聊天室成员的在线状态(在线/离线/离开),通过WebSocket实时更新。
231
-
232
- **TODO**
233
- - [x] 实现在线状态管理(Redis存储)
234
- - [x] WebSocket在线状态广播
235
- - [x] 心跳检测机制
236
- - [x] 单元测试和集成测试
237
-
238
- ---
239
-
240
- ## F-016 ✅ 输入状态指示
241
-
242
- **描述**:显示其他用户正在输入的状态提示("XXX正在输入..."),3秒无输入后自动清除。
243
-
244
- **TODO**
245
- - [x] WebSocket输入状态事件监听
246
- - [x] 输入状态广播逻辑
247
- - [x] 自动清除机制(3秒超时)
248
- - [x] 单元测试和集成测试
249
-
250
- ---
251
-
252
- ## F-017 ✅ 消息通知
253
-
254
- **描述**:用户离线或未打开聊天室时,收到新消息的系统通知(桌面通知/推送通知)。
255
-
256
- **TODO**
257
- - [x] 实现桌面通知(Web Notification API)
258
- - [x] 实现推送通知服务集成
259
- - [x] 通知开关和权限管理
260
- - [x] 单元测试和集成测试
261
-
262
- ---
263
-
264
- ## F-018 🚧 文件分享
31
+ ## F-002 🚧 文件分享
265
32
 
266
33
  **描述**:用户可以在聊天室中分享文件(图片、文档、视频等),支持文件预览和下载。最大文件大小100MB。
267
34
 
@@ -277,7 +44,7 @@
277
44
 
278
45
  ---
279
46
 
280
- ## F-019 ❌ 消息搜索
47
+ ## F-003 ❌ 消息搜索
281
48
 
282
49
  **描述**:在聊天室或全局范围内搜索历史消息,支持关键词搜索和高级筛选(发送人、时间范围、文件类型)。
283
50
 
@@ -289,18 +56,3 @@
289
56
  - [ ] 权限验证(只搜索有权限的聊天室)
290
57
  - [ ] 单元测试和集成测试
291
58
  - [ ] API文档更新
292
-
293
- ---
294
-
295
- ## F-020 ❌ 消息已读状态
296
-
297
- **描述**:显示消息的已读状态,支持单聊的"已读/未读"标记和群聊的"X人已读"统计。
298
-
299
- **TODO**
300
- - [ ] 实现消息已读记录表(message_read_status)
301
- - [ ] 实现 PUT /api/chat/messages/:id/read 端点
302
- - [ ] WebSocket已读状态广播
303
- - [ ] 群聊已读人数统计
304
- - [ ] 未读消息计数功能
305
- - [ ] 单元测试和集成测试
306
- - [ ] API文档更新