@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
@@ -1,272 +0,0 @@
1
- import { marked } from "marked";
2
- import markedTerminal from "marked-terminal";
3
- import { getActiveRulesForScope } from "../../utils/preferences-utils.mjs";
4
- import { userContextAt } from "../../utils/utils.mjs";
5
-
6
- function extractMarkdownHeadings(content) {
7
- if (!content || typeof content !== "string") {
8
- return [];
9
- }
10
-
11
- const headings = [];
12
-
13
- try {
14
- // Use marked's lexer to tokenize the content
15
- const tokens = marked.lexer(content);
16
-
17
- // Extract heading tokens
18
- function processTokens(tokenArray) {
19
- for (const token of tokenArray) {
20
- if (token.type === "heading") {
21
- headings.push({
22
- level: token.depth,
23
- text: token.text.trim(),
24
- prefix: " ".repeat(token.depth - 1) + "📄".repeat(1),
25
- });
26
- }
27
- // Process nested tokens if they exist (for lists, block quotes, etc.)
28
- if (token.tokens) {
29
- processTokens(token.tokens);
30
- }
31
- }
32
- }
33
-
34
- processTokens(tokens);
35
- } catch (error) {
36
- // If marked fails, fall back to regex but log the issue
37
- console.warn(
38
- "Failed to parse markdown with marked library, falling back to regex:",
39
- error.message,
40
- );
41
- return extractMarkdownHeadingsFallback(content);
42
- }
43
-
44
- return headings;
45
- }
46
-
47
- // Fallback function using the original regex approach
48
- function extractMarkdownHeadingsFallback(content) {
49
- const lines = content.split("\n");
50
- const headings = [];
51
-
52
- for (const line of lines) {
53
- const match = line.match(/^(#{1,6})\s+(.+)$/);
54
- if (match) {
55
- const level = match[1].length;
56
- const text = match[2].trim();
57
- headings.push({
58
- level,
59
- text,
60
- prefix: " ".repeat(level - 1) + "📄".repeat(1),
61
- });
62
- }
63
- }
64
-
65
- return headings;
66
- }
67
-
68
- function printDocumentHeadings(content, title) {
69
- console.log(`\n ${"-".repeat(50)}`);
70
- console.log(` Current Document: ${title}`);
71
- console.log(` ${"-".repeat(50)}`);
72
-
73
- const headings = extractMarkdownHeadings(content);
74
-
75
- if (headings.length === 0) {
76
- console.log(" This document has no headings.");
77
- } else {
78
- headings.forEach((heading) => {
79
- console.log(`${heading.prefix} ${heading.text} (H${heading.level})`);
80
- });
81
- }
82
- console.log();
83
- }
84
-
85
- async function showDocumentDetail(content, title) {
86
- if (!content || typeof content !== "string" || content.trim().length === 0) {
87
- console.log("There's no content to display.");
88
- return;
89
- }
90
-
91
- try {
92
- // Temporarily suppress console.error to hide language warnings
93
- const originalError = console.error;
94
- console.error = (message) => {
95
- // Only suppress cli-highlight language warnings
96
- if (
97
- typeof message === "string" &&
98
- message.toLowerCase().includes("Could not find the language")
99
- ) {
100
- return;
101
- }
102
- originalError(message);
103
- };
104
-
105
- marked.setOptions({
106
- renderer: new markedTerminal(),
107
- });
108
-
109
- // FIXME: @zhanghan fix error "Could not find the language 'd2', did you forget to load/include a language module?"
110
- const renderedMarkdown = marked(content);
111
-
112
- // Restore original console.error
113
- console.error = originalError;
114
-
115
- console.log(`\nDocument: ${title || "Untitled Document"}`);
116
- console.log("=".repeat(50));
117
- console.log(renderedMarkdown);
118
- } catch (_error) {
119
- console.log("\nFalling back to plain text display (marked-terminal not available):\n");
120
- console.log(`Document: ${title || "Untitled Document"}`);
121
- console.log("=".repeat(50));
122
- console.log(content);
123
- }
124
- }
125
-
126
- export default async function userReviewDocument({ content, description, ...rest }, options) {
127
- // Check if document content exists
128
- if (!content || typeof content !== "string" || content.trim().length === 0) {
129
- console.log("Please provide document content to review.");
130
- return { content };
131
- }
132
-
133
- const title = rest.documentStructure?.find((x) => x.path === rest.path)?.title;
134
-
135
- // Print current document headings structure
136
- if (!rest.isChat) {
137
- printDocumentHeadings(content, title || "Untitled Document");
138
- }
139
-
140
- // Initialize shared context with current content using path
141
- const contentContext = userContextAt(options, `currentContents.${rest.path}`);
142
- contentContext.set(content);
143
-
144
- const MAX_ITERATIONS = 100;
145
- const feedbacks = [];
146
- let iterationCount = 0;
147
-
148
- let feedback = "";
149
-
150
- while (iterationCount < MAX_ITERATIONS) {
151
- feedback = "";
152
- iterationCount++;
153
-
154
- if (rest.isChat && rest.feedback) {
155
- feedback = rest.feedback;
156
- } else {
157
- // Ask user what they want to do
158
- const action = await options.prompts.select({
159
- message: "What would you like to do next?",
160
- choices: [
161
- {
162
- name: "View document",
163
- value: "view",
164
- },
165
- {
166
- name: "Give feedback",
167
- value: "feedback",
168
- },
169
- {
170
- name: "Done",
171
- value: "finish",
172
- },
173
- ],
174
- });
175
-
176
- if (action === "finish") {
177
- break;
178
- } else if (action === "view") {
179
- await showDocumentDetail(contentContext.get(), title || "Untitled Document");
180
- }
181
-
182
- // Ask for feedback
183
- feedback = await options.prompts.input({
184
- message:
185
- "How would you like to improve this document?\n" +
186
- "Examples:\n" +
187
- " • Add troubleshooting section for common errors\n" +
188
- " • Simplify the explanation for beginners\n" +
189
- " • Remove the outdated information about version 1.0\n\n" +
190
- " Your feedback:",
191
- });
192
-
193
- // If no feedback, finish the loop
194
- if (!feedback?.trim()) {
195
- break;
196
- }
197
-
198
- feedbacks.push(feedback.trim());
199
- }
200
-
201
- // Get the updateDocument agent
202
- const updateAgent = options.context.agents["updateSingleDocumentDetail"];
203
- if (!updateAgent) {
204
- console.log(
205
- "We can't process your feedback right now. The document update feature is temporarily unavailable.",
206
- );
207
- console.log("Please try again later or contact support if this continues.");
208
- break;
209
- }
210
-
211
- // Get user preferences
212
- const contentRules = getActiveRulesForScope("document", [rest.path]);
213
- const globalRules = getActiveRulesForScope("global");
214
- const allApplicableRules = [...contentRules, ...globalRules];
215
- const ruleTexts = allApplicableRules.map((rule) => rule.rule);
216
- const userPreferences = ruleTexts.length > 0 ? ruleTexts.join("\n\n") : "";
217
-
218
- try {
219
- // Call updateDocument agent with feedback
220
- const currentContent = contentContext.get();
221
- const result = await options.context.invoke(updateAgent, {
222
- ...rest,
223
- originalContent: currentContent,
224
- feedback: feedback.trim(),
225
- userPreferences,
226
- title,
227
- });
228
- contentContext.set(result.content);
229
-
230
- // Check if feedback should be saved as user preference
231
- const feedbackRefinerAgent = options.context.agents["checkFeedbackRefiner"];
232
- if (feedbackRefinerAgent) {
233
- try {
234
- await options.context.invoke(feedbackRefinerAgent, {
235
- documentContentFeedback: feedback.trim(),
236
- stage: "document_refine",
237
- });
238
- } catch (refinerError) {
239
- console.warn("We couldn't save your feedback as a preference:", refinerError.message);
240
- console.warn("Your feedback was applied, but we couldn't save it as a preference.");
241
- }
242
- }
243
-
244
- // Print updated document headings structure
245
- printDocumentHeadings(contentContext.get(), title || "Untitled Document");
246
-
247
- if (rest.isChat) {
248
- break;
249
- }
250
- } catch (error) {
251
- console.error("Error processing your feedback:");
252
- console.error(`Type: ${error.name}`);
253
- console.error(`Message: ${error.message}`);
254
- if (error.stack) {
255
- console.error(`Stack: ${error.stack}`);
256
- }
257
- console.log("\nPlease try rephrasing your feedback or continue with the current content.");
258
-
259
- process.exit(0);
260
- }
261
- }
262
-
263
- return {
264
- title,
265
- description,
266
- ...rest,
267
- content: contentContext.get(),
268
- feedback: feedbacks.join(". "),
269
- };
270
- }
271
-
272
- userReviewDocument.taskTitle = "User review and modify document content";
@@ -1,16 +0,0 @@
1
- import { shutdownMermaidWorkerPool } from "../../utils/mermaid-worker-pool.mjs";
2
-
3
- export default async function actionSuccess({ action }) {
4
- // Shutdown mermaid worker pool to ensure clean exit
5
- try {
6
- await shutdownMermaidWorkerPool();
7
- } catch (error) {
8
- console.warn("Failed to shutdown mermaid worker pool:", error.message);
9
- }
10
-
11
- return {
12
- message: `${action}`,
13
- };
14
- }
15
-
16
- actionSuccess.task_render_mode = "hide";
@@ -1,32 +0,0 @@
1
- name: analyzeDocumentFeedbackIntent
2
- description: Analyze user feedback to determine if data sources are needed for content modifications
3
- task_render_mode: hide
4
- instructions:
5
- url: ../../prompts/utils/analyze-document-feedback-intent.md
6
- input_schema:
7
- type: object
8
- properties:
9
- feedback:
10
- type: string
11
- description: User feedback for content modifications
12
- required:
13
- - feedback
14
- output_schema:
15
- type: object
16
- properties:
17
- needDataSources:
18
- type: boolean
19
- description: Whether data sources are needed - true for add/edit operations that need context, false for delete/move/reorder operations
20
- intentType:
21
- type: string
22
- description: The primary type of user intention
23
- reason:
24
- type: string
25
- description: Explanation of why data sources are or aren't needed
26
- error:
27
- type: boolean
28
- description: If an error occurs during the analysis process
29
- required:
30
- - needDataSources
31
- - intentType
32
- - reason
@@ -1,253 +0,0 @@
1
- import { AIAgent } from "@aigne/core";
2
- import z from "zod";
3
- import { diagramImageWithPathRegex } from "../../utils/d2-utils.mjs";
4
-
5
- /**
6
- * Detect existing diagram in document content using regex
7
- * Uses generic regex patterns to detect diagram images inserted by the system
8
- * @param {string} documentContent - Document content to analyze
9
- * @returns {Object|null} - Diagram info if found, null otherwise
10
- */
11
- function detectExistingDiagram(documentContent) {
12
- if (!documentContent || typeof documentContent !== "string") {
13
- return null;
14
- }
15
-
16
- // Use generic regex to detect diagram image blocks with special markers
17
- // Format: <!-- DIAGRAM_IMAGE_START:type:aspectRatio -->![alt](path)<!-- DIAGRAM_IMAGE_END -->
18
- const pathMatches = Array.from(documentContent.matchAll(diagramImageWithPathRegex));
19
-
20
- if (pathMatches.length > 0) {
21
- // Currently each document has only one diagram, so use the first one
22
- const firstPathMatch = pathMatches[0];
23
- const imagePath = firstPathMatch[4]; // Path is in capture group 4 (groups: 1=type, 2=aspectRatio, 3=timestamp, 4=path)
24
- const fullMatch = firstPathMatch[0];
25
-
26
- return {
27
- path: imagePath,
28
- index: 0,
29
- markdown: fullMatch,
30
- };
31
- }
32
-
33
- return null;
34
- }
35
-
36
- /**
37
- * Analyze user feedback to determine the intent type for document updates
38
- * Supports two modes:
39
- * - Global mode (no documentContent): Only analyzes feedback to determine intentType
40
- * - Single document mode (with documentContent): Detects diagrams and provides full analysis
41
- * Returns: { intentType, diagramInfo, generationMode, changes }
42
- */
43
- export default async function analyzeFeedbackIntent(
44
- { feedback, shouldUpdateDiagrams, documentContent },
45
- options,
46
- ) {
47
- // Check if documentContent is available (single document mode vs global mode)
48
- const hasDocumentContent =
49
- documentContent && typeof documentContent === "string" && documentContent.trim();
50
-
51
- // Check if feedback exists and is not empty
52
- // If feedback is empty and --diagram flag is set, default to updateDiagram
53
- if (!feedback || typeof feedback !== "string" || !feedback.trim()) {
54
- // If --diagram flag is set, default to updateDiagram (user wants to update diagrams)
55
- if (shouldUpdateDiagrams) {
56
- const diagramInfo = hasDocumentContent ? detectExistingDiagram(documentContent) : null;
57
- return {
58
- intentType: "updateDiagram",
59
- diagramInfo,
60
- generationMode: diagramInfo ? "image-to-image" : "add-new",
61
- changes: [],
62
- };
63
- }
64
- // No feedback and no flag - return minimal structure
65
- const diagramInfo = hasDocumentContent ? detectExistingDiagram(documentContent) : null;
66
- return {
67
- intentType: null,
68
- diagramInfo,
69
- generationMode: null,
70
- changes: [],
71
- };
72
- }
73
-
74
- // Step 1: Detect existing diagram only if documentContent is available (single document mode)
75
- const diagramInfo = hasDocumentContent ? detectExistingDiagram(documentContent) : null;
76
-
77
- // Step 2: Build instructions with diagram context (only in single document mode)
78
- let diagramContextSection = "";
79
- if (hasDocumentContent) {
80
- if (diagramInfo) {
81
- diagramContextSection = `The document contains an existing diagram: ${diagramInfo.path}`;
82
- } else {
83
- diagramContextSection = `The document does not contain any diagram images.`;
84
- }
85
- }
86
-
87
- const instructions = `Analyze the user feedback and classify the intent:
88
-
89
- **Intent Types:**
90
- - addDiagram: User wants to add/create a new diagram/image/chart
91
- - deleteDiagram: User wants to remove/delete an existing diagram/image/chart
92
- - updateDiagram: User wants to modify/update an existing diagram/image/chart
93
- - updateDocument: User wants to update text/content (not diagram-related)
94
-
95
- ${diagramContextSection ? `**Context:** ${diagramContextSection}` : ""}
96
-
97
- **User Feedback:**
98
- ${feedback.trim()}
99
-
100
- **For updateDiagram, determine generationMode:**
101
- - "image-to-image": Diagram exists AND user describes changes (default when diagram exists)
102
- - "text-only": User explicitly requests regenerating from text only
103
- - "add-new": No existing diagram
104
-
105
- Analyze the feedback and return the intent type, generationMode (if applicable), and any specific changes mentioned.`;
106
-
107
- try {
108
- const analyzeUpdateFeedbackIntentAgent = AIAgent.from({
109
- name: "analyzeUpdateFeedbackIntent",
110
- description:
111
- "Analyze user feedback to determine if document are needed for content modifications",
112
- task_render_mode: "hide",
113
- instructions,
114
- inputSchema: z.object({
115
- feedback: z.string().describe("User feedback for content modifications"),
116
- diagramInfo: z
117
- .object({
118
- path: z.string(),
119
- index: z.number(),
120
- markdown: z.string(),
121
- })
122
- .nullable()
123
- .describe("Existing diagram information if found, null otherwise"),
124
- }),
125
- outputSchema: z.object({
126
- intentType: z
127
- .enum(["addDiagram", "deleteDiagram", "updateDiagram", "updateDocument"])
128
- .describe(
129
- "The primary type of user intention: one of addDiagram, deleteDiagram, updateDiagram, updateDocument",
130
- ),
131
- generationMode: z
132
- .enum(["image-to-image", "text-only", "add-new", "remove-image"])
133
- .optional()
134
- .describe(
135
- "Generation mode for diagram operations. Only relevant for addDiagram/updateDiagram. 'image-to-image' for modifying existing, 'text-only' for regenerating from text, 'add-new' for creating new.",
136
- ),
137
- changes: z
138
- .array(z.string())
139
- .optional()
140
- .describe(
141
- "Specific changes mentioned in feedback (e.g., ['add node: database', 'modify style: modern']). Only relevant for updateDiagram.",
142
- ),
143
- }),
144
- });
145
-
146
- const llmInput = {
147
- feedback: feedback.trim(),
148
- diagramInfo,
149
- };
150
- const llmResult = await options.context.invoke(analyzeUpdateFeedbackIntentAgent, llmInput);
151
-
152
- // Handle case where LLM returns null, undefined, or invalid result
153
- if (!llmResult || typeof llmResult !== "object") {
154
- throw new Error(`LLM returned invalid result: ${JSON.stringify(llmResult)}`);
155
- }
156
-
157
- let { intentType, generationMode, changes } = llmResult;
158
-
159
- // If LLM returned null/undefined intentType, try to infer from feedback content
160
- if (!intentType) {
161
- const feedbackLower = feedback.toLowerCase();
162
- const hasDiagramTerms =
163
- feedbackLower.includes("图") ||
164
- feedbackLower.includes("diagram") ||
165
- feedbackLower.includes("chart") ||
166
- feedbackLower.includes("节点") ||
167
- feedbackLower.includes("node");
168
-
169
- if (hasDiagramTerms && diagramInfo) {
170
- intentType = "updateDiagram";
171
- } else if (hasDiagramTerms && !diagramInfo) {
172
- intentType = "addDiagram";
173
- } else {
174
- intentType = "updateDocument";
175
- }
176
- }
177
-
178
- // If --diagram flag is set and user didn't explicitly request delete/add,
179
- // default to updateDiagram (for backward compatibility)
180
- if (
181
- shouldUpdateDiagrams &&
182
- intentType &&
183
- !["deleteDiagram", "addDiagram"].includes(intentType)
184
- ) {
185
- intentType = "updateDiagram";
186
- }
187
-
188
- // Set default generationMode based on intentType and diagramInfo if not provided by LLM
189
- if (!generationMode) {
190
- if (intentType === "deleteDiagram") {
191
- generationMode = "remove-image";
192
- } else if (intentType === "addDiagram") {
193
- generationMode = "add-new";
194
- } else if (intentType === "updateDiagram") {
195
- generationMode = diagramInfo ? "image-to-image" : "add-new";
196
- }
197
- }
198
-
199
- // Ensure we always have a valid intentType at this point
200
- if (!intentType) {
201
- intentType = "updateDocument";
202
- generationMode = generationMode || null;
203
- }
204
-
205
- return {
206
- intentType,
207
- diagramInfo,
208
- generationMode,
209
- changes: changes || [],
210
- };
211
- } catch (error) {
212
- console.warn(`[analyzeFeedbackIntent] Failed to analyze feedback intent: ${error.message}`);
213
-
214
- // If analysis fails and --diagram flag is set, default to updateDiagram
215
- if (shouldUpdateDiagrams) {
216
- return {
217
- intentType: "updateDiagram",
218
- diagramInfo,
219
- generationMode: diagramInfo ? "image-to-image" : "add-new",
220
- changes: [],
221
- };
222
- }
223
-
224
- // Fallback: try to infer intent from feedback content
225
- const feedbackLower = feedback.toLowerCase();
226
- const hasDiagramTerms =
227
- feedbackLower.includes("图") ||
228
- feedbackLower.includes("diagram") ||
229
- feedbackLower.includes("chart") ||
230
- feedbackLower.includes("节点") ||
231
- feedbackLower.includes("node");
232
-
233
- let fallbackIntentType = "updateDocument";
234
- let fallbackGenerationMode = null;
235
-
236
- if (hasDiagramTerms && diagramInfo) {
237
- fallbackIntentType = "updateDiagram";
238
- fallbackGenerationMode = "image-to-image";
239
- } else if (hasDiagramTerms && !diagramInfo) {
240
- fallbackIntentType = "addDiagram";
241
- fallbackGenerationMode = "add-new";
242
- }
243
-
244
- return {
245
- intentType: fallbackIntentType,
246
- diagramInfo,
247
- generationMode: fallbackGenerationMode,
248
- changes: [],
249
- };
250
- }
251
- }
252
-
253
- analyzeFeedbackIntent.task_render_mode = "hide";
@@ -1,29 +0,0 @@
1
- name: analyzeStructureFeedbackIntent
2
- description: Analyze user feedback to determine if data sources are needed for structure modifications
3
- task_render_mode: hide
4
- instructions:
5
- url: ../../prompts/utils/analyze-structure-feedback-intent.md
6
- input_schema:
7
- type: object
8
- properties:
9
- feedback:
10
- type: string
11
- description: User feedback for structure modifications
12
- required:
13
- - feedback
14
- output_schema:
15
- type: object
16
- properties:
17
- needDataSources:
18
- type: boolean
19
- description: Whether data sources are needed - true for add/edit operations that need context, false for delete/move/reorder operations
20
- intentType:
21
- type: string
22
- description: The primary type of user intention
23
- reason:
24
- type: string
25
- description: Explanation of why data sources are or aren't needed
26
- required:
27
- - needDataSources
28
- - intentType
29
- - reason
@@ -1,51 +0,0 @@
1
- import { buildAllowedLinksFromStructure } from "../../utils/docs-finder-utils.mjs";
2
- import { checkMarkdown } from "../../utils/markdown-checker.mjs";
3
-
4
- export default async function checkDetailResult({
5
- documentStructure,
6
- reviewContent,
7
- docsDir,
8
- isApproved: preApproved,
9
- }) {
10
- // If already approved (e.g., --diagram mode), skip validation
11
- if (preApproved === true) {
12
- return {
13
- isApproved: true,
14
- detailFeedback: "",
15
- };
16
- }
17
-
18
- if (!reviewContent || reviewContent.trim() === "") {
19
- return {
20
- isApproved: false,
21
- detailFeedback: "Review content is empty",
22
- };
23
- }
24
-
25
- let isApproved = true;
26
- const detailFeedback = [];
27
-
28
- // Create a set of allowed links, including both original paths and processed .md paths
29
- const allowedLinks = buildAllowedLinksFromStructure(documentStructure);
30
-
31
- // Run comprehensive markdown validation with all checks
32
- try {
33
- const markdownErrors = await checkMarkdown(reviewContent, "result", {
34
- allowedLinks,
35
- baseDir: docsDir,
36
- });
37
-
38
- if (markdownErrors.length > 0) {
39
- isApproved = false;
40
- detailFeedback.push(...markdownErrors);
41
- }
42
- } catch (error) {
43
- isApproved = false;
44
- detailFeedback.push(`Found markdown validation error in result: ${error.message}`);
45
- }
46
-
47
- return {
48
- isApproved,
49
- detailFeedback: detailFeedback.join("\n"),
50
- };
51
- }