@aigne/doc-smith 0.9.10 → 0.9.11-beta

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 (308) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +189 -219
  3. package/README.zh.md +270 -0
  4. package/agents/bash-executor/index.mjs +347 -0
  5. package/agents/clear/ai/intent.md +142 -0
  6. package/agents/clear/choose-contents.mjs +13 -65
  7. package/agents/clear/clear-auth-tokens.mjs +17 -21
  8. package/agents/clear/clear-deployment-config.mjs +33 -24
  9. package/agents/clear/index.yaml +1 -9
  10. package/agents/content-checker/ai/intent.md +209 -0
  11. package/agents/content-checker/clean-invalid-docs.mjs +254 -0
  12. package/agents/content-checker/index.mjs +191 -0
  13. package/agents/content-checker/validate-content.mjs +983 -0
  14. package/agents/generate-images/generate-image.yaml +75 -0
  15. package/agents/generate-images/generate-summary.mjs +213 -0
  16. package/agents/generate-images/index.yaml +39 -0
  17. package/agents/generate-images/prepare-generation.mjs +286 -0
  18. package/agents/generate-images/prepare-image-generation.mjs +130 -0
  19. package/{prompts/detail/diagram/generate-image-system.md → agents/generate-images/prompts/system.md} +22 -56
  20. package/agents/generate-images/prompts/user.md +85 -0
  21. package/agents/generate-images/save-image-result.mjs +247 -0
  22. package/agents/generate-images/scan-image-slots.mjs +247 -0
  23. package/agents/localize/index.yaml +19 -42
  24. package/{prompts/translate → agents/localize/prompts}/translate-document.md +0 -139
  25. package/agents/localize/translate-documents/generate-summary.mjs +163 -0
  26. package/agents/localize/translate-documents/load-glossary.mjs +52 -0
  27. package/agents/localize/translate-documents/prepare-translation.mjs +249 -0
  28. package/agents/localize/translate-documents/save-translation.mjs +171 -0
  29. package/agents/localize/translate-documents/translate-document-to-language.mjs +209 -0
  30. package/agents/localize/translate-documents/translate-document.yaml +23 -0
  31. package/agents/localize/translate-documents/translate-to-languages.yaml +10 -0
  32. package/agents/localize/translate-images/check-image-translation.mjs +225 -0
  33. package/agents/localize/translate-images/detect-text/detect-and-update-shared.mjs +148 -0
  34. package/agents/localize/translate-images/detect-text/detect-image-text.yaml +44 -0
  35. package/agents/localize/translate-images/detect-text/detect-images-text.yaml +21 -0
  36. package/agents/localize/translate-images/detect-text/prompts/detect-image-text-system.md +43 -0
  37. package/agents/localize/translate-images/detect-text/prompts/detect-image-text-user.md +14 -0
  38. package/agents/localize/translate-images/detect-text/save-text-detection.mjs +105 -0
  39. package/agents/localize/translate-images/prepare-image-input.mjs +124 -0
  40. package/agents/localize/translate-images/save-image-translation.mjs +172 -0
  41. package/agents/localize/translate-images/scan-doc-images.mjs +165 -0
  42. package/agents/localize/translate-images/translate-doc-images.yaml +24 -0
  43. package/agents/localize/{translate-diagram.yaml → translate-images/translate-image.yaml} +25 -14
  44. package/agents/publish/ai/intent.md +182 -0
  45. package/agents/publish/check.mjs +107 -0
  46. package/agents/publish/index.yaml +9 -14
  47. package/agents/publish/publish-docs.mjs +81 -61
  48. package/agents/publish/translate-meta.mjs +79 -58
  49. package/agents/save-document/index.mjs +260 -0
  50. package/agents/structure-checker/index.mjs +307 -0
  51. package/agents/structure-checker/validate-structure.mjs +477 -0
  52. package/agents/update-image/analyze-feedback.yaml +37 -0
  53. package/agents/update-image/index.yaml +78 -0
  54. package/agents/update-image/load-existing-image.mjs +211 -0
  55. package/agents/update-image/prompts/analyze-feedback-system.md +43 -0
  56. package/agents/update-image/prompts/analyze-feedback-user.md +15 -0
  57. package/aigne.yaml +26 -139
  58. package/package.json +16 -48
  59. package/scripts/README.md +90 -0
  60. package/scripts/install.sh +86 -0
  61. package/scripts/uninstall.sh +52 -0
  62. package/skills/doc-smith/SKILL.md +285 -0
  63. package/skills/doc-smith/ai/intent/sources-improve.md +290 -0
  64. package/skills/doc-smith/references/changeset-guide.md +171 -0
  65. package/skills/doc-smith/references/document-content-guide.md +214 -0
  66. package/skills/doc-smith/references/document-structure-schema.md +138 -0
  67. package/skills/doc-smith/references/patch-guide.md +96 -0
  68. package/skills/doc-smith/references/structure-confirmation-guide.md +133 -0
  69. package/skills/doc-smith/references/structure-planning-guide.md +149 -0
  70. package/skills/doc-smith/references/update-workflow.md +108 -0
  71. package/skills/doc-smith/references/user-intent-guide.md +175 -0
  72. package/skills/doc-smith/references/workspace-initialization.md +376 -0
  73. package/skills/doc-smith-docs-detail/SKILL.md +356 -0
  74. package/skills/doc-smith-docs-detail/ai/intent.md +271 -0
  75. package/skills-entry/doc-smith/ai/intent.md +260 -0
  76. package/skills-entry/doc-smith/index.mjs +66 -0
  77. package/skills-entry/doc-smith/prompt.md +57 -0
  78. package/skills-entry/doc-smith/utils.mjs +27 -0
  79. package/skills-entry/doc-smith-docs-detail/batch.yaml +56 -0
  80. package/skills-entry/doc-smith-docs-detail/index.mjs +95 -0
  81. package/skills-entry/doc-smith-docs-detail/prompt.md +64 -0
  82. package/utils/afs-factory.mjs +183 -0
  83. package/utils/agent-constants.mjs +97 -0
  84. package/utils/{auth-utils.mjs → auth.mjs} +6 -9
  85. package/{agents/utils/update-branding.mjs → utils/branding.mjs} +3 -4
  86. package/utils/config.mjs +261 -0
  87. package/utils/constants.mjs +32 -0
  88. package/utils/deploy.mjs +3 -3
  89. package/utils/docs-converter.mjs +454 -0
  90. package/utils/docs.mjs +212 -0
  91. package/utils/document-paths.mjs +172 -0
  92. package/utils/files.mjs +74 -0
  93. package/utils/git.mjs +65 -0
  94. package/utils/{blocklet.mjs → http.mjs} +18 -0
  95. package/utils/image-slots.mjs +57 -0
  96. package/utils/image-utils.mjs +114 -0
  97. package/utils/project.mjs +95 -0
  98. package/utils/sources-path-resolver.mjs +76 -0
  99. package/utils/{upload-files.mjs → upload.mjs} +3 -3
  100. package/utils/workspace.mjs +371 -0
  101. package/agents/chat/chat-system.md +0 -38
  102. package/agents/chat/index.mjs +0 -59
  103. package/agents/chat/skills/generate-document.yaml +0 -15
  104. package/agents/chat/skills/list-documents.mjs +0 -15
  105. package/agents/chat/skills/update-document.yaml +0 -24
  106. package/agents/clear/clear-document-config.mjs +0 -36
  107. package/agents/clear/clear-document-structure.mjs +0 -102
  108. package/agents/clear/clear-generated-docs.mjs +0 -142
  109. package/agents/clear/clear-media-description.mjs +0 -129
  110. package/agents/create/aggregate-document-structure.mjs +0 -21
  111. package/agents/create/analyze-diagram-type-llm.yaml +0 -159
  112. package/agents/create/analyze-diagram-type.mjs +0 -455
  113. package/agents/create/check-document-structure.yaml +0 -30
  114. package/agents/create/check-need-generate-structure.mjs +0 -138
  115. package/agents/create/document-structure-tools/add-document.mjs +0 -85
  116. package/agents/create/document-structure-tools/delete-document.mjs +0 -116
  117. package/agents/create/document-structure-tools/move-document.mjs +0 -109
  118. package/agents/create/document-structure-tools/update-document.mjs +0 -84
  119. package/agents/create/generate-diagram-image.yaml +0 -91
  120. package/agents/create/generate-structure.yaml +0 -106
  121. package/agents/create/index.yaml +0 -45
  122. package/agents/create/refine-document-structure.yaml +0 -12
  123. package/agents/create/replace-d2-with-image.mjs +0 -610
  124. package/agents/create/update-document-structure.yaml +0 -54
  125. package/agents/create/user-add-document/add-documents-to-structure.mjs +0 -90
  126. package/agents/create/user-add-document/find-documents-to-add-links.yaml +0 -47
  127. package/agents/create/user-add-document/index.yaml +0 -46
  128. package/agents/create/user-add-document/prepare-documents-to-translate.mjs +0 -22
  129. package/agents/create/user-add-document/print-add-document-summary.mjs +0 -63
  130. package/agents/create/user-add-document/review-documents-with-new-links.mjs +0 -110
  131. package/agents/create/user-remove-document/find-documents-with-invalid-links.mjs +0 -78
  132. package/agents/create/user-remove-document/index.yaml +0 -40
  133. package/agents/create/user-remove-document/prepare-documents-to-translate.mjs +0 -22
  134. package/agents/create/user-remove-document/print-remove-document-summary.mjs +0 -53
  135. package/agents/create/user-remove-document/remove-documents-from-structure.mjs +0 -99
  136. package/agents/create/user-remove-document/review-documents-with-invalid-links.mjs +0 -115
  137. package/agents/create/user-review-document-structure.mjs +0 -139
  138. package/agents/create/utils/init-current-content.mjs +0 -34
  139. package/agents/create/utils/merge-document-structures.mjs +0 -36
  140. package/agents/evaluate/code-snippet.mjs +0 -97
  141. package/agents/evaluate/document-structure.yaml +0 -67
  142. package/agents/evaluate/document.yaml +0 -82
  143. package/agents/evaluate/generate-report.mjs +0 -85
  144. package/agents/evaluate/index.yaml +0 -46
  145. package/agents/history/index.yaml +0 -6
  146. package/agents/history/view.mjs +0 -78
  147. package/agents/init/check.mjs +0 -16
  148. package/agents/init/index.mjs +0 -643
  149. package/agents/init/validate.mjs +0 -16
  150. package/agents/localize/choose-language.mjs +0 -107
  151. package/agents/localize/record-translation-history.mjs +0 -23
  152. package/agents/localize/save-doc-translation-or-skip.mjs +0 -18
  153. package/agents/localize/set-review-content.mjs +0 -58
  154. package/agents/localize/translate-document-wrapper.mjs +0 -34
  155. package/agents/localize/translate-document.yaml +0 -24
  156. package/agents/localize/translate-multilingual.yaml +0 -57
  157. package/agents/localize/translate-or-skip-diagram.mjs +0 -52
  158. package/agents/media/batch-generate-media-description.yaml +0 -46
  159. package/agents/media/generate-media-description.yaml +0 -50
  160. package/agents/media/load-media-description.mjs +0 -454
  161. package/agents/prefs/index.mjs +0 -203
  162. package/agents/schema/document-structure-item.yaml +0 -26
  163. package/agents/schema/document-structure-refine-item.yaml +0 -23
  164. package/agents/schema/document-structure.yaml +0 -29
  165. package/agents/update/batch-generate-document.yaml +0 -27
  166. package/agents/update/batch-update-document.yaml +0 -7
  167. package/agents/update/check-diagram-flag.mjs +0 -116
  168. package/agents/update/check-document.mjs +0 -162
  169. package/agents/update/check-generate-diagram.mjs +0 -106
  170. package/agents/update/check-update-is-single.mjs +0 -53
  171. package/agents/update/document-tools/update-document-content.mjs +0 -303
  172. package/agents/update/generate-diagram.yaml +0 -80
  173. package/agents/update/generate-document.yaml +0 -70
  174. package/agents/update/handle-document-update.yaml +0 -103
  175. package/agents/update/index.yaml +0 -69
  176. package/agents/update/pre-check-generate-diagram.yaml +0 -44
  177. package/agents/update/save-and-translate-document.mjs +0 -80
  178. package/agents/update/update-document-detail.yaml +0 -71
  179. package/agents/update/update-single/update-single-document-detail.mjs +0 -322
  180. package/agents/update/update-single-document.yaml +0 -7
  181. package/agents/update/user-review-document.mjs +0 -272
  182. package/agents/utils/action-success.mjs +0 -16
  183. package/agents/utils/analyze-document-feedback-intent.yaml +0 -32
  184. package/agents/utils/analyze-feedback-intent.mjs +0 -253
  185. package/agents/utils/analyze-structure-feedback-intent.yaml +0 -29
  186. package/agents/utils/check-detail-result.mjs +0 -51
  187. package/agents/utils/check-feedback-refiner.mjs +0 -81
  188. package/agents/utils/choose-docs.mjs +0 -251
  189. package/agents/utils/document-icon-generate.yaml +0 -52
  190. package/agents/utils/document-title-streamline.yaml +0 -48
  191. package/agents/utils/ensure-document-icons.mjs +0 -129
  192. package/agents/utils/exit.mjs +0 -6
  193. package/agents/utils/feedback-refiner.yaml +0 -50
  194. package/agents/utils/find-item-by-path.mjs +0 -114
  195. package/agents/utils/find-user-preferences-by-path.mjs +0 -37
  196. package/agents/utils/format-document-structure.mjs +0 -35
  197. package/agents/utils/generate-document-or-skip.mjs +0 -41
  198. package/agents/utils/handle-diagram-operations.mjs +0 -263
  199. package/agents/utils/load-all-document-content.mjs +0 -30
  200. package/agents/utils/load-document-all-content.mjs +0 -96
  201. package/agents/utils/load-sources.mjs +0 -405
  202. package/agents/utils/map-reasoning-effort-level.mjs +0 -15
  203. package/agents/utils/post-generate.mjs +0 -133
  204. package/agents/utils/read-current-document-content.mjs +0 -46
  205. package/agents/utils/save-doc-translation.mjs +0 -30
  206. package/agents/utils/save-doc.mjs +0 -54
  207. package/agents/utils/save-output.mjs +0 -26
  208. package/agents/utils/save-sidebar.mjs +0 -38
  209. package/agents/utils/skip-if-content-exists.mjs +0 -27
  210. package/agents/utils/streamline-document-titles-if-needed.mjs +0 -88
  211. package/agents/utils/transform-detail-data-sources.mjs +0 -45
  212. package/assets/report-template/report.html +0 -198
  213. package/docs-mcp/analyze-content-relevance.yaml +0 -50
  214. package/docs-mcp/analyze-docs-relevance.yaml +0 -59
  215. package/docs-mcp/docs-search.yaml +0 -42
  216. package/docs-mcp/get-docs-detail.mjs +0 -41
  217. package/docs-mcp/get-docs-structure.mjs +0 -16
  218. package/docs-mcp/read-doc-content.mjs +0 -119
  219. package/prompts/common/document/content-rules-core.md +0 -20
  220. package/prompts/common/document/markdown-syntax-rules.md +0 -65
  221. package/prompts/common/document/media-file-list-usage-rules.md +0 -18
  222. package/prompts/common/document/openapi-usage-rules.md +0 -189
  223. package/prompts/common/document/role-and-personality.md +0 -16
  224. package/prompts/common/document/user-preferences.md +0 -9
  225. package/prompts/common/document-structure/conflict-resolution-guidance.md +0 -16
  226. package/prompts/common/document-structure/document-icon-generate.md +0 -116
  227. package/prompts/common/document-structure/document-structure-rules.md +0 -43
  228. package/prompts/common/document-structure/document-title-streamline.md +0 -86
  229. package/prompts/common/document-structure/glossary.md +0 -7
  230. package/prompts/common/document-structure/intj-traits.md +0 -5
  231. package/prompts/common/document-structure/openapi-usage-rules.md +0 -28
  232. package/prompts/common/document-structure/output-constraints.md +0 -18
  233. package/prompts/common/document-structure/user-locale-rules.md +0 -10
  234. package/prompts/common/document-structure/user-preferences.md +0 -9
  235. package/prompts/detail/custom/admonition-usage-rules.md +0 -94
  236. package/prompts/detail/custom/code-block-usage-rules.md +0 -163
  237. package/prompts/detail/custom/custom-components/x-card-usage-rules.md +0 -63
  238. package/prompts/detail/custom/custom-components/x-cards-usage-rules.md +0 -83
  239. package/prompts/detail/custom/custom-components/x-field-desc-usage-rules.md +0 -120
  240. package/prompts/detail/custom/custom-components/x-field-group-usage-rules.md +0 -80
  241. package/prompts/detail/custom/custom-components/x-field-usage-rules.md +0 -189
  242. package/prompts/detail/custom/custom-components-usage-rules.md +0 -18
  243. package/prompts/detail/diagram/generate-image-user.md +0 -81
  244. package/prompts/detail/diagram/guide.md +0 -29
  245. package/prompts/detail/diagram/official-examples.md +0 -712
  246. package/prompts/detail/diagram/pre-check.md +0 -23
  247. package/prompts/detail/diagram/role-and-personality.md +0 -2
  248. package/prompts/detail/diagram/rules.md +0 -46
  249. package/prompts/detail/diagram/system-prompt.md +0 -1139
  250. package/prompts/detail/diagram/user-prompt.md +0 -43
  251. package/prompts/detail/generate/detail-example.md +0 -457
  252. package/prompts/detail/generate/document-rules.md +0 -45
  253. package/prompts/detail/generate/system-prompt.md +0 -61
  254. package/prompts/detail/generate/user-prompt.md +0 -99
  255. package/prompts/detail/jsx/rules.md +0 -6
  256. package/prompts/detail/update/system-prompt.md +0 -121
  257. package/prompts/detail/update/user-prompt.md +0 -41
  258. package/prompts/evaluate/document-structure.md +0 -93
  259. package/prompts/evaluate/document.md +0 -149
  260. package/prompts/media/media-description/system-prompt.md +0 -43
  261. package/prompts/media/media-description/user-prompt.md +0 -17
  262. package/prompts/structure/check-document-structure.md +0 -93
  263. package/prompts/structure/document-rules.md +0 -21
  264. package/prompts/structure/find-documents-to-add-links.md +0 -52
  265. package/prompts/structure/generate/system-prompt.md +0 -13
  266. package/prompts/structure/generate/user-prompt.md +0 -137
  267. package/prompts/structure/review/structure-review-system.md +0 -81
  268. package/prompts/structure/structure-example.md +0 -89
  269. package/prompts/structure/structure-getting-started.md +0 -10
  270. package/prompts/structure/update/system-prompt.md +0 -93
  271. package/prompts/structure/update/user-prompt.md +0 -43
  272. package/prompts/translate/admonition.md +0 -20
  273. package/prompts/translate/code-block.md +0 -33
  274. package/prompts/utils/analyze-document-feedback-intent.md +0 -54
  275. package/prompts/utils/analyze-structure-feedback-intent.md +0 -43
  276. package/prompts/utils/feedback-refiner.md +0 -105
  277. package/types/document-schema.mjs +0 -55
  278. package/types/document-structure-schema.mjs +0 -261
  279. package/utils/check-document-has-diagram.mjs +0 -95
  280. package/utils/conflict-detector.mjs +0 -149
  281. package/utils/constants/index.mjs +0 -620
  282. package/utils/constants/linter.mjs +0 -102
  283. package/utils/d2-utils.mjs +0 -205
  284. package/utils/debug.mjs +0 -3
  285. package/utils/delete-diagram-images.mjs +0 -99
  286. package/utils/diagram-version-utils.mjs +0 -14
  287. package/utils/docs-finder-utils.mjs +0 -548
  288. package/utils/evaluate/report-utils.mjs +0 -132
  289. package/utils/extract-api.mjs +0 -32
  290. package/utils/file-utils.mjs +0 -960
  291. package/utils/history-utils.mjs +0 -203
  292. package/utils/icon-map.mjs +0 -26
  293. package/utils/image-compress.mjs +0 -154
  294. package/utils/kroki-utils.mjs +0 -173
  295. package/utils/linter/index.mjs +0 -50
  296. package/utils/load-config.mjs +0 -78
  297. package/utils/markdown/index.mjs +0 -26
  298. package/utils/markdown-checker.mjs +0 -694
  299. package/utils/mermaid-validator.mjs +0 -140
  300. package/utils/mermaid-worker-pool.mjs +0 -250
  301. package/utils/mermaid-worker.mjs +0 -233
  302. package/utils/openapi/index.mjs +0 -28
  303. package/utils/preferences-utils.mjs +0 -175
  304. package/utils/request.mjs +0 -10
  305. package/utils/sync-diagram-to-translations.mjs +0 -272
  306. package/utils/translate-diagram-images.mjs +0 -807
  307. package/utils/utils.mjs +0 -1354
  308. /package/{prompts/translate → agents/localize/prompts}/glossary.md +0 -0
