@aigne/doc-smith 0.8.12-beta.7 → 0.8.12-beta.9

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 (284) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/agents/clear/choose-contents.mjs +14 -1
  3. package/agents/clear/clear-media-description.mjs +129 -0
  4. package/agents/clear/index.yaml +3 -1
  5. package/agents/evaluate/code-snippet.mjs +28 -24
  6. package/agents/evaluate/document-structure.yaml +0 -4
  7. package/agents/evaluate/document.yaml +1 -5
  8. package/agents/generate/index.yaml +1 -0
  9. package/agents/init/index.mjs +10 -0
  10. package/agents/media/batch-generate-media-description.yaml +44 -0
  11. package/agents/media/generate-media-description.yaml +47 -0
  12. package/agents/media/load-media-description.mjs +238 -0
  13. package/agents/publish/index.yaml +4 -0
  14. package/agents/publish/publish-docs.mjs +77 -5
  15. package/agents/publish/translate-meta.mjs +103 -0
  16. package/agents/update/generate-document.yaml +30 -28
  17. package/agents/update/index.yaml +1 -0
  18. package/agents/update/update-document-detail.yaml +3 -1
  19. package/agents/utils/load-sources.mjs +103 -53
  20. package/agents/utils/update-branding.mjs +69 -0
  21. package/aigne.yaml +6 -0
  22. package/assets/report-template/report.html +34 -34
  23. package/package.json +17 -2
  24. package/prompts/common/document/role-and-personality.md +3 -1
  25. package/prompts/detail/d2-diagram/guide.md +7 -1
  26. package/prompts/detail/d2-diagram/user-prompt.md +3 -0
  27. package/prompts/detail/generate/system-prompt.md +6 -7
  28. package/prompts/detail/generate/user-prompt.md +12 -3
  29. package/prompts/detail/update/user-prompt.md +0 -2
  30. package/prompts/evaluate/document-structure.md +6 -7
  31. package/prompts/evaluate/document.md +16 -25
  32. package/prompts/media/media-description/system-prompt.md +35 -0
  33. package/prompts/media/media-description/user-prompt.md +8 -0
  34. package/prompts/structure/update/user-prompt.md +0 -4
  35. package/utils/constants/index.mjs +0 -107
  36. package/utils/file-utils.mjs +86 -0
  37. package/utils/markdown-checker.mjs +0 -20
  38. package/utils/request.mjs +7 -0
  39. package/utils/upload-files.mjs +231 -0
  40. package/utils/utils.mjs +11 -1
  41. package/.aigne/doc-smith/config.yaml +0 -77
  42. package/.aigne/doc-smith/history.yaml +0 -37
  43. package/.aigne/doc-smith/output/structure-plan.json +0 -162
  44. package/.aigne/doc-smith/preferences.yml +0 -97
  45. package/.aigne/doc-smith/upload-cache.yaml +0 -1893
  46. package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
  47. package/.github/workflows/ci.yml +0 -54
  48. package/.github/workflows/create-release-pr.yaml +0 -21
  49. package/.github/workflows/publish-docs.yml +0 -65
  50. package/.github/workflows/release.yml +0 -49
  51. package/.github/workflows/reviewer.yml +0 -54
  52. package/.release-please-manifest.json +0 -3
  53. package/RELEASE.md +0 -9
  54. package/assets/screenshots/doc-complete-setup.png +0 -0
  55. package/assets/screenshots/doc-generate-docs.png +0 -0
  56. package/assets/screenshots/doc-generate.png +0 -0
  57. package/assets/screenshots/doc-generated-successfully.png +0 -0
  58. package/assets/screenshots/doc-publish.png +0 -0
  59. package/assets/screenshots/doc-regenerate.png +0 -0
  60. package/assets/screenshots/doc-translate-langs.png +0 -0
  61. package/assets/screenshots/doc-translate.png +0 -0
  62. package/assets/screenshots/doc-update.png +0 -0
  63. package/biome.json +0 -73
  64. package/codecov.yml +0 -15
  65. package/docs/_sidebar.md +0 -15
  66. package/docs/configuration-initial-setup.ja.md +0 -179
  67. package/docs/configuration-initial-setup.md +0 -179
  68. package/docs/configuration-initial-setup.zh-TW.md +0 -179
  69. package/docs/configuration-initial-setup.zh.md +0 -179
  70. package/docs/configuration-managing-preferences.ja.md +0 -100
  71. package/docs/configuration-managing-preferences.md +0 -100
  72. package/docs/configuration-managing-preferences.zh-TW.md +0 -100
  73. package/docs/configuration-managing-preferences.zh.md +0 -100
  74. package/docs/configuration.ja.md +0 -96
  75. package/docs/configuration.md +0 -96
  76. package/docs/configuration.zh-TW.md +0 -96
  77. package/docs/configuration.zh.md +0 -96
  78. package/docs/getting-started.ja.md +0 -88
  79. package/docs/getting-started.md +0 -88
  80. package/docs/getting-started.zh-TW.md +0 -88
  81. package/docs/getting-started.zh.md +0 -88
  82. package/docs/guides-cleaning-up.ja.md +0 -51
  83. package/docs/guides-cleaning-up.md +0 -51
  84. package/docs/guides-cleaning-up.zh-TW.md +0 -51
  85. package/docs/guides-cleaning-up.zh.md +0 -51
  86. package/docs/guides-evaluating-documents.ja.md +0 -66
  87. package/docs/guides-evaluating-documents.md +0 -66
  88. package/docs/guides-evaluating-documents.zh-TW.md +0 -66
  89. package/docs/guides-evaluating-documents.zh.md +0 -66
  90. package/docs/guides-generating-documentation.ja.md +0 -151
  91. package/docs/guides-generating-documentation.md +0 -151
  92. package/docs/guides-generating-documentation.zh-TW.md +0 -151
  93. package/docs/guides-generating-documentation.zh.md +0 -151
  94. package/docs/guides-interactive-chat.ja.md +0 -85
  95. package/docs/guides-interactive-chat.md +0 -85
  96. package/docs/guides-interactive-chat.zh-TW.md +0 -85
  97. package/docs/guides-interactive-chat.zh.md +0 -85
  98. package/docs/guides-managing-history.ja.md +0 -48
  99. package/docs/guides-managing-history.md +0 -48
  100. package/docs/guides-managing-history.zh-TW.md +0 -48
  101. package/docs/guides-managing-history.zh.md +0 -48
  102. package/docs/guides-publishing-your-docs.ja.md +0 -78
  103. package/docs/guides-publishing-your-docs.md +0 -78
  104. package/docs/guides-publishing-your-docs.zh-TW.md +0 -78
  105. package/docs/guides-publishing-your-docs.zh.md +0 -78
  106. package/docs/guides-translating-documentation.ja.md +0 -95
  107. package/docs/guides-translating-documentation.md +0 -95
  108. package/docs/guides-translating-documentation.zh-TW.md +0 -95
  109. package/docs/guides-translating-documentation.zh.md +0 -95
  110. package/docs/guides-updating-documentation.ja.md +0 -77
  111. package/docs/guides-updating-documentation.md +0 -77
  112. package/docs/guides-updating-documentation.zh-TW.md +0 -77
  113. package/docs/guides-updating-documentation.zh.md +0 -77
  114. package/docs/guides.ja.md +0 -32
  115. package/docs/guides.md +0 -32
  116. package/docs/guides.zh-TW.md +0 -32
  117. package/docs/guides.zh.md +0 -32
  118. package/docs/overview.ja.md +0 -61
  119. package/docs/overview.md +0 -61
  120. package/docs/overview.zh-TW.md +0 -61
  121. package/docs/overview.zh.md +0 -61
  122. package/docs/release-notes.ja.md +0 -255
  123. package/docs/release-notes.md +0 -255
  124. package/docs/release-notes.zh-TW.md +0 -255
  125. package/docs/release-notes.zh.md +0 -255
  126. package/media.md +0 -19
  127. package/prompts/common/afs/afs-tools-usage.md +0 -5
  128. package/prompts/common/afs/use-afs-instruction.md +0 -1
  129. package/release-please-config.json +0 -14
  130. package/tests/agents/chat/chat.test.mjs +0 -46
  131. package/tests/agents/clear/choose-contents.test.mjs +0 -284
  132. package/tests/agents/clear/clear-auth-tokens.test.mjs +0 -268
  133. package/tests/agents/clear/clear-document-config.test.mjs +0 -167
  134. package/tests/agents/clear/clear-document-structure.test.mjs +0 -380
  135. package/tests/agents/clear/clear-generated-docs.test.mjs +0 -222
  136. package/tests/agents/evaluate/code-snippet.test.mjs +0 -163
  137. package/tests/agents/evaluate/fixtures/api-services.md +0 -87
  138. package/tests/agents/evaluate/fixtures/js-sdk.md +0 -94
  139. package/tests/agents/evaluate/generate-report.test.mjs +0 -312
  140. package/tests/agents/generate/check-document-structure.test.mjs +0 -45
  141. package/tests/agents/generate/check-need-generate-structure.test.mjs +0 -279
  142. package/tests/agents/generate/document-structure-tools/add-document.test.mjs +0 -449
  143. package/tests/agents/generate/document-structure-tools/delete-document.test.mjs +0 -410
  144. package/tests/agents/generate/document-structure-tools/generate-sub-structure.test.mjs +0 -277
  145. package/tests/agents/generate/document-structure-tools/move-document.test.mjs +0 -476
  146. package/tests/agents/generate/document-structure-tools/update-document.test.mjs +0 -548
  147. package/tests/agents/generate/generate-structure.test.mjs +0 -45
  148. package/tests/agents/generate/user-review-document-structure.test.mjs +0 -319
  149. package/tests/agents/history/view.test.mjs +0 -97
  150. package/tests/agents/init/init.test.mjs +0 -1657
  151. package/tests/agents/prefs/prefs.test.mjs +0 -431
  152. package/tests/agents/publish/publish-docs.test.mjs +0 -787
  153. package/tests/agents/translate/choose-language.test.mjs +0 -311
  154. package/tests/agents/translate/translate-document.test.mjs +0 -51
  155. package/tests/agents/update/check-document.test.mjs +0 -463
  156. package/tests/agents/update/check-update-is-single.test.mjs +0 -300
  157. package/tests/agents/update/document-tools/update-document-content.test.mjs +0 -329
  158. package/tests/agents/update/generate-document.test.mjs +0 -51
  159. package/tests/agents/update/save-and-translate-document.test.mjs +0 -369
  160. package/tests/agents/update/user-review-document.test.mjs +0 -582
  161. package/tests/agents/utils/action-success.test.mjs +0 -54
  162. package/tests/agents/utils/check-detail-result.test.mjs +0 -743
  163. package/tests/agents/utils/check-feedback-refiner.test.mjs +0 -478
  164. package/tests/agents/utils/choose-docs.test.mjs +0 -406
  165. package/tests/agents/utils/exit.test.mjs +0 -70
  166. package/tests/agents/utils/feedback-refiner.test.mjs +0 -51
  167. package/tests/agents/utils/find-item-by-path.test.mjs +0 -517
  168. package/tests/agents/utils/find-user-preferences-by-path.test.mjs +0 -382
  169. package/tests/agents/utils/format-document-structure.test.mjs +0 -364
  170. package/tests/agents/utils/fs.test.mjs +0 -267
  171. package/tests/agents/utils/load-sources.test.mjs +0 -1470
  172. package/tests/agents/utils/save-docs.test.mjs +0 -109
  173. package/tests/agents/utils/save-output.test.mjs +0 -315
  174. package/tests/agents/utils/save-single-doc.test.mjs +0 -364
  175. package/tests/agents/utils/transform-detail-datasources.test.mjs +0 -320
  176. package/tests/utils/auth-utils.test.mjs +0 -596
  177. package/tests/utils/blocklet.test.mjs +0 -336
  178. package/tests/utils/conflict-detector.test.mjs +0 -355
  179. package/tests/utils/constants.test.mjs +0 -295
  180. package/tests/utils/d2-utils.test.mjs +0 -437
  181. package/tests/utils/deploy.test.mjs +0 -399
  182. package/tests/utils/docs-finder-utils.test.mjs +0 -650
  183. package/tests/utils/file-utils.test.mjs +0 -521
  184. package/tests/utils/history-utils.test.mjs +0 -206
  185. package/tests/utils/kroki-utils.test.mjs +0 -646
  186. package/tests/utils/linter/fixtures/css/keyword-error.css +0 -1
  187. package/tests/utils/linter/fixtures/css/missing-semicolon.css +0 -1
  188. package/tests/utils/linter/fixtures/css/syntax-error.css +0 -1
  189. package/tests/utils/linter/fixtures/css/undeclare-variable.css +0 -1
  190. package/tests/utils/linter/fixtures/css/unused-variable.css +0 -2
  191. package/tests/utils/linter/fixtures/css/valid-code.css +0 -1
  192. package/tests/utils/linter/fixtures/dockerfile/keyword-error.dockerfile +0 -1
  193. package/tests/utils/linter/fixtures/dockerfile/missing-semicolon.dockerfile +0 -2
  194. package/tests/utils/linter/fixtures/dockerfile/syntax-error.dockerfile +0 -2
  195. package/tests/utils/linter/fixtures/dockerfile/undeclare-variable.dockerfile +0 -1
  196. package/tests/utils/linter/fixtures/dockerfile/unused-variable.dockerfile +0 -1
  197. package/tests/utils/linter/fixtures/dockerfile/valid-code.dockerfile +0 -2
  198. package/tests/utils/linter/fixtures/go/keyword-error.go +0 -5
  199. package/tests/utils/linter/fixtures/go/missing-semicolon.go +0 -5
  200. package/tests/utils/linter/fixtures/go/syntax-error.go +0 -6
  201. package/tests/utils/linter/fixtures/go/undeclare-variable.go +0 -5
  202. package/tests/utils/linter/fixtures/go/unused-variable.go +0 -5
  203. package/tests/utils/linter/fixtures/go/valid-code.go +0 -7
  204. package/tests/utils/linter/fixtures/js/keyword-error.js +0 -3
  205. package/tests/utils/linter/fixtures/js/missing-semicolon.js +0 -6
  206. package/tests/utils/linter/fixtures/js/syntax-error.js +0 -4
  207. package/tests/utils/linter/fixtures/js/undeclare-variable.js +0 -3
  208. package/tests/utils/linter/fixtures/js/unused-variable.js +0 -7
  209. package/tests/utils/linter/fixtures/js/valid-code.js +0 -15
  210. package/tests/utils/linter/fixtures/json/keyword-error.json +0 -1
  211. package/tests/utils/linter/fixtures/json/missing-semicolon.json +0 -1
  212. package/tests/utils/linter/fixtures/json/syntax-error.json +0 -1
  213. package/tests/utils/linter/fixtures/json/undeclare-variable.json +0 -1
  214. package/tests/utils/linter/fixtures/json/unused-variable.json +0 -1
  215. package/tests/utils/linter/fixtures/json/valid-code.json +0 -1
  216. package/tests/utils/linter/fixtures/jsx/keyword-error.jsx +0 -5
  217. package/tests/utils/linter/fixtures/jsx/missing-semicolon.jsx +0 -5
  218. package/tests/utils/linter/fixtures/jsx/syntax-error.jsx +0 -5
  219. package/tests/utils/linter/fixtures/jsx/undeclare-variable.jsx +0 -5
  220. package/tests/utils/linter/fixtures/jsx/unused-variable.jsx +0 -4
  221. package/tests/utils/linter/fixtures/jsx/valid-code.jsx +0 -5
  222. package/tests/utils/linter/fixtures/python/keyword-error.py +0 -3
  223. package/tests/utils/linter/fixtures/python/missing-semicolon.py +0 -2
  224. package/tests/utils/linter/fixtures/python/syntax-error.py +0 -3
  225. package/tests/utils/linter/fixtures/python/undeclare-variable.py +0 -3
  226. package/tests/utils/linter/fixtures/python/unused-variable.py +0 -6
  227. package/tests/utils/linter/fixtures/python/valid-code.py +0 -12
  228. package/tests/utils/linter/fixtures/ruby/keyword-error.rb +0 -2
  229. package/tests/utils/linter/fixtures/ruby/missing-semicolon.rb +0 -1
  230. package/tests/utils/linter/fixtures/ruby/syntax-error.rb +0 -2
  231. package/tests/utils/linter/fixtures/ruby/undeclare-variable.rb +0 -1
  232. package/tests/utils/linter/fixtures/ruby/unused-variable.rb +0 -2
  233. package/tests/utils/linter/fixtures/ruby/valid-code.rb +0 -1
  234. package/tests/utils/linter/fixtures/sass/keyword-error.sass +0 -2
  235. package/tests/utils/linter/fixtures/sass/missing-semicolon.sass +0 -3
  236. package/tests/utils/linter/fixtures/sass/syntax-error.sass +0 -3
  237. package/tests/utils/linter/fixtures/sass/undeclare-variable.sass +0 -2
  238. package/tests/utils/linter/fixtures/sass/unused-variable.sass +0 -4
  239. package/tests/utils/linter/fixtures/sass/valid-code.sass +0 -2
  240. package/tests/utils/linter/fixtures/scss/keyword-error.scss +0 -1
  241. package/tests/utils/linter/fixtures/scss/missing-semicolon.scss +0 -1
  242. package/tests/utils/linter/fixtures/scss/syntax-error.scss +0 -1
  243. package/tests/utils/linter/fixtures/scss/undeclare-variable.scss +0 -1
  244. package/tests/utils/linter/fixtures/scss/unused-variable.scss +0 -2
  245. package/tests/utils/linter/fixtures/scss/valid-code.scss +0 -1
  246. package/tests/utils/linter/fixtures/shell/keyword-error.sh +0 -5
  247. package/tests/utils/linter/fixtures/shell/missing-semicolon.sh +0 -3
  248. package/tests/utils/linter/fixtures/shell/syntax-error.sh +0 -4
  249. package/tests/utils/linter/fixtures/shell/undeclare-variable.sh +0 -3
  250. package/tests/utils/linter/fixtures/shell/unused-variable.sh +0 -4
  251. package/tests/utils/linter/fixtures/shell/valid-code.sh +0 -3
  252. package/tests/utils/linter/fixtures/ts/keyword-error.ts +0 -1
  253. package/tests/utils/linter/fixtures/ts/missing-semicolon.ts +0 -1
  254. package/tests/utils/linter/fixtures/ts/syntax-error.ts +0 -1
  255. package/tests/utils/linter/fixtures/ts/undeclare-variable.ts +0 -1
  256. package/tests/utils/linter/fixtures/ts/unused-variable.ts +0 -3
  257. package/tests/utils/linter/fixtures/ts/valid-code.ts +0 -3
  258. package/tests/utils/linter/fixtures/tsx/keyword-error.tsx +0 -5
  259. package/tests/utils/linter/fixtures/tsx/missing-semicolon.tsx +0 -5
  260. package/tests/utils/linter/fixtures/tsx/syntax-error.tsx +0 -5
  261. package/tests/utils/linter/fixtures/tsx/undeclare-variable.tsx +0 -6
  262. package/tests/utils/linter/fixtures/tsx/unused-variable.tsx +0 -6
  263. package/tests/utils/linter/fixtures/tsx/valid-code.tsx +0 -5
  264. package/tests/utils/linter/fixtures/vue/keyword-error.vue +0 -6
  265. package/tests/utils/linter/fixtures/vue/missing-semicolon.vue +0 -6
  266. package/tests/utils/linter/fixtures/vue/syntax-error.vue +0 -6
  267. package/tests/utils/linter/fixtures/vue/undeclare-variable.vue +0 -6
  268. package/tests/utils/linter/fixtures/vue/unused-variable.vue +0 -7
  269. package/tests/utils/linter/fixtures/vue/valid-code.vue +0 -6
  270. package/tests/utils/linter/fixtures/yaml/keyword-error.yml +0 -1
  271. package/tests/utils/linter/fixtures/yaml/missing-semicolon.yml +0 -2
  272. package/tests/utils/linter/fixtures/yaml/syntax-error.yml +0 -1
  273. package/tests/utils/linter/fixtures/yaml/undeclare-variable.yml +0 -1
  274. package/tests/utils/linter/fixtures/yaml/unused-variable.yml +0 -2
  275. package/tests/utils/linter/fixtures/yaml/valid-code.yml +0 -3
  276. package/tests/utils/linter/index.test.mjs +0 -440
  277. package/tests/utils/linter/scan-results.mjs +0 -42
  278. package/tests/utils/load-config.test.mjs +0 -141
  279. package/tests/utils/markdown/index.test.mjs +0 -478
  280. package/tests/utils/mermaid-validator.test.mjs +0 -541
  281. package/tests/utils/mock-chat-model.mjs +0 -12
  282. package/tests/utils/preferences-utils.test.mjs +0 -465
  283. package/tests/utils/save-value-to-config.test.mjs +0 -483
  284. package/tests/utils/utils.test.mjs +0 -941
