@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
@@ -1,45 +0,0 @@
1
- import { afterAll, beforeAll, describe, expect, test } from "bun:test";
2
- import { join } from "node:path";
3
- import { AIAgent } from "@aigne/core";
4
- import { loadAgent } from "@aigne/core/loader/index.js";
5
- import { loadModel } from "../../utils/mock-chat-model.mjs";
6
-
7
- describe("checkDocumentStructure Agent", () => {
8
- beforeAll(() => {
9
- process.env.AIGNE_OBSERVABILITY_DISABLED = "true";
10
- });
11
-
12
- afterAll(() => {
13
- delete process.env.AIGNE_OBSERVABILITY_DISABLED;
14
- });
15
- test("should load agent correctly with proper configuration", async () => {
16
- const agent = await loadAgent(
17
- join(import.meta.dirname, "../../../agents/generate/check-document-structure.yaml"),
18
- {
19
- model: loadModel,
20
- },
21
- );
22
-
23
- expect(agent).toBeDefined();
24
-
25
- // Verify agent exists and is correct type
26
- expect(agent).toBeDefined();
27
- expect(agent).toBeInstanceOf(AIAgent);
28
- });
29
-
30
- test("should have instructions loaded from file", async () => {
31
- const agent = await loadAgent(
32
- join(import.meta.dirname, "../../../agents/generate/check-document-structure.yaml"),
33
- {
34
- model: loadModel,
35
- },
36
- );
37
-
38
- expect(agent).toBeDefined();
39
-
40
- // Verify instructions are loaded
41
- expect(agent.instructions).toBeDefined();
42
- const instructions = await agent.instructions.build({});
43
- expect(instructions.messages).toBeDefined();
44
- });
45
- });
@@ -1,279 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from "bun:test";
2
- import * as fsPromises from "node:fs/promises";
3
- import checkNeedGenerateStructure from "../../../agents/generate/check-need-generate-structure.mjs";
4
-
5
- import * as preferencesUtils from "../../../utils/preferences-utils.mjs";
6
- import * as utils from "../../../utils/utils.mjs";
7
-
8
- describe("check-need-generate-structure", () => {
9
- let mockOptions;
10
- let originalDocumentStructure;
11
-
12
- // Spies for external dependencies
13
- let accessSpy;
14
-
15
- // Spies for internal utils
16
- let getActiveRulesForScopeSpy;
17
- let getCurrentGitHeadSpy;
18
- let hasFileChangesBetweenCommitsSpy;
19
- let getProjectInfoSpy;
20
- let loadConfigFromFileSpy;
21
- let saveValueToConfigSpy;
22
-
23
- beforeEach(() => {
24
- // Set test environment variable
25
- process.env.NODE_ENV = "test";
26
-
27
- // Reset all mocks
28
- mock.restore();
29
-
30
- originalDocumentStructure = [
31
- { path: "/getting-started", title: "Getting Started" },
32
- { path: "/api", title: "API Reference" },
33
- ];
34
-
35
- mockOptions = {
36
- prompts: {
37
- input: mock(async () => ""),
38
- select: mock(async () => "generate"),
39
- },
40
- context: {
41
- agents: {
42
- generateStructure: {},
43
- generateStructureWithoutTools: {},
44
- },
45
- invoke: mock(async () => ({
46
- documentStructure: originalDocumentStructure,
47
- projectName: "Test Project",
48
- projectDesc: "Test Description",
49
- })),
50
- },
51
- };
52
-
53
- // Set up spies for internal utils
54
- getActiveRulesForScopeSpy = spyOn(preferencesUtils, "getActiveRulesForScope").mockReturnValue(
55
- [],
56
- );
57
- getCurrentGitHeadSpy = spyOn(utils, "getCurrentGitHead").mockReturnValue(null);
58
- hasFileChangesBetweenCommitsSpy = spyOn(utils, "hasFileChangesBetweenCommits").mockReturnValue(
59
- false,
60
- );
61
- getProjectInfoSpy = spyOn(utils, "getProjectInfo").mockResolvedValue({
62
- name: "Test Project",
63
- description: "Test Description",
64
- fromGitHub: false,
65
- });
66
- loadConfigFromFileSpy = spyOn(utils, "loadConfigFromFile").mockResolvedValue({});
67
- saveValueToConfigSpy = spyOn(utils, "saveValueToConfig").mockResolvedValue();
68
-
69
- // Set up spy for external dependencies
70
- accessSpy = spyOn(fsPromises, "access").mockImplementation(() =>
71
- Promise.reject(new Error("File not found")),
72
- );
73
-
74
- // Clear prompts mock call history
75
- mockOptions.prompts.input.mockClear();
76
- mockOptions.context.invoke.mockClear();
77
- });
78
-
79
- afterEach(() => {
80
- // Clean up environment variable
81
- delete process.env.NODE_ENV;
82
-
83
- // Restore all spies
84
- accessSpy?.mockRestore();
85
- getActiveRulesForScopeSpy?.mockRestore();
86
- getCurrentGitHeadSpy?.mockRestore();
87
- hasFileChangesBetweenCommitsSpy?.mockRestore();
88
- getProjectInfoSpy?.mockRestore();
89
- loadConfigFromFileSpy?.mockRestore();
90
- saveValueToConfigSpy?.mockRestore();
91
- });
92
-
93
- test("should return original documentation structure when no regeneration needed", async () => {
94
- // Test when no feedback and no sidebar file exists (default mock behavior)
95
- const result = await checkNeedGenerateStructure(
96
- { originalDocumentStructure, docsDir: "./docs" },
97
- mockOptions,
98
- );
99
-
100
- expect(result).toBeDefined();
101
- expect(result.documentStructure).toEqual(originalDocumentStructure);
102
- expect(mockOptions.context.invoke).not.toHaveBeenCalled();
103
- });
104
-
105
- test("should return original structure when it exists and no force regenerate", async () => {
106
- const result = await checkNeedGenerateStructure(
107
- { originalDocumentStructure, docsDir: "./docs" },
108
- mockOptions,
109
- );
110
-
111
- expect(mockOptions.prompts.input).not.toHaveBeenCalled();
112
- expect(mockOptions.context.invoke).not.toHaveBeenCalled();
113
- expect(result.documentStructure).toEqual(originalDocumentStructure);
114
- });
115
-
116
- test("should handle empty user feedback input", async () => {
117
- mockOptions.prompts.input.mockImplementation(async () => " ");
118
-
119
- const result = await checkNeedGenerateStructure(
120
- { originalDocumentStructure, docsDir: "./docs" },
121
- mockOptions,
122
- );
123
-
124
- expect(result.documentStructure).toEqual(originalDocumentStructure);
125
- expect(mockOptions.context.invoke).not.toHaveBeenCalled();
126
- });
127
-
128
- test("should force regenerate when forceRegenerate is true", async () => {
129
- await checkNeedGenerateStructure(
130
- { originalDocumentStructure, forceRegenerate: true, docsDir: "./docs" },
131
- mockOptions,
132
- );
133
-
134
- expect(mockOptions.context.invoke).toHaveBeenCalled();
135
- });
136
-
137
- test("should include user preferences when generating", async () => {
138
- const mockRules = [{ rule: "Structure rule 1" }];
139
- getActiveRulesForScopeSpy.mockImplementation(() => mockRules);
140
-
141
- await checkNeedGenerateStructure(
142
- { originalDocumentStructure, forceRegenerate: true, docsDir: "./docs" },
143
- mockOptions,
144
- );
145
-
146
- expect(getActiveRulesForScopeSpy).toHaveBeenCalledWith("structure", []);
147
- expect(mockOptions.context.invoke).toHaveBeenCalled();
148
- });
149
-
150
- test("should save project info when appropriate", async () => {
151
- mockOptions.context.invoke.mockImplementation(async () => ({
152
- documentStructure: originalDocumentStructure,
153
- projectName: "New Project Name",
154
- projectDesc: "New Description",
155
- }));
156
-
157
- const result = await checkNeedGenerateStructure(
158
- { originalDocumentStructure, forceRegenerate: true, docsDir: "./docs" },
159
- mockOptions,
160
- );
161
-
162
- expect(saveValueToConfigSpy).toHaveBeenCalledWith("projectName", "New Project Name");
163
- expect(result.projectInfoMessage).toContain("New Project Name");
164
- });
165
-
166
- test("should handle project info save errors", async () => {
167
- loadConfigFromFileSpy.mockImplementation(async () => {
168
- throw new Error("Config load failed");
169
- });
170
- const consoleSpy = spyOn(console, "warn").mockImplementation(() => {});
171
-
172
- mockOptions.context.invoke.mockImplementation(async () => ({
173
- documentStructure: originalDocumentStructure,
174
- projectName: "New Project",
175
- projectDesc: "New Description",
176
- }));
177
-
178
- const result = await checkNeedGenerateStructure(
179
- { originalDocumentStructure, forceRegenerate: true, docsDir: "./docs" },
180
- mockOptions,
181
- );
182
-
183
- await new Promise((resolve) => setTimeout(resolve, 10));
184
-
185
- expect(result).toBeDefined();
186
- expect(consoleSpy).toHaveBeenCalled();
187
- });
188
-
189
- test("should return correct structure when no originalDocumentStructure provided", async () => {
190
- const newDocumentStructure = [{ path: "/new", title: "New Section" }];
191
-
192
- mockOptions.context.invoke.mockImplementation(async () => ({
193
- documentStructure: newDocumentStructure,
194
- }));
195
-
196
- const result = await checkNeedGenerateStructure({ docsDir: "./docs" }, mockOptions);
197
-
198
- expect(result.documentStructure).toEqual(newDocumentStructure);
199
- expect(result.originalDocumentStructure).toEqual(newDocumentStructure);
200
- });
201
-
202
- test("should clear feedback in result when regenerating", async () => {
203
- const result = await checkNeedGenerateStructure(
204
- {
205
- originalDocumentStructure,
206
- forceRegenerate: true,
207
- feedback: "some feedback",
208
- docsDir: "./docs",
209
- },
210
- mockOptions,
211
- );
212
-
213
- expect(result.feedback).toBe("");
214
- });
215
-
216
- test("should pass through additional parameters when regenerating", async () => {
217
- const additionalParams = {
218
- customParam1: "value1",
219
- customParam2: "value2",
220
- };
221
-
222
- await checkNeedGenerateStructure(
223
- {
224
- originalDocumentStructure,
225
- forceRegenerate: true,
226
- docsDir: "./docs",
227
- ...additionalParams,
228
- },
229
- mockOptions,
230
- );
231
-
232
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
233
- mockOptions.context.agents.generateStructureWithoutTools,
234
- expect.objectContaining(additionalParams),
235
- );
236
- });
237
-
238
- test("should return userDeferred when user selects 'later' and no originalDocumentStructure exists", async () => {
239
- mockOptions.prompts.select.mockImplementation(async () => "later");
240
-
241
- const result = await checkNeedGenerateStructure({ docsDir: "./docs" }, mockOptions);
242
-
243
- expect(result).toBeDefined();
244
- expect(result.userDeferred).toBe(true);
245
- expect(result.documentStructure).toBe(null);
246
-
247
- expect(mockOptions.prompts.select).toHaveBeenCalled();
248
- expect(mockOptions.context.invoke).not.toHaveBeenCalled();
249
- });
250
-
251
- test("should use generateStructure agent when isLargeContext is true", async () => {
252
- await checkNeedGenerateStructure(
253
- { originalDocumentStructure, forceRegenerate: true, isLargeContext: true, docsDir: "./docs" },
254
- mockOptions,
255
- );
256
-
257
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
258
- mockOptions.context.agents.generateStructure,
259
- expect.any(Object),
260
- );
261
- });
262
-
263
- test("should use generateStructureWithoutTools agent when isLargeContext is false", async () => {
264
- await checkNeedGenerateStructure(
265
- {
266
- originalDocumentStructure,
267
- forceRegenerate: true,
268
- isLargeContext: false,
269
- docsDir: "./docs",
270
- },
271
- mockOptions,
272
- );
273
-
274
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
275
- mockOptions.context.agents.generateStructureWithoutTools,
276
- expect.any(Object),
277
- );
278
- });
279
- });