@hupan56/wlkj 3.1.32 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/bin/cli.js +117 -0
  2. package/package.json +1 -1
  3. package/templates/qoder/agents/insight-planning.md +67 -67
  4. package/templates/qoder/agents/prd-reference.md +47 -47
  5. package/templates/qoder/commands/optional/wl-insight.md +4 -4
  6. package/templates/qoder/commands/optional/wl-report.md +1 -1
  7. package/templates/qoder/commands/optional/wl-spec.md +23 -3
  8. package/templates/qoder/commands/optional/wl-status.md +12 -1
  9. package/templates/qoder/commands/wl-code.md +138 -7
  10. package/templates/qoder/commands/wl-commit.md +12 -1
  11. package/templates/qoder/commands/wl-design.md +70 -6
  12. package/templates/qoder/commands/wl-init.md +27 -0
  13. package/templates/qoder/commands/wl-prd.md +230 -15
  14. package/templates/qoder/commands/wl-req.md +10 -3
  15. package/templates/qoder/commands/wl-search.md +74 -20
  16. package/templates/qoder/commands/wl-task.md +3 -3
  17. package/templates/qoder/commands/wl-test.md +17 -2
  18. package/templates/qoder/contracts/CHANGELOG.md +418 -0
  19. package/templates/qoder/contracts/README.md +180 -0
  20. package/templates/qoder/contracts/code.md +82 -0
  21. package/templates/qoder/contracts/commit.md +86 -0
  22. package/templates/qoder/contracts/contract-header.md +76 -0
  23. package/templates/qoder/contracts/design.md +106 -0
  24. package/templates/qoder/contracts/fallback.md +126 -0
  25. package/templates/qoder/contracts/isolation.md +119 -0
  26. package/templates/qoder/contracts/prd.md +118 -0
  27. package/templates/qoder/contracts/schemas/design-spec.schema.json +46 -0
  28. package/templates/qoder/contracts/schemas/prd.schema.json +36 -0
  29. package/templates/qoder/contracts/schemas/test-cases.schema.json +40 -0
  30. package/templates/qoder/contracts/spec.md +116 -0
  31. package/templates/qoder/contracts/task.md +125 -0
  32. package/templates/qoder/contracts/test.md +112 -0
  33. package/templates/qoder/hooks/post-tool-use.py +61 -0
  34. package/templates/qoder/hooks/session-start.py +34 -66
  35. package/templates/qoder/hooks/stop-eval.py +47 -0
  36. package/templates/qoder/rules/wl-pipeline.md +37 -0
  37. package/templates/qoder/scripts/capability/__pycache__/__init__.cpython-39.pyc +0 -0
  38. package/templates/qoder/scripts/capability/__pycache__/registry.cpython-39.pyc +0 -0
  39. package/templates/qoder/scripts/capability/__pycache__/registry_mcp.cpython-39.pyc +0 -0
  40. package/templates/qoder/scripts/capability/adapters/__init__.py +1 -1
  41. package/templates/qoder/scripts/capability/adapters/__pycache__/__init__.cpython-39.pyc +0 -0
  42. package/templates/qoder/scripts/capability/adapters/__pycache__/cli.cpython-39.pyc +0 -0
  43. package/templates/qoder/scripts/capability/adapters/__pycache__/mcp.cpython-39.pyc +0 -0
  44. package/templates/qoder/scripts/capability/adapters/__pycache__/qw.cpython-39.pyc +0 -0
  45. package/templates/qoder/scripts/capability/adapters/mcp.py +76 -100
  46. package/templates/qoder/scripts/capability/adapters/qw.py +295 -295
  47. package/templates/qoder/scripts/capability/caps/__init__.py +1 -1
  48. package/templates/qoder/scripts/capability/caps/__pycache__/__init__.cpython-39.pyc +0 -0
  49. package/templates/qoder/scripts/capability/caps/__pycache__/context.cpython-39.pyc +0 -0
  50. package/templates/qoder/scripts/capability/caps/__pycache__/cron.cpython-39.pyc +0 -0
  51. package/templates/qoder/scripts/capability/caps/__pycache__/identity.cpython-39.pyc +0 -0
  52. package/templates/qoder/scripts/capability/caps/__pycache__/memory.cpython-39.pyc +0 -0
  53. package/templates/qoder/scripts/capability/caps/__pycache__/notify.cpython-39.pyc +0 -0
  54. package/templates/qoder/scripts/capability/caps/__pycache__/present.cpython-39.pyc +0 -0
  55. package/templates/qoder/scripts/capability/caps/__pycache__/repo.cpython-39.pyc +0 -0
  56. package/templates/qoder/scripts/capability/caps/__pycache__/sandbox.cpython-39.pyc +0 -0
  57. package/templates/qoder/scripts/capability/caps/memory.py +1 -1
  58. package/templates/qoder/scripts/capability/registry.py +21 -23
  59. package/templates/qoder/scripts/capability/registry_mcp.py +69 -5
  60. package/templates/qoder/scripts/capability/smoke_test_report.json +34 -20
  61. package/templates/qoder/scripts/deployment/setup/carriers.py +3 -1
  62. package/templates/qoder/scripts/deployment/setup/init_doctor.py +10 -3
  63. package/templates/qoder/scripts/deployment/setup/install_qoderwork.py +11 -0
  64. package/templates/qoder/scripts/deployment/setup/wlkj_shim.py +104 -0
  65. package/templates/qoder/scripts/domain/__pycache__/__init__.cpython-39.pyc +0 -0
  66. package/templates/qoder/scripts/domain/deployment/deploy_to_test.py +298 -0
  67. package/templates/qoder/scripts/domain/integration/__init__.py +0 -0
  68. package/templates/qoder/scripts/domain/integration/__pycache__/__init__.cpython-39.pyc +0 -0
  69. package/templates/qoder/scripts/domain/integration/__pycache__/return_to_platform.cpython-39.pyc +0 -0
  70. package/templates/qoder/scripts/domain/integration/return_to_platform.py +392 -0
  71. package/templates/qoder/scripts/domain/integration/spec_upload.py +209 -0
  72. package/templates/qoder/scripts/domain/kg/build/kg_build.py +268 -25
  73. package/templates/qoder/scripts/domain/kg/build/kg_incremental.py +108 -3
  74. package/templates/qoder/scripts/domain/kg/build/kg_signatures.py +169 -0
  75. package/templates/qoder/scripts/domain/kg/extract/asset/__init__.py +10 -0
  76. package/templates/qoder/scripts/domain/kg/extract/asset/asset_tree.py +57 -0
  77. package/templates/qoder/scripts/domain/kg/extract/asset/discussion_importer.py +62 -0
  78. package/templates/qoder/scripts/domain/kg/extract/asset/prd_importer.py +146 -0
  79. package/templates/qoder/scripts/domain/kg/extract/asset/prototype_importer.py +64 -0
  80. package/templates/qoder/scripts/domain/kg/extract/asset/returns_importer.py +52 -0
  81. package/templates/qoder/scripts/domain/kg/extract/build_goal3.py +104 -0
  82. package/templates/qoder/scripts/domain/kg/extract/build_goal4.py +55 -0
  83. package/templates/qoder/scripts/domain/kg/extract/build_goal5.py +95 -0
  84. package/templates/qoder/scripts/domain/kg/extract/db/__init__.py +8 -0
  85. package/templates/qoder/scripts/domain/kg/extract/db/data_profile.py +22 -0
  86. package/templates/qoder/scripts/domain/kg/extract/db/fk_extractor.py +55 -0
  87. package/templates/qoder/scripts/domain/kg/extract/db/schema_extractor.py +90 -0
  88. package/templates/qoder/scripts/domain/kg/extract/extract.py +84 -0
  89. package/templates/qoder/scripts/domain/kg/extract/extract.py.bak +430 -0
  90. package/templates/qoder/scripts/domain/kg/extract/inference/__init__.py +9 -0
  91. package/templates/qoder/scripts/domain/kg/extract/inference/community_summarizer.py +206 -0
  92. package/templates/qoder/scripts/domain/kg/extract/inference/embed_builder.py +132 -0
  93. package/templates/qoder/scripts/domain/kg/extract/inference/naming_matcher.py +80 -0
  94. package/templates/qoder/scripts/domain/kg/extract/inference/promote.py +59 -0
  95. package/templates/qoder/scripts/domain/kg/extract/inference/recompute.py +93 -0
  96. package/templates/qoder/scripts/domain/kg/extract/inference/weak_link.py +421 -0
  97. package/templates/qoder/scripts/domain/kg/extract/java/__init__.py +15 -0
  98. package/templates/qoder/scripts/domain/kg/extract/java/_parser.py +271 -0
  99. package/templates/qoder/scripts/domain/kg/extract/java/all.py +145 -0
  100. package/templates/qoder/scripts/domain/kg/extract/java/build_java_to_pg.py +102 -0
  101. package/templates/qoder/scripts/domain/kg/extract/java/call_chain.py +49 -0
  102. package/templates/qoder/scripts/domain/kg/extract/java/class_extractor.py +141 -0
  103. package/templates/qoder/scripts/domain/kg/extract/java/domain_extractor.py +148 -0
  104. package/templates/qoder/scripts/domain/kg/extract/java/dubbo_extractor.py +33 -0
  105. package/templates/qoder/scripts/domain/kg/extract/java/endpoint_extractor.py +36 -0
  106. package/templates/qoder/scripts/domain/kg/extract/java/javadoc_extractor.py +110 -0
  107. package/templates/qoder/scripts/domain/kg/extract/java/llm_cn_filler.py +150 -0
  108. package/templates/qoder/scripts/domain/kg/extract/java/member_extractor.py +157 -0
  109. package/templates/qoder/scripts/domain/kg/extract/java/mybatisplus_extractor.py +34 -0
  110. package/templates/qoder/scripts/domain/kg/extract/java/pg_upsert.py +165 -0
  111. package/templates/qoder/scripts/domain/kg/extract/java/satoken_extractor.py +30 -0
  112. package/templates/qoder/scripts/domain/kg/extract/java/spring_extractor.py +39 -0
  113. package/templates/qoder/scripts/domain/kg/extract/java/validation_extractor.py +33 -0
  114. package/templates/qoder/scripts/domain/kg/extract/mybatis/__init__.py +9 -0
  115. package/templates/qoder/scripts/domain/kg/extract/mybatis/all.py +79 -0
  116. package/templates/qoder/scripts/domain/kg/extract/mybatis/mapper_parser.py +99 -0
  117. package/templates/qoder/scripts/domain/kg/extract/mybatis/relation_builder.py +69 -0
  118. package/templates/qoder/scripts/domain/kg/extract/mybatis/sql_extractor.py +78 -0
  119. package/templates/qoder/scripts/domain/kg/extract/prd/__init__.py +8 -0
  120. package/templates/qoder/scripts/domain/kg/extract/prd/prd_chunk_embed.py +105 -0
  121. package/templates/qoder/scripts/domain/kg/extract/prd/prd_llm_extract.py +153 -0
  122. package/templates/qoder/scripts/domain/kg/extract/prd/req_anchor.py +120 -0
  123. package/templates/qoder/scripts/domain/kg/extract/ts_extract.py +111 -0
  124. package/templates/qoder/scripts/domain/kg/graph/kg_semantic.py +4 -2
  125. package/templates/qoder/scripts/domain/kg/kg.py +42 -5
  126. package/templates/qoder/scripts/domain/kg/search/_remote.py +187 -0
  127. package/templates/qoder/scripts/domain/kg/search/context_pack.py +32 -2
  128. package/templates/qoder/scripts/domain/kg/search/search_index.py +74 -20
  129. package/templates/qoder/scripts/domain/kg/storage/kg_duckdb.py +43 -0
  130. package/templates/qoder/scripts/domain/kg/switch_project.py +159 -0
  131. package/templates/qoder/scripts/domain/kg/sync_repowiki.py +109 -0
  132. package/templates/qoder/scripts/domain/requirement/req.py +134 -28
  133. package/templates/qoder/scripts/domain/task/__pycache__/wlkj_panel.cpython-39.pyc +0 -0
  134. package/templates/qoder/scripts/domain/task/wlkj_panel.py +1348 -0
  135. package/templates/qoder/scripts/engine/poller.py +219 -0
  136. package/templates/qoder/scripts/foundation/__pycache__/__init__.cpython-39.pyc +0 -0
  137. package/templates/qoder/scripts/foundation/core/__pycache__/__init__.cpython-39.pyc +0 -0
  138. package/templates/qoder/scripts/foundation/core/__pycache__/paths.cpython-39.pyc +0 -0
  139. package/templates/qoder/scripts/foundation/core/paths.py +102 -0
  140. package/templates/qoder/scripts/foundation/integrations/active_task.py +2 -1
  141. package/templates/qoder/scripts/orchestration/wlkj.py +4 -0
  142. package/templates/qoder/scripts/protocol/__pycache__/__init__.cpython-39.pyc +0 -0
  143. package/templates/qoder/scripts/protocol/mcp/zentao_mcp_server.py +24 -11
  144. package/templates/qoder/scripts/protocol/transports/__pycache__/__init__.cpython-39.pyc +0 -0
  145. package/templates/qoder/scripts/protocol/transports/__pycache__/base.cpython-39.pyc +0 -0
  146. package/templates/qoder/scripts/protocol/transports/__pycache__/cli.cpython-39.pyc +0 -0
  147. package/templates/qoder/scripts/protocol/transports/__pycache__/http.cpython-39.pyc +0 -0
  148. package/templates/qoder/scripts/protocol/transports/__pycache__/stdio.cpython-39.pyc +0 -0
  149. package/templates/qoder/scripts/protocol/transports/http.py +7 -1
  150. package/templates/qoder/scripts/validation/eval/qwork_harness.py +1 -1
  151. package/templates/qoder/scripts/validation/eval/report-commands.md +2 -2
  152. package/templates/qoder/settings.json +27 -9
  153. package/templates/qoder/skills/design-import/SKILL.md +3 -3
  154. package/templates/qoder/skills/design-review/SKILL.md +1 -1
  155. package/templates/qoder/skills/prd-generator/SKILL.md +4 -4
  156. package/templates/qoder/skills/prd-review/SKILL.md +1 -1
  157. package/templates/qoder/skills/prototype-generator/SKILL.md +3 -3
  158. package/templates/qoder/skills/spec-coder/SKILL.md +1 -1
  159. package/templates/qoder/skills/spec-generator/SKILL.md +80 -23
  160. package/templates/qoder/skills/test-generator/SKILL.md +1 -1
  161. package/templates/qoder/skills/wl-code/SKILL.md +13 -1
  162. package/templates/qoder/skills/wl-commit/SKILL.md +1 -1
  163. package/templates/qoder/skills/wl-design/SKILL.md +6 -6
  164. package/templates/qoder/skills/wl-init/SKILL.md +2 -2
  165. package/templates/qoder/skills/wl-insight/SKILL.md +5 -5
  166. package/templates/qoder/skills/wl-prd/SKILL.md +60 -0
  167. package/templates/qoder/skills/wl-report/SKILL.md +2 -2
  168. package/templates/qoder/skills/wl-search/SKILL.md +1 -1
  169. package/templates/qoder/skills/wl-spec/SKILL.md +2 -2
  170. package/templates/qoder/skills/wl-status/SKILL.md +2 -2
  171. package/templates/qoder/skills/wl-task/SKILL.md +3 -3
  172. package/templates/qoder/skills/wl-test/SKILL.md +2 -2
  173. package/templates/qoder/templates/spec-template.md +124 -0
  174. package/templates/root/AGENTS.md +41 -14
  175. package/templates/qoder/scripts/domain/task/zentao_panel.py +0 -451
  176. package/templates/qoder/skills/wl-prd-full/SKILL.md +0 -121
  177. package/templates/qoder/skills/wl-prd-quick/SKILL.md +0 -50
  178. package/templates/qoder/skills/wl-prd-review/SKILL.md +0 -47
