@hupan56/wlkj 3.2.0 → 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 (122) hide show
  1. package/bin/cli.js +117 -0
  2. package/package.json +1 -1
  3. package/templates/qoder/commands/optional/wl-insight.md +276 -276
  4. package/templates/qoder/commands/optional/wl-report.md +1 -1
  5. package/templates/qoder/commands/optional/wl-spec.md +13 -1
  6. package/templates/qoder/commands/optional/wl-status.md +12 -1
  7. package/templates/qoder/commands/wl-code.md +76 -4
  8. package/templates/qoder/commands/wl-commit.md +12 -1
  9. package/templates/qoder/commands/wl-design.md +69 -5
  10. package/templates/qoder/commands/wl-init.md +27 -0
  11. package/templates/qoder/commands/wl-prd.md +145 -4
  12. package/templates/qoder/commands/wl-search.md +74 -20
  13. package/templates/qoder/commands/wl-task.md +613 -613
  14. package/templates/qoder/commands/wl-test.md +16 -1
  15. package/templates/qoder/contracts/spec.md +4 -0
  16. package/templates/qoder/hooks/post-tool-use.py +41 -0
  17. package/templates/qoder/hooks/session-start.py +34 -66
  18. package/templates/qoder/scripts/capability/__pycache__/__init__.cpython-39.pyc +0 -0
  19. package/templates/qoder/scripts/capability/__pycache__/registry.cpython-39.pyc +0 -0
  20. package/templates/qoder/scripts/capability/__pycache__/registry_mcp.cpython-39.pyc +0 -0
  21. package/templates/qoder/scripts/capability/adapters/__init__.py +1 -1
  22. package/templates/qoder/scripts/capability/adapters/__pycache__/__init__.cpython-39.pyc +0 -0
  23. package/templates/qoder/scripts/capability/adapters/__pycache__/cli.cpython-39.pyc +0 -0
  24. package/templates/qoder/scripts/capability/adapters/__pycache__/mcp.cpython-39.pyc +0 -0
  25. package/templates/qoder/scripts/capability/adapters/__pycache__/qw.cpython-39.pyc +0 -0
  26. package/templates/qoder/scripts/capability/adapters/mcp.py +76 -100
  27. package/templates/qoder/scripts/capability/adapters/qw.py +295 -295
  28. package/templates/qoder/scripts/capability/caps/__init__.py +1 -1
  29. package/templates/qoder/scripts/capability/caps/__pycache__/__init__.cpython-39.pyc +0 -0
  30. package/templates/qoder/scripts/capability/caps/__pycache__/context.cpython-39.pyc +0 -0
  31. package/templates/qoder/scripts/capability/caps/__pycache__/cron.cpython-39.pyc +0 -0
  32. package/templates/qoder/scripts/capability/caps/__pycache__/identity.cpython-39.pyc +0 -0
  33. package/templates/qoder/scripts/capability/caps/__pycache__/memory.cpython-39.pyc +0 -0
  34. package/templates/qoder/scripts/capability/caps/__pycache__/notify.cpython-39.pyc +0 -0
  35. package/templates/qoder/scripts/capability/caps/__pycache__/present.cpython-39.pyc +0 -0
  36. package/templates/qoder/scripts/capability/caps/__pycache__/repo.cpython-39.pyc +0 -0
  37. package/templates/qoder/scripts/capability/caps/__pycache__/sandbox.cpython-39.pyc +0 -0
  38. package/templates/qoder/scripts/capability/caps/memory.py +1 -1
  39. package/templates/qoder/scripts/capability/registry.py +21 -23
  40. package/templates/qoder/scripts/capability/registry_mcp.py +69 -5
  41. package/templates/qoder/scripts/capability/smoke_test_report.json +34 -20
  42. package/templates/qoder/scripts/deployment/setup/carriers.py +3 -1
  43. package/templates/qoder/scripts/deployment/setup/init_doctor.py +10 -3
  44. package/templates/qoder/scripts/domain/__pycache__/__init__.cpython-39.pyc +0 -0
  45. package/templates/qoder/scripts/domain/integration/__init__.py +0 -0
  46. package/templates/qoder/scripts/domain/integration/__pycache__/__init__.cpython-39.pyc +0 -0
  47. package/templates/qoder/scripts/domain/integration/__pycache__/return_to_platform.cpython-39.pyc +0 -0
  48. package/templates/qoder/scripts/domain/integration/return_to_platform.py +392 -0
  49. package/templates/qoder/scripts/domain/integration/spec_upload.py +209 -0
  50. package/templates/qoder/scripts/domain/kg/build/kg_build.py +27 -3
  51. package/templates/qoder/scripts/domain/kg/extract/asset/__init__.py +10 -0
  52. package/templates/qoder/scripts/domain/kg/extract/asset/asset_tree.py +57 -0
  53. package/templates/qoder/scripts/domain/kg/extract/asset/discussion_importer.py +62 -0
  54. package/templates/qoder/scripts/domain/kg/extract/asset/prd_importer.py +146 -0
  55. package/templates/qoder/scripts/domain/kg/extract/asset/prototype_importer.py +64 -0
  56. package/templates/qoder/scripts/domain/kg/extract/asset/returns_importer.py +52 -0
  57. package/templates/qoder/scripts/domain/kg/extract/build_goal3.py +104 -0
  58. package/templates/qoder/scripts/domain/kg/extract/build_goal4.py +55 -0
  59. package/templates/qoder/scripts/domain/kg/extract/build_goal5.py +95 -0
  60. package/templates/qoder/scripts/domain/kg/extract/db/__init__.py +8 -0
  61. package/templates/qoder/scripts/domain/kg/extract/db/data_profile.py +22 -0
  62. package/templates/qoder/scripts/domain/kg/extract/db/fk_extractor.py +55 -0
  63. package/templates/qoder/scripts/domain/kg/extract/db/schema_extractor.py +90 -0
  64. package/templates/qoder/scripts/domain/kg/extract/extract.py +84 -0
  65. package/templates/qoder/scripts/domain/kg/extract/extract.py.bak +430 -0
  66. package/templates/qoder/scripts/domain/kg/extract/inference/__init__.py +9 -0
  67. package/templates/qoder/scripts/domain/kg/extract/inference/community_summarizer.py +206 -0
  68. package/templates/qoder/scripts/domain/kg/extract/inference/embed_builder.py +132 -0
  69. package/templates/qoder/scripts/domain/kg/extract/inference/naming_matcher.py +80 -0
  70. package/templates/qoder/scripts/domain/kg/extract/inference/promote.py +59 -0
  71. package/templates/qoder/scripts/domain/kg/extract/inference/recompute.py +93 -0
  72. package/templates/qoder/scripts/domain/kg/extract/inference/weak_link.py +421 -0
  73. package/templates/qoder/scripts/domain/kg/extract/java/__init__.py +15 -0
  74. package/templates/qoder/scripts/domain/kg/extract/java/_parser.py +271 -0
  75. package/templates/qoder/scripts/domain/kg/extract/java/all.py +145 -0
  76. package/templates/qoder/scripts/domain/kg/extract/java/build_java_to_pg.py +102 -0
  77. package/templates/qoder/scripts/domain/kg/extract/java/call_chain.py +49 -0
  78. package/templates/qoder/scripts/domain/kg/extract/java/class_extractor.py +141 -0
  79. package/templates/qoder/scripts/domain/kg/extract/java/domain_extractor.py +148 -0
  80. package/templates/qoder/scripts/domain/kg/extract/java/dubbo_extractor.py +33 -0
  81. package/templates/qoder/scripts/domain/kg/extract/java/endpoint_extractor.py +36 -0
  82. package/templates/qoder/scripts/domain/kg/extract/java/javadoc_extractor.py +110 -0
  83. package/templates/qoder/scripts/domain/kg/extract/java/llm_cn_filler.py +150 -0
  84. package/templates/qoder/scripts/domain/kg/extract/java/member_extractor.py +157 -0
  85. package/templates/qoder/scripts/domain/kg/extract/java/mybatisplus_extractor.py +34 -0
  86. package/templates/qoder/scripts/domain/kg/extract/java/pg_upsert.py +165 -0
  87. package/templates/qoder/scripts/domain/kg/extract/java/satoken_extractor.py +30 -0
  88. package/templates/qoder/scripts/domain/kg/extract/java/spring_extractor.py +39 -0
  89. package/templates/qoder/scripts/domain/kg/extract/java/validation_extractor.py +33 -0
  90. package/templates/qoder/scripts/domain/kg/extract/mybatis/__init__.py +9 -0
  91. package/templates/qoder/scripts/domain/kg/extract/mybatis/all.py +79 -0
  92. package/templates/qoder/scripts/domain/kg/extract/mybatis/mapper_parser.py +99 -0
  93. package/templates/qoder/scripts/domain/kg/extract/mybatis/relation_builder.py +69 -0
  94. package/templates/qoder/scripts/domain/kg/extract/mybatis/sql_extractor.py +78 -0
  95. package/templates/qoder/scripts/domain/kg/extract/prd/__init__.py +8 -0
  96. package/templates/qoder/scripts/domain/kg/extract/prd/prd_chunk_embed.py +105 -0
  97. package/templates/qoder/scripts/domain/kg/extract/prd/prd_llm_extract.py +153 -0
  98. package/templates/qoder/scripts/domain/kg/extract/prd/req_anchor.py +120 -0
  99. package/templates/qoder/scripts/domain/kg/graph/kg_semantic.py +4 -2
  100. package/templates/qoder/scripts/domain/kg/kg.py +42 -5
  101. package/templates/qoder/scripts/domain/kg/search/_remote.py +187 -0
  102. package/templates/qoder/scripts/domain/kg/search/context_pack.py +32 -2
  103. package/templates/qoder/scripts/domain/kg/search/search_index.py +74 -20
  104. package/templates/qoder/scripts/domain/kg/switch_project.py +159 -0
  105. package/templates/qoder/scripts/domain/kg/sync_repowiki.py +109 -0
  106. package/templates/qoder/scripts/domain/task/__pycache__/wlkj_panel.cpython-39.pyc +0 -0
  107. package/templates/qoder/scripts/domain/task/{zentao_panel.py → wlkj_panel.py} +315 -53
  108. package/templates/qoder/scripts/engine/poller.py +219 -0
  109. package/templates/qoder/scripts/foundation/__pycache__/__init__.cpython-39.pyc +0 -0
  110. package/templates/qoder/scripts/foundation/core/__pycache__/__init__.cpython-39.pyc +0 -0
  111. package/templates/qoder/scripts/foundation/core/__pycache__/paths.cpython-39.pyc +0 -0
  112. package/templates/qoder/scripts/foundation/integrations/active_task.py +2 -1
  113. package/templates/qoder/scripts/orchestration/wlkj.py +4 -0
  114. package/templates/qoder/scripts/protocol/__pycache__/__init__.cpython-39.pyc +0 -0
  115. package/templates/qoder/scripts/protocol/mcp/zentao_mcp_server.py +1 -1
  116. package/templates/qoder/scripts/protocol/transports/__pycache__/__init__.cpython-39.pyc +0 -0
  117. package/templates/qoder/scripts/protocol/transports/__pycache__/base.cpython-39.pyc +0 -0
  118. package/templates/qoder/scripts/protocol/transports/__pycache__/cli.cpython-39.pyc +0 -0
  119. package/templates/qoder/scripts/protocol/transports/__pycache__/http.cpython-39.pyc +0 -0
  120. package/templates/qoder/scripts/protocol/transports/__pycache__/stdio.cpython-39.pyc +0 -0
  121. package/templates/qoder/scripts/protocol/transports/http.py +7 -1
  122. package/templates/root/AGENTS.md +9 -10
