@shulex/cxclawctl 0.1.2 → 0.1.4

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 (208) hide show
  1. package/README.md +25 -22
  2. package/capabilities.lock.json +535 -131
  3. package/dist/cli.js +2203 -127
  4. package/dist/cli.js.map +1 -1
  5. package/package.json +20 -6
  6. package/requirements-cli.txt +0 -2
  7. package/skills/__lib__/__init__.py +0 -0
  8. package/skills/__lib__/skill-runtime/bootstrap.py +0 -134
  9. package/skills/__lib__/solvea-api/__init__.py +0 -0
  10. package/skills/__lib__/solvea-api/client.py +0 -1944
  11. package/skills/__lib__/solvea-api/dashboard.py +0 -100
  12. package/skills/__lib__/solvea-api/solvea_api.py +0 -1341
  13. package/skills/agent-analytics/SKILL.md +0 -74
  14. package/skills/agent-analytics/references/chat-report-fields.md +0 -36
  15. package/skills/agent-analytics/references/report-fields.md +0 -130
  16. package/skills/agent-analytics/references/transcript.md +0 -110
  17. package/skills/agent-builder/SKILL.md +0 -42
  18. package/skills/agent-builder/interfaces/fallback-chatflow.md +0 -47
  19. package/skills/agent-builder/references/chatflow/graph-spec.md +0 -259
  20. package/skills/agent-builder/references/chatflow/node-selection.md +0 -89
  21. package/skills/agent-builder/references/chatflow/nodes/agent.md +0 -350
  22. package/skills/agent-builder/references/chatflow/nodes/business-track.md +0 -43
  23. package/skills/agent-builder/references/chatflow/nodes/code.md +0 -157
  24. package/skills/agent-builder/references/chatflow/nodes/collect-order.md +0 -47
  25. package/skills/agent-builder/references/chatflow/nodes/finish.md +0 -34
  26. package/skills/agent-builder/references/chatflow/nodes/human-review.md +0 -60
  27. package/skills/agent-builder/references/chatflow/nodes/if-else.md +0 -100
  28. package/skills/agent-builder/references/chatflow/nodes/intent.md +0 -79
  29. package/skills/agent-builder/references/chatflow/nodes/knowledge-reply.md +0 -43
  30. package/skills/agent-builder/references/chatflow/nodes/llm.md +0 -117
  31. package/skills/agent-builder/references/chatflow/nodes/note.md +0 -38
  32. package/skills/agent-builder/references/chatflow/nodes/question.md +0 -97
  33. package/skills/agent-builder/references/chatflow/nodes/rag-reply.md +0 -68
  34. package/skills/agent-builder/references/chatflow/nodes/reply.md +0 -97
  35. package/skills/agent-builder/references/chatflow/nodes/start.md +0 -35
  36. package/skills/agent-builder/references/chatflow/nodes/sub-graph.md +0 -48
  37. package/skills/agent-builder/references/chatflow/nodes/tool.md +0 -138
  38. package/skills/agent-builder/references/chatflow/nodes/transfer-to-human.md +0 -63
  39. package/skills/agent-builder/references/chatflow/nodes/variable-assignment.md +0 -52
  40. package/skills/agent-builder/references/chatflow/nodes/variable-extract.md +0 -50
  41. package/skills/agent-builder/references/chatflow/nodes/variable-process.md +0 -70
  42. package/skills/agent-builder/references/chatflow/overview.md +0 -53
  43. package/skills/agent-builder/references/chatflow/visual-translation.md +0 -64
  44. package/skills/agent-builder/references/chatflow/workflow.md +0 -134
  45. package/skills/agent-builder/references/multi-agent/create-update.md +0 -185
  46. package/skills/agent-builder/references/multi-agent/graph-spec.md +0 -246
  47. package/skills/agent-builder/references/multi-agent/graph-structure.md +0 -12
  48. package/skills/agent-builder/references/multi-agent/migrate-to-chatflow.md +0 -13
  49. package/skills/agent-builder/references/multi-agent/migration/large.md +0 -554
  50. package/skills/agent-builder/references/multi-agent/migration/principles.md +0 -446
  51. package/skills/agent-builder/references/multi-agent/migration/small.md +0 -225
  52. package/skills/agent-builder/references/multi-agent/orchestration.md +0 -11
  53. package/skills/agent-builder/references/multi-agent/overview.md +0 -48
  54. package/skills/agent-builder/references/multi-agent/update.md +0 -128
  55. package/skills/agent-builder/references/multi-agent/workflow.md +0 -87
  56. package/skills/agent-builder/references/single-agent/overview.md +0 -48
  57. package/skills/agent-builder/references/single-agent/prompt.md +0 -16
  58. package/skills/agent-builder/references/single-agent/tools.md +0 -36
  59. package/skills/agent-builder/references/single-agent/voice.md +0 -46
  60. package/skills/agent-builder/references/tools/http-tool.md +0 -315
  61. package/skills/agent-builder/references/tools/mock-tool.md +0 -279
  62. package/skills/agent-builder/references/tools/overview.md +0 -46
  63. package/skills/agent-builder/references/tools/tool-config.md +0 -43
  64. package/skills/agent-builder/references/tools/x-token.md +0 -34
  65. package/skills/agent-builder/scripts/chatflow/chatflow_builder.py +0 -3458
  66. package/skills/agent-builder/scripts/chatflow/validate_graph.py +0 -1697
  67. package/skills/agent-builder/scripts/copy_marketplace_agent.py +0 -61
  68. package/skills/agent-builder/scripts/multi-agent/legacy_graph_analyzer.py +0 -5974
  69. package/skills/agent-builder/scripts/multi-agent/replay_compare.py +0 -679
  70. package/skills/agent-builder/scripts/patch_agent_tools.py +0 -135
  71. package/skills/agent-builder/scripts/tools/validate_tool_config.py +0 -384
  72. package/skills/agent-tester/SKILL.md +0 -35
  73. package/skills/agent-tester/batch-test/overview.md +0 -86
  74. package/skills/agent-tester/scripts/batch_test_sheet.py +0 -213
  75. package/skills/agent-tester/single-test/badcase-retest.md +0 -85
  76. package/skills/agent-tester/single-test/direct-test.md +0 -24
  77. package/skills/agent-tester/single-test/overview.md +0 -142
  78. package/skills/delivery/SKILL.md +0 -112
  79. package/skills/delivery/interfaces/classify.md +0 -38
  80. package/skills/delivery/interfaces/create-agents.md +0 -89
  81. package/skills/delivery/interfaces/delivery-test.md +0 -67
  82. package/skills/delivery/references/flow.md +0 -40
  83. package/skills/delivery/references/validation.md +0 -15
  84. package/skills/delivery/scripts/batch_test.py +0 -704
  85. package/skills/delivery/scripts/classify.py +0 -22
  86. package/skills/delivery/scripts/create_agents.py +0 -695
  87. package/skills/delivery/scripts/gen_delivery_report.py +0 -335
  88. package/skills/delivery/scripts/gen_excel.py +0 -234
  89. package/skills/delivery/scripts/gen_report.py +0 -208
  90. package/skills/delivery/scripts/plan.py +0 -163
  91. package/skills/delivery/scripts/render.py +0 -713
  92. package/skills/delivery/scripts/render_summary.py +0 -38
  93. package/skills/delivery/scripts/sample_history_cases.py +0 -109
  94. package/skills/kb-builder/SKILL.md +0 -80
  95. package/skills/kb-builder/interfaces/qa-upload.md +0 -55
  96. package/skills/kb-builder/interfaces/web-kb.md +0 -84
  97. package/skills/kb-builder/references/directory.md +0 -373
  98. package/skills/kb-builder/references/export.md +0 -282
  99. package/skills/kb-builder/references/isolation-keywords.md +0 -113
  100. package/skills/kb-builder/references/knowledge.md +0 -153
  101. package/skills/kb-builder/references/product.md +0 -52
  102. package/skills/kb-builder/references/qa-from-help-center.md +0 -58
  103. package/skills/kb-builder/references/qa-from-pdf.md +0 -94
  104. package/skills/kb-builder/references/qa-from-tickets.md +0 -168
  105. package/skills/kb-builder/references/qa-from-web.md +0 -98
  106. package/skills/kb-builder/references/qa-quality.md +0 -73
  107. package/skills/kb-builder/references/reply-template.md +0 -237
  108. package/skills/kb-builder/references/tag-isolation-migration.md +0 -61
  109. package/skills/kb-builder/references/tags.md +0 -45
  110. package/skills/kb-builder/references/upload.md +0 -130
  111. package/skills/kb-builder/scripts/batch_extract_ticket_qa.py +0 -333
  112. package/skills/kb-builder/scripts/build_directory_plan.py +0 -144
  113. package/skills/kb-builder/scripts/crawl_site.py +0 -433
  114. package/skills/kb-builder/scripts/create_dirs.py +0 -146
  115. package/skills/kb-builder/scripts/export_knowledge.py +0 -454
  116. package/skills/kb-builder/scripts/extract_ticket_qa.py +0 -441
  117. package/skills/kb-builder/scripts/extract_web_qa.py +0 -118
  118. package/skills/kb-builder/scripts/import_qa.py +0 -219
  119. package/skills/kb-builder/scripts/import_source_documents.py +0 -143
  120. package/skills/kb-builder/scripts/import_templates.py +0 -409
  121. package/skills/poc/SKILL.md +0 -125
  122. package/skills/poc/assets/default_manual.css +0 -279
  123. package/skills/poc/assets/notice_escalate.png +0 -0
  124. package/skills/poc/assets/notice_escalate2.png +0 -0
  125. package/skills/poc/assets/notice_new_chat.png +0 -0
  126. package/skills/poc/assets/poc_test_template.html +0 -645
  127. package/skills/poc/assets/poc_test_template.md +0 -104
  128. package/skills/poc/assets/step3_preview.png +0 -0
  129. package/skills/poc/assets/step4_order_note.png +0 -0
  130. package/skills/poc/interfaces/classify.md +0 -38
  131. package/skills/poc/interfaces/create-agents.md +0 -108
  132. package/skills/poc/interfaces/poc-test.md +0 -94
  133. package/skills/poc/references/flow.md +0 -47
  134. package/skills/poc/references/kb-directory.md +0 -22
  135. package/skills/poc/references/validation.md +0 -17
  136. package/skills/poc/scripts/classify.py +0 -22
  137. package/skills/poc/scripts/create_agents.py +0 -818
  138. package/skills/poc/scripts/gen_excel.py +0 -234
  139. package/skills/poc/scripts/gen_poc_manual.py +0 -249
  140. package/skills/poc/scripts/gen_report.py +0 -208
  141. package/skills/poc/scripts/inspect_chatflow.py +0 -209
  142. package/skills/poc/scripts/plan.py +0 -178
  143. package/skills/poc/scripts/poc_test.py +0 -495
  144. package/skills/poc/scripts/render.py +0 -713
  145. package/skills/poc/scripts/render_summary.py +0 -41
  146. package/skills/runtime-inspector/SKILL.md +0 -51
  147. package/skills/runtime-inspector/references/frontend-rendering.md +0 -126
  148. package/skills/runtime-inspector/references/model.md +0 -59
  149. package/skills/runtime-inspector/references/sandbox.md +0 -131
  150. package/skills/runtime-inspector/scripts/model_inspect.py +0 -68
  151. package/skills/runtime-inspector/scripts/prepare.py +0 -98
  152. package/skills/runtime-inspector/scripts/process.py +0 -84
  153. package/skills/runtime-inspector/scripts/read_state.py +0 -32
  154. package/skills/runtime-inspector/scripts/sandbox_inspect.py +0 -463
  155. package/skills/runtime-inspector/scripts/test_claude_proxy.py +0 -49
  156. package/skills/runtime-inspector/scripts/test_openai_proxy.py +0 -41
  157. package/skills/runtime-inspector/scripts/verify_persistence.py +0 -101
  158. package/skills/runtime-inspector/scripts/write_test.py +0 -41
  159. package/skills/setup/SKILL.md +0 -17
  160. package/skills/shulex-support/SKILL.md +0 -39
  161. package/skills/shulex-support/references/badcase-analysis/overview.md +0 -34
  162. package/skills/shulex-support/references/badcase-analysis/text/conversation-record.md +0 -105
  163. package/skills/shulex-support/references/badcase-analysis/text/core-flow.md +0 -89
  164. package/skills/shulex-support/references/badcase-analysis/text/log-query-rules.md +0 -36
  165. package/skills/shulex-support/references/badcase-analysis/text/m1-entry.md +0 -53
  166. package/skills/shulex-support/references/badcase-analysis/text/m10-chatflow-service.md +0 -259
  167. package/skills/shulex-support/references/badcase-analysis/text/m11-algorithm-service.md +0 -148
  168. package/skills/shulex-support/references/badcase-analysis/text/m12-quality-inspection.md +0 -57
  169. package/skills/shulex-support/references/badcase-analysis/text/m2-intent.md +0 -120
  170. package/skills/shulex-support/references/badcase-analysis/text/m3-strategy.md +0 -126
  171. package/skills/shulex-support/references/badcase-analysis/text/m4-aifield.md +0 -121
  172. package/skills/shulex-support/references/badcase-analysis/text/m5-agent.md +0 -208
  173. package/skills/shulex-support/references/badcase-analysis/text/m6-tool.md +0 -115
  174. package/skills/shulex-support/references/badcase-analysis/text/m7-reply.md +0 -72
  175. package/skills/shulex-support/references/badcase-analysis/text/m8-error.md +0 -92
  176. package/skills/shulex-support/references/badcase-analysis/text/m9-knowledge-search.md +0 -147
  177. package/skills/shulex-support/references/badcase-analysis/text/sls-query.md +0 -283
  178. package/skills/shulex-support/references/badcase-analysis/voice/core-flow.md +0 -77
  179. package/skills/shulex-support/references/badcase-analysis/voice/dependencies.md +0 -19
  180. package/skills/shulex-support/references/badcase-analysis/voice/platform-api.md +0 -23
  181. package/skills/shulex-support/references/badcase-analysis/voice/sls-playbook.md +0 -31
  182. package/skills/shulex-support/references/product-docs.md +0 -70
  183. package/skills/shulex-support/references/tickets.md +0 -184
  184. package/skills/shulex-support/scripts/support.py +0 -427
  185. package/skills/solvea-desk/SKILL.md +0 -39
  186. package/skills/solvea-desk/references/report/fields.md +0 -82
  187. package/skills/solvea-desk/references/report/report-design.md +0 -200
  188. package/skills/solvea-desk/references/report/report-template.html +0 -44
  189. package/skills/solvea-desk/references/report/report.css +0 -517
  190. package/skills/solvea-desk/references/report/workflow.md +0 -464
  191. package/skills/solvea-desk/references/tickets/query.md +0 -103
  192. package/skills/solvea-desk/references/tickets/tags.md +0 -83
  193. package/skills/solvea-desk/scripts/report/fetch_sources.py +0 -580
  194. package/skills/solvea-desk/scripts/report/render_report.py +0 -763
  195. package/skills/solvea-desk/scripts/tickets/desk_api.py +0 -73
  196. package/skills/solvea-desk/scripts/tickets/fetch_tickets.py +0 -403
  197. package/skills/solvea-desk/scripts/tickets/ticket_tags.py +0 -305
  198. package/skills/solvea-kit/SKILL.md +0 -84
  199. package/skills/solvea-kit/references/agent.md +0 -145
  200. package/skills/solvea-kit/references/chat.md +0 -244
  201. package/skills/solvea-kit/references/intent.md +0 -69
  202. package/skills/solvea-kit/references/plugin.md +0 -53
  203. package/skills/solvea-kit/references/quality-inspection.md +0 -75
  204. package/skills/solvea-kit/references/strategy.md +0 -62
  205. package/skills/solvea-kit/references/tagging.md +0 -231
  206. package/skills/solvea-kit/references/variables.md +0 -53
  207. package/skills/solvea-kit/scripts/generate_label_import_file.py +0 -151
  208. package/skills/solvea-kit/scripts/intent_classify.py +0 -843