@@ -0,0 +1,231 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+
5
+ import pLimit from "p-limit";
6
+ import pRetry from "p-retry";
7
+
8
+ import { getComponentMountPoint } from "./blocklet.mjs";
9
+ import { DISCUSS_KIT_DID } from "./constants/index.mjs";
10
+ import { getMimeType } from "./file-utils.mjs";
11
+
12
+ /**
13
+ * Perform single file upload
14
+ */
15
+ async function performSingleUpload(filePath, fileHash, uploadEndpoint, accessToken, url) {
16
+ const baseFilename = path.basename(filePath, path.extname(filePath));
17
+ const fileBuffer = fs.readFileSync(filePath);
18
+ const stats = fs.statSync(filePath);
19
+ const fileSize = stats.size;
20
+ const fileExt = path.extname(filePath).substring(1);
21
+ const mimeType = getMimeType(filePath);
22
+
23
+ const hashBasedFilename = `${fileHash.substring(0, 16)}.${fileExt}`;
24
+
25
+ const uploaderId = "Uploader";
26
+ const fileId = `${uploaderId}-${baseFilename.toLowerCase().replace(/[^a-z0-9]/g, "")}-${fileHash.substring(0, 16)}`;
27
+
28
+ const tusMetadata = {
29
+ uploaderId,
30
+ relativePath: hashBasedFilename,
31
+ name: hashBasedFilename,
32
+ type: mimeType,
33
+ filetype: mimeType,
34
+ filename: hashBasedFilename,
35
+ };
36
+
37
+ const encodedMetadata = Object.entries(tusMetadata)
38
+ .map(([key, value]) => `${key} ${Buffer.from(value).toString("base64")}`)
39
+ .join(",");
40
+
41
+ const uploadEndpointUrl = new URL(uploadEndpoint);
42
+ const endpointPath = uploadEndpointUrl.pathname;
43
+
44
+ // Create upload
45
+ const createResponse = await fetch(uploadEndpoint, {
46
+ method: "POST",
47
+ headers: {
48
+ "Tus-Resumable": "1.0.0",
49
+ "Upload-Length": fileSize.toString(),
50
+ "Upload-Metadata": encodedMetadata,
51
+ Cookie: `login_token=${accessToken}`,
52
+ "x-uploader-file-name": hashBasedFilename,
53
+ "x-uploader-file-id": fileId,
54
+ "x-uploader-file-ext": fileExt,
55
+ "x-uploader-base-url": endpointPath,
56
+ "x-uploader-endpoint-url": uploadEndpoint,
57
+ "x-uploader-metadata": JSON.stringify({
58
+ uploaderId,
59
+ relativePath: hashBasedFilename,
60
+ name: hashBasedFilename,
61
+ type: mimeType,
62
+ }),
63
+ "x-component-did": DISCUSS_KIT_DID,
64
+ },
65
+ });
66
+
67
+ if (!createResponse.ok) {
68
+ const errorText = await createResponse.text();
69
+ throw new Error(
70
+ `Failed to create upload: ${createResponse.status} ${createResponse.statusText}\n${errorText}`,
71
+ );
72
+ }
73
+
74
+ const uploadUrl = createResponse.headers.get("Location");
75
+ if (!uploadUrl) {
76
+ throw new Error("No upload URL received from server");
77
+ }
78
+
79
+ // Upload file content
80
+ const uploadResponse = await fetch(`${url.origin}${uploadUrl}`, {
81
+ method: "PATCH",
82
+ headers: {
83
+ "Tus-Resumable": "1.0.0",
84
+ "Upload-Offset": "0",
85
+ "Content-Type": "application/offset+octet-stream",
86
+ Cookie: `login_token=${accessToken}`,
87
+ "x-uploader-file-name": hashBasedFilename,
88
+ "x-uploader-file-id": fileId,
89
+ "x-uploader-file-ext": fileExt,
90
+ "x-uploader-base-url": endpointPath,
91
+ "x-uploader-endpoint-url": uploadEndpoint,
92
+ "x-uploader-metadata": JSON.stringify({
93
+ uploaderId,
94
+ relativePath: hashBasedFilename,
95
+ name: hashBasedFilename,
96
+ type: mimeType,
97
+ }),
98
+ "x-component-did": DISCUSS_KIT_DID,
99
+ "x-uploader-file-exist": "true",
100
+ },
101
+ body: fileBuffer,
102
+ });
103
+
104
+ if (!uploadResponse.ok) {
105
+ const errorText = await uploadResponse.text();
106
+ throw new Error(
107
+ `Failed to upload file: ${uploadResponse.status} ${uploadResponse.statusText}\n${errorText}`,
108
+ );
109
+ }
110
+
111
+ const uploadResult = await uploadResponse.json();
112
+
113
+ let uploadedFileUrl = uploadResult.url;
114
+ if (!uploadedFileUrl && uploadResult?.size) {
115
+ uploadedFileUrl = uploadResponse.url;
116
+ }
117
+
118
+ if (!uploadedFileUrl) {
119
+ throw new Error("No URL found in the upload response");
120
+ }
121
+
122
+ return {
123
+ filePath,
124
+ url: uploadedFileUrl,
125
+ };
126
+ }
127
+
128
+ /**
129
+ * Upload multiple files with concurrency control
130
+ * @param {Object} options - Upload options
131
+ * @param {string} options.appUrl - Application URL
132
+ * @param {string[]} options.filePaths - Array of file paths to upload
133
+ * @param {string} options.accessToken - Access token for authentication
134
+ * @param {number} [options.concurrency=3] - Number of concurrent uploads
135
+ * @param {string} [options.endpoint] - Custom upload endpoint
136
+ * @returns {Promise<{results: Array<{filePath: string, url: string}>}>}
137
+ */
138
+ export async function uploadFiles(options) {
139
+ const { appUrl, filePaths, endpoint, concurrency = 3, accessToken } = options;
140
+
141
+ if (filePaths.length === 0) {
142
+ return { results: [] };
143
+ }
144
+
145
+ const url = new URL(appUrl);
146
+ const mountPoint = await getComponentMountPoint(appUrl, DISCUSS_KIT_DID);
147
+
148
+ // Use custom endpoint or default to discuss kit media endpoint
149
+ const uploadEndpoint = endpoint || `${url.origin}${mountPoint}/api/uploads`;
150
+
151
+ const limit = pLimit(concurrency);
152
+ const ongoingUploads = new Map();
153
+
154
+ const uploadPromises = filePaths.map((filePath) =>
155
+ limit(async () => {
156
+ const filename = path.basename(filePath);
157
+
158
+ try {
159
+ const fileBuffer = fs.readFileSync(filePath);
160
+ const fileHash = crypto.createHash("sha256").update(fileBuffer).digest("hex");
161
+
162
+ // Check if this file is already being uploaded
163
+ const existingUpload = ongoingUploads.get(fileHash);
164
+ if (existingUpload) {
165
+ const result = await existingUpload;
166
+ return {
167
+ filePath,
168
+ url: result.url,
169
+ };
170
+ }
171
+
172
+ // Create upload promise and cache it
173
+ const uploadPromise = (async () => {
174
+ try {
175
+ const result = await pRetry(
176
+ () => performSingleUpload(filePath, fileHash, uploadEndpoint, accessToken, url),
177
+ {
178
+ retries: 3,
179
+ onFailedAttempt: (error) => {
180
+ console.warn(
181
+ `File upload attempt ${error.attemptNumber} failed for "${filename}". Remaining retries: ${error.retriesLeft}`,
182
+ );
183
+ if (error.retriesLeft === 0) {
184
+ console.error(
185
+ `File upload failed - all retry attempts exhausted for "${filename}"`,
186
+ );
187
+ }
188
+ },
189
+ },
190
+ );
191
+
192
+ return result;
193
+ } catch (error) {
194
+ console.error(
195
+ `File upload failed - error uploading "${filename}" after all retries:`,
196
+ error,
197
+ );
198
+ return {
199
+ filePath,
200
+ url: "",
201
+ };
202
+ }
203
+ })();
204
+
205
+ // Cache the upload promise
206
+ ongoingUploads.set(fileHash, uploadPromise);
207
+
208
+ try {
209
+ const result = await uploadPromise;
210
+ return {
211
+ filePath,
212
+ url: result.url,
213
+ };
214
+ } finally {
215
+ // Clean up the ongoing upload tracking
216
+ ongoingUploads.delete(fileHash);
217
+ }
218
+ } catch (error) {
219
+ console.error(`Error processing ${filename}:`, error);
220
+ return {
221
+ filePath,
222
+ url: "",
223
+ };
224
+ }
225
+ }),
226
+ );
227
+
228
+ const uploadResults = await Promise.all(uploadPromises);
229
+
230
+ return { results: uploadResults };
231
+ }
package/utils/utils.mjs CHANGED
@@ -47,6 +47,16 @@ export function isGlobPattern(pattern) {
47
47
  return /[*?[\]]|(\*\*)/.test(pattern);
48
48
  }
