@hupan56/wlkj 2.7.12 → 3.1.2

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 (253) hide show
  1. package/bin/cli.js +1435 -1107
  2. package/package.json +29 -29
  3. package/templates/qoder/agents/insight-planning.md +1 -1
  4. package/templates/qoder/agents/insight-research.md +28 -15
  5. package/templates/qoder/commands/optional/wl-insight.md +161 -161
  6. package/templates/qoder/commands/optional/wl-report.md +20 -39
  7. package/templates/qoder/commands/optional/wl-status.md +4 -4
  8. package/templates/qoder/commands/wl-code.md +2 -2
  9. package/templates/qoder/commands/wl-design.md +6 -6
  10. package/templates/qoder/commands/wl-init.md +3 -3
  11. package/templates/qoder/commands/wl-prd.md +26 -13
  12. package/templates/qoder/commands/wl-req.md +43 -0
  13. package/templates/qoder/commands/wl-search.md +78 -47
  14. package/templates/qoder/commands/wl-task.md +343 -40
  15. package/templates/qoder/commands/wl-test.md +43 -17
  16. package/templates/qoder/config.yaml +52 -14
  17. package/templates/qoder/hooks/post-tool-use.py +181 -0
  18. package/templates/qoder/hooks/session-start.py +94 -23
  19. package/templates/qoder/hooks/stop-eval.py +207 -0
  20. package/templates/qoder/hooks/user-prompt-submit.py +139 -0
  21. package/templates/qoder/rules/wl-pipeline.md +85 -49
  22. package/templates/qoder/scripts/README.md +102 -0
  23. package/templates/qoder/scripts/capability/__init__.py +26 -0
  24. package/templates/qoder/scripts/capability/__main__.py +72 -0
  25. package/templates/qoder/scripts/capability/adapters/__init__.py +29 -0
  26. package/templates/qoder/scripts/capability/adapters/cli.py +316 -0
  27. package/templates/qoder/scripts/capability/adapters/mcp.py +334 -0
  28. package/templates/qoder/scripts/capability/adapters/qw.py +271 -0
  29. package/templates/qoder/scripts/capability/caps/__init__.py +27 -0
  30. package/templates/qoder/scripts/capability/caps/context.py +36 -0
  31. package/templates/qoder/scripts/capability/caps/cron.py +50 -0
  32. package/templates/qoder/scripts/capability/caps/identity.py +43 -0
  33. package/templates/qoder/scripts/capability/caps/memory.py +71 -0
  34. package/templates/qoder/scripts/capability/caps/notify.py +41 -0
  35. package/templates/qoder/scripts/capability/caps/present.py +48 -0
  36. package/templates/qoder/scripts/capability/caps/repo.py +31 -0
  37. package/templates/qoder/scripts/capability/caps/sandbox.py +43 -0
  38. package/templates/qoder/scripts/capability/chain.py +92 -0
  39. package/templates/qoder/scripts/capability/memory_chain.py +41 -0
  40. package/templates/qoder/scripts/capability/registry.py +246 -0
  41. package/templates/qoder/scripts/capability/registry_mcp.py +250 -0
  42. package/templates/qoder/scripts/capability/smoke_test.py +211 -0
  43. package/templates/qoder/scripts/capability/smoke_test_report.json +94 -0
  44. package/templates/qoder/scripts/deployment/setup/__init__.py +11 -0
  45. package/templates/qoder/scripts/deployment/setup/carriers.py +669 -0
  46. package/templates/qoder/scripts/deployment/setup/carriers_verify.py +148 -0
  47. package/templates/qoder/scripts/{init_doctor.py → deployment/setup/init_doctor.py} +100 -39
  48. package/templates/qoder/scripts/{install_qoderwork.py → deployment/setup/install_qoderwork.py} +48 -30
  49. package/templates/qoder/scripts/{platform_doctor.py → deployment/setup/platform_doctor.py} +271 -259
  50. package/templates/qoder/scripts/{repo_root.py → deployment/setup/repo_root.py} +9 -2
  51. package/templates/qoder/scripts/{setup.py → deployment/setup/setup.py} +143 -14
  52. package/templates/qoder/scripts/{setup_lanhu.py → deployment/setup/setup_lanhu.py} +979 -963
  53. package/templates/qoder/scripts/domain/design/__init__.py +0 -0
  54. package/templates/qoder/scripts/{fill_prototype.py → domain/design/fill_prototype.py} +17 -5
  55. package/templates/qoder/scripts/{gen_design_doc.py → domain/design/gen_design_doc.py} +406 -394
  56. package/templates/qoder/scripts/domain/kg/__init__.py +11 -0
  57. package/templates/qoder/scripts/domain/kg/build/__init__.py +0 -0
  58. package/templates/qoder/scripts/domain/kg/build/build_entity_registry.py +201 -0
  59. package/templates/qoder/scripts/domain/kg/build/build_relations.py +132 -0
  60. package/templates/qoder/scripts/{build_style_index.py → domain/kg/build/build_style_index.py} +50 -15
  61. package/templates/qoder/scripts/domain/kg/build/build_workflows.py +149 -0
  62. package/templates/qoder/scripts/{kg_build.py → domain/kg/build/kg_build.py} +685 -612
  63. package/templates/qoder/scripts/{kg_build_db.py → domain/kg/build/kg_build_db.py} +338 -327
  64. package/templates/qoder/scripts/{kg_incremental.py → domain/kg/build/kg_incremental.py} +425 -393
  65. package/templates/qoder/scripts/{learn_aggregate.py → domain/kg/build/learn_aggregate.py} +212 -201
  66. package/templates/qoder/scripts/domain/kg/extract/__init__.py +0 -0
  67. package/templates/qoder/scripts/{common → domain/kg/extract}/extract.py +430 -419
  68. package/templates/qoder/scripts/domain/kg/extract/test_extract.py +115 -0
  69. package/templates/qoder/scripts/{common → domain/kg/extract}/ts_extract.py +614 -536
  70. package/templates/qoder/scripts/domain/kg/graph/__init__.py +0 -0
  71. package/templates/qoder/scripts/{kg_link_db.py → domain/kg/graph/kg_link_db.py} +235 -224
  72. package/templates/qoder/scripts/domain/kg/graph/kg_semantic.py +683 -0
  73. package/templates/qoder/scripts/{kg.py → domain/kg/kg.py} +871 -708
  74. package/templates/qoder/scripts/domain/kg/kg_capabilities.py +182 -0
  75. package/templates/qoder/scripts/domain/kg/search/__init__.py +0 -0
  76. package/templates/qoder/scripts/{context_pack.py → domain/kg/search/context_pack.py} +45 -17
  77. package/templates/qoder/scripts/{enrich_prompt.py → domain/kg/search/enrich_prompt.py} +238 -226
  78. package/templates/qoder/scripts/domain/kg/search/prefetch.py +384 -0
  79. package/templates/qoder/scripts/{common → domain/kg/search}/search_engine.py +207 -205
  80. package/templates/qoder/scripts/{search_index.py → domain/kg/search/search_index.py} +210 -88
  81. package/templates/qoder/scripts/domain/kg/server/__init__.py +0 -0
  82. package/templates/qoder/scripts/domain/kg/server/kgd.py +549 -0
  83. package/templates/qoder/scripts/domain/kg/server/perf_bench.py +197 -0
  84. package/templates/qoder/scripts/domain/kg/storage/__init__.py +0 -0
  85. package/templates/qoder/scripts/{kg_duckdb.py → domain/kg/storage/kg_duckdb.py} +70 -45
  86. package/templates/qoder/scripts/domain/learning/__init__.py +0 -0
  87. package/templates/qoder/scripts/{learn.py → domain/learning/learn.py} +157 -146
  88. package/templates/qoder/scripts/domain/report/__init__.py +11 -0
  89. package/templates/qoder/scripts/{add_session.py → domain/report/add_session.py} +256 -244
  90. package/templates/qoder/scripts/{export.py → domain/report/export.py} +72 -4
  91. package/templates/qoder/scripts/{report.py → domain/report/report.py} +292 -281
  92. package/templates/qoder/scripts/domain/report/report_snapshot.py +261 -0
  93. package/templates/qoder/scripts/domain/report/role.py +39 -0
  94. package/templates/qoder/scripts/{status.py → domain/report/status.py} +737 -628
  95. package/templates/qoder/scripts/domain/report/status_snapshot.py +191 -0
  96. package/templates/qoder/scripts/domain/requirement/__init__.py +0 -0
  97. package/templates/qoder/scripts/{archive_prd.py → domain/requirement/archive_prd.py} +389 -377
  98. package/templates/qoder/scripts/domain/requirement/req.py +228 -0
  99. package/templates/qoder/scripts/domain/task/__init__.py +11 -0
  100. package/templates/qoder/scripts/{git_sync.py → domain/task/git_sync.py} +90 -50
  101. package/templates/qoder/scripts/{syncgate.py → domain/task/syncgate.py} +18 -7
  102. package/templates/qoder/scripts/domain/task/task.py +229 -0
  103. package/templates/qoder/scripts/domain/task/task_lifecycle.py +606 -0
  104. package/templates/qoder/scripts/domain/task/task_query.py +162 -0
  105. package/templates/qoder/scripts/domain/task/task_relations.py +425 -0
  106. package/templates/qoder/scripts/{team_sync.py → domain/task/team_sync.py} +101 -23
  107. package/templates/qoder/scripts/domain/task/zentao_sync.py +370 -0
  108. package/templates/qoder/scripts/foundation/__init__.py +0 -0
  109. package/templates/qoder/scripts/foundation/bootstrap.py +145 -0
  110. package/templates/qoder/scripts/foundation/core/__init__.py +0 -0
  111. package/templates/qoder/scripts/foundation/core/cmd_registry.py +112 -0
  112. package/templates/qoder/scripts/foundation/core/config.py +187 -0
  113. package/templates/qoder/scripts/{common → foundation/core}/paths.py +706 -400
  114. package/templates/qoder/scripts/foundation/data/__init__.py +0 -0
  115. package/templates/qoder/scripts/foundation/data/contract.py +317 -0
  116. package/templates/qoder/scripts/{common → foundation/data}/events.py +2 -2
  117. package/templates/qoder/scripts/foundation/data/result.py +223 -0
  118. package/templates/qoder/scripts/{common → foundation/data}/task_utils.py +427 -392
  119. package/templates/qoder/scripts/foundation/identity/__init__.py +0 -0
  120. package/templates/qoder/scripts/foundation/identity/check_publish.py +103 -0
  121. package/templates/qoder/scripts/{common → foundation/identity}/developer.py +239 -238
  122. package/templates/qoder/scripts/foundation/identity/guard.py +159 -0
  123. package/templates/qoder/scripts/{common → foundation/identity}/identity.py +132 -9
  124. package/templates/qoder/scripts/foundation/identity/roles.py +60 -0
  125. package/templates/qoder/scripts/foundation/integrations/__init__.py +0 -0
  126. package/templates/qoder/scripts/{common → foundation/integrations}/active_task.py +30 -15
  127. package/templates/qoder/scripts/{common → foundation/integrations}/feishu.py +11 -10
  128. package/templates/qoder/scripts/{common → foundation/integrations}/terms.py +3 -3
  129. package/templates/qoder/scripts/foundation/integrations/zentao_client.py +220 -0
  130. package/templates/qoder/scripts/foundation/io/__init__.py +0 -0
  131. package/templates/qoder/scripts/{common → foundation/io}/filelock.py +1 -1
  132. package/templates/qoder/scripts/{common → foundation/io}/reqid.py +1 -1
  133. package/templates/qoder/scripts/foundation/protocol/__init__.py +0 -0
  134. package/templates/qoder/scripts/foundation/protocol/duckdb_conn.py +39 -0
  135. package/templates/qoder/scripts/foundation/protocol/mcp_base.py +268 -0
  136. package/templates/qoder/scripts/foundation/utils/__init__.py +0 -0
  137. package/templates/qoder/scripts/{common → foundation/utils}/eval_api.py +12 -1
  138. package/templates/qoder/scripts/{common → foundation/utils}/pip_install.py +23 -6
  139. package/templates/qoder/scripts/{common → foundation/utils}/platform_guard.py +1 -1
  140. package/templates/qoder/scripts/orchestration/__init__.py +0 -0
  141. package/templates/qoder/scripts/orchestration/wlkj.py +185 -0
  142. package/templates/qoder/scripts/protocol/__init__.py +0 -0
  143. package/templates/qoder/scripts/protocol/browser/README.md +207 -0
  144. package/templates/qoder/scripts/protocol/browser/SKILL.md +265 -0
  145. package/templates/qoder/scripts/protocol/browser/config.env +9 -0
  146. package/templates/qoder/scripts/protocol/browser/references/cdp-api.md +110 -0
  147. package/templates/qoder/scripts/protocol/browser/references/migration-2.5.3.md +72 -0
  148. package/templates/qoder/scripts/protocol/browser/references/site-patterns/.gitkeep +0 -0
  149. package/templates/qoder/scripts/protocol/browser/scripts/browser-discovery.mjs +138 -0
  150. package/templates/qoder/scripts/protocol/browser/scripts/cdp-proxy.mjs +672 -0
  151. package/templates/qoder/scripts/protocol/browser/scripts/check-deps.mjs +206 -0
  152. package/templates/qoder/scripts/protocol/browser/scripts/find-url.mjs +253 -0
  153. package/templates/qoder/scripts/protocol/browser/scripts/match-site.mjs +46 -0
  154. package/templates/qoder/scripts/protocol/browser/templates/config.env.template +9 -0
  155. package/templates/qoder/scripts/protocol/mcp/__init__.py +11 -0
  156. package/templates/qoder/scripts/protocol/mcp/kg_mcp_server.py +478 -0
  157. package/templates/qoder/scripts/{lanhu_stdio_wrapper.py → protocol/mcp/lanhu_stdio_wrapper.py} +131 -119
  158. package/templates/qoder/scripts/protocol/mcp/mcp_doctor.py +548 -0
  159. package/templates/qoder/scripts/protocol/mcp/mcp_launcher.py +600 -0
  160. package/templates/qoder/scripts/protocol/mcp/mysql_mcp_server.py +461 -0
  161. package/templates/qoder/scripts/protocol/mcp/zentao_mcp_server.py +1920 -0
  162. package/templates/qoder/scripts/protocol/transports/__init__.py +56 -0
  163. package/templates/qoder/scripts/protocol/transports/base.py +87 -0
  164. package/templates/qoder/scripts/protocol/transports/cli.py +132 -0
  165. package/templates/qoder/scripts/protocol/transports/http.py +141 -0
  166. package/templates/qoder/scripts/protocol/transports/stdio.py +293 -0
  167. package/templates/qoder/scripts/run_weekly_update.bat +27 -18
  168. package/templates/qoder/scripts/run_weekly_update.sh +22 -13
  169. package/templates/qoder/scripts/validation/__init__.py +0 -0
  170. package/templates/qoder/scripts/validation/eval/__init__.py +0 -0
  171. package/templates/qoder/scripts/validation/eval/perf-report-2026-06-24.md +139 -0
  172. package/templates/qoder/scripts/validation/eval/qwork_harness.py +617 -0
  173. package/templates/qoder/scripts/validation/eval/report-commands.md +220 -0
  174. package/templates/qoder/scripts/validation/eval/transcript_timing.py +386 -0
  175. package/templates/qoder/scripts/validation/metrics/__init__.py +0 -0
  176. package/templates/qoder/scripts/{eval_prd.py → validation/metrics/eval_prd.py} +84 -15
  177. package/templates/qoder/scripts/validation/metrics/usability_score.py +750 -0
  178. package/templates/qoder/scripts/validation/test/__init__.py +11 -0
  179. package/templates/qoder/scripts/validation/test/assertion_gen.py +551 -0
  180. package/templates/qoder/scripts/{autotest.py → validation/test/autotest.py} +1234 -1751
  181. package/templates/qoder/scripts/validation/test/autotest_auth.py +109 -0
  182. package/templates/qoder/scripts/{autotest_batch.py → validation/test/autotest_batch.py} +255 -224
  183. package/templates/qoder/scripts/validation/test/autotest_data.py +680 -0
  184. package/templates/qoder/scripts/validation/test/autotest_opencli.py +646 -0
  185. package/templates/qoder/scripts/{autotest_run.py → validation/test/autotest_run.py} +323 -297
  186. package/templates/qoder/scripts/validation/test/autotest_webaccess.py +571 -0
  187. package/templates/qoder/scripts/{benchmark.py → validation/test/benchmark.py} +17 -5
  188. package/templates/qoder/scripts/{kg_auto_login.py → validation/test/kg_auto_login.py} +208 -196
  189. package/templates/qoder/scripts/{kg_test_runner.py → validation/test/kg_test_runner.py} +13 -2
  190. package/templates/qoder/scripts/{page_probe.py → validation/test/page_probe.py} +470 -459
  191. package/templates/qoder/scripts/validation/test/smoke_all_commands.py +170 -0
  192. package/templates/qoder/settings.json +23 -2
  193. package/templates/qoder/skills/design-import/SKILL.md +235 -226
  194. package/templates/qoder/skills/design-review/SKILL.md +91 -82
  195. package/templates/qoder/skills/prd-generator/SKILL.md +38 -24
  196. package/templates/qoder/skills/prd-review/SKILL.md +8 -6
  197. package/templates/qoder/skills/prototype-generator/SKILL.md +296 -247
  198. package/templates/qoder/skills/spec-coder/SKILL.md +24 -15
  199. package/templates/qoder/skills/spec-generator/SKILL.md +24 -12
  200. package/templates/qoder/skills/test-generator/SKILL.md +9 -7
  201. package/templates/qoder/skills/wl-code/SKILL.md +25 -13
  202. package/templates/qoder/skills/wl-commit/SKILL.md +10 -9
  203. package/templates/qoder/skills/wl-design/SKILL.md +7 -5
  204. package/templates/qoder/skills/wl-init/SKILL.md +8 -8
  205. package/templates/qoder/skills/wl-insight/SKILL.md +25 -12
  206. package/templates/qoder/skills/wl-prd-full/SKILL.md +59 -8
  207. package/templates/qoder/skills/wl-prd-quick/SKILL.md +7 -7
  208. package/templates/qoder/skills/wl-prd-review/SKILL.md +18 -6
  209. package/templates/qoder/skills/wl-report/SKILL.md +27 -25
  210. package/templates/qoder/skills/wl-search/SKILL.md +151 -80
  211. package/templates/qoder/skills/wl-spec/SKILL.md +9 -7
  212. package/templates/qoder/skills/wl-status/SKILL.md +50 -18
  213. package/templates/qoder/skills/wl-task/SKILL.md +94 -12
  214. package/templates/qoder/skills/wl-test/SKILL.md +154 -45
  215. package/templates/qoder/templates/prd-full-template.md +7 -0
  216. package/templates/root/AGENTS.md +275 -237
  217. package/templates/root/requirements.txt +3 -0
  218. package/templates/root//344/275/277/347/224/250/350/257/264/346/230/216.md +3 -3
  219. package/templates/root//346/226/260/346/211/213/346/214/207/345/215/227.md +2 -2
  220. package/templates/qoder/hooks/inject-workflow-state.py +0 -169
  221. package/templates/qoder/scripts/__pycache__/check_mcp_launch.cpython-39.pyc +0 -0
  222. package/templates/qoder/scripts/__pycache__/install_qoderwork.cpython-39.pyc +0 -0
  223. package/templates/qoder/scripts/__pycache__/mcp_launcher.cpython-39.pyc +0 -0
  224. package/templates/qoder/scripts/__pycache__/platform_doctor.cpython-39.pyc +0 -0
  225. package/templates/qoder/scripts/check_carriers.py +0 -238
  226. package/templates/qoder/scripts/check_mcp.py +0 -298
  227. package/templates/qoder/scripts/check_mcp_launch.py +0 -183
  228. package/templates/qoder/scripts/check_qoderwork_consistency.py +0 -166
  229. package/templates/qoder/scripts/collect_prds.py +0 -31
  230. package/templates/qoder/scripts/common/mentions.py +0 -134
  231. package/templates/qoder/scripts/common/utf8.py +0 -38
  232. package/templates/qoder/scripts/extract_api_params.py +0 -246
  233. package/templates/qoder/scripts/extract_routes.py +0 -54
  234. package/templates/qoder/scripts/extract_routes_tree.py +0 -78
  235. package/templates/qoder/scripts/handoff.py +0 -22
  236. package/templates/qoder/scripts/init_developer.py +0 -76
  237. package/templates/qoder/scripts/kg_mcp_server.py +0 -801
  238. package/templates/qoder/scripts/kg_semantic.py +0 -150
  239. package/templates/qoder/scripts/mcp_launcher.py +0 -414
  240. package/templates/qoder/scripts/mysql_mcp_server.py +0 -396
  241. package/templates/qoder/scripts/parse_prds.py +0 -33
  242. package/templates/qoder/scripts/role.py +0 -51
  243. package/templates/qoder/scripts/sync_carriers.py +0 -259
  244. package/templates/qoder/scripts/task.py +0 -1261
  245. package/templates/qoder/scripts/workspace_init.py +0 -102
  246. package/templates/qoder/scripts/zentao_mcp_server.py +0 -424
  247. package/templates/qoder/skills/prompt-enrich/SKILL.md +0 -90
  248. /package/templates/qoder/scripts/{common → deployment}/__init__.py +0 -0
  249. /package/templates/qoder/{skills/prototype-generator/SKILL.md.zcode-79180-2af4721f-f9a6-412c-88db-c0af680d211b.tmp → scripts/domain/__init__.py} +0 -0
  250. /package/templates/qoder/scripts/{common → domain/kg/graph}/graph_traverse.py +0 -0
  251. /package/templates/qoder/scripts/{common → domain/kg/server}/repowiki.py +0 -0
  252. /package/templates/qoder/scripts/{common → foundation/io}/atomicio.py +0 -0
  253. /package/templates/qoder/scripts/{secure-ls.js → validation/test/secure-ls.js} +0 -0
