@hupan56/wlkj 2.7.12 → 3.0.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 (152) hide show
  1. package/bin/cli.js +344 -78
  2. package/package.json +29 -29
  3. package/templates/.qoder/.runtime/ctx-cache-5660152f1d6dd819.md +23 -0
  4. package/templates/.qoder/.runtime/ctx-cache-afdce0dac06b25b0.md +23 -0
  5. package/templates/.qoder/.runtime/search-cache-eae7644e7b122f35.txt +1 -0
  6. package/templates/.qoder/learning/eval-history.jsonl +28 -0
  7. package/templates/data/index/wiki-index.json +8 -0
  8. package/templates/qoder/agents/insight-planning.md +1 -1
  9. package/templates/qoder/agents/insight-research.md +28 -15
  10. package/templates/qoder/commands/optional/wl-insight.md +159 -161
  11. package/templates/qoder/commands/optional/wl-report.md +4 -4
  12. package/templates/qoder/commands/optional/wl-status.md +2 -2
  13. package/templates/qoder/commands/wl-code.md +2 -2
  14. package/templates/qoder/commands/wl-design.md +2 -2
  15. package/templates/qoder/commands/wl-init.md +3 -3
  16. package/templates/qoder/commands/wl-prd.md +2 -2
  17. package/templates/qoder/commands/wl-req.md +43 -0
  18. package/templates/qoder/commands/wl-search.md +8 -8
  19. package/templates/qoder/commands/wl-task.md +17 -17
  20. package/templates/qoder/commands/wl-test.md +41 -15
  21. package/templates/qoder/config.yaml +17 -1
  22. package/templates/qoder/hooks/session-start.py +12 -22
  23. package/templates/qoder/nul +4 -0
  24. package/templates/qoder/rules/wl-pipeline.md +22 -48
  25. package/templates/qoder/scripts/README.md +139 -0
  26. package/templates/qoder/scripts/common/autotest_auth.py +109 -0
  27. package/templates/qoder/scripts/common/bootstrap.py +145 -0
  28. package/templates/qoder/scripts/common/check_publish.py +98 -0
  29. package/templates/qoder/scripts/common/cmd_registry.py +112 -0
  30. package/templates/qoder/scripts/common/config.py +187 -0
  31. package/templates/qoder/scripts/common/contract.py +317 -0
  32. package/templates/qoder/scripts/common/developer.py +2 -1
  33. package/templates/qoder/scripts/common/feishu.py +10 -9
  34. package/templates/qoder/scripts/common/guard.py +159 -0
  35. package/templates/qoder/scripts/common/identity.py +121 -2
  36. package/templates/qoder/scripts/common/kg_capabilities.py +182 -0
  37. package/templates/qoder/scripts/common/mcp_base.py +268 -0
  38. package/templates/qoder/scripts/common/paths.py +187 -1
  39. package/templates/qoder/scripts/common/result.py +223 -0
  40. package/templates/qoder/scripts/common/roles.py +60 -0
  41. package/templates/qoder/scripts/common/task_utils.py +21 -9
  42. package/templates/qoder/scripts/common/test_extract.py +115 -0
  43. package/templates/qoder/scripts/kg/__init__.py +11 -0
  44. package/templates/qoder/scripts/kg/build_entity_registry.py +196 -0
  45. package/templates/qoder/scripts/kg/build_relations.py +127 -0
  46. package/templates/qoder/scripts/{build_style_index.py → kg/build_style_index.py} +39 -10
  47. package/templates/qoder/scripts/kg/build_workflows.py +144 -0
  48. package/templates/qoder/scripts/{context_pack.py → kg/context_pack.py} +18 -11
  49. package/templates/qoder/scripts/{enrich_prompt.py → kg/enrich_prompt.py} +232 -226
  50. package/templates/qoder/scripts/{extract_api_params.py → kg/extract.py} +398 -246
  51. package/templates/qoder/scripts/{kg.py → kg/kg.py} +638 -708
  52. package/templates/qoder/scripts/{kg_build.py → kg/kg_build.py} +618 -612
  53. package/templates/qoder/scripts/{kg_build_db.py → kg/kg_build_db.py} +333 -327
  54. package/templates/qoder/scripts/{kg_duckdb.py → kg/kg_duckdb.py} +38 -37
  55. package/templates/qoder/scripts/{kg_incremental.py → kg/kg_incremental.py} +420 -393
  56. package/templates/qoder/scripts/{kg_link_db.py → kg/kg_link_db.py} +230 -224
  57. package/templates/qoder/scripts/{kg_semantic.py → kg/kg_semantic.py} +156 -150
  58. package/templates/qoder/scripts/kg/prefetch.py +359 -0
  59. package/templates/qoder/scripts/{search_index.py → kg/search_index.py} +70 -14
  60. package/templates/qoder/scripts/mcp/__init__.py +11 -0
  61. package/templates/qoder/scripts/{kg_mcp_server.py → mcp/kg_mcp_server.py} +77 -272
  62. package/templates/qoder/scripts/{lanhu_stdio_wrapper.py → mcp/lanhu_stdio_wrapper.py} +125 -119
  63. package/templates/qoder/scripts/{check_mcp.py → mcp/mcp_doctor.py} +515 -298
  64. package/templates/qoder/scripts/{mcp_launcher.py → mcp/mcp_launcher.py} +442 -414
  65. package/templates/qoder/scripts/{mysql_mcp_server.py → mcp/mysql_mcp_server.py} +347 -396
  66. package/templates/qoder/scripts/{zentao_mcp_server.py → mcp/zentao_mcp_server.py} +384 -424
  67. package/templates/qoder/scripts/report/__init__.py +11 -0
  68. package/templates/qoder/scripts/{add_session.py → report/add_session.py} +250 -244
  69. package/templates/qoder/scripts/{archive_prd.py → report/archive_prd.py} +383 -377
  70. package/templates/qoder/scripts/{eval_prd.py → report/eval_prd.py} +73 -11
  71. package/templates/qoder/scripts/{export.py → report/export.py} +63 -0
  72. package/templates/qoder/scripts/{fill_prototype.py → report/fill_prototype.py} +6 -0
  73. package/templates/qoder/scripts/{gen_design_doc.py → report/gen_design_doc.py} +400 -394
  74. package/templates/qoder/scripts/{learn.py → report/learn.py} +152 -146
  75. package/templates/qoder/scripts/{learn_aggregate.py → report/learn_aggregate.py} +207 -201
  76. package/templates/qoder/scripts/{report.py → report/report.py} +287 -281
  77. package/templates/qoder/scripts/report/req.py +222 -0
  78. package/templates/qoder/scripts/report/role.py +33 -0
  79. package/templates/qoder/scripts/{status.py → report/status.py} +634 -628
  80. package/templates/qoder/scripts/setup/__init__.py +11 -0
  81. package/templates/qoder/scripts/setup/carriers.py +662 -0
  82. package/templates/qoder/scripts/{init_doctor.py → setup/init_doctor.py} +63 -26
  83. package/templates/qoder/scripts/{install_qoderwork.py → setup/install_qoderwork.py} +36 -26
  84. package/templates/qoder/scripts/{platform_doctor.py → setup/platform_doctor.py} +265 -259
  85. package/templates/qoder/scripts/{repo_root.py → setup/repo_root.py} +112 -106
  86. package/templates/qoder/scripts/{setup.py → setup/setup.py} +113 -4
  87. package/templates/qoder/scripts/{setup_lanhu.py → setup/setup_lanhu.py} +973 -963
  88. package/templates/qoder/scripts/task/__init__.py +11 -0
  89. package/templates/qoder/scripts/{git_sync.py → task/git_sync.py} +52 -31
  90. package/templates/qoder/scripts/{syncgate.py → task/syncgate.py} +6 -0
  91. package/templates/qoder/scripts/task/task.py +221 -0
  92. package/templates/qoder/scripts/task/task_lifecycle.py +596 -0
  93. package/templates/qoder/scripts/task/task_query.py +161 -0
  94. package/templates/qoder/scripts/task/task_relations.py +424 -0
  95. package/templates/qoder/scripts/{team_sync.py → task/team_sync.py} +93 -20
  96. package/templates/qoder/scripts/test/__init__.py +11 -0
  97. package/templates/qoder/scripts/{autotest.py → test/autotest.py} +1174 -1751
  98. package/templates/qoder/scripts/{autotest_batch.py → test/autotest_batch.py} +242 -224
  99. package/templates/qoder/scripts/test/autotest_data.py +675 -0
  100. package/templates/qoder/scripts/{autotest_run.py → test/autotest_run.py} +309 -297
  101. package/templates/qoder/scripts/{benchmark.py → test/benchmark.py} +6 -0
  102. package/templates/qoder/scripts/{kg_auto_login.py → test/kg_auto_login.py} +202 -196
  103. package/templates/qoder/scripts/{kg_test_runner.py → test/kg_test_runner.py} +7 -1
  104. package/templates/qoder/scripts/{page_probe.py → test/page_probe.py} +465 -459
  105. package/templates/qoder/scripts/wlkj.py +116 -0
  106. package/templates/qoder/settings.json +1 -10
  107. package/templates/qoder/skills/design-import/SKILL.md +226 -226
  108. package/templates/qoder/skills/design-review/SKILL.md +82 -82
  109. package/templates/qoder/skills/prd-generator/SKILL.md +26 -16
  110. package/templates/qoder/skills/prd-review/SKILL.md +5 -5
  111. package/templates/qoder/skills/prototype-generator/SKILL.md +256 -256
  112. package/templates/qoder/skills/spec-coder/SKILL.md +4 -4
  113. package/templates/qoder/skills/spec-generator/SKILL.md +4 -4
  114. package/templates/qoder/skills/test-generator/SKILL.md +5 -5
  115. package/templates/qoder/skills/wl-code/SKILL.md +4 -4
  116. package/templates/qoder/skills/wl-commit/SKILL.md +4 -4
  117. package/templates/qoder/skills/wl-design/SKILL.md +3 -3
  118. package/templates/qoder/skills/wl-init/SKILL.md +8 -8
  119. package/templates/qoder/skills/wl-insight/SKILL.md +5 -5
  120. package/templates/qoder/skills/wl-prd-full/SKILL.md +6 -6
  121. package/templates/qoder/skills/wl-prd-quick/SKILL.md +6 -6
  122. package/templates/qoder/skills/wl-prd-review/SKILL.md +4 -4
  123. package/templates/qoder/skills/wl-report/SKILL.md +7 -7
  124. package/templates/qoder/skills/wl-search/SKILL.md +13 -13
  125. package/templates/qoder/skills/wl-spec/SKILL.md +5 -5
  126. package/templates/qoder/skills/wl-status/SKILL.md +5 -5
  127. package/templates/qoder/skills/wl-task/SKILL.md +6 -6
  128. package/templates/qoder/skills/wl-test/SKILL.md +102 -39
  129. package/templates/root/AGENTS.md +39 -40
  130. package/templates/qoder/hooks/inject-workflow-state.py +0 -169
  131. package/templates/qoder/scripts/__pycache__/check_mcp_launch.cpython-39.pyc +0 -0
  132. package/templates/qoder/scripts/__pycache__/install_qoderwork.cpython-39.pyc +0 -0
  133. package/templates/qoder/scripts/__pycache__/mcp_launcher.cpython-39.pyc +0 -0
  134. package/templates/qoder/scripts/__pycache__/platform_doctor.cpython-39.pyc +0 -0
  135. package/templates/qoder/scripts/check_carriers.py +0 -238
  136. package/templates/qoder/scripts/check_mcp_launch.py +0 -183
  137. package/templates/qoder/scripts/check_qoderwork_consistency.py +0 -166
  138. package/templates/qoder/scripts/collect_prds.py +0 -31
  139. package/templates/qoder/scripts/common/mentions.py +0 -134
  140. package/templates/qoder/scripts/common/utf8.py +0 -38
  141. package/templates/qoder/scripts/extract_routes.py +0 -54
  142. package/templates/qoder/scripts/extract_routes_tree.py +0 -78
  143. package/templates/qoder/scripts/handoff.py +0 -22
  144. package/templates/qoder/scripts/init_developer.py +0 -76
  145. package/templates/qoder/scripts/parse_prds.py +0 -33
  146. package/templates/qoder/scripts/role.py +0 -51
  147. package/templates/qoder/scripts/sync_carriers.py +0 -259
  148. package/templates/qoder/scripts/task.py +0 -1261
  149. package/templates/qoder/scripts/workspace_init.py +0 -102
  150. package/templates/qoder/skills/prompt-enrich/SKILL.md +0 -90
  151. package/templates/qoder/skills/prototype-generator/SKILL.md.zcode-79180-2af4721f-f9a6-412c-88db-c0af680d211b.tmp +0 -0
  152. /package/templates/qoder/scripts/{secure-ls.js → test/secure-ls.js} +0 -0
