jvibe 1.0.0

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.
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: JVibe:init
3
+ description: 初始化 JVibe 项目文档结构
4
+ ---
5
+
6
+ # /JVibe:init - 初始化 JVibe 项目文档
7
+
8
+ 你需要为新项目初始化完整的 JVibe 文档体系。
9
+
10
+ ## 任务
11
+
12
+ 1. **创建 docs 目录**(如果不存在)
13
+
14
+ 2. **创建 4 个核心文档**:
15
+
16
+ ### 规范文档.md
17
+
18
+ 基于模版-规范文档.md 创建,包含:
19
+ - 快速导航
20
+ - Project 文档注册表
21
+ - 开发流程说明
22
+ - 文档体系说明
23
+
24
+ ### 项目文档.md
25
+
26
+ 基于模板-项目文档.md 创建,包含:
27
+ - 项目概览
28
+ - 技术栈
29
+ - 项目结构
30
+ - 模块清单(初始为空)
31
+ - 模块功能统计表(初始为空)
32
+
33
+ ### 功能清单.md
34
+
35
+ 基于模板-功能清单.md 创建,包含:
36
+ - 文档说明
37
+ - 功能索引(初始为空)
38
+
39
+ ### 附加材料.md
40
+
41
+ 基于模板-附加材料.md 创建,包含:
42
+ - 使用方式与约定
43
+ - 8 个规范分类(编码规范、API规范、数据库规范等)
44
+ - Links 字典
45
+
46
+ ## 询问用户
47
+
48
+ 在创建文档前,询问用户以下信息(使用 AskUserQuestion):
49
+
50
+ ```yaml
51
+ questions:
52
+ - question: "项目名称是什么?"
53
+ header: "项目名称"
54
+ multiSelect: false
55
+ options:
56
+ - label: "自定义项目名"
57
+ description: "手动输入项目名称"
58
+
59
+ - question: "主要技术栈是什么?"
60
+ header: "技术栈"
61
+ multiSelect: true
62
+ 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: "手动指定其他技术栈"
77
+
78
+ - question: "是否需要创建初始模块?"
79
+ header: "初始模块"
80
+ multiSelect: true
81
+ options:
82
+ - label: "用户认证模块(AuthModule)"
83
+ description: "用户注册、登录、权限管理"
84
+ - label: "用户管理模块(UserModule)"
85
+ description: "用户信息、个人资料"
86
+ - label: "暂不创建"
87
+ description: "稍后手动添加模块"
88
+ ```
89
+
90
+ ## 执行步骤
91
+
92
+ 1. 创建 `docs/` 目录
93
+ 2. 从模板复制并填充项目信息:
94
+ - 项目名称
95
+ - 技术栈
96
+ - 初始模块(如果用户选择了)
97
+ 3. 创建 4 个核心文档
98
+ 4. 输出确认信息
99
+
100
+ ## 输出格式
101
+
102
+ ```
103
+ ✅ JVibe 项目文档初始化完成!
104
+
105
+ 已创建文档:
106
+ - docs/规范文档.md
107
+ - docs/项目文档.md
108
+ - docs/功能清单.md
109
+ - docs/附加材料.md
110
+
111
+ 项目信息:
112
+ - 项目名称:{项目名}
113
+ - 技术栈:{技术栈列表}
114
+ - 初始模块:{模块列表}
115
+
116
+ 下一步:
117
+ - 使用自然语言添加功能:"添加 XXX 功能"
118
+ - 查看项目状态:/JVibe:status
119
+ ```
120
+
121
+ ## 注意事项
122
+
123
+ 1. **不覆盖已存在的文档**:如果 docs/ 目录已存在文档,先询问用户是否覆盖
124
+ 2. **使用模板**:从项目根目录的 `模版-*.md` 和 `模板-*.md` 文件复制内容
125
+ 3. **填充占位符**:将模板中的占位符替换为用户提供的实际信息
@@ -0,0 +1,159 @@
1
+ ---
2
+ name: JVibe:pr
3
+ description: 生成标准化的 Pull Request 描述
4
+ ---
5
+
6
+ # /JVibe:pr - 生成 Pull Request 描述
7
+
8
+ 你需要生成符合 JVibe 规范的 PR 描述,包含变更总结、关联功能、命中规范清单和测试计划。
9
+
10
+ ## 任务
11
+
12
+ 调用 **reviewer Sub-Agent** 完成以下工作:
13
+
14
+ 1. **分析代码变更**
15
+ - 执行 `git diff` 获取变更内容
16
+ - 识别变更的文件和模块
17
+ - 分析变更类型(新功能/Bug修复/重构/文档等)
18
+
19
+ 2. **关联功能**
20
+ - 从功能清单中找到本次 PR 关联的功能编号(F-XXX)
21
+ - 列出相关的 TODO 项
22
+
23
+ 3. **规范检查**
24
+ - 读取附加材料中的规范条目
25
+ - 匹配本次变更命中的规范(CS-/API-/DB-/SEC-/TEST-等)
26
+ - 说明如何满足这些规范
27
+
28
+ 4. **生成 PR 描述**
29
+
30
+ ## PR 描述格式
31
+
32
+ ```markdown
33
+ ## Summary
34
+ - [变更点1:简要描述]
35
+ - [变更点2:简要描述]
36
+ - [变更点3:简要描述]
37
+
38
+ ## Related Features
39
+ - F-XXX: [功能名称]
40
+ - [相关 TODO 1]
41
+ - [相关 TODO 2]
42
+
43
+ ## Hit Specs
44
+ 本次变更涉及以下规范,已确认满足:
45
+
46
+ - [ ] **CS-001**: SOLID原则检查
47
+ - ✅ 每个类遵循单一职责原则
48
+ - ✅ 新增模块符合开闭原则
49
+
50
+ - [ ] **SEC-001**: SQL注入防范
51
+ - ✅ 使用参数化查询
52
+ - ✅ ORM 方式操作数据库
53
+
54
+ - [ ] **API-002**: 统一响应格式
55
+ - ✅ 所有 API 返回包含 code/message/data 字段
56
+
57
+ - [ ] **TEST-001**: 测试覆盖率要求
58
+ - ✅ 单元测试覆盖率 85%
59
+ - ✅ 核心模块测试覆盖率 92%
60
+
61
+ ## Test Plan
62
+ - [ ] 单元测试通过 (`npm test`)
63
+ - [ ] 集成测试通过
64
+ - [ ] 手动测试验证
65
+ - [ ] [测试场景1]
66
+ - [ ] [测试场景2]
67
+ - [ ] 代码审查通过
68
+
69
+ ## Breaking Changes
70
+ [如有破坏性变更,详细说明;否则写 "None"]
71
+
72
+ ## Screenshots (if applicable)
73
+ [如涉及 UI 变更,添加截图或 GIF]
74
+
75
+ ## Additional Notes
76
+ [其他需要说明的内容]
77
+ ```
78
+
79
+ ## 调用方式
80
+
81
+ ```yaml
82
+ # 主 Agent 调用 reviewer Sub-Agent
83
+ task: 生成 PR 描述
84
+ agent: reviewer
85
+ input:
86
+ - git diff 输出
87
+ - 功能清单
88
+ - 附加材料
89
+ output:
90
+ - 标准化的 PR 描述(Markdown 格式)
91
+ ```
92
+
93
+ ## 输出格式
94
+
95
+ 生成的 PR 描述应该可以**直接复制粘贴到 GitHub/GitLab**,无需手动修改。
96
+
97
+ 输出示例:
98
+
99
+ ```
100
+ ✅ PR 描述已生成!
101
+
102
+ ---
103
+ [以下内容可直接复制到 PR 描述框]
104
+
105
+ ## Summary
106
+ - 实现文件上传功能,支持图片和文档
107
+ - 添加图片缩略图自动生成
108
+ - 集成 S3 云存储
109
+
110
+ ## Related Features
111
+ - F-018: 文件上传
112
+ - ✅ 实现 POST /api/files 端点
113
+ - ✅ 文件类型和大小验证
114
+ - ✅ 图片缩略图生成
115
+ - ✅ S3 云存储集成
116
+ - ✅ 单元测试和集成测试
117
+
118
+ ## Hit Specs
119
+ 本次变更涉及以下规范,已确认满足:
120
+
121
+ - [ ] **CS-003**: 函数复杂度限制
122
+ - ✅ 所有函数圈复杂度 ≤ 8
123
+
124
+ - [ ] **SEC-001**: SQL注入防范
125
+ - ✅ 使用 Prisma ORM 参数化查询
126
+
127
+ - [ ] **SEC-003**: 敏感信息保护
128
+ - ✅ S3 密钥使用环境变量
129
+
130
+ - [ ] **TEST-001**: 测试覆盖率要求
131
+ - ✅ 单元测试覆盖率 88%
132
+
133
+ ## Test Plan
134
+ - [x] 单元测试通过
135
+ - [x] 集成测试通过
136
+ - [ ] 手动测试验证
137
+ - [ ] 上传图片文件(JPG, PNG)
138
+ - [ ] 上传文档文件(PDF, DOCX)
139
+ - [ ] 验证文件大小限制(50 MB)
140
+ - [ ] 验证缩略图生成
141
+ - [ ] 验证 S3 存储
142
+ - [ ] 代码审查通过
143
+
144
+ ## Breaking Changes
145
+ None
146
+
147
+ ## Screenshots
148
+ [待添加上传界面截图]
149
+
150
+ ---
151
+ ```
152
+
153
+ ## 注意事项
154
+
155
+ 1. **自动识别功能**:从 commit 信息和文件变更中识别关联的 F-XXX
156
+ 2. **规范匹配准确**:只列出真正命中的规范,不要无关的
157
+ 3. **测试计划具体**:测试项应该具体可执行,不是泛泛而谈
158
+ 4. **格式标准化**:严格遵循格式,便于团队统一
159
+ 5. **一键复制**:输出的内容应该可以直接使用,不需要手动调整
@@ -0,0 +1,160 @@
1
+ ---
2
+ name: JVibe:status
3
+ description: 快速查看项目功能状态和进度总览
4
+ ---
5
+
6
+ # /JVibe:status - 查看项目状态
7
+
8
+ 你需要快速展示项目的功能状态、进度统计和最近活跃情况。
9
+
10
+ ## 任务
11
+
12
+ 调用 **doc-sync Sub-Agent** 完成以下工作:
13
+
14
+ 1. **读取功能清单**
15
+ - 统计各状态功能数量(✅/🚧/❌)
16
+ - 计算总体完成率
17
+
18
+ 2. **按模块统计**
19
+ - 从项目文档读取模块列表
20
+ - 统计每个模块的功能数量和完成情况
21
+
22
+ 3. **识别关键信息**
23
+ - 最近开发中的功能
24
+ - 最近完成的功能
25
+ - 长期未开始的功能(如有)
26
+
27
+ ## 输出格式
28
+
29
+ ```
30
+ ========================================
31
+ 📊 JVibe 项目状态
32
+ ========================================
33
+
34
+ 项目:{项目名称}
35
+ 更新时间:{当前日期}
36
+
37
+ ----------------------------------------
38
+ 功能总览
39
+ ----------------------------------------
40
+ 总功能数: {总数}
41
+ ✅ 已完成: {已完成数} ({完成率}%)
42
+ 🚧 开发中: {开发中数}
43
+ ❌ 未开始: {未开始数}
44
+
45
+ ----------------------------------------
46
+ 模块统计
47
+ ----------------------------------------
48
+ AuthModule
49
+ 总数: 5 | ✅ 5 | 🚧 0 | ❌ 0 | 完成率: 100%
50
+
51
+ UserModule
52
+ 总数: 5 | ✅ 5 | 🚧 0 | ❌ 0 | 完成率: 100%
53
+
54
+ ChatModule
55
+ 总数: 10 | ✅ 7 | 🚧 2 | ❌ 1 | 完成率: 70%
56
+
57
+ ----------------------------------------
58
+ 🔨 开发中的功能
59
+ ----------------------------------------
60
+ 🚧 F-018: 文件上传
61
+ 🚧 F-019: 消息撤回
62
+
63
+ ----------------------------------------
64
+ ✅ 最近完成
65
+ ----------------------------------------
66
+ ✅ F-015: 用户头像上传
67
+ ✅ F-016: 在线状态显示
68
+ ✅ F-017: 消息已读回执
69
+
70
+ ========================================
71
+ ```
72
+
73
+ ## 可选:按优先级分组
74
+
75
+ 如果功能清单中标注了优先级(P0/P1/P2),可以额外展示:
76
+
77
+ ```
78
+ ----------------------------------------
79
+ ⚡ 高优先级功能 (P0)
80
+ ----------------------------------------
81
+ ✅ F-001: 用户注册
82
+ ✅ F-002: 用户登录
83
+ 🚧 F-018: 文件上传
84
+ ❌ F-020: 消息加密
85
+ ```
86
+
87
+ ## 可选:显示阻塞信息
88
+
89
+ 如果某些功能有依赖关系或被阻塞,可以提示:
90
+
91
+ ```
92
+ ----------------------------------------
93
+ ⚠️ 需要注意
94
+ ----------------------------------------
95
+ - F-020 (消息加密) 依赖 F-018 (文件上传) 完成
96
+ - F-021 (消息撤回) 已开发中超过 2 周
97
+ ```
98
+
99
+ ## 调用方式
100
+
101
+ ```yaml
102
+ # 主 Agent 调用 doc-sync Sub-Agent
103
+ task: 生成项目状态报告
104
+ agent: doc-sync
105
+ input:
106
+ - 功能清单
107
+ - 项目文档
108
+ output:
109
+ - 格式化的状态报告
110
+ ```
111
+
112
+ ## 简洁模式
113
+
114
+ 如果用户只需要简单统计,可以输出简洁版本:
115
+
116
+ ```
117
+ 📊 项目状态
118
+ 总数: 20 | ✅ 18 (90%) | 🚧 1 | ❌ 1
119
+
120
+ 🚧 开发中: F-018, F-019
121
+ ✅ 最近完成: F-015, F-016, F-017
122
+ ```
123
+
124
+ ## 详细模式
125
+
126
+ 如果用户需要详细信息,可以列出每个功能的 TODO 完成情况:
127
+
128
+ ```
129
+ ========================================
130
+ 📋 详细功能状态
131
+ ========================================
132
+
133
+ ChatModule
134
+
135
+ ✅ F-015: 用户头像上传
136
+ ✅ 8/8 TODO 已完成
137
+
138
+ 🚧 F-018: 文件上传
139
+ ✅ 6/9 TODO 已完成 (67%)
140
+ - ✅ 实现 POST /api/files 端点
141
+ - ✅ 文件类型验证
142
+ - ✅ 文件大小验证
143
+ - ✅ 图片缩略图生成
144
+ - ✅ S3 云存储集成
145
+ - ✅ 上传进度反馈
146
+ - ⏳ 单元测试
147
+ - ⏳ 集成测试
148
+ - ⏳ API文档更新
149
+
150
+ ❌ F-020: 消息加密
151
+ ⏳ 0/7 TODO 未开始
152
+ ```
153
+
154
+ ## 注意事项
155
+
156
+ 1. **数据准确**:统计数据必须与功能清单完全一致
157
+ 2. **格式美观**:使用表格或对齐的文本,易于阅读
158
+ 3. **重点突出**:用 emoji 和颜色(如果支持)突出关键信息
159
+ 4. **快速响应**:使用 haiku 模型,确保快速返回
160
+ 5. **可配置**:根据项目规模选择简洁或详细模式
@@ -0,0 +1,67 @@
1
+ #!/bin/bash
2
+ # ============================================================================
3
+ # load-context.sh - 会话开始时加载项目上下文
4
+ # ============================================================================
5
+ # 触发事件: SessionStart
6
+ # 用途: 在会话开始时输出项目关键信息,帮助 AI 快速了解项目状态
7
+ # ============================================================================
8
+
9
+ set -euo pipefail
10
+
11
+ # 项目根目录(相对于 .claude/hooks/)
12
+ PROJECT_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
13
+ DOCS_DIR="$PROJECT_ROOT/docs"
14
+
15
+ # 颜色定义
16
+ GREEN='\033[0;32m'
17
+ YELLOW='\033[1;33m'
18
+ BLUE='\033[0;34m'
19
+ NC='\033[0m' # No Color
20
+
21
+ echo -e "${BLUE}========================================${NC}"
22
+ echo -e "${BLUE} JVibe 项目上下文加载${NC}"
23
+ echo -e "${BLUE}========================================${NC}"
24
+
25
+ # 检查文档目录是否存在
26
+ if [[ ! -d "$DOCS_DIR" ]]; then
27
+ echo -e "${YELLOW}[提示] docs/ 目录不存在,跳过上下文加载${NC}"
28
+ exit 0
29
+ fi
30
+
31
+ # 检查功能清单是否存在
32
+ FEATURE_LIST="$DOCS_DIR/功能清单.md"
33
+ if [[ -f "$FEATURE_LIST" ]]; then
34
+ echo -e "\n${GREEN}📋 功能状态统计${NC}"
35
+ echo "----------------------------------------"
36
+
37
+ # 统计各状态数量
38
+ COMPLETED=$(grep -c "^## F-[0-9]* ✅" "$FEATURE_LIST" 2>/dev/null || echo "0")
39
+ IN_PROGRESS=$(grep -c "^## F-[0-9]* 🚧" "$FEATURE_LIST" 2>/dev/null || echo "0")
40
+ NOT_STARTED=$(grep -c "^## F-[0-9]* ❌" "$FEATURE_LIST" 2>/dev/null || echo "0")
41
+ TOTAL=$((COMPLETED + IN_PROGRESS + NOT_STARTED))
42
+
43
+ if [[ $TOTAL -gt 0 ]]; then
44
+ RATE=$((COMPLETED * 100 / TOTAL))
45
+ echo " ✅ 已完成: $COMPLETED"
46
+ echo " 🚧 开发中: $IN_PROGRESS"
47
+ echo " ❌ 未开始: $NOT_STARTED"
48
+ echo " 📊 完成率: $RATE%"
49
+ else
50
+ echo " 暂无功能条目"
51
+ fi
52
+
53
+ # 显示开发中的功能
54
+ if [[ $IN_PROGRESS -gt 0 ]]; then
55
+ echo -e "\n${YELLOW}🔨 当前开发中${NC}"
56
+ echo "----------------------------------------"
57
+ grep "^## F-[0-9]* 🚧" "$FEATURE_LIST" | sed 's/^## / /' || true
58
+ fi
59
+ else
60
+ echo -e "${YELLOW}[提示] 功能清单.md 不存在${NC}"
61
+ fi
62
+
63
+ echo -e "\n${BLUE}========================================${NC}"
64
+ echo -e "${BLUE} 上下文加载完成${NC}"
65
+ echo -e "${BLUE}========================================${NC}"
66
+
67
+ exit 0
@@ -0,0 +1,172 @@
1
+ #!/bin/bash
2
+ # ============================================================================
3
+ # sync-feature-status.sh - 自动推导功能状态
4
+ # ============================================================================
5
+ # 触发事件: PostToolUse (matcher: Edit|Write)
6
+ # 用途: 当功能清单被修改时,根据 TODO 完成情况自动推导功能状态
7
+ # ============================================================================
8
+ # 状态推导规则:
9
+ # - 0/N 完成 → ❌ 未开始
10
+ # - 1~(N-1)/N 完成 → 🚧 开发中
11
+ # - N/N 完成 → ✅ 已完成
12
+ # ============================================================================
13
+
14
+ set -euo pipefail
15
+
16
+ # 从 stdin 读取 hook 输入(JSON 格式)
17
+ INPUT=$(cat)
18
+
19
+ # 解析文件路径
20
+ FILE_PATH=$(echo "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"file_path"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/' || echo "")
21
+
22
+ # 只处理功能清单文件
23
+ if [[ "$FILE_PATH" != *"功能清单.md" ]]; then
24
+ exit 0
25
+ fi
26
+
27
+ # 检查文件是否存在
28
+ if [[ ! -f "$FILE_PATH" ]]; then
29
+ exit 0
30
+ fi
31
+
32
+ echo "[sync-feature-status] 检测到功能清单变更,开始同步状态..."
33
+
34
+ # 创建临时文件
35
+ TEMP_FILE=$(mktemp)
36
+ trap "rm -f $TEMP_FILE" EXIT
37
+
38
+ # 标记是否有状态变更
39
+ CHANGES_MADE=false
40
+
41
+ # 逐行处理文件
42
+ current_feature=""
43
+ current_status=""
44
+ todo_total=0
45
+ todo_completed=0
46
+
47
+ while IFS= read -r line || [[ -n "$line" ]]; do
48
+ # 检测功能标题行: ## F-XXX [状态] 功能名称
49
+ if [[ "$line" =~ ^##[[:space:]]+(F-[0-9]+)[[:space:]]+(✅|🚧|❌)[[:space:]]+(.+)$ ]]; then
50
+ # 处理上一个功能的状态(如果有)
51
+ if [[ -n "$current_feature" ]]; then
52
+ # 推导状态
53
+ if [[ $todo_total -eq 0 ]]; then
54
+ new_status="❌"
55
+ elif [[ $todo_completed -eq 0 ]]; then
56
+ new_status="❌"
57
+ elif [[ $todo_completed -eq $todo_total ]]; then
58
+ new_status="✅"
59
+ else
60
+ new_status="🚧"
61
+ fi
62
+
63
+ # 如果状态需要更新,记录变更
64
+ if [[ "$new_status" != "$current_status" ]]; then
65
+ echo "[sync-feature-status] $current_feature: $current_status → $new_status ($todo_completed/$todo_total)"
66
+ CHANGES_MADE=true
67
+ fi
68
+ fi
69
+
70
+ # 记录当前功能信息
71
+ current_feature="${BASH_REMATCH[1]}"
72
+ current_status="${BASH_REMATCH[2]}"
73
+ feature_name="${BASH_REMATCH[3]}"
74
+ todo_total=0
75
+ todo_completed=0
76
+
77
+ echo "$line" >> "$TEMP_FILE"
78
+
79
+ # 检测 TODO 项: - [ ] 或 - [x]
80
+ elif [[ "$line" =~ ^[[:space:]]*-[[:space:]]\[([ xX])\] ]]; then
81
+ ((todo_total++)) || true
82
+ if [[ "${BASH_REMATCH[1]}" =~ [xX] ]]; then
83
+ ((todo_completed++)) || true
84
+ fi
85
+ echo "$line" >> "$TEMP_FILE"
86
+
87
+ # 其他行直接输出
88
+ else
89
+ echo "$line" >> "$TEMP_FILE"
90
+ fi
91
+ done < "$FILE_PATH"
92
+
93
+ # 处理最后一个功能
94
+ if [[ -n "$current_feature" ]]; then
95
+ if [[ $todo_total -eq 0 ]]; then
96
+ new_status="❌"
97
+ elif [[ $todo_completed -eq 0 ]]; then
98
+ new_status="❌"
99
+ elif [[ $todo_completed -eq $todo_total ]]; then
100
+ new_status="✅"
101
+ else
102
+ new_status="🚧"
103
+ fi
104
+
105
+ if [[ "$new_status" != "$current_status" ]]; then
106
+ echo "[sync-feature-status] $current_feature: $current_status → $new_status ($todo_completed/$todo_total)"
107
+ CHANGES_MADE=true
108
+ fi
109
+ fi
110
+
111
+ # 如果有状态变更,更新文件
112
+ if [[ "$CHANGES_MADE" == "true" ]]; then
113
+ # 重新处理文件,这次真正更新状态
114
+ > "$TEMP_FILE"
115
+ current_feature=""
116
+ todo_total=0
117
+ todo_completed=0
118
+ in_todo_section=false
119
+
120
+ while IFS= read -r line || [[ -n "$line" ]]; do
121
+ # 检测功能标题行
122
+ if [[ "$line" =~ ^##[[:space:]]+(F-[0-9]+)[[:space:]]+(✅|🚧|❌)[[:space:]]+(.+)$ ]]; then
123
+ current_feature="${BASH_REMATCH[1]}"
124
+ current_status="${BASH_REMATCH[2]}"
125
+ feature_name="${BASH_REMATCH[3]}"
126
+ todo_total=0
127
+ todo_completed=0
128
+ in_todo_section=false
129
+
130
+ # 先扫描该功能的所有 TODO
131
+ temp_total=0
132
+ temp_completed=0
133
+ found_next=false
134
+ while IFS= read -r next_line; do
135
+ if [[ "$next_line" =~ ^##[[:space:]] ]]; then
136
+ break
137
+ fi
138
+ if [[ "$next_line" =~ ^[[:space:]]*-[[:space:]]\[([ xX])\] ]]; then
139
+ ((temp_total++)) || true
140
+ if [[ "${next_line}" =~ \[x\]|\[X\] ]]; then
141
+ ((temp_completed++)) || true
142
+ fi
143
+ fi
144
+ done
145
+
146
+ # 推导新状态
147
+ if [[ $temp_total -eq 0 ]]; then
148
+ new_status="❌"
149
+ elif [[ $temp_completed -eq 0 ]]; then
150
+ new_status="❌"
151
+ elif [[ $temp_completed -eq $temp_total ]]; then
152
+ new_status="✅"
153
+ else
154
+ new_status="🚧"
155
+ fi
156
+
157
+ # 输出更新后的标题行
158
+ echo "## $current_feature $new_status $feature_name" >> "$TEMP_FILE"
159
+ else
160
+ echo "$line" >> "$TEMP_FILE"
161
+ fi
162
+ done < "$FILE_PATH"
163
+
164
+ # 备份原文件并更新
165
+ cp "$FILE_PATH" "${FILE_PATH}.bak"
166
+ mv "$TEMP_FILE" "$FILE_PATH"
167
+ echo "[sync-feature-status] 状态同步完成"
168
+ else
169
+ echo "[sync-feature-status] 无状态变更"
170
+ fi
171
+
172
+ exit 0