@@ -0,0 +1,182 @@
1
+ # Publish Agent 功能意图
2
+
3
+ ## 功能概述
4
+
5
+ 文档发布工具,将 DocSmith 生成的文档发布到在线平台。
6
+
7
+ ## 功能意图
8
+
9
+ DocSmith 生成的文档存储在本地 workspace 目录中,使用特定的目录结构(文件夹 + .meta.yaml + 语言文件)。用户需要将这些文档发布到在线平台供他人访问。Publish Agent 负责完成发布前检查、格式转换、图片处理和上传等全流程。
10
+
11
+ ## 工作流程
12
+
13
+ ```
14
+ 用户调用 publish
15
+
16
+ 1. check.mjs - 发布前检查
17
+ ├─ 检查配置文件存在性
18
+ ├─ 检查项目元数据(projectName、projectDesc、projectLogo)
19
+ │ └─ 如果为空,尝试自动更新
20
+ ├─ 检查文档结构(checkStructure)
21
+ └─ 检查文档内容(checkContent)
22
+
23
+ 2. translate-meta.mjs - 翻译元数据(可选)
24
+ ├─ 如果只有一种语言,跳过翻译,直接保存到缓存
25
+ └─ 如果有多种语言,将项目名称和描述翻译为目标语言
26
+
27
+ 3. publish-docs.mjs - 执行发布
28
+ ├─ 加载文档结构
29
+ ├─ docs-converter 转换文档格式
30
+ │ ├─ 扫描文档目录
31
+ │ ├─ 替换 AFS image slots 为真实图片
32
+ │ ├─ 处理 /sources/... 绝对路径图片 ← 本次新增
33
+ │ ├─ 添加 .md 后缀到内部链接
34
+ │ └─ 调整图片相对路径
35
+ ├─ 生成 _sidebar.md
36
+ ├─ 选择发布平台
37
+ └─ 上传文档到平台
38
+ ```
39
+
40
+ ## 核心能力
41
+
42
+ 1. **发布前检查**:验证配置、结构、内容的完整性和正确性
43
+ - 检查项目元数据(projectName、projectDesc、projectLogo)
44
+ - 若元数据为空,尝试自动填充更新
45
+ 2. **格式转换**:将 workspace 目录结构转换为发布格式
46
+ 3. **图片处理**:
47
+ - 替换 AFS image slots 为真实图片引用
48
+ - 处理 `/sources/...` 绝对路径图片,支持两种格式:
49
+ - Markdown 格式:`![alt](/sources/path/to/image.png)`
50
+ - HTML 格式:`<img src="/sources/path/to/image.png" ... />`
51
+ - 调整相对路径以适应发布后的目录结构
52
+ 4. **多平台支持**:DocSmith Cloud、自有网站、新建网站
53
+ 5. **元数据翻译**:支持将项目信息翻译为多语言
54
+ - 单语言时跳过翻译,直接缓存原始内容
55
+ - 多语言时才调用 AI 进行翻译
56
+
57
+ ## 输入输出
58
+
59
+ ### 输入
60
+
61
+ - 可选输入:
62
+ - `appUrl`: 发布目标网站 URL
63
+ - `boardId`: 文档集合 ID
64
+ - `projectName`, `projectDesc`, `projectLogo`: 项目信息
65
+ - `with-branding`: 是否更新网站品牌信息
66
+ - `translatedMetadata`: 翻译后的元数据
67
+
68
+ - 自动获取:
69
+ - 从 `config.yaml` 读取配置信息
70
+ - 从 `planning/document-structure.yaml` 读取文档结构
71
+ - 从 `docs/` 目录读取文档内容
72
+
73
+ ### 输出
74
+
75
+ - 输出内容:发布结果消息
76
+ - 成功:文档访问 URL
77
+ - 失败:错误信息和建议
78
+
79
+ ## 约束条件
80
+
81
+ ### 必须遵循的规范
82
+
83
+ 1. **发布前必须通过检查**:元数据检查、结构检查和内容检查都必须通过
84
+ - 元数据检查:projectName、projectDesc、projectLogo 不能为空
85
+ - 若元数据为空,尝试自动更新后重新检查
86
+ 2. **图片路径转换规则**:
87
+ - AFS image slots → 真实图片路径
88
+ - `/sources/...` → 复制图片并转换为相对路径
89
+ - 相对路径根据文档深度调整
90
+ 3. **链接格式**:内部链接添加 `.md` 后缀
91
+
92
+ ### Sources 绝对路径处理
93
+
94
+ 文档中使用 `/sources/...` 格式引用数据源中的图片时:
95
+
96
+ 1. **识别**:匹配 `/sources/` 开头的图片路径,支持两种格式:
97
+ - **Markdown 格式**:`![alt](/sources/path/to/image.png)`
98
+ - **HTML 格式**:`<img src="/sources/path/to/image.png" ... />`
99
+ 2. **解析**:从 config.yaml 获取 sources 配置,依次在每个 source 中查找图片
100
+ 3. **复制**:将源图片复制到临时目录的 `sources/` 子目录(保持相同路径结构)
101
+ 4. **转换**:将绝对路径替换为相对路径(根据文档深度计算)
102
+
103
+ **Markdown 格式转换示例**:
104
+ ```
105
+ 原始:![screenshot](/sources/assets/screenshot.png)
106
+ 转换后:![screenshot](../sources/assets/screenshot.png)(depth=1)
107
+ ![screenshot](../../sources/assets/screenshot.png)(depth=2)
108
+ ```
109
+
110
+ **HTML 格式转换示例**:
111
+ ```
112
+ 原始:<img src="/sources/blocklets/core/public/logo/doubao.png" alt="Doubao" style="width: 48px;" />
113
+ 转换后:<img src="../sources/blocklets/core/public/logo/doubao.png" alt="Doubao" style="width: 48px;" />(depth=1)
114
+ <img src="../../sources/blocklets/core/public/logo/doubao.png" alt="Doubao" style="width: 48px;" />(depth=2)
115
+ ```
116
+
117
+ ### 职责边界
118
+
119
+ - **必须执行**:
120
+ - 发布前检查配置、元数据和文档
121
+ - 元数据为空时尝试自动更新
122
+ - 转换文档格式到发布格式
123
+ - 处理所有图片路径(包括 sources 绝对路径)
124
+ - 上传文档到指定平台
125
+
126
+ - **不应执行**:
127
+ - 不修改原始文档文件
128
+ - 不修改文档结构文件
129
+ - 不生成新文档内容
130
+
131
+ - **协作方式**:
132
+ - 依赖 `structure-checker` 检查文档结构
133
+ - 依赖 `content-checker` 检查文档内容
134
+ - 依赖 `docs-converter.mjs` 转换文档格式
135
+ - 依赖 `sources-path-resolver.mjs` 解析 sources 路径
136
+ - 依赖 `@aigne/publish-docs` 执行实际上传
137
+
138
+ ## 预期结果
139
+
140
+ ### 成功标准
141
+
142
+ 1. 文档成功发布到在线平台
143
+ 2. 所有图片正确显示(包括 sources 中的图片)
144
+ 3. 所有内部链接正常工作
145
+ 4. 返回可访问的文档 URL
146
+
147
+ ## 错误处理
148
+
149
+ ### 常见错误
150
+
151
+ 1. **检查失败**:配置缺失、元数据不完整、结构错误、内容问题
152
+ 2. **认证失败**:无效的访问令牌
153
+ 3. **网络错误**:上传失败
154
+ 4. **图片处理失败**:图片不存在、路径无法解析
155
+
156
+ ### 处理策略
157
+
158
+ 1. **检查失败**:
159
+ - 元数据为空时,尝试自动更新后继续
160
+ - 自动更新失败或其他检查失败,抛出错误提示用户修复
161
+ 2. **认证失败**:提示用户重新认证
162
+ 3. **网络错误**:返回错误消息
163
+ 4. **图片处理**:跳过无法处理的图片并警告
164
+
165
+ ## 实现方式
166
+
167
+ ### 文件组成
168
+
169
+ - `index.yaml`: Agent 配置,定义 skills 列表
170
+ - `check.mjs`: 发布前检查
171
+ - `translate-meta.mjs`: 元数据翻译
172
+ - `publish-docs.mjs`: 发布主流程
173
+
174
+ ### 依赖工具
175
+
176
+ - `utils/docs-converter.mjs`: 文档格式转换
177
+ - `utils/sources-path-resolver.mjs`: sources 路径解析
178
+ - `utils/config.mjs`: 配置文件操作
179
+ - `@aigne/publish-docs`: 发布上传
180
+
181
+ ---
182
+ **注意**:本文档描述功能意图,不包含具体实现细节。
@@ -0,0 +1,107 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { loadConfigFromFile, saveValueToConfig } from "../../utils/config.mjs";
4
+ import { PATHS } from "../../utils/agent-constants.mjs";
5
+ import checkStructure from "../structure-checker/index.mjs";
6
+ import checkContent from "../content-checker/index.mjs";
7
+ import { getProjectInfo } from "../../utils/project.mjs";
8
+
9
+ /**
10
+ * Check configuration and documents before publishing
11
+ * @param {Object} params
12
+ * @param {string} params.fileName - Config file name (relative to workspace)
13
+ * @returns {Promise<Object>} - Result object with valid flag and message
14
+ */
15
+ export default async function check({ fileName = "config.yaml" } = {}, _options) {
16
+ // 1. Check configuration
17
+ // Use PATHS.WORKSPACE_BASE to support both project and standalone modes
18
+ const filePath = join(PATHS.WORKSPACE_BASE, fileName);
19
+ const configContent = await readFile(filePath, "utf8").catch(() => null);
20
+
21
+ if (!configContent || configContent.trim() === "") {
22
+ throw new Error(
23
+ "Configuration file not found or is empty. Please ensure the workspace is properly initialized with a valid configuration file.",
24
+ );
25
+ }
26
+
27
+ const config = await loadConfigFromFile();
28
+
29
+ // 2. Check and populate project metadata if not exists
30
+ const missingFields = [];
31
+ if (!config.projectName || config.projectName.trim() === "") missingFields.push("projectName");
32
+ if (!config.projectDesc || config.projectDesc.trim() === "") missingFields.push("projectDesc");
33
+ if (!config.projectLogo || config.projectLogo.trim() === "") missingFields.push("projectLogo");
34
+
35
+ if (missingFields.length > 0) {
36
+ try {
37
+ const projectInfo = await getProjectInfo();
38
+
39
+ if (
40
+ missingFields.includes("projectName") &&
41
+ projectInfo.name &&
42
+ projectInfo.name.trim() !== ""
43
+ ) {
44
+ await saveValueToConfig("projectName", projectInfo.name, "Project name");
45
+ config.projectName = projectInfo.name;
46
+ }
47
+
48
+ if (
49
+ missingFields.includes("projectDesc") &&
50
+ projectInfo.description &&
51
+ projectInfo.description.trim() !== ""
52
+ ) {
53
+ await saveValueToConfig("projectDesc", projectInfo.description, "Project description");
54
+ config.projectDesc = projectInfo.description;
55
+ }
56
+
57
+ if (
58
+ missingFields.includes("projectLogo") &&
59
+ projectInfo.icon &&
60
+ projectInfo.icon.trim() !== ""
61
+ ) {
62
+ await saveValueToConfig("projectLogo", projectInfo.icon, "Project logo or icon");
63
+ config.projectLogo = projectInfo.icon;
64
+ }
65
+ } catch (error) {
66
+ console.warn("Failed to get project info:", error.message);
67
+ }
68
+ }
69
+
70
+ // 3. Check document structure
71
+ const structureResult = await checkStructure();
72
+
73
+ // If structure check failed and not fixed, throw error
74
+ if (!structureResult.valid && !structureResult.fixed) {
75
+ throw new Error(
76
+ `Document structure validation failed:\n${structureResult.message}\n\nPlease fix the structure issues before publishing.`,
77
+ );
78
+ }
79
+
80
+ // 4. Check document content
81
+ const contentResult = await checkContent();
82
+
83
+ // If content check failed and not fixed, throw error
84
+ if (!contentResult.valid && !contentResult.fixed) {
85
+ throw new Error(
86
+ `Document content validation failed:\n${contentResult.message}\n\nPlease fix the content issues before publishing.`,
87
+ );
88
+ }
89
+
90
+ return {
91
+ valid: true,
92
+ config,
93
+ message: "✅ Configuration and document checks passed.",
94
+ };
95
+ }
96
+
97
+ check.description = "Check configuration and documents before publishing";
98
+
99
+ check.input_schema = {
100
+ type: "object",
101
+ properties: {
102
+ fileName: {
103
+ type: "string",
104
+ description: "Config file name",
105
+ },
106
+ },
107
+ };
@@ -3,23 +3,18 @@ name: publish
3
3
  alias:
