@hupan56/wlkj 3.3.0 → 3.3.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 +29 -29
- package/templates/.qoder/.runtime/hook-errors.log +4 -0
- package/templates/qoder/commands/optional/wl-status.md +2 -0
- package/templates/qoder/commands/wl-code.md +45 -10
- package/templates/qoder/commands/wl-init.md +129 -129
- package/templates/qoder/commands/wl-prd.md +27 -12
- package/templates/qoder/commands/wl-search.md +32 -0
- package/templates/qoder/commands/wl-task.md +8 -4
- package/templates/qoder/commands/wl-test.md +4 -0
- package/templates/qoder/hooks/post-tool-use.py +31 -1
- package/templates/qoder/hooks/pre-tool-use.py +136 -0
- package/templates/qoder/hooks/session-start.py +365 -365
- package/templates/qoder/scripts/capability/__pycache__/present_html.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/__pycache__/registry.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__init__.py +4 -4
- package/templates/qoder/scripts/capability/caps/__pycache__/__init__.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__pycache__/notify.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__pycache__/sandbox.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/notify.py +64 -0
- package/templates/qoder/scripts/capability/caps/sandbox.py +38 -0
- package/templates/qoder/scripts/capability/present_html.py +68 -0
- package/templates/qoder/scripts/capability/registry.py +6 -2
- package/templates/qoder/scripts/capability/registry_mcp.py +312 -314
- package/templates/qoder/scripts/domain/integration/__pycache__/return_to_platform.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/domain/integration/return_to_platform.py +394 -392
- package/templates/qoder/scripts/domain/integration/spec_upload.py +208 -209
- package/templates/qoder/scripts/domain/kg/switch_project.py +158 -159
- package/templates/qoder/scripts/engine/poller.py +219 -219
- package/templates/qoder/scripts/validation/metrics/__pycache__/present_board.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/validation/metrics/present_board.py +180 -0
- package/templates/qoder/settings.json +10 -0
- package/templates/qoder/scripts/domain/kg/extract/extract.py.bak +0 -430
package/package.json
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@hupan56/wlkj",
|
|
3
|
-
"version": "3.3.
|
|
4
|
-
"description": "AI Product R&D Workflow - PRD/Prototype/Search/Task/Report",
|
|
5
|
-
"bin": {
|
|
6
|
-
"wlkj": "bin/cli.js"
|
|
7
|
-
},
|
|
8
|
-
"files": [
|
|
9
|
-
"bin/",
|
|
10
|
-
"templates/",
|
|
11
|
-
"MAC-VERIFY.md"
|
|
12
|
-
],
|
|
13
|
-
"keywords": [
|
|
14
|
-
"workflow",
|
|
15
|
-
"ai",
|
|
16
|
-
"prd",
|
|
17
|
-
"pipeline",
|
|
18
|
-
"qoder",
|
|
19
|
-
"product",
|
|
20
|
-
"team"
|
|
21
|
-
],
|
|
22
|
-
"license": "MIT",
|
|
23
|
-
"publishConfig": {
|
|
24
|
-
"access": "public"
|
|
25
|
-
},
|
|
26
|
-
"engines": {
|
|
27
|
-
"node": ">=16"
|
|
28
|
-
}
|
|
29
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@hupan56/wlkj",
|
|
3
|
+
"version": "3.3.2",
|
|
4
|
+
"description": "AI Product R&D Workflow - PRD/Prototype/Search/Task/Report",
|
|
5
|
+
"bin": {
|
|
6
|
+
"wlkj": "bin/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"templates/",
|
|
11
|
+
"MAC-VERIFY.md"
|
|
12
|
+
],
|
|
13
|
+
"keywords": [
|
|
14
|
+
"workflow",
|
|
15
|
+
"ai",
|
|
16
|
+
"prd",
|
|
17
|
+
"pipeline",
|
|
18
|
+
"qoder",
|
|
19
|
+
"product",
|
|
20
|
+
"team"
|
|
21
|
+
],
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=16"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
[2026-07-15 11:55:41] pre-tool-use: stdin parse: Invalid \escape: line 1 column 50 (char 49)
|
|
2
|
+
[2026-07-15 11:55:42] pre-tool-use: stdin parse: Invalid \escape: line 1 column 51 (char 50)
|
|
3
|
+
[2026-07-15 11:55:42] pre-tool-use: stdin parse: Invalid \escape: line 1 column 50 (char 49)
|
|
4
|
+
[2026-07-15 11:55:42] pre-tool-use: stdin parse: Expecting value: line 1 column 1 (char 0)
|
|
@@ -42,6 +42,8 @@ AI 据此判断"这个功能完整吗?还缺什么?"
|
|
|
42
42
|
python -c "import json; d=json.load(open('$R/data/index/prd-features.json')); print(json.dumps(d,ensure_ascii=False,indent=2))"
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
+
🎨 **富展示**(功能画像卡 HTML):`$PY "$R/.qoder/scripts/validation/metrics/present_board.py" feature --feature <功能名> --project-id <UUID>`(端点+按钮+用例+页面+PRD 卡片,QoderWork 嵌入对话 / CLI 落盘 journal)
|
|
46
|
+
|
|
45
47
|
## Current Status (DEFAULT)
|
|
46
48
|
Show:
|
|
47
49
|
1. Active developer (from .qoder/.developer)
|
|
@@ -29,15 +29,24 @@ PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
|
|
|
29
29
|
| 文件知识标注 | **MCP code_context** | 实体/调用/影响1次拿 |
|
|
30
30
|
| 写代码 | **Qoder Write/Edit** | 原生编辑,精确行号 |
|
|
31
31
|
|
|
32
|
-
## 🔍 Ultra Review
|
|
33
|
-
|
|
34
|
-
>
|
|
35
|
-
>
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
## 🔍 Ultra Review(强制门禁 · 非建议)
|
|
33
|
+
|
|
34
|
+
> ⚠️ **代码写完必须过 Ultra Review 才能回流**(不再是"建议")。
|
|
35
|
+
> 这是 Step 4 自检之后的硬门禁:过→回流;不过→列问题修,重跑;无 Ultra Review→手动 checklist 降级。
|
|
36
|
+
|
|
37
|
+
### 强制流程(Step 4 自检后执行)
|
|
38
|
+
1. 自检 4 项全 ✓ 后,**立即调 Ultra Review Agent**(宿主原生能力)审查本次改动
|
|
39
|
+
2. **分支裁决**:
|
|
40
|
+
- ✅ **过** → 调 `submit_return` 回流 + `learn` 沉淀(见 Step 5 / 学习沉淀段)
|
|
41
|
+
- ❌ **不过** → 列出 Review 指出的问题(边界/性能/安全/规范),逐条修,**重跑 Ultra Review**,不过不回流
|
|
42
|
+
3. **降级**(宿主无 Ultra Review Agent):按下方手动 checklist 逐条过,全 ✓ 视同通过
|
|
43
|
+
|
|
44
|
+
### 手动 checklist 降级(无 Ultra Review 时)
|
|
45
|
+
- [ ] 边界条件:空值/越界/并发/大数量都处理了
|
|
46
|
+
- [ ] 性能:无 N+1 查询、无循环里调 DB、大数据量分页
|
|
47
|
+
- [ ] 安全:入参校验、权限校验、SQL 无拼接注入
|
|
48
|
+
- [ ] 异常路径:Spec 定义的异常场景都有对应处理
|
|
49
|
+
- [ ] 规范:与周围代码风格一致(命名/注释/分层)
|
|
41
50
|
|
|
42
51
|
## Step 1: Spec Gate(强制前置 · 非侵入式)
|
|
43
52
|
|
|
@@ -111,6 +120,10 @@ cap.mcp.call("update_task", {"task_id": X, "desc": summary + "\n本地spec: " +
|
|
|
111
120
|
```python
|
|
112
121
|
from capability import resolve
|
|
113
122
|
cap = resolve()
|
|
123
|
+
# ⓪ 有 REQ-ID/禅道号时查这需求的历史代码变更(code_changes 按需求号→改过哪些函数/hunk)
|
|
124
|
+
# 看这需求历史改过啥,避免重复改/沿用历史模式。与 code_history(按文件查) 互补。
|
|
125
|
+
if <有 REQ-ID 或禅道号>:
|
|
126
|
+
changes = cap.mcp.call("code_changes", {"project_id": "<项目UUID>", "req_key": "<REQ-ID或XQ/WT号>"})
|
|
114
127
|
# ① rag_search 语义召回:找和需求相关的函数/API/字段(词不必一样,召回最全)
|
|
115
128
|
rag = cap.mcp.call("rag_search", {"query": "<需求关键词或功能描述>", "top_k": 10})
|
|
116
129
|
# ② 需要精确找某个已知符号(如 handleExport)才用 search_code
|
|
@@ -123,7 +136,27 @@ impact = cap.mcp.call("get_impact", {
|
|
|
123
136
|
"entity": "<要改的核心符号: 如 handleExport / C:FlowOperationController>",
|
|
124
137
|
"depth": 2,
|
|
125
138
|
})
|
|
126
|
-
#
|
|
139
|
+
# ③a 改码前风险三件套(get_impact 看影响面 → risk_assessment 看风险等级 → code_history 看历史 → get_confidence 看证据置信)
|
|
140
|
+
# risk_assessment 返回 score/level(7项多证据:影响面/DB写/覆盖缺口/路径置信缺口/缺需求链路/历史不稳定/Agent变更);
|
|
141
|
+
# code_history 返回这文件/函数被哪些需求(XQ/WT)改过、改了什么(反向:代码→需求);
|
|
142
|
+
# get_confidence 返回路径置信度(0-1)+证据路径链。
|
|
143
|
+
# level=high/critical 或 confidence 低 → 先在回复里提示风险再动手。
|
|
144
|
+
risk = cap.mcp.call("risk_assessment", {"project_id": "<项目UUID>", "entity": "<核心符号>", "depth": 2})
|
|
145
|
+
history = cap.mcp.call("code_history", {"project_id": "<项目UUID>", "file_path": "<文件名或路径片段>"})
|
|
146
|
+
conf = cap.mcp.call("get_confidence", {"project_id": "<项目UUID>", "entity": "<核心符号>"})
|
|
147
|
+
# ③c 终极门禁裁决(合成 risk+coverage → block/warn/pass + 保形策略/alpha)
|
|
148
|
+
# gate.decision=block 须拦停问用户(高风险+裸改);warn 可放行带提示;pass 放心改
|
|
149
|
+
gate = cap.mcp.call("gate_check", {"project_id": "<项目UUID>", "entity": "<核心符号>"})
|
|
150
|
+
# 影响面大 / risk level≥high / confidence 低 / gate=block 时,先提示风险再动手(block 须拦停问用户)
|
|
151
|
+
# ③d 影响面大时多层并行审改动风险(宿主支持 Agent 并行 → 派 3 个 subagent 各审一层,合并风险清单):
|
|
152
|
+
# - 前端层:谁调用这个接口/符号?改动会不会破坏调用方?
|
|
153
|
+
# - 后端层:实现逻辑/事务/调用链是否自洽?
|
|
154
|
+
# - DB层:涉及表/字段改动是否波及别处(trace_dataflow 已追全链)?
|
|
155
|
+
# 不支持 Agent 并行 → 上面 risk_assessment 单点结果已够(串行降级)。
|
|
156
|
+
# ③e 门禁前知识新鲜度(改码前看知识层是否过期,过期数据不可信):
|
|
157
|
+
# check_freshness 返回模块 avg_age_days + 是否过期;过期(>threshold)→提示 refresh_knowledge 再动手
|
|
158
|
+
fresh = cap.mcp.call("check_freshness", {"module": "<核心模块>", "threshold_days": 30})
|
|
159
|
+
# fresh.verdict 含"过期" → 提示用户知识层陈旧,建议先 refresh_knowledge(跑构建脚本)再改码
|
|
127
160
|
# ③b 涉及字段改动(加列/改类型/表单字段):追字段全链路(表单→接口→Java字段→DB列),改一处看全链
|
|
128
161
|
if <涉及字段层>:
|
|
129
162
|
cap.mcp.call("trace_dataflow", {"field": "<字段名>"}) # 防"改了DB列没改对应Java字段/前端表单"
|
|
@@ -152,6 +185,8 @@ Follow the spec strictly:
|
|
|
152
185
|
3. Follow team conventions from data/code/ patterns
|
|
153
186
|
4. Write clean, commented code
|
|
154
187
|
|
|
188
|
+
> **宿主 sub-agent 激活**:QoderWork 支持 sub-agent 时,dispatch 到 **`qoder-coder`** agent(`.qoder/agents/qoder-coder.toml`)——它内置 Spec 契约实现规范(数据层 Entity→Mapper→Service→Controller / 接口层 RESTful+校验+统一返回 / 异常按 Spec),递归守卫不二次 spawn。dispatch prompt 首行传 `Active Spec: <spec路径>`。不支持 sub-agent 时按上面 4 步手动实现。
|
|
189
|
+
|
|
155
190
|
## Step 4: Self-Check
|
|
156
191
|
|
|
157
192
|
After implementation:
|
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: wl-init
|
|
3
|
-
description: "初始化/切换开发者身份 + 环境体检。Initialize/switch developer identity + environment health check. "
|
|
4
|
-
argument-hint: "[name] [role]"
|
|
5
|
-
auto-approve: true
|
|
6
|
-
allowed-tools: [Read, Glob, Grep, Bash, Write, Edit]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# /wl-init - One-stop Init (Developer + Environment Doctor)
|
|
10
|
-
|
|
11
|
-
Usage:
|
|
12
|
-
/wl-init - 体检环境 + 显示状态
|
|
13
|
-
/wl-init 小王 - 切换/注册开发者 + 体检 + 自动修复
|
|
14
|
-
/wl-init 小王 pm - 注册新开发者(带角色) + 体检 + 自动修复
|
|
15
|
-
|
|
16
|
-
## 🔧 环境自检(QoderWork 桌面端 vs Qoder IDE/CLI)
|
|
17
|
-
|
|
18
|
-
**先确定仓库根 R**(QoderWork 桌面端工作目录不是仓库根,相对路径会失效):
|
|
19
|
-
```bash
|
|
20
|
-
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
21
|
-
PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
|
|
22
|
-
```
|
|
23
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。后续脚本统一用 `$PY "$R/.qoder/scripts/orchestration/wlkj.py" <命令>`。
|
|
24
|
-
|
|
25
|
-
## Engine: init_doctor.py (幂等, 增量, 永不重头再来)
|
|
26
|
-
|
|
27
|
-
> **鲁棒性保证**:doctor 每项检查独立,**单项失败不阻塞其它项**;无 git 时优雅降级(团队同步/克隆禁用,但本地 PRD/搜索/任务/报告仍可用)。
|
|
28
|
-
> **退出码**:`0` = 全部健康,`1` = 有未解决问题(`--fix` 能修的已自动修)。AI 据此判断"是否可直接开工"。
|
|
29
|
-
|
|
30
|
-
### Case 1: /wl-init (no arguments)
|
|
31
|
-
```bash
|
|
32
|
-
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor
|
|
33
|
-
```
|
|
34
|
-
Report the doctor's findings to the user in friendly language.
|
|
35
|
-
If it found fixable issues, ask: "发现 N 个问题,要我自动修复吗?"
|
|
36
|
-
then run with --fix.
|
|
37
|
-
|
|
38
|
-
### Case 2/3: /wl-init 小王 [pm]
|
|
39
|
-
```bash
|
|
40
|
-
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor --fix 小王 [pm]
|
|
41
|
-
```
|
|
42
|
-
This single command does ALL of:
|
|
43
|
-
1. 注册/切换开发者 (.qoder/.developer, key=value 格式) + 个人空间目录
|
|
44
|
-
2. 拉取团队最新 (team_sync pull - 拿到别人的 PRD 和最新知识图谱)
|
|
45
|
-
3. 克隆缺失的源码仓库 (按 config.yaml git_sync.projects)
|
|
46
|
-
4. 知识图谱: 7天内新鲜->跳过 / 过期->增量同步 / 缺失->全量构建(仅首次)
|
|
47
|
-
5. 校验风格约束文件 + PRD 模板
|
|
48
|
-
6. 检查周五自动构建状态, 给出本系统的设置命令
|
|
49
|
-
|
|
50
|
-
After doctor finishes:
|
|
51
|
-
- init_developer auto-registers identity (member.json + signing key)
|
|
52
|
-
- No separate "team.py add" needed anymore
|
|
53
|
-
|
|
54
|
-
## Incremental Guarantee (为什么不会重头再来)
|
|
55
|
-
|
|
56
|
-
| 状态 | 行为 |
|
|
57
|
-
|------|------|
|
|
58
|
-
| 本周已 init 过 / 周五任务跑过 | 索引新鲜(≤7天) -> 全部跳过, 秒级完成 |
|
|
59
|
-
| 周五任务没跑/失效 | 索引过期 -> git diff 增量更新, 只处理变更文件 |
|
|
60
|
-
|
|
61
|
-
## 🔗 平台项目绑定(60 人各用各的项目)
|
|
62
|
-
|
|
63
|
-
**每个开发者绑定自己的项目。** `/wl-init` 时选择 → 拉 token → 写 mcp_config.json。
|
|
64
|
-
**切换项目 = 重跑 `/wl-init` 选另一个。** 60 人各自选自己的项目,token 绑定到项目,知识层自动隔离。
|
|
65
|
-
|
|
66
|
-
### 已绑定?(探测多宿主路径)
|
|
67
|
-
```bash
|
|
68
|
-
grep -l WLKJ_PROJECT_ID "$R
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### 未绑定或要切换?一行命令:
|
|
72
|
-
```bash
|
|
73
|
-
$PY "$R/.qoder/scripts/domain/kg/switch_project.py"
|
|
74
|
-
```
|
|
75
|
-
脚本会:
|
|
76
|
-
1. 问邮箱+密码(或用 --email/--pw 参数)
|
|
77
|
-
2. 连平台 `POST /api/auth/bind` 拉项目列表
|
|
78
|
-
3. 列出你的所有项目,选一个
|
|
79
|
-
4. 自动写 mcp_config.json(含该项目的 token + project_id)
|
|
80
|
-
|
|
81
|
-
非交互模式(CI/自动化):
|
|
82
|
-
```bash
|
|
83
|
-
$PY "$R/.qoder/scripts/domain/kg/switch_project.py" --email a@b.c --pw xxx --project-uuid <UUID>
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
**之后所有命令自动用该项目的知识层、token、回流地址。不同人选不同项目 = 完全隔离。**
|
|
87
|
-
| 全新机器 | 克隆仓库 + 全量构建一次, 之后永远增量 |
|
|
88
|
-
| 团队其他人已更新图谱 | team_sync pull 直接拿到, 本机不用构建 |
|
|
89
|
-
|
|
90
|
-
## .developer File Format (MANDATORY)
|
|
91
|
-
|
|
92
|
-
ALWAYS write `.qoder/.developer` in key=value format:
|
|
93
|
-
```
|
|
94
|
-
name=小王
|
|
95
|
-
role=pm
|
|
96
|
-
initialized_at=2026-06-12T10:00:00
|
|
97
|
-
```
|
|
98
|
-
Do NOT use `name: value` style. (Parsers accept both for legacy files,
|
|
99
|
-
but new writes must use `=`.)
|
|
100
|
-
|
|
101
|
-
## Git Author Check
|
|
102
|
-
|
|
103
|
-
The doctor reports if `git config user.name` differs from the developer
|
|
104
|
-
name (it breaks /wl-report's commit statistics). If the user agrees,
|
|
105
|
-
run: `git config user.name {name}`. Do not change it without confirmation.
|
|
106
|
-
|
|
107
|
-
## Status Display
|
|
108
|
-
After any operation, show:
|
|
109
|
-
```
|
|
110
|
-
Developer: 小王 (pm)
|
|
111
|
-
Team: 3 members (1 PM, 2 Dev)
|
|
112
|
-
Active tasks: 2 (1 in progress, 1 draft)
|
|
113
|
-
知识图谱: 2 天前更新 (新鲜)
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
## Safety Rules
|
|
117
|
-
- NEVER delete workspace/ content
|
|
118
|
-
- NEVER overwrite member.json or task.json
|
|
119
|
-
- Full index build ONLY when index is completely missing (doctor handles this)
|
|
120
|
-
|
|
121
|
-
## 产品常踩的坑(遇到时这样解释,别让产品卡住)
|
|
122
|
-
|
|
123
|
-
| 现象 | 原因 | 怎么说 / 怎么办 |
|
|
124
|
-
|------|------|----------------|
|
|
125
|
-
| `/wl-init --fix` 卡在第 4 项几分钟 | 正在 clone 大源码仓库(fywl-ics 8973 文件) | 告诉用户"首次克隆大仓库要几分钟,属正常,耐心等"。clone 失败(网络/权限)只影响"搜索真实代码",本地 PRD/任务/报告不受影响 |
|
|
126
|
-
| 搜代码总返回 0 结果 / 生成原型字段全空 | `config.yaml` 的 `platforms.{xx}.project` 写的项目名在 `data/code/` 下不存在(管理员改了 git_sync URL 忘改 platforms) | doctor 第 4 项会报 `platforms.X.project = '...' 但无此目录`。让管理员核对 config.yaml 的 platforms 映射 |
|
|
127
|
-
| `git user.name` 与开发者名不一致警告 | 影响后续 /wl-report 统计 + push 门禁 | doctor 已自动用 `--fix` 修正本仓库 git config。用户未带 `--fix` 时提示重跑 |
|
|
128
|
-
| 没装 git | doctor 第 1 项报 WARN | 不阻塞:本地 PRD/搜索/任务/报告仍可用,只有团队同步/克隆禁用 |
|
|
129
|
-
| 搜出来的代码是旧的 | 知识图谱 >7 天未更新 | doctor 第 5 项会增量同步,`--fix` 自动跑 |
|
|
1
|
+
---
|
|
2
|
+
name: wl-init
|
|
3
|
+
description: "初始化/切换开发者身份 + 环境体检。Initialize/switch developer identity + environment health check. "
|
|
4
|
+
argument-hint: "[name] [role]"
|
|
5
|
+
auto-approve: true
|
|
6
|
+
allowed-tools: [Read, Glob, Grep, Bash, Write, Edit]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# /wl-init - One-stop Init (Developer + Environment Doctor)
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
/wl-init - 体检环境 + 显示状态
|
|
13
|
+
/wl-init 小王 - 切换/注册开发者 + 体检 + 自动修复
|
|
14
|
+
/wl-init 小王 pm - 注册新开发者(带角色) + 体检 + 自动修复
|
|
15
|
+
|
|
16
|
+
## 🔧 环境自检(QoderWork 桌面端 vs Qoder IDE/CLI)
|
|
17
|
+
|
|
18
|
+
**先确定仓库根 R**(QoderWork 桌面端工作目录不是仓库根,相对路径会失效):
|
|
19
|
+
```bash
|
|
20
|
+
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
21
|
+
PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
|
|
22
|
+
```
|
|
23
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。后续脚本统一用 `$PY "$R/.qoder/scripts/orchestration/wlkj.py" <命令>`。
|
|
24
|
+
|
|
25
|
+
## Engine: init_doctor.py (幂等, 增量, 永不重头再来)
|
|
26
|
+
|
|
27
|
+
> **鲁棒性保证**:doctor 每项检查独立,**单项失败不阻塞其它项**;无 git 时优雅降级(团队同步/克隆禁用,但本地 PRD/搜索/任务/报告仍可用)。
|
|
28
|
+
> **退出码**:`0` = 全部健康,`1` = 有未解决问题(`--fix` 能修的已自动修)。AI 据此判断"是否可直接开工"。
|
|
29
|
+
|
|
30
|
+
### Case 1: /wl-init (no arguments)
|
|
31
|
+
```bash
|
|
32
|
+
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor
|
|
33
|
+
```
|
|
34
|
+
Report the doctor's findings to the user in friendly language.
|
|
35
|
+
If it found fixable issues, ask: "发现 N 个问题,要我自动修复吗?"
|
|
36
|
+
then run with --fix.
|
|
37
|
+
|
|
38
|
+
### Case 2/3: /wl-init 小王 [pm]
|
|
39
|
+
```bash
|
|
40
|
+
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor --fix 小王 [pm]
|
|
41
|
+
```
|
|
42
|
+
This single command does ALL of:
|
|
43
|
+
1. 注册/切换开发者 (.qoder/.developer, key=value 格式) + 个人空间目录
|
|
44
|
+
2. 拉取团队最新 (team_sync pull - 拿到别人的 PRD 和最新知识图谱)
|
|
45
|
+
3. 克隆缺失的源码仓库 (按 config.yaml git_sync.projects)
|
|
46
|
+
4. 知识图谱: 7天内新鲜->跳过 / 过期->增量同步 / 缺失->全量构建(仅首次)
|
|
47
|
+
5. 校验风格约束文件 + PRD 模板
|
|
48
|
+
6. 检查周五自动构建状态, 给出本系统的设置命令
|
|
49
|
+
|
|
50
|
+
After doctor finishes:
|
|
51
|
+
- init_developer auto-registers identity (member.json + signing key)
|
|
52
|
+
- No separate "team.py add" needed anymore
|
|
53
|
+
|
|
54
|
+
## Incremental Guarantee (为什么不会重头再来)
|
|
55
|
+
|
|
56
|
+
| 状态 | 行为 |
|
|
57
|
+
|------|------|
|
|
58
|
+
| 本周已 init 过 / 周五任务跑过 | 索引新鲜(≤7天) -> 全部跳过, 秒级完成 |
|
|
59
|
+
| 周五任务没跑/失效 | 索引过期 -> git diff 增量更新, 只处理变更文件 |
|
|
60
|
+
|
|
61
|
+
## 🔗 平台项目绑定(60 人各用各的项目)
|
|
62
|
+
|
|
63
|
+
**每个开发者绑定自己的项目。** `/wl-init` 时选择 → 拉 token → 写 mcp_config.json。
|
|
64
|
+
**切换项目 = 重跑 `/wl-init` 选另一个。** 60 人各自选自己的项目,token 绑定到项目,知识层自动隔离。
|
|
65
|
+
|
|
66
|
+
### 已绑定?(探测多宿主路径)
|
|
67
|
+
```bash
|
|
68
|
+
grep -l WLKJ_PROJECT_ID "$R/.qoder/mcp_config.json" 2>/dev/null && echo "已绑定" || echo "未绑定"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 未绑定或要切换?一行命令:
|
|
72
|
+
```bash
|
|
73
|
+
$PY "$R/.qoder/scripts/domain/kg/switch_project.py"
|
|
74
|
+
```
|
|
75
|
+
脚本会:
|
|
76
|
+
1. 问邮箱+密码(或用 --email/--pw 参数)
|
|
77
|
+
2. 连平台 `POST /api/auth/bind` 拉项目列表
|
|
78
|
+
3. 列出你的所有项目,选一个
|
|
79
|
+
4. 自动写 mcp_config.json(含该项目的 token + project_id)
|
|
80
|
+
|
|
81
|
+
非交互模式(CI/自动化):
|
|
82
|
+
```bash
|
|
83
|
+
$PY "$R/.qoder/scripts/domain/kg/switch_project.py" --email a@b.c --pw xxx --project-uuid <UUID>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**之后所有命令自动用该项目的知识层、token、回流地址。不同人选不同项目 = 完全隔离。**
|
|
87
|
+
| 全新机器 | 克隆仓库 + 全量构建一次, 之后永远增量 |
|
|
88
|
+
| 团队其他人已更新图谱 | team_sync pull 直接拿到, 本机不用构建 |
|
|
89
|
+
|
|
90
|
+
## .developer File Format (MANDATORY)
|
|
91
|
+
|
|
92
|
+
ALWAYS write `.qoder/.developer` in key=value format:
|
|
93
|
+
```
|
|
94
|
+
name=小王
|
|
95
|
+
role=pm
|
|
96
|
+
initialized_at=2026-06-12T10:00:00
|
|
97
|
+
```
|
|
98
|
+
Do NOT use `name: value` style. (Parsers accept both for legacy files,
|
|
99
|
+
but new writes must use `=`.)
|
|
100
|
+
|
|
101
|
+
## Git Author Check
|
|
102
|
+
|
|
103
|
+
The doctor reports if `git config user.name` differs from the developer
|
|
104
|
+
name (it breaks /wl-report's commit statistics). If the user agrees,
|
|
105
|
+
run: `git config user.name {name}`. Do not change it without confirmation.
|
|
106
|
+
|
|
107
|
+
## Status Display
|
|
108
|
+
After any operation, show:
|
|
109
|
+
```
|
|
110
|
+
Developer: 小王 (pm)
|
|
111
|
+
Team: 3 members (1 PM, 2 Dev)
|
|
112
|
+
Active tasks: 2 (1 in progress, 1 draft)
|
|
113
|
+
知识图谱: 2 天前更新 (新鲜)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Safety Rules
|
|
117
|
+
- NEVER delete workspace/ content
|
|
118
|
+
- NEVER overwrite member.json or task.json
|
|
119
|
+
- Full index build ONLY when index is completely missing (doctor handles this)
|
|
120
|
+
|
|
121
|
+
## 产品常踩的坑(遇到时这样解释,别让产品卡住)
|
|
122
|
+
|
|
123
|
+
| 现象 | 原因 | 怎么说 / 怎么办 |
|
|
124
|
+
|------|------|----------------|
|
|
125
|
+
| `/wl-init --fix` 卡在第 4 项几分钟 | 正在 clone 大源码仓库(fywl-ics 8973 文件) | 告诉用户"首次克隆大仓库要几分钟,属正常,耐心等"。clone 失败(网络/权限)只影响"搜索真实代码",本地 PRD/任务/报告不受影响 |
|
|
126
|
+
| 搜代码总返回 0 结果 / 生成原型字段全空 | `config.yaml` 的 `platforms.{xx}.project` 写的项目名在 `data/code/` 下不存在(管理员改了 git_sync URL 忘改 platforms) | doctor 第 4 项会报 `platforms.X.project = '...' 但无此目录`。让管理员核对 config.yaml 的 platforms 映射 |
|
|
127
|
+
| `git user.name` 与开发者名不一致警告 | 影响后续 /wl-report 统计 + push 门禁 | doctor 已自动用 `--fix` 修正本仓库 git config。用户未带 `--fix` 时提示重跑 |
|
|
128
|
+
| 没装 git | doctor 第 1 项报 WARN | 不阻塞:本地 PRD/搜索/任务/报告仍可用,只有团队同步/克隆禁用 |
|
|
129
|
+
| 搜出来的代码是旧的 | 知识图谱 >7 天未更新 | doctor 第 5 项会增量同步,`--fix` 自动跑 |
|
|
@@ -23,16 +23,20 @@ User input: $ARGUMENTS
|
|
|
23
23
|
| 生成 PRD 正文 | **Qoder AI** | 宿主 AI 比我们调 qwen-plus 更强 |
|
|
24
24
|
| 写文件 | **Qoder Write** | 原生文件操作 |
|
|
25
25
|
|
|
26
|
-
## 🧠 Planning Agent
|
|
27
|
-
|
|
28
|
-
>
|
|
29
|
-
>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
## 🧠 Planning Agent(完整模式强制前置 · 非建议)
|
|
27
|
+
|
|
28
|
+
> ⚠️ **完整模式必须先 Planning 再生成**(不再是"建议")。
|
|
29
|
+
> Planning 拆出 13 章计划 → 逐章生成有骨架不漏章;跳过 Planning 直接写易漏章节(真实反面:海外考勤 PRD 只写 1 章就交差)。
|
|
30
|
+
|
|
31
|
+
### 强制流程(完整模式取完上下文后第一步)
|
|
32
|
+
1. 取完上下文(context_pack)后,**先出 Planning**:把 13 章拆成计划(每章要点 + 引用哪条 MCP 知识命中)
|
|
33
|
+
2. Planning 通过 → 逐章生成,每章参考 MCP 知识上下文
|
|
34
|
+
3. 全部完成 → 调 MCP submit_return 回流平台
|
|
35
|
+
|
|
36
|
+
### 降级(宿主无 Planning Agent 模式)
|
|
37
|
+
手动按 13 章模板(`templates/prd-full-template.md`)逐章列要点,列完再写正文——等价于手动 Planning,**不跳过拆章这一步**。
|
|
38
|
+
|
|
39
|
+
> 快速模式(6 章)不强制 Planning——章节少,直接 prd-quick agent 3 步出。
|
|
36
40
|
|
|
37
41
|
## 🚦 路由(看第一个词或描述特征)
|
|
38
42
|
|
|
@@ -75,6 +79,8 @@ PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
|
|
|
75
79
|
|
|
76
80
|
**新模块/新业务/新流程用这个。** 支持衔接 insight:`参考:<报告路径>`
|
|
77
81
|
|
|
82
|
+
> **宿主 sub-agent 激活**:QoderWork 支持 sub-agent 时,完整模式可 dispatch 到 **`prd-reference`** agent(`.qoder/agents/prd-reference.md`)——它承担"现状分析"(定位文件 + 总结现状怎么做/已知限制)+ 参考现有数据生成 PRD+原型,10 点质检内置。dispatch prompt 传 platform + 需求 + 开发者名。生成前先过上方 🧠 Planning 强制前置。不支持 sub-agent 则按下文手动取上下文流程。
|
|
83
|
+
|
|
78
84
|
**铁律:平台必问。** 先问:
|
|
79
85
|
```
|
|
80
86
|
这个需求是针对哪个平台?
|
|
@@ -94,6 +100,11 @@ cap = resolve()
|
|
|
94
100
|
# ⓪ req_trace 查同需求历史画像(防重复造轮子):有 REQ-ID 时先查这个需求已有哪些 PRD/代码/表
|
|
95
101
|
if <有 REQ-ID>:
|
|
96
102
|
cap.mcp.call("req_trace", {"req_id": "<REQ-ID>"}) # 返回 PRD+代码+表+测试,避免重复写已有功能
|
|
103
|
+
# ⓪b find_similar_prds 找相似历史需求(防重复造轮子,跨项目):无 REQ-ID 也能查
|
|
104
|
+
# 输入需求描述 → 语义最相似的 top-K 历史需求(commit-mined),看是否已有人做过类似功能
|
|
105
|
+
# 返回 sim_label(高度相似/相关/弱相关)+借鉴的代码实体名;高度相似的先看再决定是否重写
|
|
106
|
+
similar = cap.mcp.call("find_similar_prds", {"query": "<需求描述>", "top_k": 5})
|
|
107
|
+
# 若两条需求高度相似,可 diff_requirements 对比它们 touched_entities 差异(共有/独有代码+Jaccard)
|
|
97
108
|
# ① context_pack Fast Path(1 次往返取全上下文:代码+API+字段+风格+相关PRD)
|
|
98
109
|
# 等价于 rag_search + context_360 合并,轮次减半(原 5 次 → 3 次)
|
|
99
110
|
pack = cap.mcp.call("context_pack", {"query": "<业务词或需求描述>", "project_id": "<项目UUID>"})
|
|
@@ -166,6 +177,8 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" eval <prd.md> [原型.html]
|
|
|
166
177
|
|
|
167
178
|
**加字段/加按钮/改文案/加导出等零星需求专用。** 极速,不走 EVA。
|
|
168
179
|
|
|
180
|
+
> **宿主 sub-agent 激活**:QoderWork 支持 sub-agent 时,dispatch 到 **`prd-quick`** agent(`.qoder/agents/prd-quick.md`)——3 步极速(取上下文→生成 PRD+原型→一句话确认),≤5 轮工具调用,跳过 EVA。dispatch prompt 传 platform + 需求 + 开发者名。不支持则按下文手动流程。
|
|
181
|
+
|
|
169
182
|
**平台必问**(同上)。
|
|
170
183
|
|
|
171
184
|
### 取上下文(RAG 语义预取,禁止串行 search)
|
|
@@ -202,12 +215,14 @@ prefetch/rag_search 一次返回代码/字段/API/Wiki/历史 PRD。**之后不
|
|
|
202
215
|
|
|
203
216
|
### 流程
|
|
204
217
|
1. 不给文件 → 列出最近的 PRD 让用户选
|
|
205
|
-
2. 7 项 checklist
|
|
218
|
+
2. 7 项 checklist 评审(★ 宿主支持 Agent 并行时,派 7 个 subagent 各审一项并发跑,合并 ✓/✗;不支持则串行逐项):
|
|
206
219
|
- 验收标准是否可测
|
|
207
220
|
- 字段是否引用了真实数据库字段
|
|
208
221
|
- 影响范围是否评估
|
|
209
222
|
- 非功能性需求是否覆盖
|
|
210
|
-
-
|
|
223
|
+
- 接口/异常是否与现有系统自洽
|
|
224
|
+
- 是否有重复造轮子(查 req_trace / search_prd)
|
|
225
|
+
- 原型与 PRD 是否一致
|
|
211
226
|
3. 跑 EVA 评分:`$PY "$R/.qoder/scripts/orchestration/wlkj.py" eval <prd.md>`(wlkj.py eval 内部映射 validation/metrics/eval_prd.py)
|
|
212
227
|
4. 输出:总分 + 7 项 ✓/✗ + 改进建议
|
|
213
228
|
|
|
@@ -73,6 +73,17 @@ cap.mcp.call("search_code", {"keyword": "handleExport", "platform": "web"})
|
|
|
73
73
|
3. 整合:先讲业务流程(来自 ask_corpus),再列相关代码/字段(来自 rag_search)
|
|
74
74
|
4. 精确符号定位才补 `search_code`
|
|
75
75
|
|
|
76
|
+
### 盘点模式(多 agent 并行召回 · 宿主能力)
|
|
77
|
+
|
|
78
|
+
"盘点某业务有哪些代码/字段/API/Wiki/PRD"这类要全量扫的,宿主支持 Agent 并行时**派多个 subagent 各召回一类并发跑**,再合并成一张盘点表:
|
|
79
|
+
- agent①:`rag_search` 召回代码片段 + `search_code` 精确符号
|
|
80
|
+
- agent②:`search_api` 召回相关端点
|
|
81
|
+
- agent③:`search_wiki` 召回模块文档
|
|
82
|
+
- agent④:`search_prd` / `search_prd_semantic` 召回历史 PRD
|
|
83
|
+
- 合并:去重 + 按制品分组,输出"代码 N 处 / API M 个 / Wiki K 篇 / PRD J 份"
|
|
84
|
+
|
|
85
|
+
不支持 Agent 并行 → 按上方三路检索串行跑(rag_search 一次召回最全,已够多数盘点)。
|
|
86
|
+
|
|
76
87
|
## 知识图谱能力(20+,统一 cap.mcp.call 调用)
|
|
77
88
|
|
|
78
89
|
| 用户要查什么 | 调用方式 |
|
|
@@ -83,6 +94,11 @@ cap.mcp.call("search_code", {"keyword": "handleExport", "platform": "web"})
|
|
|
83
94
|
| API 端点 | `cap.mcp.call("search_api", {"keyword": "salary"})` |
|
|
84
95
|
| 已有 PRD(防重复造轮子) | `cap.mcp.call("search_prd", {"keyword": "保险"})` |
|
|
85
96
|
| 改某接口影响哪些页面 | `cap.mcp.call("get_impact", {"endpoint": "/asset"})` |
|
|
97
|
+
| **改动风险评估(7项多证据,score+level)** | `cap.mcp.call("risk_assessment", {"project_id":"<UUID>", "entity":"<符号>"})` |
|
|
98
|
+
| **路径置信度(证据路径置信+路径链)** | `cap.mcp.call("get_confidence", {"project_id":"<UUID>", "entity":"<符号>"})` |
|
|
99
|
+
| **文件/符号变更史(代码→需求,被哪些需求改过)** | `cap.mcp.call("code_history", {"project_id":"<UUID>", "file_path":"<文件名>"})` |
|
|
100
|
+
| **需求代码变更切片(需求→代码,XQ/WT号查改过哪些函数)** | `cap.mcp.call("code_changes", {"project_id":"<UUID>", "req_key":"XQ1248"})` |
|
|
101
|
+
| **禅道story反查平台spec(看需求已有开发规格)** | `cap.mcp.call("find_specs_by_zentao", {"project_id":"<UUID>", "zentao_id":"<story号>"})` |
|
|
86
102
|
| 某函数/端点的完整关联 | `cap.mcp.call("context_360", {"symbol": "handleExport"})` |
|
|
87
103
|
| 一次取全(代码+页面+字段+API) | `cap.mcp.call("context_pack", {"keyword": "车辆", "role": "pm"})` |
|
|
88
104
|
| 哪些功能有/没测试 | `cap.mcp.call("coverage_matrix", {})` |
|
|
@@ -93,11 +109,27 @@ cap.mcp.call("search_code", {"keyword": "handleExport", "platform": "web"})
|
|
|
93
109
|
| **需求全貌(REQ-ID→PRD+代码+表+测试)** | `cap.mcp.call("req_trace", {"req_id": "REQ-2026-042"})` |
|
|
94
110
|
| **字段全链路(表单→接口→Java字段→DB列)** | `cap.mcp.call("trace_dataflow", {"field": "vehicleNo"})` |
|
|
95
111
|
| **概念多源画像(PRD+代码+表+原型)** | `cap.mcp.call("anchor_view", {"concept": "保险单"})` |
|
|
112
|
+
| **5制品全证据链(PRD+代码+表+测试+原型+强度+缺失提示)** | `cap.mcp.call("evidence_chain", {"concept": "保险单"})` |
|
|
96
113
|
| **PRD 正文语义搜(搜正文,不只标题)** | `cap.mcp.call("search_prd_semantic", {"query": "异常筛选"})` |
|
|
97
114
|
| Repo Wiki 模块文档 | `cap.mcp.call("search_wiki", {"keyword": "考勤"})` |
|
|
98
115
|
| 原型预填(真实数据) | `cap.mcp.call("fill_prototype", {"keyword": "车辆", "platform": "web"})` |
|
|
99
116
|
| 设计系统规范 | `cap.mcp.call("get_design_system", {"platform": "web"})` |
|
|
100
117
|
|
|
118
|
+
## 🎨 富展示(看板 HTML · 复用 cap.present)
|
|
119
|
+
|
|
120
|
+
get_impact / coverage_matrix / feature_overview 的结果可一键转富展示看板 HTML(QoderWork 嵌入对话 / CLI 落盘 journal):
|
|
121
|
+
```bash
|
|
122
|
+
# 影响传播树(分层 upstream/downstream 可折叠)
|
|
123
|
+
$PY "$R/.qoder/scripts/validation/metrics/present_board.py" impact --entity <符号> --project-id <UUID>
|
|
124
|
+
# 测试覆盖热力图(功能×测试 有/无)
|
|
125
|
+
$PY "$R/.qoder/scripts/validation/metrics/present_board.py" coverage --project-id <UUID>
|
|
126
|
+
# 功能画像卡(端点+按钮+用例+页面+PRD)
|
|
127
|
+
$PY "$R/.qoder/scripts/validation/metrics/present_board.py" feature --feature <功能名> --project-id <UUID>
|
|
128
|
+
```
|
|
129
|
+
- **QoderWork 桌面端**(cap.present.available):HTML 嵌入对话流,富展示取代纯文本表格
|
|
130
|
+
- **CLI/IDE**:落盘 `workspace/members/{dev}/journal/{name}-{ts}.html`,输出路径供打开
|
|
131
|
+
- 不用 cap.present 也能跑——上面的能力表是纯文本调用,富展示只是增强可视化(T244 接入点)
|
|
132
|
+
|
|
101
133
|
## 快速判断该用哪个
|
|
102
134
|
|
|
103
135
|
- **"这个功能怎么实现 / 相关代码有哪些"** → 先 `rag_search`(语义最全),不够再 `search_code`
|
|
@@ -286,6 +286,7 @@ $PY "$R/.qoder/scripts/domain/task/task.py" list [--mine] [--status <s>] [--read
|
|
|
286
286
|
"看需求#761详情" → get_story_detail(story_id=761)
|
|
287
287
|
"需求改状态"(draft→reviewing等) → change_story_status(story_id=?, status=?)
|
|
288
288
|
"需求关联到计划/版本/执行" → link_story_to_plan / link_story_to_build / link_story_to_execution
|
|
289
|
+
"看需求的平台开发spec" → find_specs_by_zentao(zentao_id=<story号>) ← 反查平台 spec(这需求已有开发规格?避免重复设计)
|
|
289
290
|
```
|
|
290
291
|
|
|
291
292
|
#### 建需求后主动问版本(★ 你们的版本=项目级 build,PM 最高频关联动作)
|
|
@@ -368,6 +369,8 @@ AI: ✅ 需求#761 已关联 build#22(本周) + #16(未来)
|
|
|
368
369
|
| **Qoder IDE / Quest** | `mcp__qoder-zentao__工具名(参数)` |
|
|
369
370
|
| **CLI / 其他** | `cap.mcp.call("工具名", {参数})` |
|
|
370
371
|
|
|
372
|
+
> **★ cap.mcp.call 已进程复用**(`_REGISTRY` 单例 + `_pool` 缓存 transport,per server 不重复 spawn;实测同 server 第2次调用 3.07s→0.03s,100x)。QoderWork 下 `qw_mcp_call` 与 `cap.mcp.call` 等价(都复用进程),**统一推荐 `cap.mcp.call`**(跨宿主一致,零感知)。上表 qw_mcp_call 是 QoderWork 原生可选优化。
|
|
373
|
+
|
|
371
374
|
#### 🎯 工序操作剧本(显式建/改,非查询)
|
|
372
375
|
|
|
373
376
|
> 下面是 /wl-task 的**工序动作**(建需求/建任务/改状态/记工时),需要流程保障。
|
|
@@ -494,13 +497,14 @@ $PY "$R/.qoder/scripts/domain/task/task.py" list --status planning
|
|
|
494
497
|
| **E 工作量** | 大概几个人周?看 PRD 的功能点数量 | 1=小 / 5=大 |
|
|
495
498
|
|
|
496
499
|
### 流程
|
|
497
|
-
1.
|
|
498
|
-
2.
|
|
500
|
+
1. ★ **任务 >5 个或依赖复杂时,先 Planning 拆任务依赖树**(宿主 Planning Agent 模式):列出谁 block 谁、哪些能并行、哪些是关键路径,再排 RICE。无 Planning → 手动画依赖图(STEP 4 的 block 关系)降级,**不跳过依赖梳理**。
|
|
501
|
+
2. AI 对每个任务**先给一组 R/I/C/E 估算**(基于 PRD,标注信心来源)
|
|
502
|
+
3. 算出 RICE 分,排序,展示给用户:
|
|
499
503
|
```
|
|
500
504
|
| 排名 | 任务 | R | I | C | E | RICE | 信心来源 |
|
|
501
505
|
```
|
|
502
|
-
|
|
503
|
-
|
|
506
|
+
4. 问:"要调整哪个的打分?" —— 用户改完,**写回每个 task.json 的 `rice` 字段**(Edit 工具),并据此重排优先级(`--priority`)。
|
|
507
|
+
5. push 同步。
|
|
504
508
|
|
|
505
509
|
### 排不动时的兜底
|
|
506
510
|
- 任务都没有 PRD / PRD 太空 → 诚实说:"这几个缺 PRD 背景,R/I 估不准。要不先补 PRD,或直接用优先级(P0-P3)手动排?"
|
|
@@ -128,6 +128,8 @@ python -c "import json; d=json.load(open('$R/data/index/test-pages.json')); prin
|
|
|
128
128
|
输出:哪些功能/页面有测试用例(test-pages.json + test-assertions.json),哪些是空白。
|
|
129
129
|
AI 据此建议"优先补 XX 功能的测试"。
|
|
130
130
|
|
|
131
|
+
🎨 **富展示**(覆盖热力图 HTML):`$PY "$R/.qoder/scripts/validation/metrics/present_board.py" coverage --project-id <UUID>`(功能×测试 有/无 热力图,QoderWork 嵌入对话 / CLI 落盘 journal)
|
|
132
|
+
|
|
131
133
|
### 改动驱动的必跑测试(提交前门禁 · S4 覆盖推理)
|
|
132
134
|
|
|
133
135
|
改完代码要确定"必跑哪些测试"时,用覆盖推理四件套(已注册 MCP):
|
|
@@ -143,6 +145,8 @@ cap.mcp.call("find_coverage_of", {"req_id": "<REQ-ID>"}) # 查某需
|
|
|
143
145
|
|
|
144
146
|
## unit 单元测试
|
|
145
147
|
|
|
148
|
+
> **宿主 sub-agent 激活**:QoderWork 支持 sub-agent 时,dispatch 到 **`qoder-test-gen`** agent(`.qoder/agents/qoder-test-gen.toml`)——自动定位实现代码 + 读 Spec → 生成 JUnit(Service 层 Mock 全依赖 Given-When-Then / Controller 层 MockMvc / @DisplayName / AssertJ / Builder 测试数据),输出 `tests/{包路径}/{类名}Test.java`。dispatch prompt 首行传 `Active Code: <实现文件路径>`。不支持则按下文 skill 手动生成。
|
|
149
|
+
|
|
146
150
|
读 `.qoder/skills/test-generator/SKILL.md`:定位实现代码 → 读 spec → 生成
|
|
147
151
|
JUnit 测试(Mock + MockMvc,Given-When-Then)→ 输出 `tests/{package}/{Class}Test.java`。
|
|
148
152
|
(只有这条线才需要 search_index 找代码。)
|