@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,175 +0,0 @@
1
- import { randomBytes } from "node:crypto";
2
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
- import { join } from "node:path";
4
- import { parse, stringify } from "yaml";
5
-
6
- const PREFERENCES_DIR = ".aigne/doc-smith";
7
- const PREFERENCES_FILE = "preferences.yml";
8
-
9
- /**
10
- * Generate a random preference ID
11
- * @returns {string} Random ID with pref_ prefix
12
- */
13
- function generatePreferenceId() {
14
- return `pref_${randomBytes(8).toString("hex")}`;
15
- }
16
-
17
- /**
18
- * Get the full path to the preferences file
19
- * @returns {string} Full path to preferences.yml
20
- */
21
- function getPreferencesFilePath() {
22
- return join(process.cwd(), PREFERENCES_DIR, PREFERENCES_FILE);
23
- }
24
-
25
- /**
26
- * Ensure the preferences directory exists
27
- */
28
- function ensurePreferencesDir() {
29
- const preferencesDir = join(process.cwd(), PREFERENCES_DIR);
30
- if (!existsSync(preferencesDir)) {
31
- mkdirSync(preferencesDir, { recursive: true });
32
- }
33
- }
34
-
35
- /**
36
- * Read existing preferences from file
37
- * @returns {Object} Preferences object with rules array
38
- */
39
- export function readPreferences() {
40
- const filePath = getPreferencesFilePath();
41
-
42
- if (!existsSync(filePath)) {
43
- return { rules: [] };
44
- }
45
-
46
- try {
47
- const content = readFileSync(filePath, "utf8");
48
- const preferences = parse(content);
49
- return preferences || { rules: [] };
50
- } catch (error) {
51
- console.warn(`Warning: Failed to read preferences file at ${filePath}: ${error.message}`);
52
- return { rules: [] };
53
- }
54
- }
55
-
56
- /**
57
- * Write preferences to file
58
- * @param {Object} preferences - Preferences object to save
59
- */
60
- export function writePreferences(preferences) {
61
- ensurePreferencesDir();
62
- const filePath = getPreferencesFilePath();
63
-
64
- try {
65
- const yamlContent = stringify(preferences, {
66
- indent: 2,
67
- lineWidth: 120,
68
- });
69
-
70
- writeFileSync(filePath, yamlContent, "utf8");
71
- } catch (error) {
72
- throw new Error(`Failed to write preferences file: ${error.message}`);
73
- }
74
- }
75
-
76
- /**
77
- * Add a new preference rule
78
- * @param {Object} ruleData - Rule data from feedbackRefiner
79
- * @param {string} ruleData.rule - The rule text
80
- * @param {string} ruleData.scope - Rule scope (global, structure, document, translation)
81
- * @param {boolean} ruleData.limitToInputPaths - Whether to limit to input paths
82
- * @param {string} feedback - Original user feedback
83
- * @param {string[]} [paths] - Optional paths to save with the rule
84
- * @returns {Object} The created preference rule
85
- */
86
- export function addPreferenceRule(ruleData, feedback, paths = []) {
87
- const preferences = readPreferences();
88
-
89
- const newRule = {
90
- id: generatePreferenceId(),
91
- active: true,
92
- scope: ruleData.scope,
93
- rule: ruleData.rule,
94
- feedback: feedback,
95
- createdAt: new Date().toISOString(),
96
- };
97
-
98
- // Add paths if limitToInputPaths is true and paths are provided
99
- if (ruleData.limitToInputPaths && paths && paths.length > 0) {
100
- newRule.paths = paths;
101
- }
102
-
103
- // Add the new rule to the beginning of the array (newest first)
104
- preferences.rules.unshift(newRule);
105
-
106
- writePreferences(preferences);
107
-
108
- return newRule;
109
- }
110
-
111
- /**
112
- * Get all active preference rules for a specific scope
113
- * @param {string} scope - The scope to filter by (global, structure, document, translation)
114
- * @param {string[]} [currentPaths] - Current paths to match against rules with path restrictions
115
- * @returns {Object[]} Array of matching active rules
116
- */
117
- export function getActiveRulesForScope(scope, currentPaths = []) {
118
- const preferences = readPreferences();
119
-
120
- return preferences.rules.filter((rule) => {
121
- // Must be active and match scope
122
- if (!rule.active || rule.scope !== scope) {
123
- return false;
124
- }
125
-
126
- // If rule has path restrictions, check if any current path matches
127
- if (rule.paths && rule.paths.length > 0) {
128
- if (currentPaths.length === 0) {
129
- return false; // Rule has path restrictions but no current paths provided
130
- }
131
-
132
- // Check if any current path matches any rule path pattern
133
- return currentPaths.some((currentPath) => rule.paths.includes(currentPath));
134
- }
135
-
136
- return true; // No path restrictions, include the rule
137
- });
138
- }
139
-
140
- /**
141
- * Deactivate a preference rule by ID
142
- * @param {string} ruleId - The ID of the rule to deactivate
143
- * @returns {boolean} True if rule was found and deactivated
144
- */
145
- export function deactivateRule(ruleId) {
146
- const preferences = readPreferences();
147
- const rule = preferences.rules.find((r) => r.id === ruleId);
148
-
149
- if (rule) {
150
- rule.active = false;
151
- writePreferences(preferences);
152
- return true;
153
- }
154
-
155
- return false;
156
- }
157
-
158
- /**
159
- * Remove a preference rule by ID
160
- * @param {string} ruleId - The ID of the rule to remove
161
- * @returns {boolean} True if rule was found and removed
162
- */
163
- export function removeRule(ruleId) {
164
- const preferences = readPreferences();
165
- const initialLength = preferences.rules.length;
166
-
167
- preferences.rules = preferences.rules.filter((r) => r.id !== ruleId);
168
-
169
- if (preferences.rules.length < initialLength) {
170
- writePreferences(preferences);
171
- return true;
172
- }
173
-
174
- return false;
175
- }
package/utils/request.mjs DELETED
@@ -1,10 +0,0 @@
1
- export async function requestWithAuthToken(url, options, authToken) {
2
- if (!authToken) {
3
- console.error("No authentication token provided");
4
- }
5
- const response = await fetch(url, {
6
- ...options,
7
- headers: { ...options.headers, Authorization: `Bearer ${authToken}` },
8
- });
9
- return response.json();
10
- }
@@ -1,272 +0,0 @@
1
- import { readdirSync } from "node:fs";
2
- import { readFileContent } from "./docs-finder-utils.mjs";
3
- import { debug } from "./debug.mjs";
4
- import path from "node:path";
5
- import fs from "fs-extra";
6
- import { d2CodeBlockRegex, diagramImageWithPathRegex } from "./d2-utils.mjs";
7
- import { pathExists } from "./file-utils.mjs";
8
-
9
- /**
10
- * Find all translation files for a document
11
- * @param {string} docPath - Document path (e.g., "/guides/getting-started")
12
- * @param {string} docsDir - Documentation directory
13
- * @param {string} locale - Main language locale (e.g., "en")
14
- * @returns {Promise<Array<{language: string, fileName: string}>>} - Array of translation file info
15
- */
16
- async function findTranslationFiles(docPath, docsDir, locale) {
17
- // Convert path to flat filename format
18
- const flatName = docPath.replace(/^\//, "").replace(/\//g, "-");
19
-
20
- try {
21
- const files = readdirSync(docsDir);
22
- const translationFiles = [];
23
- const mainFileName = locale === "en" ? `${flatName}.md` : `${flatName}.${locale}.md`;
24
-
25
- // Filter files to find translation files matching the pattern
26
- for (const file of files) {
27
- if (!file.endsWith(".md")) continue;
28
- if (file === mainFileName) continue; // Skip main language file
29
-
30
- // Case 1: File without language suffix (xxx.md) - this is English translation when main language is not English
31
- if (file === `${flatName}.md` && locale !== "en") {
32
- translationFiles.push({
33
- language: "en",
34
- fileName: file,
35
- });
36
- continue;
37
- }
38
-
39
- // Case 2: File with language suffix (xxx.{lang}.md) - all other translations
40
- if (file.startsWith(`${flatName}.`) && file.match(/\.\w+(-\w+)?\.md$/)) {
41
- const langMatch = file.match(/\.(\w+(-\w+)?)\.md$/);
42
- if (langMatch && langMatch[1] !== locale) {
43
- translationFiles.push({
44
- language: langMatch[1],
45
- fileName: file,
46
- });
47
- }
48
- }
49
- }
50
-
51
- return translationFiles;
52
- } catch (error) {
53
- debug(`⚠️ Could not read translation files from ${docsDir}: ${error.message}`);
54
- return [];
55
- }
56
- }
57
-
58
- /**
59
- * Extract diagram image paths from content
60
- * @param {string} content - Document content
61
- * @returns {Array<{path: string, fullMatch: string, index: number}>} - Array of diagram image info
62
- */
63
- function extractDiagramImagePaths(content) {
64
- const images = [];
65
- const matches = Array.from((content || "").matchAll(diagramImageWithPathRegex));
66
-
67
- for (const match of matches) {
68
- images.push({
69
- path: match[4] || "",
70
- fullMatch: match[0] || "",
71
- index: match.index,
72
- });
73
- }
74
-
75
- return images;
76
- }
77
-
78
- /**
79
- * Replace diagram images in translation files
80
- * @param {string} mainContent - Main document content (already updated)
81
- * @param {string} docPath - Document path
82
- * @param {string} docsDir - Documentation directory
83
- * @param {string} locale - Main language locale
84
- * @param {string} operationType - Operation type: "delete", "add", "update", or "sync" (default)
85
- * @returns {Promise<{updated: number, skipped: number, errors: Array}>} - Sync result
86
- */
87
- export async function syncDiagramToTranslations(
88
- mainContent,
89
- docPath,
90
- docsDir,
91
- locale = "en",
92
- operationType = "sync",
93
- ) {
94
- const result = {
95
- updated: 0,
96
- skipped: 0,
97
- errors: [],
98
- };
99
-
100
- // Find all translation files
101
- const translationFiles = await findTranslationFiles(docPath, docsDir, locale);
102
-
103
- if (translationFiles.length === 0) {
104
- debug("ℹ️ No translation files found, skipping sync");
105
- return result;
106
- }
107
-
108
- // Extract diagram images from updated main content
109
- const mainImages = extractDiagramImagePaths(mainContent);
110
-
111
- // If no diagrams in main content and operation is not delete, skip sync
112
- // For delete operations, we need to process translations even if main has 0 diagrams
113
- // to remove diagrams from translation files
114
- if (mainImages.length === 0 && operationType !== "delete") {
115
- debug("ℹ️ No diagram images in main content, skipping sync");
116
- return result;
117
- }
118
-
119
- // Process each translation file
120
- for (const { fileName } of translationFiles) {
121
- try {
122
- const translationFilePath = path.join(docsDir, fileName);
123
-
124
- // Check if translation file exists before reading to avoid unnecessary warnings
125
- const fileExists = await pathExists(translationFilePath);
126
- if (!fileExists) {
127
- debug(`ℹ️ Translation file does not exist yet: ${fileName} (skipping)`);
128
- result.skipped++;
129
- continue;
130
- }
131
-
132
- const translationContent = await readFileContent(docsDir, fileName);
133
-
134
- // Check for null or undefined (file read failure), but allow empty string (valid content)
135
- if (translationContent === null || translationContent === undefined) {
136
- debug(`⚠️ Could not read translation file: ${fileName}`);
137
- result.skipped++;
138
- continue;
139
- }
140
-
141
- let hasChanges = false;
142
- let updatedContent = translationContent;
143
-
144
- // Strategy 1: Replace D2 code blocks with AI images (if main doc switched from D2 to AI)
145
- const translationD2Blocks = Array.from(translationContent.matchAll(d2CodeBlockRegex));
146
- if (translationD2Blocks.length > 0 && mainImages.length > 0) {
147
- // If main doc has AI images and translation has D2 blocks, replace them by index
148
- for (let i = 0; i < Math.min(translationD2Blocks.length, mainImages.length); i++) {
149
- const d2Match = translationD2Blocks[i];
150
- const mainImage = mainImages[i];
151
-
152
- if (d2Match && mainImage) {
153
- // Replace D2 block with AI image from main doc
154
- updatedContent = updatedContent.replace(d2Match[0], mainImage.fullMatch);
155
- hasChanges = true;
156
- debug(`🔄 Replaced D2 block with AI image in ${fileName} (index ${i})`);
157
- }
158
- }
159
- }
160
-
161
- // Strategy 2: Replace old image paths with new ones (if paths changed)
162
- const translationImages = extractDiagramImagePaths(updatedContent); // Re-extract after D2 replacement
163
- if (mainImages.length > 0) {
164
- for (let i = 0; i < Math.min(translationImages.length, mainImages.length); i++) {
165
- const translationImage = translationImages[i];
166
- const mainImage = mainImages[i];
167
-
168
- // If image path changed, update it
169
- if (translationImage && mainImage && translationImage.path !== mainImage.path) {
170
- // Replace old image path with new one (escape special regex characters)
171
- const escapedPath = translationImage.path.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
172
- const oldImagePattern = new RegExp(
173
- `<!--\\s*DIAGRAM_IMAGE_START:[^>]+-->\\s*!\\[[^\\]]*\\]\\(${escapedPath}\\)\\s*<!--\\s*DIAGRAM_IMAGE_END\\s*-->`,
174
- "g",
175
- );
176
- updatedContent = updatedContent.replace(oldImagePattern, mainImage.fullMatch);
177
- hasChanges = true;
178
- debug(
179
- `🔄 Updated image path in ${fileName} (index ${i}): ${translationImage.path} -> ${mainImage.path}`,
180
- );
181
- }
182
- }
183
- }
184
-
185
- // Strategy 3: If translation has fewer images than main, add missing ones
186
- // (This handles cases where new diagrams were added)
187
- let finalTranslationImages = extractDiagramImagePaths(updatedContent); // Re-extract after all replacements
188
- if (mainImages.length > 0 && finalTranslationImages.length < mainImages.length) {
189
- // Find the last diagram position in updated content
190
- const lastDiagramIndex =
191
- finalTranslationImages.length > 0
192
- ? finalTranslationImages[finalTranslationImages.length - 1].index +
193
- finalTranslationImages[finalTranslationImages.length - 1].fullMatch.length
194
- : updatedContent.length;
195
-
196
- // Add missing images after the last diagram
197
- const missingImages = mainImages.slice(finalTranslationImages.length);
198
- const imagesToAdd = missingImages.map((img) => img.fullMatch).join("\n\n");
199
-
200
- updatedContent =
201
- updatedContent.slice(0, lastDiagramIndex) +
202
- "\n\n" +
203
- imagesToAdd +
204
- "\n\n" +
205
- updatedContent.slice(lastDiagramIndex);
206
- hasChanges = true;
207
- debug(`➕ Added ${missingImages.length} missing diagram(s) to ${fileName}`);
208
- // Re-extract after adding images
209
- finalTranslationImages = extractDiagramImagePaths(updatedContent);
210
- }
211
-
212
- // Strategy 4: If translation has more images than main, remove excess ones
213
- // (This handles cases where diagrams were deleted from main document, including all diagrams)
214
- if (finalTranslationImages.length > mainImages.length) {
215
- // Remove excess images from translation (keep only the first N images matching main)
216
- // Process from end to start to preserve indices
217
- const excessCount = finalTranslationImages.length - mainImages.length;
218
- for (let i = finalTranslationImages.length - 1; i >= mainImages.length; i--) {
219
- const imageToRemove = finalTranslationImages[i];
220
- const before = updatedContent.substring(0, imageToRemove.index);
221
- const after = updatedContent.substring(
222
- imageToRemove.index + imageToRemove.fullMatch.length,
223
- );
224
- // Remove the image and clean up extra newlines
225
- updatedContent = `${before.replace(/\n+$/, "")}\n${after.replace(/^\n+/, "")}`;
226
- hasChanges = true;
227
- }
228
- debug(`➖ Removed ${excessCount} excess diagram(s) from ${fileName}`);
229
- }
230
-
231
- // Strategy 5: Remove D2 code blocks from translation if main has no diagrams
232
- // (This handles cases where all diagrams were deleted from main document)
233
- if (mainImages.length === 0) {
234
- // Re-extract D2 blocks from updated content (in case some were already replaced)
235
- const remainingD2Blocks = Array.from(updatedContent.matchAll(d2CodeBlockRegex));
236
- if (remainingD2Blocks.length > 0) {
237
- // Remove all D2 code blocks from translation
238
- // Process from end to start to preserve indices
239
- for (let i = remainingD2Blocks.length - 1; i >= 0; i--) {
240
- const d2Match = remainingD2Blocks[i];
241
- const before = updatedContent.substring(0, d2Match.index);
242
- const after = updatedContent.substring(d2Match.index + d2Match[0].length);
243
- // Remove the D2 block and clean up extra newlines
244
- updatedContent = `${before.replace(/\n+$/, "")}\n${after.replace(/^\n+/, "")}`;
245
- hasChanges = true;
246
- }
247
- // Clean up extra newlines
248
- updatedContent = updatedContent.replace(/\n{3,}/g, "\n\n");
249
- debug(`➖ Removed ${remainingD2Blocks.length} D2 code block(s) from ${fileName}`);
250
- }
251
- }
252
-
253
- // Save updated translation file if there were changes
254
- if (hasChanges) {
255
- await fs.writeFile(translationFilePath, updatedContent, "utf8");
256
- result.updated++;
257
- debug(`✅ Synced diagram images to ${fileName}`);
258
- } else {
259
- result.skipped++;
260
- debug(`⏭️ No changes needed for ${fileName}`);
261
- }
262
- } catch (error) {
263
- debug(`❌ Error syncing diagram to ${fileName}: ${error.message}`);
264
- result.errors.push({
265
- file: fileName,
266
- error: error.message,
267
- });
268
- }
269
- }
270
-
271
- return result;
272
- }