@@ -20,11 +20,22 @@ User input: $ARGUMENTS (commit message)
20
20
  5. Commit with message
21
21
  6. Pull latest from remote (sync)
22
22
  7. Push to remote
23
- 8. Record to learning system
23
+ 8. 回流平台:提交 + push 后执行回流,把本次 commit 沉淀到平台知识层
24
+ ```bash
25
+ python -m domain.integration.return_to_platform commit --last
26
+ ```
27
+ - 自动取 HEAD commit(sha/message/author/时间)→ POST 平台 `/api/git/commits/record`
28
+ - message 里的 `[#REQ-xxx]` / `[#<禅道号>]` 平台自动解析,建 commit→需求 边
29
+ - 失败只告警不阻塞(回流是增强,主流程 commit 已落地)
24
30
 
25
31
  ## Pre-commit Quality Gate
26
32
  Before committing, check:
27
33
  - [ ] All tests pass (if /wl-test was run)
28
34
  - [ ] No TODO/FIXME left in code
29
35
  - [ ] Commit tagged [ai-generated] or [ai-assisted]
36
+ - [ ] Commit message 含需求标记 `[#REQ-xxx]` 或 `[#<禅道号>]`(关联平台需求,回流自动建边;多需求 `[#REQ-aaa][#REQ-bbb]`)
30
37
  - [ ] Amount fields use BigDecimal (if applicable)