@@ -19,6 +19,26 @@ PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
19
19
  ```
20
20
  > 后续脚本统一用 `$PY "$R/.qoder/scripts/orchestration/wlkj.py" <命令>`。
21
21
 
22
+ ## 🔧 工具优先级(宿主能力 × 知识层分工)
23
+ | 步骤 | 用谁 | 原因 |
24
+ |------|------|------|
25
+ | 精确找符号 handleExport | **Qoder Grep** | 原生正则搜,零延迟 |
26
+ | 读文件看实现 | **Qoder Read** | 原生全量读,MCP 只有预览 |
27
+ | 语义找"导出功能" | **MCP rag_search** | 跨仓库语义召回 |
28
+ | 改代码前看影响 | **MCP get_impact** | 跨3端影响分析,Qoder 做不到 |
29
+ | 文件知识标注 | **MCP code_context** | 实体/调用/影响1次拿 |
30
+ | 写代码 | **Qoder Write/Edit** | 原生编辑,精确行号 |
31
+
32
+ ## 🔍 Ultra Review(宿主原生能力利用)
33
+ > 代码写完后,如果 Qoder 有 Ultra Review Agent,建议调用:
34
+ > 1. 代码写完后不要急着回流
35
+ > 2. 调 Ultra Review Agent 审查代码质量
36
+ > 3. 根据 Review 结果修正
37
+ > 4. 最后调 MCP submit_return 回流 + learn 记录
38
+ >
39
+ > **不用 Ultra Review 也能跑**——按下面的铁律手动检查。
40
+ > Ultra Review 只是让审查更全面(边界条件/性能/安全)。
41
+
22
42
  ## Step 1: Spec Gate(强制前置 · 非侵入式)
23
43
 
24
44
  > ⚠️ **核心门禁**:没有 `status: confirmed` 的 spec,**绝不动手写代码**。
@@ -30,7 +50,7 @@ PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
30
50
  # 用 paths.find_spec 确定性查找 (查 .qoder/workspace/specs/ + 当前任务目录, 读 status)
31
51
  SPEC=$($PY -c "
32
52
  import sys, json; sys.path.insert(0,'$R/.qoder/scripts')
33
- from bootstrap import setup; setup()
53
+ from foundation.bootstrap import setup; setup()
34
54
  from foundation.core.paths import find_spec, get_spec_status
35
55
  hits = find_spec('$ARGUMENTS') if '$ARGUMENTS' else find_spec()
36
56
  if hits:
@@ -84,12 +104,46 @@ cap.mcp.call("update_task", {"task_id": X, "desc": summary + "\n本地spec: " +
84
104
 
85
105
  > panel 也可调同一个 `update_task` 做回填,两边都行(谁先触发都行,不冲突)。
86
106
 
87
- ## Step 2: Search Related Code
107
+ ## Step 2: Search Related Code(RAG 语义召回,不只关键词)
88
108
 
89
- Run: $PY "$R/.qoder/scripts/orchestration/wlkj.py" search <keyword>
109
+ **改代码前用 rag_search 找相关函数/API(语义召回最全),精确符号定位才用 search_code。**
110
+
111
+ ```python
112
+ from capability import resolve
113
+ cap = resolve()
114
+ # ① rag_search 语义召回:找和需求相关的函数/API/字段(词不必一样,召回最全)
115
+ rag = cap.mcp.call("rag_search", {"query": "<需求关键词或功能描述>", "top_k": 10})
116
+ # ② 需要精确找某个已知符号(如 handleExport)才用 search_code
117
+ precise = cap.mcp.call("search_code", {"keyword": "<精确符号名>"})
118
+ # ③ 影响分析(必跑):改这些符号会影响谁/依赖谁,按项目仓库隔离,避免改一处崩一片
119
+ # project_id 从 mcp_config.json 的 WLKJ_PROJECT_ID 取(绑当前项目)
120
+ # get_impact 返回分层 upstream(谁依赖我→改动影响范围)/downstream(我依赖谁)+byType
121
+ impact = cap.mcp.call("get_impact", {
122
+ "project_id": "<项目UUID>", # mcp_config.json 的 WLKJ_PROJECT_ID
123
+ "entity": "<要改的核心符号: 如 handleExport / C:FlowOperationController>",
124
+ "depth": 2,
125
+ })
126
+ # 影响面大(upstream 跨多个页面/API)时,先在回复里提示风险再动手
127
+ # ③b 涉及字段改动(加列/改类型/表单字段):追字段全链路(表单→接口→Java字段→DB列),改一处看全链
128
+ if <涉及字段层>:
129
+ cap.mcp.call("trace_dataflow", {"field": "<字段名>"}) # 防"改了DB列没改对应Java字段/前端表单"
130
+ # ④ 涉及数据库改动的,查真表结构(引擎自己的 MySQL MCP,别猜列名)
131
+ if <涉及数据库层>:
132
+ schema = cap.mcp.call("query_schema", {"table": "<表名>"}) # qoder-mysql 工具
133
+ # 真表结构回流平台
134
+ cap.mcp.call("learn", {"project_id":"<项目UUID>","category":"rule",
135
+ "pattern": f"真表结构<表名>: {json.dumps(schema.get('columns',[]),ensure_ascii=False)[:400]}",
136
+ "source":"wlkj/wl-code+mysql"})
137
+ ```
138
+ 等价 CLI(脚本兜底):
139
+ ```bash
140
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" search <keyword>
141
+ ```
90
142
  Find existing code that this implementation relates to.
91
143
  Read relevant files for context.
92
144
 
145
+ **接地铁律**:实现时调用的函数名/字段名/API 路径必须来自 rag_search 召回结果(系统里真有的),不编造不存在的 API。改码前用 get_impact 拿分层影响范围(谁依赖我/我依赖谁),影响面大先提示风险再动手,避免改一处崩一片。
146
+
93
147
  ## Step 3: Implement
94
148
 
95
149
  Follow the spec strictly:
@@ -108,4 +162,22 @@ After implementation:
108
162
 
109
163
  ## Step 5: Report
110
164
 
111
- Tell user what was implemented and suggest /wl-test next.
165
+ Tell user what was implemented and suggest next:
166
+ - `/wl-test <描述>` — 跑测试验证(改动大时先 `impact_coverage` 圈必跑范围)
167
+ - 验过后 `/wl-commit <message>` — 提交+push+回流平台(自动 record_commit)
168
+
169
+ ## 下一步
170
+ - 实现 → `/wl-test` 验证 → `/wl-commit` 提交回流 → `/wl-task finish <REQ-ID>` 收尾(双通飞轮)
171
+
172
+ ## 🧠 学习沉淀(改完代码即执行,反哺下次)
173
+
174
+ 改代码过程中发现的业务规则/架构约定/踩坑经验,调 learn 写回平台:
175
+ ```python
176
+ cap.mcp.call("learn", {
177
+ "project_id": "<项目UUID>",
178
+ "category": "pitfall", # pitfall=踩坑 / rule=业务规则 / decision=架构决策
179
+ "pattern": "<学到的,如:VehicleController 的 save 方法必须先校验驾驶员是否存在>",
180
+ "source": "wlkj/wl-code",
181
+ })
182
+ ```
183
+ - 至少写 1 条最有价值的认知。try/except 不阻塞。
@@ -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
+ - 查看本次提交在需求链路的位置:平台资产中心 → 需求 → 变更史
@@ -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,6 +13,27 @@ 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
 
18
39
  ### 🔴 命令优先铁律(最重要,先读)
@@ -63,14 +84,57 @@ PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
63
84
  请选择 (1/2/3):
64
85
  ```
