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.
- package/JVIBE.md +75 -0
- package/LICENSE +21 -0
- package/README.md +175 -0
- package/bin/jvibe.js +62 -0
- package/package.json +50 -0
- package/scripts/init.js +118 -0
- package/scripts/status.js +98 -0
- package/scripts/upgrade.js +103 -0
- package/scripts/validate.js +132 -0
- package/template/.claude/agents/developer.md +172 -0
- package/template/.claude/agents/doc-sync.md +247 -0
- package/template/.claude/agents/planner.md +410 -0
- package/template/.claude/agents/reviewer.md +237 -0
- package/template/.claude/commands/JVibe:init.md +125 -0
- package/template/.claude/commands/JVibe:pr.md +159 -0
- package/template/.claude/commands/JVibe:status.md +160 -0
- package/template/.claude/hooks/load-context.sh +67 -0
- package/template/.claude/hooks/sync-feature-status.sh +172 -0
- package/template/.claude/hooks/sync-stats.sh +104 -0
- package/template/.claude/settings.json +43 -0
- package/template/README.md +144 -0
- package/template/docs/core//345/212/237/350/203/275/346/270/205/345/215/225.md +306 -0
- package/template/docs/core//350/247/204/350/214/203/346/226/207/346/241/243.md +309 -0
- package/template/docs/core//351/231/204/345/212/240/346/235/220/346/226/231.md +423 -0
- package/template/docs/core//351/241/271/347/233/256/346/226/207/346/241/243.md +263 -0
- package/template/docs/project/.gitkeep +0 -0
- package/template/docs/project/README.md +83 -0
- package/template/docs/project/api.md.example +145 -0
- package/template/docs/project/database.md.example +172 -0
|
@@ -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
|