38
+
39
+ ## 下一步
40
+ - 提交回流成功后,更新任务状态:`/wl-task finish <REQ-ID>`(标记开发完成,同步禅道)
41
+ - 查看本次提交在需求链路的位置:平台资产中心 → 需求 → 变更史
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wl-design
3
- description: "设计工序入口: import 录入设计稿→spec.json(默认) / generate 按设计spec出原型 / review 评审原型。"
3
+ description: "设计工序站: 预览(蓝湖稿→HTML预览,默认) / 扫描(看现有系统页面组件风格) / 评审(检查原型是否用系统真源)。"
4
4
  argument-hint: "[预览|扫描|评审] <蓝湖链接或功能名>"
5
5
  auto-approve: true
6
6
  allowed-tools: [Read, Glob, Grep, Bash, Write, Edit]
@@ -28,7 +28,7 @@ User input: $ARGUMENTS
28
28
 
29
29
  **场景**:设计师在蓝湖画完 UI,发链接给你,AI 一键转成 HTML 预览给产品确认交互。
30
30
 
31
- ### 流程(2 步,走 lanhu MCP
31
+ ### 流程(3 步,lanhu MCP + RAG 接地)
32
32
 
33
33
  **Step 1:列设计稿**
34
34
  ```
@@ -37,12 +37,35 @@ cap.mcp.call("lanhu_get_designs", {"url": "<蓝湖链接>"})
37
37
  - 蓝湖链接含 `pid`(项目 ID),如 `https://lanhuapp.com/web/#/item/project/stage?tid=xxx&pid=xxx`
38
38
  - 返回设计稿列表(名称 + 序号)
39
39
 
40
- **Step 2:分析出 HTML**
40
+ **Step 2:RAG 预取真实字段/组件 + 设计 token(生成 HTML 前必做,让 HTML 接地)**
41
+
42
+ 生成 HTML 前,先用 RAG 把这个功能在系统里的真实字段名、组件名、设计 token 拉出来,确保生成的 HTML 用真源不瞎编:
43
+ ```python
44
+ from capability import resolve
45
+ cap = resolve()
46
+ # ① rag_search 语义召回:真实字段名 / 已有同类页面 / 组件用法(词不必精确匹配)
47
+ rag = cap.mcp.call("rag_search", {"query": "<功能名>", "top_k": 10})
48
+ # ② 设计系统 token:主色/字号/间距/组件规范(不是随便填的色值)
49
+ ds = cap.mcp.call("get_design_system", {"platform": "web"}) # 或 "app"
50
+ ```
51
+ - 从 rag_search 结果里抠出:**真实字段名**(如 `vehicleNo`/`maintainDate`)、**已有同类页面**参考、**可复用组件**
52
+ - 从 get_design_system 抠出:**颜色 token / 字号 / 间距 / 组件规范**
53
+ - 这些是 Step 3 生成 HTML 的"真源清单",HTML 里用到的字段名/色值必须从这里来
54
+
55
+ **Step 3:分析出 HTML**
41
56
  ```
42
57
  cap.mcp.call("lanhu_get_ai_analyze_design_result", {"url": "<蓝湖链接>", "design_names": "<名称或序号或all>"})
43
58
  ```
44
59
  - 返回 **HTML+CSS 代码**(工具原文:"GET VISUAL CONTENT + HTML CODE")
45
60
  - AI 把返回的 HTML 存成文件:`workspace/members/{developer}/drafts/prototype-{feature}.html`
61
+ - ⚠️ **接地**:HTML 里的字段名/表单项用 Step 2 rag_search 召回的真实字段名(不是蓝湖稿上的占位文字),色值/间距用 get_design_system 的 token
62
+
63
+ ### 🎯 接地铁律(生成 HTML 必须遵守)
64
+
65
+ **HTML 里的每个字段名、每个色值、每个组件,都要有 rag_search / get_design_system 的来源,不瞎编:**
66
+ - 表单字段 → 用 rag_search 召回的真实字段名(如 `vehicleNo` 不是"车牌号输入框"占位)
67
+ - 颜色 → 用 get_design_system 的 token(如 `#1677ff` 不是随便填的 `#1890ff`)
68
+ - 组件 → 用系统里已有的(Ant Design Vue / Vant),不用 emoji 当图标
46
69
 
47
70
  ### 完成后提示