@@ -1,373 +0,0 @@
1
- # 目录管理能力
2
-
3
- 默认目录最多三级(一级/二级/三级)。脚本会拒绝第四级及以上,不会静默截断;只有用户明确要求其他层级时,才使用 `--max-depth` 覆盖。
4
-
5
- 涵盖:探查网站/知识来源 → 设计目录树 → 用户确认 → 批量创建 / 临时补建。
6
- 本文档不规定调用顺序——SOP 可以全流程跑,也可以单独调用某一步(例如只补建某个型号目录)。
7
-
8
- ---
9
-
10
- ## §1 探查网站/知识来源
11
-
12
- “网站”可以是品牌官网、产品站、帮助中心、FAQ 页面、文档站、支持站或用户给出的其他公开知识来源 URL;不要只按“官网首页”理解。
13
-
14
- ### 1.1 首轮爬取(必须读完全文)
15
-
16
- 调用 `web_crawl` 一次性发现 + 抽取页面,参数取较激进的设定(默认 max_depth=2/limit=50 经常不够):
17
-
18
- ```
19
- web_crawl(
20
- url="https://example.com",
21
- instructions="Product, category, policy, help center pages.",
22
- max_depth=3,
23
- limit=100,
24
- )
25
- ```
26
-
27
- ⚠️ **instructions 必须简短**(建议 ≤80 字符),写"找什么主题的页面",不写动作。实测 200+ 字符的长 instructions 会触发 tavily 服务端 "Try more concise instructions" 错误,返回空结果。
28
-
29
- `web_crawl` 永远抓页面 + 完整内容(raw_content),instructions 只是引导爬虫挑哪类页面,不控制是否抓内容。每页返回完整 raw_content(含全站导航、分类、产品列表);后续做 QA 再 `web_fetch` 单页深抓拿规格 / 政策原文。
30
-
31
- **大文件必须读完,边读边记录**:100 页全文超过 20k tokens 时,运行时会自动把完整结果写到 `/large_tool_results/<tool_call_id>` 文件,工具回包改成 head + tail 预览。**无论后续是否找到其他来源、无论是否认为"已有足够信息",大文件都必须读到底,不得提前停止**——中间段经常藏着整个品类:
32
-
33
- 1. `read_file(file_path=..., offset=0, limit=300)` 读第一段,**立即**从中提取产品/品类 URL 写入内部列表
34
- 2. 用返回的 `lines X-Y of N` 判断是否读完;若 Y < N,以 Y 为下一次 offset 继续读
35
- 3. 每段提取完即丢弃原文,只留 URL 列表,循环直到 Y ≥ N 才算读完
36
- 4. 读到页面标题或 URL 含 `all` / `shop-all` / `shop_all` / `all-products` / `products` / `collections` 等汇总页信号时,**必须单独 `web_fetch` 该 URL** 并解析其产品分区结构(不能只记标题/URL,需要拿到各品类下的产品列表和数量)
37
-
38
- **全量产品页 / 汇总页不能漏**:很多站点把全部产品和真实品类结构放在 `/all`、`/products`、`/collections/all`、`/shop-all`、`/pages/all-products`、`/collections`、`/category/all` 这类页面里。发现这些链接时,即使 web_crawl 已经抓到一批产品页,也必须 fetch 汇总页并从中补全:
39
- - 各品类名称
40
- - 每个品类下的产品 URL
41
- - 套装 / bundle / accessory 等容易被普通产品页抓取漏掉的条目
42
- - 页面中出现但 sitemap / search 没出现的产品
43
-
44
- **1.1 与 1.2 可以并行**:web_crawl 发出后,可以同步开始 robots.txt / site:search / 电商建站平台检测,不需要等 1.1 全部读完再启动兜底。
45
-
46
- 按内容关键词把每页归类成 `product` / `policy` / `help_center` / `other`。FAQ / Q&A 结构本身**不决定目录类型**:
47
- - 产品详情页里的 FAQ 仍归 `product`
48
- - 政策页里的 FAQ 仍归 `policy`
49
- - 只有帮助中心 / 文档站 / 支持站页面,或路径/标题含 `help` / `support` / `docs` / `knowledge-base` 的 FAQ,才归 `help_center`
50
-
51
- ### 1.2 兜底补全(必须执行,与 1.1 并行)
52
-
53
- `web_crawl` 是 BFS 链接跳转,受站点链接结构限制,单跑一次容易漏品类。下面三条**全部执行**,命中即合并进结果,**不互相替代**:
54
-
55
- **A. 搜索引擎索引**(最普适)
56
-
57
- ```
58
- web_search("site:{domain} product", allowed_domains=["{domain}"])
59
- ```
60
-
61
- 搜索引擎已做过站点索引,跨任何站点结构都有效。从结果里提取所有产品 URL。
62
-
63
- 同时补搜汇总页信号:
64
-
65
- ```
66
- web_search("site:{domain} all products OR shop all OR collections all", allowed_domains=["{domain}"])
67
- ```
68
-
69
- 命中的汇总页必须 `web_fetch`,不能只把搜索结果里的 URL 记入列表。
70
-
71
- **B. robots.txt → sitemap**(标准协议)
72
-
73
- ```
74
- web_fetch("{baseUrl}/robots.txt")
75
- ```
76
-
77
- 读返回内容里的 `Sitemap: <url>` 行(可能多行)。robots.txt 是 RFC 标准,几乎所有站都有。对每个声明的 sitemap URL 再 `web_fetch`,从中提取所有产品路径。robots.txt 没声明 sitemap 时跳过,不要硬猜 `/sitemap.xml`。
78
-
79
- **C. Shopify 专项补全**(检测到 Shopify 时,在 A/B 基础上额外执行)
80
-
81
- 判断是否 Shopify(满足其一即可):
82
- - robots.txt 内容含 `shopify` / `myshopify.com`
83
- - web_crawl 结果中页面内容含 `cdn.shopify.com`
84
-
85
- 确认是 Shopify 后,**在 A/B 之外额外执行以下步骤**:
86
-
87
- 1. **`/products.json` 分页 API** — 返回完整产品列表,包括无 tag、未归入任何 collection 的产品(这类产品通过 web_crawl 和 sitemap 抓不到):
88
- ```
89
- web_fetch("{baseUrl}/products.json?limit=250")
90
- # 若返回 products 数量 == 250,继续翻页直到某页数量 < 250
91
- web_fetch("{baseUrl}/products.json?limit=250&page=2")
92
- ```
93
- 从 `products[].handle` 拼出 `/products/{handle}` URL 列表合并去重。
94
-
95
- 2. **sitemap 全量分片** — sitemap index 里每一条 `<loc>` 都要 `web_fetch`,不止第一片:
96
- ```
97
- # sitemap index 里可能有多行:
98
- # sitemap_products_1.xml?from=...&to=...
99
- # sitemap_products_2.xml?from=...&to=... ← 不要漏
100
- ```
101
-
102
- 3. **从 sitemap_pages 找商家汇总页** — `/products.json` 只给产品 URL 的平铺列表,不告诉你商家把产品分成哪几个品类。商家常在 sitemap_pages 里维护一个汇总页(路径含 `shop`、`all`、`product` 等),能反映真实分类结构(包括无 tag 套餐的归属):
103
- - 拿到 sitemap_pages 后,找路径匹配 `/pages/*shop*` 或 `/pages/*all*` 或 `/pages/*product*` 的条目
104
- - 逐条 `web_fetch`,若页面内容按品类分区列出产品,**以该页分区结构为准设计目录树**
105
- - 找不到则用 `/products.json` 的 `tags` 字段推断品类
106
-
107
- **并行建议**:`/products.json` + sitemap 全量分片 + 汇总页访问可以同步发出,互不依赖。
108
-
109
- **D. SHOPLINE 专项补全**(检测到 SHOPLINE 时,在 A/B 基础上额外执行)
110
-
111
- 判断是否 SHOPLINE(满足其一即可):
112
- - 输入域名或 sitemap / robots 里的链接包含 `myshopline.com`
113
- - robots.txt / 页面源码 / web_crawl 原文包含 `SHOPLINE` / `shopline` / `shoplineapp`
114
-
115
- 确认是 SHOPLINE 后,**不要套 Shopify 的 `/products.json` 规则**。SHOPLINE 产品接口通常不是匿名公开抓取入口,优先走公开页面与 sitemap:
116
-
117
- 1. **robots.txt → sitemap 全量抓取**:
118
- - 先读 robots.txt 里的所有 `Sitemap:` 行
119
- - 对每个 sitemap URL 都 `web_fetch`
120
- - sitemap index 里出现多片 sitemap 时,每一片都要继续 fetch,不只读第一片
121
- - 从 `<loc>` 中提取疑似产品页、集合页、分类页、帮助中心页、政策页 URL
122
-
123
- 2. **平台默认 sitemap 兜底**:
124
- - 只有在已确认 SHOPLINE、且 robots.txt 没给 sitemap 时,才尝试一次 `{baseUrl}/sitemap.xml`
125
- - 若 404 / 空结果,立即停止这个分支,不继续硬猜路径
126
-
127
- 3. **站内结构补全**:
128
- - 用 `web_search("site:{domain} product OR products OR collection OR collections", allowed_domains=["{domain}"])`
129
- - 抓到集合 / 分类页后,再 `web_crawl(url=collection_url, max_depth=1, limit=50)` 提取其下产品页
130
- - 找到路径含 `shop` / `all` / `product` / `collection` 的汇总页时,必须 `web_fetch` 并解析品类分区结构
131
-
132
- 4. **分类依据**:
133
- - 页面含产品标题、价格、SKU、规格、Add to cart / Buy now、产品图片等信号 → `product`
134
- - 页面是集合、分类、全产品列表 → 作为目录树设计素材,并继续提取子产品 URL
135
- - 页面含 FAQ / Q&A 结构时,按 `qa-quality.md` 的 FAQ 规则逐条提取;产品页 FAQ 仍归对应产品目录
136
-
137
- ### 1.3 向用户汇报并等待确认完整性
138
-
139
- 汇报必须**结构化 + 主动确认**,不能只说"发现 N 个页面":
140
-
141
- ```
142
- ✅ 已扫描 https://example.com(首轮 47 + 兜底补抓 32,去重后共 71 个)
143
-
144
- 按类型分桶:
145
- - 产品页 35 个:/products/xxx, /products/yyy, ... (+33)
146
- - 品类页 8 个:/category/aa, /category/bb, ...
147
- - 政策页 4 个:/warranty, /returns, /shipping, /privacy
148
- - 帮助中心 12 个:/help/setup-guide, ... (+9)
149
- - 其他/已排除 12 个
150
-
151
- 兜底来源:
152
- - 搜索引擎 site: 索引 ✅(解析出 35 个产品 URL)
153
- - robots.txt → sitemap ⚠️(robots.txt 未声明 sitemap,已跳过)
154
-
155
- ⚠️ 可能未覆盖:(若有以下情况,如实列出)
156
- - web_crawl 结果被截断,中间段未完整读取
157
- - 某些品类页未发现(如网站导航里有但 crawl 没抓到的栏目名)
158
- - 动态加载 / 登录后才可见的页面
159
-
160
- 请帮忙核对:
161
- 1. 上面产品列表是否覆盖了全部主力产品?
162
- 2. 有没有哪些品类或产品明显缺失?如果有,告诉我具体名称、或者直接把对应品类页 / 产品页的 URL 贴给我,我来补抓。
163
- ```
164
-
165
- ⚠️ 必须等用户明确"齐了 / 确认 / 没问题"才进入下一步。
166
-
167
- **用户列出遗漏时的局部补抓**:
168
-
169
- - 用户给具体 URL(品类页 / 产品页)→ 直接 `web_fetch` 那一页拿内容;如是品类页,再用 `web_crawl(url=cat_url, max_depth=1, limit=50)` 提其下产品
170
- - 用户只给产品名(不给 URL)→ `web_search("site:{domain} {product_name}")` 找 URL;找到再 fetch;找不到让用户给品类页 URL
171
- - 不要在主域名根目录硬猜路径(不通用)
172
- - 补抓完再次走本步骤汇报,循环到用户说全为止
173
-
174
- ### 1.4 写入跨轮缓存(用 write_file 工具)
175
-
176
- 把整理好的 cache JSON 用 **write_file 工具**写到 `workspace/state/kb-builder/crawl_cache.json`(**固定名**,每轮覆盖):
177
-
178
- ```json
179
- {
180
- "baseUrl": "https://example.com",
181
- "crawledAt": "2026-05-06T10:00:00Z",
182
- "pages": [
183
- {"url": "https://example.com/products/kasa-ep25", "type": "product", "title": "Kasa EP25", "snippet": "..."},
184
- {"url": "https://example.com/warranty", "type": "policy", "title": "Warranty", "snippet": "..."}
185
- ]
186
- }
187
- ```
188
-
189
- 后续提取 QA 时各来源直接复用此 cache,避免重复爬取。如需更新,重写整个文件。
190
-
191
- ---
192
-
193
- ## §2 目录树设计
194
-
195
- 目录 schema 优先级:
196
-
197
- 1. 用户当前消息明确指定的目录层级。
198
- 2. SOP(poc/delivery)传入的目录规范。
199
- 3. kb-builder 默认标准模板。
200
-
201
- 如果用户或上游给出目录 schema,必须按该规范创建和上传。schema 定义了根节点和层级时,不得因为默认标准模板存在而额外增加默认根目录,也不得擅自重排或补充层级。
202
-
203
- ### 默认标准模板
204
-
205
- 仅当用户没有指定目录 schema、SOP 也没有传入目录规范时,才使用下面的标准模板。使用该模板时,不得自由发明一级目录名称。
206
-
207
- ### 一级目录详细语义
208
-
209
- **1. Product Introduction(产品介绍)**
210
- - 二级:产品品类(如 Smart Plugs / Robot Vacuums / Air Purifiers)
211
- - 三级:该品类下的具体产品名称(如 Kasa EP25 / Roomba j7+)
212
- - 规则:二级必须是品类,**不能直接把产品名放到二级**
213
- - 来源:产品列表页、品类页、单品详情页
214
- - 始终创建
215
-
216
- **2. Brand Policy(品牌政策)**
217
- - 二级:细分政策类型(如 Warranty Policy / Return Policy / Shipping Policy / Privacy Policy)
218
- - **不创建三级目录**
219
- - 来源:条款页、政策页、FAQ 中的政策类内容
220
- - 始终创建
221
-
222
- **3. Help Center(帮助中心)**
223
- - ⚠️ **条件创建**:仅当爬取内容中发现 support / help / faq 路径的页面时才创建
224
- - 二级 & 三级:直接参考网站帮助中心 / FAQ / 文档站的**真实导航结构**,不自行发明
225
- - 如未发现帮助中心页面 → **跳过此目录,不创建**
226
-
227
- **4. Pending Assignment(待分配)**
228
- - 所有无法明确归入以上三个目录的内容,统一放入此目录
229
- - **始终创建**,作为正式兜底目录
230
- - 不预设子目录(运行时动态归入即可)
231
-
232
- ### 示例目录树
233
-
234
- ```
235
- Brand Knowledge Base
236
- ├── Product Introduction
237
- │ ├── Smart Plugs
238
- │ │ ├── Kasa EP25
239
- │ │ └── Kasa EP40
240
- │ └── Cameras
241
- │ ├── Kasa EC70
242
- │ └── Kasa KC400
243
- ├── Brand Policy
244
- │ ├── Warranty Policy
245
- │ ├── Return Policy
246
- │ └── Shipping Policy
247
- ├── Help Center
248
- │ ├── Getting Started
249
- │ │ ├── Setup Guide
250
- │ │ └── App Configuration
251
- │ └── Troubleshooting
252
- │ └── Connectivity Issues
253
- └── Pending Assignment
254
- ```
255
-
256
- ### 内部维护 JSON(唯一数据来源)
257
-
258
- ```json
259
- [
260
- {"name": "Product Introduction", "children": [
261
- {"name": "Smart Plugs", "children": [
262
- {"name": "Kasa EP25"}, {"name": "Kasa EP40"}
263
- ]}
264
- ]},
265
- {"name": "Brand Policy", "children": [
266
- {"name": "Warranty Policy"}, {"name": "Return Policy"}
267
- ]},
268
- {"name": "Help Center", "children": [
269
- {"name": "Getting Started", "children": [{"name": "Setup Guide"}]}
270
- ]},
271
- {"name": "Pending Assignment"}
272
- ]
273
- ```
274
-
275
- 命名规则:使用默认标准模板时,4 个一级目录保持英文稳定标识;新建的二级、三级目录使用目标业务语言,品牌名、型号和其他专有名词保留原文。使用用户/SOP schema 时,各层目录名按该 schema 原样保留,只清理接口不支持的非法字符。
276
-
277
- ---
278
-
279
- ## §3 交互式确认循环
280
-
281
- 展示目录树后等待用户反馈,支持以下操作:
282
-
283
- | 用户说 | 操作 |
284
- |--------|------|
285
- | "在 [Y] 下面加 [X]" | 在指定父节点下插入 |
286
- | "删掉 [X]" | 删除该节点及其子节点 |
287
- | "把 [X] 改名为 [Y]" | 更新名称 |
288
- | "把 [X] 移到 [Y] 下面" | 重新挂载节点 |
289
- | 「确认」/「没问题」/「开始创建」/「可以创建」 | 进入 §4 |
290
-
291
- ⚠️ 仅「确认」「没问题」「开始创建」「可以创建」触发创建,「可以」「好」「嗯」不触发。
292
-
293
- 每次修改后重新渲染完整树并等待确认。未收到明确「确认」前不得继续。
294
-
295
- 收到明确确认后,用 **write_file 工具** 把当前树写到 `workspace/state/kb-builder/confirmed_tree.json`(固定名)。
296
-
297
- ---
298
-
299
- ## §4 批量创建目录
300
-
301
- 调用 `scripts/create_dirs.py`:
302
-
303
- ```bash
304
- npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/create_dirs.py
305
- ```
306
-
307
- 脚本行为:
308
- 1. 读 `STATE_DIR/confirmed_tree.json`
309
- 2. 深度优先递归创建(先父后子)
310
- 3. 同名同 parent 的目录已存在则跳过(幂等)
311
-
312
- 验证:
313
-
314
- ```bash
315
- npx --yes @shulex/cxclawctl@latest api list-directories --pretty
316
- ```
317
-
318
- ---
319
-
320
- ## §5 临时补建单个目录
321
-
322
- 提取 QA 时(PDF / 工单 / 网站产品页)发现品类 / 型号目录在 KB 里缺失,
323
- **不要回头跑全流程目录搭建**,直接用 CLI 补建:
324
-
325
- ```bash
326
- # 查现有目录拿 parent-id
327
- npx --yes @shulex/cxclawctl@latest api list-directories --pretty
328
-
329
- # 默认标准模板:在 Product Introduction 下建新品类(parent-id 是 Product Introduction 的 id)
330
- npx --yes @shulex/cxclawctl@latest api create-folder --name "Diagnostic Scanners" --parent-id 32188 --pretty
331
-
332
- # 在新品类下建型号(parent-id 是上一步返回的 id)
333
- npx --yes @shulex/cxclawctl@latest api create-folder --name "AV-D600" --parent-id <new_id> --pretty
334
- ```
335
-
336
- 使用默认标准模板且实在归不进去(罕见)→ 归入 `["Pending Assignment"]`。使用用户/SOP schema 时,按其兜底目录规则处理;没有兜底规则时先向用户确认,不自行添加默认兜底目录。
337
-
338
- ---
339
-
340
- ## §6 重命名、移动与删除目录
341
-
342
- 这三类操作都要先用 `list-directories` 确认目标 ID 和完整路径,展示变更计划并等待用户明确确认。
343
-
344
- ```bash
345
- # 重命名
346
- npx --yes @shulex/cxclawctl@latest api update-directory --id 32188 --name "New name" --pretty
347
-
348
- # 移动到另一目录下;移到根层使用 --parent-id 0
349
- npx --yes @shulex/cxclawctl@latest api move-directory --id 32188 --parent-id 32000 --pretty
350
-
351
- # 递归删除(收到强确认后才能带上 --confirm-delete)
352
- npx --yes @shulex/cxclawctl@latest api delete-directory --id 32188 --confirm-delete --pretty
353
- ```
354
-
355
- 移动时默认检查移动后的整棵子树不超过三级,也不允许移到自身或自身子目录下。仅用户明确要求其他层级时使用 `--max-depth`。
356
-
357
- **删除目录是级联删除**:后端会递归删除该目录、所有子目录和其中的各类知识。确认前必须展示完整子树、影响的知识数量和代表性标题;不提供“只删目录保留知识”的虚假选项。
358
-
359
- 展示影响后,必须要求用户回复“我已知晓删除影响并确认删除”或同时表达知晓影响与确认删除的等价语句;英文用户可回复 `I understand the deletion impact and confirm deletion.`。简单的“确认”、`OK` 或“可以”不够。收到强确认后才能在命令中加 `--confirm-delete`。执行后重新查询目录树和知识列表。
360
-
361
- ---
362
-
363
- ## §7 常见错误
364
-
365
- | 错误 | 正确做法 |
366
- |------|----------|
367
- | 用户已指定 A/B/C 列目录,却额外增加 Product Introduction | 用户 schema 优先,严格按 A/B/C 创建 |
368
- | 默认标准模板下自由发明一级目录名字 | 默认模板一级目录只有四个固定名称 |
369
- | Product Introduction 二级是产品名 | 二级必须是品类,三级才是产品名 |
370
- | Brand Policy 下建了三级目录 | Brand Policy 只到二级 |
371
- | 网站没有帮助中心 / FAQ 却创建了 Help Center | 未发现 support / help / faq / docs 页面时跳过 |
372
- | 跳过用户确认直接 create_dirs | 必须收到明确「确认」才创建 |
373
- | 提取 QA 时品类目录缺失就直接归 Pending Assignment | 优先用 create-folder CLI 补建一级下的子目录 |
@@ -1,282 +0,0 @@
1
- # 知识导出
2
-
3
- 把 Shulex 知识库导出成带目录路径的 Excel。核心原则:优先调用 `scripts/export_knowledge.py` 完成目录读取、分页拉取、目录 join 和 Excel 写入;不要让模型临时手写分页脚本或 Excel 生成逻辑。
4
-
5
- 脚本内部会读取 `list-directories` 的完整目录树,并用每条知识的 `directoryId` 精确 join 目录路径。禁止用 question 前缀、关键词、型号名等方式猜目录。
6
-
7
- ## 适用入口
8
-
9
- 用户提到以下诉求时使用本 reference:
10
-
11
- - 导出知识 / 导出知识库
12
- - 带目录导出
13
- - 按目录导出一部分知识
14
- - 导出当前 KB 供客户审阅 / 迁移 / 备份
15
-
16
- ## 数据来源
17
-
18
- ### 1. 目录树
19
-
20
- 先读取完整目录树:
21
-
22
- ```bash
23
- npx --yes @shulex/cxclawctl@latest api list-directories --pretty
24
- ```
25
-
26
- `list-directories` 对应前端接口:
27
-
28
- ```text
29
- GET /api_v2/qam/project/{projectId}/directories?keyword=&kuPublished=
30
- ```
31
-
32
- 响应里的 `list` 已经是完整树,不需要逐级再查。需要保留所有节点,包括 `kuCount=0` 的目录,因为它可能是父目录或暂时为空的目录。
33
-
34
- 把目录树 flatten 成两张索引:
35
-
36
- - `directory_id -> node`
37
- - `directory_id -> path_names`
38
-
39
- 例如:
40
-
41
- ```text
42
- 100327 -> ["Product Category", "Calendar Machine", "A1"]
43
- 82769 -> ["Product Category", "Tablet", "Tablet General"]
44
- ```
45
-
46
- ### 2. 知识列表
47
-
48
- 查询知识:
49
-
50
- ```bash
51
- npx --yes @shulex/cxclawctl@latest api list-knowledge \
52
- --type ALL \
53
- --page-size 1000 \
54
- --page 1 \
55
- --pretty
56
- ```
57
-
58
- 指定目录查询:
59
-
60
- ```bash
61
- npx --yes @shulex/cxclawctl@latest api list-knowledge \
62
- --type ALL \
63
- --directory-id 105809 \
64
- --page-size 1000 \
65
- --page 1 \
66
- --pretty
67
- ```
68
-
69
- `list-knowledge` 对应前端接口:
70
-
71
- ```text
72
- POST /api_v2/qam/project/{projectId}/getKnowledge
73
- ```
74
-
75
- 请求体示例:
76
-
77
- ```json
78
- {
79
- "type": "ALL",
80
- "pageIndex": 1,
81
- "pageSize": 50,
82
- "directoryId": 105809,
83
- "keyword": ""
84
- }
85
- ```
86
-
87
- 每条知识必须使用返回的 `directoryId` 去目录索引里查路径。不要从 `question` / `answer` / `title` 里推断目录。
88
-
89
- ## 脚本调用
90
-
91
- ⚠️ 默认不要直接导出。`导出知识库`、`导出知识`、`帮我导出 KB` 这类说法只表示用户要进入导出流程,不表示导出全部。
92
-
93
- ### 全量导出
94
-
95
- 只有用户明确说了“全部 / 全量 / 所有 / 整个知识库 / 当前知识库全部 / all / everything”时,才直接执行全量导出:
96
-
97
- ```bash
98
- npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/export_knowledge.py --all
99
- ```
100
-
101
- ### 指定目录导出
102
-
103
- 用户指定一个目录时:
104
-
105
- ```bash
106
- npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/export_knowledge.py --directory-id 105809
107
- ```
108
-
109
- 默认会包含该目录及其所有子孙目录。
110
-
111
- 只导出目录自身、不包含子目录时:
112
-
113
- ```bash
114
- npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/export_knowledge.py --directory-id 105809 --no-children
115
- ```
116
-
117
- ### 多目录导出
118
-
119
- ```bash
120
- npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/export_knowledge.py \
121
- --directory-id 105809 \
122
- --directory-id 82764
123
- ```
124
-
125
- 脚本会按 KU ID 去重。
126
-
127
- ### keyword 过滤
128
-
129
- ```bash
130
- npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/export_knowledge.py \
131
- --directory-id 105809 \
132
- --keyword battery
133
- ```
134
-
135
- ### 指定知识类型
136
-
137
- ```bash
138
- npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/export_knowledge.py --all --type QA
139
- ```
140
-
141
- `--type` 默认为 `ALL`,可按接口支持传 `QA / FILE / WEBSITE / PRODUCT / LEARN_SELF / ALL`。
142
-
143
- ## 和用户确认导出范围
144
-
145
- 默认先用 `list-directories` 拉目录树,向用户展示可选目录,至少包含:
146
-
147
- - 目录 id
148
- - 完整路径
149
- - `kuCount`
150
-
151
- 询问用户导出范围:
152
-
153
- ```text
154
- 我看到了当前目录树。你希望导出哪一部分?
155
- - 全部知识库
156
- - 某个目录及其子目录,例如 Product Category / Tablet
157
- - 多个目录
158
- - 按 keyword 过滤后导出
159
- ```
160
-
161
- 只有用户已经明确“全部 / 全量 / 所有 / 整个知识库 / 当前知识库全部 / all / everything”时,不需要再问,直接运行:
162
-
163
- ```bash
164
- npx --yes @shulex/cxclawctl@latest script skills/kb-builder/scripts/export_knowledge.py --all
165
- ```
166
-
167
- 反例:用户只说“导出知识库”或“导出知识”,必须先列目录并询问范围,不能直接按全量处理。
168
-
169
- ## 拉取策略
170
-
171
- ### 全量导出
172
-
173
- 脚本内部不会遍历所有目录。它直接不传 `directoryId`,按页拉全量知识:
174
-
175
- ```bash
176
- npx --yes @shulex/cxclawctl@latest api list-knowledge --type ALL --page-size 1000 --page 1 --pretty
177
- ```
178
-
179
- 第一页读取 `total`,继续翻页直到拉完。
180
-
181
- ### 指定单个父目录导出
182
-
183
- 脚本内部会先从目录树展开该目录的所有子孙目录 id,包含父目录自身。然后按目录逐个分页拉取:
184
-
185
- ```bash
186
- npx --yes @shulex/cxclawctl@latest api list-knowledge \
187
- --type ALL \
188
- --directory-id <dir_id> \
189
- --page-size 1000 \
190
- --page 1 \
191
- --pretty
192
- ```
193
-
194
- 父目录导出时,目录树里的 `kuCount` 通常是子树汇总。若选中目录子孙很多,或者 `kuCount` 接近全量,可以提示用户“这个范围接近全量,是否直接导出全量”。
195
-
196
- ### 多目录导出
197
-
198
- 脚本内部会对每个选中目录重复“展开子孙目录 id + 分页拉取”。同一条知识如果被多个父目录覆盖,按 `id` 去重。
199
-
200
- ### keyword 导出
201
-
202
- 把 `--keyword` 和可选 `--directory-id` 组合使用。脚本仍然用返回的 `directoryId` join 目录路径,不会用 keyword 推断目录。
203
-
204
- ## Excel 结构
205
-
206
- 默认生成一个 Sheet,名字建议 `Knowledge Base`。目录已经由 Level 列清晰表达,不要默认按一级目录拆多个 Sheet。
207
-
208
- 表头的目录层级列必须动态生成,不能硬编码 `Level 1/2/3`。先根据本次导出范围内实际出现的目录路径计算最大深度 `N`,然后生成:
209
-
210
- ```text
211
- Level 1, Level 2, ..., Level N, Question, Answer, KU ID, Type, Status
212
- ```
213
-
214
- 如果某条知识路径短于 `N`,后面的 Level 列留空。
215
-
216
- 示例:
217
-
218
- ```text
219
- Product Category / Tablet / C107 / Firmware
220
- ```
221
-
222
- 对应:
223
-
224
- ```text
225
- Level 1 = Product Category
226
- Level 2 = Tablet
227
- Level 3 = C107
228
- Level 4 = Firmware
229
- ```
230
-
231
- 建议额外保留这些列:
232
-
233
- - `KU ID`
234
- - `Type`
235
- - `Status`
236
- - `Directory ID`(排查用,建议放在最后)
237
-
238
- 如果用户明确要求“按一级目录拆 Sheet”或“每个目录一个 Sheet”,才拆 Sheet;拆 Sheet 时也必须保留完整 Level 列。
239
-
240
- ## 输出路径
241
-
242
- 最终 Excel 写到:
243
-
244
- ```text
245
- /workspace/outputs/kb-builder/kb_export_<timestamp>.xlsx
246
- ```
247
-
248
- 中间 JSON、目录索引、分页结果写到:
249
-
250
- ```text
251
- /workspace/tmp/kb-builder/export/
252
- ```
253
-
254
- 不要把中间分页数据写到 outputs,避免输出给用户。
255
-
256
- ## 汇报格式
257
-
258
- 导出完成后向用户说明:
259
-
260
- ```text
261
- 已导出 X 条知识到 /workspace/outputs/kb-builder/kb_export_<timestamp>.xlsx
262
-
263
- 范围:
264
- - 全部知识库 / 指定目录 ...
265
-
266
- 目录统计:
267
- - Product Category / Tablet: N 条
268
- - Product Category / Frame: N 条
269
- - Uncategorized: N 条
270
-
271
- 说明:
272
- - 目录来自 directoryId 精确匹配
273
- - 没有 directoryId 或目录已不存在的知识会放到 Unknown Directory
274
- ```
275
-
276
- ## 禁止事项
277
-
278
- - 禁止用 question 前缀、型号名、关键词匹配目录。
279
- - 禁止固定只输出 `Level 1/2/3`。
280
- - 禁止默认拆多个 Sheet。
281
- - 禁止把 `list-directories` 里的 `kuCount=0` 目录删除后再建索引。
282
- - 禁止只导出 KU ID 而丢掉 question / answer / directoryId。