@aigne/doc-smith 0.8.12-beta.8 → 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 (264) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/agents/publish/index.yaml +4 -0
  3. package/agents/publish/publish-docs.mjs +77 -5
  4. package/agents/publish/translate-meta.mjs +103 -0
  5. package/agents/update/generate-document.yaml +30 -28
  6. package/agents/update/update-document-detail.yaml +3 -1
  7. package/agents/utils/update-branding.mjs +69 -0
  8. package/package.json +16 -2
  9. package/prompts/common/document/role-and-personality.md +3 -1
  10. package/prompts/detail/d2-diagram/guide.md +7 -1
  11. package/prompts/detail/d2-diagram/user-prompt.md +3 -0
  12. package/prompts/detail/generate/system-prompt.md +6 -7
  13. package/prompts/detail/generate/user-prompt.md +12 -3
  14. package/prompts/detail/update/user-prompt.md +0 -2
  15. package/prompts/structure/update/user-prompt.md +0 -4
  16. package/utils/file-utils.mjs +69 -24
  17. package/utils/markdown-checker.mjs +0 -20
  18. package/utils/request.mjs +7 -0
  19. package/utils/upload-files.mjs +231 -0
  20. package/utils/utils.mjs +11 -1
  21. package/.aigne/doc-smith/config.yaml +0 -77
  22. package/.aigne/doc-smith/history.yaml +0 -37
  23. package/.aigne/doc-smith/media-description.yaml +0 -91
  24. package/.aigne/doc-smith/output/structure-plan.json +0 -162
  25. package/.aigne/doc-smith/preferences.yml +0 -97
  26. package/.aigne/doc-smith/upload-cache.yaml +0 -1830
  27. package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
  28. package/.github/workflows/ci.yml +0 -54
  29. package/.github/workflows/create-release-pr.yaml +0 -21
  30. package/.github/workflows/publish-docs.yml +0 -65
  31. package/.github/workflows/release.yml +0 -49
  32. package/.github/workflows/reviewer.yml +0 -54
  33. package/.release-please-manifest.json +0 -3
  34. package/RELEASE.md +0 -9
  35. package/assets/screenshots/doc-complete-setup.png +0 -0
  36. package/assets/screenshots/doc-generate-docs.png +0 -0
  37. package/assets/screenshots/doc-generate.png +0 -0
  38. package/assets/screenshots/doc-generated-successfully.png +0 -0
  39. package/assets/screenshots/doc-publish.png +0 -0
  40. package/assets/screenshots/doc-regenerate.png +0 -0
  41. package/assets/screenshots/doc-translate-langs.png +0 -0
  42. package/assets/screenshots/doc-translate.png +0 -0
  43. package/assets/screenshots/doc-update.png +0 -0
  44. package/biome.json +0 -73
  45. package/codecov.yml +0 -15
  46. package/docs/_sidebar.md +0 -15
  47. package/docs/configuration-initial-setup.ja.md +0 -179
  48. package/docs/configuration-initial-setup.md +0 -198
  49. package/docs/configuration-initial-setup.zh-TW.md +0 -179
  50. package/docs/configuration-initial-setup.zh.md +0 -179
  51. package/docs/configuration-managing-preferences.ja.md +0 -100
  52. package/docs/configuration-managing-preferences.md +0 -100
  53. package/docs/configuration-managing-preferences.zh-TW.md +0 -100
  54. package/docs/configuration-managing-preferences.zh.md +0 -100
  55. package/docs/configuration.ja.md +0 -69
  56. package/docs/configuration.md +0 -69
  57. package/docs/configuration.zh-TW.md +0 -69
  58. package/docs/configuration.zh.md +0 -69
  59. package/docs/getting-started.ja.md +0 -107
  60. package/docs/getting-started.md +0 -107
  61. package/docs/getting-started.zh-TW.md +0 -107
  62. package/docs/getting-started.zh.md +0 -107
  63. package/docs/guides-cleaning-up.ja.md +0 -51
  64. package/docs/guides-cleaning-up.md +0 -52
  65. package/docs/guides-cleaning-up.zh-TW.md +0 -51
  66. package/docs/guides-cleaning-up.zh.md +0 -51
  67. package/docs/guides-evaluating-documents.ja.md +0 -66
  68. package/docs/guides-evaluating-documents.md +0 -107
  69. package/docs/guides-evaluating-documents.zh-TW.md +0 -66
  70. package/docs/guides-evaluating-documents.zh.md +0 -66
  71. package/docs/guides-generating-documentation.ja.md +0 -151
  72. package/docs/guides-generating-documentation.md +0 -89
  73. package/docs/guides-generating-documentation.zh-TW.md +0 -151
  74. package/docs/guides-generating-documentation.zh.md +0 -151
  75. package/docs/guides-interactive-chat.ja.md +0 -85
  76. package/docs/guides-interactive-chat.md +0 -93
  77. package/docs/guides-interactive-chat.zh-TW.md +0 -85
  78. package/docs/guides-interactive-chat.zh.md +0 -85
  79. package/docs/guides-managing-history.ja.md +0 -48
  80. package/docs/guides-managing-history.md +0 -53
  81. package/docs/guides-managing-history.zh-TW.md +0 -48
  82. package/docs/guides-managing-history.zh.md +0 -48
  83. package/docs/guides-publishing-your-docs.ja.md +0 -78
  84. package/docs/guides-publishing-your-docs.md +0 -83
  85. package/docs/guides-publishing-your-docs.zh-TW.md +0 -78
  86. package/docs/guides-publishing-your-docs.zh.md +0 -78
  87. package/docs/guides-translating-documentation.ja.md +0 -95
  88. package/docs/guides-translating-documentation.md +0 -100
  89. package/docs/guides-translating-documentation.zh-TW.md +0 -95
  90. package/docs/guides-translating-documentation.zh.md +0 -95
  91. package/docs/guides-updating-documentation.ja.md +0 -77
  92. package/docs/guides-updating-documentation.md +0 -79
  93. package/docs/guides-updating-documentation.zh-TW.md +0 -77
  94. package/docs/guides-updating-documentation.zh.md +0 -77
  95. package/docs/guides.ja.md +0 -32
  96. package/docs/guides.md +0 -32
  97. package/docs/guides.zh-TW.md +0 -32
  98. package/docs/guides.zh.md +0 -32
  99. package/docs/overview.ja.md +0 -61
  100. package/docs/overview.md +0 -61
  101. package/docs/overview.zh-TW.md +0 -61
  102. package/docs/overview.zh.md +0 -61
  103. package/docs/release-notes.ja.md +0 -255
  104. package/docs/release-notes.md +0 -288
  105. package/docs/release-notes.zh-TW.md +0 -255
  106. package/docs/release-notes.zh.md +0 -255
  107. package/prompts/common/afs/afs-tools-usage.md +0 -5
  108. package/prompts/common/afs/use-afs-instruction.md +0 -1
  109. package/release-please-config.json +0 -14
  110. package/tests/agents/chat/chat.test.mjs +0 -46
  111. package/tests/agents/clear/choose-contents.test.mjs +0 -284
  112. package/tests/agents/clear/clear-auth-tokens.test.mjs +0 -268
  113. package/tests/agents/clear/clear-document-config.test.mjs +0 -167
  114. package/tests/agents/clear/clear-document-structure.test.mjs +0 -380
  115. package/tests/agents/clear/clear-generated-docs.test.mjs +0 -222
  116. package/tests/agents/evaluate/code-snippet.test.mjs +0 -163
  117. package/tests/agents/evaluate/fixtures/api-services.md +0 -87
  118. package/tests/agents/evaluate/fixtures/js-sdk.md +0 -94
  119. package/tests/agents/evaluate/generate-report.test.mjs +0 -312
  120. package/tests/agents/generate/check-document-structure.test.mjs +0 -45
  121. package/tests/agents/generate/check-need-generate-structure.test.mjs +0 -279
  122. package/tests/agents/generate/document-structure-tools/add-document.test.mjs +0 -449
  123. package/tests/agents/generate/document-structure-tools/delete-document.test.mjs +0 -410
  124. package/tests/agents/generate/document-structure-tools/generate-sub-structure.test.mjs +0 -277
  125. package/tests/agents/generate/document-structure-tools/move-document.test.mjs +0 -476
  126. package/tests/agents/generate/document-structure-tools/update-document.test.mjs +0 -548
  127. package/tests/agents/generate/generate-structure.test.mjs +0 -45
  128. package/tests/agents/generate/user-review-document-structure.test.mjs +0 -319
  129. package/tests/agents/history/view.test.mjs +0 -97
  130. package/tests/agents/init/init.test.mjs +0 -1657
  131. package/tests/agents/prefs/prefs.test.mjs +0 -431
  132. package/tests/agents/publish/publish-docs.test.mjs +0 -787
  133. package/tests/agents/translate/choose-language.test.mjs +0 -311
  134. package/tests/agents/translate/translate-document.test.mjs +0 -51
  135. package/tests/agents/update/check-document.test.mjs +0 -463
  136. package/tests/agents/update/check-update-is-single.test.mjs +0 -300
  137. package/tests/agents/update/document-tools/update-document-content.test.mjs +0 -329
  138. package/tests/agents/update/generate-document.test.mjs +0 -51
  139. package/tests/agents/update/save-and-translate-document.test.mjs +0 -369
  140. package/tests/agents/update/user-review-document.test.mjs +0 -582
  141. package/tests/agents/utils/action-success.test.mjs +0 -54
  142. package/tests/agents/utils/check-detail-result.test.mjs +0 -743
  143. package/tests/agents/utils/check-feedback-refiner.test.mjs +0 -478
  144. package/tests/agents/utils/choose-docs.test.mjs +0 -406
  145. package/tests/agents/utils/exit.test.mjs +0 -70
  146. package/tests/agents/utils/feedback-refiner.test.mjs +0 -51
  147. package/tests/agents/utils/find-item-by-path.test.mjs +0 -517
  148. package/tests/agents/utils/find-user-preferences-by-path.test.mjs +0 -382
  149. package/tests/agents/utils/format-document-structure.test.mjs +0 -364
  150. package/tests/agents/utils/fs.test.mjs +0 -267
  151. package/tests/agents/utils/load-sources.test.mjs +0 -1470
  152. package/tests/agents/utils/save-docs.test.mjs +0 -109
  153. package/tests/agents/utils/save-output.test.mjs +0 -315
  154. package/tests/agents/utils/save-single-doc.test.mjs +0 -364
  155. package/tests/agents/utils/transform-detail-datasources.test.mjs +0 -320
  156. package/tests/utils/auth-utils.test.mjs +0 -596
  157. package/tests/utils/blocklet.test.mjs +0 -336
  158. package/tests/utils/conflict-detector.test.mjs +0 -355
  159. package/tests/utils/constants.test.mjs +0 -295
  160. package/tests/utils/d2-utils.test.mjs +0 -437
  161. package/tests/utils/deploy.test.mjs +0 -399
  162. package/tests/utils/docs-finder-utils.test.mjs +0 -650
  163. package/tests/utils/file-utils.test.mjs +0 -521
  164. package/tests/utils/history-utils.test.mjs +0 -206
  165. package/tests/utils/kroki-utils.test.mjs +0 -646
  166. package/tests/utils/linter/fixtures/css/keyword-error.css +0 -1
  167. package/tests/utils/linter/fixtures/css/missing-semicolon.css +0 -1
  168. package/tests/utils/linter/fixtures/css/syntax-error.css +0 -1
  169. package/tests/utils/linter/fixtures/css/undeclare-variable.css +0 -1
  170. package/tests/utils/linter/fixtures/css/unused-variable.css +0 -2
  171. package/tests/utils/linter/fixtures/css/valid-code.css +0 -1
  172. package/tests/utils/linter/fixtures/dockerfile/keyword-error.dockerfile +0 -1
  173. package/tests/utils/linter/fixtures/dockerfile/missing-semicolon.dockerfile +0 -2
  174. package/tests/utils/linter/fixtures/dockerfile/syntax-error.dockerfile +0 -2
  175. package/tests/utils/linter/fixtures/dockerfile/undeclare-variable.dockerfile +0 -1
  176. package/tests/utils/linter/fixtures/dockerfile/unused-variable.dockerfile +0 -1
  177. package/tests/utils/linter/fixtures/dockerfile/valid-code.dockerfile +0 -2
  178. package/tests/utils/linter/fixtures/go/keyword-error.go +0 -5
  179. package/tests/utils/linter/fixtures/go/missing-semicolon.go +0 -5
  180. package/tests/utils/linter/fixtures/go/syntax-error.go +0 -6
  181. package/tests/utils/linter/fixtures/go/undeclare-variable.go +0 -5
  182. package/tests/utils/linter/fixtures/go/unused-variable.go +0 -5
  183. package/tests/utils/linter/fixtures/go/valid-code.go +0 -7
  184. package/tests/utils/linter/fixtures/js/keyword-error.js +0 -3
  185. package/tests/utils/linter/fixtures/js/missing-semicolon.js +0 -6
  186. package/tests/utils/linter/fixtures/js/syntax-error.js +0 -4
  187. package/tests/utils/linter/fixtures/js/undeclare-variable.js +0 -3
  188. package/tests/utils/linter/fixtures/js/unused-variable.js +0 -7
  189. package/tests/utils/linter/fixtures/js/valid-code.js +0 -15
  190. package/tests/utils/linter/fixtures/json/keyword-error.json +0 -1
  191. package/tests/utils/linter/fixtures/json/missing-semicolon.json +0 -1
  192. package/tests/utils/linter/fixtures/json/syntax-error.json +0 -1
  193. package/tests/utils/linter/fixtures/json/undeclare-variable.json +0 -1
  194. package/tests/utils/linter/fixtures/json/unused-variable.json +0 -1
  195. package/tests/utils/linter/fixtures/json/valid-code.json +0 -1
  196. package/tests/utils/linter/fixtures/jsx/keyword-error.jsx +0 -5
  197. package/tests/utils/linter/fixtures/jsx/missing-semicolon.jsx +0 -5
  198. package/tests/utils/linter/fixtures/jsx/syntax-error.jsx +0 -5
  199. package/tests/utils/linter/fixtures/jsx/undeclare-variable.jsx +0 -5
  200. package/tests/utils/linter/fixtures/jsx/unused-variable.jsx +0 -4
  201. package/tests/utils/linter/fixtures/jsx/valid-code.jsx +0 -5
  202. package/tests/utils/linter/fixtures/python/keyword-error.py +0 -3
  203. package/tests/utils/linter/fixtures/python/missing-semicolon.py +0 -2
  204. package/tests/utils/linter/fixtures/python/syntax-error.py +0 -3
  205. package/tests/utils/linter/fixtures/python/undeclare-variable.py +0 -3
  206. package/tests/utils/linter/fixtures/python/unused-variable.py +0 -6
  207. package/tests/utils/linter/fixtures/python/valid-code.py +0 -12
  208. package/tests/utils/linter/fixtures/ruby/keyword-error.rb +0 -2
  209. package/tests/utils/linter/fixtures/ruby/missing-semicolon.rb +0 -1
  210. package/tests/utils/linter/fixtures/ruby/syntax-error.rb +0 -2
  211. package/tests/utils/linter/fixtures/ruby/undeclare-variable.rb +0 -1
  212. package/tests/utils/linter/fixtures/ruby/unused-variable.rb +0 -2
  213. package/tests/utils/linter/fixtures/ruby/valid-code.rb +0 -1
  214. package/tests/utils/linter/fixtures/sass/keyword-error.sass +0 -2
  215. package/tests/utils/linter/fixtures/sass/missing-semicolon.sass +0 -3
  216. package/tests/utils/linter/fixtures/sass/syntax-error.sass +0 -3
  217. package/tests/utils/linter/fixtures/sass/undeclare-variable.sass +0 -2
  218. package/tests/utils/linter/fixtures/sass/unused-variable.sass +0 -4
  219. package/tests/utils/linter/fixtures/sass/valid-code.sass +0 -2
  220. package/tests/utils/linter/fixtures/scss/keyword-error.scss +0 -1
  221. package/tests/utils/linter/fixtures/scss/missing-semicolon.scss +0 -1
  222. package/tests/utils/linter/fixtures/scss/syntax-error.scss +0 -1
  223. package/tests/utils/linter/fixtures/scss/undeclare-variable.scss +0 -1
  224. package/tests/utils/linter/fixtures/scss/unused-variable.scss +0 -2
  225. package/tests/utils/linter/fixtures/scss/valid-code.scss +0 -1
  226. package/tests/utils/linter/fixtures/shell/keyword-error.sh +0 -5
  227. package/tests/utils/linter/fixtures/shell/missing-semicolon.sh +0 -3
  228. package/tests/utils/linter/fixtures/shell/syntax-error.sh +0 -4
  229. package/tests/utils/linter/fixtures/shell/undeclare-variable.sh +0 -3
  230. package/tests/utils/linter/fixtures/shell/unused-variable.sh +0 -4
  231. package/tests/utils/linter/fixtures/shell/valid-code.sh +0 -3
  232. package/tests/utils/linter/fixtures/ts/keyword-error.ts +0 -1
  233. package/tests/utils/linter/fixtures/ts/missing-semicolon.ts +0 -1
  234. package/tests/utils/linter/fixtures/ts/syntax-error.ts +0 -1
  235. package/tests/utils/linter/fixtures/ts/undeclare-variable.ts +0 -1
  236. package/tests/utils/linter/fixtures/ts/unused-variable.ts +0 -3
  237. package/tests/utils/linter/fixtures/ts/valid-code.ts +0 -3
  238. package/tests/utils/linter/fixtures/tsx/keyword-error.tsx +0 -5
  239. package/tests/utils/linter/fixtures/tsx/missing-semicolon.tsx +0 -5
  240. package/tests/utils/linter/fixtures/tsx/syntax-error.tsx +0 -5
  241. package/tests/utils/linter/fixtures/tsx/undeclare-variable.tsx +0 -6
  242. package/tests/utils/linter/fixtures/tsx/unused-variable.tsx +0 -6
  243. package/tests/utils/linter/fixtures/tsx/valid-code.tsx +0 -5
  244. package/tests/utils/linter/fixtures/vue/keyword-error.vue +0 -6
  245. package/tests/utils/linter/fixtures/vue/missing-semicolon.vue +0 -6
  246. package/tests/utils/linter/fixtures/vue/syntax-error.vue +0 -6
  247. package/tests/utils/linter/fixtures/vue/undeclare-variable.vue +0 -6
  248. package/tests/utils/linter/fixtures/vue/unused-variable.vue +0 -7
  249. package/tests/utils/linter/fixtures/vue/valid-code.vue +0 -6
  250. package/tests/utils/linter/fixtures/yaml/keyword-error.yml +0 -1
  251. package/tests/utils/linter/fixtures/yaml/missing-semicolon.yml +0 -2
  252. package/tests/utils/linter/fixtures/yaml/syntax-error.yml +0 -1
  253. package/tests/utils/linter/fixtures/yaml/undeclare-variable.yml +0 -1
  254. package/tests/utils/linter/fixtures/yaml/unused-variable.yml +0 -2
  255. package/tests/utils/linter/fixtures/yaml/valid-code.yml +0 -3
  256. package/tests/utils/linter/index.test.mjs +0 -440
  257. package/tests/utils/linter/scan-results.mjs +0 -42
  258. package/tests/utils/load-config.test.mjs +0 -141
  259. package/tests/utils/markdown/index.test.mjs +0 -478
  260. package/tests/utils/mermaid-validator.test.mjs +0 -541
  261. package/tests/utils/mock-chat-model.mjs +0 -12
  262. package/tests/utils/preferences-utils.test.mjs +0 -465
  263. package/tests/utils/save-value-to-config.test.mjs +0 -483
  264. package/tests/utils/utils.test.mjs +0 -941
