@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,307 @@
1
+ import { readFile, writeFile, access } from "node:fs/promises";
2
+ import { constants } from "node:fs";
3
+ import { parse as yamlParse, stringify as yamlStringify } from "yaml";
4
+ import validateYamlStructure from "./validate-structure.mjs";
5
+ import { PATHS } from "../../utils/agent-constants.mjs";
6
+
7
+ /**
8
+ * Document Structure Fixer Class
9
+ */
10
+ class DocumentStructureFixer {
11
+ constructor(data) {
12
+ this.data = data;
13
+ this.fixCount = 0;
14
+ }
15
+
16
+ /**
17
+ * Apply all fixes
18
+ */
19
+ applyFixes(errors) {
20
+ for (const error of errors) {
21
+ this.applyFix(error);
22
+ }
23
+ return this.fixCount;
24
+ }
25
+
26
+ /**
27
+ * Apply single fix
28
+ */
29
+ applyFix(error) {
30
+ const pathParts = this.parsePath(error.path);
31
+
32
+ switch (error.type) {
33
+ case "PATH_FORMAT":
34
+ this.fixPath(pathParts, error);
35
+ break;
36
+ case "SOURCE_PATH_PREFIX":
37
+ this.fixSourcePath(pathParts, error);
38
+ break;
39
+ case "ICON_FORMAT":
40
+ this.fixIconFormat(pathParts, error);
41
+ break;
42
+ case "EXTRA_ICON":
43
+ this.removeIcon(pathParts);
44
+ break;
45
+ default:
46
+ break;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Fix path format
52
+ */
53
+ fixPath(pathParts, error) {
54
+ // Remove last field name 'path'
55
+ const docPathParts = pathParts.slice(0, -1);
56
+ const doc = this.getDocument(docPathParts);
57
+ if (!doc || !doc.path) return;
58
+
59
+ let fixed = false;
60
+
61
+ if (error.fix === "add_leading_slash" && !doc.path.startsWith("/")) {
62
+ doc.path = `/${doc.path}`;
63
+ fixed = true;
64
+ }
65
+
66
+ // Removed: no longer auto-add .md suffix
67
+ // if (error.fix === "add_md_extension" && !doc.path.endsWith(".md")) {
68
+ // doc.path = `${doc.path}.md`;
69
+ // fixed = true;
70
+ // }
71
+
72
+ if (fixed) {
73
+ this.fixCount++;
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Fix sourcePath prefix
79
+ */
80
+ fixSourcePath(pathParts) {
81
+ const docPathParts = pathParts.slice(0, -1);
82
+ const doc = this.getDocument(docPathParts);
83
+
84
+ if (!doc || !doc.sourcePaths || !Array.isArray(doc.sourcePaths)) return;
85
+
86
+ const lastPart = pathParts[pathParts.length - 1];
87
+ const match = lastPart.match(/\[(\d+)\]/);
88
+ if (!match) return;
89
+
90
+ const idx = parseInt(match[1], 10);
91
+ if (doc.sourcePaths[idx]?.startsWith("workspace:")) {
92
+ doc.sourcePaths[idx] = doc.sourcePaths[idx].replace("workspace:", "");
93
+ this.fixCount++;
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Fix icon format
99
+ */
100
+ fixIconFormat(pathParts) {
101
+ // Remove last field name 'icon'
102
+ const docPathParts = pathParts.slice(0, -1);
103
+ const doc = this.getDocument(docPathParts);
104
+ if (!doc || !doc.icon) return;
105
+
106
+ if (!doc.icon.startsWith("lucide:")) {
107
+ doc.icon = `lucide:${doc.icon}`;
108
+ this.fixCount++;
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Remove icon
114
+ */
115
+ removeIcon(pathParts) {
116
+ // Remove last field name 'icon'
117
+ const docPathParts = pathParts.slice(0, -1);
118
+ const doc = this.getDocument(docPathParts);
119
+ if (!doc) return;
120
+
121
+ if (doc.icon !== undefined) {
122
+ delete doc.icon;
123
+ this.fixCount++;
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Parse path string
129
+ */
130
+ parsePath(path) {
131
+ return path.split(/\.(?![^[]*\])/);
132
+ }
133
+
134
+ /**
135
+ * Get document object at specified path
136
+ */
137
+ getDocument(pathParts) {
138
+ let current = this.data;
139
+
140
+ for (const part of pathParts) {
141
+ if (part.includes("[")) {
142
+ const match = part.match(/(\w+)\[(\d+)\]/);
143
+ if (!match) return null;
144
+
145
+ const [, key, idx] = match;
146
+ current = current[key]?.[parseInt(idx, 10)];
147
+ } else {
148
+ current = current[part];
149
+ }
150
+
151
+ if (!current) return null;
152
+ }
153
+
154
+ return current;
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Format remaining errors
160
+ */
161
+ function formatRemainingErrors(errors) {
162
+ const formatted = [];
163
+
164
+ errors.fatal.forEach((err) => {
165
+ formatted.push({
166
+ path: err.path,
167
+ message: err.message,
168
+ action: err.suggestion || "Please check and fix this issue",
169
+ });
170
+ });
171
+
172
+ errors.fixable.forEach((err) => {
173
+ formatted.push({
174
+ path: err.path,
175
+ message: err.message,
176
+ action: `Expected value: ${err.expected || "please refer to schema"}`,
177
+ });
178
+ });
179
+
180
+ return formatted;
181
+ }
182
+
183
+ /**
184
+ * Main function - Intelligent Structure Checker
185
+ * @returns {Promise<Object>} - Check and fix result
186
+ */
187
+ export default async function checkStructure() {
188
+ const yamlPath = PATHS.DOCUMENT_STRUCTURE;
189
+ try {
190
+ // 1. Check if file exists
191
+ try {
192
+ await access(yamlPath, constants.F_OK);
193
+ } catch (_error) {
194
+ return {
195
+ success: false,
196
+ valid: false,
197
+ fileNotFound: true,
198
+ message:
199
+ `❌ File not found: ${yamlPath}\n\n` +
200
+ `Possible reasons:\n` +
201
+ `1. Incorrect file path - please check if you are in the correct workspace directory\n` +
202
+ `2. Incorrect file name - confirm file name is ${yamlPath}\n` +
203
+ `3. Document structure not yet generated - please execute step 4.1 to generate ${yamlPath}\n`,
204
+ };
205
+ }
206
+
207
+ // 2. Call validation
208
+ const validationResult = await validateYamlStructure({
209
+ yamlPath,
210
+ });
211
+
212
+ // 3. If validation passes, return directly
213
+ if (validationResult.valid) {
214
+ return {
215
+ success: true,
216
+ valid: true,
217
+ message: validationResult.message,
218
+ summary: validationResult.summary,
219
+ };
220
+ }
221
+
222
+ // 4. If there are FIXABLE errors, auto-fix first (regardless of FATAL errors)
223
+ if (validationResult.errors?.fixable?.length > 0) {
224
+ const content = await readFile(yamlPath, "utf8");
225
+ const data = yamlParse(content);
226
+
227
+ const fixer = new DocumentStructureFixer(data);
228
+ const fixedCount = fixer.applyFixes(validationResult.errors.fixable);
229
+
230
+ // Rewrite YAML file
231
+ const fixedYaml = yamlStringify(data, {
232
+ lineWidth: 0,
233
+ defaultKeyType: "PLAIN",
234
+ defaultStringType: "QUOTE_DOUBLE",
235
+ });
236
+ await writeFile(yamlPath, fixedYaml, "utf8");
237
+
238
+ // Re-validate
239
+ const revalidation = await validateYamlStructure({ yamlPath });
240
+
241
+ // Return fix result
242
+ if (revalidation.errors.fatal.length === 0 && revalidation.errors.fixable.length === 0) {
243
+ return {
244
+ success: false,
245
+ valid: false,
246
+ fixed: true,
247
+ fixedCount,
248
+ message: `⚠️ File updated, please use Read tool to re-read ${yamlPath} and re-check.`,
249
+ };
250
+ } else {
251
+ // Partial fix
252
+ const remainingErrors = formatRemainingErrors(revalidation.errors);
253
+ const errorList = remainingErrors
254
+ .map((err, idx) => {
255
+ let msg = `${idx + 1}. ${err.message}`;
256
+ if (err.path) msg += `\n Location: ${err.path}`;
257
+ if (err.action) msg += `\n Action: ${err.action}`;
258
+ return msg;
259
+ })
260
+ .join("\n\n");
261
+
262
+ return {
263
+ success: false,
264
+ valid: false,
265
+ fixed: true,
266
+ fixedCount,
267
+ message:
268
+ `❌ Fatal errors exist, cannot auto-fix. File updated, please use Read tool to re-read ${yamlPath}.\n\n` +
269
+ `Issues detected:\n\n` +
270
+ errorList,
271
+ remainingErrors,
272
+ };
273
+ }
274
+ }
275
+
276
+ // 5. If only FATAL errors (no FIXABLE errors)
277
+ if (validationResult.errors?.fatal?.length > 0) {
278
+ const errorList = validationResult.errors.fatal
279
+ .map((err, idx) => {
280
+ let msg = `${idx + 1}. ${err.message}`;
281
+ if (err.path) msg += `\n Location: ${err.path}`;
282
+ if (err.suggestion) msg += `\n Action: ${err.suggestion}`;
283
+ return msg;
284
+ })
285
+ .join("\n\n");
286
+
287
+ return {
288
+ success: false,
289
+ valid: false,
290
+ message: `❌ Fatal errors exist, cannot auto-fix. Please resolve the following issues first:\n\n${errorList}`,
291
+ errors: validationResult.errors.fatal,
292
+ };
293
+ }
294
+
295
+ // Default return (should not reach here)
296
+ return validationResult;
297
+ } catch (error) {
298
+ return {
299
+ success: false,
300
+ valid: false,
301
+ message: `❌ Check failed: ${error.message}`,
302
+ };
303
+ }
304
+ }
305
+
306
+ checkStructure.description =
307
+ "Check and validate document structure YAML file at planning/document-structure.yaml, automatically fix format errors";