@hupan56/wlkj 3.4.2 → 3.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,371 @@
1
+ ---
2
+ name: wl-prd
3
+ description: "需求: 完整(13章,新功能) / 快速(6章,小改动) / 评审(检查质量)。默认根据描述自动判断。"
4
+ argument-hint: "[完整|快速|评审] [需求描述] 可选: 参考:<insight报告路径>"
5
+ auto-approve: true
6
+ allowed-tools: [Read, Glob, Grep, Bash, Write, Edit]
7
+ ---
8
+
9
+ # /wl-prd - 需求工序站
10
+
11
+ User input: $ARGUMENTS
12
+
13
+ > **写需求 / 评审需求,一个命令搞定。**
14
+ > 模块契约:`.qoder/contracts/prd.md`
15
+
16
+ ## 🔧 工具优先级(宿主能力 × 知识层分工)
17
+ | 步骤 | 用谁 | 原因 |
18
+ |------|------|------|
19
+ | 搜文件内容 | **Qoder Grep/Read** | 精确搜代码,原生更快 |
20
+ | 取业务上下文 | **MCP context_pack** | 语义聚合8段(代码+API+字段+Wiki+PRD) |
21
+ | 取团队记忆 | **MCP get_learnings** | 引擎积累的业务规则 |
22
+ | 查真表结构 | **MCP query_schema** | 数据库真实列名 |
23
+ | 生成 PRD 正文 | **Qoder AI** | 宿主 AI 比我们调 qwen-plus 更强 |
24
+ | 写文件 | **Qoder Write** | 原生文件操作 |
25
+
26
+ ## 🚨 工具接口铁律(见 tool_guide · 会话已注入精简版)
27
+
28
+ **单一信源** `.qoder/scripts/tool_guide.md`(SessionStart 已注入精简版:repo_root 定位 / 三套名 wlkj·kg·MCP 互通 / 中文歧义词提炼 / 优先级口诀)。需完整三套名映射表或歧义词清单时 Read 它。
29
+ **两条红线常记**:① 三套名字都认(`search`/`semantic`/`context`),别因"未知子命令"慌张;② 禁 `find data/code` / `grep -r` 找模块——那是知识层 search 的活,手动做=思考链跑飞;只有 search 换词仍返 0 或已定位到具体文件时才 Grep/Read。
30
+
31
+ ## 🧠 Planning Agent(完整模式强制前置 · 非建议)
32
+
33
+ > ⚠️ **完整模式必须先 Planning 再生成**(不再是"建议")。
34
+ > Planning 拆出 13 章计划 → 逐章生成有骨架不漏章;跳过 Planning 直接写易漏章节(真实反面:海外考勤 PRD 只写 1 章就交差)。
35
+
36
+ ### 强制流程(完整模式取完上下文后第一步)
37
+ 1. 取完上下文(context_pack)后,**先出 Planning**:把 13 章拆成计划(每章要点 + 引用哪条 MCP 知识命中)
38
+ 2. Planning 通过 → 逐章生成,每章参考 MCP 知识上下文
39
+ 3. 全部完成 → 调 MCP submit_return 回流平台
40
+
41
+ ### 降级(宿主无 Planning Agent 模式)
42
+ 手动按 13 章模板(`templates/prd-full-template.md`)逐章列要点,列完再写正文——等价于手动 Planning,**不跳过拆章这一步**。
43
+
44
+ > 快速模式(6 章)不强制 Planning——章节少,直接 prd-quick agent 3 步出。
45
+
46
+ ## 🚦 路由(看第一个词或描述特征)
47
+
48
+ ### 🔴 命令优先铁律(最重要,先读)
49
+ **只要用户打了 `/wl-prd`,就必须产出 PRD,绝不跨命令跑去别处。**
50
+ 哪怕描述含"报错/无法提交/bug/异常"这类词(如"养护计划无法提交,时间报错"——这是要为修复写需求),也走本命令出 PRD,**不准**跑去 `/wl-test`(测试)/ `/wl-code`(直接改码)/ 排查。
51
+ - 用户要写需求 → 本命令(不管描述像 bug 还是新功能)
52
+ - 用户要直接改代码 → 那是 `/wl-code`,但前提是用户打的是 `/wl-code`
53
+ - 判断不准 → 问一句,不要擅自换命令
54
+
55
+ | 用户说 | 模式 | 走哪个 |
56
+ |--------|------|--------|
57
+ | "完整""深度""正经需求" 或 描述含"新模块/新业务/新流程" | **完整** | prd-full-template(13 章)|
58
+ | "快速""小改动""加个""改下" 或 加字段/按钮/文案/导出 | **快速** | prd-quick-template(6 章)|
59
+ | "评审""检查""质量""合格吗" | **评审** | 7 项 checklist + EVA 评分 |
60
+ | 判断不了 | **问一句**:"是完整需求(新功能)还是小改动(加字段/按钮)?" |
61
+
62
+ ### 默认规则
63
+ - 没说模式 + 描述像新功能 → 默认**完整**
64
+ - 没说模式 + 描述像小改动 → 默认**快速**
65
+ - 给了 PRD 文件路径 → **评审**
66
+
67
+ ---
68
+
69
+ ## 🔧 仓库根定位(完整档/快速档共用,进任何模式前先跑这一条)
70
+
71
+ > QoderWork 桌面端 cwd 不在仓库根(在 `.qoderwork/workspace/xxx`),相对路径
72
+ > `.qoder/scripts/...` **必然失败**(真实踩坑:连续 2 条命令报错浪费一轮)。
73
+ > 进模式前**必须先定位仓库根**。Mac 只有 python3,两个都试:
74
+
75
+ ```bash
76
+ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
77
+ PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
78
+ ```
79
+ > 后续所有 `$PY "$R/.qoder/scripts/..."` 都用这两个变量。**不准自己编 `cd /d` / 裸相对路径**。
80
+
81
+ ---
82
+
83
+ ## 完整模式(13 章 PRD)
84
+
85
+ **新模块/新业务/新流程用这个。** 支持衔接 insight:`参考:<报告路径>`
86
+
87
+ > **宿主 sub-agent 激活**:QoderWork 支持 sub-agent 时,完整模式可 dispatch 到 **`prd-reference`** agent(`.qoder/agents/prd-reference.md`)——它承担"现状分析"(定位文件 + 总结现状怎么做/已知限制)+ 参考现有数据生成 PRD+原型,10 点质检内置。dispatch prompt 传 platform + 需求 + 开发者名。生成前先过上方 🧠 Planning 强制前置。不支持 sub-agent 则按下文手动取上下文流程。
88
+
89
+ **铁律:平台必问。** 先问:
90
+ ```
91
+ 这个需求是针对哪个平台?
92
+ 1. Web 管理端 (fywl-ui)
93
+ 2. APP 移动端 (Carmg-H5)
94
+ 3. 两端都要
95
+ 请选择 (1/2/3):
96
+ ```
97
+
98
+ ### 取上下文(context_pack Fast Path 为主 + rag_search/context_360 兜底 — 语义召回最全,接地写 PRD)
99
+
100
+ **写 PRD 前必做的知识预取:Fast Path 用 context_pack 一次取全(代码+API+字段+风格+相关PRD),替代 rag_search+context_360 两次往返;再叠 ask_corpus(业务流程)+ get_learnings(之前学到的)+ query_schema(真库表结构)。不要只靠 search_code 关键词。**
101
+
102
+ ```python
103
+ from capability import resolve
104
+ cap = resolve()
105
+ # ⓪ req_trace 查同需求历史画像(防重复造轮子):有 REQ-ID 时先查这个需求已有哪些 PRD/代码/表
106
+ if <有 REQ-ID>:
107
+ cap.mcp.call("req_trace", {"req_id": "<REQ-ID>"}) # 返回 PRD+代码+表+测试,避免重复写已有功能
108
+ # ⓪b find_similar_prds 找相似历史需求(防重复造轮子,跨项目):无 REQ-ID 也能查
109
+ # 输入需求描述 → 语义最相似的 top-K 历史需求(commit-mined),看是否已有人做过类似功能
110
+ # 返回 sim_label(高度相似/相关/弱相关)+借鉴的代码实体名;高度相似的先看再决定是否重写
111
+ similar = cap.mcp.call("find_similar_prds", {"query": "<需求描述>", "top_k": 5})
112
+ # 若两条需求高度相似,可 diff_requirements 对比它们 touched_entities 差异(共有/独有代码+Jaccard)
113
+ # ① context_pack Fast Path(1 次往返取全上下文:代码+API+字段+风格+相关PRD)
114
+ # 等价于 rag_search + context_360 合并,轮次减半(原 5 次 → 3 次)
115
+ pack = cap.mcp.call("context_pack", {"query": "<业务词或需求描述>", "project_id": "<项目UUID>"})
116
+ # ①b 召回不够(缺某类/命中为空)时单独补 rag_search 一次(语义召回兜底,fallback)
117
+ if not pack.get("items"):
118
+ rag = cap.mcp.call("rag_search", {"query": "<业务词或需求描述>", "top_k": 10})
119
+ # ①c 仍需某核心业务对象的完整关联(代码+页面+字段+API)时,补 context_360(fallback)
120
+ if <需要某符号的全上下文>:
121
+ ctx = cap.mcp.call("context_360", {"symbol": "<核心业务对象>"})
122
+ # ② 有"业务流程整体怎么运转"的疑问时,补 ask_corpus 拿 GraphRAG 答案
123
+ flow = cap.mcp.call("ask_corpus", {"q": "<业务词>的业务流程是什么", "top_k": 3})
124
+ # ③ get_learnings 查之前学到的业务规则/偏好(反哺:上次踩的坑这次别犯)
125
+ learnings = cap.mcp.call("get_learnings", {"project_id": "<项目UUID>", "limit": 10})
126
+ # ④ query_schema 查真实数据库表结构(引擎自己的 MySQL MCP,拿到的真表回流平台)
127
+ # 推断涉及哪些表(从 pack 命中里找表名),查真结构
128
+ schema = cap.mcp.call("query_schema", {"table": "<表名>"}) # 引擎 qoder-mysql 工具
129
+ # 查到后把真表结构回流平台(learn 写回,平台数据库知识就有了真实数据)
130
+ if schema and schema.get("columns"):
131
+ cap.mcp.call("learn", {"project_id":"<项目UUID>", "category":"rule",
132
+ "pattern": f"数据库表<表名>结构: {json.dumps(schema.get('columns',[]), ensure_ascii=False)[:500]}",
133
+ "source": "wlkj/wl-prd+mysql"})
134
+ # PRD 里的字段表优先用 query_schema 查到的真实列(最接地),其次用 context_pack 召回的代码字段
135
+ ```
136
+ # 写 PRD 时参考 learnings 里的规则/偏好/决策,在相关章节体现
137
+ ```
138
+ 等价 CLI(脚本兜底):
139
+ ```bash
140
+ # ★ 有 REQ-ID 用 ctx-cache:PRD→spec→code 链路同 REQ 复用上下文(T1.3,省 2 次往返)
141
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" ctx-cache <REQ-ID> <业务词> --platform <web|app>
142
+ # 无 REQ-ID / 首次取:普通 context
143
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" context <业务词> --platform <web|app>
144
+ # PRD/spec 改动后失效该 REQ 缓存重来:
145
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" ctx-cache <REQ-ID> --clear
146
+ ```
147
+ - 第 4 段 = 历史 PRD(防重复)
148
+ - 第 5 段 = 相关 API
149
+ - 第 8 段 = 数据库表结构+真实字段
150
+ - 涉及枚举字段时额外调 `cap.mcp.call("query_distinct")`
151
+
152
+ ### 🎯 接地铁律(写 PRD 必须遵守)
153
+
154
+ **用 rag_search 召回的知识写 PRD,每条功能/字段都要有 rag_search 命中的来源,不编造。**
155
+ - PRD 里写的每个字段名 → 必须在 rag_search/context_360 结果里能找到(或来自 query_schema 真实表结构)
156
+ - PRD 里写的每个 API → 必须在召回结果里有对应端点
157
+ - 召回不到的字段/API → 标注"新增(待评估)",不要假装已存在
158
+ - 业务流程描述 → 优先采纳 ask_corpus 的 GraphRAG 回答(有全局视角),再用 rag_search 的事实补充
159
+
160
+ ### 产出
161
+ - PRD: `workspace/members/{dev}/drafts/REQ-{YYYY}-{NNN}-{标题}.md`(13 章)
162
+ - 原型(**可选**,见下「原型要不要画」): `workspace/members/{dev}/drafts/prototype-{feature}.html`
163
+ - 第一行必须带 `@contract` 头(platform/req-id/mode/acceptance/prototype)
164
+
165
+ ### 原型要不要画?(融入批量确认)
166
+
167
+ **默认建议**(用户可一键改):
168
+ - 纯规则/接口/定时/参数/计算类 → **不画**(如"出交车点检固定为总部全局规则")
169
+ - 含页面/菜单/表单/弹窗/详情/向导/看板/大屏 → **画**
170
+ - 加字段/按钮/文案/导出 → **不画**
171
+ - 混合(页面+规则)→ 只画页面那部分
172
+
173
+ **两端都画时**:默认只画主端一份,用户明确要求才画 2 份。
174
+
175
+ **不画时**:PRD 第 11 章写 `无({原因},经用户确认豁免)` + `@contract` 头标 `prototype: none`;
176
+ eval 自动跳过 A2(满分从 100 降到 70,照样 PASS);`/wl-design` `/wl-code` 据此跳过原型环节。
177
+
178
+ ### 质量门禁
179
+ ```bash
180
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" eval <prd.md> [原型.html]
181
+ ```
182
+ ≥ 80% 才 PASS。完整模板见 `.qoder/templates/prd-full-template.md`。
183
+
184
+ ### 业务保真打分(接真命令产物 · BF1/BF2)
185
+
186
+ > EVA 结构分(章齐)≠业务保真。PRD 出来后打业务保真分:产物是不是真 ICS 业务(真表/真写法)。
187
+ ```python
188
+ from capability import resolve
189
+ cap = resolve()
190
+ # BF1 schema保真(提的表是真 ICS 业务表) + BF2 内容保真(LLM-judge vs 真 PRD, 是不是 ICS 写法非通用文)
191
+ r = cap.mcp.call("bf_score", {"kind": "prd", "content": "<PRD 正文>", "feature": "<业务主题如 保险>"})
192
+ # → BF1_schema.score(目标≥0.85) + BF2_content.score(目标≥4/5)
193
+ ```
194
+ - BF1 低 → PRD 提了编造/非 ICS 表 → 补真表(query_schema/db_tables)。
195
+ - BF2 低 → 内容是通用产品文非 ICS 写法 → 参考 rag_search(kind=prd) 真 PRD 范本重写。
196
+ - 原型保真(BF3 组件/BF4 颜色):`cap.mcp.call("bf_score", {"kind":"proto","content":"<原型 HTML>"})` → 用真 fywl-ui 设计系统核。
197
+
198
+ ---
199
+
200
+ ## 快速模式(6 章 Mini-PRD)
201
+
202
+ **加字段/加按钮/改文案/加导出等零星需求专用。** 极速,不走 EVA。
203
+
204
+ > **宿主 sub-agent 激活**:QoderWork 支持 sub-agent 时,dispatch 到 **`prd-quick`** agent(`.qoder/agents/prd-quick.md`)——3 步极速(取上下文→生成 PRD+原型→一句话确认),≤5 轮工具调用,跳过 EVA。dispatch prompt 传 platform + 需求 + 开发者名。不支持则按下文手动流程。
205
+
206
+ **平台必问**(同上)。
207
+
208
+ ### 取上下文(RAG 语义预取,禁止串行 search)
209
+
210
+ **优先 rag_search(语义召回最全)+ prefetch,不要只靠逐个 search_code 关键词。**
211
+
212
+ ```python
213
+ from capability import resolve
214
+ cap = resolve()
215
+ # ① rag_search 一次语义召回:代码/字段/API/Wiki 全拿到(按相关度排序)
216
+ rag = cap.mcp.call("rag_search", {"query": "<需求描述>", "top_k": 8})
217
+ ```
218
+ 等价 CLI:
219
+ ```bash
220
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" prefetch "<需求描述>" --platform <p>
221
+ ```
222
+ prefetch/rag_search 一次返回代码/字段/API/Wiki/历史 PRD。**之后不要逐个 search/find/grep 查词**(会变 6+ 次串行往返,轮次爆炸根因)。不够才补调一次。
223
+
224
+ **接地铁律(同完整模式)**:6 章里写的每个字段/API 必须在 rag_search 召回结果里有来源,召不到的标"新增(待评估)",不编造。
225
+
226
+ ### 产出
227
+ - Mini-PRD: `workspace/members/{dev}/drafts/REQ-{YYYY}-{NNN}-{标题}.md`(6 章)
228
+ - **6 章缺一不可(铁律)**:功能入口 / 需求背景 / 需求说明 / 影响范围 / 验收标准 / 不在本次范围
229
+ > 🚫 **禁止只写 1-2 章就交差**(真实反面教材:海外考勤 PRD 只写了"功能入口"一段就停,6 章缺 5 章 → 残废品)。
230
+ > 即使是 bug 修复,也要写全 6 章(需求背景=bug 现象、需求说明=修复方案、验收标准=修复后行为)。
231
+ > 不涉及的章节写"不涉及"或一句话说明,**标题必须保留,不许整章省略**。Stop hook 会检测缺章并阻断。
232
+ - 模板见 `.qoder/templates/prd-quick-template.md`
233
+
234
+ ---
235
+
236
+ ## 评审模式(7 项 checklist + EVA)
237
+
238
+ **检查 PRD 完整性与质量。**
239
+
240
+ ### 流程
241
+ 1. 不给文件 → 列出最近的 PRD 让用户选
242
+ 2. 7 项 checklist 评审(★ 宿主支持 Agent 并行时,派 7 个 subagent 各审一项并发跑,合并 ✓/✗;不支持则串行逐项):
243
+ - 验收标准是否可测
244
+ - 字段是否引用了真实数据库字段
245
+ - 影响范围是否评估
246
+ - 非功能性需求是否覆盖
247
+ - 接口/异常是否与现有系统自洽
248
+ - 是否有重复造轮子(查 req_trace / search_prd)
249
+ - 原型与 PRD 是否一致
250
+ 3. 跑 EVA 评分:`$PY "$R/.qoder/scripts/orchestration/wlkj.py" eval <prd.md>`(wlkj.py eval 内部映射 validation/metrics/eval_prd.py)
251
+ 4. 输出:总分 + 7 项 ✓/✗ + 改进建议
252
+
253
+ ---
254
+
255
+ ## 埋点
256
+
257
+ PRD 生成/评审后自动记录到 learning(eval_prd.py 已内置)。
258
+
259
+ **评审模式额外**:给出 PASS/FAIL 结论后立即记一条 `review_done`(可用性指标 F2 评审级数据唯一来源,不埋则该级永远为 0):
260
+ ```bash
261
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" learn record review_done "{\"prd\": \"<被评审PRD名>\", \"verdict\": \"PASS|FAIL\"}"
262
+ ```
263
+ 埋点失败不阻塞,但能埋一定要埋。
264
+
265
+ ---
266
+
267
+ ## 📤 发禅道(PRD 写完后的衔接,完整/快速档都问)
268
+
269
+ PRD 产出后,**主动问一句**(不要默默结束):
270
+ ```
271
+ PRD 已写好: <路径>
272
+ 要发到禅道吗?(发禅道 = 建禅道需求 + 可选关联计划/版本)
273
+ ```
274
+
275
+ ### 用户说"发" → 交互式逐项确认(不要一次性全问,按需)
276
+
277
+ 用禅道 MCP 现查现选(QoderWork: `qw_mcp_call`):
278
+
279
+ **① 选产品(必选)**
280
+ - `list_products()` → 列出现有产品 → 让用户选 product_id
281
+ - 禅道需求必须挂产品,没产品发不了
282
+
283
+ **② 关联计划?(可选,问一句)**
284
+ ```
285
+ 要关联到计划(迭代)吗?(可跳过)
286
+ ```
287
+ - 用户要 → `list_plans(product_id=<上一步选的>)` → 选 plan_id
288
+ - 跳过 → 不传 plan
289
+
290
+ **③ 挂版本?(可选,问一句)**
291
+ ```
292
+ 要纳入某个版本(build)吗?(可跳过)
293
+ ```
294
+ - 用户要 → `list_builds(project_id=N)` → 选 build_id(⚠️ builds 按项目维度查最常见,禅道无"全量版本"端点)
295
+ - 跳过 → 不传 build
296
+
297
+ **④ 执行发布**
298
+ ```bash
299
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" req <REQ-ID> 发布 \
300
+ --product=<①> [--plan=<②>] [--build=<③>] --confirm
301
+ ```
302
+ - 默认先 dry-run 预览,用户确认后再 `--confirm` 真发
303
+ - 真发后禅道建好需求,PRD 末尾自动回写 `<!-- zentao: story=ID -->` 留痕
304
+
305
+ > **禅道 story ID 回流平台**:建完禅道需求后,把 story ID 通过平台 MCP learn 工具写回:
306
+ > ```python
307
+ > cap.mcp.call("learn", {"project_id":"<项目UUID>","category":"decision",
308
+ > "pattern": f"PRD<{标题}> 已发禅道: story=#{story_id} product={product_id}",
309
+ > "source": "wlkj/wl-prd+zentao"})
310
+ > ```
311
+ > 这样平台知道这个 PRD 对应禅道哪个需求(跨系统关联)。
312
+
313
+ > 用户说"不发" → 不勉强,PRD 留本地,后续可随时 `/wl-req <REQ-ID> 发布`。
314
+ > 直连禅道 HTTP(脚本内部),AI 只触发一次,几乎不耗 token。
315
+
316
+ ---
317
+
318
+ ## 🔄 回流平台(PRD 写完即执行,别漏)
319
+
320
+ **铁律:PRD 落地后必须回流平台**(否则平台 AI回流 Tab 永远空,知识层↔引擎断裂)。
321
+ 回流走平台 MCP 写工具(`create_prd` / `submit_return`),失败不影响主流程。
322
+
323
+ PRD 写完后跑这一条(用前面定的 `$PY` / `$R` 变量):
324
+ ```bash
325
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" return prd <PRD文件路径> "<PRD标题>" --platform <web|app>
326
+ ```
327
+ - 内部优先调 `cap.mcp.call("create_prd", {title, content_md})` 写 PRD 表 + 首版本;
328
+ - 失败再 `submit_return` 写 returns 待审核;最后 HTTP 兜底(读 mcp_config.json 的 return_endpoint)。
329
+ - 全程 try/except,回流失败 PRD 仍在本地,主流程不阻塞。
330
+
331
+ > 等价的 MCP 直调写法(脚本不可用时的兜底):
332
+ > `cap.mcp.call("create_prd", {"title": "<标题>", "content_md": "<完整PRD正文>", "status": "planning"})`
333
+ > 或 `cap.mcp.call("submit_return", {"title":"...", "return_type":"prd", "source":"/wl-prd", "content_preview":"...", "content_full":"..."})`
334
+
335
+ 回流成功后输出一行:`✅ [回流] via=create_prd/submit_return <message>`。
336
+
337
+ ## 🧠 学习沉淀(PRD 写完即执行,反哺下次)
338
+
339
+ **铁律:写 PRD 过程中学到的业务规则/决策/用户偏好,必须调 `learn` 写回平台**(平台 learning_patterns 积累,下次引擎受益——越用越聪明)。
340
+
341
+ 写完 PRD 后,把学到的关键认知调 learn 写回:
342
+ ```python
343
+ cap.mcp.call("learn", {
344
+ "project_id": "<项目UUID>",
345
+ "category": "rule", # rule=业务规则 / preference=用户偏好 / decision=决策 / pitfall=踩坑
346
+ "pattern": "<学到的内容,如:车辆保养需关联驾驶员和车辆,按里程+时间双触发>",
347
+ "source": "wlkj/wl-prd",
348
+ })
349
+ ```
350
+ - 每次至少写 1 条(最关键的业务规则或决策)。
351
+ - 多条可多次调用。
352
+ - 全程 try/except,失败不阻塞主流程。
353
+
354
+ 输出:`✅ [学习] 沉淀 N 条认知到平台`。
355
+
356
+ ## 📊 工作流轨迹回写(若本次是被平台触发的)
357
+
358
+ 如果本次 /wl-prd 是平台 trigger 派来的(有 triggerId),执行完后回填轨迹:
359
+ ```python
360
+ # 通过 PATCH /api/projects/{pid}/trigger/workflow/{triggerId} 回填
361
+ # body: {status: "success", output_summary: "生成了<标题>PRD", knowledge_used: [...], mcp_tools_called: [...], duration_sec: N}
362
+ ```
363
+ - knowledge_used:rag_search/search 命中的关键实体 id 列表
364
+ - mcp_tools_called:本次调过的 MCP 工具名(rag_search/context_360/create_prd/learn 等)
365
+ - 让平台"引擎活动看板"能看到本次执行全貌(取了什么知识→产出什么→学了什么)
366
+ - try/except 不阻塞。
367
+
368
+ ## 下一步
369
+ - PRD 定稿 → `/wl-task create <标题>` 落成任务(带 REQ-ID 衔接)+ 发禅道
370
+ - 开工前 → `/wl-spec` 生成开发 Spec → 确认后 `/wl-code` 实现
371
+ - 完整链:prd → task → spec → code → test → commit → task finish(双通飞轮)
@@ -1,223 +1,44 @@
1
- ---
2
- name: wl-search
3
- description: "查代码/业务/API/字段/PRD + 知识图谱(影响分析/覆盖矩阵/功能画像/业务流程/多跳遍历)的唯一入口。"
4
- argument-hint: "[keyword] or --api [path] or subcommand. 全系15个能力见下表"
5
- auto-approve: true
6
- allowed-tools: [Read, Bash]
7
- ---
8
-
9
- # /wl-search - 搜索代码 & 知识图谱 & RAG 语义检索
10
-
11
- User input: $ARGUMENTS
12
-
13
- ## 执行方式(宿主无关,自动路由)
14
-
15
- ```python
16
- from capability import resolve
17
- cap = resolve()
18
- result = cap.mcp.call("rag_search", {"query": "车辆保养", "top_k": 8})
19
- ```
20
-
21
- 自动路由:有 MCP 走 MCP(直连平台知识层,快),无 MCP 走 wlkj.py(CLI 降级)。零宿主感知。
22
-
23
- ## 🚨 接口铁律(见 tool_guide · 会话已注入精简版)
24
-
25
- **单一信源** `.qoder/scripts/tool_guide.md`(SessionStart 已注入精简版:repo_root 定位 / 三套名 wlkj·kg·MCP 互通 / 中文歧义词提炼 / 优先级口诀)。需完整三套名映射表或歧义词清单时 Read 它。
26
- **两条红线常记**:① 三套名字都认(`search`/`semantic`/`context`/`impact`),别因"未知子命令"慌;② 禁 `find`/`grep -r`/`findstr /s` 全盘扫 `data/code`——那是 search 的活,手动做=思考链跑飞。
27
-
28
-
29
- ## ⚡ 第一步:确定性路由(按顺序匹配第一个命中信号,零猜测)
30
-
31
- **差模型也走得对:逐条检查 `$ARGUMENTS`,第一个命中的信号决定检索通道——不要"判断问题类型",按表查。**
32
-
33
- | # | 信号(`$ARGUMENTS` 含这些词) | 走这个通道(直达,先调一次) |
34
- |---|---|---|
35
- | 1 | "影响谁" / "改 XX 影响" / "波及" | `get_impact`(影响分析) |
36
- | 2 | "表结构" / "字段" / "枚举" / "真实数据" / "查库" | DB 通道:**先 `list_envs` 问环境**(见下「数据库查询」) |
37
- | 3 | "哪些没测" / "覆盖" / "盲区" / "测试矩阵" | `coverage_matrix` |
38
- | 4 | "业务流程" / "整体怎么运转" / "是干嘛的" | `ask_corpus`(GraphRAG 问答),再叠 `rag_search` 补事实 |
39
- | 5 | "盘点" / "有哪些代码" / "一次取全" | `context_pack`(8 段一次拿全) |
40
- | 6 | 精确符号(camelCase / 下划线 / 路径,如 `handleExport`、`/asset`) | `search_code`(精确关键词) |
41
- | 7 | **(以上都没命中)默认** | **`rag_search`(语义召回最全,top_k=8)** |
42
-
43
- > **铁律**:理解/盘点类问题默认 `rag_search`(语义召回最全,能找到没共享词的相关代码,如"车辆保养"→"维修记录");只在精确找符号时用 `search_code`;Glob 找不到文件用 `search_code` 兜底,**不准 find/findstr/dir /s 全盘扫**。
44
-
45
- ### 三路检索详解(RAG 升级核心)
46
-
47
- **① rag_search — 语义召回(默认首选,召回最全)**
48
- ```python
49
- # 语义检索:query 是自然语言/业务词,不必和代码里的词一样
50
- # 能找到"车辆保养"相关的"维修记录",即使两者没共享词
51
- cap.mcp.call("rag_search", {"query": "车辆保养流程", "top_k": 8})
52
- ```
53
- - 返回:相关代码片段 / 字段 / API,按语义相关度排序
54
- - 适用:写 PRD/改代码前找相关实现、盘点某业务有哪些代码、关键词搜索召回不全时
55
- - `top_k` 默认 8,要更全调到 12-15
56
-
57
- **② ask_corpus — GraphRAG 全局问答(答业务流程类问题)**
58
- ```python
59
- # GraphRAG 社区摘要问答:直接给"答案",不是堆代码片段
60
- # 能答"资产管理的业务流程是什么""这个功能整体怎么运转"
61
- cap.mcp.call("ask_corpus", {"q": "车辆保养的整体业务流程是什么", "top_k": 3})
62
- ```
63
- - 返回:基于知识图谱社区摘要的自然语言回答
64
- - 适用:问"整体流程/业务怎么运转/这个功能是干嘛的"等全局问题
65
- - ⚠️ 引擎工具名是 `ask_corpus`,平台侧映射到 `graphrag_ask`(mcp_config.json 已配)
66
-
67
- **③ search_code — 精确关键词(找特定符号/字符串)**
68
- ```python
69
- # 精确关键词:找特定函数名/类名/字符串字面量
70
- cap.mcp.call("search_code", {"keyword": "handleExport", "platform": "web"})
71
- ```
72
- - 返回:精确命中的代码位置
73
- - 适用:已知符号名要定位、rag_search 召回了但要精确找某行
74
-
75
- ### 输出整合(三路并用时)
76
-
77
- 理解一个功能时,建议 **rag_search + ask_corpus 并用**:
78
- 1. `rag_search` 拿到相关代码/字段/API(事实依据)
79
- 2. `ask_corpus` 拿到业务流程的自然语言回答(全局视角)
80
- 3. 整合:先讲业务流程(来自 ask_corpus),再列相关代码/字段(来自 rag_search)
81
- 4. 精确符号定位才补 `search_code`
82
-
83
- ### 盘点模式(多 agent 并行召回 · 宿主能力)
84
-
85
- "盘点某业务有哪些代码/字段/API/Wiki/PRD"这类要全量扫的,宿主支持 Agent 并行时**派多个 subagent 各召回一类并发跑**,再合并成一张盘点表:
86
- - agent①:`rag_search` 召回代码片段 + `search_code` 精确符号
87
- - agent②:`search_api` 召回相关端点
88
- - agent③:`search_wiki` 召回模块文档
89
- - agent④:`search_prd` / `search_prd_semantic` 召回历史 PRD
90
- - 合并:去重 + 按制品分组,输出"代码 N 处 / API M 个 / Wiki K 篇 / PRD J 份"
91
-
92
- 不支持 Agent 并行 → 按上方三路检索串行跑(rag_search 一次召回最全,已够多数盘点)。
93
-
94
- ## 知识图谱能力(20+,统一 cap.mcp.call 调用)
95
-
96
- | 用户要查什么 | 调用方式 |
97
- |-------------|---------|
98
- | **语义找相关代码/字段(首选,召回最全)** | `cap.mcp.call("rag_search", {"query": "车辆保养", "top_k": 8})` |
99
- | **GraphRAG 全局业务流程问答** | `cap.mcp.call("ask_corpus", {"q": "保养流程是什么", "top_k": 3})` |
100
- | 代码在哪 / 精确搜关键词 | `cap.mcp.call("search_code", {"keyword": "考勤", "platform": "web"})` |
101
- | API 端点 | `cap.mcp.call("search_api", {"keyword": "salary"})` |
102
- | 已有 PRD(防重复造轮子) | `cap.mcp.call("search_prd", {"keyword": "保险"})` |
103
- | 改某接口影响哪些页面 | `cap.mcp.call("get_impact", {"endpoint": "/asset"})` |
104
- | **改动风险评估(7项多证据,score+level)** | `cap.mcp.call("risk_assessment", {"project_id":"<UUID>", "entity":"<符号>"})` |
105
- | **路径置信度(证据路径置信+路径链)** | `cap.mcp.call("get_confidence", {"project_id":"<UUID>", "entity":"<符号>"})` |
106
- | **文件/符号变更史(代码→需求,被哪些需求改过)** | `cap.mcp.call("code_history", {"project_id":"<UUID>", "file_path":"<文件名>"})` |
107
- | **需求代码变更切片(需求→代码,XQ/WT号查改过哪些函数)** | `cap.mcp.call("code_changes", {"project_id":"<UUID>", "req_key":"XQ1248"})` |
108
- | **禅道story反查平台spec(看需求已有开发规格)** | `cap.mcp.call("find_specs_by_zentao", {"project_id":"<UUID>", "zentao_id":"<story号>"})` |
109
- | 某函数/端点的完整关联 | `cap.mcp.call("context_360", {"symbol": "handleExport"})` |
110
- | 一次取全(代码+页面+字段+API) | `cap.mcp.call("context_pack", {"keyword": "车辆", "role": "pm"})` |
111
- | 哪些功能有/没测试 | `cap.mcp.call("coverage_matrix", {})` |
112
- | 功能完整画像 | `cap.mcp.call("feature_overview", {"feature": "资产管理"})` |
113
- | 业务流程链(几步) | `cap.mcp.call("get_workflow", {"module": "assets"})` |
114
- | 多跳遍历(关联实体) | `cap.mcp.call("multi_hop", {"symbol": "资产管理", "depth": 3})` |
115
- | **业务链路追踪(概念→PRD+代码+表+测试)** | `cap.mcp.call("business_trace", {"query": "保险理赔", "depth": 3})` |
116
- | **需求全貌(REQ-ID→PRD+代码+表+测试)** | `cap.mcp.call("req_trace", {"req_id": "REQ-2026-042"})` |
117
- | **字段全链路(表单→接口→Java字段→DB列)** | `cap.mcp.call("trace_dataflow", {"field": "vehicleNo"})` |
118
- | **概念多源画像(PRD+代码+表+原型)** | `cap.mcp.call("anchor_view", {"concept": "保险单"})` |
119
- | **5制品全证据链(PRD+代码+表+测试+原型+强度+缺失提示)** | `cap.mcp.call("evidence_chain", {"concept": "保险单"})` |
120
- | **PRD 正文语义搜(搜正文,不只标题)** | `cap.mcp.call("search_prd_semantic", {"query": "异常筛选"})` |
121
- | Repo Wiki 模块文档 | `cap.mcp.call("search_wiki", {"keyword": "考勤"})` |
122
- | 原型预填(真实数据) | `cap.mcp.call("fill_prototype", {"keyword": "车辆", "platform": "web"})` |
123
- | 设计系统规范 | `cap.mcp.call("get_design_system", {"platform": "web"})` |
124
-
125
- ## 🎨 富展示(看板 HTML · 复用 cap.present)
126
-
127
- get_impact / coverage_matrix / feature_overview 的结果可一键转富展示看板 HTML(QoderWork 嵌入对话 / CLI 落盘 journal):
128
- ```bash
129
- # 影响传播树(分层 upstream/downstream 可折叠)
130
- $PY "$R/.qoder/scripts/validation/metrics/present_board.py" impact --entity <符号> --project-id <UUID>
131
- # 测试覆盖热力图(功能×测试 有/无)
132
- $PY "$R/.qoder/scripts/validation/metrics/present_board.py" coverage --project-id <UUID>
133
- # 功能画像卡(端点+按钮+用例+页面+PRD)
134
- $PY "$R/.qoder/scripts/validation/metrics/present_board.py" feature --feature <功能名> --project-id <UUID>
135
- ```
136
- - **QoderWork 桌面端**(cap.present.available):HTML 嵌入对话流,富展示取代纯文本表格
137
- - **CLI/IDE**:落盘 `workspace/members/{dev}/journal/{name}-{ts}.html`,输出路径供打开
138
- - 不用 cap.present 也能跑——上面的能力表是纯文本调用,富展示只是增强可视化(T244 接入点)
139
-
140
- ## 快速判断该用哪个
141
-
142
- - **"这个功能怎么实现 / 相关代码有哪些"** → 先 `rag_search`(语义最全),不够再 `search_code`
143
- - **"这个功能的业务流程是什么 / 整体怎么运转"** → `ask_corpus`(GraphRAG 问答)
144
- - **"这个功能已经有了吗"** → `prd` 查需求 + `feature` 看画像
145
- - **"改这个会影响谁"** → `impact`
146
- - **"哪些功能缺测试"** → `coverage`
147
- - **"盘点流程有几步"** → `workflow` 或 `ask_corpus`
148
- - **"XX 谁调用了/调用链"** → `context360` 或 `hop`
149
- - **写 PRD 前一次取全** → `rag_search` + `context_pack --role pm`
150
- - **出原型前** → `design_system` + `fill_prototype`
151
-
152
- ## 字段/页面风格/组件
153
-
154
- 这些不是 MCP 工具,走 CLI 降级:
155
-
156
- ```
157
- cap.mcp.call("search_code", {"keyword": "--field <字段名>"}) # 字段搜索
158
- cap.mcp.call("search_code", {"keyword": "--style table"}) # 风格搜索
159
- cap.mcp.call("search_code", {"keyword": "--list"}) # Top50 关键词
160
- cap.mcp.call("search_code", {"keyword": "--modules"}) # 项目模块概览
161
- cap.mcp.call("search_code", {"keyword": "--components"}) # 组件使用统计
162
- ```
163
-
164
- ## 数据库查询(真实库表结构/数据/枚举)— ⚠️ 强制先问环境
165
-
166
- 当用户意图涉及**数据库 / 表结构 / 字段 / 枚举取值 / 真实数据**,走 `cap.mcp.call("list_envs")` 等,**不走知识图谱**。
167
-
168
- 可用工具(全部带可选 `env` 参数):
169
- - `cap.mcp.call("list_envs", {})` — 列出所有可用环境(**第一步必须先调这个**)
170
- - `cap.mcp.call("query_schema", {"table": "t_xxx", "env": "test"})` — 表结构
171
- - `cap.mcp.call("query_data", {"table": "t_xxx", "env": "test"})` — 数据
172
- - `cap.mcp.call("query_distinct", {"table": "t_xxx", "column": "status", "env": "test"})` — 枚举值
173
-
174
- ### 🔒 安全红线:查库前必须先问环境(不可跳过)
175
-
176
- **标准流程:**
177
- 1. **先调 `cap.mcp.call("list_envs", {})`** 拿到所有环境标签,列给用户选
178
- 2. **用户明确选定后**,后续工具调用都带上 `env=<用户选的标签>`
179
- 3. 生产环境 🔴 真实数据,仅供核对字段含义/格式,**禁止作为业务结论外传**
180
-
181
- ## 没给参数时
182
-
183
- 如果用户没给关键词/子命令,先问意图,或跑 `cap.mcp.call("search_code", {"keyword": "--list"})` 列出热门关键词让用户选。
184
-
185
- ## DO NOT grep the entire codebase
186
-
187
- 🚫 **绝对禁止**用 `findstr /s`、`grep -r`、`os.walk`、`subprocess` 全盘递归扫 data/code。
188
-
189
- **中文文案/报错溯源**(用户查的是中文短语),**唯一合法方式**:
190
- > 先定位仓库根 `R`(Mac 只有 python3, 两个都试):
191
- > `R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
192
- PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)`
193
- ```bash
194
- # grep-text 走 CLI 降级(不是 MCP 工具)
195
- $PY "$R/.qoder/scripts/orchestration/wlkj.py" kg grep-text 车辆不存在 --ext java --limit 20
196
- ```
197
-
198
- ## How to Use Results
199
-
200
- 1. 三路检索并用时:先讲业务流程(ask_corpus),再列相关代码/字段(rag_search),精确符号补 search_code
201
- 2. Pick the most relevant files (2-3 max)
202
- 3. Read ONLY those files directly
203
- 4. Answer the user's question — 提炼后回答,别贴原始输出
204
-
205
- ## Examples
206
-
207
- - `/wl-search 车辆保养` → 先 `rag_search({"query":"车辆保养","top_k":8})`(语义最全),有流程问题再 `ask_corpus({"q":"车辆保养流程"})`
208
- - `/wl-search 车辆保养的业务流程是什么` → `cap.mcp.call("ask_corpus", {"q": "车辆保养的业务流程是什么", "top_k": 3})`
209
- - `/wl-search handleExport 在哪` → `cap.mcp.call("search_code", {"keyword": "handleExport"})`(精确符号)
210
- - `/wl-search --api salary` → `cap.mcp.call("search_api", {"keyword": "salary"})`
211
- - `/wl-search 改 /asset 影响谁` → `cap.mcp.call("get_impact", {"endpoint": "/asset"})`
212
- - `/wl-search 哪些功能没测试` → `cap.mcp.call("coverage_matrix", {})`
213
- - `/wl-search t_quality_case 表结构` → 先 `list_envs()` 问环境 → `query_schema`
214
- - `/wl-search 资产管理功能画像` → `cap.mcp.call("feature_overview", {"feature": "资产管理"})`
215
- - `/wl-search 车辆不存在报错从哪来` → `wlkj.py kg grep-text 车辆不存在 --ext java`
1
+ ---
2
+ name: wl-search
3
+ description: "查代码/业务/API/字段/PRD + 知识图谱。MCP工具优先,禁跑本地脚本。"
4
+ argument-hint: "[搜索词或问题]"
5
+ auto-approve: true
6
+ allowed-tools: [Read, Glob, Grep, Bash, Write, Edit]
7
+ ---
216
8
 
9
+ # /wl-search - 搜索/知识问答
217
10
 
218
- ## 🚨 接地铁律(防幻觉/保真)
11
+ User input: $ARGUMENTS
219
12
 
220
- 1. **溯源**:引用代码符号/表名/接口用真实原名(如 `CostApplyController`、`base_asset`),非中文描述
221
- 2. **禁编**:不编造未在召回里出现的类名/表名/字段;召回不足标"待确认",诚实优于编造
222
- 3. **接地**:涉及数据表时先调 MCP `schema_link` 取真表;未召回禁编 t_xxx 表名
223
- 4. **完整**:产物详尽展开,不一行带过
13
+ ## 🚨 铁律:MCP工具优先,禁止跑本地脚本
14
+
15
+ **绝不跑 wlkj.py kg grep-text/context 等本地脚本(本地kg空)。直接用MCP工具:**
16
+
17
+ | 意图 | 工具 | 示例参数 |
18
+ |---|---|---|
19
+ | 查代码在哪 | search_code | {keyword: "考勤", platform: "web"} |
20
+ | 全上下文 | context_pack | {keyword: "车辆保养", platform: "app"} |
21
+ | 业务流程 | rag_search | {query: "保险流程"} |
22
+ | 改XX影响谁 | get_impact | {endpoint: "/asset"} |
23
+ | 功能画像 | feature_profile | {feature: "资产管理"} |
24
+ | 字段在哪用 | search_field | {field: "plateNo"} |
25
+ | 设计规范 | get_design_system | {platform: "web"} |
26
+
27
+ > QoderWork工具名: mcp__qoder-knowledge-graph__<工具名>
28
+
29
+ ## 意图路由(按用户问题特征)
30
+
31
+ - "XX在哪/XX代码" → search_code
32
+ - "XX怎么运转/XX流程" → context_pack + semantic_search
33
+ - "改XX影响谁" → get_impact
34
+ - "XX字段/XX表结构" → search_field
35
+ - 模糊/概念问题 → semantic_search
36
+
37
+ **一次调1-2个工具就够,不要串行调5个。**
38
+
39
+ ## 🚨 接地铁律
40
+
41
+ 1. **溯源**:引用符号用真实原名,非中文描述
42
+ 2. **禁编**:不编造未召回的类名/表名;召回不足标"待确认"
43
+ 3. **接地**:涉及表结构时先调search_field
44
+ 4. **完整**:答案详尽展开