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 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
- - 🤖 **4 个专业 Agent**:需求规划、代码开发、代码审查、文档同步
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/ # 4 个 Sub-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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jvibe",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
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": {
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/ (4 个 Sub-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'));
@@ -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
- - lockfiles
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
- - lockfiles
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
- - lockfiles
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 # allow git diff/status 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
- tags: [] # 仅允许以下标签
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` 不存在时,`first_session=false`
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
- - `needs_init`:未初始化或核心文档/功能清单缺失
118
- - `first_session`:`.jvibe-state.json.firstSessionAfterInit=true`
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
- - `needs_clarification` 为真时,仅允许输出该标签
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
- priority:
136
- - needs_init
137
- - needs_clarification
138
- - first_session
139
- - needs_plan
140
- - needs_todo
141
- - ready_to_start
142
- - in_progress
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
- action = first tag present in priority
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. 生成 tags
203
- 4. 按优先级选 action
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
- 标签:{tags}
544
+ 阶段:{phase}
545
+ 子状态:{substate}
511
546
 
512
547
  本轮任务:
513
548
  {简述执行的内容}
@@ -530,7 +565,8 @@ flags:
530
565
 
531
566
  当前状态:{action}
532
567
  当前模块:{模块名}
533
- 标签:{tags}
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
@@ -44,8 +44,9 @@
44
44
  JVibe 会自动:
45
45
  1. 调用 `planner` agent 分析需求、创建功能条目
46
46
  2. 调用 `developer` agent 实现代码
47
- 3. 调用 `reviewer` agent 审查代码
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/ # 4 个 Sub-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