48
71
  ```
@@ -62,9 +85,16 @@ cap.mcp.call("lanhu_get_ai_analyze_design_result", {"url": "<蓝湖链接>", "de
62
85
 
63
86
  **场景**:画 UI 前想看现有系统有哪些页面、用什么风格、有哪些组件可复用。
64
87
 
65
- ### 流程(1 次调用取全)
66
- ```
67
- cap.mcp.call("context_pack", {"keyword": "<功能名>", "platform": "web"})
88
+ ### 流程(RAG 语义召回 + 全上下文,1 次取全)
89
+
90
+ **优先 rag_search(语义召回最全)+ context_pack,不要只靠 search_code 关键词。**
91
+ ```python
92
+ from capability import resolve
93
+ cap = resolve()
94
+ # ① rag_search 语义召回:同类页面 / 字段 / 组件用法(召回最全)
95
+ rag = cap.mcp.call("rag_search", {"query": "<功能名>", "top_k": 10})
96
+ # ② context_pack 一次取全 8 段
97
+ ctx = cap.mcp.call("context_pack", {"keyword": "<功能名>", "platform": "web"})
68
98
  ```
69
99
  返回 8 段:相关代码 + 同类页面 + 字段 + API + 风格 token + 组件 + 数据库表结构。
70
100
 
@@ -126,3 +156,37 @@ PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)`
126
156
  ```bash
127
157
  $PY "$R/.qoder/scripts/orchestration/wlkj.py" learn record review_done "{\"target\":\"$feature\",\"result\":\"$pass_or_issues\"}"
128
158
  ```
159
+
160
+ ---
161
+
162
+ ## 🔄 回流平台(原型生成后即执行,别漏)
163
+
164
+ **铁律:HTML 预览生成后必须回流平台**(否则平台 AI回流 Tab 永远空,知识层↔引擎断裂)。
165
+ 回流走平台 MCP 写工具(`create_prototype` / `submit_return`),失败不影响主流程。
166
+
167
+ 原型存成文件后跑这一条(用前面定的 `$PY` / `$R` 变量):
168
+ ```bash
169
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" return prototype <原型HTML路径> "<功能名>" --platform <web|app>
170
+ ```
171
+ - 内部优先调 `cap.mcp.call("create_prototype", {feature, platform, html_content})` 写 prototype 表 + 存 HTML;
172
+ - 失败再 `submit_return`(return_type=prototype)写 returns 待审核;最后 HTTP 兜底(读 mcp_config.json 的 return_endpoint)。
173
+ - 全程 try/except,回流失败原型仍在本地,主流程不阻塞。
174
+
175
+ > 等价的 MCP 直调写法(脚本不可用时的兜底):
176
+ > `cap.mcp.call("create_prototype", {"feature": "<功能名>", "platform": "web", "html_content": "<完整HTML>"})`
177
+ > 或 `cap.mcp.call("submit_return", {"title":"原型-<功能>", "return_type":"prototype", "source":"/wl-design", "content_full":"<HTML>"})`
178
+
179
+ 回流成功后输出一行:`✅ [回流] via=create_prototype/submit_return <message>`。
180
+
181
+ ## 🧠 学习沉淀(原型生成后即执行,反哺下次)
182
+
183
+ 生成原型时发现的设计规律/用户偏好/页面结构经验,调 learn 写回平台:
184
+ ```python
185
+ cap.mcp.call("learn", {
186
+ "project_id": "<项目UUID>",
187
+ "category": "preference", # preference=设计偏好 / rule=页面规律 / decision=组件选择
188
+ "pattern": "<学到的,如:车辆列表页用紧凑表格+状态色彩标签,搜索栏放右上角>",
189
+ "source": "wlkj/wl-design",
190
+ })
191
+ ```
192
+ - 至少写 1 条。try/except 不阻塞。
@@ -57,6 +57,33 @@ After doctor finishes:
57
57
  |------|------|
58
58
  | 本周已 init 过 / 周五任务跑过 | 索引新鲜(≤7天) -> 全部跳过, 秒级完成 |
59
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/wlinkj-workflow/mcp_config.json" "$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、回流地址。不同人选不同项目 = 完全隔离。**
60
87
  | 全新机器 | 克隆仓库 + 全量构建一次, 之后永远增量 |
61
88
  | 团队其他人已更新图谱 | team_sync pull 直接拿到, 本机不用构建 |
62
89
 
@@ -13,8 +13,36 @@ User input: $ARGUMENTS
13
13
  > **写需求 / 评审需求,一个命令搞定。**
14
14
  > 模块契约:`.qoder/contracts/prd.md`
15
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
+ ## 🧠 Planning Agent(宿主原生能力利用)
27
+ > 如果 Qoder 支持 Planning Agent 模式,PRD 生成时建议先 Planning:
28
+ > 1. 切到 Planning Agent 模式(或在 Agent 模式下让 AI 先出计划)
29
+ > 2. 输入需求 + MCP context_pack 结果
30
+ > 3. AI 自动拆成章节计划(需求概述→字段→接口→非功能→里程碑)
31
+ > 4. 逐章生成,每章参考 MCP 知识上下文
32
+ > 5. 全部完成后调 MCP submit_return 回流平台
33
+ >
34
+ > **不用 Planning 也能跑**——直接让 Agent 按下文步骤执行。
35
+ > Planning 只是让结构更完整、不漏章节。
36
+
16
37
  ## 🚦 路由(看第一个词或描述特征)
17
38
 
39
+ ### 🔴 命令优先铁律(最重要,先读)
40
+ **只要用户打了 `/wl-prd`,就必须产出 PRD,绝不跨命令跑去别处。**
41
+ 哪怕描述含"报错/无法提交/bug/异常"这类词(如"养护计划无法提交,时间报错"——这是要为修复写需求),也走本命令出 PRD,**不准**跑去 `/wl-test`(测试)/ `/wl-code`(直接改码)/ 排查。
42
+ - 用户要写需求 → 本命令(不管描述像 bug 还是新功能)
43
+ - 用户要直接改代码 → 那是 `/wl-code`,但前提是用户打的是 `/wl-code`
44
+ - 判断不准 → 问一句,不要擅自换命令
45
+
18
46
  | 用户说 | 模式 | 走哪个 |
19
47
  |--------|------|--------|
20
48
  | "完整""深度""正经需求" 或 描述含"新模块/新业务/新流程" | **完整** | prd-full-template(13 章)|
@@ -29,32 +57,84 @@ User input: $ARGUMENTS
29
57
 
30
58
  ---
31
59
 
60
+ ## 🔧 仓库根定位(完整档/快速档共用,进任何模式前先跑这一条)
61
+
62
+ > QoderWork 桌面端 cwd 不在仓库根(在 `.qoderwork/workspace/xxx`),相对路径
63
+ > `.qoder/scripts/...` **必然失败**(真实踩坑:连续 2 条命令报错浪费一轮)。
64
+ > 进模式前**必须先定位仓库根**。Mac 只有 python3,两个都试:
65
+
66
+ ```bash
67
+ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
68
+ PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
69
+ ```
70
+ > 后续所有 `$PY "$R/.qoder/scripts/..."` 都用这两个变量。**不准自己编 `cd /d` / 裸相对路径**。
71
+
72
+ ---
73
+
32
74
  ## 完整模式(13 章 PRD)
33
75
 
34
76
  **新模块/新业务/新流程用这个。** 支持衔接 insight:`参考:<报告路径>`
35
77
 
36
78
  **铁律:平台必问。** 先问:
37
- ``
79
+ ```
38
80
  这个需求是针对哪个平台?
39
81
  1. Web 管理端 (fywl-ui)
40
82
  2. APP 移动端 (Carmg-H5)
41
83
  3. 两端都要
42
84
  请选择 (1/2/3):
