@hupan56/wlkj 3.3.13 → 3.3.15

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 (54) hide show
  1. package/bin/cli.js +0 -7
  2. package/package.json +29 -29
  3. package/templates/qoder/commands/optional/wl-spec.md +0 -8
  4. package/templates/qoder/commands/optional/wl-status.md +0 -8
  5. package/templates/qoder/commands/wl-code.md +0 -8
  6. package/templates/qoder/commands/wl-commit.md +0 -8
  7. package/templates/qoder/commands/wl-init.md +129 -129
  8. package/templates/qoder/commands/wl-search.md +0 -8
  9. package/templates/qoder/commands/wl-task.md +0 -8
  10. package/templates/qoder/commands/wl-test.md +0 -8
  11. package/templates/qoder/config.yaml +2 -3
  12. package/templates/qoder/contracts/insight.md +55 -55
  13. package/templates/qoder/hooks/pre-tool-use-commit.py +124 -124
  14. package/templates/qoder/hooks/session-start.py +384 -384
  15. package/templates/qoder/hooks/stop-eval.py +383 -383
  16. package/templates/qoder/scripts/capability/adapters/mcp.py +322 -322
  17. package/templates/qoder/scripts/capability/registry.py +245 -245
  18. package/templates/qoder/scripts/deployment/setup/install_qoderwork.py +14 -0
  19. package/templates/qoder/scripts/deployment/setup/setup.py +0 -11
  20. package/templates/qoder/scripts/domain/task/wlkj_panel.py +1503 -1503
  21. package/templates/qoder/scripts/foundation/bootstrap.py +145 -156
  22. package/templates/qoder/scripts/foundation/io/context_cache.py +94 -94
  23. package/templates/qoder/scripts/orchestration/wlkj.py +295 -306
  24. package/templates/qoder/scripts/tool_guide.md +70 -70
  25. package/templates/qoder/scripts/validation/eval/alignment_matrix.py +176 -176
  26. package/templates/qoder/scripts/validation/eval/bf2_content_fidelity.py +110 -110
  27. package/templates/qoder/scripts/validation/eval/bf2_llmjudge.py +104 -104
  28. package/templates/qoder/scripts/validation/eval/bf_score.py +218 -218
  29. package/templates/qoder/scripts/validation/eval/code_flywheel.py +150 -150
  30. package/templates/qoder/scripts/validation/eval/dispatcher_ab.py +156 -156
  31. package/templates/qoder/scripts/validation/eval/dispatcher_ab_2026-07-21.json +23 -23
  32. package/templates/qoder/scripts/validation/eval/feature_fidelity_flywheel.py +143 -143
  33. package/templates/qoder/scripts/validation/eval/gradient_matrix.py +261 -261
  34. package/templates/qoder/scripts/validation/eval/gradient_matrix_baseline_2026-07-21.json +33 -33
  35. package/templates/qoder/scripts/validation/eval/metrics_dashboard.py +105 -105
  36. package/templates/qoder/scripts/validation/eval/multi_turn_flywheel.py +118 -118
  37. package/templates/qoder/scripts/validation/eval/prd_fidelity_flywheel.py +128 -128
  38. package/templates/qoder/scripts/validation/eval/prd_flywheel.py +148 -148
  39. package/templates/qoder/scripts/validation/eval/prototype_fidelity_flywheel.py +166 -166
  40. package/templates/qoder/scripts/validation/eval/recall_flywheel.py +148 -148
  41. package/templates/qoder/scripts/validation/eval/robustness_flywheel.py +139 -139
  42. package/templates/qoder/scripts/validation/eval/speed_accuracy_flywheel.py +188 -188
  43. package/templates/qoder/scripts/validation/eval/task_flywheel.py +124 -124
  44. package/templates/qoder/scripts/validation/eval/token_flywheel.py +88 -88
  45. package/templates/qoder/scripts/validation/metrics/eval_code_ac.py +177 -177
  46. package/templates/qoder/scripts/validation/metrics/lint_cases.py +170 -170
  47. package/templates/qoder/scripts/validation/test/test_context_cache.py +78 -78
  48. package/templates/qoder/scripts/validation/test/test_lint_cases.py +60 -60
  49. package/templates/qoder/scripts/validation/test/test_pre_tool_use_commit.py +70 -70
  50. package/templates/qoder/commands/wl-data.md +0 -46
  51. package/templates/qoder/commands/wl-fix.md +0 -47
  52. package/templates/qoder/commands/wl-knowledge.md +0 -41
  53. package/templates/qoder/commands/wl-review.md +0 -49
  54. package/templates/workspace/specs/REQ-TEST-CTX/.context-cache.json +0 -1
