jvibe 1.1.0 → 1.1.1
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 +2 -1
- package/README.md +3 -2
- package/package.json +1 -1
- package/scripts/init.js +1 -1
- package/scripts/validate.js +1 -1
- package/template/.claude/agents/developer.md +42 -3
- package/template/.claude/agents/doc-sync.md +8 -3
- package/template/.claude/agents/planner.md +13 -1
- package/template/.claude/agents/reviewer.md +3 -4
- package/template/.claude/agents/tester.md +226 -0
- package/template/.claude/commands/JVibe:keepgo.md +74 -38
- package/template/.claude/error-handling.md +60 -0
- package/template/.claude/permissions.yaml +134 -0
- package/template/README.md +5 -3
package/JVIBE.md
CHANGED
|
@@ -52,7 +52,7 @@ TODO 完成情况 → 功能状态
|
|
|
52
52
|
### 3. 开发流程
|
|
53
53
|
|
|
54
54
|
```
|
|
55
|
-
需求分析 → 功能拆解 → 技术设计 → 编码实现 → 代码审查 → 文档同步
|
|
55
|
+
需求分析 → 功能拆解 → 技术设计 → 编码实现 → 测试验证 → 代码审查 → 文档同步
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
## Agent 职责
|
|
@@ -61,6 +61,7 @@ TODO 完成情况 → 功能状态
|
|
|
61
61
|
|-------|------|----------|
|
|
62
62
|
| **planner** | 需求分析、功能拆解、创建 F-XXX 条目 | Feature-List.md |
|
|
63
63
|
| **developer** | 代码实现、逐项完成 TODO、勾选完成项 | Feature-List.md + 源代码 |
|
|
64
|
+
| **tester** | 测试执行、结果分析、回归验证 | 测试文件(仅在明确要求时) |
|
|
64
65
|
| **reviewer** | 代码审查、规范检查、PR 描述生成 | 只读 |
|
|
65
66
|
| **doc-sync** | 状态推导、统计更新、格式检查 | Project.md |
|
|
66
67
|
|
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
JVibe 是一个**文档驱动的 AI 辅助开发系统**,专为 Claude Code 设计。它提供:
|
|
13
13
|
|
|
14
|
-
- 🤖 **
|
|
14
|
+
- 🤖 **5 个专业 Agent**:需求规划、代码开发、测试验证、代码审查、文档同步
|
|
15
15
|
- 📝 **结构化文档体系**:CORE-DOCS(4个核心文档)+ PROJECT-DOCS(按需扩展)
|
|
16
16
|
- 🔄 **自动化 Hooks**:自动加载上下文、同步功能状态、输出统计信息
|
|
17
17
|
- 🎯 **单一事实来源**:功能状态只在功能清单中维护(SoT 原则)
|
|
@@ -91,7 +91,7 @@ jvibe init
|
|
|
91
91
|
```
|
|
92
92
|
your-project/
|
|
93
93
|
├── .claude/ # Claude Code 配置
|
|
94
|
-
│ ├── agents/ #
|
|
94
|
+
│ ├── agents/ # 5 个 Sub-Agents
|
|
95
95
|
│ ├── commands/ # 3 个 JVibe Skills
|
|
96
96
|
│ ├── hooks/ # 4 个自动化 Hooks
|
|
97
97
|
│ └── settings.json
|
|
@@ -146,6 +146,7 @@ TODO 完成情况 → 功能状态
|
|
|
146
146
|
|-------|------|------|
|
|
147
147
|
| **planner** | 需求分析、功能拆解 | Sonnet |
|
|
148
148
|
| **developer** | 代码实现、TODO 完成 | Sonnet |
|
|
149
|
+
| **tester** | 测试执行、结果分析 | Sonnet |
|
|
149
150
|
| **reviewer** | 代码审查、规范检查 | Sonnet |
|
|
150
151
|
| **doc-sync** | 状态推导、统计更新 | Haiku |
|
|
151
152
|
|
package/package.json
CHANGED
package/scripts/init.js
CHANGED
|
@@ -100,7 +100,7 @@ async function init(options = {}) {
|
|
|
100
100
|
console.log(chalk.green('\n✅ JVibe 初始化完成!\n'));
|
|
101
101
|
|
|
102
102
|
console.log(chalk.white('已创建:'));
|
|
103
|
-
console.log(chalk.gray(' - .claude/agents/ (
|
|
103
|
+
console.log(chalk.gray(' - .claude/agents/ (5 个 Sub-Agents)'));
|
|
104
104
|
console.log(chalk.gray(' - .claude/commands/ (3 个 JVibe Skills)'));
|
|
105
105
|
console.log(chalk.gray(' - .claude/hooks/ (3 个自动化 Hooks)'));
|
|
106
106
|
console.log(chalk.gray(' - .claude/settings.json'));
|
package/scripts/validate.js
CHANGED
|
@@ -39,7 +39,7 @@ async function validate() {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
// 检查 agents
|
|
42
|
-
const requiredAgents = ['planner.md', 'developer.md', 'reviewer.md', 'doc-sync.md'];
|
|
42
|
+
const requiredAgents = ['planner.md', 'developer.md', 'reviewer.md', 'doc-sync.md', 'tester.md'];
|
|
43
43
|
const agentsDir = path.join(claudeDir, 'agents');
|
|
44
44
|
if (await fs.pathExists(agentsDir)) {
|
|
45
45
|
for (const agent of requiredAgents) {
|
|
@@ -41,6 +41,7 @@ model: sonnet
|
|
|
41
41
|
## 约束(硬规则)
|
|
42
42
|
|
|
43
43
|
```yaml
|
|
44
|
+
source_of_truth: .claude/permissions.yaml
|
|
44
45
|
constraints:
|
|
45
46
|
read_allowlist:
|
|
46
47
|
- docs/**
|
|
@@ -57,7 +58,11 @@ constraints:
|
|
|
57
58
|
- .claude/**
|
|
58
59
|
- .jvibe-state.json
|
|
59
60
|
- package.json
|
|
60
|
-
-
|
|
61
|
+
- package-lock.json
|
|
62
|
+
- pnpm-lock.yaml
|
|
63
|
+
- yarn.lock
|
|
64
|
+
- Pipfile.lock
|
|
65
|
+
- poetry.lock
|
|
61
66
|
- .gitignore
|
|
62
67
|
ops:
|
|
63
68
|
network: forbidden
|
|
@@ -103,8 +108,22 @@ constraints:
|
|
|
103
108
|
### TODO 执行规则
|
|
104
109
|
|
|
105
110
|
1. **按顺序执行**:通常按 TODO 列表顺序
|
|
106
|
-
2.
|
|
107
|
-
3.
|
|
111
|
+
2. **尽量一次完成**:单次调用应尝试完成该功能的所有 TODO
|
|
112
|
+
3. **完成即勾选**:完成一个就勾选一个,不要积攒
|
|
113
|
+
4. **遇阻即报告**:无法完成时说明原因并停止
|
|
114
|
+
|
|
115
|
+
### 交接协议
|
|
116
|
+
|
|
117
|
+
```yaml
|
|
118
|
+
handoff_rules:
|
|
119
|
+
- when: todo_includes_test
|
|
120
|
+
target: tester
|
|
121
|
+
action: run_tests
|
|
122
|
+
payload:
|
|
123
|
+
feature: F-XXX
|
|
124
|
+
files: []
|
|
125
|
+
scope: unit|integration|e2e
|
|
126
|
+
```
|
|
108
127
|
|
|
109
128
|
### 勾选格式
|
|
110
129
|
|
|
@@ -136,6 +155,16 @@ update_requests: # 需要主 Agent 处理的更新
|
|
|
136
155
|
action: check_status
|
|
137
156
|
feature: F-XXX
|
|
138
157
|
reason: "TODO 全部完成,需要更新功能状态"
|
|
158
|
+
|
|
159
|
+
handoff:
|
|
160
|
+
target: tester
|
|
161
|
+
action: run_tests
|
|
162
|
+
payload:
|
|
163
|
+
feature: F-XXX
|
|
164
|
+
files:
|
|
165
|
+
- src/modules/auth/register.ts
|
|
166
|
+
- src/modules/auth/register.test.ts
|
|
167
|
+
scope: unit
|
|
139
168
|
```
|
|
140
169
|
|
|
141
170
|
## 示例
|
|
@@ -194,6 +223,16 @@ update_requests:
|
|
|
194
223
|
action: check_status
|
|
195
224
|
feature: F-018
|
|
196
225
|
reason: "所有 TODO 已完成,需要更新功能状态为 ✅"
|
|
226
|
+
|
|
227
|
+
handoff:
|
|
228
|
+
target: tester
|
|
229
|
+
action: run_tests
|
|
230
|
+
payload:
|
|
231
|
+
feature: F-018
|
|
232
|
+
files:
|
|
233
|
+
- src/modules/chat/thumbnail.service.ts
|
|
234
|
+
- src/modules/chat/file.test.ts
|
|
235
|
+
scope: integration
|
|
197
236
|
```
|
|
198
237
|
|
|
199
238
|
## 注意事项
|
|
@@ -14,7 +14,7 @@ model: haiku
|
|
|
14
14
|
1. **状态推导**:根据 TODO 完成情况推导功能状态
|
|
15
15
|
2. **统计更新**:更新项目文档中的统计表
|
|
16
16
|
3. **格式检查**:检查文档格式一致性
|
|
17
|
-
4. **Git
|
|
17
|
+
4. **Git 提交**:仅在用户明确要求或 keepgo `auto_commit=true` 时执行
|
|
18
18
|
|
|
19
19
|
## 权限范围
|
|
20
20
|
|
|
@@ -38,6 +38,7 @@ model: haiku
|
|
|
38
38
|
## 约束(硬规则)
|
|
39
39
|
|
|
40
40
|
```yaml
|
|
41
|
+
source_of_truth: .claude/permissions.yaml
|
|
41
42
|
constraints:
|
|
42
43
|
read_allowlist:
|
|
43
44
|
- docs/core/Feature-List.md
|
|
@@ -52,13 +53,17 @@ constraints:
|
|
|
52
53
|
- .claude/**
|
|
53
54
|
- .jvibe-state.json
|
|
54
55
|
- package.json
|
|
55
|
-
-
|
|
56
|
+
- package-lock.json
|
|
57
|
+
- pnpm-lock.yaml
|
|
58
|
+
- yarn.lock
|
|
59
|
+
- Pipfile.lock
|
|
60
|
+
- poetry.lock
|
|
56
61
|
- .gitignore
|
|
57
62
|
ops:
|
|
58
63
|
network: forbidden
|
|
59
64
|
install: forbidden
|
|
60
65
|
tests: forbidden
|
|
61
|
-
git: only_if_user_requested
|
|
66
|
+
git: only_if_user_requested # keepgo auto_commit=true counts as explicit request
|
|
62
67
|
```
|
|
63
68
|
|
|
64
69
|
## 状态推导规则
|
|
@@ -35,6 +35,7 @@ model: sonnet
|
|
|
35
35
|
## 约束(硬规则)
|
|
36
36
|
|
|
37
37
|
```yaml
|
|
38
|
+
source_of_truth: .claude/permissions.yaml
|
|
38
39
|
constraints:
|
|
39
40
|
read_allowlist:
|
|
40
41
|
- docs/**
|
|
@@ -46,7 +47,11 @@ constraints:
|
|
|
46
47
|
- .claude/**
|
|
47
48
|
- .jvibe-state.json
|
|
48
49
|
- package.json
|
|
49
|
-
-
|
|
50
|
+
- package-lock.json
|
|
51
|
+
- pnpm-lock.yaml
|
|
52
|
+
- yarn.lock
|
|
53
|
+
- Pipfile.lock
|
|
54
|
+
- poetry.lock
|
|
50
55
|
- .gitignore
|
|
51
56
|
ops:
|
|
52
57
|
network: forbidden
|
|
@@ -55,6 +60,13 @@ constraints:
|
|
|
55
60
|
git: forbidden
|
|
56
61
|
```
|
|
57
62
|
|
|
63
|
+
## 拒绝规划规则
|
|
64
|
+
|
|
65
|
+
当需求明显超出项目范围或违反约束时:
|
|
66
|
+
- 不写入 `Feature-List.md`
|
|
67
|
+
- 说明拒绝原因与可行替代方案
|
|
68
|
+
- 如可拆解,建议用户缩小范围后再规划
|
|
69
|
+
|
|
58
70
|
## 工作流程
|
|
59
71
|
|
|
60
72
|
```
|
|
@@ -38,6 +38,7 @@ model: sonnet
|
|
|
38
38
|
## 约束(硬规则)
|
|
39
39
|
|
|
40
40
|
```yaml
|
|
41
|
+
source_of_truth: .claude/permissions.yaml
|
|
41
42
|
constraints:
|
|
42
43
|
read_allowlist:
|
|
43
44
|
- docs/**
|
|
@@ -52,7 +53,7 @@ constraints:
|
|
|
52
53
|
network: forbidden
|
|
53
54
|
install: forbidden
|
|
54
55
|
tests: forbidden
|
|
55
|
-
git: read_only #
|
|
56
|
+
git: read_only # allowed: git diff, git status, git log --oneline, git show
|
|
56
57
|
```
|
|
57
58
|
|
|
58
59
|
## 工作流程
|
|
@@ -125,20 +126,18 @@ result:
|
|
|
125
126
|
summary: "审查通过/需要修改"
|
|
126
127
|
files_reviewed: 5
|
|
127
128
|
|
|
128
|
-
issues: #
|
|
129
|
+
issues: # 发现的问题(spec 可选,优先在 hit_specs 汇总)
|
|
129
130
|
- severity: error # error/warning/info
|
|
130
131
|
file: src/auth/login.ts
|
|
131
132
|
line: 42
|
|
132
133
|
message: "SQL 拼接存在注入风险"
|
|
133
134
|
suggestion: "使用参数化查询"
|
|
134
|
-
spec: SEC-001
|
|
135
135
|
|
|
136
136
|
- severity: warning
|
|
137
137
|
file: src/user/profile.ts
|
|
138
138
|
line: 78
|
|
139
139
|
message: "函数复杂度过高"
|
|
140
140
|
suggestion: "拆分为多个小函数"
|
|
141
|
-
spec: CS-003
|
|
142
141
|
|
|
143
142
|
hit_specs: # 命中的规范条目
|
|
144
143
|
- id: CS-001
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tester
|
|
3
|
+
description: 当用户需要测试验证、回归检查、失败排查时调用此 agent。适用于运行测试、分析测试结果、给出风险评估等场景。
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Tester Agent - 测试验证者
|
|
9
|
+
|
|
10
|
+
你是 JVibe 系统的**测试验证者**,专注于测试计划、测试执行与结果分析。
|
|
11
|
+
|
|
12
|
+
## 核心职责
|
|
13
|
+
|
|
14
|
+
1. **测试执行**:根据任务范围运行测试
|
|
15
|
+
2. **失败排查**:定位失败原因并给出修复建议
|
|
16
|
+
3. **风险评估**:指出测试缺口与潜在回归风险
|
|
17
|
+
|
|
18
|
+
## 上下文最小化原则
|
|
19
|
+
|
|
20
|
+
只读取与测试直接相关的文件与日志,避免加载无关上下文。
|
|
21
|
+
|
|
22
|
+
## 权限范围
|
|
23
|
+
|
|
24
|
+
### 可读
|
|
25
|
+
|
|
26
|
+
- `docs/core/Feature-List.md`
|
|
27
|
+
- `docs/core/Project.md`
|
|
28
|
+
- `docs/.jvibe/tasks.yaml`
|
|
29
|
+
- 任务相关模块代码与测试文件(由主 Agent 提供)
|
|
30
|
+
- lockfiles(package-lock.json / pnpm-lock.yaml / yarn.lock / Pipfile.lock / poetry.lock,只读)
|
|
31
|
+
|
|
32
|
+
### 可写(仅在主 Agent 明确要求时)
|
|
33
|
+
|
|
34
|
+
- 测试文件(与当前任务直接相关)
|
|
35
|
+
|
|
36
|
+
### 不可写
|
|
37
|
+
|
|
38
|
+
- `.claude/**`
|
|
39
|
+
- `docs/core/**`
|
|
40
|
+
- `docs/project/**`
|
|
41
|
+
- `.jvibe-state.json`
|
|
42
|
+
- `package.json`
|
|
43
|
+
- `lockfiles`(package-lock.json / pnpm-lock.yaml / yarn.lock / Pipfile.lock / poetry.lock)
|
|
44
|
+
|
|
45
|
+
## 约束(硬规则)
|
|
46
|
+
|
|
47
|
+
```yaml
|
|
48
|
+
source_of_truth: .claude/permissions.yaml
|
|
49
|
+
constraints:
|
|
50
|
+
read_allowlist:
|
|
51
|
+
- docs/core/Feature-List.md
|
|
52
|
+
- docs/core/Project.md
|
|
53
|
+
- docs/.jvibe/tasks.yaml
|
|
54
|
+
- <module_code_roots_from_task>
|
|
55
|
+
- <test_files_from_task>
|
|
56
|
+
write_allowlist: []
|
|
57
|
+
write_conditional:
|
|
58
|
+
- <test_files_from_task> # only if main agent explicitly instructs
|
|
59
|
+
write_forbidden:
|
|
60
|
+
- .claude/**
|
|
61
|
+
- docs/core/**
|
|
62
|
+
- docs/project/**
|
|
63
|
+
- .jvibe-state.json
|
|
64
|
+
- package.json
|
|
65
|
+
- package-lock.json
|
|
66
|
+
- pnpm-lock.yaml
|
|
67
|
+
- yarn.lock
|
|
68
|
+
- Pipfile.lock
|
|
69
|
+
- poetry.lock
|
|
70
|
+
ops:
|
|
71
|
+
network: forbidden
|
|
72
|
+
install: only_in_isolated_env
|
|
73
|
+
tests: allowed
|
|
74
|
+
git: forbidden
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 环境隔离规则
|
|
78
|
+
|
|
79
|
+
```yaml
|
|
80
|
+
tester_env:
|
|
81
|
+
python:
|
|
82
|
+
required: true
|
|
83
|
+
forbid: [base, global]
|
|
84
|
+
prefer: .venv
|
|
85
|
+
run: ".venv/bin/python -m pytest ..."
|
|
86
|
+
node:
|
|
87
|
+
required: true
|
|
88
|
+
install: "npm ci"
|
|
89
|
+
run: "npm test"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- 如果隔离环境不存在,先请求主 Agent 明确创建/激活方式
|
|
93
|
+
- 禁止在 base 环境中运行测试
|
|
94
|
+
|
|
95
|
+
## 测试选择规则
|
|
96
|
+
|
|
97
|
+
```yaml
|
|
98
|
+
test_selection:
|
|
99
|
+
- when: api_change
|
|
100
|
+
run: [unit, api_integration]
|
|
101
|
+
- when: db_schema_change
|
|
102
|
+
run: [migration_check, integration]
|
|
103
|
+
- when: ui_change
|
|
104
|
+
run: [e2e_or_smoke]
|
|
105
|
+
- when: no_tests_available
|
|
106
|
+
run: [manual_steps]
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 错误处理规则
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
error_policy:
|
|
113
|
+
- if: env_missing
|
|
114
|
+
action: ask_main_agent
|
|
115
|
+
message: "缺少隔离环境,请提供创建/激活方式"
|
|
116
|
+
- if: test_cmd_missing
|
|
117
|
+
action: report
|
|
118
|
+
message: "未找到测试命令,请补充脚本或约定命令"
|
|
119
|
+
- if: test_failure
|
|
120
|
+
action: capture
|
|
121
|
+
message: "记录首个失败用例与堆栈,给出最小修复方向"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 工作流程
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
1. 读取任务摘要与变更范围
|
|
128
|
+
2. 选择最小测试集(单测 / 集成 / e2e)
|
|
129
|
+
3. 运行测试并记录命令与环境
|
|
130
|
+
4. 归因失败原因,给出修复建议
|
|
131
|
+
5. 输出结构化测试报告
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## 输出格式
|
|
135
|
+
|
|
136
|
+
```yaml
|
|
137
|
+
result:
|
|
138
|
+
scope:
|
|
139
|
+
feature: F-XXX
|
|
140
|
+
files: []
|
|
141
|
+
tests_ran: []
|
|
142
|
+
env: ""
|
|
143
|
+
verdict: pass|fail|partial
|
|
144
|
+
failures:
|
|
145
|
+
- case: ""
|
|
146
|
+
reason: ""
|
|
147
|
+
confidence: low|medium|high
|
|
148
|
+
evidence:
|
|
149
|
+
command: ""
|
|
150
|
+
stdout_tail: ""
|
|
151
|
+
stderr_tail: ""
|
|
152
|
+
risks:
|
|
153
|
+
- ""
|
|
154
|
+
next_actions:
|
|
155
|
+
- ""
|
|
156
|
+
handoff:
|
|
157
|
+
target: main
|
|
158
|
+
action: update_status | request_fix | retry
|
|
159
|
+
feature: F-XXX
|
|
160
|
+
reason: ""
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## 交接协议
|
|
164
|
+
|
|
165
|
+
```yaml
|
|
166
|
+
handoff_rules:
|
|
167
|
+
- when: verdict == pass
|
|
168
|
+
target: main
|
|
169
|
+
action: update_status
|
|
170
|
+
- when: verdict == fail
|
|
171
|
+
target: main
|
|
172
|
+
action: request_fix
|
|
173
|
+
- when: verdict == partial
|
|
174
|
+
target: main
|
|
175
|
+
action: retry
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 示例
|
|
179
|
+
|
|
180
|
+
### 输入
|
|
181
|
+
|
|
182
|
+
```yaml
|
|
183
|
+
task:
|
|
184
|
+
feature: F-012
|
|
185
|
+
files:
|
|
186
|
+
- src/api/user.ts
|
|
187
|
+
- tests/user.test.ts
|
|
188
|
+
scope: api
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 输出
|
|
192
|
+
|
|
193
|
+
```yaml
|
|
194
|
+
result:
|
|
195
|
+
scope:
|
|
196
|
+
feature: F-012
|
|
197
|
+
files:
|
|
198
|
+
- src/api/user.ts
|
|
199
|
+
- tests/user.test.ts
|
|
200
|
+
tests_ran:
|
|
201
|
+
- ".venv/bin/python -m pytest tests/user.test.ts -q"
|
|
202
|
+
env: ".venv"
|
|
203
|
+
verdict: pass
|
|
204
|
+
failures: []
|
|
205
|
+
confidence: high
|
|
206
|
+
evidence:
|
|
207
|
+
command: ".venv/bin/python -m pytest tests/user.test.ts -q"
|
|
208
|
+
stdout_tail: "1 passed"
|
|
209
|
+
stderr_tail: ""
|
|
210
|
+
risks:
|
|
211
|
+
- "未覆盖异常分支"
|
|
212
|
+
next_actions:
|
|
213
|
+
- "补充异常路径单测"
|
|
214
|
+
handoff:
|
|
215
|
+
target: main
|
|
216
|
+
action: update_status
|
|
217
|
+
feature: F-012
|
|
218
|
+
reason: "测试通过"
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## 注意事项
|
|
222
|
+
|
|
223
|
+
1. **禁止改动核心文档**
|
|
224
|
+
2. **只跑必要测试**,避免全量回归浪费资源
|
|
225
|
+
3. **失败先定位**,不要直接给出过度修复建议
|
|
226
|
+
4. **输出必须结构化**
|
|
@@ -18,7 +18,8 @@ description: 自动继续推进项目任务,基于当前文档进度
|
|
|
18
18
|
- **主动推进**:不卡住等用户,自动执行下一步
|
|
19
19
|
- **阶段确认**:在关键节点请求用户确认
|
|
20
20
|
- **依赖感知**:按模块依赖顺序规划和开发
|
|
21
|
-
-
|
|
21
|
+
- **先规范化再决策**:先生成状态快照与 phase/substate,再执行动作
|
|
22
|
+
- **异常处理一致**:遵循 `.claude/error-handling.md`
|
|
22
23
|
|
|
23
24
|
---
|
|
24
25
|
|
|
@@ -79,7 +80,6 @@ keepgo 在以下阶段会暂停请求用户确认:
|
|
|
79
80
|
```yaml
|
|
80
81
|
state:
|
|
81
82
|
initialized: false
|
|
82
|
-
first_session: false
|
|
83
83
|
modules_order: [] # 从项目文档依赖关系推导的拓扑序
|
|
84
84
|
current_module: null # 按 modules_order 找到第一个未全部✅的模块
|
|
85
85
|
module_features: {} # { ModuleName: [F-001, F-002, ...] }
|
|
@@ -88,14 +88,16 @@ state:
|
|
|
88
88
|
completed: 0
|
|
89
89
|
in_progress: 0
|
|
90
90
|
not_started: 0
|
|
91
|
-
|
|
91
|
+
test_required_features: [] # TODO 中包含测试任务的功能
|
|
92
|
+
phase: init | planning | developing | reviewing
|
|
93
|
+
substate: needs_init | first_session | needs_plan | needs_todo | ready_to_start | in_progress | needs_test | feature_done | module_done | all_done
|
|
92
94
|
```
|
|
93
95
|
|
|
94
96
|
### 解析规则(严格、确定性)
|
|
95
97
|
|
|
96
98
|
1. **初始化判定**
|
|
97
99
|
- `initialized = exists(docs/core/Feature-List.md)`
|
|
98
|
-
- `.jvibe-state.json`
|
|
100
|
+
- `.jvibe-state.json.firstSessionAfterInit` 缺失时视为 `false`
|
|
99
101
|
2. **模块与依赖解析**
|
|
100
102
|
- 解析 `docs/core/Project.md` 的“模块清单”章节
|
|
101
103
|
- 模块名:取 `###` 标题中第一个空格或 `(` 之前的 token
|
|
@@ -108,50 +110,44 @@ state:
|
|
|
108
110
|
4. **功能条目解析**
|
|
109
111
|
- 功能条目行:`## F-XXX [✅/🚧/❌] 名称`
|
|
110
112
|
- TODO 项:`- [ ]` / `- [x]`
|
|
113
|
+
- 若 TODO 文本包含 `测试` 或 `test`(忽略大小写)→ 该功能加入 `test_required_features`
|
|
111
114
|
5. **当前模块**
|
|
112
115
|
- `current_module` = `modules_order` 中第一个存在未完成(非✅)功能的模块
|
|
113
116
|
- 若 `modules_order` 为空 → `needs_clarification`
|
|
114
117
|
|
|
115
|
-
###
|
|
118
|
+
### Phase / Substate 生成规则(简化版)
|
|
116
119
|
|
|
117
|
-
|
|
118
|
-
- `
|
|
119
|
-
- `needs_clarification`:文档缺失/解析失败/依赖不一致
|
|
120
|
-
- `needs_plan`:当前模块无任何功能条目(功能索引为空)
|
|
121
|
-
- `needs_todo`:当前模块存在功能条目但 TODO 列表为空
|
|
122
|
-
- `ready_to_start`:当前模块存在 ❌ 且无 🚧,且该功能有 TODO
|
|
123
|
-
- `in_progress`:存在至少一个 🚧,且该功能仍有未完成 TODO
|
|
124
|
-
- `feature_done`:本轮刚完成某 🚧 功能的最后一个 TODO
|
|
125
|
-
- `module_done`:当前模块所有功能为 ✅,且至少有一个功能
|
|
126
|
-
- `all_done`:所有模块的所有功能为 ✅,且总功能数 > 0
|
|
120
|
+
**优先级 1:异常处理**
|
|
121
|
+
- `needs_clarification` 为真时 → `phase=init`, `substate=needs_clarification`
|
|
127
122
|
|
|
128
|
-
|
|
129
|
-
- `needs_init`
|
|
130
|
-
- `
|
|
123
|
+
**优先级 2:初始化阶段**
|
|
124
|
+
- 未初始化或核心文档/功能清单缺失 → `phase=init`, `substate=needs_init`
|
|
125
|
+
- `.jvibe-state.json.firstSessionAfterInit=true` → `phase=init`, `substate=first_session`
|
|
131
126
|
|
|
132
|
-
|
|
127
|
+
**优先级 3:规划阶段**
|
|
128
|
+
- 当前模块无任何功能条目(功能索引为空) → `phase=planning`, `substate=needs_plan`
|
|
129
|
+
- 当前模块存在功能条目但 TODO 列表为空 → `phase=planning`, `substate=needs_todo`
|
|
133
130
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
- feature_done
|
|
144
|
-
- module_done
|
|
145
|
-
- all_done
|
|
131
|
+
**优先级 4:开发阶段**
|
|
132
|
+
- 当前模块存在 ❌ 且无 🚧,且该功能有 TODO → `phase=developing`, `substate=ready_to_start`
|
|
133
|
+
- 存在至少一个 🚧,且该功能仍有未完成 TODO → `phase=developing`, `substate=in_progress`
|
|
134
|
+
- 存在 🚧 功能且 TODO 全部完成,且该功能在 `test_required_features` → `phase=developing`, `substate=needs_test`
|
|
135
|
+
|
|
136
|
+
**优先级 5:审查阶段**
|
|
137
|
+
- 本轮刚完成某 🚧 功能的最后一个 TODO → `phase=reviewing`, `substate=feature_done`
|
|
138
|
+
- 当前模块所有功能为 ✅,且至少有一个功能 → `phase=reviewing`, `substate=module_done`
|
|
139
|
+
- 所有模块的所有功能为 ✅,且总功能数 > 0 → `phase=reviewing`, `substate=all_done`
|
|
146
140
|
|
|
147
|
-
|
|
141
|
+
**动作选择**:
|
|
142
|
+
```
|
|
143
|
+
action = substate
|
|
148
144
|
```
|
|
149
145
|
|
|
150
146
|
---
|
|
151
147
|
|
|
152
|
-
##
|
|
148
|
+
## 状态-动作映射表(基于 substate)
|
|
153
149
|
|
|
154
|
-
|
|
|
150
|
+
| Substate | 执行者 | 动作 |
|
|
155
151
|
|------|--------|------|
|
|
156
152
|
| `needs_init` | - | 提示 `/JVibe:init` |
|
|
157
153
|
| `needs_clarification` | 主 agent | 请求用户修正文档或确认处理方式 |
|
|
@@ -160,6 +156,7 @@ action = first tag present in priority
|
|
|
160
156
|
| `needs_todo` | **planner** | 创建 F-XXX 条目和 TODO |
|
|
161
157
|
| `ready_to_start` | **developer** | 执行当前功能的**全部 TODO**(按序) |
|
|
162
158
|
| `in_progress` | **developer** | 继续当前功能的**剩余 TODO**(按序) |
|
|
159
|
+
| `needs_test` | **tester** | 运行测试并输出结构化报告 |
|
|
163
160
|
| `feature_done` | 主 agent | 展示完成情况 → **请求确认** |
|
|
164
161
|
| `module_done` | 主 agent | 汇总 → **请求确认** → 下一模块 |
|
|
165
162
|
| `all_done` | - | 提示项目完成 |
|
|
@@ -176,6 +173,9 @@ dispatch_rules:
|
|
|
176
173
|
- when: action in [ready_to_start, in_progress]
|
|
177
174
|
must_call: developer
|
|
178
175
|
main_agent_write: forbidden
|
|
176
|
+
- when: action == needs_test
|
|
177
|
+
must_call: tester
|
|
178
|
+
main_agent_write: docs_only
|
|
179
179
|
- when: action in [needs_plan, feature_done, module_done, needs_clarification, needs_init, first_session, all_done]
|
|
180
180
|
must_call: none
|
|
181
181
|
main_agent_write: docs_only
|
|
@@ -191,6 +191,27 @@ enforcement:
|
|
|
191
191
|
|
|
192
192
|
---
|
|
193
193
|
|
|
194
|
+
## 交接协议(统一 payload)
|
|
195
|
+
|
|
196
|
+
```yaml
|
|
197
|
+
handoff:
|
|
198
|
+
target: tester | doc-sync | reviewer
|
|
199
|
+
action: run_tests | check_status | review
|
|
200
|
+
payload:
|
|
201
|
+
feature: F-XXX
|
|
202
|
+
files: []
|
|
203
|
+
scope: unit|integration|e2e
|
|
204
|
+
notes: ""
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**执行规则**:
|
|
208
|
+
- 如果 developer 返回 `handoff.target: tester` → 主 agent 必须调用 tester
|
|
209
|
+
- 如果 tester `result.verdict == pass` → 主 agent 更新功能状态为 ✅
|
|
210
|
+
- 如果 tester `result.verdict != pass` → 主 agent 回退到 developer 处理
|
|
211
|
+
- 如果 subagent 返回 `update_requests` → 主 agent 必须执行或询问用户确认后执行
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
194
215
|
## 执行流程详解
|
|
195
216
|
|
|
196
217
|
### 阶段 0:规范化状态(每次执行都必须)
|
|
@@ -199,8 +220,8 @@ enforcement:
|
|
|
199
220
|
动作:
|
|
200
221
|
1. 读取允许输入
|
|
201
222
|
2. 输出 state 快照
|
|
202
|
-
3. 生成
|
|
203
|
-
4.
|
|
223
|
+
3. 生成 phase / substate
|
|
224
|
+
4. action = substate
|
|
204
225
|
```
|
|
205
226
|
|
|
206
227
|
### action = needs_init
|
|
@@ -292,6 +313,18 @@ questions:
|
|
|
292
313
|
输出:完成了哪些 TODO,当前进度
|
|
293
314
|
```
|
|
294
315
|
|
|
316
|
+
### action = needs_test
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
执行者:tester agent
|
|
320
|
+
动作:
|
|
321
|
+
1. 基于 Feature-List 与 Project 提取测试范围
|
|
322
|
+
2. 使用隔离环境运行最小测试集
|
|
323
|
+
3. 输出结构化测试报告(含失败原因与风险)
|
|
324
|
+
4. 若测试通过,主 agent 将该功能状态更新为 ✅
|
|
325
|
+
输出:result
|
|
326
|
+
```
|
|
327
|
+
|
|
295
328
|
### action = feature_done
|
|
296
329
|
|
|
297
330
|
```
|
|
@@ -490,6 +523,7 @@ flags:
|
|
|
490
523
|
|
|
491
524
|
- 仅当 `auto_commit=true` 时允许提交
|
|
492
525
|
- 仅在**无待确认**且**有实际改动**时提交
|
|
526
|
+
- 提交动作由 **doc-sync** 执行,主 agent 负责触发
|
|
493
527
|
- 提交信息模板:
|
|
494
528
|
- `chore(jvibe): keepgo <action> <F-XXX?>`
|
|
495
529
|
- 无功能编号时省略 `<F-XXX?>`
|
|
@@ -507,7 +541,8 @@ flags:
|
|
|
507
541
|
|
|
508
542
|
当前状态:{action}
|
|
509
543
|
当前模块:{模块名}
|
|
510
|
-
|
|
544
|
+
阶段:{phase}
|
|
545
|
+
子状态:{substate}
|
|
511
546
|
|
|
512
547
|
本轮任务:
|
|
513
548
|
{简述执行的内容}
|
|
@@ -530,7 +565,8 @@ flags:
|
|
|
530
565
|
|
|
531
566
|
当前状态:{action}
|
|
532
567
|
当前模块:{模块名}
|
|
533
|
-
|
|
568
|
+
阶段:{phase}
|
|
569
|
+
子状态:{substate}
|
|
534
570
|
|
|
535
571
|
待确认内容:
|
|
536
572
|
{需要用户确认的内容}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# JVibe Error Handling
|
|
2
|
+
|
|
3
|
+
统一定义异常处理策略,避免静默失败或错误写入。
|
|
4
|
+
|
|
5
|
+
## 总原则
|
|
6
|
+
|
|
7
|
+
- 不确定即停止:无法解析或缺少上下文时不写文件
|
|
8
|
+
- 只重试一次:避免无限循环
|
|
9
|
+
- 保留证据:错误需记录关键信息(命令/日志/路径)
|
|
10
|
+
|
|
11
|
+
## 处理矩阵
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
error_handling:
|
|
15
|
+
subagent_timeout:
|
|
16
|
+
retry: 1
|
|
17
|
+
on_fail: ask_user_and_stop
|
|
18
|
+
invalid_output:
|
|
19
|
+
action: request_reformat_once
|
|
20
|
+
on_fail: ask_user_and_stop
|
|
21
|
+
parse_failure:
|
|
22
|
+
action: ask_user_with_context
|
|
23
|
+
write: forbidden
|
|
24
|
+
test_failure:
|
|
25
|
+
action: return_to_developer
|
|
26
|
+
update_status: blocked
|
|
27
|
+
env_missing:
|
|
28
|
+
action: ask_main_agent
|
|
29
|
+
write: forbidden
|
|
30
|
+
hook_failure:
|
|
31
|
+
action: warn_only
|
|
32
|
+
subagent_unavailable:
|
|
33
|
+
action: ask_user_and_stop
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 具体规则
|
|
37
|
+
|
|
38
|
+
1. **Subagent 超时**
|
|
39
|
+
- 重试 1 次
|
|
40
|
+
- 仍失败 → 请求用户确认下一步
|
|
41
|
+
|
|
42
|
+
2. **输出格式不符合**
|
|
43
|
+
- 要求一次重排
|
|
44
|
+
- 仍不符合 → 终止并提示用户
|
|
45
|
+
|
|
46
|
+
3. **文档解析失败**
|
|
47
|
+
- 不写任何文件
|
|
48
|
+
- 输出不一致点并请求用户修正
|
|
49
|
+
|
|
50
|
+
4. **测试失败**
|
|
51
|
+
- 不更新功能状态
|
|
52
|
+
- 返回失败用例与首个堆栈片段
|
|
53
|
+
- 交回 developer 处理
|
|
54
|
+
|
|
55
|
+
5. **环境缺失**
|
|
56
|
+
- 仅提示创建/激活方式
|
|
57
|
+
- 禁止自动安装依赖
|
|
58
|
+
|
|
59
|
+
6. **Hooks 报错**
|
|
60
|
+
- 仅警告,不阻塞主流程
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
agents:
|
|
3
|
+
planner:
|
|
4
|
+
read:
|
|
5
|
+
- docs/**
|
|
6
|
+
write:
|
|
7
|
+
- docs/core/Feature-List.md
|
|
8
|
+
conditional_write:
|
|
9
|
+
- path: docs/.jvibe/tasks.yaml
|
|
10
|
+
when: only_if_main_agent_instructs
|
|
11
|
+
write_forbidden:
|
|
12
|
+
- .claude/**
|
|
13
|
+
- .jvibe-state.json
|
|
14
|
+
- package.json
|
|
15
|
+
- package-lock.json
|
|
16
|
+
- pnpm-lock.yaml
|
|
17
|
+
- yarn.lock
|
|
18
|
+
- Pipfile.lock
|
|
19
|
+
- poetry.lock
|
|
20
|
+
- .gitignore
|
|
21
|
+
ops:
|
|
22
|
+
network: forbidden
|
|
23
|
+
install: forbidden
|
|
24
|
+
tests: forbidden
|
|
25
|
+
git: forbidden
|
|
26
|
+
|
|
27
|
+
developer:
|
|
28
|
+
read:
|
|
29
|
+
- docs/**
|
|
30
|
+
- <module_code_roots_from_task>
|
|
31
|
+
- <test_files_from_task>
|
|
32
|
+
write:
|
|
33
|
+
- docs/core/Feature-List.md
|
|
34
|
+
conditional_write:
|
|
35
|
+
- path: <module_code_roots_from_task>
|
|
36
|
+
when: only_if_in_task
|
|
37
|
+
- path: <test_files_from_task>
|
|
38
|
+
when: only_if_in_task
|
|
39
|
+
- path: docs/project/**
|
|
40
|
+
when: only_if_todo_requires
|
|
41
|
+
- path: docs/.jvibe/tasks.yaml
|
|
42
|
+
when: only_if_main_agent_instructs
|
|
43
|
+
write_forbidden:
|
|
44
|
+
- .claude/**
|
|
45
|
+
- .jvibe-state.json
|
|
46
|
+
- package.json
|
|
47
|
+
- package-lock.json
|
|
48
|
+
- pnpm-lock.yaml
|
|
49
|
+
- yarn.lock
|
|
50
|
+
- Pipfile.lock
|
|
51
|
+
- poetry.lock
|
|
52
|
+
- .gitignore
|
|
53
|
+
ops:
|
|
54
|
+
network: forbidden
|
|
55
|
+
install: forbidden
|
|
56
|
+
tests: only_if_user_requested
|
|
57
|
+
git: forbidden
|
|
58
|
+
|
|
59
|
+
tester:
|
|
60
|
+
read:
|
|
61
|
+
- docs/core/Feature-List.md
|
|
62
|
+
- docs/core/Project.md
|
|
63
|
+
- docs/.jvibe/tasks.yaml
|
|
64
|
+
- <module_code_roots_from_task>
|
|
65
|
+
- <test_files_from_task>
|
|
66
|
+
- package-lock.json
|
|
67
|
+
- pnpm-lock.yaml
|
|
68
|
+
- yarn.lock
|
|
69
|
+
- Pipfile.lock
|
|
70
|
+
- poetry.lock
|
|
71
|
+
write: []
|
|
72
|
+
conditional_write:
|
|
73
|
+
- path: <test_files_from_task>
|
|
74
|
+
when: only_if_main_agent_instructs
|
|
75
|
+
write_forbidden:
|
|
76
|
+
- .claude/**
|
|
77
|
+
- docs/core/**
|
|
78
|
+
- docs/project/**
|
|
79
|
+
- .jvibe-state.json
|
|
80
|
+
- package.json
|
|
81
|
+
- package-lock.json
|
|
82
|
+
- pnpm-lock.yaml
|
|
83
|
+
- yarn.lock
|
|
84
|
+
- Pipfile.lock
|
|
85
|
+
- poetry.lock
|
|
86
|
+
ops:
|
|
87
|
+
network: forbidden
|
|
88
|
+
install: only_in_isolated_env
|
|
89
|
+
tests: allowed
|
|
90
|
+
git: forbidden
|
|
91
|
+
|
|
92
|
+
reviewer:
|
|
93
|
+
read:
|
|
94
|
+
- docs/**
|
|
95
|
+
- src/**
|
|
96
|
+
- tests/**
|
|
97
|
+
- "**/*.test.*"
|
|
98
|
+
- "**/*.spec.*"
|
|
99
|
+
write: []
|
|
100
|
+
write_forbidden:
|
|
101
|
+
- "**/*"
|
|
102
|
+
ops:
|
|
103
|
+
network: forbidden
|
|
104
|
+
install: forbidden
|
|
105
|
+
tests: forbidden
|
|
106
|
+
git: read_only
|
|
107
|
+
|
|
108
|
+
doc-sync:
|
|
109
|
+
read:
|
|
110
|
+
- docs/core/Feature-List.md
|
|
111
|
+
- docs/core/Project.md
|
|
112
|
+
- docs/.jvibe/tasks.yaml
|
|
113
|
+
write:
|
|
114
|
+
- docs/core/Project.md
|
|
115
|
+
conditional_write:
|
|
116
|
+
- path: docs/core/Feature-List.md
|
|
117
|
+
when: only_if_explicitly_requested
|
|
118
|
+
- path: docs/.jvibe/tasks.yaml
|
|
119
|
+
when: only_if_explicitly_requested
|
|
120
|
+
write_forbidden:
|
|
121
|
+
- .claude/**
|
|
122
|
+
- .jvibe-state.json
|
|
123
|
+
- package.json
|
|
124
|
+
- package-lock.json
|
|
125
|
+
- pnpm-lock.yaml
|
|
126
|
+
- yarn.lock
|
|
127
|
+
- Pipfile.lock
|
|
128
|
+
- poetry.lock
|
|
129
|
+
- .gitignore
|
|
130
|
+
ops:
|
|
131
|
+
network: forbidden
|
|
132
|
+
install: forbidden
|
|
133
|
+
tests: forbidden
|
|
134
|
+
git: only_if_user_requested
|
package/template/README.md
CHANGED
|
@@ -44,8 +44,9 @@
|
|
|
44
44
|
JVibe 会自动:
|
|
45
45
|
1. 调用 `planner` agent 分析需求、创建功能条目
|
|
46
46
|
2. 调用 `developer` agent 实现代码
|
|
47
|
-
3. 调用 `
|
|
48
|
-
4.
|
|
47
|
+
3. 调用 `tester` agent 进行测试验证
|
|
48
|
+
4. 调用 `reviewer` agent 审查代码
|
|
49
|
+
5. 自动同步文档状态
|
|
49
50
|
|
|
50
51
|
---
|
|
51
52
|
|
|
@@ -54,9 +55,10 @@ JVibe 会自动:
|
|
|
54
55
|
```
|
|
55
56
|
your-project/
|
|
56
57
|
├── .claude/ # Claude Code 配置
|
|
57
|
-
│ ├── agents/ #
|
|
58
|
+
│ ├── agents/ # 5 个 Sub-Agents
|
|
58
59
|
│ │ ├── planner.md # 需求规划
|
|
59
60
|
│ │ ├── developer.md # 代码开发
|
|
61
|
+
│ │ ├── tester.md # 测试验证
|
|
60
62
|
│ │ ├── reviewer.md # 代码审查
|
|
61
63
|
│ │ └── doc-sync.md # 文档同步
|
|
62
64
|
│ ├── commands/ # 3 个 JVibe Skills
|