4
4
  - pub
5
5
  - p
6
- description: Publish your documentation online
6
+ description: Publish DocSmith generated documentation to the online platform
7
7
  skills:
8
- - url: ../init/index.mjs
9
- default_input:
10
- skipIfExists: true
11
- checkOnly: true
12
- - url: ../init/check.mjs
13
- - url: ../utils/load-sources.mjs
14
- - ../utils/ensure-document-icons.mjs
15
- - translate-meta.mjs
16
- - publish-docs.mjs
8
+ - url: ./check.mjs
9
+ - url: ./translate-meta.mjs
10
+ - url: ./publish-docs.mjs
11
+
17
12
  input_schema:
18
13
  type: object
19
14
  properties:
20
15
  appUrl:
21
16
  type: string
22
- description: Website URL where docs will be published (optional - leave empty for interactive setup)
23
- with-branding:
24
- type: boolean
25
- description: Update your website branding (title, description, logo)
17
+ description: |
18
+ Website URL where docs will be published.
19
+ The URL from the last publish will be saved in config.yaml `appUrl` and used as the default for the next publish.
20
+ Optional: Only used if a specific website URL is provided by the user.
@@ -1,68 +1,80 @@
1
- import { basename, join } from "node:path";
1
+ import { basename, join, relative } from "node:path";
2
2
  import { publishDocs as publishDocsFn } from "@aigne/publish-docs";