@@ -1,268 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from "bun:test";
2
- import * as fs from "node:fs";
3
- import * as fsPromises from "node:fs/promises";
4
- import clearAuthTokens from "../../../agents/clear/clear-auth-tokens.mjs";
5
-
6
- describe("clear-auth-tokens", () => {
7
- let mockOptions;
8
- let existsSyncSpy;
9
- let readFileSpy;
10
- let writeFileSpy;
11
-
12
- beforeEach(() => {
13
- mockOptions = {
14
- prompts: {
15
- checkbox: mock(async () => ["example.com"]),
16
- },
17
- };
18
-
19
- // Mock file system operations
20
- existsSyncSpy = spyOn(fs, "existsSync");
21
- readFileSpy = spyOn(fsPromises, "readFile");
22
- writeFileSpy = spyOn(fsPromises, "writeFile");
23
-
24
- // Clear mock call history
25
- mockOptions.prompts.checkbox.mockClear();
26
- });
27
-
28
- afterEach(() => {
29
- // Restore all mocks
30
- existsSyncSpy.mockRestore();
31
- readFileSpy.mockRestore();
32
- writeFileSpy.mockRestore();
33
- });
34
-
35
- test("should accept empty input", async () => {
36
- // Mock file doesn't exist
37
- existsSyncSpy.mockReturnValue(false);
38
-
39
- const result = await clearAuthTokens({}, {});
40
- expect(result).toBeDefined();
41
- expect(result.message).toBeDefined();
42
- expect(typeof result.message).toBe("string");
43
- expect(result.message).toBe("No site authorizations found to clear");
44
- });
45
-
46
- test("should handle missing prompts gracefully", async () => {
47
- // Mock file exists with some data
48
- existsSyncSpy.mockReturnValue(true);
49
- readFileSpy.mockResolvedValue('example.com:\n token: "test-token"');
50
- writeFileSpy.mockResolvedValue();
51
-
52
- const result = await clearAuthTokens({}, {});
53
- expect(result).toBeDefined();
54
- expect(result.message).toBeDefined();
55
- expect(result.clearedCount).toBe(1);
56
- expect(result.clearedSites).toEqual(["example.com"]);
57
- });
58
-
59
- test("should handle empty options", async () => {
60
- // Mock file doesn't exist
61
- existsSyncSpy.mockReturnValue(false);
62
-
63
- const result = await clearAuthTokens({});
64
- expect(result).toBeDefined();
65
- expect(result.message).toBeDefined();
66
- expect(result.message).toBe("No site authorizations found to clear");
67
- });
68
-
69
- test("should return consistent result structure", async () => {
70
- // Mock file exists with multiple sites
71
- existsSyncSpy.mockReturnValue(true);
72
- readFileSpy.mockResolvedValue(
73
- 'example.com:\n token: "test-token"\ntest.com:\n token: "test-token2"',
74
- );
75
- writeFileSpy.mockResolvedValue();
76
-
77
- const result = await clearAuthTokens({}, mockOptions);
78
- expect(result).toBeDefined();
79
- expect(result).toHaveProperty("message");
80
- expect(typeof result.message).toBe("string");
81
-
82
- // Result may have additional properties depending on file state
83
- if (result.clearedCount !== undefined) {
84
- expect(typeof result.clearedCount).toBe("number");
85
- }
86
- if (result.clearedSites !== undefined) {
87
- expect(Array.isArray(result.clearedSites)).toBe(true);
88
- }
89
- if (result.error !== undefined) {
90
- expect(typeof result.error).toBe("boolean");
91
- }
92
- });
93
-
94
- test("should handle prompts correctly when file exists (integration test)", async () => {
95
- // Mock file exists with data
96
- existsSyncSpy.mockReturnValue(true);
97
- readFileSpy.mockResolvedValue('example.com:\n token: "test-token"');
98
- writeFileSpy.mockResolvedValue();
99
-
100
- const result = await clearAuthTokens({}, mockOptions);
101
-
102
- expect(result).toBeDefined();
103
- expect(result.message).toBeDefined();
104
- expect(result.clearedCount).toBe(1);
105
- expect(result.clearedSites).toEqual(["example.com"]);
106
-
107
- // Verify that prompts were called
108
- expect(mockOptions.prompts.checkbox.mock.calls.length).toBeGreaterThan(0);
109
- });
110
-
111
- test("should provide meaningful error messages", async () => {
112
- // Mock file doesn't exist
113
- existsSyncSpy.mockReturnValue(false);
114
-
115
- const result = await clearAuthTokens({}, {});
116
-
117
- // Should return a user-friendly message regardless of internal state
118
- expect(result.message).toBeDefined();
119
- expect(result.message.length).toBeGreaterThan(0);
120
- expect(typeof result.message).toBe("string");
121
- expect(result.message).toBe("No site authorizations found to clear");
122
- });
123
-
124
- test("should handle undefined input parameters", async () => {
125
- // Mock file doesn't exist
126
- existsSyncSpy.mockReturnValue(false);
127
-
128
- const result = await clearAuthTokens(undefined, undefined);
129
- expect(result).toBeDefined();
130
- expect(result.message).toBeDefined();
131
- expect(result.message).toBe("No site authorizations found to clear");
132
- });
133
-
134
- test("should handle null input parameters", async () => {
135
- // Mock file doesn't exist
136
- existsSyncSpy.mockReturnValue(false);
137
-
138
- const result = await clearAuthTokens(null, null);
139
- expect(result).toBeDefined();
140
- expect(result.message).toBeDefined();
141
- expect(result.message).toBe("No site authorizations found to clear");
142
- });
143
-
144
- test("should handle various option configurations", async () => {
145
- // Mock file doesn't exist for all configurations
146
- existsSyncSpy.mockReturnValue(false);
147
-
148
- const configs = [
149
- {},
150
- { prompts: {} },
151
- { prompts: { checkbox: undefined } },
152
- { prompts: { checkbox: null } },
153
- ];
154
-
155
- for (const config of configs) {
156
- const result = await clearAuthTokens({}, config);
157
- expect(result).toBeDefined();
158
- expect(result.message).toBeDefined();
159
- expect(result.message).toBe("No site authorizations found to clear");
160
- }
161
- });
162
-
163
- test("should maintain consistent behavior across calls", async () => {
164
- // Mock file doesn't exist for both calls
165
- existsSyncSpy.mockReturnValue(false);
166
-
167
- const result1 = await clearAuthTokens({}, {});
168
- const result2 = await clearAuthTokens({}, {});
169
-
170
- // Both calls should return the same type of result structure
171
- expect(typeof result1.message).toBe(typeof result2.message);
172
- expect(result1).toHaveProperty("message");
173
- expect(result2).toHaveProperty("message");
174
- expect(result1.message).toBe(result2.message);
175
- });
176
-
177
- test("should handle prompt validation function", async () => {
178
- // Mock file exists with data to trigger prompts
179
- existsSyncSpy.mockReturnValue(true);
180
- readFileSpy.mockResolvedValue('example.com:\n token: "test-token"');
181
- writeFileSpy.mockResolvedValue();
182
-
183
- // Test that if prompts are called, they have proper validation
184
- try {
185
- await clearAuthTokens({}, mockOptions);
186
-
187
- // If prompts were called, check the validation function exists
188
- if (mockOptions.prompts.checkbox.mock.calls.length > 0) {
189
- const callArgs = mockOptions.prompts.checkbox.mock.calls[0][0];
190
- expect(callArgs).toHaveProperty("validate");
191
- expect(typeof callArgs.validate).toBe("function");
192
-
193
- // Test validation function behavior
194
- const validateFn = callArgs.validate;
195
- expect(validateFn([])).toBe("Please select at least one site.");
196
- expect(validateFn(["site1"])).toBe(true);
197
- expect(validateFn(["site1", "site2"])).toBe(true);
198
- }
199
- } catch (error) {
200
- // If there's an error, ensure it's handled gracefully
201
- expect(error).toBeDefined();
202
- }
203
- });
204
-
205
- test("should handle file read errors gracefully", async () => {
206
- // Mock file exists but reading fails
207
- existsSyncSpy.mockReturnValue(true);
208
- readFileSpy.mockRejectedValue(new Error("Permission denied"));
209
-
210
- const result = await clearAuthTokens({}, {});
211
- expect(result).toBeDefined();
212
- expect(result.message).toBeDefined();
213
- expect(result.error).toBe(true);
214
- expect(result.message).toContain("Failed to clear site authorizations");
215
- });
216
-
217
- test("should handle file write errors gracefully", async () => {
218
- // Mock file exists, reading succeeds, but writing fails
219
- existsSyncSpy.mockReturnValue(true);
220
- readFileSpy.mockResolvedValue('example.com:\n token: "test-token"');
221
- writeFileSpy.mockRejectedValue(new Error("Disk full"));
222
-
223
- const result = await clearAuthTokens({}, {});
224
- expect(result).toBeDefined();
225
- expect(result.message).toBeDefined();
226
- expect(result.error).toBe(true);
227
- expect(result.message).toContain("Failed to clear site authorizations");
228
- });
229
-
230
- test("should handle empty file content", async () => {
231
- // Mock file exists but is empty
232
- existsSyncSpy.mockReturnValue(true);
233
- readFileSpy.mockResolvedValue("");
234
-
235
- const result = await clearAuthTokens({}, {});
236
- expect(result).toBeDefined();
237
- expect(result.message).toBeDefined();
238
- expect(result.message).toBe("No site authorizations found to clear");
239
- });
240
-
241
- test("should handle malformed YAML content", async () => {
242
- // Mock file exists with invalid YAML
243
- existsSyncSpy.mockReturnValue(true);
244
- readFileSpy.mockResolvedValue("invalid: yaml: content: [");
245
-
246
- const result = await clearAuthTokens({}, {});
247
- expect(result).toBeDefined();
248
- expect(result.message).toBeDefined();
249
- expect(result.error).toBe(true);
250
- expect(result.message).toContain("Failed to clear site authorizations");
251
- });
252
-
253
- test("should handle empty selection from prompts", async () => {
254
- // Mock file exists with data but user selects nothing
255
- existsSyncSpy.mockReturnValue(true);
256
- readFileSpy.mockResolvedValue('example.com:\n token: "test-token"');
257
-
258
- const emptySelectionOptions = {
259
- prompts: {
260
- checkbox: mock(async () => []), // User selects nothing
261
- },
262
- };
263
-
264
- const result = await clearAuthTokens({}, emptySelectionOptions);
265
- expect(result).toBeDefined();
266
- expect(result.message).toBe("No sites selected for clearing authorization");
267
- });
268
- });
@@ -1,167 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test";
2
- import * as fsPromises from "node:fs/promises";
3
- import { mkdir, rm, writeFile } from "node:fs/promises";
4
- import { dirname, join } from "node:path";
5
- import { fileURLToPath } from "node:url";
6
- import clearDocumentConfig from "../../../agents/clear/clear-document-config.mjs";
7
-
8
- const __dirname = dirname(fileURLToPath(import.meta.url));
9
-
10
- describe("clear-document-config", () => {
11
- let testDir;
12
- let configPath;
13
-
14
- beforeEach(async () => {
15
- // Create a temporary test directory
16
- testDir = join(__dirname, "test-clear-config");
17
- await mkdir(testDir, { recursive: true });
18
-
19
- // Create .aigne/doc-smith directory structure
20
- const aigneDir = join(testDir, ".aigne", "doc-smith");
21
- await mkdir(aigneDir, { recursive: true });
22
-
23
- configPath = join(aigneDir, "config.yaml");
24
- });
25
-
26
- afterEach(async () => {
27
- // Clean up test directory
28
- try {
29
- await rm(testDir, { recursive: true, force: true });
30
- } catch {
31
- // Ignore cleanup errors since they don't affect test results
32
- }
33
- });
34
-
35
- test("should clear existing document configuration successfully", async () => {
36
- // Create a test config file
37
- const configContent = `
38
- projectName: "Test Project"
39
- projectDesc: "Test Description"
40
- locale: "en"
41
- documentPurpose: ["API", "Tutorial"]
42
- `;
43
- await writeFile(configPath, configContent);
44
-
45
- const result = await clearDocumentConfig({ workDir: testDir });
46
-
47
- expect(result.cleared).toBe(true);
48
- expect(result.message).toContain("Cleared document configuration");
49
- expect(result.path).toBeDefined();
50
- expect(result.suggestions).toEqual([
51
- "Run `aigne doc init` to generate a fresh configuration file.",
52
- ]);
53
-
54
- // Verify file is actually deleted
55
- const { pathExists } = await import("../../../utils/file-utils.mjs");
56
- const exists = await pathExists(configPath);
57
- expect(exists).toBe(false);
58
- });
59
-
60
- test("should handle non-existent configuration file", async () => {
61
- // Don't create the config file
62
- const result = await clearDocumentConfig({ workDir: testDir });
63
-
64
- expect(result.cleared).toBe(false);
65
- expect(result.message).toContain("Document configuration already empty");
66
- expect(result.path).toBeDefined();
67
- expect(result.suggestions).toEqual([]);
68
- });
69
-
70
- test("should use current working directory when workDir not provided", async () => {
71
- const originalCwd = process.cwd();
72
-
73
- try {
74
- // Change to test directory
75
- process.chdir(testDir);
76
-
77
- // Create config in current directory's .aigne structure
78
- await writeFile(configPath, "test: content");
79
-
80
- const result = await clearDocumentConfig({});
81
-
82
- expect(result.cleared).toBe(true);
83
- expect(result.message).toContain("Cleared document configuration");
84
- } finally {
85
- // Restore original working directory
86
- process.chdir(originalCwd);
87
- }
88
- });
89
-
90
- test("should provide correct return structure", async () => {
91
- await writeFile(configPath, "test: content");
92
-
93
- const result = await clearDocumentConfig({ workDir: testDir });
94
-
95
- expect(result).toHaveProperty("message");
96
- expect(result).toHaveProperty("cleared");
97
- expect(result).toHaveProperty("path");
98
- expect(result).toHaveProperty("suggestions");
99
- expect(typeof result.message).toBe("string");
100
- expect(typeof result.cleared).toBe("boolean");
101
- expect(typeof result.path).toBe("string");
102
- expect(Array.isArray(result.suggestions)).toBe(true);
103
- });
104
-
105
- test("should have correct task metadata", () => {
106
- expect(clearDocumentConfig.taskTitle).toBe("Clear document configuration");
107
- expect(clearDocumentConfig.description).toBe("Clear the document configuration file");
108
- });
109
-
110
- test("should handle nested directory structures", async () => {
111
- // Create nested test directory
112
- const nestedDir = join(testDir, "nested", "project");
113
- await mkdir(nestedDir, { recursive: true });
114
-
115
- const nestedAigneDir = join(nestedDir, ".aigne", "doc-smith");
116
- await mkdir(nestedAigneDir, { recursive: true });
117
-
118
- const nestedConfigPath = join(nestedAigneDir, "config.yaml");
119
- await writeFile(nestedConfigPath, "nested: config");
120
-
121
- const result = await clearDocumentConfig({ workDir: nestedDir });
122
-
123
- expect(result.cleared).toBe(true);
124
- expect(result.message).toContain("Cleared document configuration");
125
-
126
- // Verify nested file is deleted
127
- const { pathExists } = await import("../../../utils/file-utils.mjs");
128
- const exists = await pathExists(nestedConfigPath);
129
- expect(exists).toBe(false);
130
- });
131
-
132
- test("should handle path with special characters", async () => {
133
- // Create directory with spaces and special characters
134
- const specialDir = join(testDir, "special dir-with_chars");
135
- await mkdir(specialDir, { recursive: true });
136
-
137
- const specialAigneDir = join(specialDir, ".aigne", "doc-smith");
138
- await mkdir(specialAigneDir, { recursive: true });
139
-
140
- const specialConfigPath = join(specialAigneDir, "config.yaml");
141
- await writeFile(specialConfigPath, "special: config");
142
-
143
- const result = await clearDocumentConfig({ workDir: specialDir });
144
-
145
- expect(result.cleared).toBe(true);
146
- expect(result.message).toContain("Cleared document configuration");
147
- });
148
-
149
- test("should handle file system errors gracefully", async () => {
150
- // Create a spy on rm to simulate an error
151
- const rmSpy = spyOn(fsPromises, "rm");
152
- rmSpy.mockImplementation(() => {
153
- throw new Error("Permission denied");
154
- });
155
-
156
- try {
157
- const result = await clearDocumentConfig({ workDir: testDir });
158
-
159
- expect(result.error).toBe(true);
160
- expect(result.message).toContain("Failed to clear document configuration");
161
- expect(result.message).toContain("Permission denied");
162
- expect(result.path).toBeDefined();
163
- } finally {
164
- rmSpy.mockRestore();
165
- }
166
- });
167
- });