@@ -16,12 +16,12 @@ User input: $ARGUMENTS
16
16
  ```bash
17
17
  R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
18
18
  ```
19
- > 后续脚本统一用 `python "$R/.qoder/scripts/xxx.py"`。
19
+ > 后续脚本统一用 `python "$R/.qoder/scripts/<子包>/<脚本>.py"`(子包: kg/build/test/setup/io)或 `python "$R/.qoder/scripts/wlkj.py" <命令>`。
20
20
 
21
21
  ## 双轨:MCP 优先(仅 QoderWork)/ kg.py 兜底(全系列通用)
22
22
 
23
23
  **QoderWork 环境**(有 `mcp__qoder-knowledge-graph`):直接调 MCP 工具,更快。
24
- **其他 Qoder 载体**(IDE/Quest/CLI):跑 `python "$R/.qoder/scripts/kg.py"`,功能等价。
24
+ **其他 Qoder 载体**(IDE/Quest/CLI):跑 `python "$R/.qoder/scripts/kg/kg.py"`,功能等价。
25
25
 
26
26
  不确定在哪个环境?先试 MCP;MCP 工具不存在就用 kg.py。
27
27
 
@@ -58,16 +58,16 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
58
58
  这些 kg.py 未单独封装,直接跑:
59
59
 