3
3
  import { BrokerClient } from "@blocklet/payment-broker-client/node";
4
4
  import chalk from "chalk";
5
5
  import fs from "fs-extra";
6
+ import { joinURL } from "ufo";
6
7
 
7
8
  import {
8
9
  getAccessToken,
9
10
  getCachedAccessToken,
10
11
  getDiscussKitMountPoint,
11
- } from "../../utils/auth-utils.mjs";
12
- import {
13
- CLOUD_SERVICE_URL_PROD,
14
- DISCUSS_KIT_STORE_URL,
15
- DOC_SMITH_DIR,
16
- TMP_DIR,
17
- TMP_DOCS_DIR,
18
- } from "../../utils/constants/index.mjs";
19
- import { ensureTmpDir } from "../../utils/d2-utils.mjs";
12
+ } from "../../utils/auth.mjs";
13
+ import { CLOUD_SERVICE_URL_PROD, DISCUSS_KIT_STORE_URL } from "../../utils/constants.mjs";
14
+ import { PATHS } from "../../utils/agent-constants.mjs";
20
15
  import { deploy } from "../../utils/deploy.mjs";
21
- import { getGithubRepoUrl, loadConfigFromFile, saveValueToConfig } from "../../utils/utils.mjs";
22
- import updateBranding from "../utils/update-branding.mjs";
23
- import { isRemoteFile, downloadAndUploadImage } from "../../utils/file-utils.mjs";
24
- import { joinURL } from "ufo";
16
+ import { loadConfigFromFile, saveValueToConfig } from "../../utils/config.mjs";
17
+ import { ensureTmpDir } from "../../utils/files.mjs";
18
+ import { getGithubRepoUrl, isValidGithubUrl } from "../../utils/git.mjs";
19
+ import updateBranding from "../../utils/branding.mjs";
20
+ import { generateSidebar, loadDocumentStructure } from "../../utils/docs.mjs";
21
+ import { copyDocumentsToTemp } from "../../utils/docs-converter.mjs";
25
22
 