43
- ``
85
+ ```
44
86
 
45
- ### 取上下文(1 次调用取全 8 段)
46
- 先定位仓库根(Mac 只有 python3, 两个都试):
47
- ``bash
48
- R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
49
- PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
50
- ``
51
- ``bash
87
+ ### 取上下文(context_pack Fast Path 为主 + rag_search/context_360 兜底 — 语义召回最全,接地写 PRD)
88
+
89
+ **写 PRD 前必做的知识预取:Fast Path 用 context_pack 一次取全(代码+API+字段+风格+相关PRD),替代 rag_search+context_360 两次往返;再叠 ask_corpus(业务流程)+ get_learnings(之前学到的)+ query_schema(真库表结构)。不要只靠 search_code 关键词。**
90
+
91
+ ```python
92
+ from capability import resolve
93
+ cap = resolve()
94
+ # ⓪ req_trace 查同需求历史画像(防重复造轮子):有 REQ-ID 时先查这个需求已有哪些 PRD/代码/表
95
+ if <有 REQ-ID>:
96
+ cap.mcp.call("req_trace", {"req_id": "<REQ-ID>"}) # 返回 PRD+代码+表+测试,避免重复写已有功能
97
+ # ① context_pack Fast Path(1 次往返取全上下文:代码+API+字段+风格+相关PRD)
98
+ # 等价于 rag_search + context_360 合并,轮次减半(原 5 次 → 3 次)
99
+ pack = cap.mcp.call("context_pack", {"query": "<业务词或需求描述>", "project_id": "<项目UUID>"})
100
+ # ①b 召回不够(缺某类/命中为空)时单独补 rag_search 一次(语义召回兜底,fallback)
101
+ if not pack.get("items"):
102
+ rag = cap.mcp.call("rag_search", {"query": "<业务词或需求描述>", "top_k": 10})
103
+ # ①c 仍需某核心业务对象的完整关联(代码+页面+字段+API)时,补 context_360(fallback)
104
+ if <需要某符号的全上下文>:
105
+ ctx = cap.mcp.call("context_360", {"symbol": "<核心业务对象>"})
106
+ # ② 有"业务流程整体怎么运转"的疑问时,补 ask_corpus 拿 GraphRAG 答案
107
+ flow = cap.mcp.call("ask_corpus", {"q": "<业务词>的业务流程是什么", "top_k": 3})
108
+ # ③ get_learnings 查之前学到的业务规则/偏好(反哺:上次踩的坑这次别犯)
109
+ learnings = cap.mcp.call("get_learnings", {"project_id": "<项目UUID>", "limit": 10})
110
+ # ④ query_schema 查真实数据库表结构(引擎自己的 MySQL MCP,拿到的真表回流平台)
111
+ # 推断涉及哪些表(从 pack 命中里找表名),查真结构
112
+ schema = cap.mcp.call("query_schema", {"table": "<表名>"}) # 引擎 qoder-mysql 工具
113
+ # 查到后把真表结构回流平台(learn 写回,平台数据库知识就有了真实数据)
114
+ if schema and schema.get("columns"):
115
+ cap.mcp.call("learn", {"project_id":"<项目UUID>", "category":"rule",
116
+ "pattern": f"数据库表<表名>结构: {json.dumps(schema.get('columns',[]), ensure_ascii=False)[:500]}",
117
+ "source": "wlkj/wl-prd+mysql"})
118
+ # PRD 里的字段表优先用 query_schema 查到的真实列(最接地),其次用 context_pack 召回的代码字段
119
+ ```
120
+ # 写 PRD 时参考 learnings 里的规则/偏好/决策,在相关章节体现
121
+ ```
122
+ 等价 CLI(脚本兜底):
123
+ ```bash
52
124
  $PY "$R/.qoder/scripts/orchestration/wlkj.py" context <业务词> --platform <web|app>
53
- ``
125
+ ```
54
126
  - 第 4 段 = 历史 PRD(防重复)
55
127
  - 第 5 段 = 相关 API
56
128
  - 第 8 段 = 数据库表结构+真实字段
57
- - 涉及枚举字段时额外调 `cap.mcp.call("query_distinct`
129
+ - 涉及枚举字段时额外调 `cap.mcp.call("query_distinct")`
130
+
131
+ ### 🎯 接地铁律(写 PRD 必须遵守)
132
+
133
+ **用 rag_search 召回的知识写 PRD,每条功能/字段都要有 rag_search 命中的来源,不编造。**
134
+ - PRD 里写的每个字段名 → 必须在 rag_search/context_360 结果里能找到(或来自 query_schema 真实表结构)
135
+ - PRD 里写的每个 API → 必须在召回结果里有对应端点
136
+ - 召回不到的字段/API → 标注"新增(待评估)",不要假装已存在
137
+ - 业务流程描述 → 优先采纳 ask_corpus 的 GraphRAG 回答(有全局视角),再用 rag_search 的事实补充
58
138
 
59
139
  ### 产出
60
140
  - PRD: `workspace/members/{dev}/drafts/REQ-{YYYY}-{NNN}-{标题}.md`(13 章)
@@ -63,7 +143,7 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" context <业务词> --platform <we
63
143
 
64
144
  ### 原型要不要画?(融入批量确认)
65
145
 
66
- **默认建议**(用户可一键改,详见 `.qoder/skills/wl-prd-full/SKILL.md` STEP 0.5):
146
+ **默认建议**(用户可一键改):
67
147
  - 纯规则/接口/定时/参数/计算类 → **不画**(如"出交车点检固定为总部全局规则")
68
148
  - 含页面/菜单/表单/弹窗/详情/向导/看板/大屏 → **画**
69
149
  - 加字段/按钮/文案/导出 → **不画**
@@ -75,9 +155,9 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" context <业务词> --platform <we
75
155
  eval 自动跳过 A2(满分从 100 降到 70,照样 PASS);`/wl-design` `/wl-code` 据此跳过原型环节。
76
156
 
77
157
  ### 质量门禁
78
- ``bash
158
+ ```bash
79
159
  $PY "$R/.qoder/scripts/orchestration/wlkj.py" eval <prd.md> [原型.html]
80
- ``
160
+ ```
81
161
  ≥ 80% 才 PASS。完整模板见 `.qoder/templates/prd-full-template.md`。
82
162
 
83
163
  ---
@@ -88,9 +168,30 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" eval <prd.md> [原型.html]
88
168
 
89
169
  **平台必问**(同上)。
90
170
 
171
+ ### 取上下文(RAG 语义预取,禁止串行 search)
172
+
173
+ **优先 rag_search(语义召回最全)+ prefetch,不要只靠逐个 search_code 关键词。**
174
+
175
+ ```python
176
+ from capability import resolve
177
+ cap = resolve()
178
+ # ① rag_search 一次语义召回:代码/字段/API/Wiki 全拿到(按相关度排序)
179
+ rag = cap.mcp.call("rag_search", {"query": "<需求描述>", "top_k": 8})
180
+ ```
181
+ 等价 CLI:
182
+ ```bash
183
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" prefetch "<需求描述>" --platform <p>
184
+ ```
185
+ prefetch/rag_search 一次返回代码/字段/API/Wiki/历史 PRD。**之后不要逐个 search/find/grep 查词**(会变 6+ 次串行往返,轮次爆炸根因)。不够才补调一次。
186
+
187
+ **接地铁律(同完整模式)**:6 章里写的每个字段/API 必须在 rag_search 召回结果里有来源,召不到的标"新增(待评估)",不编造。
188
+
91
189
  ### 产出
