@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,254 @@
1
+ import { readdir, readFile, rm, stat } from "node:fs/promises";
2
+ import { parse as yamlParse } from "yaml";
3
+ import path from "node:path";
4
+ import { loadDocumentPaths } from "../../utils/document-paths.mjs";
5
+ import { PATHS } from "../../utils/agent-constants.mjs";
6
+
7
+ /**
8
+ * Invalid Document Cleaner
9
+ * Delete document files and folders that should not exist before content checking
10
+ */
11
+
12
+ /**
13
+ * Recursively scan docs directory, collect all document folder paths
14
+ * @param {string} docsDir - Document root directory
15
+ * @param {string} relativePath - Current relative path
16
+ * @returns {Promise<string[]>} - Document path array (without slash prefix)
17
+ */
18
+ async function scanDocsFolders(docsDir, relativePath = "") {
19
+ const folders = [];
20
+ const currentDir = path.join(docsDir, relativePath);
21
+
22
+ try {
23
+ const entries = await readdir(currentDir, { withFileTypes: true });
24
+
25
+ for (const entry of entries) {
26
+ if (!entry.isDirectory()) continue;
27
+ if (entry.name.startsWith(".")) continue; // Skip hidden folders
28
+
29
+ const folderRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
30
+ const folderFullPath = path.join(currentDir, entry.name);
31
+
32
+ // Check if it's a document folder (contains .meta.yaml)
33
+ const metaPath = path.join(folderFullPath, ".meta.yaml");
34
+ try {
35
+ await stat(metaPath);
36
+ // .meta.yaml exists, it's a document folder
37
+ folders.push(folderRelativePath);
38
+ } catch (_error) {
39
+ // .meta.yaml doesn't exist, may be an intermediate directory, continue recursion
40
+ }
41
+
42
+ // Recursively scan subdirectories
43
+ const subFolders = await scanDocsFolders(docsDir, folderRelativePath);
44
+ folders.push(...subFolders);
45
+ }
46
+ } catch (_error) {
47
+ // Directory doesn't exist or cannot be read, return empty array
48
+ }
49
+
50
+ return folders;
51
+ }
52
+
53
+ /**
54
+ * Get valid language list defined in .meta.yaml
55
+ * @param {string} metaPath - .meta.yaml file path
56
+ * @returns {Promise<Set<string>|null>} - Valid language set, returns null if parsing fails
57
+ */
58
+ async function getValidLanguages(metaPath) {
59
+ try {
60
+ const content = await readFile(metaPath, "utf8");
61
+ const meta = yamlParse(content);
62
+
63
+ const languages = new Set();
64
+
65
+ // Get languages from source and default fields
66
+ if (meta.source) languages.add(meta.source);
67
+ if (meta.default) languages.add(meta.default);
68
+
69
+ // If there's a languages field, add those too
70
+ if (meta.languages && Array.isArray(meta.languages)) {
71
+ for (const lang of meta.languages) {
72
+ languages.add(lang);
73
+ }
74
+ }
75
+
76
+ return languages.size > 0 ? languages : null;
77
+ } catch (_error) {
78
+ return null;
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Extract language code from filename
84
+ * @param {string} filename - Filename
85
+ * @returns {string|null} - Language code (filename without .md suffix), e.g., "zh", "en", "claude-code"
86
+ */
87
+ function extractLanguageFromFilename(filename) {
88
+ if (!filename.endsWith(".md")) return null;
89
+ // Return filename without .md suffix as language identifier
90
+ return filename.slice(0, -3);
91
+ }
92
+
93
+ /**
94
+ * Clean invalid documents
95
+ * @param {Object} options - Clean options
96
+ * @param {string} options.yamlPath - Document structure file path
97
+ * @param {string} options.docsDir - Document directory path
98
+ * @param {boolean} options.dryRun - Whether in preview mode (only report, don't delete)
99
+ * @returns {Promise<Object>} - Clean result
100
+ */
101
+ export async function cleanInvalidDocs({
102
+ yamlPath = PATHS.DOCUMENT_STRUCTURE,
103
+ docsDir = PATHS.DOCS_DIR,
104
+ dryRun = false,
105
+ } = {}) {
106
+ const result = {
107
+ dryRun,
108
+ deletedFolders: [],
109
+ deletedFiles: [],
110
+ errors: [],
111
+ };
112
+
113
+ try {
114
+ // 1. Load valid paths from document structure
115
+ let validPaths;
116
+ try {
117
+ validPaths = await loadDocumentPaths({ yamlPath, includeBothFormats: false });
118
+ } catch (_error) {
119
+ // Document structure file doesn't exist, cannot clean
120
+ return result;
121
+ }
122
+
123
+ // 2. Scan docs directory for actually existing document folders
124
+ const existingFolders = await scanDocsFolders(docsDir);
125
+
126
+ // 3. Find invalid document folders (exist in filesystem but not in document-structure.yaml)
127
+ const invalidFolders = existingFolders.filter((folder) => !validPaths.has(folder));
128
+
129
+ // 4. Delete invalid document folders (or only record in dry-run mode)
130
+ for (const folder of invalidFolders) {
131
+ const folderPath = path.join(docsDir, folder);
132
+ if (dryRun) {
133
+ // dry-run mode: only record, don't delete
134
+ result.deletedFolders.push(folder);
135
+ } else {
136
+ try {
137
+ await rm(folderPath, { recursive: true });
138
+ result.deletedFolders.push(folder);
139
+ } catch (error) {
140
+ result.errors.push({
141
+ type: "DELETE_FOLDER_ERROR",
142
+ path: folder,
143
+ message: error.message,
144
+ });
145
+ }
146
+ }
147
+ }
148
+
149
+ // 5. For valid document folders, clean invalid language files
150
+ const validFolders = existingFolders.filter((folder) => validPaths.has(folder));
151
+
152
+ for (const folder of validFolders) {
153
+ const folderPath = path.join(docsDir, folder);
154
+ const metaPath = path.join(folderPath, ".meta.yaml");
155
+
156
+ // Get valid language list
157
+ const validLanguages = await getValidLanguages(metaPath);
158
+ if (!validLanguages) continue; // Cannot parse meta, skip
159
+
160
+ // Scan all .md files in folder
161
+ try {
162
+ const files = await readdir(folderPath);
163
+
164
+ for (const file of files) {
165
+ // Skip non-.md files and hidden files
166
+ if (!file.endsWith(".md") || file.startsWith(".")) continue;
167
+
168
+ const lang = extractLanguageFromFilename(file);
169
+ if (!lang) continue; // Not a language file format, skip
170
+
171
+ // Check if language is in valid list
172
+ if (!validLanguages.has(lang)) {
173
+ const filePath = path.join(folderPath, file);
174
+ if (dryRun) {
175
+ // dry-run mode: only record, don't delete
176
+ result.deletedFiles.push(`${folder}/${file}`);
177
+ } else {
178
+ try {
179
+ await rm(filePath);
180
+ result.deletedFiles.push(`${folder}/${file}`);
181
+ } catch (error) {
182
+ result.errors.push({
183
+ type: "DELETE_FILE_ERROR",
184
+ path: `${folder}/${file}`,
185
+ message: error.message,
186
+ });
187
+ }
188
+ }
189
+ }
190
+ }
191
+ } catch (error) {
192
+ result.errors.push({
193
+ type: "READ_FOLDER_ERROR",
194
+ path: folder,
195
+ message: error.message,
196
+ });
197
+ }
198
+ }
199
+ } catch (error) {
200
+ result.errors.push({
201
+ type: "CLEAN_ERROR",
202
+ message: error.message,
203
+ });
204
+ }
205
+
206
+ return result;
207
+ }
208
+
209
+ /**
210
+ * Format clean result as string
211
+ * @param {Object} result - Clean result
212
+ * @returns {string} - Formatted output
213
+ */
214
+ export function formatCleanResult(result) {
215
+ const { dryRun, deletedFolders, deletedFiles, errors } = result;
216
+
217
+ if (deletedFolders.length === 0 && deletedFiles.length === 0 && errors.length === 0) {
218
+ return "";
219
+ }
220
+
221
+ let output = "";
222
+ const actionVerb = dryRun ? "Will delete" : "Deleted";
223
+ const modeIndicator = dryRun ? " [Preview Mode]" : "";
224
+
225
+ if (deletedFolders.length > 0 || deletedFiles.length > 0) {
226
+ output += `Layer 0: Invalid document cleanup${modeIndicator}\n`;
227
+
228
+ if (deletedFolders.length > 0) {
229
+ output += ` ${actionVerb} invalid document folders: ${deletedFolders.length}\n`;
230
+ for (const folder of deletedFolders) {
231
+ output += ` - ${folder}/\n`;
232
+ }
233
+ }
234
+
235
+ if (deletedFiles.length > 0) {
236
+ output += ` ${actionVerb} invalid language files: ${deletedFiles.length}\n`;
237
+ for (const file of deletedFiles) {
238
+ output += ` - ${file}\n`;
239
+ }
240
+ }
241
+
242
+ output += "\n";
243
+ }
244
+
245
+ if (errors.length > 0) {
246
+ output += "Cleanup errors:\n";
247
+ for (const error of errors) {
248
+ output += ` - ${error.path || ""}: ${error.message}\n`;
249
+ }
250
+ output += "\n";
251
+ }
252
+
253
+ return output;
254
+ }
@@ -0,0 +1,191 @@
1
+ import { access } from "node:fs/promises";
2
+ import { constants } from "node:fs";
3
+ import validateDocumentContent from "./validate-content.mjs";
4
+ import { cleanInvalidDocs, formatCleanResult } from "./clean-invalid-docs.mjs";
5
+ import { PATHS } from "../../utils/agent-constants.mjs";
6
+
7
+ /**
8
+ * Document Content Fixer Class
9
+ *
10
+ * Note: Current version is mainly for future extension, specific auto-fix functionality is not yet implemented
11
+ * Document content fixes usually require manual judgment due to semantic issues like link targets and image content
12
+ */
13
+ class DocumentContentFixer {
14
+ constructor() {
15
+ this.fixCount = 0;
16
+ }
17
+
18
+ /**
19
+ * Apply all fixes
20
+ */
21
+ async applyFixes(errors, docsDir) {
22
+ for (const error of errors) {
23
+ await this.applyFix(error, docsDir);
24
+ }
25
+ return this.fixCount;
26
+ }
27
+
28
+ /**
29
+ * Apply single fix
30
+ */
31
+ async applyFix(_error, _docsDir) {
32
+ // Current version does not implement auto-fix
33
+ // Future additions may include:
34
+ // - Link format correction (adding .md suffix, etc.)
35
+ // - Image path level correction
36
+ // - Markdown format optimization
37
+ return;
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Main function - Intelligent Content Checker
43
+ * @param {Object} params - Check parameters
44
+ * @param {string[]} params.docs - Array of document paths to check, e.g., ["/overview", "/api/introduction"], checks all documents if not provided
45
+ * @returns {Promise<Object>} - Check and fix result
46
+ */
47
+ export default async function checkContent({ docs = undefined } = {}) {
48
+ const yamlPath = PATHS.DOCUMENT_STRUCTURE;
49
+ const docsDir = PATHS.DOCS_DIR;
50
+ const autoFix = true;
51
+ const checkRemoteImages = true;
52
+ try {
53
+ // 1. Check if file exists
54
+ try {
55
+ await access(yamlPath, constants.F_OK);
56
+ } catch (_error) {
57
+ return {
58
+ success: false,
59
+ valid: false,
60
+ fileNotFound: true,
61
+ message:
62
+ `❌ File not found: ${yamlPath}\n\n` +
63
+ `Possible reasons:\n` +
64
+ `1. Incorrect file path - please check if you are in the correct workspace directory\n` +
65
+ `2. Incorrect file name - confirm the file name is ${yamlPath}\n` +
66
+ `3. Document structure not yet generated - please execute step 4 to generate ${yamlPath}\n`,
67
+ };
68
+ }
69
+
70
+ // Check if document directory exists
71
+ try {
72
+ await access(docsDir, constants.F_OK);
73
+ } catch (_error) {
74
+ return {
75
+ success: false,
76
+ valid: false,
77
+ message:
78
+ `❌ Document directory not found: ${docsDir}/\n\n` +
79
+ `Possible reasons:\n` +
80
+ `1. Documents not yet generated - please execute step 6.1 to generate document content\n` +
81
+ `2. Incorrect directory path - confirm document directory is ${docsDir}/\n`,
82
+ };
83
+ }
84
+
85
+ // 2. Layer 0: Clean invalid documents
86
+ const cleanResult = await cleanInvalidDocs({ yamlPath, docsDir });
87
+ const cleanMessage = formatCleanResult(cleanResult);
88
+ const cleaned = {
89
+ folders: cleanResult.deletedFolders.length,
90
+ files: cleanResult.deletedFiles.length,
91
+ };
92
+
93
+ // 3. Call validation
94
+ const validationResult = await validateDocumentContent({
95
+ yamlPath,
96
+ docsDir,
97
+ docs,
98
+ checkRemoteImages,
99
+ });
100
+
101
+ // 4. If validation passes, return directly
102
+ if (validationResult.valid) {
103
+ return {
104
+ success: true,
105
+ valid: true,
106
+ cleaned,
107
+ message: cleanMessage + validationResult.message,
108
+ };
109
+ }
110
+
111
+ // 5. If there are FIXABLE errors and autoFix=true, attempt auto-fix
112
+ if (autoFix && validationResult.errors?.fixable?.length > 0) {
113
+ const fixer = new DocumentContentFixer();
114
+ const fixedCount = await fixer.applyFixes(validationResult.errors.fixable, docsDir);
115
+
116
+ if (fixedCount > 0) {
117
+ // Re-validate
118
+ const revalidation = await validateDocumentContent({
119
+ yamlPath,
120
+ docsDir,
121
+ docs,
122
+ checkRemoteImages,
123
+ });
124
+
125
+ // Return fix result
126
+ if (revalidation.valid) {
127
+ return {
128
+ success: true,
129
+ valid: true,
130
+ fixed: true,
131
+ fixedCount,
132
+ cleaned,
133
+ message:
134
+ cleanMessage +
135
+ `✅ Successfully fixed ${fixedCount} errors.\n\n` +
136
+ `⚠️ Important: Files have been updated, please use the Read tool to re-read related documents for the latest content.\n\n` +
137
+ revalidation.message,
138
+ };
139
+ } else {
140
+ // Partial fix
141
+ return {
142
+ success: false,
143
+ valid: false,
144
+ fixed: true,
145
+ fixedCount,
146
+ cleaned,
147
+ message:
148
+ cleanMessage +
149
+ `⚠️ Fixed ${fixedCount} errors, but the following issues still require manual handling:\n\n` +
150
+ `Important: Files have been updated, please use the Read tool to re-read related documents to view current state.\n\n` +
151
+ `Issues to fix:\n\n` +
152
+ revalidation.message,
153
+ remainingErrors: revalidation.errors,
154
+ };
155
+ }
156
+ }
157
+ }
158
+
159
+ // 6. Cannot auto-fix or auto-fix not enabled, return error message
160
+ return {
161
+ success: false,
162
+ valid: false,
163
+ cleaned,
164
+ message: cleanMessage + validationResult.message,
165
+ errors: validationResult.errors,
166
+ };
167
+ } catch (error) {
168
+ return {
169
+ success: false,
170
+ valid: false,
171
+ message: `❌ Check failed: ${error.message}`,
172
+ };
173
+ }
174
+ }
175
+
176
+ checkContent.description =
177
+ "Clean invalid documents and validate generated document content. Removes document folders not in document-structure.yaml and language files not in .meta.yaml. Then checks file existence, internal links, local and remote images.";
178
+
179
+ checkContent.input_schema = {
180
+ type: "object",
181
+ properties: {
182
+ docs: {
183
+ type: "array",
184
+ items: {
185
+ type: "string",
186
+ },
187
+ description:
188
+ "Array of document paths to check, e.g., ['/overview', '/api/introduction'], checks all documents if not provided",
189
+ },
190
+ },
191
+ };