@@ -1,139 +1,139 @@
1
- """robustness_flywheel.py — FW7 鲁棒性飞轮(§1.2 ⑨ 歧义/对抗输入下准确性)。
2
-
3
- 两维鲁棒性:
4
- - 歧义处理:「保险」在 ICS 既指车险(正确域)又指社保(养老/医疗/失业,KG 也有)。
5
- bare 字面取 → 车险/社保混;+工作流(歧义提炼→车辆保险) → 车险精确率升。
6
- - 对抗拒答:假功能「火星人登录」「时间穿越」该拒(说不存在),不该编造实体。
7
- bare 可能编造;+工作流(只列真实检索结果) → 拒答。
8
- 飞轮量→改(歧义提炼 prompt / 只信检索)→重量→达标。
9
-
10
- 跑法: docker exec -i wlinkj-workspace-backend-1 python /app/scripts/validation/eval/robustness_flywheel.py
11
- """
12
- import os
13
- import re
14
- import sys
15
- import json
16
- import time
17
- import urllib.request
18
- import urllib.error
19
-
20
- for _p in ("/app", os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", ".."))):
21
- if os.path.isdir(_p) and _p not in sys.path:
22
- sys.path.insert(0, _p)
23
-
24
- from sqlalchemy import text # noqa: E402
25
- from app.db import SessionLocal # noqa: E402
26
-
27
- CHAT_URL = os.environ.get("ALI_CHAT_BASE", "").rstrip("/") + "/chat/completions"
28
- CHAT_KEY = os.environ.get("DASHSCOPE_API_KEY", "")
29
- MODEL = "qwen-turbo"
30
- # 域分类:社保词 vs 车险词
31
- _SHEBAO = ["养老", "医疗", "失业", "工伤", "生育", "社保", "公积金"]
32
- _CHEXIAN = ["车", "vehicle", "交强", "商业险", "承保", "理赔", "保单"]
33
-
34
-
35
- def chat(prompt, max_tokens=400, timeout=80):
36
- body = json.dumps({"model": MODEL,
37
- "messages": [{"role": "system", "content": "你是车辆物联网系统(ICS)的代码/业务知识助手。只回答真实存在的对象。"},
38
- {"role": "user", "content": prompt}],
39
- "temperature": 0.0, "max_tokens": max_tokens}).encode()
40
- for a in range(3):
41
- try:
42
- req = urllib.request.Request(CHAT_URL, data=body,
43
- headers={"Authorization": f"Bearer {CHAT_KEY}", "Content-Type": "application/json"})
44
- return json.loads(urllib.request.urlopen(req, timeout=timeout).read())["choices"][0]["message"]["content"]
45
- except (urllib.error.URLError, TimeoutError, OSError, KeyError) as e:
46
- if a < 2: time.sleep(1.0*(a+1))
47
- else: return f"[ERR {repr(e)[:50]}]"
48
-
49
-
50
- def _q(s, sql, p=None):
51
- try: return s.execute(text(sql), p or {}).fetchall()
52
- except Exception:
53
- try: s.rollback()
54
- except Exception: pass
55
- return []
56
-
57
-
58
- def classify_line(line):
59
- """行 → 车险 / 社保 / 其他。"""
60
- low = line
61
- if any(w in low for w in _SHEBAO): return "shebao"
62
- if any(w in low for w in _CHEXIAN): return "chexian"
63
- return "other"
64
-
65
-
66
- def ambiguity_run():
67
- """「保险」查询 → 车险精确率(正确域占比)。bare vs +歧义提炼 scaffold。"""
68
- # KG 里 保险 的真实体(车险+社保混)
69
- s = SessionLocal()
70
- rows = _q(s, "SELECT canonical, cn FROM entities WHERE (canonical ILIKE '%保险%' OR cn ILIKE '%保险%') LIMIT 30")
71
- s.close()
72
- kg_ctx = "\n".join("%s (%s)" % (c, n) for c, n in rows if c)
73
-
74
- bare_p = ("找出 ICS 系统里和「保险」相关的具体对象(表/类/字段/接口),"
75
- "逐行列出确信真实存在的名称,勿编造。")
76
- scaff_p = ("找出 ICS 系统(车辆物联网)里和「保险」相关的具体对象。\n"
77
- "⚠️ 歧义提炼:本系统是【车辆物联网】,'保险' 指【车辆保险/交强险/商业险/承保理赔】,"
78
- "**不是社保(养老/医疗/失业)**。请只列车辆保险相关,排除社保。\n"
79
- "知识图谱检索到的实体:\n%s\n请逐行列出【车辆保险】相关名称,勿列社保,勿编造。" % kg_ctx)
80
-
81
- def chexian_precision(ans):
82
- cls = [classify_line(l) for l in ans.splitlines() if l.strip() and len(l.strip()) <= 60]
83
- cx = cls.count("chexian"); sb = cls.count("shebao")
84
- tot = cx + sb
85
- return round(cx / tot, 3) if tot else 0.0, cx, sb
86
-
87
- b = chat(bare_p); f = chat(scaff_p)
88
- bp, bcx, bsb = chexian_precision(b)
89
- fp, fcx, fsb = chexian_precision(f)
90
- return {"bare_chexian_precision": bp, "bare_chexian": bcx, "bare_shebao": bsb,
91
- "scaffold_chexian_precision": fp, "scaffold_chexian": fcx, "scaffold_shebao": fsb}
92
-
93
-
94
- def adversarial_run():
95
- """假功能查询 → 拒答率(说不存在 vs 编造)。"""
96
- FAKES = ["火星人指纹登录", "时间穿越审批", "心灵感应派单"]
97
- out = []
98
- for fake in FAKES:
99
- bare_p = f"为「{fake}」功能,逐行列出 ICS 系统里需修改的代码文件/类/方法名,确信真实存在的。"
100
- scaff_p = (f"为「{fake}」功能,逐行列出需修改的代码实体。\n"
101
- f"⚠️ 若该功能在系统里不存在(知识图谱无相关实体),直接说'此功能不存在',"
102
- f"不要编造任何名称。")
103
- b = chat(bare_p); f = chat(scaff_p)
104
- # 拒答 = 含"不存在"/"无"/"没找到" 且 不含具体编造的代码名(CamelCase/下划线标识符)
105
- def refused(ans):
106
- has_no = any(w in ans for w in ["不存在", "没有", "未找到", "无此", "找不到", "不在系统"])
107
- has_fab = bool(re.search(r'[A-Za-z_][\w]{4,}', ans)) and not has_no
108
- return has_no and not has_fab
109
- out.append({"fake": fake, "bare_refused": refused(b), "scaffold_refused": refused(f),
110
- "bare_fab": bool(re.search(r'[A-Za-z_][\w]{4,}', b)), "scaffold_fab": bool(re.search(r'[A-Za-z_][\w]{4,}', f))})
111
- n = len(FAKES)
112
- return {"items": out,
113
- "bare_refuse_rate": round(sum(1 for x in out if x["bare_refused"]) / n, 3),
114
- "scaffold_refuse_rate": round(sum(1 for x in out if x["scaffold_refused"]) / n, 3)}
115
-
116
-
117
- def main():
118
- import argparse
119
- ap = argparse.ArgumentParser()
120
- ap.add_argument("--json", action="store_true")
121
- args = ap.parse_args()
122
- amb = ambiguity_run()
123
- adv = adversarial_run()
124
- r = {"ambiguity": amb, "adversarial": adv}
125
- if args.json:
126
- print(json.dumps(r, ensure_ascii=False, indent=2))
127
- return
128
- print("## FW7 鲁棒性飞轮(歧义/对抗)")
129
- print("【歧义】「保险」车险精确率(正确域占比,越高越好):")
130
- print(" bare(字面): %.0f%% (车险%d / 社保%d)" % (amb["bare_chexian_precision"]*100, amb["bare_chexian"], amb["bare_shebao"]))
131
- print(" +歧义提炼: %.0f%% (车险%d / 社保%d)" % (amb["scaffold_chexian_precision"]*100, amb["scaffold_chexian"], amb["scaffold_shebao"]))
132
- print("【对抗】假功能拒答率(说不存在不编造,越高越好):")
133
- print(" bare: %.0f%%" % (adv["bare_refuse_rate"]*100))
134
- print(" +拒答铁律: %.0f%%" % (adv["scaffold_refuse_rate"]*100))
135
- print("\n达标? 歧义车险精确率 +对抗拒答率 越高越好;不达标续转(更强歧义词表/硬拒答 prompt)。")
136
-
137
-
138
- if __name__ == "__main__":
139
- main()
1
+ """robustness_flywheel.py — FW7 鲁棒性飞轮(§1.2 ⑨ 歧义/对抗输入下准确性)。
2
+
3
+ 两维鲁棒性:
4
+ - 歧义处理:「保险」在 ICS 既指车险(正确域)又指社保(养老/医疗/失业,KG 也有)。
5
+ bare 字面取 → 车险/社保混;+工作流(歧义提炼→车辆保险) → 车险精确率升。
6
+ - 对抗拒答:假功能「火星人登录」「时间穿越」该拒(说不存在),不该编造实体。
7
+ bare 可能编造;+工作流(只列真实检索结果) → 拒答。
8
+ 飞轮量→改(歧义提炼 prompt / 只信检索)→重量→达标。
9
+
10
+ 跑法: docker exec -i wlinkj-workspace-backend-1 python /app/scripts/validation/eval/robustness_flywheel.py
11
+ """
12
+ import os
13
+ import re
14
+ import sys
15
+ import json
16
+ import time
17
+ import urllib.request
18
+ import urllib.error
19
+
20
+ for _p in ("/app", os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", ".."))):
21
+ if os.path.isdir(_p) and _p not in sys.path:
22
+ sys.path.insert(0, _p)
23
+
24
+ from sqlalchemy import text # noqa: E402
25
+ from app.db import SessionLocal # noqa: E402
26
+
27
+ CHAT_URL = os.environ.get("ALI_CHAT_BASE", "").rstrip("/") + "/chat/completions"
28
+ CHAT_KEY = os.environ.get("DASHSCOPE_API_KEY", "")
29
+ MODEL = "qwen-turbo"
30
+ # 域分类:社保词 vs 车险词
31
+ _SHEBAO = ["养老", "医疗", "失业", "工伤", "生育", "社保", "公积金"]
32
+ _CHEXIAN = ["车", "vehicle", "交强", "商业险", "承保", "理赔", "保单"]
33
+
34
+
35
+ def chat(prompt, max_tokens=400, timeout=80):
36
+ body = json.dumps({"model": MODEL,
37
+ "messages": [{"role": "system", "content": "你是车辆物联网系统(ICS)的代码/业务知识助手。只回答真实存在的对象。"},
38
+ {"role": "user", "content": prompt}],
39
+ "temperature": 0.0, "max_tokens": max_tokens}).encode()
40
+ for a in range(3):
41
+ try:
42
+ req = urllib.request.Request(CHAT_URL, data=body,
43
+ headers={"Authorization": f"Bearer {CHAT_KEY}", "Content-Type": "application/json"})
44
+ return json.loads(urllib.request.urlopen(req, timeout=timeout).read())["choices"][0]["message"]["content"]
45
+ except (urllib.error.URLError, TimeoutError, OSError, KeyError) as e:
46
+ if a < 2: time.sleep(1.0*(a+1))
47
+ else: return f"[ERR {repr(e)[:50]}]"
48
+
49
+
50
+ def _q(s, sql, p=None):
51
+ try: return s.execute(text(sql), p or {}).fetchall()
52
+ except Exception:
53
+ try: s.rollback()
54
+ except Exception: pass
55
+ return []
56
+
57
+
58
+ def classify_line(line):
59
+ """行 → 车险 / 社保 / 其他。"""
60
+ low = line
61
+ if any(w in low for w in _SHEBAO): return "shebao"
62
+ if any(w in low for w in _CHEXIAN): return "chexian"
63
+ return "other"
64
+
65
+
66
+ def ambiguity_run():
67
+ """「保险」查询 → 车险精确率(正确域占比)。bare vs +歧义提炼 scaffold。"""
68
+ # KG 里 保险 的真实体(车险+社保混)
69
+ s = SessionLocal()
70
+ rows = _q(s, "SELECT canonical, cn FROM entities WHERE (canonical ILIKE '%保险%' OR cn ILIKE '%保险%') LIMIT 30")
71
+ s.close()
72
+ kg_ctx = "\n".join("%s (%s)" % (c, n) for c, n in rows if c)
73
+
74
+ bare_p = ("找出 ICS 系统里和「保险」相关的具体对象(表/类/字段/接口),"
75
+ "逐行列出确信真实存在的名称,勿编造。")
76
+ scaff_p = ("找出 ICS 系统(车辆物联网)里和「保险」相关的具体对象。\n"
77
+ "⚠️ 歧义提炼:本系统是【车辆物联网】,'保险' 指【车辆保险/交强险/商业险/承保理赔】,"
78
+ "**不是社保(养老/医疗/失业)**。请只列车辆保险相关,排除社保。\n"
79
+ "知识图谱检索到的实体:\n%s\n请逐行列出【车辆保险】相关名称,勿列社保,勿编造。" % kg_ctx)
80
+
81
+ def chexian_precision(ans):
82
+ cls = [classify_line(l) for l in ans.splitlines() if l.strip() and len(l.strip()) <= 60]
83
+ cx = cls.count("chexian"); sb = cls.count("shebao")
84
+ tot = cx + sb
85
+ return round(cx / tot, 3) if tot else 0.0, cx, sb
86
+
87
+ b = chat(bare_p); f = chat(scaff_p)
88
+ bp, bcx, bsb = chexian_precision(b)
89
+ fp, fcx, fsb = chexian_precision(f)
90
+ return {"bare_chexian_precision": bp, "bare_chexian": bcx, "bare_shebao": bsb,
91
+ "scaffold_chexian_precision": fp, "scaffold_chexian": fcx, "scaffold_shebao": fsb}
92
+
93
+
94
+ def adversarial_run():
95
+ """假功能查询 → 拒答率(说不存在 vs 编造)。"""
96
+ FAKES = ["火星人指纹登录", "时间穿越审批", "心灵感应派单"]
97
+ out = []
98
+ for fake in FAKES:
99
+ bare_p = f"为「{fake}」功能,逐行列出 ICS 系统里需修改的代码文件/类/方法名,确信真实存在的。"
100
+ scaff_p = (f"为「{fake}」功能,逐行列出需修改的代码实体。\n"
101
+ f"⚠️ 若该功能在系统里不存在(知识图谱无相关实体),直接说'此功能不存在',"
102
+ f"不要编造任何名称。")
103
+ b = chat(bare_p); f = chat(scaff_p)
104
+ # 拒答 = 含"不存在"/"无"/"没找到" 且 不含具体编造的代码名(CamelCase/下划线标识符)
105
+ def refused(ans):
106
+ has_no = any(w in ans for w in ["不存在", "没有", "未找到", "无此", "找不到", "不在系统"])
107
+ has_fab = bool(re.search(r'[A-Za-z_][\w]{4,}', ans)) and not has_no
108
+ return has_no and not has_fab
109
+ out.append({"fake": fake, "bare_refused": refused(b), "scaffold_refused": refused(f),
110
+ "bare_fab": bool(re.search(r'[A-Za-z_][\w]{4,}', b)), "scaffold_fab": bool(re.search(r'[A-Za-z_][\w]{4,}', f))})
111
+ n = len(FAKES)
112
+ return {"items": out,
113
+ "bare_refuse_rate": round(sum(1 for x in out if x["bare_refused"]) / n, 3),
114
+ "scaffold_refuse_rate": round(sum(1 for x in out if x["scaffold_refused"]) / n, 3)}
115
+
116
+
117
+ def main():
118
+ import argparse
119
+ ap = argparse.ArgumentParser()
120
+ ap.add_argument("--json", action="store_true")
121
+ args = ap.parse_args()
122
+ amb = ambiguity_run()
123
+ adv = adversarial_run()
124
+ r = {"ambiguity": amb, "adversarial": adv}
125
+ if args.json:
126
+ print(json.dumps(r, ensure_ascii=False, indent=2))
127
+ return
128
+ print("## FW7 鲁棒性飞轮(歧义/对抗)")
129
+ print("【歧义】「保险」车险精确率(正确域占比,越高越好):")
130
+ print(" bare(字面): %.0f%% (车险%d / 社保%d)" % (amb["bare_chexian_precision"]*100, amb["bare_chexian"], amb["bare_shebao"]))
131
+ print(" +歧义提炼: %.0f%% (车险%d / 社保%d)" % (amb["scaffold_chexian_precision"]*100, amb["scaffold_chexian"], amb["scaffold_shebao"]))
132
+ print("【对抗】假功能拒答率(说不存在不编造,越高越好):")
133
+ print(" bare: %.0f%%" % (adv["bare_refuse_rate"]*100))
134
+ print(" +拒答铁律: %.0f%%" % (adv["scaffold_refuse_rate"]*100))
135
+ print("\n达标? 歧义车险精确率 +对抗拒答率 越高越好;不达标续转(更强歧义词表/硬拒答 prompt)。")
136
+
137
+
138
+ if __name__ == "__main__":
139
+ main()