@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,478 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from "bun:test";
2
- import * as yaml from "yaml";
3
- import checkFeedbackRefiner from "../../../agents/utils/check-feedback-refiner.mjs";
4
-
5
- import * as preferencesUtils from "../../../utils/preferences-utils.mjs";
6
-
7
- describe("check-feedback-refiner", () => {
8
- let mockOptions;
9
-
10
- // Spies for external dependencies
11
- let yamlStringifySpy;
12
-
13
- // Spies for internal utils
14
- let readPreferencesSpy;
15
- let addPreferenceRuleSpy;
16
- let consoleErrorSpy;
17
-
18
- beforeEach(() => {
19
- mock.restore();
20
-
21
- mockOptions = {
22
- context: {
23
- agents: {
24
- feedbackRefiner: { mockAgent: true },
25
- },
26
- invoke: mock(async () => ({ refined: "feedback" })),
27
- },
28
- };
29
-
30
- // Set up spies for internal utils
31
- readPreferencesSpy = spyOn(preferencesUtils, "readPreferences").mockReturnValue({
32
- rules: [],
33
- });
34
- addPreferenceRuleSpy = spyOn(preferencesUtils, "addPreferenceRule").mockReturnValue({
35
- id: "pref_123",
36
- });
37
- consoleErrorSpy = spyOn(console, "error").mockImplementation(() => {});
38
-
39
- // Set up spy for external dependencies
40
- yamlStringifySpy = spyOn(yaml, "stringify").mockImplementation(() => "mocked yaml");
41
-
42
- // Clear context mock call history
43
- mockOptions.context.invoke.mockClear();
44
- });
45
-
46
- afterEach(() => {
47
- // Restore all spies
48
- yamlStringifySpy?.mockRestore();
49
- readPreferencesSpy?.mockRestore();
50
- addPreferenceRuleSpy?.mockRestore();
51
- consoleErrorSpy?.mockRestore();
52
- });
53
-
54
- // BASIC FUNCTIONALITY TESTS
55
- test("should return empty object when no feedback provided", async () => {
56
- const result = await checkFeedbackRefiner(
57
- {
58
- feedback: "",
59
- documentStructureFeedback: "",
60
- stage: "structure",
61
- selectedPaths: ["/doc1"],
62
- },
63
- mockOptions,
64
- );
65
-
66
- expect(result).toEqual({});
67
- expect(mockOptions.context.invoke).not.toHaveBeenCalled();
68
- expect(readPreferencesSpy).not.toHaveBeenCalled();
69
- });
70
-
71
- test("should return empty object when feedback is null/undefined", async () => {
72
- const result = await checkFeedbackRefiner(
73
- {
74
- feedback: null,
75
- documentStructureFeedback: undefined,
76
- stage: "structure",
77
- selectedPaths: ["/doc1"],
78
- },
79
- mockOptions,
80
- );
81
-
82
- expect(result).toEqual({});
83
- expect(mockOptions.context.invoke).not.toHaveBeenCalled();
84
- });
85
-
86
- test("should process feedback when provided", async () => {
87
- mockOptions.context.invoke.mockResolvedValue({
88
- refined: "refined feedback",
89
- save: false,
90
- });
91
-
92
- const result = await checkFeedbackRefiner(
93
- {
94
- feedback: "User feedback here",
95
- stage: "structure",
96
- selectedPaths: ["/doc1", "/doc2"],
97
- },
98
- mockOptions,
99
- );
100
-
101
- expect(readPreferencesSpy).toHaveBeenCalled();
102
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
103
- { mockAgent: true },
104
- expect.objectContaining({
105
- feedback: "User feedback here",
106
- stage: "structure",
107
- paths: ["/doc1", "/doc2"],
108
- existingPreferences: "",
109
- }),
110
- );
111
- expect(result).toEqual({
112
- refined: "refined feedback",
113
- save: false,
114
- });
115
- });
116
-
117
- test("should process documentStructureFeedback when feedback is empty", async () => {
118
- mockOptions.context.invoke.mockResolvedValue({
119
- refined: "refined structure feedback",
120
- });
121
-
122
- const result = await checkFeedbackRefiner(
123
- {
124
- feedback: "",
125
- documentStructureFeedback: "Structure feedback here",
126
- stage: "structure",
127
- selectedPaths: ["/doc1"],
128
- },
129
- mockOptions,
130
- );
131
-
132
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
133
- { mockAgent: true },
134
- expect.objectContaining({
135
- feedback: "Structure feedback here",
136
- }),
137
- );
138
- expect(result.refined).toBe("refined structure feedback");
139
- });
140
-
141
- test("should prefer feedback over documentStructureFeedback when both provided", async () => {
142
- mockOptions.context.invoke.mockResolvedValue({ refined: "result" });
143
-
144
- await checkFeedbackRefiner(
145
- {
146
- feedback: "Main feedback",
147
- documentStructureFeedback: "Structure feedback",
148
- stage: "structure",
149
- selectedPaths: ["/doc1"],
150
- },
151
- mockOptions,
152
- );
153
-
154
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
155
- { mockAgent: true },
156
- expect.objectContaining({
157
- feedback: "Main feedback",
158
- }),
159
- );
160
- });
161
-
162
- // PREFERENCES HANDLING TESTS
163
- test("should include existing active preferences in context", async () => {
164
- readPreferencesSpy.mockReturnValue({
165
- rules: [
166
- { id: "rule1", active: true, rule: "Active rule 1" },
167
- { id: "rule2", active: false, rule: "Inactive rule" },
168
- { id: "rule3", active: true, rule: "Active rule 2" },
169
- ],
170
- });
171
-
172
- yamlStringifySpy.mockReturnValue("yaml_preferences");
173
-
174
- await checkFeedbackRefiner(
175
- {
176
- feedback: "Test feedback",
177
- stage: "structure",
178
- selectedPaths: ["/doc1"],
179
- },
180
- mockOptions,
181
- );
182
-
183
- expect(yamlStringifySpy).toHaveBeenCalledWith(
184
- {
185
- rules: [
186
- { id: "rule1", active: true, rule: "Active rule 1" },
187
- { id: "rule3", active: true, rule: "Active rule 2" },
188
- ],
189
- },
190
- { indent: 2 },
191
- );
192
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
193
- { mockAgent: true },
194
- expect.objectContaining({
195
- existingPreferences: "yaml_preferences",
196
- }),
197
- );
198
- });
199
-
200
- test("should handle empty preferences gracefully", async () => {
201
- readPreferencesSpy.mockReturnValue({ rules: [] });
202
-
203
- await checkFeedbackRefiner(
204
- {
205
- feedback: "Test feedback",
206
- stage: "structure",
207
- selectedPaths: ["/doc1"],
208
- },
209
- mockOptions,
210
- );
211
-
212
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
213
- { mockAgent: true },
214
- expect.objectContaining({
215
- existingPreferences: "",
216
- }),
217
- );
218
- });
219
-
220
- test("should handle missing rules property in preferences", async () => {
221
- readPreferencesSpy.mockReturnValue({});
222
-
223
- await checkFeedbackRefiner(
224
- {
225
- feedback: "Test feedback",
226
- stage: "structure",
227
- selectedPaths: ["/doc1"],
228
- },
229
- mockOptions,
230
- );
231
-
232
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
233
- { mockAgent: true },
234
- expect.objectContaining({
235
- existingPreferences: "",
236
- }),
237
- );
238
- });
239
-
240
- // PREFERENCE SAVING TESTS
241
- test("should save preference when result indicates save is needed", async () => {
242
- mockOptions.context.invoke.mockResolvedValue({
243
- save: true,
244
- scope: "structure",
245
- rule: "New preference rule",
246
- });
247
-
248
- addPreferenceRuleSpy.mockReturnValue({ id: "pref_456" });
249
-
250
- const result = await checkFeedbackRefiner(
251
- {
252
- feedback: "Save this feedback",
253
- stage: "structure",
254
- selectedPaths: ["/doc1", "/doc2"],
255
- },
256
- mockOptions,
257
- );
258
-
259
- expect(addPreferenceRuleSpy).toHaveBeenCalledWith(
260
- expect.objectContaining({
261
- save: true,
262
- scope: "structure",
263
- rule: "New preference rule",
264
- }),
265
- "Save this feedback",
266
- ["/doc1", "/doc2"],
267
- );
268
-
269
- expect(result.savedPreference).toEqual({
270
- id: "pref_456",
271
- saved: true,
272
- });
273
- });
274
-
275
- test("should not save preference when result indicates save is false", async () => {
276
- mockOptions.context.invoke.mockResolvedValue({
277
- save: false,
278
- refined: "Just refined",
279
- });
280
-
281
- const result = await checkFeedbackRefiner(
282
- {
283
- feedback: "Don't save this",
284
- stage: "structure",
285
- selectedPaths: ["/doc1"],
286
- },
287
- mockOptions,
288
- );
289
-
290
- expect(addPreferenceRuleSpy).not.toHaveBeenCalled();
291
- expect(result.savedPreference).toBeUndefined();
292
- });
293
-
294
- test("should not save preference when result has no save property", async () => {
295
- mockOptions.context.invoke.mockResolvedValue({
296
- refined: "Just refined",
297
- });
298
-
299
- const result = await checkFeedbackRefiner(
300
- {
301
- feedback: "No save property",
302
- stage: "structure",
303
- selectedPaths: ["/doc1"],
304
- },
305
- mockOptions,
306
- );
307
-
308
- expect(addPreferenceRuleSpy).not.toHaveBeenCalled();
309
- expect(result.savedPreference).toBeUndefined();
310
- });
311
-
312
- test("should handle preference save errors gracefully", async () => {
313
- mockOptions.context.invoke.mockResolvedValue({
314
- save: true,
315
- rule: "Failed save rule",
316
- });
317
-
318
- addPreferenceRuleSpy.mockImplementation(() => {
319
- throw new Error("Save failed");
320
- });
321
-
322
- const result = await checkFeedbackRefiner(
323
- {
324
- feedback: "This will fail to save",
325
- stage: "structure",
326
- selectedPaths: ["/doc1"],
327
- },
328
- mockOptions,
329
- );
330
-
331
- expect(consoleErrorSpy).toHaveBeenCalledWith(
332
- "Failed to save user preference rule:",
333
- "Save failed",
334
- "\nFeedback:",
335
- "This will fail to save",
336
- );
337
-
338
- expect(result.savedPreference).toEqual({
339
- saved: false,
340
- error: "Save failed",
341
- });
342
- });
343
-
344
- test("should use documentStructureFeedback for saving when feedback is empty", async () => {
345
- mockOptions.context.invoke.mockResolvedValue({
346
- save: true,
347
- rule: "Structure rule",
348
- });
349
-
350
- await checkFeedbackRefiner(
351
- {
352
- feedback: "",
353
- documentStructureFeedback: "Structure feedback to save",
354
- stage: "structure",
355
- selectedPaths: ["/doc1"],
356
- },
357
- mockOptions,
358
- );
359
-
360
- expect(addPreferenceRuleSpy).toHaveBeenCalledWith(
361
- expect.anything(),
362
- "Structure feedback to save",
363
- ["/doc1"],
364
- );
365
- });
366
-
367
- // PARAMETER PASSING TESTS
368
- test("should pass all parameters correctly to feedbackRefiner", async () => {
369
- readPreferencesSpy.mockReturnValue({
370
- rules: [{ id: "rule1", active: true, rule: "Test rule" }],
371
- });
372
- yamlStringifySpy.mockReturnValue("test_yaml");
373
-
374
- await checkFeedbackRefiner(
375
- {
376
- feedback: "Detailed feedback",
377
- stage: "detail",
378
- selectedPaths: ["/api/auth", "/api/users"],
379
- },
380
- mockOptions,
381
- );
382
-
383
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
384
- { mockAgent: true },
385
- {
386
- feedback: "Detailed feedback",
387
- stage: "detail",
388
- paths: ["/api/auth", "/api/users"],
389
- existingPreferences: "test_yaml",
390
- },
391
- );
392
- });
393
-
394
- test("should handle undefined selectedPaths", async () => {
395
- await checkFeedbackRefiner(
396
- {
397
- feedback: "Test feedback",
398
- stage: "structure",
399
- selectedPaths: undefined,
400
- },
401
- mockOptions,
402
- );
403
-
404
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
405
- { mockAgent: true },
406
- expect.objectContaining({
407
- paths: undefined,
408
- }),
409
- );
410
- });
411
-
412
- test("should handle empty selectedPaths array", async () => {
413
- await checkFeedbackRefiner(
414
- {
415
- feedback: "Test feedback",
416
- stage: "structure",
417
- selectedPaths: [],
418
- },
419
- mockOptions,
420
- );
421
-
422
- expect(mockOptions.context.invoke).toHaveBeenCalledWith(
423
- { mockAgent: true },
424
- expect.objectContaining({
425
- paths: [],
426
- }),
427
- );
428
- });
429
-
430
- // EDGE CASES
431
- test("should handle context invoke errors gracefully", async () => {
432
- mockOptions.context.invoke.mockRejectedValue(new Error("Context invoke failed"));
433
-
434
- await expect(
435
- checkFeedbackRefiner(
436
- {
437
- feedback: "Test feedback",
438
- stage: "structure",
439
- selectedPaths: ["/doc1"],
440
- },
441
- mockOptions,
442
- ),
443
- ).rejects.toThrow("Context invoke failed");
444
- });
445
-
446
- test("should preserve result structure when saving preference", async () => {
447
- mockOptions.context.invoke.mockResolvedValue({
448
- save: true,
449
- refined: "refined feedback",
450
- scope: "structure",
451
- rule: "New rule",
452
- customProperty: "custom value",
453
- });
454
-
455
- addPreferenceRuleSpy.mockReturnValue({ id: "pref_789" });
456
-
457
- const result = await checkFeedbackRefiner(
458
- {
459
- feedback: "Test feedback",
460
- stage: "structure",
461
- selectedPaths: ["/doc1"],
462
- },
463
- mockOptions,
464
- );
465
-
466
- expect(result).toEqual({
467
- save: true,
468
- refined: "refined feedback",
469
- scope: "structure",
470
- rule: "New rule",
471
- customProperty: "custom value",
472
- savedPreference: {
473
- id: "pref_789",
474
- saved: true,
475
- },
476
- });
477
- });
478
- });