92
190
  - Mini-PRD: `workspace/members/{dev}/drafts/REQ-{YYYY}-{NNN}-{标题}.md`(6 章)
93
- - 6 章:功能入口 / 需求背景 / 需求说明 / 影响范围 / 验收标准 / 不在本次范围
191
+ - **6 章缺一不可(铁律)**:功能入口 / 需求背景 / 需求说明 / 影响范围 / 验收标准 / 不在本次范围
192
+ > 🚫 **禁止只写 1-2 章就交差**(真实反面教材:海外考勤 PRD 只写了"功能入口"一段就停,6 章缺 5 章 → 残废品)。
193
+ > 即使是 bug 修复,也要写全 6 章(需求背景=bug 现象、需求说明=修复方案、验收标准=修复后行为)。
194
+ > 不涉及的章节写"不涉及"或一句话说明,**标题必须保留,不许整章省略**。Stop hook 会检测缺章并阻断。
94
195
  - 模板见 `.qoder/templates/prd-quick-template.md`
95
196
 
96
197
  ---
@@ -115,3 +216,117 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" eval <prd.md> [原型.html]
115
216
  ## 埋点
116
217
 
117
218
  PRD 生成/评审后自动记录到 learning(eval_prd.py 已内置)。
219
+
220
+ **评审模式额外**:给出 PASS/FAIL 结论后立即记一条 `review_done`(可用性指标 F2 评审级数据唯一来源,不埋则该级永远为 0):
221
+ ```bash
222
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" learn record review_done "{\"prd\": \"<被评审PRD名>\", \"verdict\": \"PASS|FAIL\"}"
223
+ ```
224
+ 埋点失败不阻塞,但能埋一定要埋。
225
+
226
+ ---
227
+
228
+ ## 📤 发禅道(PRD 写完后的衔接,完整/快速档都问)
229
+
230
+ PRD 产出后,**主动问一句**(不要默默结束):
231
+ ```
232
+ PRD 已写好: <路径>
233
+ 要发到禅道吗?(发禅道 = 建禅道需求 + 可选关联计划/版本)
234
+ ```
235
+
236
+ ### 用户说"发" → 交互式逐项确认(不要一次性全问,按需)
237
+
238
+ 用禅道 MCP 现查现选(QoderWork: `qw_mcp_call`):
239
+
240
+ **① 选产品(必选)**
241
+ - `list_products()` → 列出现有产品 → 让用户选 product_id
242
+ - 禅道需求必须挂产品,没产品发不了
243
+
244
+ **② 关联计划?(可选,问一句)**
245
+ ```
246
+ 要关联到计划(迭代)吗?(可跳过)
247
+ ```
248
+ - 用户要 → `list_plans(product_id=<上一步选的>)` → 选 plan_id
249
+ - 跳过 → 不传 plan
250
+
251
+ **③ 挂版本?(可选,问一句)**
252
+ ```
253
+ 要纳入某个版本(build)吗?(可跳过)
254
+ ```
255
+ - 用户要 → `list_builds(project_id=N)` → 选 build_id(⚠️ builds 按项目维度查最常见,禅道无"全量版本"端点)
256
+ - 跳过 → 不传 build
257
+
258
+ **④ 执行发布**
259
+ ```bash
260
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" req <REQ-ID> 发布 \
261
+ --product=<①> [--plan=<②>] [--build=<③>] --confirm
262
+ ```
263
+ - 默认先 dry-run 预览,用户确认后再 `--confirm` 真发
264
+ - 真发后禅道建好需求,PRD 末尾自动回写 `<!-- zentao: story=ID -->` 留痕
265
+
266
+ > **禅道 story ID 回流平台**:建完禅道需求后,把 story ID 通过平台 MCP learn 工具写回:
267
+ > ```python
268
+ > cap.mcp.call("learn", {"project_id":"<项目UUID>","category":"decision",
269
+ > "pattern": f"PRD<{标题}> 已发禅道: story=#{story_id} product={product_id}",
270
+ > "source": "wlkj/wl-prd+zentao"})
271
+ > ```
272
+ > 这样平台知道这个 PRD 对应禅道哪个需求(跨系统关联)。
273
+
274
+ > 用户说"不发" → 不勉强,PRD 留本地,后续可随时 `/wl-req <REQ-ID> 发布`。
275
+ > 直连禅道 HTTP(脚本内部),AI 只触发一次,几乎不耗 token。
276
+
277
+ ---
278
+
279
+ ## 🔄 回流平台(PRD 写完即执行,别漏)
280
+
281
+ **铁律:PRD 落地后必须回流平台**(否则平台 AI回流 Tab 永远空,知识层↔引擎断裂)。
282
+ 回流走平台 MCP 写工具(`create_prd` / `submit_return`),失败不影响主流程。
283
+
284
+ PRD 写完后跑这一条(用前面定的 `$PY` / `$R` 变量):
285
+ ```bash
286
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" return prd <PRD文件路径> "<PRD标题>" --platform <web|app>
287
+ ```
288
+ - 内部优先调 `cap.mcp.call("create_prd", {title, content_md})` 写 PRD 表 + 首版本;
289
+ - 失败再 `submit_return` 写 returns 待审核;最后 HTTP 兜底(读 mcp_config.json 的 return_endpoint)。
290
+ - 全程 try/except,回流失败 PRD 仍在本地,主流程不阻塞。
291
+
292
+ > 等价的 MCP 直调写法(脚本不可用时的兜底):
293
+ > `cap.mcp.call("create_prd", {"title": "<标题>", "content_md": "<完整PRD正文>", "status": "planning"})`
294
+ > 或 `cap.mcp.call("submit_return", {"title":"...", "return_type":"prd", "source":"/wl-prd", "content_preview":"...", "content_full":"..."})`
295
+
296
+ 回流成功后输出一行:`✅ [回流] via=create_prd/submit_return <message>`。
297
+
298
+ ## 🧠 学习沉淀(PRD 写完即执行,反哺下次)
299
+
300
+ **铁律:写 PRD 过程中学到的业务规则/决策/用户偏好,必须调 `learn` 写回平台**(平台 learning_patterns 积累,下次引擎受益——越用越聪明)。
301
+
302
+ 写完 PRD 后,把学到的关键认知调 learn 写回:
303
+ ```python
304
+ cap.mcp.call("learn", {
305
+ "project_id": "<项目UUID>",
306
+ "category": "rule", # rule=业务规则 / preference=用户偏好 / decision=决策 / pitfall=踩坑
307
+ "pattern": "<学到的内容,如:车辆保养需关联驾驶员和车辆,按里程+时间双触发>",
308
+ "source": "wlkj/wl-prd",
309
+ })
310
+ ```
311
+ - 每次至少写 1 条(最关键的业务规则或决策)。
312
+ - 多条可多次调用。
313
+ - 全程 try/except,失败不阻塞主流程。
314
+
315
+ 输出:`✅ [学习] 沉淀 N 条认知到平台`。
316
+
317
+ ## 📊 工作流轨迹回写(若本次是被平台触发的)
318
+
319
+ 如果本次 /wl-prd 是平台 trigger 派来的(有 triggerId),执行完后回填轨迹:
320
+ ```python
321
+ # 通过 PATCH /api/projects/{pid}/trigger/workflow/{triggerId} 回填
322
+ # body: {status: "success", output_summary: "生成了<标题>PRD", knowledge_used: [...], mcp_tools_called: [...], duration_sec: N}
323
+ ```
324
+ - knowledge_used:rag_search/search 命中的关键实体 id 列表
325
+ - mcp_tools_called:本次调过的 MCP 工具名(rag_search/context_360/create_prd/learn 等)
326
+ - 让平台"引擎活动看板"能看到本次执行全貌(取了什么知识→产出什么→学了什么)
327
+ - try/except 不阻塞。
328
+
329
+ ## 下一步
330
+ - PRD 定稿 → `/wl-task create <标题>` 落成任务(带 REQ-ID 衔接)+ 发禅道
331
+ - 开工前 → `/wl-spec` 生成开发 Spec → 确认后 `/wl-code` 实现
332
+ - 完整链:prd → task → spec → code → test → commit → task finish(双通飞轮)
@@ -14,7 +14,7 @@ argument-hint: "[REQ-ID] [发布]"
14
14
  |------|--------|
