@aigne/doc-smith 0.8.11-beta → 0.8.11-beta.2

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 (257) hide show
  1. package/.aigne/doc-smith/config.yaml +2 -0
  2. package/.aigne/doc-smith/output/structure-plan.json +3 -3
  3. package/.aigne/doc-smith/upload-cache.yaml +252 -0
  4. package/.github/workflows/publish-docs.yml +67 -0
  5. package/.release-please-manifest.json +1 -1
  6. package/CHANGELOG.md +22 -0
  7. package/README.md +45 -115
  8. package/agents/clear/choose-contents.mjs +170 -0
  9. package/agents/clear/clear-auth-tokens.mjs +111 -0
  10. package/agents/clear/clear-document-config.mjs +39 -0
  11. package/agents/clear/clear-document-structure.mjs +106 -0
  12. package/agents/clear/clear-generated-docs.mjs +51 -0
  13. package/agents/clear/index.yaml +23 -0
  14. package/agents/evaluate/code-snippet.mjs +93 -0
  15. package/agents/evaluate/document-structure.yaml +70 -0
  16. package/agents/evaluate/document.yaml +79 -0
  17. package/agents/evaluate/generate-report.mjs +78 -0
  18. package/agents/evaluate/index.yaml +39 -0
  19. package/agents/generate/document-structure-tools/add-document.mjs +56 -0
  20. package/agents/generate/document-structure-tools/delete-document.mjs +49 -0
  21. package/agents/generate/document-structure-tools/move-document.mjs +82 -0
  22. package/agents/generate/document-structure-tools/update-document.mjs +50 -0
  23. package/agents/generate/generate-structure.yaml +1 -1
  24. package/agents/generate/update-document-structure.yaml +42 -0
  25. package/agents/generate/user-review-document-structure.mjs +6 -4
  26. package/agents/init/index.mjs +1 -1
  27. package/agents/publish/publish-docs.mjs +12 -3
  28. package/agents/translate/choose-language.mjs +1 -1
  29. package/agents/update/batch-update-document.yaml +7 -0
  30. package/agents/update/check-update-is-single.mjs +38 -0
  31. package/agents/update/document-tools/update-document-content.mjs +293 -0
  32. package/agents/update/index.yaml +4 -10
  33. package/agents/update/update-document-detail.yaml +52 -0
  34. package/agents/update/update-single-document.yaml +15 -0
  35. package/agents/update/user-review-document.mjs +248 -0
  36. package/agents/utils/choose-docs.mjs +4 -2
  37. package/agents/utils/format-document-structure.mjs +12 -2
  38. package/agents/utils/load-document-all-content.mjs +84 -0
  39. package/agents/utils/load-sources.mjs +4 -1
  40. package/aigne.yaml +59 -20
  41. package/assets/report-template/report.html +198 -0
  42. package/biome.json +14 -2
  43. package/docs/advanced-how-it-works.ja.md +101 -0
  44. package/docs/advanced-how-it-works.zh-TW.md +101 -0
  45. package/docs/advanced-how-it-works.zh.md +20 -20
  46. package/docs/advanced-quality-assurance.ja.md +96 -0
  47. package/docs/advanced-quality-assurance.zh-TW.md +96 -0
  48. package/docs/advanced-quality-assurance.zh.md +18 -18
  49. package/docs/advanced.ja.md +16 -0
  50. package/docs/advanced.zh-TW.md +16 -0
  51. package/docs/advanced.zh.md +4 -4
  52. package/docs/changelog.ja.md +309 -0
  53. package/docs/changelog.zh-TW.md +309 -0
  54. package/docs/changelog.zh.md +23 -23
  55. package/docs/cli-reference.ja.md +210 -0
  56. package/docs/cli-reference.zh-TW.md +210 -0
  57. package/docs/cli-reference.zh.md +21 -21
  58. package/docs/configuration-interactive-setup.ja.md +135 -0
  59. package/docs/configuration-interactive-setup.zh-TW.md +135 -0
  60. package/docs/configuration-interactive-setup.zh.md +29 -29
  61. package/docs/configuration-language-support.ja.md +94 -0
  62. package/docs/configuration-language-support.zh-TW.md +94 -0
  63. package/docs/configuration-language-support.zh.md +13 -13
  64. package/docs/configuration-llm-setup.ja.md +54 -0
  65. package/docs/configuration-llm-setup.zh-TW.md +54 -0
  66. package/docs/configuration-llm-setup.zh.md +12 -12
  67. package/docs/configuration-preferences.ja.md +129 -0
  68. package/docs/configuration-preferences.zh-TW.md +129 -0
  69. package/docs/configuration-preferences.zh.md +36 -36
  70. package/docs/configuration.ja.md +172 -0
  71. package/docs/configuration.zh-TW.md +172 -0
  72. package/docs/configuration.zh.md +49 -49
  73. package/docs/features-generate-documentation.ja.md +101 -0
  74. package/docs/features-generate-documentation.zh-TW.md +101 -0
  75. package/docs/features-generate-documentation.zh.md +17 -17
  76. package/docs/features-publish-your-docs.ja.md +107 -0
  77. package/docs/features-publish-your-docs.zh-TW.md +107 -0
  78. package/docs/features-publish-your-docs.zh.md +22 -22
  79. package/docs/features-translate-documentation.ja.md +79 -0
  80. package/docs/features-translate-documentation.zh-TW.md +79 -0
  81. package/docs/features-translate-documentation.zh.md +12 -12
  82. package/docs/features-update-and-refine.ja.md +138 -0
  83. package/docs/features-update-and-refine.zh-TW.md +138 -0
  84. package/docs/features-update-and-refine.zh.md +21 -21
  85. package/docs/features.ja.md +52 -0
  86. package/docs/features.zh-TW.md +52 -0
  87. package/docs/features.zh.md +8 -8
  88. package/docs/getting-started.ja.md +123 -0
  89. package/docs/getting-started.zh-TW.md +123 -0
  90. package/docs/getting-started.zh.md +24 -24
  91. package/docs/overview.ja.md +30 -0
  92. package/docs/overview.zh-TW.md +30 -0
  93. package/docs/overview.zh.md +8 -8
  94. package/package.json +19 -11
  95. package/prompts/common/document/content-rules-core.md +19 -0
  96. package/prompts/common/document/media-handling-rules.md +9 -0
  97. package/prompts/common/document/role-and-personality.md +15 -0
  98. package/prompts/common/document/user-preferences.md +9 -0
  99. package/prompts/common/document-structure/conflict-resolution-guidance.md +16 -0
  100. package/prompts/common/document-structure/document-structure-rules.md +45 -0
  101. package/prompts/common/document-structure/glossary.md +7 -0
  102. package/prompts/common/document-structure/intj-traits.md +5 -0
  103. package/prompts/common/document-structure/output-constraints.md +9 -0
  104. package/prompts/common/document-structure/user-locale-rules.md +10 -0
  105. package/prompts/common/document-structure/user-preferences.md +9 -0
  106. package/prompts/detail/custom/custom-components.md +9 -1
  107. package/prompts/detail/document-rules.md +6 -6
  108. package/prompts/detail/generate-document.md +5 -45
  109. package/prompts/detail/update-document.md +145 -0
  110. package/prompts/evaluate/document-structure.md +94 -0
  111. package/prompts/evaluate/document.md +149 -0
  112. package/prompts/structure/document-rules.md +1 -1
  113. package/prompts/structure/generate-structure-system.md +74 -0
  114. package/prompts/structure/generate-structure-user.md +41 -0
  115. package/prompts/structure/update-document-structure.md +118 -0
  116. package/prompts/translate/translate-document.md +1 -1
  117. package/prompts/utils/feedback-refiner.md +3 -3
  118. package/release-please-config.json +1 -7
  119. package/tests/agents/clear/choose-contents.test.mjs +280 -0
  120. package/tests/agents/clear/clear-auth-tokens.test.mjs +268 -0
  121. package/tests/agents/clear/clear-document-config.test.mjs +167 -0
  122. package/tests/agents/clear/clear-document-structure.test.mjs +374 -0
  123. package/tests/agents/clear/clear-generated-docs.test.mjs +222 -0
  124. package/tests/agents/evaluate/code-snippet.test.mjs +163 -0
  125. package/tests/agents/evaluate/fixtures/api-services.md +87 -0
  126. package/tests/agents/evaluate/fixtures/js-sdk.md +94 -0
  127. package/tests/agents/evaluate/generate-report.test.mjs +312 -0
  128. package/tests/agents/generate/check-document-structure.test.mjs +0 -6
  129. package/tests/agents/generate/document-structure-tools/add-document.test.mjs +449 -0
  130. package/tests/agents/generate/document-structure-tools/delete-document.test.mjs +410 -0
  131. package/tests/agents/generate/document-structure-tools/move-document.test.mjs +476 -0
  132. package/tests/agents/generate/document-structure-tools/update-document.test.mjs +548 -0
  133. package/tests/agents/generate/generate-structure.test.mjs +0 -6
  134. package/tests/agents/generate/user-review-document-structure.test.mjs +9 -9
  135. package/tests/agents/publish/publish-docs.test.mjs +2 -2
  136. package/tests/agents/update/check-update-is-single.test.mjs +300 -0
  137. package/tests/agents/update/document-tools/update-document-content.test.mjs +326 -0
  138. package/tests/agents/update/user-review-document.test.mjs +561 -0
  139. package/tests/agents/utils/format-document-structure.test.mjs +100 -0
  140. package/tests/utils/auth-utils.test.mjs +239 -1
  141. package/tests/utils/blocklet.test.mjs +9 -7
  142. package/tests/utils/constants.test.mjs +1 -1
  143. package/tests/utils/d2-utils.test.mjs +1 -1
  144. package/tests/utils/deploy.test.mjs +310 -366
  145. package/tests/utils/kroki-utils.test.mjs +2 -15
  146. package/tests/utils/linter/fixtures/css/keyword-error.css +1 -0
  147. package/tests/utils/linter/fixtures/css/missing-semicolon.css +1 -0
  148. package/tests/utils/linter/fixtures/css/syntax-error.css +1 -0
  149. package/tests/utils/linter/fixtures/css/undeclare-variable.css +1 -0
  150. package/tests/utils/linter/fixtures/css/unused-variable.css +2 -0
  151. package/tests/utils/linter/fixtures/css/valid-code.css +1 -0
  152. package/tests/utils/linter/fixtures/dockerfile/keyword-error.dockerfile +1 -0
  153. package/tests/utils/linter/fixtures/dockerfile/missing-semicolon.dockerfile +2 -0
  154. package/tests/utils/linter/fixtures/dockerfile/syntax-error.dockerfile +2 -0
  155. package/tests/utils/linter/fixtures/dockerfile/undeclare-variable.dockerfile +1 -0
  156. package/tests/utils/linter/fixtures/dockerfile/unused-variable.dockerfile +1 -0
  157. package/tests/utils/linter/fixtures/dockerfile/valid-code.dockerfile +2 -0
  158. package/tests/utils/linter/fixtures/go/keyword-error.go +5 -0
  159. package/tests/utils/linter/fixtures/go/missing-semicolon.go +5 -0
  160. package/tests/utils/linter/fixtures/go/syntax-error.go +6 -0
  161. package/tests/utils/linter/fixtures/go/undeclare-variable.go +5 -0
  162. package/tests/utils/linter/fixtures/go/unused-variable.go +5 -0
  163. package/tests/utils/linter/fixtures/go/valid-code.go +7 -0
  164. package/tests/utils/linter/fixtures/js/keyword-error.js +3 -0
  165. package/tests/utils/linter/fixtures/js/missing-semicolon.js +6 -0
  166. package/tests/utils/linter/fixtures/js/syntax-error.js +4 -0
  167. package/tests/utils/linter/fixtures/js/undeclare-variable.js +3 -0
  168. package/tests/utils/linter/fixtures/js/unused-variable.js +7 -0
  169. package/tests/utils/linter/fixtures/js/valid-code.js +15 -0
  170. package/tests/utils/linter/fixtures/json/keyword-error.json +1 -0
  171. package/tests/utils/linter/fixtures/json/missing-semicolon.json +1 -0
  172. package/tests/utils/linter/fixtures/json/syntax-error.json +1 -0
  173. package/tests/utils/linter/fixtures/json/undeclare-variable.json +1 -0
  174. package/tests/utils/linter/fixtures/json/unused-variable.json +1 -0
  175. package/tests/utils/linter/fixtures/json/valid-code.json +1 -0
  176. package/tests/utils/linter/fixtures/jsx/keyword-error.jsx +5 -0
  177. package/tests/utils/linter/fixtures/jsx/missing-semicolon.jsx +5 -0
  178. package/tests/utils/linter/fixtures/jsx/syntax-error.jsx +5 -0
  179. package/tests/utils/linter/fixtures/jsx/undeclare-variable.jsx +5 -0
  180. package/tests/utils/linter/fixtures/jsx/unused-variable.jsx +4 -0
  181. package/tests/utils/linter/fixtures/jsx/valid-code.jsx +5 -0
  182. package/tests/utils/linter/fixtures/python/keyword-error.py +3 -0
  183. package/tests/utils/linter/fixtures/python/missing-semicolon.py +2 -0
  184. package/tests/utils/linter/fixtures/python/syntax-error.py +3 -0
  185. package/tests/utils/linter/fixtures/python/undeclare-variable.py +3 -0
  186. package/tests/utils/linter/fixtures/python/unused-variable.py +6 -0
  187. package/tests/utils/linter/fixtures/python/valid-code.py +12 -0
  188. package/tests/utils/linter/fixtures/ruby/keyword-error.rb +2 -0
  189. package/tests/utils/linter/fixtures/ruby/missing-semicolon.rb +1 -0
  190. package/tests/utils/linter/fixtures/ruby/syntax-error.rb +2 -0
  191. package/tests/utils/linter/fixtures/ruby/undeclare-variable.rb +1 -0
  192. package/tests/utils/linter/fixtures/ruby/unused-variable.rb +2 -0
  193. package/tests/utils/linter/fixtures/ruby/valid-code.rb +1 -0
  194. package/tests/utils/linter/fixtures/sass/keyword-error.sass +2 -0
  195. package/tests/utils/linter/fixtures/sass/missing-semicolon.sass +3 -0
  196. package/tests/utils/linter/fixtures/sass/syntax-error.sass +3 -0
  197. package/tests/utils/linter/fixtures/sass/undeclare-variable.sass +2 -0
  198. package/tests/utils/linter/fixtures/sass/unused-variable.sass +4 -0
  199. package/tests/utils/linter/fixtures/sass/valid-code.sass +2 -0
  200. package/tests/utils/linter/fixtures/scss/keyword-error.scss +1 -0
  201. package/tests/utils/linter/fixtures/scss/missing-semicolon.scss +1 -0
  202. package/tests/utils/linter/fixtures/scss/syntax-error.scss +1 -0
  203. package/tests/utils/linter/fixtures/scss/undeclare-variable.scss +1 -0
  204. package/tests/utils/linter/fixtures/scss/unused-variable.scss +2 -0
  205. package/tests/utils/linter/fixtures/scss/valid-code.scss +1 -0
  206. package/tests/utils/linter/fixtures/shell/keyword-error.sh +5 -0
  207. package/tests/utils/linter/fixtures/shell/missing-semicolon.sh +3 -0
  208. package/tests/utils/linter/fixtures/shell/syntax-error.sh +4 -0
  209. package/tests/utils/linter/fixtures/shell/undeclare-variable.sh +3 -0
  210. package/tests/utils/linter/fixtures/shell/unused-variable.sh +4 -0
  211. package/tests/utils/linter/fixtures/shell/valid-code.sh +3 -0
  212. package/tests/utils/linter/fixtures/ts/keyword-error.ts +1 -0
  213. package/tests/utils/linter/fixtures/ts/missing-semicolon.ts +1 -0
  214. package/tests/utils/linter/fixtures/ts/syntax-error.ts +1 -0
  215. package/tests/utils/linter/fixtures/ts/undeclare-variable.ts +1 -0
  216. package/tests/utils/linter/fixtures/ts/unused-variable.ts +3 -0
  217. package/tests/utils/linter/fixtures/ts/valid-code.ts +3 -0
  218. package/tests/utils/linter/fixtures/tsx/keyword-error.tsx +5 -0
  219. package/tests/utils/linter/fixtures/tsx/missing-semicolon.tsx +5 -0
  220. package/tests/utils/linter/fixtures/tsx/syntax-error.tsx +5 -0
  221. package/tests/utils/linter/fixtures/tsx/undeclare-variable.tsx +6 -0
  222. package/tests/utils/linter/fixtures/tsx/unused-variable.tsx +6 -0
  223. package/tests/utils/linter/fixtures/tsx/valid-code.tsx +5 -0
  224. package/tests/utils/linter/fixtures/vue/keyword-error.vue +6 -0
  225. package/tests/utils/linter/fixtures/vue/missing-semicolon.vue +6 -0
  226. package/tests/utils/linter/fixtures/vue/syntax-error.vue +6 -0
  227. package/tests/utils/linter/fixtures/vue/undeclare-variable.vue +6 -0
  228. package/tests/utils/linter/fixtures/vue/unused-variable.vue +7 -0
  229. package/tests/utils/linter/fixtures/vue/valid-code.vue +6 -0
  230. package/tests/utils/linter/fixtures/yaml/keyword-error.yml +1 -0
  231. package/tests/utils/linter/fixtures/yaml/missing-semicolon.yml +2 -0
  232. package/tests/utils/linter/fixtures/yaml/syntax-error.yml +1 -0
  233. package/tests/utils/linter/fixtures/yaml/undeclare-variable.yml +1 -0
  234. package/tests/utils/linter/fixtures/yaml/unused-variable.yml +2 -0
  235. package/tests/utils/linter/fixtures/yaml/valid-code.yml +3 -0
  236. package/tests/utils/linter/index.test.mjs +440 -0
  237. package/tests/utils/linter/scan-results.mjs +42 -0
  238. package/tests/utils/markdown/index.test.mjs +478 -0
  239. package/tests/utils/mermaid-validator.test.mjs +2 -2
  240. package/tests/utils/utils.test.mjs +3 -1
  241. package/types/document-schema.mjs +54 -0
  242. package/types/document-structure-schema.mjs +244 -0
  243. package/utils/auth-utils.mjs +131 -6
  244. package/utils/conflict-detector.mjs +5 -1
  245. package/utils/{constants.mjs → constants/index.mjs} +109 -0
  246. package/utils/constants/linter.mjs +102 -0
  247. package/utils/d2-utils.mjs +2 -4
  248. package/utils/debug.mjs +3 -0
  249. package/utils/deploy.mjs +81 -385
  250. package/utils/evaluate/report-utils.mjs +131 -0
  251. package/utils/file-utils.mjs +36 -1
  252. package/utils/kroki-utils.mjs +1 -1
  253. package/utils/linter/index.mjs +50 -0
  254. package/utils/markdown/index.mjs +26 -0
  255. package/utils/markdown-checker.mjs +1 -1
  256. package/utils/utils.mjs +19 -7
  257. package/prompts/structure/generate-structure.md +0 -161