49
49
 
50
+ /**
51
+ * Check if a string is an HTTP/HTTPS URL
52
+ * @param {string} url - The string to check
53
+ * @returns {boolean} - True if the string starts with http:// or https://
54
+ */
55
+ export function isHttp(url) {
56
+ if (typeof url !== "string") return false;
57
+ return url.startsWith("http://") || url.startsWith("https://");
58
+ }
59
+
50
60
  export function processContent({ content }) {
51
61
  // Match markdown regular links [text](link), exclude images ![text](link)
52
62
  return content.replace(/(?<!!)\[([^\]]+)\]\(([^)]+)\)/g, (match, text, link) => {
@@ -1112,7 +1122,7 @@ export async function resolveFileReferences(obj, basePath = process.cwd()) {
1112
1122
  * @param {string} basePath - Base path for resolving relative paths
1113
1123
  * @returns {Promise<any>} - The loaded content or original path if loading fails
1114
1124
  */
1115
- async function loadFileContent(filePath, basePath) {
1125
+ export async function loadFileContent(filePath, basePath) {
1116
1126
  try {
1117
1127
  // Resolve path - if absolute, use as is; if relative, resolve from basePath
1118
1128
  const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(basePath, filePath);
@@ -1,77 +0,0 @@
1
- # Project information for documentation publishing
2
- projectName: AIGNE DocSmith
3
- projectDesc: AIGNE DocSmith is a powerful, AI-driven documentation generation tool built on the AIGNE Framework. It automates the creation of detailed, structured, and multi-language documentation directly from your source code.
4
- projectLogo: https://docsmith.aigne.io/image-bin/uploads/9645caf64b4232699982c4d940b03b90.svg
5
-
6
- # =============================================================================
7
- # Documentation Configuration
8
- # =============================================================================
9
-
10
- # Purpose: What's the main outcome you want readers to achieve?
11
- # Available options (uncomment and modify as needed):
12
- # getStarted - Get started quickly: Help new users go from zero to working in <30 minutes
13
- # completeTasks - Complete specific tasks: Guide users through common workflows and use cases
14
- # findAnswers - Find answers fast: Provide searchable reference for all features and APIs
15
- # understandSystem - Understand the system: Explain how it works, why design decisions were made
16
- # solveProblems - Solve problems: Help users troubleshoot and fix issues
17
- # mixedPurpose - Mix of above: Comprehensive documentation covering multiple needs
18
- documentPurpose:
19
- - getStarted
20
- - completeTasks
21
-
22
- # Target Audience: Who will be reading this most often?
23
- # Available options (uncomment and modify as needed):
24
- # endUsers - End users (non-technical): People who use the product but don't code
25
- # developers - Developers integrating: Engineers adding this to their projects
26
- # devops - DevOps/Infrastructure: Teams deploying, monitoring, maintaining systems
27
- # decisionMakers - Technical decision makers: Architects, leads evaluating or planning implementation
28
- # supportTeams - Support teams: People helping others use the product
29
- # mixedTechnical - Mixed technical audience: Developers, DevOps, and technical users
30
- targetAudienceTypes:
31
- - endUsers
32
-
33
- # Reader Knowledge Level: What do readers typically know when they arrive?
34
- # Available options (uncomment and modify as needed):
35
- # completeBeginners - Complete beginners: New to this domain/technology entirely
36
- # domainFamiliar - Domain-familiar, tool-new: Know the problem space, new to this specific solution
37
- # experiencedUsers - Experienced users: Regular users needing reference/advanced topics
38
- # emergencyTroubleshooting - Emergency/troubleshooting: Something's broken, need to fix it quickly
39
- # exploringEvaluating - Exploring/evaluating: Trying to understand if this fits their needs
40
- readerKnowledgeLevel: completeBeginners
41
-
42
- # Documentation Depth: How comprehensive should the documentation be?
43
- # Available options (uncomment and modify as needed):
44
- # essentialOnly - Essential only: Cover the 80% use cases, keep it concise
45
- # balancedCoverage - Balanced coverage: Good depth with practical examples [RECOMMENDED]
46
- # comprehensive - Comprehensive: Cover all features, edge cases, and advanced scenarios
47
- # aiDecide - Let AI decide: Analyze code complexity and suggest appropriate depth
48
- documentationDepth: comprehensive
49
-
50
- # Custom Rules: Define specific documentation generation rules and requirements
51
- rules: |
52
- Avoid using vague or empty words that don't provide measurable or specific details, such as 'intelligently', 'seamlessly', 'comprehensive', or 'high-quality'. Focus on concrete, verifiable facts and information.
53
- Focus on concrete, verifiable facts and information.
54
- Must cover all subcommands of DocSmith
55
-
56
- # Target Audience: Describe your specific target audience and their characteristics
57
- targetAudience: |
58
-
59
- locale: en
60
- translateLanguages:
61
- - zh
62
- - zh-TW
63
- - ja
64
- docsDir: ./docs # Directory to save generated documentation
65
- sourcesPath: # Source code paths to analyze
66
- - ./README.md
67
- - ./CHANGELOG.md
68
- - ./aigne.yaml
69
- - ./agents
70
- - ./media.md
71
- - ./.aigne/doc-smith/config.yaml
72
- lastGitHead: f0db74dffd0876dab4cc3ad628523abd359c9430
73
- # ⚠️ Warning: boardId is auto-generated by system, please do not edit manually
74
- boardId: "docsmith"
75
- appUrl: https://docsmith.aigne.io
76
- # Checkout ID for document deployment service
77
- checkoutId: ""
@@ -1,37 +0,0 @@
1
- entries:
2
- - timestamp: 2025-10-11T13:21:51.992Z
3
- operation: translation_update
4
- feedback: Do not translate the Target column in the Cleanup Targets table.
5
- documentPath: /guides/cleaning-up
6
- - timestamp: 2025-10-11T13:20:30.314Z
7
- operation: document_update
8
- feedback: The targets in Cleanup Targets are incomplete and need to be supplemented. The corresponding descriptions also require updating. Additionally, the target values should use the original enumeration values, such as 'generatedDocs'.
9
- documentPath: /guides/cleaning-up
10
- - timestamp: 2025-10-11T13:03:20.327Z
11
- operation: document_update
12
- feedback: The two aliases for the 'history' command in Viewing Update History can be combined into a single code block. The Short Hash in Understanding the History Output now consists of 8 characters. Additionally, operation types are separated by underscores, such as 'document_update'.
13
- documentPath: /guides/managing-history
14
- - timestamp: 2025-10-11T12:56:23.107Z
15
- operation: document_update
16
- feedback: In interactive mode, translated files are saved with a suffix appended to their original filenames within the same directory, rather than in dedicated language directories.
17
- documentPath: /guides/translating-documentation
18
- - timestamp: 2025-10-11T12:50:25.563Z
19
- operation: document_update
20
- feedback: The value of the 'docs' parameter in the demo should be a path separated by '-' rather than '/', and '.md' should be preserved.
21
- documentPath: /guides/updating-documentation
22
- - timestamp: 2025-10-11T12:46:37.507Z
23
- operation: document_update
24
- feedback: The value of the 'docs' parameter in the demo should be a path separated by '-' rather than '/'.
25
- documentPath: /guides/updating-documentation
26
- - timestamp: 2025-10-11T12:39:53.222Z
27
- operation: document_update
28
- feedback: The prompts in Review the Documentation Structure are outdated and need updating. Command Parameters also require updating.
29
- documentPath: /guides/generating-documentation
30
- - timestamp: 2025-10-11T12:26:24.598Z
31
- operation: translation_update
32
- feedback: AIGNE Framework is a proper noun and has its own link; no translation is required.
33
- documentPath: /overview
34
- - timestamp: 2025-10-11T12:24:05.477Z
35
- operation: document_update
36
- feedback: Add a link to the AIGNE Framework 'https://www.aigne.io/framework'.
37
- documentPath: /overview
@@ -1,162 +0,0 @@
1
- [
2
- {
3
- "title": "Overview",
4
- "description": "Explains what AIGNE DocSmith does, the problems it solves, and its main capabilities based on your project's code.",
5
- "path": "/overview",
6
- "sourceIds": ["README.md", "aigne.yaml", ".aigne/doc-smith/config.yaml"],
7
- "parentId": ""
8
- },
9
- {
10
- "title": "Getting Started",
11
- "description": "Provides a step-by-step guide to installing the tool and generating your first set of documents.",
12
- "path": "/getting-started",
13
- "sourceIds": ["README.md", "agents/init/index.mjs", "media.md"],
14
- "parentId": ""
15
- },
16
- {
17
- "title": "Guides",
18
- "description": "Contains step-by-step instructions for performing common documentation tasks.",
19
- "path": "/guides",
20
- "sourceIds": [
21
- "aigne.yaml",
22
- "README.md",
23
- "agents/generate/index.yaml",
24
- "agents/update/index.yaml",
25
- "agents/translate/index.yaml",
26
- "agents/publish/index.yaml",
27
- "agents/clear/index.yaml",
28
- "agents/evaluate/index.yaml",
29
- "agents/history/index.yaml",
30
- "agents/chat/index.yaml"
31
- ],
32
- "parentId": ""
33
- },
34
- {
35
- "title": "Configuration",
36
- "description": "Details how to set up the tool and manage personal preferences for document generation.",
37
- "path": "/configuration",
38
- "sourceIds": [
39
- "aigne.yaml",
40
- "agents/init/index.mjs",
41
- "agents/prefs/index.mjs",
42
- ".aigne/doc-smith/config.yaml"
43
- ],
44
- "parentId": ""
45
- },
46
- {
47
- "title": "Release Notes",
48
- "description": "Lists new features, improvements, and bug fixes for each version of the tool.",
49
- "path": "/release-notes",
50
- "sourceIds": ["CHANGELOG.md"],
51
- "parentId": ""
52
- },
53
- {
54
- "title": "Generating Documentation",
55
- "description": "Walks through the process of creating a new set of documents from your source files from start to finish.",
56
- "path": "/guides/generating-documentation",
57
- "sourceIds": [
58
- "agents/generate/index.yaml",
59
- "agents/generate/generate-structure.yaml",
60
- "agents/generate/user-review-document-structure.mjs",
61
- "agents/update/batch-generate-document.yaml",
62
- "README.md",
63
- "agents/generate/check-need-generate-structure.mjs",
64
- "agents/generate/refine-document-structure.yaml",
65
- "agents/generate/check-document-structure.yaml"
66
- ],
67
- "parentId": "/guides"
68
- },
69
- {
70
- "title": "Updating Documentation",
71
- "description": "Explains how to modify existing documents based on code changes or new feedback.",
72
- "path": "/guides/updating-documentation",
73
- "sourceIds": [
74
- "agents/update/index.yaml",
75
- "agents/update/update-single-document.yaml",
76
- "agents/update/batch-update-document.yaml",
77
- "agents/update/user-review-document.mjs",
78
- "README.md",
79
- "agents/update/check-update-is-single.mjs",
80
- "agents/update/handle-document-update.yaml",
81
- "agents/update/generate-document.yaml"
82
- ],
83
- "parentId": "/guides"
84
- },
85
- {
86
- "title": "Translating Documentation",
87
- "description": "Details the steps to translate your documents into multiple supported languages.",
88
- "path": "/guides/translating-documentation",
89
- "sourceIds": [
90
- "agents/translate/index.yaml",
91
- "agents/translate/translate-multilingual.yaml",
92
- "agents/translate/choose-language.mjs",
93
- "README.md",
94
- "agents/translate/translate-document.yaml",
95
- "agents/translate/record-translation-history.mjs"
96
- ],
97
- "parentId": "/guides"
98
- },
99
- {
100
- "title": "Publishing Your Docs",
101
- "description": "Shows how to make your generated documentation live and accessible online.",
102
- "path": "/guides/publishing-your-docs",
103
- "sourceIds": ["agents/publish/index.yaml", "agents/publish/publish-docs.mjs", "README.md"],
104
- "parentId": "/guides"
105
- },
106
- {
107
- "title": "Initial Setup",
108
- "description": "Guides you through the interactive setup process to create your initial configuration file.",
109
- "path": "/configuration/initial-setup",
110
- "sourceIds": ["agents/init/index.mjs", "README.md", ".aigne/doc-smith/config.yaml"],
111
- "parentId": "/configuration"
112
- },
113
- {
114
- "title": "Managing Preferences",
115
- "description": "Explains how to view, remove, and toggle your saved preferences for documentation generation.",
116
- "path": "/configuration/managing-preferences",
117
- "sourceIds": ["agents/prefs/index.mjs", "README.md"],
118
- "parentId": "/configuration"
119
- },
120
- {
121
- "title": "Managing History",
122
- "description": "Shows how to view the history of updates made to your documentation.",
123
- "path": "/guides/managing-history",
124
- "sourceIds": ["agents/history/view.mjs", "aigne.yaml", "agents/history/index.yaml"],
125
- "parentId": "/guides"
126
- },
127
- {
128
- "title": "Evaluating Documents",
129
- "description": "Details how to use the evaluation command to assess the quality and completeness of your generated documentation.",
130
- "path": "/guides/evaluating-documents",
131
- "sourceIds": [
132
- "agents/evaluate/index.yaml",
133
- "aigne.yaml",
134
- "agents/evaluate/document-structure.yaml",
135
- "agents/evaluate/document.yaml",
136
- "agents/evaluate/generate-report.mjs"
137
- ],
138
- "parentId": "/guides"
139
- },
140
- {
141
- "title": "Cleaning Up",
142
- "description": "Provides instructions on how to use the clear command to remove generated files, configurations, and cached data.",
143
- "path": "/guides/cleaning-up",
144
- "sourceIds": [
145
- "agents/clear/index.yaml",
146
- "aigne.yaml",
147
- "agents/clear/choose-contents.mjs",
148
- "agents/clear/clear-generated-docs.mjs",
149
- "agents/clear/clear-document-structure.mjs",
150
- "agents/clear/clear-document-config.mjs",
151
- "agents/clear/clear-auth-tokens.mjs"
152
- ],
153
- "parentId": "/guides"
154
- },
155
- {
156
- "title": "Interactive Chat",
157
- "description": "Explains how to use the interactive chat assistant to generate, modify, and manage your documentation.",
158
- "path": "/guides/interactive-chat",
159
- "sourceIds": ["agents/chat/index.yaml", "aigne.yaml"],
160
- "parentId": "/guides"
161
- }
162
- ]
@@ -1,97 +0,0 @@
1
- rules:
2
- - id: pref_cbc8005011c08ca0
3
- active: true
4
- scope: translation
5
- rule: In the table titled 'Cleanup Targets', the 'Target' column must retain the original text and should not be translated.
6
- feedback: Do not translate the Target column in the Cleanup Targets table.
7
- createdAt: 2025-10-11T13:22:06.529Z
8
- - id: pref_545cabc521ecd4a5
9
- active: true
10
- scope: translation
11
- rule: The proprietary term 'AIGNE Framework' must not be translated and must be retained in its original form.
12
- feedback: AIGNE Framework is a proper noun and has its own link; no translation is required.
13
- createdAt: 2025-10-11T12:26:37.517Z
14
- - id: pref_6e612d7ca8b7f3b6
15
- active: true
16
- scope: document
17
- rule: When describing publishing options, should use plain text instead of custom components, and recommend users to run
18
- their own Discuss Kit instance while providing relevant links.
19
- feedback: "Publishing options should not use custom components: recommend users to run their own Discuss Kit instance in
20
- the text, and add Discuss Kit related links"
21
- createdAt: 2025-09-07T02:18:22.237Z
22
- - id: pref_039b58c47bdf95c9
23
- active: true
24
- scope: document
25
- rule: In the "Prerequisites" section, should briefly introduce Node.js installation, specify using npm instead of pnpm,
26
- and guide users to the official website for detailed instructions.
27
- feedback: In the prerequisites section, provide a simple introduction on how to install Node.js, no need to install pnpm
28
- but use npm instead, guide users to the product official website for detailed installation instructions
29
- createdAt: 2025-09-07T02:06:39.559Z
30
- - id: pref_03a45a593f645ce2
31
- active: true
32
- scope: document
33
- rule: When describing Discuss Kit, must clearly state that it is a non-open-source service running on the official
34
- platform, not a self-hosted instance.
35
- feedback: "In the core features description about document publishing, show the official platform link, run your own
36
- Discuss Kit instance, not self-hosted: Discuss Kit is not open source."
37
- createdAt: 2025-09-07T01:59:12.876Z
38
- - id: pref_0c239f619329089f
39
- active: true
40
- scope: document
41
- rule: In the core features section, should use plain list format and add descriptions and links for AIGNE Hub and
42
- Discuss Kit.
43
- feedback: Core features section should not use custom component lists, change to plain lists, add descriptions and links
44
- for AIGNE Hub and Discuss Kit to help users understand these two products
45
- createdAt: 2025-09-07T01:53:22.969Z
46
- paths:
47
- - /overview
48
- - id: pref_4e8aa735b11d8484
49
- active: true
50
- scope: document
51
- rule: In the 'How It Works' document, only show DocSmith implementation details, should not include AIGNE Framework
52
- information.
53
- feedback: How it works section does not need to show AIGNE Framework, only need to show DocSmith implementation
54
- createdAt: 2025-09-06T13:15:10.272Z
55
- paths:
56
- - /advanced/how-it-works
57
- - id: pref_4ad26164f1f4fbf6
58
- active: true
59
- scope: document
60
- rule: When describing multi-language support features, must clearly state support for 12 languages and list two to three
61
- mainstream languages as examples.
62
- feedback: Multi-language support related features, clearly support 12 languages, no above statement, and give examples
63
- of two or three mainstream languages
64
- createdAt: 2025-09-06T12:55:42.678Z
65
- - id: pref_c84baec514ca5c60
66
- active: true
67
- scope: document
68
- rule: Core features list must describe product functionality characteristics, not promotional value or importance.
69
- feedback: Core features list should describe DocSmith's functional characteristics, not describe product importance like
70
- a promotional brochure
71
- createdAt: 2025-09-06T12:47:46.583Z
72
- - id: pref_6da200d8e6fec09e
73
- active: true
74
- scope: structure
75
- rule: Do not generate documentation about contribution guidelines.
76
- feedback: Remove contribution guidelines related documentation, this content is not ready yet
77
- createdAt: 2025-08-30T14:46:32.741Z
78
- - id: pref_8c619b5228f791e5
79
- active: true
80
- scope: document
81
- rule: Do not generate content about Mermaid chart validation, as charts have been changed to use D2.
82
- feedback: Remove mermaid chart validation related descriptions, charts now use D2
83
- createdAt: 2025-08-30T14:29:04.068Z
84
- - id: pref_0e154f58c22329fb
85
- active: true
86
- scope: document
87
- rule: Do not generate documentation content about development commands that are no longer supported.
88
- feedback: Remove development command related documentation, these development commands are no longer supported
89
- createdAt: 2025-08-30T14:13:50.446Z
90
- - id: pref_0112657e4103ba88
91
- active: true
92
- scope: structure
93
- rule: Update documentation structure based on the latest source code, can add new documents and modify document
94
- dependencies on source code, but prohibit modifying any existing document paths.
95
- feedback: Update documentation structure based on the latest source code, allow adding new documents and modifying
96
- document dependencies on source code, cannot modify existing document paths
97
- createdAt: 2025-08-30T14:03:47.434Z