15
15
  | `/wl-req` | 列出所有需求 (跨草稿/产出/历史桶) |
16
16
  | `/wl-req REQ-2026-001` | 显示该需求的全部产出 |
17
- | `/wl-req REQ-2026-001 发布` | 草稿→产出→发禅道 (一步到位) |
17
+ | `/wl-req REQ-2026-001 发布` | 草稿→产出→**真发禅道**(建需求+关联计划+纳入版本) |
18
18
 
19
19
  ## 实现层
20
20
 
@@ -29,10 +29,17 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" req
29
29
  # 看某需求全貌
30
30
  $PY "$R/.qoder/scripts/orchestration/wlkj.py" req REQ-2026-001
31
31
 
32
- # 发布 (promote + publish)
33
- $PY "$R/.qoder/scripts/orchestration/wlkj.py" req REQ-2026-001 发布
32
+ # 发布 (promote + publish)。默认 dry-run 只预览, --confirm 才真写禅道
33
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" req REQ-2026-001 发布 --product=1
34
+ # 真发(建需求→关联计划→纳入版本, 一步到位)
35
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" req REQ-2026-001 发布 --product=1 --plan=12 --build=8 --confirm
34
36
  ```
35
37
 
38
+ > **产品/计划/版本从哪来**: 命令行 `--product/--plan/--build` 优先; 或在 PRD 顶部标
39
+ > `<!-- zentao: product=1 plan=12 build=8 -->` 自动读取。缺产品ID会停(禅道需求必须挂产品)。
40
+ > 发布后 PRD 末尾自动回写 `<!-- zentao: story=762 -->` 留痕, 防重复建。
41
+ > 直连禅道 HTTP(不走MCP), AI 只触发一次 → 几乎不耗 token。
42
+
36
43
  ## 结构
37
44
 
38
45
  ```
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: wl-search
3
3
  description: "查代码/业务/API/字段/PRD + 知识图谱(影响分析/覆盖矩阵/功能画像/业务流程/多跳遍历)的唯一入口。"
4
- argument-hint: "[keyword] or --api [path] or subcommand. 全系13个能力见下表"
4
+ argument-hint: "[keyword] or --api [path] or subcommand. 全系15个能力见下表"
5
5
  auto-approve: true
6
6
  allowed-tools: [Read, Bash]
7
7
  ---
8
8
 
9
- # /wl-search - 搜索代码 & 知识图谱
9
+ # /wl-search - 搜索代码 & 知识图谱 & RAG 语义检索
10
10
 
11
11
  User input: $ARGUMENTS
12
12
 
@@ -15,27 +15,71 @@ User input: $ARGUMENTS
15
15
  ```python
16
16
  from capability import resolve
17
17
  cap = resolve()
18
- result = cap.mcp.call("search_code", {"keyword": "保险", "platform": "web"})
18
+ result = cap.mcp.call("rag_search", {"query": "车辆保养", "top_k": 8})
19
19
  ```
20
20
 
21
- 自动路由:有 MCP 走 MCP(快),无 MCP 走 wlkj.py(CLI 降级)。零宿主感知。
21
+ 自动路由:有 MCP 走 MCP(直连平台知识层,快),无 MCP 走 wlkj.py(CLI 降级)。零宿主感知。
22
22
 
23
- ## ⚡ 第一步:先判断问题类型,别一上来就 search
23
+ ## ⚡ 第一步:先判断问题类型,选对检索通道(3 路检索)
24
24
 
25
- | 问题类型 | 首选(一次到位) | ❌ 别这样 |
26
- |---------|-----------------|----------|
27
- | **"XX怎么实现的/怎么做的"** | `cap.mcp.call("context_pack", {"keyword": "XX", "role": "dev"})` | 不要一个个 search(会搜 5-7 次,慢费 token) |
28
- | **"XX代码在哪"** | `cap.mcp.call("search_code", {"keyword": "XX"})` | 不要 context(杀鸡用牛刀) |
29
- | **"改 XX 影响谁"** | `cap.mcp.call("get_impact", {"endpoint": "/XX"})` | — |
25
+ **核心升级:本命令有 3 路检索,按问题类型选最合适的一路(不是无脑 search_code)。**
30
26
 
31
- > 理解一个功能怎么做的问题,`context_pack` 一条命令拿全代码+API+字段,绝大多数情况只需 Read 2-3 个文件就够,
32
- > 不用反复 search。Glob 找不到文件时用 search_code 兜底,**不准跑 find/findstr/dir /s**。
27
+ | 问题类型 | 首选检索通道 | 为什么 |
28
+ |---------|-------------|--------|
29
+ | **"车辆保养"相关的代码/字段/API**(语义找相关,词不必一样) | `rag_search` 语义召回 | 能找到"维修记录"即使没共享词,召回最全 |
30
+ | **"这个功能的业务流程是什么 / 整体怎么运转"**(全局问答) | `ask_corpus` GraphRAG 问答 | 用社区摘要直接答,不是堆代码片段 |
31
+ | **"handleExport 这个符号在哪定义/调用"**(精确符号定位) | `search_code` 关键词 | 精确命中,找特定符号最快 |
32
+ | **"XX怎么实现的/怎么做的"**(一次取全代码+API+字段) | `context_pack` | 一条命令拿全 8 段上下文 |
33
+ | **"改 XX 影响谁"** | `get_impact` | 影响分析专用 |
33
34
 