60
60
  ```
61
- python "$R/.qoder/scripts/search_index.py" --field <字段名>
62
- python "$R/.qoder/scripts/search_index.py" --style <table|form|detail|modal|dashboard> [--platform web|app]
63
- python "$R/.qoder/scripts/search_index.py" --list # Top50 关键词
64
- python "$R/.qoder/scripts/search_index.py" --modules # 项目模块概览
65
- python "$R/.qoder/scripts/search_index.py" --components # 组件使用统计
61
+ python "$R/.qoder/scripts/kg/search_index.py" --field <字段名>
62
+ python "$R/.qoder/scripts/kg/search_index.py" --style <table|form|detail|modal|dashboard> [--platform web|app]
63
+ python "$R/.qoder/scripts/kg/search_index.py" --list # Top50 关键词
64
+ python "$R/.qoder/scripts/kg/search_index.py" --modules # 项目模块概览
65
+ python "$R/.qoder/scripts/kg/search_index.py" --components # 组件使用统计
66
66
  ```
67
67
 
68
68
  ## 没给参数时
69
69
 
70
- 如果用户没给关键词/子命令,先问意图,或跑 `python "$R/.qoder/scripts/search_index.py" --list` 列出热门关键词让用户选。
70
+ 如果用户没给关键词/子命令,先问意图,或跑 `python "$R/.qoder/scripts/kg/search_index.py" --list` 列出热门关键词让用户选。
71
71
 
72
72
  ## DO NOT grep the entire codebase
73
73
 
@@ -21,7 +21,7 @@ User input: $ARGUMENTS
21
21
  ```bash
22
22
  R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
23
23
  ```
24
- > 后续脚本统一用 `python "$R/.qoder/scripts/xxx.py"`(task.py / team_sync.py 等)。
24
+ > 后续脚本统一用 `python "$R/.qoder/scripts/<子包>/<脚本>.py"`(子包: kg/build/test/setup/io)或 `python "$R/.qoder/scripts/wlkj.py" <命令>`(task.py / team_sync.py 等)。
25
25
 
26
26
  ---
27
27
 
@@ -90,7 +90,7 @@ ls data/docs/prd/REQ-*.md 2>nul
90
90
 
91
91
  **B. 建任务**
92
92
  ```bash
93
- python "$R/.qoder/scripts/task.py" create "<标题>" --priority <P0|P1|P2|P3>
93
+ python "$R/.qoder/scripts/task/task.py" create "<标题>" --priority <P0|P1|P2|P3>
94
94
  ```
95
95
  - `--assignee` 不填则默认当前开发者(产品建的常指派给开发,可加 `--assignee 老李`)。
96
96
  - `--slug` 不填则自动从标题生成(中文标题也能生成,但建议给个英文 slug 如 `--slug login-export`)。
@@ -101,13 +101,13 @@ python "$R/.qoder/scripts/task.py" create "<标题>" --priority <P0|P1|P2|P3>
101
101
  2. **待排期池 >3 个任务时**,主动建议:"要不要我跑个 rank 排下优先级?"
102
102
  3. 自动同步(用户永不碰 git):
103
103
  ```bash
104
- python "$R/.qoder/scripts/team_sync.py" push
104
+ python "$R/.qoder/scripts/task/team_sync.py" push
105
105
  ```
106
106
 
107
107
  ### list —— 看任务(一次取全,别串行)
108
108
 
109
109
  ```bash
110
- python "$R/.qoder/scripts/task.py" list [--mine] [--status <s>] [--ready] [--blocked]
110
+ python "$R/.qoder/scripts/task/task.py" list [--mine] [--status <s>] [--ready] [--blocked]
111
111
  ```
112
112
 
113
113
  | flag | 用途 |