@@ -0,0 +1,312 @@
1
+ import { afterAll, beforeAll, describe, expect, test } from "bun:test";
2
+ import { existsSync } from "node:fs";
3
+ import { mkdtemp, readFile, rm } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import generateEvaluationReport from "../../../agents/evaluate/generate-report.mjs";
7
+
8
+ describe("generateEvaluationReport", () => {
9
+ let testDir;
10
+
11
+ beforeAll(async () => {
12
+ process.env.OBSERVABILITY_DISABLED = "true";
13
+ // Create a temporary directory for testing
14
+ testDir = await mkdtemp(join(tmpdir(), "test-evaluation-report-"));
15
+ });
16
+
17
+ afterAll(async () => {
18
+ delete process.env.OBSERVABILITY_DISABLED;
19
+
20
+ // Clean up test files
21
+ try {
22
+ if (existsSync(testDir)) {
23
+ await rm(testDir, { recursive: true, force: true });
24
+ }
25
+ } catch (error) {
26
+ console.warn("Failed to clean up test files:", error.message);
27
+ }
28
+ });
29
+
30
+ test("should generate evaluation report with correct structure", async () => {
31
+ // Mock evaluation data matching the expected schema
32
+ const testData = {
33
+ structureEvaluation: {
34
+ purposeCoverage: {
35
+ score: 4,
36
+ reason: "Covers most main objectives, missing minor targets",
37
+ covered: ["Quick Start", "API Reference"],
38
+ missing: ["Troubleshooting"],
39
+ },
40
+ audienceCoverage: {
41
+ score: 5,
42
+ reason: "Covers all selected audiences",
43
+ covered: ["Developers", "DevOps Engineers"],
44
+ missing: [],
45
+ },
46
+ coverageDepthAlignment: {
47
+ score: 3,
48
+ reason: "About half of modules depth does not match expectations",
49
+ },
50
+ },
51
+ originalDocumentStructure: [
52
+ {
53
+ path: "/api/authentication",
54
+ title: "Authentication",
55
+ description: "Authentication guide",
56
+ parentId: null,
57
+ documentEvaluation: {
58
+ readability: {
59
+ score: 4,
60
+ reason: "Clear language with minor errors that don't affect reading",
61
+ },
62
+ coherence: { score: 5, reason: "Clear logic, no contradictions or jumps" },
63
+ contentQuality: { score: 3, reason: "50-70% implementation, some content is brief" },
64
+ translationQuality: { score: 4, reason: "Generally accurate with minor issues" },
65
+ consistency: { score: 4, reason: "Generally consistent with 1-2 differences" },
66
+ purposeAlignment: {
67
+ score: 4,
68
+ reason: "Generally meets objectives with minor irrelevant content",
69
+ },
70
+ audienceAlignment: { score: 5, reason: "Completely meets audience needs" },
71
+ knowledgeLevelAlignment: { score: 3, reason: "Partial match, about half doesn't fit" },
72
+ },
73
+ codeEvaluation: null,
74
+ },
75
+ {
76
+ path: "/api/endpoints",
77
+ title: "API Endpoints",
78
+ description: "API endpoints documentation",
79
+ parentId: null,
80
+ documentEvaluation: {
81
+ readability: { score: 5, reason: "No errors, natural and fluent language" },
82
+ coherence: {
83
+ score: 4,
84
+ reason: "Overall coherent with occasional unnatural transitions",
85
+ },
86
+ contentQuality: {
87
+ score: 4,
88
+ reason: "70-90% planning points implemented, minor details lacking",
89
+ },
90
+ translationQuality: {
91
+ score: 5,
92
+ reason: "Accurate and natural, consistent terminology",
93
+ },
94
+ consistency: { score: 5, reason: "Completely consistent" },
95
+ purposeAlignment: { score: 5, reason: "Completely meets objectives, closely related" },
96
+ audienceAlignment: { score: 4, reason: "Generally fits with minor mismatches" },
97
+ knowledgeLevelAlignment: {
98
+ score: 4,
99
+ reason: "Mostly matches, slightly too shallow/deep in places",
100
+ },
101
+ },
102
+ codeEvaluation: null,
103
+ },
104
+ ],
105
+ metadata: {
106
+ documentTitle: "API Usage Guide",
107
+ evaluator: "test-suite",
108
+ },
109
+ basePath: testDir,
110
+ projectName: "Test Project",
111
+ projectDesc: "A test project for evaluation",
112
+ projectLogo: "test-logo.png",
113
+ documentPurpose: "Provide API documentation",
114
+ targetAudienceTypes: ["Developers", "DevOps Engineers"],
115
+ readerKnowledgeLevel: "Intermediate",
116
+ documentationDepth: "Comprehensive",
117
+ targetAudience: "Software developers and engineers",
118
+ };
119
+
120
+ // Call the function
121
+ const result = await generateEvaluationReport(testData);
122
+
123
+ // Verify result structure
124
+ expect(result).toBeDefined();
125
+ expect(result.message).toBeDefined();
126
+ expect(result.message).toContain("integrity-report.json");
127
+ expect(result.message).toContain("doc-smith/evaluate/");
128
+
129
+ // Extract report path from result message
130
+ const reportPathMatch = result.message.match(/`([^`]+\.json)`/);
131
+ expect(reportPathMatch).toBeTruthy();
132
+ const reportPath = reportPathMatch[1];
133
+
134
+ // Verify file was created
135
+ expect(existsSync(reportPath)).toBe(true);
136
+
137
+ // Read and parse the report
138
+ const reportContent = await readFile(reportPath, "utf8");
139
+ const report = JSON.parse(reportContent);
140
+
141
+ // Verify report structure
142
+ expect(report).toBeDefined();
143
+ expect(report.documentInfo).toBeDefined();
144
+ expect(report.metadata).toBeDefined();
145
+ expect(report.structureEvaluation).toBeDefined();
146
+ expect(report.documentEvaluations).toBeDefined();
147
+
148
+ // Verify document info
149
+ expect(report.documentInfo.projectName).toBe("Test Project");
150
+ expect(report.documentInfo.projectDesc).toBe("A test project for evaluation");
151
+ expect(report.documentInfo.projectLogo).toBe("test-logo.png");
152
+ expect(report.documentInfo.documentPurpose).toBe("Provide API documentation");
153
+ expect(report.documentInfo.targetAudienceTypes).toEqual(["Developers", "DevOps Engineers"]);
154
+ expect(report.documentInfo.readerKnowledgeLevel).toBe("Intermediate");
155
+ expect(report.documentInfo.documentationDepth).toBe("Comprehensive");
156
+ expect(report.documentInfo.targetAudience).toBe("Software developers and engineers");
157
+
158
+ // Verify metadata
159
+ expect(report.metadata.version).toBe("0.1.0");
160
+ expect(report.metadata.generatedBy).toBe("AIGNE Doc Smith");
161
+ expect(report.metadata.generatedAt).toBeDefined();
162
+ expect(report.metadata.documentCount).toBe(2);
163
+ expect(report.metadata.documentTitle).toBe("API Usage Guide");
164
+ expect(report.metadata.evaluator).toBe("test-suite");
165
+
166
+ // Verify structure evaluation
167
+ expect(report.structureEvaluation.type).toBe("document-structure");
168
+ expect(report.structureEvaluation.results.purposeCoverage).toEqual(
169
+ testData.structureEvaluation.purposeCoverage,
170
+ );
171
+ expect(report.structureEvaluation.results.audienceCoverage).toEqual(
172
+ testData.structureEvaluation.audienceCoverage,
173
+ );
174
+ expect(report.structureEvaluation.results.coverageDepthAlignment).toEqual(
175
+ testData.structureEvaluation.coverageDepthAlignment,
176
+ );
177
+
178
+ // Verify document evaluations
179
+ expect(report.documentEvaluations.type).toBe("document-content");
180
+ expect(report.documentEvaluations.results).toHaveLength(2);
181
+
182
+ // Verify individual document evaluations
183
+ const firstDoc = report.documentEvaluations.results[0];
184
+ expect(firstDoc.path).toBe("/api/authentication");
185
+ expect(firstDoc.title).toBe("Authentication");
186
+ expect(firstDoc.description).toBe("Authentication guide");
187
+ expect(firstDoc.parentId).toBe(null);
188
+ expect(firstDoc.documentEvaluation.readability.score).toBe(4);
189
+ expect(firstDoc.codeEvaluation).toBe(null);
190
+ });
191
+
192
+ test("should handle empty document structure", async () => {
193
+ const testData = {
194
+ structureEvaluation: {
195
+ purposeCoverage: {
196
+ score: 5,
197
+ reason: "Completely covers all objectives",
198
+ covered: ["Objective 1", "Objective 2"],
199
+ missing: [],
200
+ },
201
+ audienceCoverage: {
202
+ score: 5,
203
+ reason: "Completely covers all audiences",
204
+ covered: ["Audience 1", "Audience 2"],
205
+ missing: [],
206
+ },
207
+ coverageDepthAlignment: {
208
+ score: 5,
209
+ reason: "Depth completely matches expectations",
210
+ },
211
+ },
212
+ originalDocumentStructure: [],
213
+ metadata: {
214
+ documentTitle: "Test Document",
215
+ },
216
+ basePath: testDir,
217
+ projectName: "Empty Test Project",
218
+ projectDesc: "Test project with no documents",
219
+ projectLogo: "empty-logo.png",
220
+ documentPurpose: "Test empty structure",
221
+ targetAudienceTypes: ["Testers"],
222
+ readerKnowledgeLevel: "Beginner",
223
+ documentationDepth: "Basic",
224
+ targetAudience: "Test users",
225
+ };
226
+
227
+ const result = await generateEvaluationReport(testData);
228
+
229
+ expect(result).toBeDefined();
230
+ expect(result.message).toBeDefined();
231
+
232
+ // Extract report path from result message
233
+ const reportPathMatch = result.message.match(/`([^`]+\.json)`/);
234
+ expect(reportPathMatch).toBeTruthy();
235
+ const reportPath = reportPathMatch[1];
236
+
237
+ expect(existsSync(reportPath)).toBe(true);
238
+
239
+ const reportContent = await readFile(reportPath, "utf8");
240
+ const report = JSON.parse(reportContent);
241
+
242
+ expect(report.metadata.documentCount).toBe(0);
243
+ expect(report.documentEvaluations.results).toHaveLength(0);
244
+ });
245
+
246
+ test("should handle missing optional parameters", async () => {
247
+ const testData = {
248
+ structureEvaluation: {
249
+ purposeCoverage: {
250
+ score: 3,
251
+ reason: "Partial coverage",
252
+ },
253
+ audienceCoverage: {
254
+ score: 3,
255
+ reason: "Partial coverage",
256
+ },
257
+ coverageDepthAlignment: {
258
+ score: 3,
259
+ reason: "Generally compliant",
260
+ },
261
+ },
262
+ originalDocumentStructure: [
263
+ {
264
+ path: "/test",
265
+ title: "Test Document",
266
+ description: "Test document description",
267
+ parentId: null,
268
+ documentEvaluation: {
269
+ readability: { score: 3, reason: "Fair" },
270
+ coherence: { score: 3, reason: "Fair" },
271
+ contentQuality: { score: 3, reason: "Fair" },
272
+ translationQuality: { score: 3, reason: "Fair" },
273
+ consistency: { score: 3, reason: "Fair" },
274
+ purposeAlignment: { score: 3, reason: "Fair" },
275
+ audienceAlignment: { score: 3, reason: "Fair" },
276
+ knowledgeLevelAlignment: { score: 3, reason: "Fair" },
277
+ },
278
+ codeEvaluation: null,
279
+ },
280
+ ],
281
+ basePath: testDir,
282
+ projectName: "Minimal Test Project",
283
+ projectDesc: "Minimal test setup",
284
+ projectLogo: "minimal-logo.png",
285
+ documentPurpose: "Test minimal configuration",
286
+ targetAudienceTypes: ["General Users"],
287
+ readerKnowledgeLevel: "Basic",
288
+ documentationDepth: "Minimal",
289
+ targetAudience: "General audience",
290
+ // metadata is optional
291
+ };
292
+
293
+ const result = await generateEvaluationReport(testData);
294
+
295
+ expect(result).toBeDefined();
296
+ expect(result.message).toBeDefined();
297
+
298
+ // Extract report path from result message
299
+ const reportPathMatch = result.message.match(/`([^`]+\.json)`/);
300
+ expect(reportPathMatch).toBeTruthy();
301
+ const reportPath = reportPathMatch[1];
302
+
303
+ expect(existsSync(reportPath)).toBe(true);
304
+
305
+ const reportContent = await readFile(reportPath, "utf8");
306
+ const report = JSON.parse(reportContent);
307
+
308
+ expect(report.metadata.version).toBe("0.1.0");
309
+ expect(report.metadata.generatedBy).toBe("AIGNE Doc Smith");
310
+ expect(report.metadata.documentCount).toBe(1);
311
+ });
312
+ });
@@ -25,7 +25,6 @@ describe("checkDocumentStructure Agent", () => {
25
25
  // Verify agent exists and is correct type
26
26
  expect(agent).toBeDefined();
27
27
  expect(agent).toBeInstanceOf(AIAgent);
28
- expect(agent.name).toBe("checkDocumentStructure");
29
28
  });
30
29
 
31
30
  test("should have instructions loaded from file", async () => {
@@ -42,10 +41,5 @@ describe("checkDocumentStructure Agent", () => {
42
41
  expect(agent.instructions).toBeDefined();
43
42
  const instructions = await agent.instructions.build({});
44
43
  expect(instructions.messages).toBeDefined();
45
- expect(instructions.messages.length).toBeGreaterThan(0);
46
-
47
- // The instructions should contain content from the prompt file
48
- const systemMessage = instructions.messages.find((m) => m.role === "system");
49
- expect(systemMessage).toBeDefined();
50
44
  });
51
45
  });