@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.
- package/.aigne/doc-smith/config.yaml +2 -0
- package/.aigne/doc-smith/output/structure-plan.json +3 -3
- package/.aigne/doc-smith/upload-cache.yaml +252 -0
- package/.github/workflows/publish-docs.yml +67 -0
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +22 -0
- package/README.md +45 -115
- package/agents/clear/choose-contents.mjs +170 -0
- package/agents/clear/clear-auth-tokens.mjs +111 -0
- package/agents/clear/clear-document-config.mjs +39 -0
- package/agents/clear/clear-document-structure.mjs +106 -0
- package/agents/clear/clear-generated-docs.mjs +51 -0
- package/agents/clear/index.yaml +23 -0
- package/agents/evaluate/code-snippet.mjs +93 -0
- package/agents/evaluate/document-structure.yaml +70 -0
- package/agents/evaluate/document.yaml +79 -0
- package/agents/evaluate/generate-report.mjs +78 -0
- package/agents/evaluate/index.yaml +39 -0
- package/agents/generate/document-structure-tools/add-document.mjs +56 -0
- package/agents/generate/document-structure-tools/delete-document.mjs +49 -0
- package/agents/generate/document-structure-tools/move-document.mjs +82 -0
- package/agents/generate/document-structure-tools/update-document.mjs +50 -0
- package/agents/generate/generate-structure.yaml +1 -1
- package/agents/generate/update-document-structure.yaml +42 -0
- package/agents/generate/user-review-document-structure.mjs +6 -4
- package/agents/init/index.mjs +1 -1
- package/agents/publish/publish-docs.mjs +12 -3
- package/agents/translate/choose-language.mjs +1 -1
- package/agents/update/batch-update-document.yaml +7 -0
- package/agents/update/check-update-is-single.mjs +38 -0
- package/agents/update/document-tools/update-document-content.mjs +293 -0
- package/agents/update/index.yaml +4 -10
- package/agents/update/update-document-detail.yaml +52 -0
- package/agents/update/update-single-document.yaml +15 -0
- package/agents/update/user-review-document.mjs +248 -0
- package/agents/utils/choose-docs.mjs +4 -2
- package/agents/utils/format-document-structure.mjs +12 -2
- package/agents/utils/load-document-all-content.mjs +84 -0
- package/agents/utils/load-sources.mjs +4 -1
- package/aigne.yaml +59 -20
- package/assets/report-template/report.html +198 -0
- package/biome.json +14 -2
- package/docs/advanced-how-it-works.ja.md +101 -0
- package/docs/advanced-how-it-works.zh-TW.md +101 -0
- package/docs/advanced-how-it-works.zh.md +20 -20
- package/docs/advanced-quality-assurance.ja.md +96 -0
- package/docs/advanced-quality-assurance.zh-TW.md +96 -0
- package/docs/advanced-quality-assurance.zh.md +18 -18
- package/docs/advanced.ja.md +16 -0
- package/docs/advanced.zh-TW.md +16 -0
- package/docs/advanced.zh.md +4 -4
- package/docs/changelog.ja.md +309 -0
- package/docs/changelog.zh-TW.md +309 -0
- package/docs/changelog.zh.md +23 -23
- package/docs/cli-reference.ja.md +210 -0
- package/docs/cli-reference.zh-TW.md +210 -0
- package/docs/cli-reference.zh.md +21 -21
- package/docs/configuration-interactive-setup.ja.md +135 -0
- package/docs/configuration-interactive-setup.zh-TW.md +135 -0
- package/docs/configuration-interactive-setup.zh.md +29 -29
- package/docs/configuration-language-support.ja.md +94 -0
- package/docs/configuration-language-support.zh-TW.md +94 -0
- package/docs/configuration-language-support.zh.md +13 -13
- package/docs/configuration-llm-setup.ja.md +54 -0
- package/docs/configuration-llm-setup.zh-TW.md +54 -0
- package/docs/configuration-llm-setup.zh.md +12 -12
- package/docs/configuration-preferences.ja.md +129 -0
- package/docs/configuration-preferences.zh-TW.md +129 -0
- package/docs/configuration-preferences.zh.md +36 -36
- package/docs/configuration.ja.md +172 -0
- package/docs/configuration.zh-TW.md +172 -0
- package/docs/configuration.zh.md +49 -49
- package/docs/features-generate-documentation.ja.md +101 -0
- package/docs/features-generate-documentation.zh-TW.md +101 -0
- package/docs/features-generate-documentation.zh.md +17 -17
- package/docs/features-publish-your-docs.ja.md +107 -0
- package/docs/features-publish-your-docs.zh-TW.md +107 -0
- package/docs/features-publish-your-docs.zh.md +22 -22
- package/docs/features-translate-documentation.ja.md +79 -0
- package/docs/features-translate-documentation.zh-TW.md +79 -0
- package/docs/features-translate-documentation.zh.md +12 -12
- package/docs/features-update-and-refine.ja.md +138 -0
- package/docs/features-update-and-refine.zh-TW.md +138 -0
- package/docs/features-update-and-refine.zh.md +21 -21
- package/docs/features.ja.md +52 -0
- package/docs/features.zh-TW.md +52 -0
- package/docs/features.zh.md +8 -8
- package/docs/getting-started.ja.md +123 -0
- package/docs/getting-started.zh-TW.md +123 -0
- package/docs/getting-started.zh.md +24 -24
- package/docs/overview.ja.md +30 -0
- package/docs/overview.zh-TW.md +30 -0
- package/docs/overview.zh.md +8 -8
- package/package.json +19 -11
- package/prompts/common/document/content-rules-core.md +19 -0
- package/prompts/common/document/media-handling-rules.md +9 -0
- package/prompts/common/document/role-and-personality.md +15 -0
- package/prompts/common/document/user-preferences.md +9 -0
- package/prompts/common/document-structure/conflict-resolution-guidance.md +16 -0
- package/prompts/common/document-structure/document-structure-rules.md +45 -0
- package/prompts/common/document-structure/glossary.md +7 -0
- package/prompts/common/document-structure/intj-traits.md +5 -0
- package/prompts/common/document-structure/output-constraints.md +9 -0
- package/prompts/common/document-structure/user-locale-rules.md +10 -0
- package/prompts/common/document-structure/user-preferences.md +9 -0
- package/prompts/detail/custom/custom-components.md +9 -1
- package/prompts/detail/document-rules.md +6 -6
- package/prompts/detail/generate-document.md +5 -45
- package/prompts/detail/update-document.md +145 -0
- package/prompts/evaluate/document-structure.md +94 -0
- package/prompts/evaluate/document.md +149 -0
- package/prompts/structure/document-rules.md +1 -1
- package/prompts/structure/generate-structure-system.md +74 -0
- package/prompts/structure/generate-structure-user.md +41 -0
- package/prompts/structure/update-document-structure.md +118 -0
- package/prompts/translate/translate-document.md +1 -1
- package/prompts/utils/feedback-refiner.md +3 -3
- package/release-please-config.json +1 -7
- package/tests/agents/clear/choose-contents.test.mjs +280 -0
- package/tests/agents/clear/clear-auth-tokens.test.mjs +268 -0
- package/tests/agents/clear/clear-document-config.test.mjs +167 -0
- package/tests/agents/clear/clear-document-structure.test.mjs +374 -0
- package/tests/agents/clear/clear-generated-docs.test.mjs +222 -0
- package/tests/agents/evaluate/code-snippet.test.mjs +163 -0
- package/tests/agents/evaluate/fixtures/api-services.md +87 -0
- package/tests/agents/evaluate/fixtures/js-sdk.md +94 -0
- package/tests/agents/evaluate/generate-report.test.mjs +312 -0
- package/tests/agents/generate/check-document-structure.test.mjs +0 -6
- package/tests/agents/generate/document-structure-tools/add-document.test.mjs +449 -0
- package/tests/agents/generate/document-structure-tools/delete-document.test.mjs +410 -0
- package/tests/agents/generate/document-structure-tools/move-document.test.mjs +476 -0
- package/tests/agents/generate/document-structure-tools/update-document.test.mjs +548 -0
- package/tests/agents/generate/generate-structure.test.mjs +0 -6
- package/tests/agents/generate/user-review-document-structure.test.mjs +9 -9
- package/tests/agents/publish/publish-docs.test.mjs +2 -2
- package/tests/agents/update/check-update-is-single.test.mjs +300 -0
- package/tests/agents/update/document-tools/update-document-content.test.mjs +326 -0
- package/tests/agents/update/user-review-document.test.mjs +561 -0
- package/tests/agents/utils/format-document-structure.test.mjs +100 -0
- package/tests/utils/auth-utils.test.mjs +239 -1
- package/tests/utils/blocklet.test.mjs +9 -7
- package/tests/utils/constants.test.mjs +1 -1
- package/tests/utils/d2-utils.test.mjs +1 -1
- package/tests/utils/deploy.test.mjs +310 -366
- package/tests/utils/kroki-utils.test.mjs +2 -15
- package/tests/utils/linter/fixtures/css/keyword-error.css +1 -0
- package/tests/utils/linter/fixtures/css/missing-semicolon.css +1 -0
- package/tests/utils/linter/fixtures/css/syntax-error.css +1 -0
- package/tests/utils/linter/fixtures/css/undeclare-variable.css +1 -0
- package/tests/utils/linter/fixtures/css/unused-variable.css +2 -0
- package/tests/utils/linter/fixtures/css/valid-code.css +1 -0
- package/tests/utils/linter/fixtures/dockerfile/keyword-error.dockerfile +1 -0
- package/tests/utils/linter/fixtures/dockerfile/missing-semicolon.dockerfile +2 -0
- package/tests/utils/linter/fixtures/dockerfile/syntax-error.dockerfile +2 -0
- package/tests/utils/linter/fixtures/dockerfile/undeclare-variable.dockerfile +1 -0
- package/tests/utils/linter/fixtures/dockerfile/unused-variable.dockerfile +1 -0
- package/tests/utils/linter/fixtures/dockerfile/valid-code.dockerfile +2 -0
- package/tests/utils/linter/fixtures/go/keyword-error.go +5 -0
- package/tests/utils/linter/fixtures/go/missing-semicolon.go +5 -0
- package/tests/utils/linter/fixtures/go/syntax-error.go +6 -0
- package/tests/utils/linter/fixtures/go/undeclare-variable.go +5 -0
- package/tests/utils/linter/fixtures/go/unused-variable.go +5 -0
- package/tests/utils/linter/fixtures/go/valid-code.go +7 -0
- package/tests/utils/linter/fixtures/js/keyword-error.js +3 -0
- package/tests/utils/linter/fixtures/js/missing-semicolon.js +6 -0
- package/tests/utils/linter/fixtures/js/syntax-error.js +4 -0
- package/tests/utils/linter/fixtures/js/undeclare-variable.js +3 -0
- package/tests/utils/linter/fixtures/js/unused-variable.js +7 -0
- package/tests/utils/linter/fixtures/js/valid-code.js +15 -0
- package/tests/utils/linter/fixtures/json/keyword-error.json +1 -0
- package/tests/utils/linter/fixtures/json/missing-semicolon.json +1 -0
- package/tests/utils/linter/fixtures/json/syntax-error.json +1 -0
- package/tests/utils/linter/fixtures/json/undeclare-variable.json +1 -0
- package/tests/utils/linter/fixtures/json/unused-variable.json +1 -0
- package/tests/utils/linter/fixtures/json/valid-code.json +1 -0
- package/tests/utils/linter/fixtures/jsx/keyword-error.jsx +5 -0
- package/tests/utils/linter/fixtures/jsx/missing-semicolon.jsx +5 -0
- package/tests/utils/linter/fixtures/jsx/syntax-error.jsx +5 -0
- package/tests/utils/linter/fixtures/jsx/undeclare-variable.jsx +5 -0
- package/tests/utils/linter/fixtures/jsx/unused-variable.jsx +4 -0
- package/tests/utils/linter/fixtures/jsx/valid-code.jsx +5 -0
- package/tests/utils/linter/fixtures/python/keyword-error.py +3 -0
- package/tests/utils/linter/fixtures/python/missing-semicolon.py +2 -0
- package/tests/utils/linter/fixtures/python/syntax-error.py +3 -0
- package/tests/utils/linter/fixtures/python/undeclare-variable.py +3 -0
- package/tests/utils/linter/fixtures/python/unused-variable.py +6 -0
- package/tests/utils/linter/fixtures/python/valid-code.py +12 -0
- package/tests/utils/linter/fixtures/ruby/keyword-error.rb +2 -0
- package/tests/utils/linter/fixtures/ruby/missing-semicolon.rb +1 -0
- package/tests/utils/linter/fixtures/ruby/syntax-error.rb +2 -0
- package/tests/utils/linter/fixtures/ruby/undeclare-variable.rb +1 -0
- package/tests/utils/linter/fixtures/ruby/unused-variable.rb +2 -0
- package/tests/utils/linter/fixtures/ruby/valid-code.rb +1 -0
- package/tests/utils/linter/fixtures/sass/keyword-error.sass +2 -0
- package/tests/utils/linter/fixtures/sass/missing-semicolon.sass +3 -0
- package/tests/utils/linter/fixtures/sass/syntax-error.sass +3 -0
- package/tests/utils/linter/fixtures/sass/undeclare-variable.sass +2 -0
- package/tests/utils/linter/fixtures/sass/unused-variable.sass +4 -0
- package/tests/utils/linter/fixtures/sass/valid-code.sass +2 -0
- package/tests/utils/linter/fixtures/scss/keyword-error.scss +1 -0
- package/tests/utils/linter/fixtures/scss/missing-semicolon.scss +1 -0
- package/tests/utils/linter/fixtures/scss/syntax-error.scss +1 -0
- package/tests/utils/linter/fixtures/scss/undeclare-variable.scss +1 -0
- package/tests/utils/linter/fixtures/scss/unused-variable.scss +2 -0
- package/tests/utils/linter/fixtures/scss/valid-code.scss +1 -0
- package/tests/utils/linter/fixtures/shell/keyword-error.sh +5 -0
- package/tests/utils/linter/fixtures/shell/missing-semicolon.sh +3 -0
- package/tests/utils/linter/fixtures/shell/syntax-error.sh +4 -0
- package/tests/utils/linter/fixtures/shell/undeclare-variable.sh +3 -0
- package/tests/utils/linter/fixtures/shell/unused-variable.sh +4 -0
- package/tests/utils/linter/fixtures/shell/valid-code.sh +3 -0
- package/tests/utils/linter/fixtures/ts/keyword-error.ts +1 -0
- package/tests/utils/linter/fixtures/ts/missing-semicolon.ts +1 -0
- package/tests/utils/linter/fixtures/ts/syntax-error.ts +1 -0
- package/tests/utils/linter/fixtures/ts/undeclare-variable.ts +1 -0
- package/tests/utils/linter/fixtures/ts/unused-variable.ts +3 -0
- package/tests/utils/linter/fixtures/ts/valid-code.ts +3 -0
- package/tests/utils/linter/fixtures/tsx/keyword-error.tsx +5 -0
- package/tests/utils/linter/fixtures/tsx/missing-semicolon.tsx +5 -0
- package/tests/utils/linter/fixtures/tsx/syntax-error.tsx +5 -0
- package/tests/utils/linter/fixtures/tsx/undeclare-variable.tsx +6 -0
- package/tests/utils/linter/fixtures/tsx/unused-variable.tsx +6 -0
- package/tests/utils/linter/fixtures/tsx/valid-code.tsx +5 -0
- package/tests/utils/linter/fixtures/vue/keyword-error.vue +6 -0
- package/tests/utils/linter/fixtures/vue/missing-semicolon.vue +6 -0
- package/tests/utils/linter/fixtures/vue/syntax-error.vue +6 -0
- package/tests/utils/linter/fixtures/vue/undeclare-variable.vue +6 -0
- package/tests/utils/linter/fixtures/vue/unused-variable.vue +7 -0
- package/tests/utils/linter/fixtures/vue/valid-code.vue +6 -0
- package/tests/utils/linter/fixtures/yaml/keyword-error.yml +1 -0
- package/tests/utils/linter/fixtures/yaml/missing-semicolon.yml +2 -0
- package/tests/utils/linter/fixtures/yaml/syntax-error.yml +1 -0
- package/tests/utils/linter/fixtures/yaml/undeclare-variable.yml +1 -0
- package/tests/utils/linter/fixtures/yaml/unused-variable.yml +2 -0
- package/tests/utils/linter/fixtures/yaml/valid-code.yml +3 -0
- package/tests/utils/linter/index.test.mjs +440 -0
- package/tests/utils/linter/scan-results.mjs +42 -0
- package/tests/utils/markdown/index.test.mjs +478 -0
- package/tests/utils/mermaid-validator.test.mjs +2 -2
- package/tests/utils/utils.test.mjs +3 -1
- package/types/document-schema.mjs +54 -0
- package/types/document-structure-schema.mjs +244 -0
- package/utils/auth-utils.mjs +131 -6
- package/utils/conflict-detector.mjs +5 -1
- package/utils/{constants.mjs → constants/index.mjs} +109 -0
- package/utils/constants/linter.mjs +102 -0
- package/utils/d2-utils.mjs +2 -4
- package/utils/debug.mjs +3 -0
- package/utils/deploy.mjs +81 -385
- package/utils/evaluate/report-utils.mjs +131 -0
- package/utils/file-utils.mjs +36 -1
- package/utils/kroki-utils.mjs +1 -1
- package/utils/linter/index.mjs +50 -0
- package/utils/markdown/index.mjs +26 -0
- package/utils/markdown-checker.mjs +1 -1
- package/utils/utils.mjs +19 -7
- 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
|
});
|