@@ -127,13 +127,13 @@ python "$R/.qoder/scripts/task.py" list [--mine] [--status <s>] [--ready] [--blo
127
127
 
128
128
  ### show —— 看单个任务详情
129
129
  ```bash
130
- python "$R/.qoder/scripts/task.py" show <任务名或目录>
130
+ python "$R/.qoder/scripts/task/task.py" show <任务名或目录>
131
131
  ```
132
132
  任务名支持模糊匹配(脚本内部 `resolve_task_dir` 会解析)。读完把关键字段(状态/优先级/assignee/due/依赖/prd路径)整理给用户。
133
133
 
134
134
  ### start —— 启动任务(移交开发工位的信号)
135
135
  ```bash
136
- python "$R/.qoder/scripts/task.py" start <任务名>
136
+ python "$R/.qoder/scripts/task/task.py" start <任务名>
137
137
  ```
138
138
  - 状态 `planning → in_progress`,成为活跃任务(`.current-task`)。
139
139
  - 这是产品→开发的交接点:start 后开发就能 `/wl-code` 了。
@@ -141,7 +141,7 @@ python "$R/.qoder/scripts/task.py" start <任务名>
141
141
 
142
142
  ### reassign —— 改派任务负责人(多角色协作必需)
143
143
  ```bash
144
- python "$R/.qoder/scripts/task.py" reassign <任务名> <新负责人>
144
+ python "$R/.qoder/scripts/task/task.py" reassign <任务名> <新负责人>
145
145
  ```
146
146
  - 场景:PM 建任务(assignee 默认是自己)后,要转给开发老李做。
147
147
  - 改派后新负责人才能 `start`/`finish`(零信任 ACL 按 assignee 判定)。
@@ -150,7 +150,7 @@ python "$R/.qoder/scripts/task.py" reassign <任务名> <新负责人>
150
150
 
151
151
  ### finish —— 完成当前任务
152
152
  ```bash
153
- python "$R/.qoder/scripts/team_sync.py" push
153
+ python "$R/.qoder/scripts/task/team_sync.py" push
154
154
  ```
155
155
  - 活跃任务状态 → `completed`,活跃指针清除。
156
156
  - 完成后提示:要不要 `archive` 归档?要不要看下个 `--ready` 的任务?
@@ -158,7 +158,7 @@ python "$R/.qoder/scripts/team_sync.py" push
158
158
 
159
159
  ### archive —— 归档(移到 .qoder/archive/{YYYY-MM}/)
160
160
  ```bash
161
- python "$R/.qoder/scripts/task.py" archive <任务名>
161
+ python "$R/.qoder/scripts/task/task.py" archive <任务名>
162
162
  ```
163
163
  - 事务化:先 move 成功再改 status,move 失败原任务完好。
164
164
  - **自动清理孤儿依赖**:归档后,其它任务里对它的 `blocked_by/blocks/children/parent` 引用会被扫除(防止僵尸任务永远 blocked)。
@@ -172,7 +172,7 @@ python "$R/.qoder/scripts/task.py" archive <任务名>
172
172
 
173
173
  ### 一次取全(别逐个问)
174
174
  ```bash
175
- python "$R/.qoder/scripts/task.py" list --status planning
175
+ python "$R/.qoder/scripts/task/task.py" list --status planning
176
176
  ```
177
177
  拿到所有待排任务,**一次性**评估,不要一个任务问四轮 R/I/C/E。
178
178
 
@@ -203,23 +203,23 @@ python "$R/.qoder/scripts/task.py" list --status planning
203
203
 
204
204
  ### 设置截止日期
205
205
  ```bash
206
- python "$R/.qoder/scripts/task.py" set-due <任务名> <YYYY-MM-DD>
206
+ python "$R/.qoder/scripts/task/task.py" set-due <任务名> <YYYY-MM-DD>
207
207
  ```
208
208
 
209
209
  ### 依赖关系(谁挡谁)
210
210
  ```bash
211
211
  # A 被 B 阻塞(要等 B 完成)
212
- python "$R/.qoder/scripts/task.py" block <A任务名> <B任务名>
212
+ python "$R/.qoder/scripts/task/task.py" block <A任务名> <B任务名>
213
213
  # 解除
214
- python "$R/.qoder/scripts/task.py" unblock <A任务名> <B任务名>
214
+ python "$R/.qoder/scripts/task/task.py" unblock <A任务名> <B任务名>
215
215
  ```
216
216
  - **循环依赖自动检测**:脚本会 BFS 检查,发现环就拒绝(返回 1)。
217
217
  - 反向 `blocks` 关系自动维护(A 被 B 阻塞时,B 的 blocks 自动加 A)。
218
218
 
219
219
  ### 看甘特图
220
220
  ```bash
221
- python "$R/.qoder/scripts/team_sync.py" push
222
- python "$R/.qoder/scripts/task.py" gantt [--weeks 4]
221
+ python "$R/.qoder/scripts/task/team_sync.py" push
222
+ python "$R/.qoder/scripts/task/task.py" gantt [--weeks 4]
223
223
  ```
224
224
  - 只排有 `start_date`/`due_date` 的任务。
225
225
  - 没日期的任务 → 提示:"用 `set-due` 给任务加截止日期,甘特图才会显示。"
@@ -231,8 +231,8 @@ python "$R/.qoder/scripts/task.py" gantt [--weeks 4]
231
231
 
232
232
  ```bash
233
233
  # 把大任务 A 拆出子任务 B
234
- python "$R/.qoder/scripts/task.py" add-subtask <A任务名> <B任务名>
235
- python "$R/.qoder/scripts/task.py" remove-subtask <A任务名> <B任务名>
234
+ python "$R/.qoder/scripts/task/task.py" add-subtask <A任务名> <B任务名>
235
+ python "$R/.qoder/scripts/task/task.py" remove-subtask <A任务名> <B任务名>
236
236
  ```
237
237
  - 父任务记录 `children`,子任务记录 `parent`。
238
238
  - 产品用:把一个大需求拆成"前端/后端/数据"几个子任务,各自指派。
@@ -18,7 +18,7 @@ User input: $ARGUMENTS
18
18
  ```bash
19
19
  R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
20
20
  ```
21
- > 后续脚本统一用 `python "$R/.qoder/scripts/xxx.py"`。
21
+ > 后续脚本统一用 `python "$R/.qoder/scripts/<子包>/<脚本>.py"`(子包: kg/build/test/setup/io)或 `python "$R/.qoder/scripts/wlkj.py" <命令>`。
22
22
 
23
23
  ## 🚦 第一步:路由(看用户输入,立刻决定走哪条线)
24
24
 
@@ -39,29 +39,55 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
39
39
  +该页面的通用交互模式生成用例。平台/环境 AI 推断(web 默认、test 默认),
40
40
  **只在真不确定平台时才问一句**。不要问地址、不要问登录方式——这些 config/文档里都有。
41
41
 
42
- ### 流程(3 步,不绕弯)
42
+ ### 🔴 quick 执行铁律(实测踩过的坑,违反 = 测试失败)
43
43
 
44
- **Step 1:AI 据用户描述生成用例 JSON。** 不搜代码。常见页面直接写:
45
- - 登录页:goto /auth/login 填账号密码 → 点登录 → 断言跳转
44
+ - **① 用意图式 intent+anchor 格式,禁止旧 action+CSS selector**(如 `input[placeholder*='账号']`)
45
+ - **② 占位符精确用 `{{ask:登录账号}}`/`{{ask:登录密码}}`**(匹配个人文档 key,别写"测试账号")
46
+ - **③ `--cases-file` 传文件,禁止内联 `--cases`**(长 JSON 截断)
47
+ - **④ recall 空时先 navigate+snapshot 拿真实 anchor 再填,禁止预猜 selector**
48
+ - **⑤ URL 写 `{{base_url}}/auth/login`(带斜杠,base_url 已去尾斜杠)**
49
+ - **⑥ recall 的 `--url` 用相对路径 `auth/login`**(前导斜杠会被 Windows Git-bash 转成 `/D:/.../Git/auth/login`)
50
+ - **⑦ Playwright 工具批量加载,snapshot 结果直接读,不写文件再 Read**
51
+ - **⑧ 验证码一气呵成(snapshot→截图→Read→type→点登录→删图),填完立刻提交**
52
+ - **⑨ 用例一次生成全部(正向+异常),别一条一条**
53
+
54
+ ### 流程(4 步,不绕弯)
55
+
56
+ **Step 0:recall 查锚点(用相对 URL)。**
57
+ ```bash
58
+ python "$R/.qoder/scripts/test/autotest.py" recall --url auth/login
59
+ ```
60
+ - 有锚点 → 直接填进用例 anchor(零 LLM)
61
+ - 无锚点(首次)→ **先 navigate + snapshot 拿真实 a11y 树,从里面提取 anchor**,禁止预猜 selector
62
+
63
+ **Step 1:AI 据用户描述 + 锚点生成用例 JSON。** 不搜代码。常见页面直接写:
64
+ - 登录页:goto `{{base_url}}/auth/login` → 填账号密码 → 点登录 → 断言跳转
46
65
  - 列表页:goto 列表 → 断言表格加载 → 翻页/筛选
47
66
  - 表单页:goto → 填字段 → 提交 → 断言成功提示
48
- 需要真实数据(账号/密码)用 `{{ask:描述}}` 占位,URL 用 `{{base_url}}`。
49
- 正向 + 关键异常各一条。
67
+ 需要真实数据(账号/密码)用 `{{ask:描述}}` 占位,URL 用 `{{base_url}}/xxx`(**带斜杠**)。
68
+ 正向 + 关键异常各一条。**一次生成全部用例。**
69
+ ```json
70
+ // ✅ 意图式格式 (anchor 来自 recall 或 snapshot)
71
+ {"intent":"fill","desc":"账号框","value":"{{ask:登录账号}}","anchor":{"role":"textbox","name":"尊敬的管理员"}}
72
+ // ❌ 禁止: 旧 action+CSS selector
73
+ {"action":"fill","target":"input[placeholder*='账号']","value":"{{ask:测试账号}}"}
74
+ ```
50
75
 
51
76
  **Step 2:调脚本,注入数据 + 出执行计划:**
52
77
  ```bash
53
- python "$R/.qoder/scripts/autotest.py" quick \
54
- --cases '<Step1生成的JSON>' \
78
+ # AI 先把用例 JSON 写文件, 再传路径 (--cases-file, 不截断)
79
+ python "$R/.qoder/scripts/test/autotest.py" quick \
80
+ --cases-file <文件路径> \
55
81
  --desc "<用户描述>" --platform <web|app>
56
82
  ```
57
83
  脚本自动:解析 test 环境域名 + 从个人文档注入账号密码 + 出执行计划。
58
84
  若提示"需要测试数据" → 逐项问用户,再用 `--data` 传。
59
85
 
60
- **Step 3:执行由 QoderWork 浏览器连接器承担(真实场景)。**
61
- 脚本只出计划,不自己开浏览器。无连接器 降级人工核对清单。
86
+ **Step 3:执行由 Playwright MCP 驱动(真实场景)。**
87
+ 脚本只出计划,不自己开浏览器。批量加载 browser_* 工具后按执行计划连发操作。
62
88
  跑完回传结果出报告:
63
89
  ```bash
64
- python "$R/.qoder/scripts/autotest.py" quick --record '{"Q-1":"pass","Q-2":"fail"}'
90
+ python "$R/.qoder/scripts/test/autotest.py" quick --record '{"Q-1":"pass","Q-2":"fail"}'
65
91
  ```
66
92
 
67
93
  ---
@@ -71,11 +97,11 @@ python "$R/.qoder/scripts/autotest.py" quick --record '{"Q-1":"pass","Q-2":"fail
71
97
  用户明确给了任务名/回归某个任务时走这条。完整流程见 skill。
72
98
 
73
99
  ```bash
74
- python "$R/.qoder/scripts/task.py" list # 确认任务
75
- python "$R/.qoder/scripts/autotest.py" generate <task> # 生成骨架
100
+ python "$R/.qoder/scripts/task/task.py" list # 确认任务
101
+ python "$R/.qoder/scripts/test/autotest.py" generate <task> # 生成骨架
76
102
  # AI 读任务 PRD「验收标准」补全 steps/expected(真实数据用 {{ask:}})
77
- python "$R/.qoder/scripts/autotest.py" run <task> # 注入+出执行计划
78
- python "$R/.qoder/scripts/autotest.py" run <task> --record '{"..":"pass"}' # 回收结果
103
+ python "$R/.qoder/scripts/test/autotest.py" run <task> # 注入+出执行计划
104
+ python "$R/.qoder/scripts/test/autotest.py" run <task> --record '{"..":"pass"}' # 回收结果
79
105
  ```
80
106
 
81
107
  ---
@@ -1,27 +1,43 @@
1
1
  # 角色定义 (与 kg.py ROLE_SECTIONS 的 5 角色对齐)
2
2
  # commands: 该角色建议主用的命令 (软引导, 不拦截 —— 任何角色都能跑任何命令)
3
- # permissions: 声明式权限 (当前未强制执行, 留作未来硬权限墙)
3
+ # permissions: 声明式权限 (遗留字段, 向后兼容)
4
+ #
5
+ # ★ 能力边界 (v3.0+ 解耦核心) ★
6
+ # can_produce: 该角色允许产出的契约类型 (guard.py 强制, 越权则降级)
7
+ # can_consume: 该角色允许读取/消费的能力 (越权则只读降级)
8
+ # 契约类型必须与 contracts/schemas/*.schema.json 的 type 对齐:
9
+ # prd / prototype / spec / design-spec / code / unit-test / test-report / task
4
10
  roles:
5
11
  pm:
6
12
  name: 产品经理
7
13
  permissions: [create_task, write_prd, approve_prd, review_spec]
8
14
  commands: [wl-init, wl-insight, wl-prd-full, wl-prd-quick, wl-prd-review, wl-design, wl-task, wl-search, wl-status, wl-report]
15
+ can_produce: [prd, prototype]
16
+ can_consume: ["*"] # PM 需读代码做现状分析
9
17
  design:
10
18
  name: 设计师
11
19
  permissions: [upload_design, approve_design]
12
20
  commands: [wl-init, wl-design, wl-search, wl-status]
21
+ can_produce: [design-spec, prototype]
22
+ can_consume: [prd, code-search]
13
23
  dev:
14
24
  name: 开发
15
25
  permissions: [write_spec, implement, commit, review_code]
16
26
  commands: [wl-init, wl-spec, wl-code, wl-test, wl-search, wl-commit, wl-status]
27
+ can_produce: [spec, code, unit-test]
28
+ can_consume: [prd, prototype, task]
17
29
  test:
18
30
  name: 测试
19
31
  permissions: [run_test, review_acceptance]
20
32
  commands: [wl-init, wl-test, wl-search, wl-status]
33
+ can_produce: [test-report, test-cases, unit-test]
34
+ can_consume: [prd, task, prototype]
21
35
  admin:
22
36
  name: 管理员
23
37
  permissions: [manage_index, manage_members, all]
24
38
  commands: [wl-init, wl-status, wl-search, wl-report]
39
+ can_produce: ["*"]
40
+ can_consume: ["*"]
25
41
 
26
42
  pipeline:
27
43
  workspace_dir: workspace
@@ -62,17 +62,8 @@ def _recent_hook_errors(hours=24, limit=3):
62
62
  except Exception:
63
63
  return []
64
64
 
65
- # Injected as REAL OUTPUT below (a comment here would never reach the AI)
66
- CRITICAL_RULE = NL.join([
67
- '## CRITICAL RULE',
68
- 'When user asks for /wl-prd-full, ALWAYS ask platform FIRST:',
69
- '"这个需求是针对哪个平台?',
70
- ' 1. Web 管理端 (fywl-ui) - Ant Design Vue + VxeGrid 风格',
71
- ' 2. APP 移动端 (Carmg-H5) - Vant 风格',
72
- ' 3. 两端都要',
73
- ' 请选择 (1/2/3):"',
74
- 'DO NOT skip this question. DO NOT auto-detect. ALWAYS ASK.',
75
- ])
65
+ # v3.0 M4: CRITICAL_RULE (会话开始主动推销工作流铁律 非侵入式改造)
66
+ # 平台询问逻辑保留在 wl-pipeline.md 规则1 (命令启动后才生效, 不在会话开头强推)
76
67
 
77
68
 
78
69
  def load_json_safe(path):
@@ -138,14 +129,14 @@ def get_index_info():
138
129
  recent = errors[-10:] # 取最后 10 行检查
139
130
  if len(recent) >= 3:
140
131
  lines.append('[WARN] hook 最近频繁失败 (%d 条错误), 详情见 .qoder/.runtime/hook-errors.log' % len(recent))
141
- lines.append(' 跑 python .qoder/scripts/init_doctor.py --fix 排查')
132
+ lines.append(' 跑 python .qoder/scripts/setup/init_doctor.py --fix 排查')
142
133
  except OSError:
143
134
  pass
144
135
 
145
136
  lines.append('## Knowledge Graph')
146
137
  lines.append('MCP工具 (QoderWork自动调用): search_code / get_impact / coverage_matrix / get_workflow 等11个')
147
- lines.append(' python .qoder/scripts/search_index.py <keyword> [--platform web|app]')
148
- lines.append(' python .qoder/scripts/context_pack.py <keyword> # 一次打包全部上下文')
138
+ lines.append(' python .qoder/scripts/io/search_index.py <keyword> [--platform web|app]')
139
+ lines.append(' python .qoder/scripts/io/context_pack.py <keyword> # 一次打包全部上下文')
149
140
 
150
141
  # DuckDB 知识图谱状态检查
151
142
  # Read role from .developer file
@@ -192,15 +183,15 @@ def get_index_info():
192
183
  # 管理员/开发: 能构建
193
184
  if code_newer or db_age_hours > 168: # 7天 = 168小时
194
185
  lines.append(' [WARN] 知识图谱过期! 代码有新变更.')
195
- lines.append(' → 管理员请运行: python .qoder/scripts/kg_build.py')
196
- lines.append(' → 完成后: python .qoder/scripts/team_sync.py push (共享给团队)')
186
+ lines.append(' → 管理员请运行: python .qoder/scripts/kg/kg_build.py')
187
+ lines.append(' → 完成后: python .qoder/scripts/io/team_sync.py push (共享给团队)')
197
188
  else:
198
189
  lines.append(' ✓ 知识图谱最新')
199
190
  else:
200
191
  # 非管理员: 只拉取
201
192
  if code_newer or db_age_hours > 168:
202
193
  lines.append(' [WARN] 知识图谱可能过期.')
203
- lines.append(' → 运行: python .qoder/scripts/team_sync.py pull (获取管理员最新构建)')
194
+ lines.append(' → 运行: python .qoder/scripts/io/team_sync.py pull (获取管理员最新构建)')
204
195
  else:
205
196
  lines.append(' ✓ 知识图谱最新')
206
197
 
@@ -220,9 +211,9 @@ def get_index_info():
220
211
  else:
221
212
  lines.append(' [MISSING] kg.duckdb 不存在!')
222
213
  if role in ('admin', 'dev'):
223
- lines.append(' → 运行: python .qoder/scripts/kg_build.py')
214
+ lines.append(' → 运行: python .qoder/scripts/kg/kg_build.py')
224
215
  else:
225
- lines.append(' → 运行: python .qoder/scripts/team_sync.py pull')
216
+ lines.append(' → 运行: python .qoder/scripts/io/team_sync.py pull')
226
217
 
227
218
  return NL.join(lines)
228
219
 
@@ -235,8 +226,8 @@ def get_style_info():
235
226
 
236
227
  lines = []
237
228
  lines.append('## UI Style Index')
238
- lines.append('Style search: python .qoder/scripts/search_index.py --style <table|form|modal>')
239
- lines.append('Field search: python .qoder/scripts/search_index.py --field <name>')
229
+ lines.append('Style search: python .qoder/scripts/io/search_index.py --style <table|form|modal>')
230
+ lines.append('Field search: python .qoder/scripts/io/search_index.py --field <name>')
240
231
 
241
232
  for proj, d in meta.get('projects', {}).items():
242
233
  vue = d.get('vue_files', 0)
@@ -283,7 +274,6 @@ def main():
283
274
  parts.append(' [' + t['status'] + '] ' + t['name'] + ' - ' + t['title'])
284
275
 
285
276
  parts.append('')
286
- parts.append(CRITICAL_RULE)
287
277
 
288
278
  idx_info = get_index_info()
289
279
  if idx_info:
@@ -0,0 +1,4 @@
1
+ dir: cannot access '/s': No such file or directory
2
+ dir: cannot access '/b': No such file or directory
3
+ dir: cannot access '*.py': No such file or directory
4
+ dir: cannot access '*.md': No such file or directory
@@ -34,51 +34,25 @@ test -f .qoder/.developer && echo "已初始化" || echo "未初始化"
34
34
  > "写个需求",但身份没初始化会导致命令静默失败。50 人团队里新成员第一句话
35
35
  > 就撞这个的概率很高,必须在规则层兜住。
36
36
 
37
- ## 规则 0:自然语言 技能 路由表(全端通用)
38
-
39
- 所有 Qoder 产品(IDE 编辑器 / Quest 模式 / QoderWork 桌面端 / CLI)都支持两种触发方式:
40
- 1. **斜杠命令**:输入 `/wl-prd-full` `/wl-search` 等(commands 和 skills 都可用 `/` 触发)
41
- 2. **自然语言**:直接说"写个需求""查一下代码",AI 按下表自动映射到对应 skill
42
-
43
- > 注意:Quest/QoderWork `/` 会同时列出 commands(如 `/wl-prd-full`)和 skills(如 `/prd-generator`)。
44
- > 两者功能等价,优先用 `/wl-*` 命令(更稳定,参数提示更全)。
45
-
46
- | 用户说什么 | 触发的 skill/command |
47
- |------------|---------------------|
48
- | "写个需求""生成PRD""做个原型""新模块""保单这块加个功能" | `/wl-prd-full` prd-generator + prototype-generator |
49
- | "加个字段""加个导出按钮""改下文案""小改动" | `/wl-prd-quick`(快档,零星需求)|
50
- | "查一下""代码在哪""搜保险""考勤的API""字段含义" | `/wl-search` 或 wl-search |
51
- | "建任务""排优先级""这个任务做完了""开始做这个" | `/wl-task` wl-task |
52
- | "项目怎么样""进度""健康度""路线图" | `/wl-status` 或 wl-status |
53
- | "写日报""周报""我这周干了啥""今天做了什么" | `/wl-report` 或 wl-report |
54
- | "调研""竞品""对标""规划""路线图""接下来做什么""发现个机会""探讨需求" | `/wl-insight` 或 wl-insight(探索站:发现/调研/规划)|
55
- | "生成规格""写spec""技术方案" | `/wl-spec` 或 spec-generator |
56
- | "开始写代码""按规格实现""实现这个接口" | `/wl-code` 或 spec-coder |
57
- | "跑测试用例""执行测试任务""回归测试任务" | `/wl-test`(测试工作流)或 wl-test |
58
- | "写单元测试""补单测""生成test" | `/wl-test unit` 或 test-generator |
59
- | "评审PRD""PRD质量怎么样""检查需求文档" | `/wl-prd-review`(评审 PRD 质量)|
60
- | "提交代码""commit""推上去""保存代码" | `/wl-commit` 或 wl-commit |
61
- | "初始化""换开发者""环境检查""我是谁" | `/wl-init` 或 wl-init |
62
- | **"出个原型""画个界面""做个 mockup""改个页面"** | **`/wl-design-draw`(画界面)** |
63
- | **"XX 有哪些页面""XX 操作流程""系统什么风格""改XX影响什么"** | **`/wl-design-scan`(审视现状)** |
64
- | **"录入设计稿""评审原型""检查原型""Figma 稿""蓝湖稿""蓝湖链接""lanhu"** | **`/wl-design-spec`(设计交付,蓝湖链接优先用 `mcp__lanhu__*` 直读)** |
65
- | "测试覆盖""哪些功能有测试""哪些没测试""回归盲区" | `/wl-design-scan` 或 MCP `coverage_matrix()` |
66
- | "这个功能完整吗""XX功能画像" | `/wl-design-scan` 或 MCP `feature_overview(feature='XX')` |
67
- | "改XX会影响什么""改这个接口影响哪些页面" | `/wl-design-scan` 或 MCP `get_impact(endpoint='XX')` |
68
- | "XX函数谁调用了""XX的调用链" | MCP `context_360(symbol='XX')` |
69
-
70
- > 知识图谱 13 个能力(`kg.py`)**全系列通用**:QoderWork 环境 AI 也可直接调
71
- > MCP 工具(`mcp__qoder-knowledge-graph__*`),非 MCP 环境跑 kg.py,数据一致。
72
- > 能力清单见 `/wl-search`。
73
-
74
- **找不到明确匹配时:先问用户意图,不要乱跑**("你是想写 PRD、查代码、还是建任务?")。
37
+ ## 规则 0:触发方式(非侵入式 v3.0 改造)
38
+
39
+ 工作流**只在显式调用时启动**,不主动干预用户的普通对话。
40
+
41
+ **两种触发方式(且仅此两种):**
42
+ 1. **斜杠命令**:输入 `/wl-prd-full` `/wl-search` `/wl-req` 等 → 启动工作流
43
+ 2. **npx**:`npx @hupan56/wlkj init/update` 启动安装/同步
44
+
45
+ **自然语言不触发工作流。** 用户说"写个需求""查下代码"等,AI 正常回答,不自动拉入工作流。
46
+ (工作流启动后的过程内交互 如选平台、确认需求 仍可用自然语言。)
47
+
48
+ > Quest/QoderWork `/` 会列出 commands skills,优先用 `/wl-*` 命令。
49
+ > 命令一览见本文档底部"用户侧命令一览"
50
+
51
+ > 知识图谱能力(`kg.py`)全系列通用:QoderWork MCP,非 MCP kg.py。
52
+
75
53
  注意:用户说"同步/保存产出"通常指 team_sync(push),不是 git commit;
76
54
  用户说"提交/commit 代码"才是 wl-commit。
77
55
 
78
- **🧩 提问润色(可选增强,纯 Qoder IDE/CLI 用,QoderWork 有 MCP 不需要)**:
79
- 非 MCP 环境下,用户输入含业务词时,可先跑 `python .qoder/scripts/enrich_prompt.py "<用户输入>"`
80
- 做 <10ms 的极速关键词扩展,让用户确认后再走实际命令。MCP 环境下跳过(AI 直接调 MCP 工具已含扩展)。
81
-
82
56
  ## 规则 1:PRD/原型需求必须先问平台(问了就停,不许边问边干)
83
57
 
84
58
  用户提出 PRD、原型、需求分析类请求时,第一步永远是问(绝不自动判断):
@@ -99,8 +73,8 @@ test -f .qoder/.developer && echo "已初始化" || echo "未初始化"
99
73
  ## 规则 2:查代码索引优先,索引找不到才准 grep(又快又准的取数顺序)
100
74
 
101
75
  ```bash
102
- python .qoder/scripts/kg.py context <业务关键词> --platform <web|app> [--role pm|design|dev|test] # 一次取全(首选, 秒级)
103
- python .qoder/scripts/search_index.py <关键词> --platform <web|app> # 单项搜索
76
+ python .qoder/scripts/kg/kg.py context <业务关键词> --platform <web|app> [--role pm|design|dev|test] # 一次取全(首选, 秒级)
77
+ python .qoder/scripts/kg/search_index.py <关键词> --platform <web|app> # 单项搜索
104
78
  ```
105
79
  kg.py context(= context_pack)一条命令返回:相关代码文件 + 同类页面示例 + 字段规格 +
106
80
  相关 PRD + 设计 Token + 图标参考 + 模板路径。kg.py 还有 12 个兄弟能力
@@ -154,19 +128,19 @@ PM /wl-prd-full → AI 出初稿 PRD + 原型
154
128
  ## 规则 4:PRD 必须套团队模板 + 过 EVA 门禁
155
129
 
156
130
  - 完整需求用 .qoder/templates/prd-full-template.md,零星需求用 prd-quick-template.md
157
- - 发布前:`python .qoder/scripts/eval_prd.py <prd> [原型]` 必须 PASS (≥80%)
131
+ - 发布前:`python .qoder/scripts/report/eval_prd.py <prd> [原型]` 必须 PASS (≥80%)
158
132
  - 发现确认采用批量方式(一个编号列表一轮确认),不要逐条问
159
133
 
160
134
  ## 规则 5:用户永不接触 git
161
135
 
162
- - 产出保存/发布后自动执行 `python .qoder/scripts/team_sync.py push`
163
- - 拉取团队最新:`python .qoder/scripts/team_sync.py pull`
136
+ - 产出保存/发布后自动执行 `python .qoder/scripts/task/team_sync.py push`
137
+ - 拉取团队最新:`python .qoder/scripts/task/team_sync.py pull`
164
138
  - 出现 SYNC_CONFLICT 由 AI 按提示自行解决,绝不让用户跑 git 命令
165
139
 
166
140
  ## 规则 6:环境问题找 doctor
167
141
 
168
142
  任何"索引不对/搜不到/环境坏了"类问题:
169
- `python .qoder/scripts/init_doctor.py`(加 --fix 自动修复,幂等增量,不会重头构建)
143
+ `python .qoder/scripts/setup/init_doctor.py`(加 --fix 自动修复,幂等增量,不会重头构建)
170
144
 
171
145
  ## 规则 7:Repo Wiki 是补充知识源
172
146
 
@@ -0,0 +1,139 @@
1
+ # .qoder/scripts/ — 引擎脚本目录
2
+
3
+ > 引擎代码, 由 `npx @hupan56/wlkj init/update` 生成, **不进团队 git** (Trellis 化)。
4
+ > 用户不需要直接碰这些文件 — 通过 `/命令` 和 `npx` 间接调用。
5
+
6
+ ## 按职责分类 (命名前缀即分类)
7
+
8
+ ### 🔍 知识图谱 (`kg_*`, 9 个) — 代码/数据库图谱
9
+ | 脚本 | 用途 |
10
+ |------|------|
11
+ | `kg.py` | **统一入口** (search/api/impact/feature), AI 和 /wl-search 都走这里 |
12
+ | `kg_build_db.py` | 全量构建图谱 (管理员, 周五 cron) |
13
+ | `kg_incremental.py` | 增量更新 (只处理 git diff 变更文件) |
14
+ | `kg_duckdb.py` | DuckDB 存储层 (实体/边/工作流) |
15
+ | `kg_mcp_server.py` | KG MCP server (QoderWork 连接) |
16
+ | `kg_build.py` | 构建编排 |
17
+ | `kg_link_db.py` | 数据库图谱链接 |
18
+ | `kg_semantic.py` | 语义分析 |
19
+ | `kg_auto_login.py` | 自动登录 |
20
+ | `kg_test_runner.py` | 图谱测试 |
21
+
22
+ ### 🏗️ 索引构建 (`build_*`, 4 个)
23
+ | 脚本 | 用途 |
24
+ |------|------|
25
+ | `build_style_index.py` | UI 风格索引 (表格/表单/字段映射) |
26
+ | `build_entity_registry.py` | 实体注册 (功能+端点) |
27
+ | `build_relations.py` | 关系边 (click→api, api→controller) |
28
+ | `build_workflows.py` | 业务流程索引 |
29
+
30
+ ### 🩺 诊断检查 (`check_*`, 4 个)
31
+ | 脚本 | 用途 |
32
+ |------|------|
33
+ | `check_mcp.py` | MCP 配置检查 |
34
+ | `check_mcp_launch.py` | MCP 启动诊断 (根治黄色) |
35
+ | `check_carriers.py` | 规则载体检查 (Qoder 全系列兼容) |
36
+ | `check_qoderwork_consistency.py` | QoderWork 一致性 |
37
+
38
+ ### 🔎 代码提取 (`extract_*`, 3 个)
39
+ | 脚本 | 用途 |
40
+ |------|------|
41
+ | `extract_routes.py` | 路由提取 |
42
+ | `extract_routes_tree.py` | 路由树 |
43
+ | `extract_api_params.py` | API 参数提取 |
44
+
45
+ ### 🧪 测试 (`autotest_*`, 3 个)
46
+ | 脚本 | 用途 |
47
+ |------|------|
48
+ | `autotest.py` | 自动测试入口 |
49
+ | `autotest_batch.py` | 批量测试 |
50
+ | `autotest_run.py` | 单次执行 |
51
+
52
+ ### 🚀 初始化与身份 (`init_*`/`setup`/`role`/`identity`)
53
+ | 脚本 | 用途 |
54
+ |------|------|
55
+ | `setup.py` | **一键就绪** (npx init 调的主体) |
56
+ | `init_doctor.py` | 环境体检 + 自愈 + 身份注册 |
57
+ | `install_qoderwork.py` | QoderWork 技能/MCP 安装 |
58
+ | `role.py` | 角色管理 |
59
+ | `repo_root.py` | 仓库根探测 |
60
+
61
+ ### 🔄 同步与任务
62
+ | 脚本 | 用途 |
63
+ |------|------|
64
+ | `team_sync.py` | **团队同步** (pull/push, /wl-task finish 调) |
65
+ | `git_sync.py` | 源码仓库同步 + PRD 归档 |
66
+ | `task.py` | **任务系统** (create/list/start/finish) |
67
+ | `syncgate.py` | 提交前零信任门禁 |
68
+ | `sync_carriers.py` | 规则载体同步 |
69
+
70
+ ### 📊 评测与报告
71
+ | 脚本 | 用途 |
72
+ |------|------|
73
+ | `eval_prd.py` | **PRD 质量门禁** (EVA, >=80% 才发布) |
74
+ | `report.py` | 日报/周报生成 |
75
+ | `status.py` | 项目状态 |
76
+ | `benchmark.py` | 性能基准 |
77
+
78
+ ### 🔧 上下文与搜索
79
+ | 脚本 | 用途 |
80
+ |------|------|
81
+ | `search_index.py` | **代码搜索** (/wl-search) |
82
+ | `context_pack.py` | **一键上下文** (/wl-code, /wl-prd 用) |
83
+ | `enrich_prompt.py` | prompt 增强 |
84
+ | `fill_prototype.py` | 原型填充 |
85
+
86
+ ### 🎨 设计与原型
87
+ | 脚本 | 用途 |
88
+ |------|------|
89
+ | `gen_design_doc.py` | 设计文档生成 |
90
+ | `setup_lanhu.py` | 蓝湖配置 |
91
+ | `lanhu_stdio_wrapper.py` | 蓝湖 MCP wrapper |
92
+
93
+ ### 🔌 MCP 服务 (`*_mcp_server.py`, 4 个)
94
+ | 脚本 | 用途 |
95
+ |------|------|
96
+ | `mcp_launcher.py` | **MCP 统一启动器** (根治黄色) |
97
+ | `kg_mcp_server.py` | 知识图谱 MCP |
98
+ | `mysql_mcp_server.py` | MySQL MCP (只读) |
99
+ | `zentao_mcp_server.py` | 禅道 MCP |
100
+
101
+ ### 📚 学习与知识沉淀
102
+ | 脚本 | 用途 |
103
+ |------|------|
104
+ | `learn.py` | **learning 引擎** (埋点/反馈) |
105
+ | `learn_aggregate.py` | 学习聚合 |
106
+
107
+ ### 🛠️ 其它工具
108
+ | 脚本 | 用途 |
109
+ |------|------|
110
+ | `page_probe.py` | 页面探测 (浏览器测试) |
111
+ | `platform_doctor.py` | 平台体检 |
112
+ | `archive_prd.py` | PRD 归档 |
113
+ | `export.py` | 导出 |
114
+ | `add_session.py` | 会话管理 |
115
+
116
+ ### 📦 `common/` — 共享库 (被上述脚本 import)
117
+ | 模块 | 用途 |
118
+ |------|------|
119
+ | `paths.py` | **路径管理** (PROJECT_ROOT 探测, cwd 优先) |
120
+ | `developer.py` / `identity.py` | 身份 |
121
+ | `filelock.py` | 文件锁 (防并发) |
122
+ | `atomicio.py` | 原子 IO (防损坏) |
123
+ | `search_engine.py` | 搜索引擎 |
124
+ | `graph_traverse.py` | 图谱遍历 |
125
+ | `eval_api.py` | 评测 API |
126
+ | `terms.py` | 术语扩展 |
127
+ | `feishu.py` | 飞书通知 |
128
+ | `pip_install.py` | pip 镜像兜底 |
129
+ | `platform_guard.py` | 平台守卫 |
130
+ | `repowiki.py` | 仓库 Wiki |
131
+ | `utf8.py` | UTF-8 工具 |
132
+
133
+ ## 设计原则
134
+
135
+ 1. **命名即分类**: `kg_*` / `build_*` / `check_*` / `extract_*` / `autotest_*` 前缀 = 隐式分组
136
+ 2. **统一入口**: `kg.py` 是图谱统一入口, `task.py` 是任务统一入口 (不是 60 个并列入口)
137
+ 3. **common/ 共享**: 通用逻辑抽到 common/, 不重复
138
+ 4. **幂等**: 所有脚本可重复跑, 不重头再来 (见 init_doctor 的增量保证)
139
+ 5. **降级不崩**: 缺依赖/缺数据时优雅降级, 绝不 sys.exit 崩溃 (见 mcp_launcher)