65
86
 
66
- ### 取上下文(1 次调用取全 8 段)
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(脚本兜底):
67
123
  ```bash
68
124
  $PY "$R/.qoder/scripts/orchestration/wlkj.py" context <业务词> --platform <web|app>
69
125
  ```
70
126
  - 第 4 段 = 历史 PRD(防重复)
71
127
  - 第 5 段 = 相关 API
72
128
  - 第 8 段 = 数据库表结构+真实字段
73
- - 涉及枚举字段时额外调 `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 的事实补充
74
138
 
75
139
  ### 产出
76
140
  - PRD: `workspace/members/{dev}/drafts/REQ-{YYYY}-{NNN}-{标题}.md`(13 章)
@@ -104,11 +168,23 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" eval <prd.md> [原型.html]
104
168
 
105
169
  **平台必问**(同上)。
106
170
 
107
- ### 取上下文(1 prefetch,禁止串行 search)
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:
108
182
  ```bash
109
183
  $PY "$R/.qoder/scripts/orchestration/wlkj.py" prefetch "<需求描述>" --platform <p>
110
184
  ```
111
- prefetch 一次返回代码/字段/API/Wiki/历史 PRD。**之后不要逐个 search/find/grep 查词**(会变 6+ 次串行往返,轮次爆炸根因)。不够才补调一次。
185
+ prefetch/rag_search 一次返回代码/字段/API/Wiki/历史 PRD。**之后不要逐个 search/find/grep 查词**(会变 6+ 次串行往返,轮次爆炸根因)。不够才补调一次。
186
+
187
+ **接地铁律(同完整模式)**:6 章里写的每个字段/API 必须在 rag_search 召回结果里有来源,召不到的标"新增(待评估)",不编造。
112
188
 
113
189
  ### 产出
114
190
  - Mini-PRD: `workspace/members/{dev}/drafts/REQ-{YYYY}-{NNN}-{标题}.md`(6 章)
@@ -187,5 +263,70 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" req <REQ-ID> 发布 \
187
263
  - 默认先 dry-run 预览,用户确认后再 `--confirm` 真发
188
264
  - 真发后禅道建好需求,PRD 末尾自动回写 `<!-- zentao: story=ID -->` 留痕
189
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
+
190
274
  > 用户说"不发" → 不勉强,PRD 留本地,后续可随时 `/wl-req <REQ-ID> 发布`。
191
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(双通飞轮)
@@ -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", {})`