34
- ## 13 个能力(统一 cap.mcp.call 调用)
35
+ > **顺序铁律**:理解/盘点类问题,**先 rag_search(语义召回最全)**;有"整体流程/业务怎么运转"的全局问题,**再补 ask_corpus(GraphRAG 答案级)**;只在精确找某个符号/特定字符串时才用 search_code。
36
+ > Glob 找不到文件时用 search_code 兜底,**不准跑 find/findstr/dir /s**。
37
+
38
+ ### 三路检索详解(RAG 升级核心)
39
+
40
+ **① rag_search — 语义召回(默认首选,召回最全)**
41
+ ```python
42
+ # 语义检索:query 是自然语言/业务词,不必和代码里的词一样
43
+ # 能找到"车辆保养"相关的"维修记录",即使两者没共享词
44
+ cap.mcp.call("rag_search", {"query": "车辆保养流程", "top_k": 8})
45
+ ```
46
+ - 返回:相关代码片段 / 字段 / API,按语义相关度排序
47
+ - 适用:写 PRD/改代码前找相关实现、盘点某业务有哪些代码、关键词搜索召回不全时
48
+ - `top_k` 默认 8,要更全调到 12-15
49
+
50
+ **② ask_corpus — GraphRAG 全局问答(答业务流程类问题)**
51
+ ```python
52
+ # GraphRAG 社区摘要问答:直接给"答案",不是堆代码片段
53
+ # 能答"资产管理的业务流程是什么""这个功能整体怎么运转"
54
+ cap.mcp.call("ask_corpus", {"q": "车辆保养的整体业务流程是什么", "top_k": 3})
55
+ ```
56
+ - 返回:基于知识图谱社区摘要的自然语言回答
57
+ - 适用:问"整体流程/业务怎么运转/这个功能是干嘛的"等全局问题
58
+ - ⚠️ 引擎工具名是 `ask_corpus`,平台侧映射到 `graphrag_ask`(mcp_config.json 已配)
59
+
60
+ **③ search_code — 精确关键词(找特定符号/字符串)**
61
+ ```python
62
+ # 精确关键词:找特定函数名/类名/字符串字面量
63
+ cap.mcp.call("search_code", {"keyword": "handleExport", "platform": "web"})
64
+ ```
65
+ - 返回:精确命中的代码位置
66
+ - 适用:已知符号名要定位、rag_search 召回了但要精确找某行
67
+
68
+ ### 输出整合(三路并用时)
69
+
70
+ 理解一个功能时,建议 **rag_search + ask_corpus 并用**:
71
+ 1. `rag_search` 拿到相关代码/字段/API(事实依据)
72
+ 2. `ask_corpus` 拿到业务流程的自然语言回答(全局视角)
73
+ 3. 整合:先讲业务流程(来自 ask_corpus),再列相关代码/字段(来自 rag_search)
74
+ 4. 精确符号定位才补 `search_code`
75
+
76
+ ## 知识图谱能力(20+,统一 cap.mcp.call 调用)
35
77
 
36
78
  | 用户要查什么 | 调用方式 |
37
79
  |-------------|---------|
38
- | 代码在哪 / 搜关键词 | `cap.mcp.call("search_code", {"keyword": "考勤", "platform": "web"})` |
80
+ | **语义找相关代码/字段(首选,召回最全)** | `cap.mcp.call("rag_search", {"query": "车辆保养", "top_k": 8})` |
81
+ | **GraphRAG 全局业务流程问答** | `cap.mcp.call("ask_corpus", {"q": "保养流程是什么", "top_k": 3})` |
82
+ | 代码在哪 / 精确搜关键词 | `cap.mcp.call("search_code", {"keyword": "考勤", "platform": "web"})` |
39
83
  | API 端点 | `cap.mcp.call("search_api", {"keyword": "salary"})` |
40
84
  | 已有 PRD(防重复造轮子) | `cap.mcp.call("search_prd", {"keyword": "保险"})` |
41
85
  | 改某接口影响哪些页面 | `cap.mcp.call("get_impact", {"endpoint": "/asset"})` |
@@ -45,18 +89,25 @@ result = cap.mcp.call("search_code", {"keyword": "保险", "platform": "web"})
45
89
  | 功能完整画像 | `cap.mcp.call("feature_overview", {"feature": "资产管理"})` |
46
90
  | 业务流程链(几步) | `cap.mcp.call("get_workflow", {"module": "assets"})` |
47
91
  | 多跳遍历(关联实体) | `cap.mcp.call("multi_hop", {"symbol": "资产管理", "depth": 3})` |
92
+ | **业务链路追踪(概念→PRD+代码+表+测试)** | `cap.mcp.call("business_trace", {"query": "保险理赔", "depth": 3})` |
93
+ | **需求全貌(REQ-ID→PRD+代码+表+测试)** | `cap.mcp.call("req_trace", {"req_id": "REQ-2026-042"})` |
94
+ | **字段全链路(表单→接口→Java字段→DB列)** | `cap.mcp.call("trace_dataflow", {"field": "vehicleNo"})` |
95
+ | **概念多源画像(PRD+代码+表+原型)** | `cap.mcp.call("anchor_view", {"concept": "保险单"})` |
96
+ | **PRD 正文语义搜(搜正文,不只标题)** | `cap.mcp.call("search_prd_semantic", {"query": "异常筛选"})` |
48
97
  | Repo Wiki 模块文档 | `cap.mcp.call("search_wiki", {"keyword": "考勤"})` |
49
98
  | 原型预填(真实数据) | `cap.mcp.call("fill_prototype", {"keyword": "车辆", "platform": "web"})` |
50
99
  | 设计系统规范 | `cap.mcp.call("get_design_system", {"platform": "web"})` |
51
100
 
52
101
  ## 快速判断该用哪个
53
102
 
103
+ - **"这个功能怎么实现 / 相关代码有哪些"** → 先 `rag_search`(语义最全),不够再 `search_code`
104
+ - **"这个功能的业务流程是什么 / 整体怎么运转"** → `ask_corpus`(GraphRAG 问答)
54
105
  - **"这个功能已经有了吗"** → `prd` 查需求 + `feature` 看画像
55
106
  - **"改这个会影响谁"** → `impact`
56
107
  - **"哪些功能缺测试"** → `coverage`
57
- - **"盘点流程有几步"** → `workflow`
108
+ - **"盘点流程有几步"** → `workflow` 或 `ask_corpus`
58
109
  - **"XX 谁调用了/调用链"** → `context360` 或 `hop`
59
- - **写 PRD 前一次取全** → `context_pack --role pm`
110
+ - **写 PRD 前一次取全** → `rag_search` + `context_pack --role pm`
60
111
  - **出原型前** → `design_system` + `fill_prototype`
61
112
 
62
113
  ## 字段/页面风格/组件
@@ -107,13 +158,16 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" kg grep-text 车辆不存在 --ext
107
158
 
108
159
  ## How to Use Results
109
160
 
110
- 1. Pick the most relevant files (2-3 max)
111
- 2. Read ONLY those files directly
112
- 3. Answer the user's question — 提炼后回答,别贴原始输出
161
+ 1. 三路检索并用时:先讲业务流程(ask_corpus),再列相关代码/字段(rag_search),精确符号补 search_code
162
+ 2. Pick the most relevant files (2-3 max)
163
+ 3. Read ONLY those files directly
164
+ 4. Answer the user's question — 提炼后回答,别贴原始输出
113
165
 
114
166
  ## Examples
115
167
 
116
- - `/wl-search 考勤` → `cap.mcp.call("search_code", {"keyword": "考勤"})`
168
+ - `/wl-search 车辆保养``rag_search({"query":"车辆保养","top_k":8})`(语义最全),有流程问题再 `ask_corpus({"q":"车辆保养流程"})`
169
+ - `/wl-search 车辆保养的业务流程是什么` → `cap.mcp.call("ask_corpus", {"q": "车辆保养的业务流程是什么", "top_k": 3})`
170
+ - `/wl-search handleExport 在哪` → `cap.mcp.call("search_code", {"keyword": "handleExport"})`(精确符号)
117
171
  - `/wl-search --api salary` → `cap.mcp.call("search_api", {"keyword": "salary"})`
118
172
  - `/wl-search 改 /asset 影响谁` → `cap.mcp.call("get_impact", {"endpoint": "/asset"})`
119
173
  - `/wl-search 哪些功能没测试` → `cap.mcp.call("coverage_matrix", {})`