@aigne/doc-smith 0.9.10 → 0.9.11-beta
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/CHANGELOG.md +12 -0
- package/README.md +189 -219
- package/README.zh.md +270 -0
- package/agents/bash-executor/index.mjs +347 -0
- package/agents/clear/ai/intent.md +142 -0
- package/agents/clear/choose-contents.mjs +13 -65
- package/agents/clear/clear-auth-tokens.mjs +17 -21
- package/agents/clear/clear-deployment-config.mjs +33 -24
- package/agents/clear/index.yaml +1 -9
- package/agents/content-checker/ai/intent.md +209 -0
- package/agents/content-checker/clean-invalid-docs.mjs +254 -0
- package/agents/content-checker/index.mjs +191 -0
- package/agents/content-checker/validate-content.mjs +983 -0
- package/agents/generate-images/generate-image.yaml +75 -0
- package/agents/generate-images/generate-summary.mjs +213 -0
- package/agents/generate-images/index.yaml +39 -0
- package/agents/generate-images/prepare-generation.mjs +286 -0
- package/agents/generate-images/prepare-image-generation.mjs +130 -0
- package/{prompts/detail/diagram/generate-image-system.md → agents/generate-images/prompts/system.md} +22 -56
- package/agents/generate-images/prompts/user.md +85 -0
- package/agents/generate-images/save-image-result.mjs +247 -0
- package/agents/generate-images/scan-image-slots.mjs +247 -0
- package/agents/localize/index.yaml +19 -42
- package/{prompts/translate → agents/localize/prompts}/translate-document.md +0 -139
- package/agents/localize/translate-documents/generate-summary.mjs +163 -0
- package/agents/localize/translate-documents/load-glossary.mjs +52 -0
- package/agents/localize/translate-documents/prepare-translation.mjs +249 -0
- package/agents/localize/translate-documents/save-translation.mjs +171 -0
- package/agents/localize/translate-documents/translate-document-to-language.mjs +209 -0
- package/agents/localize/translate-documents/translate-document.yaml +23 -0
- package/agents/localize/translate-documents/translate-to-languages.yaml +10 -0
- package/agents/localize/translate-images/check-image-translation.mjs +225 -0
- package/agents/localize/translate-images/detect-text/detect-and-update-shared.mjs +148 -0
- package/agents/localize/translate-images/detect-text/detect-image-text.yaml +44 -0
- package/agents/localize/translate-images/detect-text/detect-images-text.yaml +21 -0
- package/agents/localize/translate-images/detect-text/prompts/detect-image-text-system.md +43 -0
- package/agents/localize/translate-images/detect-text/prompts/detect-image-text-user.md +14 -0
- package/agents/localize/translate-images/detect-text/save-text-detection.mjs +105 -0
- package/agents/localize/translate-images/prepare-image-input.mjs +124 -0
- package/agents/localize/translate-images/save-image-translation.mjs +172 -0
- package/agents/localize/translate-images/scan-doc-images.mjs +165 -0
- package/agents/localize/translate-images/translate-doc-images.yaml +24 -0
- package/agents/localize/{translate-diagram.yaml → translate-images/translate-image.yaml} +25 -14
- package/agents/publish/ai/intent.md +182 -0
- package/agents/publish/check.mjs +107 -0
- package/agents/publish/index.yaml +9 -14
- package/agents/publish/publish-docs.mjs +81 -61
- package/agents/publish/translate-meta.mjs +79 -58
- package/agents/save-document/index.mjs +260 -0
- package/agents/structure-checker/index.mjs +307 -0
- package/agents/structure-checker/validate-structure.mjs +477 -0
- package/agents/update-image/analyze-feedback.yaml +37 -0
- package/agents/update-image/index.yaml +78 -0
- package/agents/update-image/load-existing-image.mjs +211 -0
- package/agents/update-image/prompts/analyze-feedback-system.md +43 -0
- package/agents/update-image/prompts/analyze-feedback-user.md +15 -0
- package/aigne.yaml +26 -139
- package/package.json +16 -48
- package/scripts/README.md +90 -0
- package/scripts/install.sh +86 -0
- package/scripts/uninstall.sh +52 -0
- package/skills/doc-smith/SKILL.md +285 -0
- package/skills/doc-smith/ai/intent/sources-improve.md +290 -0
- package/skills/doc-smith/references/changeset-guide.md +171 -0
- package/skills/doc-smith/references/document-content-guide.md +214 -0
- package/skills/doc-smith/references/document-structure-schema.md +138 -0
- package/skills/doc-smith/references/patch-guide.md +96 -0
- package/skills/doc-smith/references/structure-confirmation-guide.md +133 -0
- package/skills/doc-smith/references/structure-planning-guide.md +149 -0
- package/skills/doc-smith/references/update-workflow.md +108 -0
- package/skills/doc-smith/references/user-intent-guide.md +175 -0
- package/skills/doc-smith/references/workspace-initialization.md +376 -0
- package/skills/doc-smith-docs-detail/SKILL.md +356 -0
- package/skills/doc-smith-docs-detail/ai/intent.md +271 -0
- package/skills-entry/doc-smith/ai/intent.md +260 -0
- package/skills-entry/doc-smith/index.mjs +66 -0
- package/skills-entry/doc-smith/prompt.md +57 -0
- package/skills-entry/doc-smith/utils.mjs +27 -0
- package/skills-entry/doc-smith-docs-detail/batch.yaml +56 -0
- package/skills-entry/doc-smith-docs-detail/index.mjs +95 -0
- package/skills-entry/doc-smith-docs-detail/prompt.md +64 -0
- package/utils/afs-factory.mjs +183 -0
- package/utils/agent-constants.mjs +97 -0
- package/utils/{auth-utils.mjs → auth.mjs} +6 -9
- package/{agents/utils/update-branding.mjs → utils/branding.mjs} +3 -4
- package/utils/config.mjs +261 -0
- package/utils/constants.mjs +32 -0
- package/utils/deploy.mjs +3 -3
- package/utils/docs-converter.mjs +454 -0
- package/utils/docs.mjs +212 -0
- package/utils/document-paths.mjs +172 -0
- package/utils/files.mjs +74 -0
- package/utils/git.mjs +65 -0
- package/utils/{blocklet.mjs → http.mjs} +18 -0
- package/utils/image-slots.mjs +57 -0
- package/utils/image-utils.mjs +114 -0
- package/utils/project.mjs +95 -0
- package/utils/sources-path-resolver.mjs +76 -0
- package/utils/{upload-files.mjs → upload.mjs} +3 -3
- package/utils/workspace.mjs +371 -0
- 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/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/create/aggregate-document-structure.mjs +0 -21
- package/agents/create/analyze-diagram-type-llm.yaml +0 -159
- package/agents/create/analyze-diagram-type.mjs +0 -455
- package/agents/create/check-document-structure.yaml +0 -30
- package/agents/create/check-need-generate-structure.mjs +0 -138
- 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 -91
- package/agents/create/generate-structure.yaml +0 -106
- package/agents/create/index.yaml +0 -45
- package/agents/create/refine-document-structure.yaml +0 -12
- package/agents/create/replace-d2-with-image.mjs +0 -610
- 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 -139
- package/agents/create/utils/init-current-content.mjs +0 -34
- package/agents/create/utils/merge-document-structures.mjs +0 -36
- 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 -643
- package/agents/init/validate.mjs +0 -16
- package/agents/localize/choose-language.mjs +0 -107
- package/agents/localize/record-translation-history.mjs +0 -23
- package/agents/localize/save-doc-translation-or-skip.mjs +0 -18
- package/agents/localize/set-review-content.mjs +0 -58
- package/agents/localize/translate-document-wrapper.mjs +0 -34
- package/agents/localize/translate-document.yaml +0 -24
- package/agents/localize/translate-multilingual.yaml +0 -57
- package/agents/localize/translate-or-skip-diagram.mjs +0 -52
- 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 -454
- package/agents/prefs/index.mjs +0 -203
- 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-update-is-single.mjs +0 -53
- package/agents/update/document-tools/update-document-content.mjs +0 -303
- package/agents/update/generate-diagram.yaml +0 -80
- package/agents/update/generate-document.yaml +0 -70
- package/agents/update/handle-document-update.yaml +0 -103
- package/agents/update/index.yaml +0 -69
- package/agents/update/pre-check-generate-diagram.yaml +0 -44
- package/agents/update/save-and-translate-document.mjs +0 -80
- package/agents/update/update-document-detail.yaml +0 -71
- package/agents/update/update-single/update-single-document-detail.mjs +0 -322
- 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 -253
- package/agents/utils/analyze-structure-feedback-intent.yaml +0 -29
- package/agents/utils/check-detail-result.mjs +0 -51
- package/agents/utils/check-feedback-refiner.mjs +0 -81
- package/agents/utils/choose-docs.mjs +0 -251
- 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 -96
- 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 -133
- package/agents/utils/read-current-document-content.mjs +0 -46
- package/agents/utils/save-doc-translation.mjs +0 -30
- package/agents/utils/save-doc.mjs +0 -54
- package/agents/utils/save-output.mjs +0 -26
- package/agents/utils/save-sidebar.mjs +0 -38
- 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/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-user.md +0 -81
- 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/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/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 -205
- package/utils/debug.mjs +0 -3
- package/utils/delete-diagram-images.mjs +0 -99
- package/utils/diagram-version-utils.mjs +0 -14
- package/utils/docs-finder-utils.mjs +0 -548
- 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 -154
- package/utils/kroki-utils.mjs +0 -173
- package/utils/linter/index.mjs +0 -50
- package/utils/load-config.mjs +0 -78
- 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/sync-diagram-to-translations.mjs +0 -272
- package/utils/translate-diagram-images.mjs +0 -807
- package/utils/utils.mjs +0 -1354
- /package/{prompts/translate → agents/localize/prompts}/glossary.md +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { readdir, readFile, rm, stat } from "node:fs/promises";
|
|
2
|
+
import { parse as yamlParse } from "yaml";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { loadDocumentPaths } from "../../utils/document-paths.mjs";
|
|
5
|
+
import { PATHS } from "../../utils/agent-constants.mjs";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Invalid Document Cleaner
|
|
9
|
+
* Delete document files and folders that should not exist before content checking
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Recursively scan docs directory, collect all document folder paths
|
|
14
|
+
* @param {string} docsDir - Document root directory
|
|
15
|
+
* @param {string} relativePath - Current relative path
|
|
16
|
+
* @returns {Promise<string[]>} - Document path array (without slash prefix)
|
|
17
|
+
*/
|
|
18
|
+
async function scanDocsFolders(docsDir, relativePath = "") {
|
|
19
|
+
const folders = [];
|
|
20
|
+
const currentDir = path.join(docsDir, relativePath);
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
const entries = await readdir(currentDir, { withFileTypes: true });
|
|
24
|
+
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
if (!entry.isDirectory()) continue;
|
|
27
|
+
if (entry.name.startsWith(".")) continue; // Skip hidden folders
|
|
28
|
+
|
|
29
|
+
const folderRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
30
|
+
const folderFullPath = path.join(currentDir, entry.name);
|
|
31
|
+
|
|
32
|
+
// Check if it's a document folder (contains .meta.yaml)
|
|
33
|
+
const metaPath = path.join(folderFullPath, ".meta.yaml");
|
|
34
|
+
try {
|
|
35
|
+
await stat(metaPath);
|
|
36
|
+
// .meta.yaml exists, it's a document folder
|
|
37
|
+
folders.push(folderRelativePath);
|
|
38
|
+
} catch (_error) {
|
|
39
|
+
// .meta.yaml doesn't exist, may be an intermediate directory, continue recursion
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Recursively scan subdirectories
|
|
43
|
+
const subFolders = await scanDocsFolders(docsDir, folderRelativePath);
|
|
44
|
+
folders.push(...subFolders);
|
|
45
|
+
}
|
|
46
|
+
} catch (_error) {
|
|
47
|
+
// Directory doesn't exist or cannot be read, return empty array
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return folders;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get valid language list defined in .meta.yaml
|
|
55
|
+
* @param {string} metaPath - .meta.yaml file path
|
|
56
|
+
* @returns {Promise<Set<string>|null>} - Valid language set, returns null if parsing fails
|
|
57
|
+
*/
|
|
58
|
+
async function getValidLanguages(metaPath) {
|
|
59
|
+
try {
|
|
60
|
+
const content = await readFile(metaPath, "utf8");
|
|
61
|
+
const meta = yamlParse(content);
|
|
62
|
+
|
|
63
|
+
const languages = new Set();
|
|
64
|
+
|
|
65
|
+
// Get languages from source and default fields
|
|
66
|
+
if (meta.source) languages.add(meta.source);
|
|
67
|
+
if (meta.default) languages.add(meta.default);
|
|
68
|
+
|
|
69
|
+
// If there's a languages field, add those too
|
|
70
|
+
if (meta.languages && Array.isArray(meta.languages)) {
|
|
71
|
+
for (const lang of meta.languages) {
|
|
72
|
+
languages.add(lang);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return languages.size > 0 ? languages : null;
|
|
77
|
+
} catch (_error) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Extract language code from filename
|
|
84
|
+
* @param {string} filename - Filename
|
|
85
|
+
* @returns {string|null} - Language code (filename without .md suffix), e.g., "zh", "en", "claude-code"
|
|
86
|
+
*/
|
|
87
|
+
function extractLanguageFromFilename(filename) {
|
|
88
|
+
if (!filename.endsWith(".md")) return null;
|
|
89
|
+
// Return filename without .md suffix as language identifier
|
|
90
|
+
return filename.slice(0, -3);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Clean invalid documents
|
|
95
|
+
* @param {Object} options - Clean options
|
|
96
|
+
* @param {string} options.yamlPath - Document structure file path
|
|
97
|
+
* @param {string} options.docsDir - Document directory path
|
|
98
|
+
* @param {boolean} options.dryRun - Whether in preview mode (only report, don't delete)
|
|
99
|
+
* @returns {Promise<Object>} - Clean result
|
|
100
|
+
*/
|
|
101
|
+
export async function cleanInvalidDocs({
|
|
102
|
+
yamlPath = PATHS.DOCUMENT_STRUCTURE,
|
|
103
|
+
docsDir = PATHS.DOCS_DIR,
|
|
104
|
+
dryRun = false,
|
|
105
|
+
} = {}) {
|
|
106
|
+
const result = {
|
|
107
|
+
dryRun,
|
|
108
|
+
deletedFolders: [],
|
|
109
|
+
deletedFiles: [],
|
|
110
|
+
errors: [],
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
try {
|
|
114
|
+
// 1. Load valid paths from document structure
|
|
115
|
+
let validPaths;
|
|
116
|
+
try {
|
|
117
|
+
validPaths = await loadDocumentPaths({ yamlPath, includeBothFormats: false });
|
|
118
|
+
} catch (_error) {
|
|
119
|
+
// Document structure file doesn't exist, cannot clean
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// 2. Scan docs directory for actually existing document folders
|
|
124
|
+
const existingFolders = await scanDocsFolders(docsDir);
|
|
125
|
+
|
|
126
|
+
// 3. Find invalid document folders (exist in filesystem but not in document-structure.yaml)
|
|
127
|
+
const invalidFolders = existingFolders.filter((folder) => !validPaths.has(folder));
|
|
128
|
+
|
|
129
|
+
// 4. Delete invalid document folders (or only record in dry-run mode)
|
|
130
|
+
for (const folder of invalidFolders) {
|
|
131
|
+
const folderPath = path.join(docsDir, folder);
|
|
132
|
+
if (dryRun) {
|
|
133
|
+
// dry-run mode: only record, don't delete
|
|
134
|
+
result.deletedFolders.push(folder);
|
|
135
|
+
} else {
|
|
136
|
+
try {
|
|
137
|
+
await rm(folderPath, { recursive: true });
|
|
138
|
+
result.deletedFolders.push(folder);
|
|
139
|
+
} catch (error) {
|
|
140
|
+
result.errors.push({
|
|
141
|
+
type: "DELETE_FOLDER_ERROR",
|
|
142
|
+
path: folder,
|
|
143
|
+
message: error.message,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// 5. For valid document folders, clean invalid language files
|
|
150
|
+
const validFolders = existingFolders.filter((folder) => validPaths.has(folder));
|
|
151
|
+
|
|
152
|
+
for (const folder of validFolders) {
|
|
153
|
+
const folderPath = path.join(docsDir, folder);
|
|
154
|
+
const metaPath = path.join(folderPath, ".meta.yaml");
|
|
155
|
+
|
|
156
|
+
// Get valid language list
|
|
157
|
+
const validLanguages = await getValidLanguages(metaPath);
|
|
158
|
+
if (!validLanguages) continue; // Cannot parse meta, skip
|
|
159
|
+
|
|
160
|
+
// Scan all .md files in folder
|
|
161
|
+
try {
|
|
162
|
+
const files = await readdir(folderPath);
|
|
163
|
+
|
|
164
|
+
for (const file of files) {
|
|
165
|
+
// Skip non-.md files and hidden files
|
|
166
|
+
if (!file.endsWith(".md") || file.startsWith(".")) continue;
|
|
167
|
+
|
|
168
|
+
const lang = extractLanguageFromFilename(file);
|
|
169
|
+
if (!lang) continue; // Not a language file format, skip
|
|
170
|
+
|
|
171
|
+
// Check if language is in valid list
|
|
172
|
+
if (!validLanguages.has(lang)) {
|
|
173
|
+
const filePath = path.join(folderPath, file);
|
|
174
|
+
if (dryRun) {
|
|
175
|
+
// dry-run mode: only record, don't delete
|
|
176
|
+
result.deletedFiles.push(`${folder}/${file}`);
|
|
177
|
+
} else {
|
|
178
|
+
try {
|
|
179
|
+
await rm(filePath);
|
|
180
|
+
result.deletedFiles.push(`${folder}/${file}`);
|
|
181
|
+
} catch (error) {
|
|
182
|
+
result.errors.push({
|
|
183
|
+
type: "DELETE_FILE_ERROR",
|
|
184
|
+
path: `${folder}/${file}`,
|
|
185
|
+
message: error.message,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
} catch (error) {
|
|
192
|
+
result.errors.push({
|
|
193
|
+
type: "READ_FOLDER_ERROR",
|
|
194
|
+
path: folder,
|
|
195
|
+
message: error.message,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
} catch (error) {
|
|
200
|
+
result.errors.push({
|
|
201
|
+
type: "CLEAN_ERROR",
|
|
202
|
+
message: error.message,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Format clean result as string
|
|
211
|
+
* @param {Object} result - Clean result
|
|
212
|
+
* @returns {string} - Formatted output
|
|
213
|
+
*/
|
|
214
|
+
export function formatCleanResult(result) {
|
|
215
|
+
const { dryRun, deletedFolders, deletedFiles, errors } = result;
|
|
216
|
+
|
|
217
|
+
if (deletedFolders.length === 0 && deletedFiles.length === 0 && errors.length === 0) {
|
|
218
|
+
return "";
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
let output = "";
|
|
222
|
+
const actionVerb = dryRun ? "Will delete" : "Deleted";
|
|
223
|
+
const modeIndicator = dryRun ? " [Preview Mode]" : "";
|
|
224
|
+
|
|
225
|
+
if (deletedFolders.length > 0 || deletedFiles.length > 0) {
|
|
226
|
+
output += `Layer 0: Invalid document cleanup${modeIndicator}\n`;
|
|
227
|
+
|
|
228
|
+
if (deletedFolders.length > 0) {
|
|
229
|
+
output += ` ${actionVerb} invalid document folders: ${deletedFolders.length}\n`;
|
|
230
|
+
for (const folder of deletedFolders) {
|
|
231
|
+
output += ` - ${folder}/\n`;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (deletedFiles.length > 0) {
|
|
236
|
+
output += ` ${actionVerb} invalid language files: ${deletedFiles.length}\n`;
|
|
237
|
+
for (const file of deletedFiles) {
|
|
238
|
+
output += ` - ${file}\n`;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
output += "\n";
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (errors.length > 0) {
|
|
246
|
+
output += "Cleanup errors:\n";
|
|
247
|
+
for (const error of errors) {
|
|
248
|
+
output += ` - ${error.path || ""}: ${error.message}\n`;
|
|
249
|
+
}
|
|
250
|
+
output += "\n";
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return output;
|
|
254
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import validateDocumentContent from "./validate-content.mjs";
|
|
4
|
+
import { cleanInvalidDocs, formatCleanResult } from "./clean-invalid-docs.mjs";
|
|
5
|
+
import { PATHS } from "../../utils/agent-constants.mjs";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Document Content Fixer Class
|
|
9
|
+
*
|
|
10
|
+
* Note: Current version is mainly for future extension, specific auto-fix functionality is not yet implemented
|
|
11
|
+
* Document content fixes usually require manual judgment due to semantic issues like link targets and image content
|
|
12
|
+
*/
|
|
13
|
+
class DocumentContentFixer {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.fixCount = 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Apply all fixes
|
|
20
|
+
*/
|
|
21
|
+
async applyFixes(errors, docsDir) {
|
|
22
|
+
for (const error of errors) {
|
|
23
|
+
await this.applyFix(error, docsDir);
|
|
24
|
+
}
|
|
25
|
+
return this.fixCount;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Apply single fix
|
|
30
|
+
*/
|
|
31
|
+
async applyFix(_error, _docsDir) {
|
|
32
|
+
// Current version does not implement auto-fix
|
|
33
|
+
// Future additions may include:
|
|
34
|
+
// - Link format correction (adding .md suffix, etc.)
|
|
35
|
+
// - Image path level correction
|
|
36
|
+
// - Markdown format optimization
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Main function - Intelligent Content Checker
|
|
43
|
+
* @param {Object} params - Check parameters
|
|
44
|
+
* @param {string[]} params.docs - Array of document paths to check, e.g., ["/overview", "/api/introduction"], checks all documents if not provided
|
|
45
|
+
* @returns {Promise<Object>} - Check and fix result
|
|
46
|
+
*/
|
|
47
|
+
export default async function checkContent({ docs = undefined } = {}) {
|
|
48
|
+
const yamlPath = PATHS.DOCUMENT_STRUCTURE;
|
|
49
|
+
const docsDir = PATHS.DOCS_DIR;
|
|
50
|
+
const autoFix = true;
|
|
51
|
+
const checkRemoteImages = true;
|
|
52
|
+
try {
|
|
53
|
+
// 1. Check if file exists
|
|
54
|
+
try {
|
|
55
|
+
await access(yamlPath, constants.F_OK);
|
|
56
|
+
} catch (_error) {
|
|
57
|
+
return {
|
|
58
|
+
success: false,
|
|
59
|
+
valid: false,
|
|
60
|
+
fileNotFound: true,
|
|
61
|
+
message:
|
|
62
|
+
`❌ File not found: ${yamlPath}\n\n` +
|
|
63
|
+
`Possible reasons:\n` +
|
|
64
|
+
`1. Incorrect file path - please check if you are in the correct workspace directory\n` +
|
|
65
|
+
`2. Incorrect file name - confirm the file name is ${yamlPath}\n` +
|
|
66
|
+
`3. Document structure not yet generated - please execute step 4 to generate ${yamlPath}\n`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Check if document directory exists
|
|
71
|
+
try {
|
|
72
|
+
await access(docsDir, constants.F_OK);
|
|
73
|
+
} catch (_error) {
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
valid: false,
|
|
77
|
+
message:
|
|
78
|
+
`❌ Document directory not found: ${docsDir}/\n\n` +
|
|
79
|
+
`Possible reasons:\n` +
|
|
80
|
+
`1. Documents not yet generated - please execute step 6.1 to generate document content\n` +
|
|
81
|
+
`2. Incorrect directory path - confirm document directory is ${docsDir}/\n`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// 2. Layer 0: Clean invalid documents
|
|
86
|
+
const cleanResult = await cleanInvalidDocs({ yamlPath, docsDir });
|
|
87
|
+
const cleanMessage = formatCleanResult(cleanResult);
|
|
88
|
+
const cleaned = {
|
|
89
|
+
folders: cleanResult.deletedFolders.length,
|
|
90
|
+
files: cleanResult.deletedFiles.length,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// 3. Call validation
|
|
94
|
+
const validationResult = await validateDocumentContent({
|
|
95
|
+
yamlPath,
|
|
96
|
+
docsDir,
|
|
97
|
+
docs,
|
|
98
|
+
checkRemoteImages,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// 4. If validation passes, return directly
|
|
102
|
+
if (validationResult.valid) {
|
|
103
|
+
return {
|
|
104
|
+
success: true,
|
|
105
|
+
valid: true,
|
|
106
|
+
cleaned,
|
|
107
|
+
message: cleanMessage + validationResult.message,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// 5. If there are FIXABLE errors and autoFix=true, attempt auto-fix
|
|
112
|
+
if (autoFix && validationResult.errors?.fixable?.length > 0) {
|
|
113
|
+
const fixer = new DocumentContentFixer();
|
|
114
|
+
const fixedCount = await fixer.applyFixes(validationResult.errors.fixable, docsDir);
|
|
115
|
+
|
|
116
|
+
if (fixedCount > 0) {
|
|
117
|
+
// Re-validate
|
|
118
|
+
const revalidation = await validateDocumentContent({
|
|
119
|
+
yamlPath,
|
|
120
|
+
docsDir,
|
|
121
|
+
docs,
|
|
122
|
+
checkRemoteImages,
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// Return fix result
|
|
126
|
+
if (revalidation.valid) {
|
|
127
|
+
return {
|
|
128
|
+
success: true,
|
|
129
|
+
valid: true,
|
|
130
|
+
fixed: true,
|
|
131
|
+
fixedCount,
|
|
132
|
+
cleaned,
|
|
133
|
+
message:
|
|
134
|
+
cleanMessage +
|
|
135
|
+
`✅ Successfully fixed ${fixedCount} errors.\n\n` +
|
|
136
|
+
`⚠️ Important: Files have been updated, please use the Read tool to re-read related documents for the latest content.\n\n` +
|
|
137
|
+
revalidation.message,
|
|
138
|
+
};
|
|
139
|
+
} else {
|
|
140
|
+
// Partial fix
|
|
141
|
+
return {
|
|
142
|
+
success: false,
|
|
143
|
+
valid: false,
|
|
144
|
+
fixed: true,
|
|
145
|
+
fixedCount,
|
|
146
|
+
cleaned,
|
|
147
|
+
message:
|
|
148
|
+
cleanMessage +
|
|
149
|
+
`⚠️ Fixed ${fixedCount} errors, but the following issues still require manual handling:\n\n` +
|
|
150
|
+
`Important: Files have been updated, please use the Read tool to re-read related documents to view current state.\n\n` +
|
|
151
|
+
`Issues to fix:\n\n` +
|
|
152
|
+
revalidation.message,
|
|
153
|
+
remainingErrors: revalidation.errors,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// 6. Cannot auto-fix or auto-fix not enabled, return error message
|
|
160
|
+
return {
|
|
161
|
+
success: false,
|
|
162
|
+
valid: false,
|
|
163
|
+
cleaned,
|
|
164
|
+
message: cleanMessage + validationResult.message,
|
|
165
|
+
errors: validationResult.errors,
|
|
166
|
+
};
|
|
167
|
+
} catch (error) {
|
|
168
|
+
return {
|
|
169
|
+
success: false,
|
|
170
|
+
valid: false,
|
|
171
|
+
message: `❌ Check failed: ${error.message}`,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
checkContent.description =
|
|
177
|
+
"Clean invalid documents and validate generated document content. Removes document folders not in document-structure.yaml and language files not in .meta.yaml. Then checks file existence, internal links, local and remote images.";
|
|
178
|
+
|
|
179
|
+
checkContent.input_schema = {
|
|
180
|
+
type: "object",
|
|
181
|
+
properties: {
|
|
182
|
+
docs: {
|
|
183
|
+
type: "array",
|
|
184
|
+
items: {
|
|
185
|
+
type: "string",
|
|
186
|
+
},
|
|
187
|
+
description:
|
|
188
|
+
"Array of document paths to check, e.g., ['/overview', '/api/introduction'], checks all documents if not provided",
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
};
|