@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,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
- });