@hupan56/wlkj 3.2.0 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +117 -0
- package/package.json +2 -2
- package/templates/.qoder/.runtime/hook-errors.log +4 -0
- package/templates/qoder/commands/optional/wl-insight.md +276 -276
- package/templates/qoder/commands/optional/wl-report.md +1 -1
- package/templates/qoder/commands/optional/wl-spec.md +13 -1
- package/templates/qoder/commands/optional/wl-status.md +14 -1
- package/templates/qoder/commands/wl-code.md +111 -4
- package/templates/qoder/commands/wl-commit.md +12 -1
- package/templates/qoder/commands/wl-design.md +69 -5
- package/templates/qoder/commands/wl-init.md +129 -102
- package/templates/qoder/commands/wl-prd.md +162 -6
- package/templates/qoder/commands/wl-search.md +106 -20
- package/templates/qoder/commands/wl-task.md +617 -613
- package/templates/qoder/commands/wl-test.md +20 -1
- package/templates/qoder/contracts/spec.md +4 -0
- package/templates/qoder/hooks/post-tool-use.py +71 -0
- package/templates/qoder/hooks/pre-tool-use.py +136 -0
- package/templates/qoder/hooks/session-start.py +365 -397
- package/templates/qoder/scripts/capability/__pycache__/__init__.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/__pycache__/present_html.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/__pycache__/registry.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/__pycache__/registry_mcp.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/adapters/__init__.py +1 -1
- package/templates/qoder/scripts/capability/adapters/__pycache__/__init__.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/adapters/__pycache__/cli.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/adapters/__pycache__/mcp.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/adapters/__pycache__/qw.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/adapters/mcp.py +76 -100
- package/templates/qoder/scripts/capability/adapters/qw.py +295 -295
- package/templates/qoder/scripts/capability/caps/__init__.py +5 -5
- package/templates/qoder/scripts/capability/caps/__pycache__/__init__.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__pycache__/context.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__pycache__/cron.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__pycache__/identity.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__pycache__/memory.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__pycache__/notify.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__pycache__/present.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__pycache__/repo.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/__pycache__/sandbox.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/capability/caps/memory.py +1 -1
- package/templates/qoder/scripts/capability/caps/notify.py +64 -0
- package/templates/qoder/scripts/capability/caps/sandbox.py +38 -0
- package/templates/qoder/scripts/capability/present_html.py +68 -0
- package/templates/qoder/scripts/capability/registry.py +27 -25
- package/templates/qoder/scripts/capability/registry_mcp.py +67 -5
- package/templates/qoder/scripts/capability/smoke_test_report.json +34 -20
- package/templates/qoder/scripts/deployment/setup/carriers.py +3 -1
- package/templates/qoder/scripts/deployment/setup/init_doctor.py +10 -3
- package/templates/qoder/scripts/domain/__pycache__/__init__.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/domain/integration/__init__.py +0 -0
- package/templates/qoder/scripts/domain/integration/__pycache__/__init__.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/domain/integration/__pycache__/return_to_platform.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/domain/integration/return_to_platform.py +395 -0
- package/templates/qoder/scripts/domain/integration/spec_upload.py +208 -0
- package/templates/qoder/scripts/domain/kg/build/kg_build.py +27 -3
- package/templates/qoder/scripts/domain/kg/extract/asset/__init__.py +10 -0
- package/templates/qoder/scripts/domain/kg/extract/asset/asset_tree.py +57 -0
- package/templates/qoder/scripts/domain/kg/extract/asset/discussion_importer.py +62 -0
- package/templates/qoder/scripts/domain/kg/extract/asset/prd_importer.py +146 -0
- package/templates/qoder/scripts/domain/kg/extract/asset/prototype_importer.py +64 -0
- package/templates/qoder/scripts/domain/kg/extract/asset/returns_importer.py +52 -0
- package/templates/qoder/scripts/domain/kg/extract/build_goal3.py +104 -0
- package/templates/qoder/scripts/domain/kg/extract/build_goal4.py +55 -0
- package/templates/qoder/scripts/domain/kg/extract/build_goal5.py +95 -0
- package/templates/qoder/scripts/domain/kg/extract/db/__init__.py +8 -0
- package/templates/qoder/scripts/domain/kg/extract/db/data_profile.py +22 -0
- package/templates/qoder/scripts/domain/kg/extract/db/fk_extractor.py +55 -0
- package/templates/qoder/scripts/domain/kg/extract/db/schema_extractor.py +90 -0
- package/templates/qoder/scripts/domain/kg/extract/extract.py +84 -0
- package/templates/qoder/scripts/domain/kg/extract/inference/__init__.py +9 -0
- package/templates/qoder/scripts/domain/kg/extract/inference/community_summarizer.py +206 -0
- package/templates/qoder/scripts/domain/kg/extract/inference/embed_builder.py +132 -0
- package/templates/qoder/scripts/domain/kg/extract/inference/naming_matcher.py +80 -0
- package/templates/qoder/scripts/domain/kg/extract/inference/promote.py +59 -0
- package/templates/qoder/scripts/domain/kg/extract/inference/recompute.py +93 -0
- package/templates/qoder/scripts/domain/kg/extract/inference/weak_link.py +421 -0
- package/templates/qoder/scripts/domain/kg/extract/java/__init__.py +15 -0
- package/templates/qoder/scripts/domain/kg/extract/java/_parser.py +271 -0
- package/templates/qoder/scripts/domain/kg/extract/java/all.py +145 -0
- package/templates/qoder/scripts/domain/kg/extract/java/build_java_to_pg.py +102 -0
- package/templates/qoder/scripts/domain/kg/extract/java/call_chain.py +49 -0
- package/templates/qoder/scripts/domain/kg/extract/java/class_extractor.py +141 -0
- package/templates/qoder/scripts/domain/kg/extract/java/domain_extractor.py +148 -0
- package/templates/qoder/scripts/domain/kg/extract/java/dubbo_extractor.py +33 -0
- package/templates/qoder/scripts/domain/kg/extract/java/endpoint_extractor.py +36 -0
- package/templates/qoder/scripts/domain/kg/extract/java/javadoc_extractor.py +110 -0
- package/templates/qoder/scripts/domain/kg/extract/java/llm_cn_filler.py +150 -0
- package/templates/qoder/scripts/domain/kg/extract/java/member_extractor.py +157 -0
- package/templates/qoder/scripts/domain/kg/extract/java/mybatisplus_extractor.py +34 -0
- package/templates/qoder/scripts/domain/kg/extract/java/pg_upsert.py +165 -0
- package/templates/qoder/scripts/domain/kg/extract/java/satoken_extractor.py +30 -0
- package/templates/qoder/scripts/domain/kg/extract/java/spring_extractor.py +39 -0
- package/templates/qoder/scripts/domain/kg/extract/java/validation_extractor.py +33 -0
- package/templates/qoder/scripts/domain/kg/extract/mybatis/__init__.py +9 -0
- package/templates/qoder/scripts/domain/kg/extract/mybatis/all.py +79 -0
- package/templates/qoder/scripts/domain/kg/extract/mybatis/mapper_parser.py +99 -0
- package/templates/qoder/scripts/domain/kg/extract/mybatis/relation_builder.py +69 -0
- package/templates/qoder/scripts/domain/kg/extract/mybatis/sql_extractor.py +78 -0
- package/templates/qoder/scripts/domain/kg/extract/prd/__init__.py +8 -0
- package/templates/qoder/scripts/domain/kg/extract/prd/prd_chunk_embed.py +105 -0
- package/templates/qoder/scripts/domain/kg/extract/prd/prd_llm_extract.py +153 -0
- package/templates/qoder/scripts/domain/kg/extract/prd/req_anchor.py +120 -0
- package/templates/qoder/scripts/domain/kg/graph/kg_semantic.py +4 -2
- package/templates/qoder/scripts/domain/kg/kg.py +42 -5
- package/templates/qoder/scripts/domain/kg/search/_remote.py +187 -0
- package/templates/qoder/scripts/domain/kg/search/context_pack.py +32 -2
- package/templates/qoder/scripts/domain/kg/search/search_index.py +74 -20
- package/templates/qoder/scripts/domain/kg/switch_project.py +158 -0
- package/templates/qoder/scripts/domain/kg/sync_repowiki.py +109 -0
- package/templates/qoder/scripts/domain/task/__pycache__/wlkj_panel.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/domain/task/{zentao_panel.py → wlkj_panel.py} +315 -53
- package/templates/qoder/scripts/engine/poller.py +219 -0
- package/templates/qoder/scripts/foundation/__pycache__/__init__.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/foundation/core/__pycache__/__init__.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/foundation/core/__pycache__/paths.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/foundation/integrations/active_task.py +2 -1
- package/templates/qoder/scripts/orchestration/wlkj.py +4 -0
- package/templates/qoder/scripts/protocol/__pycache__/__init__.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/protocol/mcp/zentao_mcp_server.py +1 -1
- package/templates/qoder/scripts/protocol/transports/__pycache__/__init__.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/protocol/transports/__pycache__/base.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/protocol/transports/__pycache__/cli.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/protocol/transports/__pycache__/http.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/protocol/transports/__pycache__/stdio.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/protocol/transports/http.py +7 -1
- package/templates/qoder/scripts/validation/metrics/__pycache__/present_board.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/validation/metrics/present_board.py +180 -0
- package/templates/qoder/settings.json +10 -0
- package/templates/root/AGENTS.md +9 -10
|
@@ -19,6 +19,35 @@ 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
|
+
|
|
34
|
+
> ⚠️ **代码写完必须过 Ultra Review 才能回流**(不再是"建议")。
|
|
35
|
+
> 这是 Step 4 自检之后的硬门禁:过→回流;不过→列问题修,重跑;无 Ultra Review→手动 checklist 降级。
|
|
36
|
+
|
|
37
|
+
### 强制流程(Step 4 自检后执行)
|
|
38
|
+
1. 自检 4 项全 ✓ 后,**立即调 Ultra Review Agent**(宿主原生能力)审查本次改动
|
|
39
|
+
2. **分支裁决**:
|
|
40
|
+
- ✅ **过** → 调 `submit_return` 回流 + `learn` 沉淀(见 Step 5 / 学习沉淀段)
|
|
41
|
+
- ❌ **不过** → 列出 Review 指出的问题(边界/性能/安全/规范),逐条修,**重跑 Ultra Review**,不过不回流
|
|
42
|
+
3. **降级**(宿主无 Ultra Review Agent):按下方手动 checklist 逐条过,全 ✓ 视同通过
|
|
43
|
+
|
|
44
|
+
### 手动 checklist 降级(无 Ultra Review 时)
|
|
45
|
+
- [ ] 边界条件:空值/越界/并发/大数量都处理了
|
|
46
|
+
- [ ] 性能:无 N+1 查询、无循环里调 DB、大数据量分页
|
|
47
|
+
- [ ] 安全:入参校验、权限校验、SQL 无拼接注入
|
|
48
|
+
- [ ] 异常路径:Spec 定义的异常场景都有对应处理
|
|
49
|
+
- [ ] 规范:与周围代码风格一致(命名/注释/分层)
|
|
50
|
+
|
|
22
51
|
## Step 1: Spec Gate(强制前置 · 非侵入式)
|
|
23
52
|
|
|
24
53
|
> ⚠️ **核心门禁**:没有 `status: confirmed` 的 spec,**绝不动手写代码**。
|
|
@@ -30,7 +59,7 @@ PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
|
|
|
30
59
|
# 用 paths.find_spec 确定性查找 (查 .qoder/workspace/specs/ + 当前任务目录, 读 status)
|
|
31
60
|
SPEC=$($PY -c "
|
|
32
61
|
import sys, json; sys.path.insert(0,'$R/.qoder/scripts')
|
|
33
|
-
from bootstrap import setup; setup()
|
|
62
|
+
from foundation.bootstrap import setup; setup()
|
|
34
63
|
from foundation.core.paths import find_spec, get_spec_status
|
|
35
64
|
hits = find_spec('$ARGUMENTS') if '$ARGUMENTS' else find_spec()
|
|
36
65
|
if hits:
|
|
@@ -84,12 +113,70 @@ cap.mcp.call("update_task", {"task_id": X, "desc": summary + "\n本地spec: " +
|
|
|
84
113
|
|
|
85
114
|
> panel 也可调同一个 `update_task` 做回填,两边都行(谁先触发都行,不冲突)。
|
|
86
115
|
|
|
87
|
-
## Step 2: Search Related Code
|
|
116
|
+
## Step 2: Search Related Code(RAG 语义召回,不只关键词)
|
|
117
|
+
|
|
118
|
+
**改代码前用 rag_search 找相关函数/API(语义召回最全),精确符号定位才用 search_code。**
|
|
88
119
|
|
|
89
|
-
|
|
120
|
+
```python
|
|
121
|
+
from capability import resolve
|
|
122
|
+
cap = resolve()
|
|
123
|
+
# ⓪ 有 REQ-ID/禅道号时查这需求的历史代码变更(code_changes 按需求号→改过哪些函数/hunk)
|
|
124
|
+
# 看这需求历史改过啥,避免重复改/沿用历史模式。与 code_history(按文件查) 互补。
|
|
125
|
+
if <有 REQ-ID 或禅道号>:
|
|
126
|
+
changes = cap.mcp.call("code_changes", {"project_id": "<项目UUID>", "req_key": "<REQ-ID或XQ/WT号>"})
|
|
127
|
+
# ① rag_search 语义召回:找和需求相关的函数/API/字段(词不必一样,召回最全)
|
|
128
|
+
rag = cap.mcp.call("rag_search", {"query": "<需求关键词或功能描述>", "top_k": 10})
|
|
129
|
+
# ② 需要精确找某个已知符号(如 handleExport)才用 search_code
|
|
130
|
+
precise = cap.mcp.call("search_code", {"keyword": "<精确符号名>"})
|
|
131
|
+
# ③ 影响分析(必跑):改这些符号会影响谁/依赖谁,按项目仓库隔离,避免改一处崩一片
|
|
132
|
+
# project_id 从 mcp_config.json 的 WLKJ_PROJECT_ID 取(绑当前项目)
|
|
133
|
+
# get_impact 返回分层 upstream(谁依赖我→改动影响范围)/downstream(我依赖谁)+byType
|
|
134
|
+
impact = cap.mcp.call("get_impact", {
|
|
135
|
+
"project_id": "<项目UUID>", # mcp_config.json 的 WLKJ_PROJECT_ID
|
|
136
|
+
"entity": "<要改的核心符号: 如 handleExport / C:FlowOperationController>",
|
|
137
|
+
"depth": 2,
|
|
138
|
+
})
|
|
139
|
+
# ③a 改码前风险三件套(get_impact 看影响面 → risk_assessment 看风险等级 → code_history 看历史 → get_confidence 看证据置信)
|
|
140
|
+
# risk_assessment 返回 score/level(7项多证据:影响面/DB写/覆盖缺口/路径置信缺口/缺需求链路/历史不稳定/Agent变更);
|
|
141
|
+
# code_history 返回这文件/函数被哪些需求(XQ/WT)改过、改了什么(反向:代码→需求);
|
|
142
|
+
# get_confidence 返回路径置信度(0-1)+证据路径链。
|
|
143
|
+
# level=high/critical 或 confidence 低 → 先在回复里提示风险再动手。
|
|
144
|
+
risk = cap.mcp.call("risk_assessment", {"project_id": "<项目UUID>", "entity": "<核心符号>", "depth": 2})
|
|
145
|
+
history = cap.mcp.call("code_history", {"project_id": "<项目UUID>", "file_path": "<文件名或路径片段>"})
|
|
146
|
+
conf = cap.mcp.call("get_confidence", {"project_id": "<项目UUID>", "entity": "<核心符号>"})
|
|
147
|
+
# ③c 终极门禁裁决(合成 risk+coverage → block/warn/pass + 保形策略/alpha)
|
|
148
|
+
# gate.decision=block 须拦停问用户(高风险+裸改);warn 可放行带提示;pass 放心改
|
|
149
|
+
gate = cap.mcp.call("gate_check", {"project_id": "<项目UUID>", "entity": "<核心符号>"})
|
|
150
|
+
# 影响面大 / risk level≥high / confidence 低 / gate=block 时,先提示风险再动手(block 须拦停问用户)
|
|
151
|
+
# ③d 影响面大时多层并行审改动风险(宿主支持 Agent 并行 → 派 3 个 subagent 各审一层,合并风险清单):
|
|
152
|
+
# - 前端层:谁调用这个接口/符号?改动会不会破坏调用方?
|
|
153
|
+
# - 后端层:实现逻辑/事务/调用链是否自洽?
|
|
154
|
+
# - DB层:涉及表/字段改动是否波及别处(trace_dataflow 已追全链)?
|
|
155
|
+
# 不支持 Agent 并行 → 上面 risk_assessment 单点结果已够(串行降级)。
|
|
156
|
+
# ③e 门禁前知识新鲜度(改码前看知识层是否过期,过期数据不可信):
|
|
157
|
+
# check_freshness 返回模块 avg_age_days + 是否过期;过期(>threshold)→提示 refresh_knowledge 再动手
|
|
158
|
+
fresh = cap.mcp.call("check_freshness", {"module": "<核心模块>", "threshold_days": 30})
|
|
159
|
+
# fresh.verdict 含"过期" → 提示用户知识层陈旧,建议先 refresh_knowledge(跑构建脚本)再改码
|
|
160
|
+
# ③b 涉及字段改动(加列/改类型/表单字段):追字段全链路(表单→接口→Java字段→DB列),改一处看全链
|
|
161
|
+
if <涉及字段层>:
|
|
162
|
+
cap.mcp.call("trace_dataflow", {"field": "<字段名>"}) # 防"改了DB列没改对应Java字段/前端表单"
|
|
163
|
+
# ④ 涉及数据库改动的,查真表结构(引擎自己的 MySQL MCP,别猜列名)
|
|
164
|
+
if <涉及数据库层>:
|
|
165
|
+
schema = cap.mcp.call("query_schema", {"table": "<表名>"}) # qoder-mysql 工具
|
|
166
|
+
# 真表结构回流平台
|
|
167
|
+
cap.mcp.call("learn", {"project_id":"<项目UUID>","category":"rule",
|
|
168
|
+
"pattern": f"真表结构<表名>: {json.dumps(schema.get('columns',[]),ensure_ascii=False)[:400]}",
|
|
169
|
+
"source":"wlkj/wl-code+mysql"})
|
|
170
|
+
```
|
|
171
|
+
等价 CLI(脚本兜底):
|
|
172
|
+
```bash
|
|
173
|
+
$PY "$R/.qoder/scripts/orchestration/wlkj.py" search <keyword>
|
|
174
|
+
```
|
|
90
175
|
Find existing code that this implementation relates to.
|
|
91
176
|
Read relevant files for context.
|
|
92
177
|
|
|
178
|
+
**接地铁律**:实现时调用的函数名/字段名/API 路径必须来自 rag_search 召回结果(系统里真有的),不编造不存在的 API。改码前用 get_impact 拿分层影响范围(谁依赖我/我依赖谁),影响面大先提示风险再动手,避免改一处崩一片。
|
|
179
|
+
|
|
93
180
|
## Step 3: Implement
|
|
94
181
|
|
|
95
182
|
Follow the spec strictly:
|
|
@@ -98,6 +185,8 @@ Follow the spec strictly:
|
|
|
98
185
|
3. Follow team conventions from data/code/ patterns
|
|
99
186
|
4. Write clean, commented code
|
|
100
187
|
|
|
188
|
+
> **宿主 sub-agent 激活**:QoderWork 支持 sub-agent 时,dispatch 到 **`qoder-coder`** agent(`.qoder/agents/qoder-coder.toml`)——它内置 Spec 契约实现规范(数据层 Entity→Mapper→Service→Controller / 接口层 RESTful+校验+统一返回 / 异常按 Spec),递归守卫不二次 spawn。dispatch prompt 首行传 `Active Spec: <spec路径>`。不支持 sub-agent 时按上面 4 步手动实现。
|
|
189
|
+
|
|
101
190
|
## Step 4: Self-Check
|
|
102
191
|
|
|
103
192
|
After implementation:
|
|
@@ -108,4 +197,22 @@ After implementation:
|
|
|
108
197
|
|
|
109
198
|
## Step 5: Report
|
|
110
199
|
|
|
111
|
-
Tell user what was implemented and suggest
|
|
200
|
+
Tell user what was implemented and suggest next:
|
|
201
|
+
- `/wl-test <描述>` — 跑测试验证(改动大时先 `impact_coverage` 圈必跑范围)
|
|
202
|
+
- 验过后 `/wl-commit <message>` — 提交+push+回流平台(自动 record_commit)
|
|
203
|
+
|
|
204
|
+
## 下一步
|
|
205
|
+
- 实现 → `/wl-test` 验证 → `/wl-commit` 提交回流 → `/wl-task finish <REQ-ID>` 收尾(双通飞轮)
|
|
206
|
+
|
|
207
|
+
## 🧠 学习沉淀(改完代码即执行,反哺下次)
|
|
208
|
+
|
|
209
|
+
改代码过程中发现的业务规则/架构约定/踩坑经验,调 learn 写回平台:
|
|
210
|
+
```python
|
|
211
|
+
cap.mcp.call("learn", {
|
|
212
|
+
"project_id": "<项目UUID>",
|
|
213
|
+
"category": "pitfall", # pitfall=踩坑 / rule=业务规则 / decision=架构决策
|
|
214
|
+
"pattern": "<学到的,如:VehicleController 的 save 方法必须先校验驾驶员是否存在>",
|
|
215
|
+
"source": "wlkj/wl-code",
|
|
216
|
+
})
|
|
217
|
+
```
|
|
218
|
+
- 至少写 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.
|
|
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
|
-
### 流程(
|
|
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
|
|
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
|
-
|
|
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 不阻塞。
|
|
@@ -1,102 +1,129 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: wl-init
|
|
3
|
-
description: "初始化/切换开发者身份 + 环境体检。Initialize/switch developer identity + environment health check. "
|
|
4
|
-
argument-hint: "[name] [role]"
|
|
5
|
-
auto-approve: true
|
|
6
|
-
allowed-tools: [Read, Glob, Grep, Bash, Write, Edit]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# /wl-init - One-stop Init (Developer + Environment Doctor)
|
|
10
|
-
|
|
11
|
-
Usage:
|
|
12
|
-
/wl-init - 体检环境 + 显示状态
|
|
13
|
-
/wl-init 小王 - 切换/注册开发者 + 体检 + 自动修复
|
|
14
|
-
/wl-init 小王 pm - 注册新开发者(带角色) + 体检 + 自动修复
|
|
15
|
-
|
|
16
|
-
## 🔧 环境自检(QoderWork 桌面端 vs Qoder IDE/CLI)
|
|
17
|
-
|
|
18
|
-
**先确定仓库根 R**(QoderWork 桌面端工作目录不是仓库根,相对路径会失效):
|
|
19
|
-
```bash
|
|
20
|
-
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
21
|
-
PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
|
|
22
|
-
```
|
|
23
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。后续脚本统一用 `$PY "$R/.qoder/scripts/orchestration/wlkj.py" <命令>`。
|
|
24
|
-
|
|
25
|
-
## Engine: init_doctor.py (幂等, 增量, 永不重头再来)
|
|
26
|
-
|
|
27
|
-
> **鲁棒性保证**:doctor 每项检查独立,**单项失败不阻塞其它项**;无 git 时优雅降级(团队同步/克隆禁用,但本地 PRD/搜索/任务/报告仍可用)。
|
|
28
|
-
> **退出码**:`0` = 全部健康,`1` = 有未解决问题(`--fix` 能修的已自动修)。AI 据此判断"是否可直接开工"。
|
|
29
|
-
|
|
30
|
-
### Case 1: /wl-init (no arguments)
|
|
31
|
-
```bash
|
|
32
|
-
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor
|
|
33
|
-
```
|
|
34
|
-
Report the doctor's findings to the user in friendly language.
|
|
35
|
-
If it found fixable issues, ask: "发现 N 个问题,要我自动修复吗?"
|
|
36
|
-
then run with --fix.
|
|
37
|
-
|
|
38
|
-
### Case 2/3: /wl-init 小王 [pm]
|
|
39
|
-
```bash
|
|
40
|
-
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor --fix 小王 [pm]
|
|
41
|
-
```
|
|
42
|
-
This single command does ALL of:
|
|
43
|
-
1. 注册/切换开发者 (.qoder/.developer, key=value 格式) + 个人空间目录
|
|
44
|
-
2. 拉取团队最新 (team_sync pull - 拿到别人的 PRD 和最新知识图谱)
|
|
45
|
-
3. 克隆缺失的源码仓库 (按 config.yaml git_sync.projects)
|
|
46
|
-
4. 知识图谱: 7天内新鲜->跳过 / 过期->增量同步 / 缺失->全量构建(仅首次)
|
|
47
|
-
5. 校验风格约束文件 + PRD 模板
|
|
48
|
-
6. 检查周五自动构建状态, 给出本系统的设置命令
|
|
49
|
-
|
|
50
|
-
After doctor finishes:
|
|
51
|
-
- init_developer auto-registers identity (member.json + signing key)
|
|
52
|
-
- No separate "team.py add" needed anymore
|
|
53
|
-
|
|
54
|
-
## Incremental Guarantee (为什么不会重头再来)
|
|
55
|
-
|
|
56
|
-
| 状态 | 行为 |
|
|
57
|
-
|------|------|
|
|
58
|
-
| 本周已 init 过 / 周五任务跑过 | 索引新鲜(≤7天) -> 全部跳过, 秒级完成 |
|
|
59
|
-
| 周五任务没跑/失效 | 索引过期 -> git diff 增量更新, 只处理变更文件 |
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
1
|
+
---
|
|
2
|
+
name: wl-init
|
|
3
|
+
description: "初始化/切换开发者身份 + 环境体检。Initialize/switch developer identity + environment health check. "
|
|
4
|
+
argument-hint: "[name] [role]"
|
|
5
|
+
auto-approve: true
|
|
6
|
+
allowed-tools: [Read, Glob, Grep, Bash, Write, Edit]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# /wl-init - One-stop Init (Developer + Environment Doctor)
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
/wl-init - 体检环境 + 显示状态
|
|
13
|
+
/wl-init 小王 - 切换/注册开发者 + 体检 + 自动修复
|
|
14
|
+
/wl-init 小王 pm - 注册新开发者(带角色) + 体检 + 自动修复
|
|
15
|
+
|
|
16
|
+
## 🔧 环境自检(QoderWork 桌面端 vs Qoder IDE/CLI)
|
|
17
|
+
|
|
18
|
+
**先确定仓库根 R**(QoderWork 桌面端工作目录不是仓库根,相对路径会失效):
|
|
19
|
+
```bash
|
|
20
|
+
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
21
|
+
PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
|
|
22
|
+
```
|
|
23
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。后续脚本统一用 `$PY "$R/.qoder/scripts/orchestration/wlkj.py" <命令>`。
|
|
24
|
+
|
|
25
|
+
## Engine: init_doctor.py (幂等, 增量, 永不重头再来)
|
|
26
|
+
|
|
27
|
+
> **鲁棒性保证**:doctor 每项检查独立,**单项失败不阻塞其它项**;无 git 时优雅降级(团队同步/克隆禁用,但本地 PRD/搜索/任务/报告仍可用)。
|
|
28
|
+
> **退出码**:`0` = 全部健康,`1` = 有未解决问题(`--fix` 能修的已自动修)。AI 据此判断"是否可直接开工"。
|
|
29
|
+
|
|
30
|
+
### Case 1: /wl-init (no arguments)
|
|
31
|
+
```bash
|
|
32
|
+
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor
|
|
33
|
+
```
|
|
34
|
+
Report the doctor's findings to the user in friendly language.
|
|
35
|
+
If it found fixable issues, ask: "发现 N 个问题,要我自动修复吗?"
|
|
36
|
+
then run with --fix.
|
|
37
|
+
|
|
38
|
+
### Case 2/3: /wl-init 小王 [pm]
|
|
39
|
+
```bash
|
|
40
|
+
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor --fix 小王 [pm]
|
|
41
|
+
```
|
|
42
|
+
This single command does ALL of:
|
|
43
|
+
1. 注册/切换开发者 (.qoder/.developer, key=value 格式) + 个人空间目录
|
|
44
|
+
2. 拉取团队最新 (team_sync pull - 拿到别人的 PRD 和最新知识图谱)
|
|
45
|
+
3. 克隆缺失的源码仓库 (按 config.yaml git_sync.projects)
|
|
46
|
+
4. 知识图谱: 7天内新鲜->跳过 / 过期->增量同步 / 缺失->全量构建(仅首次)
|
|
47
|
+
5. 校验风格约束文件 + PRD 模板
|
|
48
|
+
6. 检查周五自动构建状态, 给出本系统的设置命令
|
|
49
|
+
|
|
50
|
+
After doctor finishes:
|
|
51
|
+
- init_developer auto-registers identity (member.json + signing key)
|
|
52
|
+
- No separate "team.py add" needed anymore
|
|
53
|
+
|
|
54
|
+
## Incremental Guarantee (为什么不会重头再来)
|
|
55
|
+
|
|
56
|
+
| 状态 | 行为 |
|
|
57
|
+
|------|------|
|
|
58
|
+
| 本周已 init 过 / 周五任务跑过 | 索引新鲜(≤7天) -> 全部跳过, 秒级完成 |
|
|
59
|
+
| 周五任务没跑/失效 | 索引过期 -> git diff 增量更新, 只处理变更文件 |
|
|
60
|
+
|
|
61
|
+
## 🔗 平台项目绑定(60 人各用各的项目)
|
|
62
|
+
|
|
63
|
+
**每个开发者绑定自己的项目。** `/wl-init` 时选择 → 拉 token → 写 mcp_config.json。
|
|
64
|
+
**切换项目 = 重跑 `/wl-init` 选另一个。** 60 人各自选自己的项目,token 绑定到项目,知识层自动隔离。
|
|
65
|
+
|
|
66
|
+
### 已绑定?(探测多宿主路径)
|
|
67
|
+
```bash
|
|
68
|
+
grep -l WLKJ_PROJECT_ID "$R/.qoder/mcp_config.json" 2>/dev/null && echo "已绑定" || echo "未绑定"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 未绑定或要切换?一行命令:
|
|
72
|
+
```bash
|
|
73
|
+
$PY "$R/.qoder/scripts/domain/kg/switch_project.py"
|
|
74
|
+
```
|
|
75
|
+
脚本会:
|
|
76
|
+
1. 问邮箱+密码(或用 --email/--pw 参数)
|
|
77
|
+
2. 连平台 `POST /api/auth/bind` 拉项目列表
|
|
78
|
+
3. 列出你的所有项目,选一个
|
|
79
|
+
4. 自动写 mcp_config.json(含该项目的 token + project_id)
|
|
80
|
+
|
|
81
|
+
非交互模式(CI/自动化):
|
|
82
|
+
```bash
|
|
83
|
+
$PY "$R/.qoder/scripts/domain/kg/switch_project.py" --email a@b.c --pw xxx --project-uuid <UUID>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**之后所有命令自动用该项目的知识层、token、回流地址。不同人选不同项目 = 完全隔离。**
|
|
87
|
+
| 全新机器 | 克隆仓库 + 全量构建一次, 之后永远增量 |
|
|
88
|
+
| 团队其他人已更新图谱 | team_sync pull 直接拿到, 本机不用构建 |
|
|
89
|
+
|
|
90
|
+
## .developer File Format (MANDATORY)
|
|
91
|
+
|
|
92
|
+
ALWAYS write `.qoder/.developer` in key=value format:
|
|
93
|
+
```
|
|
94
|
+
name=小王
|
|
95
|
+
role=pm
|
|
96
|
+
initialized_at=2026-06-12T10:00:00
|
|
97
|
+
```
|
|
98
|
+
Do NOT use `name: value` style. (Parsers accept both for legacy files,
|
|
99
|
+
but new writes must use `=`.)
|
|
100
|
+
|
|
101
|
+
## Git Author Check
|
|
102
|
+
|
|
103
|
+
The doctor reports if `git config user.name` differs from the developer
|
|
104
|
+
name (it breaks /wl-report's commit statistics). If the user agrees,
|
|
105
|
+
run: `git config user.name {name}`. Do not change it without confirmation.
|
|
106
|
+
|
|
107
|
+
## Status Display
|
|
108
|
+
After any operation, show:
|
|
109
|
+
```
|
|
110
|
+
Developer: 小王 (pm)
|
|
111
|
+
Team: 3 members (1 PM, 2 Dev)
|
|
112
|
+
Active tasks: 2 (1 in progress, 1 draft)
|
|
113
|
+
知识图谱: 2 天前更新 (新鲜)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Safety Rules
|
|
117
|
+
- NEVER delete workspace/ content
|
|
118
|
+
- NEVER overwrite member.json or task.json
|
|
119
|
+
- Full index build ONLY when index is completely missing (doctor handles this)
|
|
120
|
+
|
|
121
|
+
## 产品常踩的坑(遇到时这样解释,别让产品卡住)
|
|
122
|
+
|
|
123
|
+
| 现象 | 原因 | 怎么说 / 怎么办 |
|
|
124
|
+
|------|------|----------------|
|
|
125
|
+
| `/wl-init --fix` 卡在第 4 项几分钟 | 正在 clone 大源码仓库(fywl-ics 8973 文件) | 告诉用户"首次克隆大仓库要几分钟,属正常,耐心等"。clone 失败(网络/权限)只影响"搜索真实代码",本地 PRD/任务/报告不受影响 |
|
|
126
|
+
| 搜代码总返回 0 结果 / 生成原型字段全空 | `config.yaml` 的 `platforms.{xx}.project` 写的项目名在 `data/code/` 下不存在(管理员改了 git_sync URL 忘改 platforms) | doctor 第 4 项会报 `platforms.X.project = '...' 但无此目录`。让管理员核对 config.yaml 的 platforms 映射 |
|
|
127
|
+
| `git user.name` 与开发者名不一致警告 | 影响后续 /wl-report 统计 + push 门禁 | doctor 已自动用 `--fix` 修正本仓库 git config。用户未带 `--fix` 时提示重跑 |
|
|
128
|
+
| 没装 git | doctor 第 1 项报 WARN | 不阻塞:本地 PRD/搜索/任务/报告仍可用,只有团队同步/克隆禁用 |
|
|
129
|
+
| 搜出来的代码是旧的 | 知识图谱 >7 天未更新 | doctor 第 5 项会增量同步,`--fix` 自动跑 |
|