@@ -1,226 +1,235 @@
1
- ---
2
- name: design-import
3
- description: "把设计师的 Figma/Axure 设计稿录入工作流,生成设计规范 spec.json 并存入知识图谱。Import designer's Figma/Axure design into the pipeline as a style spec. 用户说'录入设计稿''Figma稿录入''把这个设计录入'时触发。"
4
- trigger: "user says '录入设计稿', 'Figma 稿录入', '把这个设计录入', or wants to feed their design into the AI workflow"
5
- ---
6
-
7
-
8
- ## 🔧 仓库根定位(QoderWork 桌面端 vs Qoder IDE/CLI)
9
-
10
- **后续脚本里的 `$R` 代表仓库根**,先确定它(QoderWork 桌面端工作目录不是仓库根,相对路径会失效):
11
- ```bash
12
- R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
13
- ```
14
- > `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python .qoder/scripts/install_qoderwork.py`。
15
-
16
- # Design Import Skill(设计师专用)
17
-
18
- > 🚫 **边界铁律:蓝湖工具(`mcp__lanhu__*`)只能在本 skill(即 `/wl-design-spec 录入`)内部调用。**
19
- > 用户直接说"查蓝湖""读一下这个蓝湖链接"而没走录入命令时,**不要裸调蓝湖**——先确认意图,
20
- > 引导到 `/wl-design-spec 录入 <蓝湖链接>`。工作流是非侵入式的,所有能力必须经命令/工序站触发,
21
- > 不能脱离流程裸调工具(否则不可控、不可审计)。
22
-
23
- 把设计师在 Figma/Axure 里出的设计稿,转成工作流能消化的**设计规范 spec.json**,
24
- 存到 `data/style/`,进入知识图谱。从此同需求的 AI 原型优先锚定这份 spec,
25
- 不再跟设计师的稿打架。
26
-
27
- ## ⚙️ 自取上下文(QoderWork 无 hook 注入,必须自读)
28
-
29
- - `.qoder/.developer` 当前设计师名(产出归属)
30
- - `.qoder/.current-task` — 若存在,spec 命名带上任务关键词
31
- - 平台必须明确(Web/APP/Both);如未指定,先问
32
-
33
- **已录入清单**(设计师问"我录过哪些"时):
34
- ```bash
35
- ls "$R/data/style/"*-design-spec.json 2>/dev/null # 列所有 spec
36
- ```
37
- 对每个文件读 `requirement`/`platform`/`source` 字段汇总给设计师,让他知道哪些录过、哪端录了。
38
-
39
- ## Step 0: 确认平台
40
-
41
- 跟 /wl-prd-full 一样,先问:Web 管理端 / APP 移动端 / 两端都要?
42
- **问了就停,等设计师回答。**
43
-
44
- ## Step 1: 收集设计信息
45
-
46
- 设计师用以下任一方式提供设计信息(按精度从高到低排):
47
-
48
- **方式 A(最推荐):蓝湖链接直读**
49
-
50
- 设计师发蓝湖链接(`https://lanhuapp.com/web/#/item/...`),AI 用蓝湖 MCP 精确提取颜色/尺寸/字体/切图,比截图口述精确 10 倍。**走以下 4 步,每步失败就降级到方式 B(绝不报错、绝不阻塞):**
51
-
52
- **A-1. 探测蓝湖可用性(失败就静默降级)**
53
- ```
54
- 调 mcp__lanhu__get_designs(url=<链接>)
55
- ```
56
- - 返回设计图列表 → 继续 A-2
57
- - 报"连接失败"/工具不存在/418(cookie 失效)→ **立刻降级**:告诉用户"蓝湖没起/cookie 失效,改用截图口述",然后走方式 B,**不许卡住**
58
-
59
- > 蓝湖是增强不是必需。没有蓝湖,工作流照样完整跑(方式 B/C/D 都不依赖蓝湖)。
60
-
61
- **A-2. 选设计图(图多时帮用户缩小范围)**
62
- ```
63
- mcp__lanhu__get_designs(url=<链接>) → 返回 {designs:[{name, width, height, ...}], sectors:[...], total_designs}
64
- ```
65
- - **图少(≤15 张)**:直接列全部图名,问"录入哪张?"(**问了就停**)
66
- - **图多(>15 张)**:别一次倒几百张,先帮缩小:
67
- 1. 若有 `sectors`(分组):先列分组名+图数,问"哪个分组?",再列该组图
68
- 2. 没分组:问设计师"你要录的功能叫什么?",按图名关键词过滤后列
69
- 3. 过滤掉明显占位名(如重复的"命名"),只列有意义的
70
- - 选定后记下图名,进 A-3。**可一次选多张**(`design_names` 支持数组)。
71
-
72
- **A-3. 读标注 + 切图**
73
- ```
74
- mcp__lanhu__get_ai_analyze_design_result(url=<链接>, design_names=[<选中的图名>])
75
- 返回: HTML/CSS 标注 (rgba 值、width、padding、font...) + 还原指引
76
- mcp__lanhu__get_design_slices(url=<链接>, design_name=<图名>, include_metadata=true)
77
- 返回: {slices:[{name, size, download_url, svg_url, scale_urls:{1x,2x,3x}}]}
78
- ```
79
- - CSS 标注 → 填 `design_tokens`/`layout`/`components`
80
- - **切图**:每个 slice 的 `svg_url` 是设计师切的**真实图标矢量**。挑出图标类(size 小、name 含"图标/icon/箭头"等),
81
- 填进 spec.json `icons` 字段(见 Step 2)。这是原型图标的最佳真源(优于 ref-icon.json 通用图标)。
82
- 返回的 CSS 标注是**设计稿的权威真值**,优先级高于代码风格、高于 PDF 规范。
83
-
84
- **A-4. AI 语义映射进 spec.json(关键:落到实处)**
85
- 蓝湖返回的是一堆 CSS 属性,AI 读懂后**语义判断**填进 spec.json 各字段:
86
-
87
- | 蓝湖返回 | 填进 spec.json 哪里 | 怎么判断 |
88
- |---------|-------------------|---------|
89
- | 出现最多的背景色/按钮色 (如 `rgba(255,115,10,1)`) | `design_tokens["--primary-color"]` | 统计频率,按钮/导航反复用的色 = 主色 |
90
- | 容器 width (如 `200px`) | `design_tokens["--sidebar-width"]` | web 端左侧固定宽容器 = 侧边栏 |
91
- | 行高 padding font-size | `design_tokens["--table-row-height"]` 等 | 表格行的 height |
92
- | 布局结构 | `layout.description` / `layout.sidebar` | 看是左+右(web) 还是单列(app) |
93
- | 卡片/表格/表单/按钮组 | `components[]` | 按视觉块列 |
94
-
95
- **铁律:CSS 值原样填,禁止改格式。** `rgba(255,115,10,1)` 不要写成 `#FF730A`,`200px` 不要四舍五入。蓝湖给什么就填什么(这是设计稿的真值,AI 改了就不准了)。
96
-
97
- > 蓝湖 MCP 是 STDIO 模式:开 QoderWork 自动起、关自动停,**无需手动 start**。
98
- > cookie 按角色隔离在 `workspace/members/{当前用户}/.secrets/lanhu.env`(不进 git)——
99
- > wrapper(lanhu_stdio_wrapper.py)读当前 `.developer` 角色的 cookie 拉起服务,UI 角色有改稿权限、PM/开发只读。
100
- > 没配的话跑 `python "$R/.qoder/scripts/setup_lanhu.py"`;换角色改 `.developer` + 配新角色 cookie 后重启 QoderWork。
101
-
102
- **方式 B:截图 + 口述**
103
- 设计师发一张 Figma/Axure 截图,口述关键设计决策:
104
- - "主色用 #1677ff,背景用 #f5f5f5"
105
- - "侧边栏宽 200px,一级菜单点击展开二级"
106
- - "表格行高 48px,斑马纹"
107
-
108
- **方式 C:导出标注**
109
- 设计师从 Figma 导出 CSS / 标注 PDF / tokens JSON,AI 直接读。
110
-
111
- **方式 D:参照现有系统页面改**
112
- 设计师说"类似 XX 页面,但侧边栏改成手风琴式"——AI 读那个页面代码,提取基础 spec,再叠加设计师的改动。
113
-
114
- ## Step 2: 生成 spec.json
115
-
116
- 把设计信息结构化成 spec.json,格式对齐 `data/index/vben-style-reference.json`:
117
-
118
- ```json
119
- {
120
- "source": "Figma (设计师: {designer})",
121
- "imported_at": "2026-06-16",
122
- "platform": "web",
123
- "requirement": "{需求名}",
124
- "design_tokens": {
125
- "--primary-color": "#1677ff",
126
- "--bg-color": "#f5f5f5",
127
- "--sidebar-width": "200px",
128
- "--table-row-height": "48px"
129
- },
130
- "layout": {
131
- "description": "左侧侧边栏 + 右侧内容区;一级菜单点击展开二级手风琴",
132
- "sidebar": "width: 200px, collapsible, accordion mode",
133
- "content": "padding: 16px, background: #f5f5f5"
134
- },
135
- "components": [
136
- {"name": "侧边栏菜单", "spec": "三级折叠,一级固定,二级手风琴展开"},
137
- {"name": "数据表格", "spec": "VxeGrid 风格,行高 48px,斑马纹"}
138
- ],
139
- "notes": "设计师强调:侧边栏必须有图标,不能用纯文字",
140
- "icons": [
141
- {"name": "返回箭头", "svg_url": "https://lanhu-oss-.../xxx.svg", "size": "7x14", "usage": "顶部返回按钮"},
142
- {"name": "提交图标", "svg_url": "https://lanhu-oss-.../yyy.svg", "size": "20x20", "usage": "提交按钮"}
143
- ],
144
- "lanhu_source": {
145
- "url": "https://lanhuapp.com/web/#/item/project/stage?pid=...",
146
- "image_names": ["问题反馈-详情"],
147
- "slice_count": 12,
148
- "imported_at": "2026-06-18"
149
- }
150
- }
151
- ```
152
-
153
- > ⚠️ **`requirement` 字段是落地关键**:fill_prototype.py 靠它匹配关键词
154
- > (`load_design_spec` 扫描 `data/style/*-design-spec.json`,`requirement` 包含查询词就命中)。
155
- > 所以 `requirement` 必须跟未来 `/wl-design-draw` 的关键词一致(如"问题反馈""营业外合同")。
156
- > 蓝湖来源时填 `source: "蓝湖直读 (设计师: XX)"`,截图口述填 `source: "Figma (设计师: XX)"`,
157
- > 下游 fill_prototype 不管来源只认值。
158
- > **`lanhu_source` 可选**:仅蓝湖来源时填,记录链接/图名/切图数,可追溯设计稿出处。
159
-
160
- ## Step 3: 存储到知识图谱
161
-
162
- - 存到 `data/style/{需求名}-{平台}-design-spec.json`(平台 = web/app,避免同功能多端冲突)
163
- - 例:`待办-web-design-spec.json`、`待办-app-design-spec.json`
164
- - 同需求同平台重新录入 覆盖(更新);不同平台 各自独立文件
165
- - **优先级声明**:这份 spec 的优先级 > 代码风格 > PDF 规范
166
- (因为它是最新、最明确的设计决策)
167
- - **`requirement` 字段填法**(解决"设计师不知道 PM 搜什么词"):
168
- 用**功能名 + 同义词**,别只填图名。如图名"设置-我的待办",requirement 填 `"待办 我的待办 设置待办"`
169
- (空格分隔多个可能的关键词),这样 PM 搜"待办"或"我的待办"都能命中。
170
-
171
- > 🎯 **落地链路(已验证通)**:spec.json 落盘后,下次 `/wl-design-draw <同关键词>` 时,
172
- > `fill_prototype.py` 的 `load_design_spec()` 会自动命中这份 spec(靠 `requirement` 字段匹配),
173
- > `design_tokens` **原样注入**原型 HTML 的 `:root` CSS(最高优先级,覆盖模板默认色)。
174
- > 即:蓝湖读到的 `rgba(255,115,10,1)` 会真实出现在原型里,不是 AI 看一眼就忘。
175
- > 验证方法:看输出原型 `:root` 里有没有 `/* design-import spec tokens (优先级最高) */` 注释及下面的值。
176
-
177
- ## Step 3.5: 录入埋点
178
-
179
- spec.json 落盘后埋点,供 /wl-status 统计设计录入活跃度:
180
- ```bash
181
- python "$R/.qoder/scripts/learn.py" record design_import "{\"requirement\": \"<需求名>\", \"platform\": \"<web|app>\", \"source\": \"<蓝湖|截图|导出>\"}"
182
- ```
183
- > 失败静默忽略。
184
-
185
- ## Step 4: 确认与通知
186
- 输出给设计师:
187
- ```
188
- 设计规范已录入: data/style/{需求名}-design-spec.json
189
- - 平台: Web 管理端
190
- - 来源: 蓝湖直读 (设计师: XX) ← 截图口述
191
- - 主色: rgba(255,115,10,1)
192
- - 布局: 左侧边栏 200px + 手风琴二级菜单
193
- - 组件: 侧边栏菜单、数据表格
194
-
195
- ✅ 已自动接入原型链路:下次 PM/任何人用同一关键词出原型时,
196
- fill_prototype.py 会自动发现并优先用这份 spec(优先级高于代码风格),
197
- 主色/侧边栏宽度/布局全部按你的设计来(design_tokens 注入原型 :root)。
198
-
199
-
200
- 设计师可以随时说"录入设计稿"更新它。
201
- ```
202
-
203
- ## 铁律
204
-
205
- - **有蓝湖 MCP 时优先用它直读**:设计师发蓝湖链接,AI 调 `mcp__lanhu__*` 提取精确参数,
206
- 不要让设计师截图口述(截图口述是蓝湖不可用时的降级方案)
207
- - **绝不编造 token**:设计师没说的值,留空或标"待确认",不要自己猜
208
- - **图标必须来自真源**:即使设计师用了 emoji 示意,录入时也要替换成系统真源
209
- (Web: data/index/ref-icon.json 的 Ant Design SVG)
210
- - **spec 一旦录入,同需求 prototype 必须锚定它**:AI 出原型前先查 data/style/ 有没有 spec
211
-
212
- ## 🆕 录入前可参考知识图谱新数据
213
-
214
- 设计师录入 spec 前,可以先问 AI 系统现状,让 spec 更贴合系统:
215
-
216
- - **"这个功能模块现在有哪些页面?"** → AI 调 `mcp__qoder-knowledge-graph__feature_overview(feature='资产管理')`
217
- 返回该模块所有页面 + API + 按钮,设计师知道改哪些、加哪些
218
- - **"这个模块的业务流程是什么?"** AI 调 `mcp__qoder-knowledge-graph__get_workflow(module='资产')`
219
- 返回操作链(查询→新增→审批→...),spec 里的交互流程跟系统一致
220
- - **"系统里这个模块的按钮都叫什么?"** → 看 DESIGN.md 的 "Real Button Texts" 段
221
- entity-registry.json,spec 里的按钮文案跟系统统一
222
- - **"这个模块用的是什么布局模式?"** → 看 DESIGN.md 的 layout_fingerprint
223
- spec 里的侧边栏宽度/布局模式跟系统一致(如 160px / mixed-nav)
224
-
225
- > 这些数据让设计师的 spec 不是"凭空设计",而是"基于系统现状的增量改进"——
226
- > 录入的 spec 天然就跟系统风格一致,AI 出原型时不会打架。
1
+ ---
2
+ name: design-import
3
+ description: "把设计师的 Figma/Axure 设计稿录入工作流,生成设计规范 spec.json 并存入知识图谱。Import designer's Figma/Axure design into the pipeline as a style spec. "
4
+ trigger: "user invokes /wl-* command explicitly"
5
+ ---
6
+
7
+
8
+ ## 🔧 仓库根定位(QoderWork 桌面端 vs Qoder IDE/CLI)
9
+
10
+ **后续脚本里的 `$R` 代表仓库根**,先确定它(QoderWork 桌面端工作目录不是仓库根,相对路径会失效):
11
+ ```bash
12
+ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
13
+ ```
14
+ > `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
15
+
16
+ # Design Import Skill(设计师专用)
17
+
18
+ > 🚫 **边界铁律:蓝湖工具(`MCP 工具 (`)只能在本 skill(即 `/wl-design 预览`)内部调用。**
19
+ > 用户直接说"查蓝湖""读一下这个蓝湖链接"而没走录入命令时,**不要裸调蓝湖**——先确认意图,
20
+ > 引导到 `/wl-design 预览 <蓝湖链接>`。工作流是非侵入式的,所有能力必须经命令/工序站触发,
21
+ > 不能脱离流程裸调工具(否则不可控、不可审计)。
22
+
23
+ 把设计师在 Figma/Axure 里出的设计稿,转成工作流能消化的**设计规范 spec.json**,
24
+ 存到 `data/style/`,进入知识图谱。从此同需求的 AI 原型优先锚定这份 spec,
25
+ 不再跟设计师的稿打架。
26
+
27
+ ## 🔌 MCP 工具可用性(双轨)
28
+
29
+ skill 用到的知识图谱 MCP 工具(`MCP 工具 (` / `MCP 工具 (`)**自动路由(有 MCP 走 MCP,无 MCP 走 CLI)**。
30
+
31
+ - **QoderWork**:直接调 MCP 工具(更快更准);Step 3 存储到知识图谱也走 MCP。
32
+ - **Qoder IDE/Quest/CLI(无 MCP)**:用 `python "$R/.qoder/scripts/orchestration/wlkj.py" search` 降级查样式;存储到知识图谱步骤跳过(spec.json 照常生成,本地可用)。
33
+
34
+ ## ⚙️ 自取上下文(QoderWork 无 hook 注入,必须自读)
35
+
36
+ - **当前身份**:当前设计师名(产出归属)。读法:先 `R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.` 定位仓库根,
37
+ `python "$R/.qoder/scripts/foundation/core/paths.py" whoami`(输出开发者名;空=未初始化)。
38
+ ⚠️ 勿用裸相对路径 `.qoder/.developer`(QoderWork 桌面端 cwd 不在仓库根,会读不到而误报未初始化)。
39
+ - **活动任务**:若存在,spec 命名带上任务关键词。读法 `python "$R/.qoder/scripts/foundation/core/paths.py" current-task`(输出任务路径;空=无活动任务)。
40
+ - 平台必须明确(Web/APP/Both);如未指定,先问
41
+
42
+ **已录入清单**(设计师问"我录过哪些"时):
43
+ ```bash
44
+ ls "$R/data/style/"*-design-spec.json 2>/dev/null # 列所有 spec
45
+ ```
46
+ 对每个文件读 `requirement`/`platform`/`source` 字段汇总给设计师,让他知道哪些录过、哪端录了。
47
+
48
+ ## Step 0: 确认平台
49
+
50
+ /wl-prd-full 一样,先问:Web 管理端 / APP 移动端 / 两端都要?
51
+ **问了就停,等设计师回答。**
52
+
53
+ ## Step 1: 收集设计信息
54
+
55
+ 设计师用以下任一方式提供设计信息(按精度从高到低排):
56
+
57
+ **方式 A(最推荐):蓝湖链接直读**
58
+
59
+ 设计师发蓝湖链接(`https://lanhuapp.com/web/#/item/...`),AI 用蓝湖 MCP 精确提取颜色/尺寸/字体/切图,比截图口述精确 10 倍。**走以下 4 步,每步失败就降级到方式 B(绝不报错、绝不阻塞):**
60
+
61
+ **A-1. 探测蓝湖可用性(失败就静默降级)**
62
+ ```
63
+ cap.mcp.call("get_designs", {"url": "<链接>"})
64
+ ```
65
+ - 返回设计图列表 → 继续 A-2
66
+ - 报"连接失败"/工具不存在/418(cookie 失效)→ **立刻降级**:告诉用户"蓝湖没起/cookie 失效,改用截图口述",然后走方式 B,**不许卡住**
67
+
68
+ > 蓝湖是增强不是必需。没有蓝湖,工作流照样完整跑(方式 B/C/D 都不依赖蓝湖)。
69
+
70
+ **A-2. 选设计图(图多时帮用户缩小范围)**
71
+ ```
72
+ 调 cap.mcp.call("get_designs", {"url": "<链接>"}) → 返回 {designs:[{name, width, height, ...}], sectors:[...], total_designs}
73
+ ```
74
+ - **图少(≤15 张)**:直接列全部图名,问"录入哪张?"(**问了就停**)
75
+ - **图多(>15 张)**:别一次倒几百张,先帮缩小:
76
+ 1. 若有 `sectors`(分组):先列分组名+图数,问"哪个分组?",再列该组图
77
+ 2. 没分组:问设计师"你要录的功能叫什么?",按图名关键词过滤后列
78
+ 3. 过滤掉明显占位名(如重复的"命名"),只列有意义的
79
+ - 选定后记下图名,进 A-3。**可一次选多张**(`design_names` 支持数组)。
80
+
81
+ **A-3. 读标注 + 切图**
82
+ ```
83
+ 调 cap.mcp.call("get_ai_analyze_design_result", {"url": "<链接>", "design_names": "[<选中的图名>]"})
84
+ 返回: HTML/CSS 标注 (rgba 值、width、padding、font...) + 还原指引
85
+ cap.mcp.call("get_design_slices", {"url": "<链接>", "design_name": "<图名>", "include_metadata": "true"})
86
+ → 返回: {slices:[{name, size, download_url, svg_url, scale_urls:{1x,2x,3x}}]}
87
+ ```
88
+ - CSS 标注 → 填 `design_tokens`/`layout`/`components`
89
+ - **切图**:每个 slice `svg_url` 是设计师切的**真实图标矢量**。挑出图标类(size 小、name 含"图标/icon/箭头"等),
90
+ 填进 spec.json `icons` 字段(见 Step 2)。这是原型图标的最佳真源(优于 ref-icon.json 通用图标)。
91
+ 返回的 CSS 标注是**设计稿的权威真值**,优先级高于代码风格、高于 PDF 规范。
92
+
93
+ **A-4. AI 语义映射进 spec.json(关键:落到实处)**
94
+ 蓝湖返回的是一堆 CSS 属性,AI 读懂后**语义判断**填进 spec.json 各字段:
95
+
96
+ | 蓝湖返回 | 填进 spec.json 哪里 | 怎么判断 |
97
+ |---------|-------------------|---------|
98
+ | 出现最多的背景色/按钮色 (如 `rgba(255,115,10,1)`) | `design_tokens["--primary-color"]` | 统计频率,按钮/导航反复用的色 = 主色 |
99
+ | 容器 width (如 `200px`) | `design_tokens["--sidebar-width"]` | web 端左侧固定宽容器 = 侧边栏 |
100
+ | 行高 padding font-size | `design_tokens["--table-row-height"]` | 表格行的 height |
101
+ | 布局结构 | `layout.description` / `layout.sidebar` | 看是左+右(web) 还是单列(app) |
102
+ | 卡片/表格/表单/按钮组 | `components[]` | 按视觉块列 |
103
+
104
+ **铁律:CSS 值原样填,禁止改格式。** `rgba(255,115,10,1)` 不要写成 `#FF730A`,`200px` 不要四舍五入。蓝湖给什么就填什么(这是设计稿的真值,AI 改了就不准了)。
105
+
106
+ > 蓝湖 MCP 是 STDIO 模式:开 QoderWork 自动起、关自动停,**无需手动 start**。
107
+ > cookie 按角色隔离在 `workspace/members/{当前用户}/.secrets/lanhu.env`(不进 git)——
108
+ > wrapper(lanhu_stdio_wrapper.py)读当前 `.developer` 角色的 cookie 拉起服务,UI 角色有改稿权限、PM/开发只读。
109
+ > 没配的话跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" setup-lanhu`;换角色改 `.developer` + 配新角色 cookie 后重启 QoderWork。
110
+
111
+ **方式 B:截图 + 口述**
112
+ 设计师发一张 Figma/Axure 截图,口述关键设计决策:
113
+ - "主色用 #1677ff,背景用 #f5f5f5"
114
+ - "侧边栏宽 200px,一级菜单点击展开二级"
115
+ - "表格行高 48px,斑马纹"
116
+
117
+ **方式 C:导出标注**
118
+ 设计师从 Figma 导出 CSS / 标注 PDF / tokens JSON,AI 直接读。
119
+
120
+ **方式 D:参照现有系统页面改**
121
+ 设计师说"类似 XX 页面,但侧边栏改成手风琴式"——AI 读那个页面代码,提取基础 spec,再叠加设计师的改动。
122
+
123
+ ## Step 2: 生成 spec.json
124
+
125
+ 把设计信息结构化成 spec.json,格式对齐 `data/index/vben-style-reference.json`:
126
+
127
+ ```json
128
+ {
129
+ "source": "Figma (设计师: {designer})",
130
+ "imported_at": "2026-06-16",
131
+ "platform": "web",
132
+ "requirement": "{需求名}",
133
+ "design_tokens": {
134
+ "--primary-color": "#1677ff",
135
+ "--bg-color": "#f5f5f5",
136
+ "--sidebar-width": "200px",
137
+ "--table-row-height": "48px"
138
+ },
139
+ "layout": {
140
+ "description": "左侧侧边栏 + 右侧内容区;一级菜单点击展开二级手风琴",
141
+ "sidebar": "width: 200px, collapsible, accordion mode",
142
+ "content": "padding: 16px, background: #f5f5f5"
143
+ },
144
+ "components": [
145
+ {"name": "侧边栏菜单", "spec": "三级折叠,一级固定,二级手风琴展开"},
146
+ {"name": "数据表格", "spec": "VxeGrid 风格,行高 48px,斑马纹"}
147
+ ],
148
+ "notes": "设计师强调:侧边栏必须有图标,不能用纯文字",
149
+ "icons": [
150
+ {"name": "返回箭头", "svg_url": "https://lanhu-oss-.../xxx.svg", "size": "7x14", "usage": "顶部返回按钮"},
151
+ {"name": "提交图标", "svg_url": "https://lanhu-oss-.../yyy.svg", "size": "20x20", "usage": "提交按钮"}
152
+ ],
153
+ "lanhu_source": {
154
+ "url": "https://lanhuapp.com/web/#/item/project/stage?pid=...",
155
+ "image_names": ["问题反馈-详情"],
156
+ "slice_count": 12,
157
+ "imported_at": "2026-06-18"
158
+ }
159
+ }
160
+ ```
161
+
162
+ > ⚠️ **`requirement` 字段是落地关键**:fill_prototype.py 靠它匹配关键词
163
+ > (`load_design_spec` 扫描 `data/style/*-design-spec.json`,`requirement` 包含查询词就命中)。
164
+ > 所以 `requirement` 必须跟未来 `/wl-design 预览` 的关键词一致(如"问题反馈""营业外合同")。
165
+ > 蓝湖来源时填 `source: "蓝湖直读 (设计师: XX)"`,截图口述填 `source: "Figma (设计师: XX)"`,
166
+ > 下游 fill_prototype 不管来源只认值。
167
+ > **`lanhu_source` 可选**:仅蓝湖来源时填,记录链接/图名/切图数,可追溯设计稿出处。
168
+
169
+ ## Step 3: 存储到知识图谱
170
+
171
+ - 存到 `data/style/{需求名}-{平台}-design-spec.json`(平台 = web/app,避免同功能多端冲突)
172
+ - 例:`待办-web-design-spec.json`、`待办-app-design-spec.json`
173
+ - 同需求同平台重新录入 覆盖(更新);不同平台 各自独立文件
174
+ - **优先级声明**:这份 spec 的优先级 > 代码风格 > PDF 规范
175
+ (因为它是最新、最明确的设计决策)
176
+ - **`requirement` 字段填法**(解决"设计师不知道 PM 搜什么词"):
177
+ 用**功能名 + 同义词**,别只填图名。如图名"设置-我的待办",requirement 填 `"待办 我的待办 设置待办"`
178
+ (空格分隔多个可能的关键词),这样 PM 搜"待办"或"我的待办"都能命中。
179
+
180
+ > 🎯 **落地链路(已验证通)**:spec.json 落盘后,下次 `/wl-design 预览 <同关键词>` 时,
181
+ > `fill_prototype.py` `load_design_spec()` 会自动命中这份 spec(靠 `requirement` 字段匹配),
182
+ > 把 `design_tokens` **原样注入**原型 HTML 的 `:root` CSS(最高优先级,覆盖模板默认色)。
183
+ > 即:蓝湖读到的 `rgba(255,115,10,1)` 会真实出现在原型里,不是 AI 看一眼就忘。
184
+ > 验证方法:看输出原型 `:root` 里有没有 `/* design-import spec tokens (优先级最高) */` 注释及下面的值。
185
+
186
+ ## Step 3.5: 录入埋点
187
+
188
+ spec.json 落盘后埋点,供 /wl-status 统计设计录入活跃度:
189
+ ```bash
190
+ python "$R/.qoder/scripts/orchestration/wlkj.py" learn record design_import "{\"requirement\": \"<需求名>\", \"platform\": \"<web|app>\", \"source\": \"<蓝湖|截图|导出>\"}"
191
+ ```
192
+ > 失败静默忽略。
193
+
194
+ ## Step 4: 确认与通知
195
+ 输出给设计师:
196
+ ```
197
+ 设计规范已录入: data/style/{需求名}-design-spec.json
198
+ - 平台: Web 管理端
199
+ - 来源: 蓝湖直读 (设计师: XX) ← 或 截图口述
200
+ - 主色: rgba(255,115,10,1)
201
+ - 布局: 左侧边栏 200px + 手风琴二级菜单
202
+ - 组件: 侧边栏菜单、数据表格
203
+
204
+ ✅ 已自动接入原型链路:下次 PM/任何人用同一关键词出原型时,
205
+ fill_prototype.py 会自动发现并优先用这份 spec(优先级高于代码风格),
206
+ 主色/侧边栏宽度/布局全部按你的设计来(design_tokens 注入原型 :root)。
207
+
208
+
209
+ 设计师可以随时说"录入设计稿"更新它。
210
+ ```
211
+
212
+ ## 铁律
213
+
214
+ - **有蓝湖 MCP 时优先用它直读**:设计师发蓝湖链接,AI `MCP 工具 (` 提取精确参数,
215
+ 不要让设计师截图口述(截图口述是蓝湖不可用时的降级方案)
216
+ - **绝不编造 token**:设计师没说的值,留空或标"待确认",不要自己猜
217
+ - **图标必须来自真源**:即使设计师用了 emoji 示意,录入时也要替换成系统真源
218
+ (Web: data/index/ref-icon.json Ant Design SVG)
219
+ - **spec 一旦录入,同需求 prototype 必须锚定它**:AI 出原型前先查 data/style/ 有没有 spec
220
+
221
+ ## 🆕 录入前可参考知识图谱新数据
222
+
223
+ 设计师录入 spec 前,可以先问 AI 系统现状,让 spec 更贴合系统:
224
+
225
+ - **"这个功能模块现在有哪些页面?"** AI 调 `cap.mcp.call("feature_overview", {"feature": "资产管理"})`
226
+ 返回该模块所有页面 + API + 按钮,设计师知道改哪些、加哪些
227
+ - **"这个模块的业务流程是什么?"** → AI 调 `cap.mcp.call("get_workflow", {"module": "资产"})`
228
+ 返回操作链(查询→新增→审批→...),spec 里的交互流程跟系统一致
229
+ - **"系统里这个模块的按钮都叫什么?"** → 看 DESIGN.md 的 "Real Button Texts" 段
230
+ 或 entity-registry.json,spec 里的按钮文案跟系统统一
231
+ - **"这个模块用的是什么布局模式?"** → 看 DESIGN.md 的 layout_fingerprint
232
+ spec 里的侧边栏宽度/布局模式跟系统一致(如 160px / mixed-nav)
233
+
234
+ > 这些数据让设计师的 spec 不是"凭空设计",而是"基于系统现状的增量改进"——
235
+ > 录入的 spec 天然就跟系统风格一致,AI 出原型时不会打架。