26
23
  const BASE_URL = process.env.DOC_SMITH_BASE_URL || CLOUD_SERVICE_URL_PROD;
27
24
 
28
25
  export default async function publishDocs(
29
26
  {
30
- docsDir: rawDocsDir,
31
27
  appUrl,
32
- boardId,
33
- projectName,
34
- projectDesc,
35
- projectLogo,
36
- translatedMetadata,
37
- originalDocumentStructure,
28
+ outputDir = PATHS.PLANNING_DIR,
38
29
  "with-branding": withBrandingOption,
30
+ config,
31
+ translatedMetadata,
39
32
  },
40
33
  options,
41
34
  ) {
35
+ // Note: Document validation is now done in check.mjs which throws errors on failure
36
+
37
+ // Absolute path for file operations (reading docs)
38
+ const docsAbsolutePath = PATHS.DOCS_DIR;
39
+ // Relative path for mediaFolder (relative to cwd for publish-docs library)
40
+ const docsRelativePath = relative(process.cwd(), PATHS.DOCS_DIR) || "./docs";
41
+ // Relative path for tmp directory
42
+ const tmpDirRelative = relative(process.cwd(), PATHS.TMP_DIR) || ".tmp";
43
+ const docsDir = join(tmpDirRelative, "docs");
42
44
  let message;
43
45
  let shouldWithBranding = withBrandingOption || false;
44
46
 
45
47
  try {
48
+ // Load document structure from output directory
49
+ const documentStructure = await loadDocumentStructure(outputDir);
50
+ if (!documentStructure || documentStructure.length === 0) {
51
+ console.warn("⚠️ No document structure found. Sidebar generation may be limited.");
52
+ }
53
+
46
54
  // move work dir to tmp-dir
47
55
  await ensureTmpDir();
48
-
49
- const docsDir = join(DOC_SMITH_DIR, TMP_DIR, TMP_DOCS_DIR);
50
56
  await fs.rm(docsDir, { recursive: true, force: true });
51
57
  await fs.mkdir(docsDir, {
52
58
  recursive: true,
53
59
  });
54
- await fs.cp(rawDocsDir, docsDir, { recursive: true });
60
+
61
+ // Convert documents from new directory format to publish format
62
+ await copyDocumentsToTemp(docsAbsolutePath, docsDir);
63
+
64
+ // Generate _sidebar.md in tmp directory
65
+ const sidebar = generateSidebar(documentStructure || []);
66
+ const tmpSidebarPath = join(docsDir, "_sidebar.md");
67
+ await fs.writeFile(tmpSidebarPath, sidebar, "utf8");
55
68
 
56
69
  // ----------------- main publish process flow -----------------------------
57
70
  // Check if DOC_DISCUSS_KIT_URL is set in environment variables
58
- const useEnvAppUrl = !!(
59
- process.env.DOC_SMITH_PUBLISH_URL ||
60
- process.env.DOC_DISCUSS_KIT_URL ||
61
- appUrl
62
- );
71
+ const useEnvAppUrl = !!(process.env.DOC_SMITH_PUBLISH_URL || process.env.DOC_DISCUSS_KIT_URL);
63
72
 
64
- // Check if appUrl is default and not saved in config (only when not using env variable)
65
- const config = await loadConfigFromFile();
73
+ // Use config from parameters or load from file as fallback
74
+ if (!config) {
75
+ config = await loadConfigFromFile();
76
+ }
77
+ const { projectName, projectDesc, projectLogo, boardId } = config || {};
66
78
  appUrl =
67
79
  process.env.DOC_SMITH_PUBLISH_URL ||
68
80
  process.env.DOC_DISCUSS_KIT_URL ||
@@ -81,7 +93,10 @@ export default async function publishDocs(
81
93
 
82
94
  sessionId = "";
83
95
  if (officialAccessToken) {
84
- client = new BrokerClient({ baseUrl: BASE_URL, authToken: officialAccessToken });
96
+ client = new BrokerClient({
97
+ baseUrl: BASE_URL,
98
+ authToken: officialAccessToken,
99
+ });
85
100
  const info = await client.checkCacheSession({
86
101
  needShortUrl: true,
87
102
  sessionId: config?.checkoutId,
@@ -185,7 +200,9 @@ export default async function publishDocs(
185
200
  locale = data?.preferredLocale || locale;
186
201
  } catch (error) {
187
202
  const errorMsg = error?.message || "Unknown error occurred";
188
- return { message: `${chalk.red("❌ Failed to create website:")} ${errorMsg}` };
203
+ return {
204
+ message: `${chalk.red("❌ Failed to create website:")} ${errorMsg}`,
205
+ };
189
206
  }
190
207
  }
191
208
  }
@@ -204,7 +221,7 @@ export default async function publishDocs(
204
221
  process.env.DOC_ROOT_DIR = docsDir;
205
222
 
206
223
  const sidebarPath = join(docsDir, "_sidebar.md");
207
- const publishCacheFilePath = join(DOC_SMITH_DIR, "upload-cache.yaml");
224
+ const publishCacheFilePath = join(PATHS.CACHE, "upload-cache.yaml");
208
225
 
209
226
  // Get project info from config
210
227
  const projectInfo = {
@@ -212,46 +229,39 @@ export default async function publishDocs(
212
229
  description: projectDesc || config?.projectDesc || "",
213
230
  icon: projectLogo || config?.projectLogo || "",
214
231
  };
215
- let finalPath = null;
216
232
 
217
233
  console.log(`Publishing docs collection: ${chalk.cyan(projectInfo.name || boardId)}\n`);
218
234
 
219
- // Handle project logo download if it's a URL
220
- if (projectInfo.icon && isRemoteFile(projectInfo.icon)) {
221
- const { url: uploadedImageUrl, downloadFinalPath } = await downloadAndUploadImage(
222
- projectInfo.icon,
223
- docsDir,
224
- discussKitUrl,
225
- accessToken,
226
- );
227
- projectInfo.icon = uploadedImageUrl;
228
- finalPath = downloadFinalPath;
229
- }
230
-
235
+ // Skip image download - use icon URL directly
231
236
  if (shouldWithBranding) {
232
- updateBranding({ appUrl: discussKitUrl, projectInfo, accessToken, finalPath });
233
- }
234
-
235
- const iconMap = {};
236
- for (const item of originalDocumentStructure) {
237
- if (item.icon) {
238
- iconMap[item.title] = item.icon;
239
- }
237
+ updateBranding({ appUrl: discussKitUrl, projectInfo, accessToken });
240
238
  }
241
239
 
242
240
  // Construct boardMeta object
241
+ // In standalone mode, get GitHub URL from git-clone type source in sources array
242
+ // In project mode, use current git repo URL (even if git-clone sources exist as supplements)
243
+ let githubRepoUrl = getGithubRepoUrl();
244
+ if (config?.mode === "standalone") {
245
+ const gitCloneSource = config?.sources?.find((s) => s.type === "git-clone");
246
+ const configUrl = gitCloneSource?.url;
247
+ // Only use config URL if it's a valid GitHub URL
248
+ githubRepoUrl = isValidGithubUrl(configUrl) ? configUrl : "";
249
+ }
243
250
  const boardMeta = {
244
251
  category: config?.documentPurpose || [],
245
- githubRepoUrl: getGithubRepoUrl(),
252
+ githubRepoUrl,
246
253
  commitSha: config?.lastGitHead || "",
247
254
  languages: [
248
255
  ...(config?.locale ? [config.locale] : []),
249
256
  ...(config?.translateLanguages || []),
250
257
  ].filter((lang, index, arr) => arr.indexOf(lang) === index), // Remove duplicates
251
258
  };
259
+
260
+ // Add translatedMetadata if available
252
261
  if (translatedMetadata) {
253
262
  boardMeta.translation = translatedMetadata;
254
263
  }
264
+
255
265
  const {
256
266
  success,
257
267
  boardId: newBoardId,
@@ -267,10 +277,9 @@ export default async function publishDocs(
267
277
  boardName: projectInfo.name,
268
278
  boardDesc: projectInfo.description,
269
279
  boardCover: projectInfo.icon,
270
- mediaFolder: rawDocsDir,
280
+ mediaFolder: docsRelativePath,
271
281
  cacheFilePath: publishCacheFilePath,
272
282
  boardMeta,
273
- iconMap,
274
283
  });
275
284
 
276
285
  // Save values to config.yaml if publish was successful
@@ -303,14 +312,13 @@ export default async function publishDocs(
303
312
  }
304
313
 
305
314
  // clean up tmp work dir
306
- await fs.rm(docsDir, { recursive: true, force: true });
315
+ await fs.rm(tmpDirRelative, { recursive: true, force: true });
307
316
  } catch (error) {
308
317
  message = `❌ Sorry, I encountered an error while publishing your documentation: \n\n${error.message}`;
309
318
 
310
319
  // clean up tmp work dir in case of error
311
320
  try {
312
- const docsDir = join(DOC_SMITH_DIR, TMP_DIR, TMP_DOCS_DIR);
313
- await fs.rm(docsDir, { recursive: true, force: true });
321
+ await fs.rm(tmpDirRelative, { recursive: true, force: true });
314
322
  } catch {
315
323
  // Ignore cleanup errors
316
324
  }
@@ -322,10 +330,18 @@ export default async function publishDocs(
322
330
  publishDocs.input_schema = {
323
331
  type: "object",
324
332
  properties: {
333
+ config: {
334
+ type: "object",
335
+ description: "Configuration object from check step.",
336
+ },
325
337
  docsDir: {
326
338
  type: "string",
327
339
  description: "The directory of the documentation.",
328
340
  },
341
+ outputDir: {
342
+ type: "string",
343
+ description: "Output directory containing document structure file (default: ./planning).",
344
+ },
329
345
  appUrl: {
330
346
  type: "string",
331
347
  description: "The URL of the app.",
@@ -350,6 +366,10 @@ publishDocs.input_schema = {
350
366
  type: "string",
351
367
  description: "The logo or icon of the project.",
352
368
  },
369
+ translatedMetadata: {
370
+ type: "object",
371
+ description: "Translated metadata (title and description) for multiple languages.",
372
+ },
353
373
  },
354
374
  };
355
375