@aigne/doc-smith 0.9.8-alpha.3 → 0.9.8-alpha.4
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/CLAUDE.md +43 -0
- package/README.md +94 -250
- package/aigne.yaml +2 -149
- package/doc-smith/SKILL.md +117 -0
- package/doc-smith/references/changeset_schema.md +118 -0
- package/doc-smith/references/document_structure_schema.md +139 -0
- package/doc-smith/references/document_update_guide.md +193 -0
- package/doc-smith/references/structure_confirmation_guide.md +133 -0
- package/doc-smith/references/structure_planning_guide.md +146 -0
- package/doc-smith/references/user_intent_guide.md +172 -0
- package/doc-smith.yaml +114 -0
- package/main-system-prompt.md +56 -0
- package/package.json +3 -69
- package/scripts/README.md +90 -0
- package/scripts/install.sh +86 -0
- package/scripts/uninstall.sh +52 -0
- package/CHANGELOG.md +0 -994
- package/LICENSE +0 -93
- package/agentic-agents/common/base-info.md +0 -53
- package/agentic-agents/common/completer.md +0 -54
- package/agentic-agents/common/planner.md +0 -168
- package/agentic-agents/common/worker.md +0 -93
- package/agentic-agents/create/index.yaml +0 -129
- package/agentic-agents/create/objective.md +0 -44
- package/agentic-agents/create/set-custom-prompt.mjs +0 -27
- package/agentic-agents/detail/index.yaml +0 -95
- package/agentic-agents/detail/objective.md +0 -9
- package/agentic-agents/detail/set-custom-prompt.mjs +0 -88
- package/agentic-agents/predict-resources/index.yaml +0 -44
- package/agentic-agents/predict-resources/instructions.md +0 -61
- package/agentic-agents/structure/design-rules.md +0 -39
- package/agentic-agents/structure/index.yaml +0 -86
- package/agentic-agents/structure/objective.md +0 -14
- package/agentic-agents/structure/review-criteria.md +0 -55
- package/agentic-agents/structure/set-custom-prompt.mjs +0 -78
- package/agentic-agents/utils/init-workspace-cache.mjs +0 -171
- package/agentic-agents/utils/load-base-sources.mjs +0 -20
- package/agentic-agents/workspace-cache-sharing-design.md +0 -671
- package/agents/chat/chat-system.md +0 -38
- package/agents/chat/index.mjs +0 -59
- package/agents/chat/skills/generate-document.yaml +0 -15
- package/agents/chat/skills/list-documents.mjs +0 -15
- package/agents/chat/skills/update-document.yaml +0 -24
- package/agents/clear/choose-contents.mjs +0 -192
- package/agents/clear/clear-auth-tokens.mjs +0 -88
- package/agents/clear/clear-deployment-config.mjs +0 -49
- package/agents/clear/clear-document-config.mjs +0 -36
- package/agents/clear/clear-document-structure.mjs +0 -102
- package/agents/clear/clear-generated-docs.mjs +0 -142
- package/agents/clear/clear-media-description.mjs +0 -129
- package/agents/clear/index.yaml +0 -26
- package/agents/create/analyze-diagram-type-llm.yaml +0 -160
- package/agents/create/analyze-diagram-type.mjs +0 -297
- package/agents/create/check-document-structure.yaml +0 -30
- package/agents/create/check-need-generate-structure.mjs +0 -105
- package/agents/create/document-structure-tools/add-document.mjs +0 -85
- package/agents/create/document-structure-tools/delete-document.mjs +0 -116
- package/agents/create/document-structure-tools/move-document.mjs +0 -109
- package/agents/create/document-structure-tools/update-document.mjs +0 -84
- package/agents/create/generate-diagram-image.yaml +0 -60
- package/agents/create/generate-structure.yaml +0 -117
- package/agents/create/index.yaml +0 -49
- package/agents/create/refine-document-structure.yaml +0 -12
- package/agents/create/replace-d2-with-image.mjs +0 -625
- package/agents/create/update-document-structure.yaml +0 -54
- package/agents/create/user-add-document/add-documents-to-structure.mjs +0 -90
- package/agents/create/user-add-document/find-documents-to-add-links.yaml +0 -47
- package/agents/create/user-add-document/index.yaml +0 -46
- package/agents/create/user-add-document/prepare-documents-to-translate.mjs +0 -22
- package/agents/create/user-add-document/print-add-document-summary.mjs +0 -63
- package/agents/create/user-add-document/review-documents-with-new-links.mjs +0 -110
- package/agents/create/user-remove-document/find-documents-with-invalid-links.mjs +0 -78
- package/agents/create/user-remove-document/index.yaml +0 -40
- package/agents/create/user-remove-document/prepare-documents-to-translate.mjs +0 -22
- package/agents/create/user-remove-document/print-remove-document-summary.mjs +0 -53
- package/agents/create/user-remove-document/remove-documents-from-structure.mjs +0 -99
- package/agents/create/user-remove-document/review-documents-with-invalid-links.mjs +0 -115
- package/agents/create/user-review-document-structure.mjs +0 -140
- package/agents/create/utils/init-current-content.mjs +0 -34
- package/agents/create/utils/merge-document-structures.mjs +0 -30
- package/agents/evaluate/code-snippet.mjs +0 -97
- package/agents/evaluate/document-structure.yaml +0 -67
- package/agents/evaluate/document.yaml +0 -82
- package/agents/evaluate/generate-report.mjs +0 -85
- package/agents/evaluate/index.yaml +0 -46
- package/agents/history/index.yaml +0 -6
- package/agents/history/view.mjs +0 -78
- package/agents/init/check.mjs +0 -16
- package/agents/init/index.mjs +0 -275
- package/agents/init/validate.mjs +0 -16
- package/agents/localize/choose-language.mjs +0 -107
- package/agents/localize/index.yaml +0 -58
- package/agents/localize/record-translation-history.mjs +0 -23
- package/agents/localize/translate-document.yaml +0 -24
- package/agents/localize/translate-multilingual.yaml +0 -51
- package/agents/media/batch-generate-media-description.yaml +0 -46
- package/agents/media/generate-media-description.yaml +0 -50
- package/agents/media/load-media-description.mjs +0 -256
- package/agents/prefs/index.mjs +0 -203
- package/agents/publish/index.yaml +0 -26
- package/agents/publish/publish-docs.mjs +0 -356
- package/agents/publish/translate-meta.mjs +0 -103
- package/agents/schema/document-structure-item.yaml +0 -26
- package/agents/schema/document-structure-refine-item.yaml +0 -23
- package/agents/schema/document-structure.yaml +0 -29
- package/agents/update/batch-generate-document.yaml +0 -27
- package/agents/update/batch-update-document.yaml +0 -7
- package/agents/update/check-diagram-flag.mjs +0 -116
- package/agents/update/check-document.mjs +0 -162
- package/agents/update/check-generate-diagram.mjs +0 -106
- package/agents/update/check-sync-image-flag.mjs +0 -55
- package/agents/update/check-update-is-single.mjs +0 -53
- package/agents/update/document-tools/update-document-content.mjs +0 -303
- package/agents/update/generate-diagram.yaml +0 -63
- package/agents/update/generate-document.yaml +0 -70
- package/agents/update/handle-document-update.yaml +0 -103
- package/agents/update/index.yaml +0 -79
- package/agents/update/pre-check-generate-diagram.yaml +0 -44
- package/agents/update/save-and-translate-document.mjs +0 -76
- package/agents/update/sync-images-and-exit.mjs +0 -148
- package/agents/update/update-document-detail.yaml +0 -71
- package/agents/update/update-single/update-single-document-detail.mjs +0 -280
- package/agents/update/update-single-document.yaml +0 -7
- package/agents/update/user-review-document.mjs +0 -272
- package/agents/utils/action-success.mjs +0 -16
- package/agents/utils/analyze-document-feedback-intent.yaml +0 -32
- package/agents/utils/analyze-feedback-intent.mjs +0 -136
- package/agents/utils/analyze-structure-feedback-intent.yaml +0 -29
- package/agents/utils/check-detail-result.mjs +0 -38
- package/agents/utils/check-feedback-refiner.mjs +0 -81
- package/agents/utils/choose-docs.mjs +0 -293
- package/agents/utils/document-icon-generate.yaml +0 -52
- package/agents/utils/document-title-streamline.yaml +0 -48
- package/agents/utils/ensure-document-icons.mjs +0 -129
- package/agents/utils/exit.mjs +0 -6
- package/agents/utils/feedback-refiner.yaml +0 -50
- package/agents/utils/find-item-by-path.mjs +0 -114
- package/agents/utils/find-user-preferences-by-path.mjs +0 -37
- package/agents/utils/format-document-structure.mjs +0 -35
- package/agents/utils/generate-document-or-skip.mjs +0 -41
- package/agents/utils/handle-diagram-operations.mjs +0 -263
- package/agents/utils/load-all-document-content.mjs +0 -30
- package/agents/utils/load-document-all-content.mjs +0 -84
- package/agents/utils/load-sources.mjs +0 -405
- package/agents/utils/map-reasoning-effort-level.mjs +0 -15
- package/agents/utils/post-generate.mjs +0 -144
- package/agents/utils/read-current-document-content.mjs +0 -46
- package/agents/utils/save-doc-translation.mjs +0 -61
- package/agents/utils/save-doc.mjs +0 -88
- package/agents/utils/save-output.mjs +0 -26
- package/agents/utils/save-sidebar.mjs +0 -51
- package/agents/utils/skip-if-content-exists.mjs +0 -27
- package/agents/utils/streamline-document-titles-if-needed.mjs +0 -88
- package/agents/utils/transform-detail-data-sources.mjs +0 -45
- package/agents/utils/update-branding.mjs +0 -84
- package/assets/report-template/report.html +0 -198
- package/docs-mcp/analyze-content-relevance.yaml +0 -50
- package/docs-mcp/analyze-docs-relevance.yaml +0 -59
- package/docs-mcp/docs-search.yaml +0 -42
- package/docs-mcp/get-docs-detail.mjs +0 -41
- package/docs-mcp/get-docs-structure.mjs +0 -16
- package/docs-mcp/read-doc-content.mjs +0 -119
- package/prompts/common/document/content-rules-core.md +0 -20
- package/prompts/common/document/markdown-syntax-rules.md +0 -65
- package/prompts/common/document/media-file-list-usage-rules.md +0 -18
- package/prompts/common/document/openapi-usage-rules.md +0 -189
- package/prompts/common/document/role-and-personality.md +0 -16
- package/prompts/common/document/user-preferences.md +0 -9
- package/prompts/common/document-structure/conflict-resolution-guidance.md +0 -16
- package/prompts/common/document-structure/document-icon-generate.md +0 -116
- package/prompts/common/document-structure/document-structure-rules.md +0 -43
- package/prompts/common/document-structure/document-title-streamline.md +0 -86
- package/prompts/common/document-structure/glossary.md +0 -7
- package/prompts/common/document-structure/intj-traits.md +0 -5
- package/prompts/common/document-structure/openapi-usage-rules.md +0 -28
- package/prompts/common/document-structure/output-constraints.md +0 -18
- package/prompts/common/document-structure/user-locale-rules.md +0 -10
- package/prompts/common/document-structure/user-preferences.md +0 -9
- package/prompts/detail/custom/admonition-usage-rules.md +0 -94
- package/prompts/detail/custom/code-block-usage-rules.md +0 -163
- package/prompts/detail/custom/custom-components/x-card-usage-rules.md +0 -63
- package/prompts/detail/custom/custom-components/x-cards-usage-rules.md +0 -83
- package/prompts/detail/custom/custom-components/x-field-desc-usage-rules.md +0 -120
- package/prompts/detail/custom/custom-components/x-field-group-usage-rules.md +0 -80
- package/prompts/detail/custom/custom-components/x-field-usage-rules.md +0 -189
- package/prompts/detail/custom/custom-components-usage-rules.md +0 -18
- package/prompts/detail/diagram/generate-image-system.md +0 -135
- package/prompts/detail/diagram/generate-image-user.md +0 -32
- package/prompts/detail/diagram/guide.md +0 -29
- package/prompts/detail/diagram/official-examples.md +0 -712
- package/prompts/detail/diagram/pre-check.md +0 -23
- package/prompts/detail/diagram/role-and-personality.md +0 -2
- package/prompts/detail/diagram/rules.md +0 -46
- package/prompts/detail/diagram/system-prompt.md +0 -1139
- package/prompts/detail/diagram/user-prompt.md +0 -43
- package/prompts/detail/generate/detail-example.md +0 -457
- package/prompts/detail/generate/document-rules.md +0 -45
- package/prompts/detail/generate/system-prompt.md +0 -61
- package/prompts/detail/generate/user-prompt.md +0 -99
- package/prompts/detail/jsx/rules.md +0 -6
- package/prompts/detail/update/system-prompt.md +0 -121
- package/prompts/detail/update/user-prompt.md +0 -41
- package/prompts/evaluate/document-structure.md +0 -93
- package/prompts/evaluate/document.md +0 -149
- package/prompts/media/media-description/system-prompt.md +0 -43
- package/prompts/media/media-description/user-prompt.md +0 -17
- package/prompts/structure/check-document-structure.md +0 -93
- package/prompts/structure/document-rules.md +0 -21
- package/prompts/structure/find-documents-to-add-links.md +0 -52
- package/prompts/structure/generate/system-prompt.md +0 -13
- package/prompts/structure/generate/user-prompt.md +0 -137
- package/prompts/structure/review/structure-review-system.md +0 -81
- package/prompts/structure/structure-example.md +0 -89
- package/prompts/structure/structure-getting-started.md +0 -10
- package/prompts/structure/update/system-prompt.md +0 -93
- package/prompts/structure/update/user-prompt.md +0 -43
- package/prompts/translate/admonition.md +0 -20
- package/prompts/translate/code-block.md +0 -33
- package/prompts/translate/glossary.md +0 -6
- package/prompts/translate/translate-document.md +0 -305
- package/prompts/utils/analyze-document-feedback-intent.md +0 -54
- package/prompts/utils/analyze-structure-feedback-intent.md +0 -43
- package/prompts/utils/feedback-refiner.md +0 -105
- package/types/document-schema.mjs +0 -55
- package/types/document-structure-schema.mjs +0 -261
- package/utils/auth-utils.mjs +0 -275
- package/utils/blocklet.mjs +0 -104
- package/utils/check-document-has-diagram.mjs +0 -95
- package/utils/conflict-detector.mjs +0 -149
- package/utils/constants/index.mjs +0 -620
- package/utils/constants/linter.mjs +0 -102
- package/utils/d2-utils.mjs +0 -198
- package/utils/debug.mjs +0 -3
- package/utils/delete-diagram-images.mjs +0 -99
- package/utils/deploy.mjs +0 -86
- package/utils/docs-finder-utils.mjs +0 -623
- package/utils/evaluate/report-utils.mjs +0 -132
- package/utils/extract-api.mjs +0 -32
- package/utils/file-utils.mjs +0 -960
- package/utils/history-utils.mjs +0 -203
- package/utils/icon-map.mjs +0 -26
- package/utils/image-compress.mjs +0 -75
- package/utils/kroki-utils.mjs +0 -173
- package/utils/linter/index.mjs +0 -50
- package/utils/load-config.mjs +0 -107
- package/utils/markdown/index.mjs +0 -26
- package/utils/markdown-checker.mjs +0 -694
- package/utils/mermaid-validator.mjs +0 -140
- package/utils/mermaid-worker-pool.mjs +0 -250
- package/utils/mermaid-worker.mjs +0 -233
- package/utils/openapi/index.mjs +0 -28
- package/utils/preferences-utils.mjs +0 -175
- package/utils/request.mjs +0 -10
- package/utils/store/index.mjs +0 -45
- package/utils/sync-diagram-to-translations.mjs +0 -262
- package/utils/upload-files.mjs +0 -231
- package/utils/utils.mjs +0 -1354
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
buildAllowedLinksFromStructure,
|
|
3
|
-
generateFileName,
|
|
4
|
-
pathToFlatName,
|
|
5
|
-
} from "../../../utils/docs-finder-utils.mjs";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Generate feedback message for fixing invalid links in a document
|
|
9
|
-
*/
|
|
10
|
-
function generateInvalidLinksFeedback(invalidLinks, documentPath, documentStructure) {
|
|
11
|
-
const invalidLinksList = invalidLinks.map((link) => `- ${link}`).join("\n");
|
|
12
|
-
|
|
13
|
-
// Build allowed links from document structure for replacement suggestions
|
|
14
|
-
const allowedLinks = buildAllowedLinksFromStructure(documentStructure);
|
|
15
|
-
const allowedLinksArray = Array.from(allowedLinks)
|
|
16
|
-
.filter((link) => link !== documentPath) // Exclude current document path
|
|
17
|
-
.sort();
|
|
18
|
-
|
|
19
|
-
const allowedLinksList =
|
|
20
|
-
allowedLinksArray.length > 0
|
|
21
|
-
? allowedLinksArray.map((link) => `- ${link}`).join("\n")
|
|
22
|
-
: "(No available links)";
|
|
23
|
-
|
|
24
|
-
return `This document contains invalid links that need to be fixed. Please handle them according to the following instructions:
|
|
25
|
-
|
|
26
|
-
**Invalid Links Found:**
|
|
27
|
-
${invalidLinksList}
|
|
28
|
-
|
|
29
|
-
**Available Valid Links:**
|
|
30
|
-
${allowedLinksList}
|
|
31
|
-
|
|
32
|
-
**Instructions for fixing invalid links:**
|
|
33
|
-
|
|
34
|
-
1. For each invalid link found in the document:
|
|
35
|
-
- Using the document context and the list of available valid links, try to find a suitable replacement link from the available valid links.
|
|
36
|
-
- When choosing a replacement, exclude the current document path (${documentPath}); linking to the current document is not logical.
|
|
37
|
-
- **Do not consider the original invalid link or its related text**; they are outdated and should be replaced.
|
|
38
|
-
|
|
39
|
-
2. If a suitable replacement link is found:
|
|
40
|
-
- Update **all related fields** associated with the invalid link (e.g., link URL, link text, surrounding context) according to the matched link from the available valid links.
|
|
41
|
-
- Ensure that after updating the link, the surrounding content remains consistent and natural. If there is a mismatch, update the corresponding content to keep everything aligned.
|
|
42
|
-
|
|
43
|
-
3. If no suitable replacement link can be found:
|
|
44
|
-
- Remove the invalid link completely, including the link text and any associated content that only makes sense with that link.
|
|
45
|
-
- **Do not affect other unrelated content** in the document; only remove content that is directly tied to the invalid link.
|
|
46
|
-
|
|
47
|
-
4. Ensure the document remains coherent and readable after the changes.`;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export default async function reviewDocumentsWithInvalidLinks(input = {}, options = {}) {
|
|
51
|
-
const { documentsWithInvalidLinks = [], documentStructure = [], locale = "en" } = input;
|
|
52
|
-
|
|
53
|
-
// If no documents with invalid links, return empty array
|
|
54
|
-
if (!Array.isArray(documentsWithInvalidLinks) || documentsWithInvalidLinks.length === 0) {
|
|
55
|
-
return {
|
|
56
|
-
documentsWithInvalidLinks: [],
|
|
57
|
-
documentsToUpdate: [],
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Create choices for user selection, default all checked
|
|
62
|
-
const choices = documentsWithInvalidLinks.map((doc) => {
|
|
63
|
-
const flatName = pathToFlatName(doc.path);
|
|
64
|
-
const filename = generateFileName(flatName, locale);
|
|
65
|
-
|
|
66
|
-
return {
|
|
67
|
-
name: `${doc.title} (${filename})`,
|
|
68
|
-
value: doc.path,
|
|
69
|
-
checked: true, // Default all selected
|
|
70
|
-
description: `Invalid Links(${doc.invalidLinks?.length || 0}): ${doc.invalidLinks?.join(", ")}`,
|
|
71
|
-
};
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// Let user select documents (default all selected)
|
|
75
|
-
const selectedPaths = await options.prompts.checkbox({
|
|
76
|
-
message:
|
|
77
|
-
"Select documents with invalid links to fix (all selected by default, press Enter to confirm, or unselect all to skip):",
|
|
78
|
-
choices,
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// Filter documents based on user selection
|
|
82
|
-
const selectedPathsSet = new Set(selectedPaths);
|
|
83
|
-
const filteredDocs = documentsWithInvalidLinks.filter((doc) => selectedPathsSet.has(doc.path));
|
|
84
|
-
|
|
85
|
-
if (filteredDocs.length === 0) {
|
|
86
|
-
return {
|
|
87
|
-
documentsWithInvalidLinks: [],
|
|
88
|
-
documentsToUpdate: [],
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Prepare documents: add necessary fields for update (without content)
|
|
93
|
-
const preparedDocs = [];
|
|
94
|
-
|
|
95
|
-
for (const doc of filteredDocs) {
|
|
96
|
-
if (!doc.path) continue;
|
|
97
|
-
|
|
98
|
-
// Find corresponding document in documentStructure to get additional fields
|
|
99
|
-
const structureDoc = documentStructure.find((item) => item.path === doc.path);
|
|
100
|
-
|
|
101
|
-
// Generate feedback message for fixing invalid links
|
|
102
|
-
const feedback = generateInvalidLinksFeedback(doc.invalidLinks, doc.path, documentStructure);
|
|
103
|
-
|
|
104
|
-
preparedDocs.push({
|
|
105
|
-
...structureDoc,
|
|
106
|
-
feedback,
|
|
107
|
-
invalidLinks: doc.invalidLinks,
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return {
|
|
112
|
-
documentsWithInvalidLinks: preparedDocs, // for print summary
|
|
113
|
-
documentsToUpdate: JSON.parse(JSON.stringify(preparedDocs)), // for batch update
|
|
114
|
-
};
|
|
115
|
-
}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { getActiveRulesForScope } from "../../utils/preferences-utils.mjs";
|
|
2
|
-
import { recordUpdate } from "../../utils/history-utils.mjs";
|
|
3
|
-
import { printDocumentStructure } from "../../utils/docs-finder-utils.mjs";
|
|
4
|
-
import equal from "fast-deep-equal";
|
|
5
|
-
|
|
6
|
-
export default async function userReviewDocumentStructure({ documentStructure, ...rest }, options) {
|
|
7
|
-
// Check if documentation structure exists
|
|
8
|
-
if (!documentStructure || !Array.isArray(documentStructure) || documentStructure.length === 0) {
|
|
9
|
-
console.log("No documentation structure was generated to review.");
|
|
10
|
-
return { documentStructure };
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// Print current documentation structure in a user-friendly format
|
|
14
|
-
if (!rest.isChat) {
|
|
15
|
-
printDocumentStructure(documentStructure);
|
|
16
|
-
|
|
17
|
-
// Ask user if they want to review the documentation structure
|
|
18
|
-
const needReview = await options.prompts.select({
|
|
19
|
-
message: "Would you like to refine the documentation structure?",
|
|
20
|
-
choices: [
|
|
21
|
-
{
|
|
22
|
-
name: "No, looks good",
|
|
23
|
-
value: "no",
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: "Yes, optimize the structure (e.g. rename 'Getting Started' to 'Quick Start', move 'API Reference' before 'Configuration')",
|
|
27
|
-
value: "yes",
|
|
28
|
-
},
|
|
29
|
-
],
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
if (needReview === "no") {
|
|
33
|
-
return { documentStructure };
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
let currentStructure = documentStructure;
|
|
38
|
-
|
|
39
|
-
const MAX_ITERATIONS = 100;
|
|
40
|
-
let iterationCount = 0;
|
|
41
|
-
|
|
42
|
-
// share current structure with updateDocumentStructure agent
|
|
43
|
-
options.context.userContext.currentStructure = currentStructure;
|
|
44
|
-
while (iterationCount < MAX_ITERATIONS) {
|
|
45
|
-
iterationCount++;
|
|
46
|
-
|
|
47
|
-
// Ask for feedback
|
|
48
|
-
const feedback = rest.isChat
|
|
49
|
-
? rest.feedback
|
|
50
|
-
: await options.prompts.input({
|
|
51
|
-
message:
|
|
52
|
-
"How would you like to improve the structure?\n" +
|
|
53
|
-
"Examples:\n" +
|
|
54
|
-
" • Add a new document 'Troubleshooting'\n" +
|
|
55
|
-
" • Remove the 'Legacy Features' document\n" +
|
|
56
|
-
" • Move 'Installation' to the top of the structure\n\n" +
|
|
57
|
-
" Press Enter to finish reviewing:",
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
// If no feedback, break the loop
|
|
61
|
-
if (!feedback?.trim()) {
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Get the refineDocumentStructure agent
|
|
66
|
-
const refineAgent = options.context.agents["generateStructureExp"];
|
|
67
|
-
if (!refineAgent) {
|
|
68
|
-
console.log(
|
|
69
|
-
"Unable to process your feedback - the documentation structure update feature is unavailable.",
|
|
70
|
-
);
|
|
71
|
-
console.log("Please try again later or contact support if this continues.");
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Get user preferences
|
|
76
|
-
const structureRules = getActiveRulesForScope("structure", []);
|
|
77
|
-
const globalRules = getActiveRulesForScope("global", []);
|
|
78
|
-
const allApplicableRules = [...structureRules, ...globalRules];
|
|
79
|
-
const ruleTexts = allApplicableRules.map((rule) => rule.rule);
|
|
80
|
-
const userPreferences = ruleTexts.length > 0 ? ruleTexts.join("\n\n") : "";
|
|
81
|
-
|
|
82
|
-
try {
|
|
83
|
-
// Call refineDocumentStructure agent with feedback
|
|
84
|
-
const { message, ...result } = await options.context.invoke(refineAgent, {
|
|
85
|
-
...rest,
|
|
86
|
-
// dataSourceChunk: rest.dataSources[0].dataSourceChunk,
|
|
87
|
-
userFeedback: feedback.trim(),
|
|
88
|
-
// documentStructure: currentStructure,
|
|
89
|
-
// userPreferences,
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// currentStructure = options.context.userContext.currentStructure;
|
|
93
|
-
currentStructure = result.documentStructure;
|
|
94
|
-
|
|
95
|
-
if (rest.isChat && equal(currentStructure, documentStructure)) {
|
|
96
|
-
throw new Error(
|
|
97
|
-
`The suggested structure changes did not modify the existing documentation structure. ${message}`,
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Check if feedback should be saved as user preference
|
|
102
|
-
const feedbackRefinerAgent = options.context.agents["checkFeedbackRefiner"];
|
|
103
|
-
if (feedbackRefinerAgent) {
|
|
104
|
-
try {
|
|
105
|
-
await options.context.invoke(feedbackRefinerAgent, {
|
|
106
|
-
documentStructureFeedback: feedback.trim(),
|
|
107
|
-
stage: "structure",
|
|
108
|
-
});
|
|
109
|
-
} catch (refinerError) {
|
|
110
|
-
console.warn("Could not save feedback as a user preference:", refinerError.message);
|
|
111
|
-
console.warn("Your feedback was applied but not saved as a preference.");
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Record update in history
|
|
116
|
-
recordUpdate({
|
|
117
|
-
operation: "structure_update",
|
|
118
|
-
feedback: feedback.trim(),
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
// Print current documentation structure in a user-friendly format
|
|
122
|
-
printDocumentStructure(currentStructure);
|
|
123
|
-
|
|
124
|
-
if (rest.isChat) {
|
|
125
|
-
break;
|
|
126
|
-
}
|
|
127
|
-
} catch (error) {
|
|
128
|
-
console.error("Error processing your feedback:");
|
|
129
|
-
console.error(`Type: ${error.name}`);
|
|
130
|
-
console.error(`Message: ${error.message}`);
|
|
131
|
-
console.error(`Stack: ${error.stack}`);
|
|
132
|
-
console.log("\nPlease try rephrasing your feedback or continue with the current structure.");
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return { documentStructure: currentStructure };
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
userReviewDocumentStructure.taskTitle = "User review and modify documentation structure";
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { readFileContent } from "../../../utils/docs-finder-utils.mjs";
|
|
2
|
-
import { getFileName, userContextAt } from "../../../utils/utils.mjs";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Initialize currentContents in userContext for document update
|
|
6
|
-
* Reads document content from file system and sets it in userContext
|
|
7
|
-
* Uses getFileName utility to generate filename consistently
|
|
8
|
-
*/
|
|
9
|
-
export default async function initCurrentContent(input, options) {
|
|
10
|
-
const { path, docsDir, locale = "en" } = input;
|
|
11
|
-
|
|
12
|
-
if (!path) {
|
|
13
|
-
return {};
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// Generate filename using unified utility function
|
|
17
|
-
const fileName = getFileName(path, locale);
|
|
18
|
-
|
|
19
|
-
// Read document content
|
|
20
|
-
const content = docsDir ? await readFileContent(docsDir, fileName) : null;
|
|
21
|
-
|
|
22
|
-
if (!content) {
|
|
23
|
-
console.warn(`⚠️ Could not read content from ${fileName}`);
|
|
24
|
-
return {};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Initialize currentContents[path] in userContext
|
|
28
|
-
const contentContext = userContextAt(options, `currentContents.${path}`);
|
|
29
|
-
contentContext.set(content);
|
|
30
|
-
|
|
31
|
-
return {};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
initCurrentContent.task_render_mode = "hide";
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export default async function mergeDocumentStructures(input, options) {
|
|
2
|
-
if (input.projectName) {
|
|
3
|
-
options.context.userContext.projectName = input.projectName;
|
|
4
|
-
}
|
|
5
|
-
if (input.projectDesc) {
|
|
6
|
-
options.context.userContext.projectDesc = input.projectDesc;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
input.projectName = options.context.userContext.projectName;
|
|
10
|
-
input.projectDesc = options.context.userContext.projectDesc;
|
|
11
|
-
|
|
12
|
-
options.context.userContext.originalDocumentStructure ??= [];
|
|
13
|
-
|
|
14
|
-
const originalStructures = [...options.context.userContext.originalDocumentStructure];
|
|
15
|
-
|
|
16
|
-
if (input.structures) {
|
|
17
|
-
for (const item of input.structures) {
|
|
18
|
-
const index = originalStructures.findIndex((s) => s.path === item.path);
|
|
19
|
-
if (index !== -1) {
|
|
20
|
-
originalStructures[index] = item;
|
|
21
|
-
} else {
|
|
22
|
-
originalStructures.push(item);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
options.context.userContext.originalDocumentStructure = originalStructures;
|
|
28
|
-
|
|
29
|
-
return {};
|
|
30
|
-
}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import pMap from "p-map";
|
|
2
|
-
import pRetry from "p-retry";
|
|
3
|
-
import {
|
|
4
|
-
CODE_LANGUAGE_MAP_LINTER,
|
|
5
|
-
CODE_LANGUAGE_MAP_SUFFIX,
|
|
6
|
-
} from "../../utils/constants/linter.mjs";
|
|
7
|
-
import { debug } from "../../utils/debug.mjs";
|
|
8
|
-
import { lintCode } from "../../utils/linter/index.mjs";
|
|
9
|
-
import { getMarkdownAst, traverseMarkdownAst } from "../../utils/markdown/index.mjs";
|
|
10
|
-
|
|
11
|
-
const severityMapLevel = {
|
|
12
|
-
error: "critical",
|
|
13
|
-
warning: "minor",
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export default async function evaluateDocumentCode({ content }) {
|
|
17
|
-
const ast = getMarkdownAst({ markdown: content });
|
|
18
|
-
const checkPromiseList = [];
|
|
19
|
-
const checkListResult = [];
|
|
20
|
-
let totalCount = 0;
|
|
21
|
-
let ignoreCount = 0;
|
|
22
|
-
let errorCount = 0;
|
|
23
|
-
|
|
24
|
-
traverseMarkdownAst({
|
|
25
|
-
ast,
|
|
26
|
-
test: "code",
|
|
27
|
-
visitor(node) {
|
|
28
|
-
const linter = CODE_LANGUAGE_MAP_LINTER[node.lang];
|
|
29
|
-
if (linter) {
|
|
30
|
-
const suffix = CODE_LANGUAGE_MAP_SUFFIX[node.lang];
|
|
31
|
-
checkPromiseList.push({ linter, code: node.value, suffix });
|
|
32
|
-
totalCount += 1;
|
|
33
|
-
} else {
|
|
34
|
-
ignoreCount += 1;
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
const checkList = await pMap(
|
|
39
|
-
checkPromiseList,
|
|
40
|
-
async (item) => {
|
|
41
|
-
try {
|
|
42
|
-
const result = await pRetry(() => lintCode(item), {
|
|
43
|
-
onFailedAttempt: ({ error, attemptNumber, retriesLeft }) => {
|
|
44
|
-
debug(
|
|
45
|
-
`Attempt ${attemptNumber} failed: ${error.message}. There are ${retriesLeft} retries left.`,
|
|
46
|
-
);
|
|
47
|
-
},
|
|
48
|
-
retries: 3,
|
|
49
|
-
});
|
|
50
|
-
// lint occurs error, ignore
|
|
51
|
-
if (!result.success) {
|
|
52
|
-
debug("Lint failed", item, result);
|
|
53
|
-
return [];
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (!result.issues || result.issues.length === 0) {
|
|
57
|
-
debug("Lint result empty issues", item, result);
|
|
58
|
-
return [];
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
errorCount += 1;
|
|
62
|
-
return result.issues.map((x) => {
|
|
63
|
-
return {
|
|
64
|
-
...x,
|
|
65
|
-
level: severityMapLevel[x.severity],
|
|
66
|
-
};
|
|
67
|
-
});
|
|
68
|
-
} catch (error) {
|
|
69
|
-
debug("Lint occurred error", error);
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
},
|
|
73
|
-
{ concurrency: 5 },
|
|
74
|
-
);
|
|
75
|
-
checkListResult.push(...checkList.flat());
|
|
76
|
-
|
|
77
|
-
return {
|
|
78
|
-
codeEvaluation: {
|
|
79
|
-
details: checkListResult,
|
|
80
|
-
totalCount,
|
|
81
|
-
ignoreCount,
|
|
82
|
-
errorCount,
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
evaluateDocumentCode.description = "Traverse markdown code blocks and evaluate them.";
|
|
88
|
-
|
|
89
|
-
evaluateDocumentCode.input_schema = {
|
|
90
|
-
type: "object",
|
|
91
|
-
properties: {
|
|
92
|
-
content: {
|
|
93
|
-
type: "string",
|
|
94
|
-
description: "Source markdown content to be evaluated.",
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
};
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
name: evaluateDocumentStructure
|
|
2
|
-
description: Evaluates the results generated by the document-structure agent to ensure they meet expectations, especially in scenarios with previous generation results and user feedback.
|
|
3
|
-
instructions:
|
|
4
|
-
url: ../../prompts/evaluate/document-structure.md
|
|
5
|
-
model:
|
|
6
|
-
model: gpt-5
|
|
7
|
-
temperature: 1
|
|
8
|
-
task_render_mode: collapse
|
|
9
|
-
task_title: Evaluate the structure of the documentation
|
|
10
|
-
input_schema:
|
|
11
|
-
type: object
|
|
12
|
-
properties:
|
|
13
|
-
documentStructureYaml:
|
|
14
|
-
type: string
|
|
15
|
-
description: Documentation structure data
|
|
16
|
-
purposes:
|
|
17
|
-
type: string
|
|
18
|
-
description: User-selected document goals
|
|
19
|
-
audiences:
|
|
20
|
-
type: string
|
|
21
|
-
description: User-selected target audiences
|
|
22
|
-
coverageDepth:
|
|
23
|
-
type: string
|
|
24
|
-
description: User-selected content depth
|
|
25
|
-
required:
|
|
26
|
-
- documentStructureYaml
|
|
27
|
-
- purposes
|
|
28
|
-
- audiences
|
|
29
|
-
- coverageDepth
|
|
30
|
-
output_schema:
|
|
31
|
-
type: object
|
|
32
|
-
properties:
|
|
33
|
-
structureEvaluation:
|
|
34
|
-
type: object
|
|
35
|
-
properties:
|
|
36
|
-
details:
|
|
37
|
-
type: array
|
|
38
|
-
items:
|
|
39
|
-
type: object
|
|
40
|
-
properties:
|
|
41
|
-
dimension:
|
|
42
|
-
type: string
|
|
43
|
-
enum: [purposeCoverage, audienceCoverage, depthCoverage]
|
|
44
|
-
description: Dimension associated with this observation
|
|
45
|
-
level:
|
|
46
|
-
type: string
|
|
47
|
-
enum: [excellent, good, meets, minor, critical]
|
|
48
|
-
description: Evaluation level applied to the observation
|
|
49
|
-
topic:
|
|
50
|
-
type: string
|
|
51
|
-
description: Short identifier for the purpose/audience/depth aspect being judged
|
|
52
|
-
description:
|
|
53
|
-
type: string
|
|
54
|
-
description: Why the level was assigned
|
|
55
|
-
line:
|
|
56
|
-
type: integer
|
|
57
|
-
description: Integer line number within the source document/module (use 0 if unknown)
|
|
58
|
-
required:
|
|
59
|
-
- dimension
|
|
60
|
-
- level
|
|
61
|
-
- topic
|
|
62
|
-
- description
|
|
63
|
-
description: List of detailed evaluations for each purpose dimension
|
|
64
|
-
required:
|
|
65
|
-
- details
|
|
66
|
-
required:
|
|
67
|
-
- structureEvaluation
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
name: evaluateDocument
|
|
2
|
-
description: Evaluates the quality of generated document content, ensuring compliance with user-configured goals, audiences, and knowledge level requirements.
|
|
3
|
-
instructions:
|
|
4
|
-
url: ../../prompts/evaluate/document.md
|
|
5
|
-
model:
|
|
6
|
-
model: gpt-5
|
|
7
|
-
temperature: 1
|
|
8
|
-
task_render_mode: collapse
|
|
9
|
-
task_title: Evaluate document for '{{ title }}'
|
|
10
|
-
input_schema:
|
|
11
|
-
type: object
|
|
12
|
-
properties:
|
|
13
|
-
path:
|
|
14
|
-
type: string
|
|
15
|
-
description: Document path to be evaluated
|
|
16
|
-
content:
|
|
17
|
-
type: string
|
|
18
|
-
description: Document content to be evaluated
|
|
19
|
-
translationsString:
|
|
20
|
-
type: string
|
|
21
|
-
description: Document translation content
|
|
22
|
-
description:
|
|
23
|
-
type: string
|
|
24
|
-
description: Document content planning description
|
|
25
|
-
purposes:
|
|
26
|
-
type: string
|
|
27
|
-
description: User-selected document goals
|
|
28
|
-
audiences:
|
|
29
|
-
type: string
|
|
30
|
-
description: User-selected target audiences
|
|
31
|
-
readerKnowledgeLevel:
|
|
32
|
-
type: string
|
|
33
|
-
description: User-selected reader knowledge level
|
|
34
|
-
allDocumentContentList:
|
|
35
|
-
type: array
|
|
36
|
-
description: All document content list for better evaluate
|
|
37
|
-
required:
|
|
38
|
-
- content
|
|
39
|
-
- description
|
|
40
|
-
- purposes
|
|
41
|
-
- audiences
|
|
42
|
-
- readerKnowledgeLevel
|
|
43
|
-
output_schema:
|
|
44
|
-
type: object
|
|
45
|
-
properties:
|
|
46
|
-
documentEvaluation:
|
|
47
|
-
type: object
|
|
48
|
-
properties:
|
|
49
|
-
details:
|
|
50
|
-
type: array
|
|
51
|
-
description: Detailed observations contributing to the final score
|
|
52
|
-
items:
|
|
53
|
-
type: object
|
|
54
|
-
properties:
|
|
55
|
-
dimension:
|
|
56
|
-
type: string
|
|
57
|
-
enum: [readability, coherence, contentQuality, consistency, purposeAlignment, audienceAlignment, knowledgeLevelAlignment]
|
|
58
|
-
description: Dimension associated with this observation
|
|
59
|
-
level:
|
|
60
|
-
type: string
|
|
61
|
-
enum: [excellent, good, meets, minor, critical]
|
|
62
|
-
description: Evaluation level applied to the observation
|
|
63
|
-
topic:
|
|
64
|
-
type: string
|
|
65
|
-
description: Short identifier for the assessed passage or section
|
|
66
|
-
line:
|
|
67
|
-
type: integer
|
|
68
|
-
description: Source line number related to the observation (0 if unknown)
|
|
69
|
-
description:
|
|
70
|
-
type: string
|
|
71
|
-
description: Impact-focused explanation of the observation
|
|
72
|
-
required:
|
|
73
|
-
- dimension
|
|
74
|
-
- level
|
|
75
|
-
- topic
|
|
76
|
-
- line
|
|
77
|
-
- description
|
|
78
|
-
required:
|
|
79
|
-
- details
|
|
80
|
-
required:
|
|
81
|
-
- documentEvaluation
|
|
82
|
-
includeInputInOutput: true
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { writeFile } from "node:fs/promises";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import { pick } from "@aigne/core/utils/type-utils.js";
|
|
4
|
-
import isInCi from "is-in-ci";
|
|
5
|
-
import openTerminal from "open";
|
|
6
|
-
|
|
7
|
-
import { DOC_SMITH_DIR } from "../../utils/constants/index.mjs";
|
|
8
|
-
import {
|
|
9
|
-
copyHtmlReportTemplate,
|
|
10
|
-
createReportStructure,
|
|
11
|
-
ensureDirectoryExists,
|
|
12
|
-
generateReportSuccessMessage,
|
|
13
|
-
generateTimestampForFolder,
|
|
14
|
-
} from "../../utils/evaluate/report-utils.mjs";
|
|
15
|
-
import { toRelativePath } from "../../utils/utils.mjs";
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Generate and save evaluation report by aggregating results from both structure and document evaluation agents
|
|
19
|
-
* @param {Object} params - Parameters object containing all evaluation data
|
|
20
|
-
* @param {Object} params.purposeCoverage - Purpose coverage evaluation from evaluate/document-structure agent
|
|
21
|
-
* @param {Object} params.audienceCoverage - Audience coverage evaluation from evaluate/document-structure agent
|
|
22
|
-
* @param {Object} params.coverageDepthAlignment - Coverage depth alignment evaluation from evaluate/document-structure agent
|
|
23
|
-
* @param {Array} params.originalDocumentStructure - Array of document evaluation results from evaluate/document agent
|
|
24
|
-
* @param {Object} [params.metadata] - Additional metadata for the report
|
|
25
|
-
* @param {string} [params.basePath] - Base path for saving reports, defaults to current working directory
|
|
26
|
-
* @returns {Promise<string>} Path to the saved report file
|
|
27
|
-
*/
|
|
28
|
-
export default async function generateEvaluationReport({
|
|
29
|
-
structureEvaluation,
|
|
30
|
-
originalDocumentStructure,
|
|
31
|
-
metadata = {},
|
|
32
|
-
basePath = process.cwd(),
|
|
33
|
-
projectName,
|
|
34
|
-
projectDesc,
|
|
35
|
-
projectLogo,
|
|
36
|
-
documentPurpose,
|
|
37
|
-
targetAudienceTypes,
|
|
38
|
-
readerKnowledgeLevel,
|
|
39
|
-
documentationDepth,
|
|
40
|
-
targetAudience,
|
|
41
|
-
open = true,
|
|
42
|
-
}) {
|
|
43
|
-
const timestamp = new Date().toISOString();
|
|
44
|
-
const timestampForFolder = generateTimestampForFolder();
|
|
45
|
-
const documentEvaluations = originalDocumentStructure.map((x) =>
|
|
46
|
-
pick(x, ["title", "description", "path", "parentId", "documentEvaluation", "codeEvaluation"]),
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
// Create report structure
|
|
50
|
-
const report = createReportStructure({
|
|
51
|
-
timestamp,
|
|
52
|
-
metadata,
|
|
53
|
-
structureEvaluation,
|
|
54
|
-
documentEvaluations,
|
|
55
|
-
projectName,
|
|
56
|
-
projectDesc,
|
|
57
|
-
projectLogo,
|
|
58
|
-
documentPurpose,
|
|
59
|
-
targetAudienceTypes,
|
|
60
|
-
readerKnowledgeLevel,
|
|
61
|
-
documentationDepth,
|
|
62
|
-
targetAudience,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
const saveDir = join(basePath, DOC_SMITH_DIR, "evaluate", timestampForFolder);
|
|
66
|
-
const jsonReportPath = join(saveDir, "integrity-report.json");
|
|
67
|
-
|
|
68
|
-
await ensureDirectoryExists(saveDir);
|
|
69
|
-
await writeFile(jsonReportPath, JSON.stringify(report, null, 2), "utf8");
|
|
70
|
-
|
|
71
|
-
// Copy HTML report template
|
|
72
|
-
const htmlReportPath = await copyHtmlReportTemplate(saveDir, report);
|
|
73
|
-
|
|
74
|
-
// Generate success message
|
|
75
|
-
const message = generateReportSuccessMessage(toRelativePath(jsonReportPath), htmlReportPath);
|
|
76
|
-
if (open && !isInCi) {
|
|
77
|
-
openTerminal(htmlReportPath);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return {
|
|
81
|
-
message,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
generateEvaluationReport.taskTitle = "Generate evaluation report";
|