@aigne/doc-smith 0.8.12-beta.8 → 0.8.12-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/agents/publish/index.yaml +4 -0
- package/agents/publish/publish-docs.mjs +77 -5
- package/agents/publish/translate-meta.mjs +103 -0
- package/agents/update/generate-document.yaml +30 -28
- package/agents/update/update-document-detail.yaml +3 -1
- package/agents/utils/update-branding.mjs +69 -0
- package/package.json +16 -2
- package/prompts/common/document/role-and-personality.md +3 -1
- package/prompts/detail/d2-diagram/guide.md +7 -1
- package/prompts/detail/d2-diagram/user-prompt.md +3 -0
- package/prompts/detail/generate/system-prompt.md +6 -7
- package/prompts/detail/generate/user-prompt.md +12 -3
- package/prompts/detail/update/user-prompt.md +0 -2
- package/prompts/structure/update/user-prompt.md +0 -4
- package/utils/file-utils.mjs +69 -24
- package/utils/markdown-checker.mjs +0 -20
- package/utils/request.mjs +7 -0
- package/utils/upload-files.mjs +231 -0
- package/utils/utils.mjs +11 -1
- package/.aigne/doc-smith/config.yaml +0 -77
- package/.aigne/doc-smith/history.yaml +0 -37
- package/.aigne/doc-smith/media-description.yaml +0 -91
- package/.aigne/doc-smith/output/structure-plan.json +0 -162
- package/.aigne/doc-smith/preferences.yml +0 -97
- package/.aigne/doc-smith/upload-cache.yaml +0 -1830
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
- package/.github/workflows/ci.yml +0 -54
- package/.github/workflows/create-release-pr.yaml +0 -21
- package/.github/workflows/publish-docs.yml +0 -65
- package/.github/workflows/release.yml +0 -49
- package/.github/workflows/reviewer.yml +0 -54
- package/.release-please-manifest.json +0 -3
- package/RELEASE.md +0 -9
- package/assets/screenshots/doc-complete-setup.png +0 -0
- package/assets/screenshots/doc-generate-docs.png +0 -0
- package/assets/screenshots/doc-generate.png +0 -0
- package/assets/screenshots/doc-generated-successfully.png +0 -0
- package/assets/screenshots/doc-publish.png +0 -0
- package/assets/screenshots/doc-regenerate.png +0 -0
- package/assets/screenshots/doc-translate-langs.png +0 -0
- package/assets/screenshots/doc-translate.png +0 -0
- package/assets/screenshots/doc-update.png +0 -0
- package/biome.json +0 -73
- package/codecov.yml +0 -15
- package/docs/_sidebar.md +0 -15
- package/docs/configuration-initial-setup.ja.md +0 -179
- package/docs/configuration-initial-setup.md +0 -198
- package/docs/configuration-initial-setup.zh-TW.md +0 -179
- package/docs/configuration-initial-setup.zh.md +0 -179
- package/docs/configuration-managing-preferences.ja.md +0 -100
- package/docs/configuration-managing-preferences.md +0 -100
- package/docs/configuration-managing-preferences.zh-TW.md +0 -100
- package/docs/configuration-managing-preferences.zh.md +0 -100
- package/docs/configuration.ja.md +0 -69
- package/docs/configuration.md +0 -69
- package/docs/configuration.zh-TW.md +0 -69
- package/docs/configuration.zh.md +0 -69
- package/docs/getting-started.ja.md +0 -107
- package/docs/getting-started.md +0 -107
- package/docs/getting-started.zh-TW.md +0 -107
- package/docs/getting-started.zh.md +0 -107
- package/docs/guides-cleaning-up.ja.md +0 -51
- package/docs/guides-cleaning-up.md +0 -52
- package/docs/guides-cleaning-up.zh-TW.md +0 -51
- package/docs/guides-cleaning-up.zh.md +0 -51
- package/docs/guides-evaluating-documents.ja.md +0 -66
- package/docs/guides-evaluating-documents.md +0 -107
- package/docs/guides-evaluating-documents.zh-TW.md +0 -66
- package/docs/guides-evaluating-documents.zh.md +0 -66
- package/docs/guides-generating-documentation.ja.md +0 -151
- package/docs/guides-generating-documentation.md +0 -89
- package/docs/guides-generating-documentation.zh-TW.md +0 -151
- package/docs/guides-generating-documentation.zh.md +0 -151
- package/docs/guides-interactive-chat.ja.md +0 -85
- package/docs/guides-interactive-chat.md +0 -93
- package/docs/guides-interactive-chat.zh-TW.md +0 -85
- package/docs/guides-interactive-chat.zh.md +0 -85
- package/docs/guides-managing-history.ja.md +0 -48
- package/docs/guides-managing-history.md +0 -53
- package/docs/guides-managing-history.zh-TW.md +0 -48
- package/docs/guides-managing-history.zh.md +0 -48
- package/docs/guides-publishing-your-docs.ja.md +0 -78
- package/docs/guides-publishing-your-docs.md +0 -83
- package/docs/guides-publishing-your-docs.zh-TW.md +0 -78
- package/docs/guides-publishing-your-docs.zh.md +0 -78
- package/docs/guides-translating-documentation.ja.md +0 -95
- package/docs/guides-translating-documentation.md +0 -100
- package/docs/guides-translating-documentation.zh-TW.md +0 -95
- package/docs/guides-translating-documentation.zh.md +0 -95
- package/docs/guides-updating-documentation.ja.md +0 -77
- package/docs/guides-updating-documentation.md +0 -79
- package/docs/guides-updating-documentation.zh-TW.md +0 -77
- package/docs/guides-updating-documentation.zh.md +0 -77
- package/docs/guides.ja.md +0 -32
- package/docs/guides.md +0 -32
- package/docs/guides.zh-TW.md +0 -32
- package/docs/guides.zh.md +0 -32
- package/docs/overview.ja.md +0 -61
- package/docs/overview.md +0 -61
- package/docs/overview.zh-TW.md +0 -61
- package/docs/overview.zh.md +0 -61
- package/docs/release-notes.ja.md +0 -255
- package/docs/release-notes.md +0 -288
- package/docs/release-notes.zh-TW.md +0 -255
- package/docs/release-notes.zh.md +0 -255
- package/prompts/common/afs/afs-tools-usage.md +0 -5
- package/prompts/common/afs/use-afs-instruction.md +0 -1
- package/release-please-config.json +0 -14
- package/tests/agents/chat/chat.test.mjs +0 -46
- package/tests/agents/clear/choose-contents.test.mjs +0 -284
- package/tests/agents/clear/clear-auth-tokens.test.mjs +0 -268
- package/tests/agents/clear/clear-document-config.test.mjs +0 -167
- package/tests/agents/clear/clear-document-structure.test.mjs +0 -380
- package/tests/agents/clear/clear-generated-docs.test.mjs +0 -222
- package/tests/agents/evaluate/code-snippet.test.mjs +0 -163
- package/tests/agents/evaluate/fixtures/api-services.md +0 -87
- package/tests/agents/evaluate/fixtures/js-sdk.md +0 -94
- package/tests/agents/evaluate/generate-report.test.mjs +0 -312
- package/tests/agents/generate/check-document-structure.test.mjs +0 -45
- package/tests/agents/generate/check-need-generate-structure.test.mjs +0 -279
- package/tests/agents/generate/document-structure-tools/add-document.test.mjs +0 -449
- package/tests/agents/generate/document-structure-tools/delete-document.test.mjs +0 -410
- package/tests/agents/generate/document-structure-tools/generate-sub-structure.test.mjs +0 -277
- package/tests/agents/generate/document-structure-tools/move-document.test.mjs +0 -476
- package/tests/agents/generate/document-structure-tools/update-document.test.mjs +0 -548
- package/tests/agents/generate/generate-structure.test.mjs +0 -45
- package/tests/agents/generate/user-review-document-structure.test.mjs +0 -319
- package/tests/agents/history/view.test.mjs +0 -97
- package/tests/agents/init/init.test.mjs +0 -1657
- package/tests/agents/prefs/prefs.test.mjs +0 -431
- package/tests/agents/publish/publish-docs.test.mjs +0 -787
- package/tests/agents/translate/choose-language.test.mjs +0 -311
- package/tests/agents/translate/translate-document.test.mjs +0 -51
- package/tests/agents/update/check-document.test.mjs +0 -463
- package/tests/agents/update/check-update-is-single.test.mjs +0 -300
- package/tests/agents/update/document-tools/update-document-content.test.mjs +0 -329
- package/tests/agents/update/generate-document.test.mjs +0 -51
- package/tests/agents/update/save-and-translate-document.test.mjs +0 -369
- package/tests/agents/update/user-review-document.test.mjs +0 -582
- package/tests/agents/utils/action-success.test.mjs +0 -54
- package/tests/agents/utils/check-detail-result.test.mjs +0 -743
- package/tests/agents/utils/check-feedback-refiner.test.mjs +0 -478
- package/tests/agents/utils/choose-docs.test.mjs +0 -406
- package/tests/agents/utils/exit.test.mjs +0 -70
- package/tests/agents/utils/feedback-refiner.test.mjs +0 -51
- package/tests/agents/utils/find-item-by-path.test.mjs +0 -517
- package/tests/agents/utils/find-user-preferences-by-path.test.mjs +0 -382
- package/tests/agents/utils/format-document-structure.test.mjs +0 -364
- package/tests/agents/utils/fs.test.mjs +0 -267
- package/tests/agents/utils/load-sources.test.mjs +0 -1470
- package/tests/agents/utils/save-docs.test.mjs +0 -109
- package/tests/agents/utils/save-output.test.mjs +0 -315
- package/tests/agents/utils/save-single-doc.test.mjs +0 -364
- package/tests/agents/utils/transform-detail-datasources.test.mjs +0 -320
- package/tests/utils/auth-utils.test.mjs +0 -596
- package/tests/utils/blocklet.test.mjs +0 -336
- package/tests/utils/conflict-detector.test.mjs +0 -355
- package/tests/utils/constants.test.mjs +0 -295
- package/tests/utils/d2-utils.test.mjs +0 -437
- package/tests/utils/deploy.test.mjs +0 -399
- package/tests/utils/docs-finder-utils.test.mjs +0 -650
- package/tests/utils/file-utils.test.mjs +0 -521
- package/tests/utils/history-utils.test.mjs +0 -206
- package/tests/utils/kroki-utils.test.mjs +0 -646
- package/tests/utils/linter/fixtures/css/keyword-error.css +0 -1
- package/tests/utils/linter/fixtures/css/missing-semicolon.css +0 -1
- package/tests/utils/linter/fixtures/css/syntax-error.css +0 -1
- package/tests/utils/linter/fixtures/css/undeclare-variable.css +0 -1
- package/tests/utils/linter/fixtures/css/unused-variable.css +0 -2
- package/tests/utils/linter/fixtures/css/valid-code.css +0 -1
- package/tests/utils/linter/fixtures/dockerfile/keyword-error.dockerfile +0 -1
- package/tests/utils/linter/fixtures/dockerfile/missing-semicolon.dockerfile +0 -2
- package/tests/utils/linter/fixtures/dockerfile/syntax-error.dockerfile +0 -2
- package/tests/utils/linter/fixtures/dockerfile/undeclare-variable.dockerfile +0 -1
- package/tests/utils/linter/fixtures/dockerfile/unused-variable.dockerfile +0 -1
- package/tests/utils/linter/fixtures/dockerfile/valid-code.dockerfile +0 -2
- package/tests/utils/linter/fixtures/go/keyword-error.go +0 -5
- package/tests/utils/linter/fixtures/go/missing-semicolon.go +0 -5
- package/tests/utils/linter/fixtures/go/syntax-error.go +0 -6
- package/tests/utils/linter/fixtures/go/undeclare-variable.go +0 -5
- package/tests/utils/linter/fixtures/go/unused-variable.go +0 -5
- package/tests/utils/linter/fixtures/go/valid-code.go +0 -7
- package/tests/utils/linter/fixtures/js/keyword-error.js +0 -3
- package/tests/utils/linter/fixtures/js/missing-semicolon.js +0 -6
- package/tests/utils/linter/fixtures/js/syntax-error.js +0 -4
- package/tests/utils/linter/fixtures/js/undeclare-variable.js +0 -3
- package/tests/utils/linter/fixtures/js/unused-variable.js +0 -7
- package/tests/utils/linter/fixtures/js/valid-code.js +0 -15
- package/tests/utils/linter/fixtures/json/keyword-error.json +0 -1
- package/tests/utils/linter/fixtures/json/missing-semicolon.json +0 -1
- package/tests/utils/linter/fixtures/json/syntax-error.json +0 -1
- package/tests/utils/linter/fixtures/json/undeclare-variable.json +0 -1
- package/tests/utils/linter/fixtures/json/unused-variable.json +0 -1
- package/tests/utils/linter/fixtures/json/valid-code.json +0 -1
- package/tests/utils/linter/fixtures/jsx/keyword-error.jsx +0 -5
- package/tests/utils/linter/fixtures/jsx/missing-semicolon.jsx +0 -5
- package/tests/utils/linter/fixtures/jsx/syntax-error.jsx +0 -5
- package/tests/utils/linter/fixtures/jsx/undeclare-variable.jsx +0 -5
- package/tests/utils/linter/fixtures/jsx/unused-variable.jsx +0 -4
- package/tests/utils/linter/fixtures/jsx/valid-code.jsx +0 -5
- package/tests/utils/linter/fixtures/python/keyword-error.py +0 -3
- package/tests/utils/linter/fixtures/python/missing-semicolon.py +0 -2
- package/tests/utils/linter/fixtures/python/syntax-error.py +0 -3
- package/tests/utils/linter/fixtures/python/undeclare-variable.py +0 -3
- package/tests/utils/linter/fixtures/python/unused-variable.py +0 -6
- package/tests/utils/linter/fixtures/python/valid-code.py +0 -12
- package/tests/utils/linter/fixtures/ruby/keyword-error.rb +0 -2
- package/tests/utils/linter/fixtures/ruby/missing-semicolon.rb +0 -1
- package/tests/utils/linter/fixtures/ruby/syntax-error.rb +0 -2
- package/tests/utils/linter/fixtures/ruby/undeclare-variable.rb +0 -1
- package/tests/utils/linter/fixtures/ruby/unused-variable.rb +0 -2
- package/tests/utils/linter/fixtures/ruby/valid-code.rb +0 -1
- package/tests/utils/linter/fixtures/sass/keyword-error.sass +0 -2
- package/tests/utils/linter/fixtures/sass/missing-semicolon.sass +0 -3
- package/tests/utils/linter/fixtures/sass/syntax-error.sass +0 -3
- package/tests/utils/linter/fixtures/sass/undeclare-variable.sass +0 -2
- package/tests/utils/linter/fixtures/sass/unused-variable.sass +0 -4
- package/tests/utils/linter/fixtures/sass/valid-code.sass +0 -2
- package/tests/utils/linter/fixtures/scss/keyword-error.scss +0 -1
- package/tests/utils/linter/fixtures/scss/missing-semicolon.scss +0 -1
- package/tests/utils/linter/fixtures/scss/syntax-error.scss +0 -1
- package/tests/utils/linter/fixtures/scss/undeclare-variable.scss +0 -1
- package/tests/utils/linter/fixtures/scss/unused-variable.scss +0 -2
- package/tests/utils/linter/fixtures/scss/valid-code.scss +0 -1
- package/tests/utils/linter/fixtures/shell/keyword-error.sh +0 -5
- package/tests/utils/linter/fixtures/shell/missing-semicolon.sh +0 -3
- package/tests/utils/linter/fixtures/shell/syntax-error.sh +0 -4
- package/tests/utils/linter/fixtures/shell/undeclare-variable.sh +0 -3
- package/tests/utils/linter/fixtures/shell/unused-variable.sh +0 -4
- package/tests/utils/linter/fixtures/shell/valid-code.sh +0 -3
- package/tests/utils/linter/fixtures/ts/keyword-error.ts +0 -1
- package/tests/utils/linter/fixtures/ts/missing-semicolon.ts +0 -1
- package/tests/utils/linter/fixtures/ts/syntax-error.ts +0 -1
- package/tests/utils/linter/fixtures/ts/undeclare-variable.ts +0 -1
- package/tests/utils/linter/fixtures/ts/unused-variable.ts +0 -3
- package/tests/utils/linter/fixtures/ts/valid-code.ts +0 -3
- package/tests/utils/linter/fixtures/tsx/keyword-error.tsx +0 -5
- package/tests/utils/linter/fixtures/tsx/missing-semicolon.tsx +0 -5
- package/tests/utils/linter/fixtures/tsx/syntax-error.tsx +0 -5
- package/tests/utils/linter/fixtures/tsx/undeclare-variable.tsx +0 -6
- package/tests/utils/linter/fixtures/tsx/unused-variable.tsx +0 -6
- package/tests/utils/linter/fixtures/tsx/valid-code.tsx +0 -5
- package/tests/utils/linter/fixtures/vue/keyword-error.vue +0 -6
- package/tests/utils/linter/fixtures/vue/missing-semicolon.vue +0 -6
- package/tests/utils/linter/fixtures/vue/syntax-error.vue +0 -6
- package/tests/utils/linter/fixtures/vue/undeclare-variable.vue +0 -6
- package/tests/utils/linter/fixtures/vue/unused-variable.vue +0 -7
- package/tests/utils/linter/fixtures/vue/valid-code.vue +0 -6
- package/tests/utils/linter/fixtures/yaml/keyword-error.yml +0 -1
- package/tests/utils/linter/fixtures/yaml/missing-semicolon.yml +0 -2
- package/tests/utils/linter/fixtures/yaml/syntax-error.yml +0 -1
- package/tests/utils/linter/fixtures/yaml/undeclare-variable.yml +0 -1
- package/tests/utils/linter/fixtures/yaml/unused-variable.yml +0 -2
- package/tests/utils/linter/fixtures/yaml/valid-code.yml +0 -3
- package/tests/utils/linter/index.test.mjs +0 -440
- package/tests/utils/linter/scan-results.mjs +0 -42
- package/tests/utils/load-config.test.mjs +0 -141
- package/tests/utils/markdown/index.test.mjs +0 -478
- package/tests/utils/mermaid-validator.test.mjs +0 -541
- package/tests/utils/mock-chat-model.mjs +0 -12
- package/tests/utils/preferences-utils.test.mjs +0 -465
- package/tests/utils/save-value-to-config.test.mjs +0 -483
- package/tests/utils/utils.test.mjs +0 -941
|
@@ -1,380 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test";
|
|
2
|
-
import * as fsPromises from "node:fs/promises";
|
|
3
|
-
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
4
|
-
import { dirname, join } from "node:path";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
import clearDocumentStructure from "../../../agents/clear/clear-document-structure.mjs";
|
|
7
|
-
|
|
8
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
-
|
|
10
|
-
describe("clear-document-structure", () => {
|
|
11
|
-
let testDir;
|
|
12
|
-
let structurePlanPath;
|
|
13
|
-
let docsDir;
|
|
14
|
-
|
|
15
|
-
beforeEach(async () => {
|
|
16
|
-
// Create a temporary test directory
|
|
17
|
-
testDir = join(__dirname, "test-clear-structure");
|
|
18
|
-
await mkdir(testDir, { recursive: true });
|
|
19
|
-
|
|
20
|
-
// Create .aigne/doc-smith/output directory structure
|
|
21
|
-
const outputDir = join(testDir, ".aigne", "doc-smith", "output");
|
|
22
|
-
await mkdir(outputDir, { recursive: true });
|
|
23
|
-
|
|
24
|
-
structurePlanPath = join(outputDir, "structure-plan.json");
|
|
25
|
-
docsDir = join(testDir, "docs");
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
afterEach(async () => {
|
|
29
|
-
// Clean up test directory
|
|
30
|
-
try {
|
|
31
|
-
await rm(testDir, { recursive: true, force: true });
|
|
32
|
-
} catch {
|
|
33
|
-
// Ignore cleanup errors since they don't affect test results
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test("should clear documentation structure only when no docsDir provided", async () => {
|
|
38
|
-
// Create a test documentation structure file
|
|
39
|
-
const structurePlan = {
|
|
40
|
-
documents: [
|
|
41
|
-
{ path: "/intro", title: "Introduction" },
|
|
42
|
-
{ path: "/guide", title: "User Guide" },
|
|
43
|
-
],
|
|
44
|
-
};
|
|
45
|
-
await writeFile(structurePlanPath, JSON.stringify(structurePlan, null, 2));
|
|
46
|
-
|
|
47
|
-
const result = await clearDocumentStructure({ workDir: testDir });
|
|
48
|
-
|
|
49
|
-
expect(result.message).toContain("Documentation Structure cleared successfully!");
|
|
50
|
-
expect(result.hasError).toBe(false);
|
|
51
|
-
expect(result.clearedCount).toBe(1);
|
|
52
|
-
|
|
53
|
-
// Verify documentation structure file is actually deleted
|
|
54
|
-
const { pathExists } = await import("../../../utils/file-utils.mjs");
|
|
55
|
-
const exists = await pathExists(structurePlanPath);
|
|
56
|
-
expect(exists).toBe(false);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test("should clear both documentation structure and docs directory when docsDir provided", async () => {
|
|
60
|
-
// Create documentation structure
|
|
61
|
-
await writeFile(structurePlanPath, JSON.stringify({ test: "data" }));
|
|
62
|
-
|
|
63
|
-
// Create docs directory with files
|
|
64
|
-
await mkdir(docsDir, { recursive: true });
|
|
65
|
-
await writeFile(join(docsDir, "index.md"), "# Index");
|
|
66
|
-
await writeFile(join(docsDir, "guide.md"), "# Guide");
|
|
67
|
-
|
|
68
|
-
const result = await clearDocumentStructure({ workDir: testDir, docsDir });
|
|
69
|
-
|
|
70
|
-
expect(result.message).toContain("Documentation Structure cleared successfully!");
|
|
71
|
-
expect(result.clearedCount).toBe(2);
|
|
72
|
-
|
|
73
|
-
// Verify both are deleted
|
|
74
|
-
const { pathExists } = await import("../../../utils/file-utils.mjs");
|
|
75
|
-
const structureExists = await pathExists(structurePlanPath);
|
|
76
|
-
const docsExists = await pathExists(docsDir);
|
|
77
|
-
expect(structureExists).toBe(false);
|
|
78
|
-
expect(docsExists).toBe(false);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test("should handle non-existent documentation structure file", async () => {
|
|
82
|
-
// Don't create the documentation structure file
|
|
83
|
-
const result = await clearDocumentStructure({ workDir: testDir });
|
|
84
|
-
|
|
85
|
-
expect(result.message).toContain("Documentation Structure already empty.");
|
|
86
|
-
expect(result.clearedCount).toBe(0);
|
|
87
|
-
expect(result.hasError).toBe(false);
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test("should handle non-existent docs directory", async () => {
|
|
91
|
-
// Create documentation structure but not docs directory
|
|
92
|
-
await writeFile(structurePlanPath, JSON.stringify({ test: "data" }));
|
|
93
|
-
|
|
94
|
-
const nonExistentDocsDir = join(testDir, "non-existent-docs");
|
|
95
|
-
|
|
96
|
-
const result = await clearDocumentStructure({
|
|
97
|
-
workDir: testDir,
|
|
98
|
-
docsDir: nonExistentDocsDir,
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
expect(result.message).toContain("Documentation Structure cleared successfully!");
|
|
102
|
-
expect(result.clearedCount).toBe(1); // Only documentation structure cleared
|
|
103
|
-
|
|
104
|
-
// Verify documentation structure is deleted
|
|
105
|
-
const { pathExists } = await import("../../../utils/file-utils.mjs");
|
|
106
|
-
const exists = await pathExists(structurePlanPath);
|
|
107
|
-
expect(exists).toBe(false);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test("should use current working directory when workDir not provided", async () => {
|
|
111
|
-
const originalCwd = process.cwd();
|
|
112
|
-
|
|
113
|
-
try {
|
|
114
|
-
// Change to test directory
|
|
115
|
-
process.chdir(testDir);
|
|
116
|
-
|
|
117
|
-
// Create documentation structure in current directory's structure
|
|
118
|
-
await writeFile(structurePlanPath, JSON.stringify({ test: "data" }));
|
|
119
|
-
|
|
120
|
-
const result = await clearDocumentStructure({});
|
|
121
|
-
|
|
122
|
-
expect(result.message).toContain("Documentation Structure cleared successfully!");
|
|
123
|
-
expect(result.clearedCount).toBe(1);
|
|
124
|
-
} finally {
|
|
125
|
-
// Restore original working directory
|
|
126
|
-
process.chdir(originalCwd);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
test("should provide correct return structure", async () => {
|
|
131
|
-
await writeFile(structurePlanPath, JSON.stringify({ test: "data" }));
|
|
132
|
-
|
|
133
|
-
const result = await clearDocumentStructure({ workDir: testDir });
|
|
134
|
-
|
|
135
|
-
expect(result).toHaveProperty("message");
|
|
136
|
-
expect(result).toHaveProperty("results");
|
|
137
|
-
expect(result).toHaveProperty("hasError");
|
|
138
|
-
expect(result).toHaveProperty("clearedCount");
|
|
139
|
-
expect(typeof result.message).toBe("string");
|
|
140
|
-
expect(Array.isArray(result.results)).toBe(true);
|
|
141
|
-
expect(typeof result.hasError).toBe("boolean");
|
|
142
|
-
expect(typeof result.clearedCount).toBe("number");
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
test("should have correct input schema", () => {
|
|
146
|
-
expect(clearDocumentStructure.input_schema).toBeDefined();
|
|
147
|
-
expect(clearDocumentStructure.input_schema.type).toBe("object");
|
|
148
|
-
expect(clearDocumentStructure.input_schema.properties.docsDir).toBeDefined();
|
|
149
|
-
expect(clearDocumentStructure.input_schema.properties.docsDir.type).toBe("string");
|
|
150
|
-
expect(clearDocumentStructure.input_schema.properties.docsDir.description).toBe(
|
|
151
|
-
"The documents directory to clear (optional)",
|
|
152
|
-
);
|
|
153
|
-
expect(clearDocumentStructure.input_schema.properties.workDir).toBeDefined();
|
|
154
|
-
expect(clearDocumentStructure.input_schema.properties.workDir.type).toBe("string");
|
|
155
|
-
expect(clearDocumentStructure.input_schema.properties.workDir.description).toBe(
|
|
156
|
-
"The working directory (defaults to current directory)",
|
|
157
|
-
);
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
test("should have correct task metadata", () => {
|
|
161
|
-
expect(clearDocumentStructure.taskTitle).toBe(
|
|
162
|
-
"Clear documentation structure and all generated documents",
|
|
163
|
-
);
|
|
164
|
-
expect(clearDocumentStructure.description).toBe(
|
|
165
|
-
"Clear the documentation structure (structure-plan.json) and optionally the documents directory",
|
|
166
|
-
);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
test("should handle complex documentation structures", async () => {
|
|
170
|
-
// Create complex documentation structure
|
|
171
|
-
const complexStructure = {
|
|
172
|
-
documents: [
|
|
173
|
-
{
|
|
174
|
-
path: "/introduction",
|
|
175
|
-
title: "Introduction",
|
|
176
|
-
children: [
|
|
177
|
-
{ path: "/introduction/overview", title: "Overview" },
|
|
178
|
-
{ path: "/introduction/getting-started", title: "Getting Started" },
|
|
179
|
-
],
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
path: "/api",
|
|
183
|
-
title: "API Reference",
|
|
184
|
-
children: [
|
|
185
|
-
{ path: "/api/authentication", title: "Authentication" },
|
|
186
|
-
{ path: "/api/endpoints", title: "Endpoints" },
|
|
187
|
-
],
|
|
188
|
-
},
|
|
189
|
-
],
|
|
190
|
-
metadata: {
|
|
191
|
-
version: "1.0.0",
|
|
192
|
-
generated: new Date().toISOString(),
|
|
193
|
-
},
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
await writeFile(structurePlanPath, JSON.stringify(complexStructure, null, 2));
|
|
197
|
-
|
|
198
|
-
// Create corresponding docs structure
|
|
199
|
-
await mkdir(docsDir, { recursive: true });
|
|
200
|
-
const nestedDirs = [
|
|
201
|
-
join(docsDir, "introduction"),
|
|
202
|
-
join(docsDir, "api"),
|
|
203
|
-
join(docsDir, "tutorials"),
|
|
204
|
-
];
|
|
205
|
-
|
|
206
|
-
for (const dir of nestedDirs) {
|
|
207
|
-
await mkdir(dir, { recursive: true });
|
|
208
|
-
await writeFile(join(dir, "index.md"), `# ${dir} content`);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
const result = await clearDocumentStructure({ workDir: testDir, docsDir });
|
|
212
|
-
|
|
213
|
-
expect(result.clearedCount).toBe(2);
|
|
214
|
-
expect(result.hasError).toBe(false);
|
|
215
|
-
|
|
216
|
-
// Verify everything is cleaned up
|
|
217
|
-
const { pathExists } = await import("../../../utils/file-utils.mjs");
|
|
218
|
-
const structureExists = await pathExists(structurePlanPath);
|
|
219
|
-
const docsExists = await pathExists(docsDir);
|
|
220
|
-
expect(structureExists).toBe(false);
|
|
221
|
-
expect(docsExists).toBe(false);
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
test("should handle paths with special characters", async () => {
|
|
225
|
-
// Create directory with special characters
|
|
226
|
-
const specialTestDir = join(__dirname, "test-clear-structure with spaces & symbols");
|
|
227
|
-
await mkdir(specialTestDir, { recursive: true });
|
|
228
|
-
|
|
229
|
-
const specialOutputDir = join(specialTestDir, ".aigne", "doc-smith", "output");
|
|
230
|
-
await mkdir(specialOutputDir, { recursive: true });
|
|
231
|
-
|
|
232
|
-
const specialStructurePath = join(specialOutputDir, "structure-plan.json");
|
|
233
|
-
await writeFile(specialStructurePath, JSON.stringify({ special: "test" }));
|
|
234
|
-
|
|
235
|
-
try {
|
|
236
|
-
const result = await clearDocumentStructure({ workDir: specialTestDir });
|
|
237
|
-
|
|
238
|
-
expect(result.clearedCount).toBe(1);
|
|
239
|
-
expect(result.hasError).toBe(false);
|
|
240
|
-
|
|
241
|
-
// Verify special path works
|
|
242
|
-
const { pathExists } = await import("../../../utils/file-utils.mjs");
|
|
243
|
-
const exists = await pathExists(specialStructurePath);
|
|
244
|
-
expect(exists).toBe(false);
|
|
245
|
-
} finally {
|
|
246
|
-
// Clean up special directory
|
|
247
|
-
try {
|
|
248
|
-
await rm(specialTestDir, { recursive: true, force: true });
|
|
249
|
-
} catch {
|
|
250
|
-
// Ignore cleanup errors
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
test("should handle relative and absolute paths for docsDir", async () => {
|
|
256
|
-
await writeFile(structurePlanPath, JSON.stringify({ test: "data" }));
|
|
257
|
-
|
|
258
|
-
// Create docs with relative path reference
|
|
259
|
-
const relativeDocs = join(testDir, "relative-docs");
|
|
260
|
-
await mkdir(relativeDocs, { recursive: true });
|
|
261
|
-
await writeFile(join(relativeDocs, "test.md"), "test content");
|
|
262
|
-
|
|
263
|
-
const originalCwd = process.cwd();
|
|
264
|
-
|
|
265
|
-
try {
|
|
266
|
-
process.chdir(testDir);
|
|
267
|
-
const result = await clearDocumentStructure({
|
|
268
|
-
workDir: testDir,
|
|
269
|
-
docsDir: "./relative-docs",
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
expect(result.clearedCount).toBe(2);
|
|
273
|
-
expect(result.hasError).toBe(false);
|
|
274
|
-
} finally {
|
|
275
|
-
process.chdir(originalCwd);
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
test("should provide detailed results information", async () => {
|
|
280
|
-
await writeFile(structurePlanPath, JSON.stringify({ test: "data" }));
|
|
281
|
-
await mkdir(docsDir, { recursive: true });
|
|
282
|
-
await writeFile(join(docsDir, "test.md"), "test content");
|
|
283
|
-
|
|
284
|
-
const result = await clearDocumentStructure({ workDir: testDir, docsDir });
|
|
285
|
-
|
|
286
|
-
expect(result.results).toHaveLength(2);
|
|
287
|
-
|
|
288
|
-
// Check structure result
|
|
289
|
-
const structureResult = result.results.find((r) => r.type === "structure");
|
|
290
|
-
expect(structureResult).toBeDefined();
|
|
291
|
-
expect(structureResult.cleared).toBe(true);
|
|
292
|
-
expect(structureResult.message).toContain("documentation structure");
|
|
293
|
-
|
|
294
|
-
// Check documents result
|
|
295
|
-
const docsResult = result.results.find((r) => r.type === "documents");
|
|
296
|
-
expect(docsResult).toBeDefined();
|
|
297
|
-
expect(docsResult.cleared).toBe(true);
|
|
298
|
-
expect(docsResult.message).toContain("documents directory");
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
test("should handle documentation structure file removal errors", async () => {
|
|
302
|
-
// Create a spy on rm to simulate an error for documentation structure
|
|
303
|
-
const rmSpy = spyOn(fsPromises, "rm");
|
|
304
|
-
rmSpy.mockImplementation((path, _options) => {
|
|
305
|
-
if (path.includes("structure-plan.json")) {
|
|
306
|
-
throw new Error("Permission denied for documentation structure");
|
|
307
|
-
}
|
|
308
|
-
return Promise.resolve();
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
try {
|
|
312
|
-
const result = await clearDocumentStructure({ workDir: testDir });
|
|
313
|
-
|
|
314
|
-
expect(result.hasError).toBe(true);
|
|
315
|
-
expect(result.message).toContain(
|
|
316
|
-
"Documentation Structure cleanup finished with some issues.",
|
|
317
|
-
);
|
|
318
|
-
|
|
319
|
-
const structureResult = result.results.find((r) => r.type === "structure");
|
|
320
|
-
expect(structureResult.error).toBe(true);
|
|
321
|
-
expect(structureResult.message).toContain("Failed to clear documentation structure");
|
|
322
|
-
expect(structureResult.message).toContain("Permission denied for documentation structure");
|
|
323
|
-
} finally {
|
|
324
|
-
rmSpy.mockRestore();
|
|
325
|
-
}
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
test("should handle documents directory removal errors", async () => {
|
|
329
|
-
// Create documentation structure file
|
|
330
|
-
await writeFile(structurePlanPath, JSON.stringify({ test: "data" }));
|
|
331
|
-
|
|
332
|
-
// Create a spy on rm to simulate an error for docs directory
|
|
333
|
-
const rmSpy = spyOn(fsPromises, "rm");
|
|
334
|
-
rmSpy.mockImplementation((path, _options) => {
|
|
335
|
-
if (path === docsDir) {
|
|
336
|
-
throw new Error("Permission denied for docs directory");
|
|
337
|
-
}
|
|
338
|
-
return Promise.resolve();
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
try {
|
|
342
|
-
const result = await clearDocumentStructure({ workDir: testDir, docsDir });
|
|
343
|
-
|
|
344
|
-
expect(result.hasError).toBe(true);
|
|
345
|
-
expect(result.message).toContain(
|
|
346
|
-
"Documentation Structure cleanup finished with some issues.",
|
|
347
|
-
);
|
|
348
|
-
|
|
349
|
-
const docsResult = result.results.find((r) => r.type === "documents");
|
|
350
|
-
expect(docsResult.error).toBe(true);
|
|
351
|
-
expect(docsResult.message).toContain("Failed to clear documents directory");
|
|
352
|
-
expect(docsResult.message).toContain("Permission denied for docs directory");
|
|
353
|
-
} finally {
|
|
354
|
-
rmSpy.mockRestore();
|
|
355
|
-
}
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
test("should handle both structure and docs errors simultaneously", async () => {
|
|
359
|
-
// Create a spy on rm to simulate errors for both operations
|
|
360
|
-
const rmSpy = spyOn(fsPromises, "rm");
|
|
361
|
-
rmSpy.mockImplementation(() => {
|
|
362
|
-
throw new Error("File system error");
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
try {
|
|
366
|
-
const result = await clearDocumentStructure({ workDir: testDir, docsDir });
|
|
367
|
-
|
|
368
|
-
expect(result.hasError).toBe(true);
|
|
369
|
-
expect(result.message).toContain(
|
|
370
|
-
"Documentation Structure cleanup finished with some issues.",
|
|
371
|
-
);
|
|
372
|
-
expect(result.results).toHaveLength(2);
|
|
373
|
-
|
|
374
|
-
// Both operations should have errors
|
|
375
|
-
expect(result.results.every((r) => r.error)).toBe(true);
|
|
376
|
-
} finally {
|
|
377
|
-
rmSpy.mockRestore();
|
|
378
|
-
}
|
|
379
|
-
});
|
|
380
|
-
});
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test";
|
|
2
|
-
import * as fsPromises from "node:fs/promises";
|
|
3
|
-
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
4
|
-
import { dirname, join } from "node:path";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
import clearGeneratedDocs from "../../../agents/clear/clear-generated-docs.mjs";
|
|
7
|
-
|
|
8
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
-
|
|
10
|
-
describe("clear-generated-docs", () => {
|
|
11
|
-
let testDir;
|
|
12
|
-
let docsDir;
|
|
13
|
-
|
|
14
|
-
beforeEach(async () => {
|
|
15
|
-
// Create a temporary test directory
|
|
16
|
-
testDir = join(__dirname, "test-clear-docs");
|
|
17
|
-
await mkdir(testDir, { recursive: true });
|
|
18
|
-
|
|
19
|
-
docsDir = join(testDir, "docs");
|
|
20
|
-
await mkdir(docsDir, { recursive: true });
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
afterEach(async () => {
|
|
24
|
-
// Clean up test directory
|
|
25
|
-
try {
|
|
26
|
-
await rm(testDir, { recursive: true, force: true });
|
|
27
|
-
} catch {
|
|
28
|
-
// Ignore cleanup errors since they don't affect test results
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test("should clear existing generated documents successfully", async () => {
|
|
33
|
-
// Create some test files in docs directory
|
|
34
|
-
const testFiles = ["index.md", "guide.md", "api.md", "README.md"];
|
|
35
|
-
for (const file of testFiles) {
|
|
36
|
-
await writeFile(join(docsDir, file), `# ${file} content`);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Create subdirectories with files
|
|
40
|
-
const subDir = join(docsDir, "advanced");
|
|
41
|
-
await mkdir(subDir, { recursive: true });
|
|
42
|
-
await writeFile(join(subDir, "config.md"), "# Config content");
|
|
43
|
-
|
|
44
|
-
const result = await clearGeneratedDocs({ docsDir });
|
|
45
|
-
|
|
46
|
-
expect(result.cleared).toBe(true);
|
|
47
|
-
expect(result.message).toContain("Cleared generated documents");
|
|
48
|
-
expect(result.path).toBeDefined();
|
|
49
|
-
|
|
50
|
-
// Verify directory is actually deleted
|
|
51
|
-
const { pathExists } = await import("../../../utils/file-utils.mjs");
|
|
52
|
-
const exists = await pathExists(docsDir);
|
|
53
|
-
expect(exists).toBe(false);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test("should handle non-existent documents directory", async () => {
|
|
57
|
-
const nonExistentDir = join(testDir, "non-existent-docs");
|
|
58
|
-
|
|
59
|
-
const result = await clearGeneratedDocs({ docsDir: nonExistentDir });
|
|
60
|
-
|
|
61
|
-
expect(result.cleared).toBe(false);
|
|
62
|
-
expect(result.message).toContain("Generated documents already empty");
|
|
63
|
-
expect(result.path).toBeDefined();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test("should return error message when no docsDir provided", async () => {
|
|
67
|
-
const result = await clearGeneratedDocs({});
|
|
68
|
-
|
|
69
|
-
expect(result.message).toBe("No generated documents directory specified");
|
|
70
|
-
expect(result).not.toHaveProperty("cleared");
|
|
71
|
-
expect(result).not.toHaveProperty("path");
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test("should handle null docsDir", async () => {
|
|
75
|
-
const result = await clearGeneratedDocs({ docsDir: null });
|
|
76
|
-
|
|
77
|
-
expect(result.message).toBe("No generated documents directory specified");
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test("should handle empty string docsDir", async () => {
|
|
81
|
-
const result = await clearGeneratedDocs({ docsDir: "" });
|
|
82
|
-
|
|
83
|
-
expect(result.message).toBe("No generated documents directory specified");
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
test("should handle undefined docsDir", async () => {
|
|
87
|
-
const result = await clearGeneratedDocs({ docsDir: undefined });
|
|
88
|
-
|
|
89
|
-
expect(result.message).toBe("No generated documents directory specified");
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test("should provide correct return structure", async () => {
|
|
93
|
-
await writeFile(join(docsDir, "test.md"), "test content");
|
|
94
|
-
|
|
95
|
-
const result = await clearGeneratedDocs({ docsDir });
|
|
96
|
-
|
|
97
|
-
expect(result).toHaveProperty("message");
|
|
98
|
-
expect(result).toHaveProperty("cleared");
|
|
99
|
-
expect(result).toHaveProperty("path");
|
|
100
|
-
expect(typeof result.message).toBe("string");
|
|
101
|
-
expect(typeof result.cleared).toBe("boolean");
|
|
102
|
-
expect(typeof result.path).toBe("string");
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
test("should have correct input schema", () => {
|
|
106
|
-
expect(clearGeneratedDocs.input_schema).toBeDefined();
|
|
107
|
-
expect(clearGeneratedDocs.input_schema.type).toBe("object");
|
|
108
|
-
expect(clearGeneratedDocs.input_schema.properties.docsDir).toBeDefined();
|
|
109
|
-
expect(clearGeneratedDocs.input_schema.properties.docsDir.type).toBe("string");
|
|
110
|
-
expect(clearGeneratedDocs.input_schema.properties.docsDir.description).toBe(
|
|
111
|
-
"The generated documents directory to clear",
|
|
112
|
-
);
|
|
113
|
-
expect(clearGeneratedDocs.input_schema.required).toEqual(["docsDir"]);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
test("should have correct task metadata", () => {
|
|
117
|
-
expect(clearGeneratedDocs.taskTitle).toBe("Clear all generated documents");
|
|
118
|
-
expect(clearGeneratedDocs.description).toBe("Clear the generated documents directory");
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
test("should handle relative paths", async () => {
|
|
122
|
-
// Create test files
|
|
123
|
-
await writeFile(join(docsDir, "test.md"), "test content");
|
|
124
|
-
|
|
125
|
-
// Use relative path
|
|
126
|
-
const relativePath = "./docs";
|
|
127
|
-
const originalCwd = process.cwd();
|
|
128
|
-
|
|
129
|
-
try {
|
|
130
|
-
process.chdir(testDir);
|
|
131
|
-
const result = await clearGeneratedDocs({ docsDir: relativePath });
|
|
132
|
-
|
|
133
|
-
expect(result.cleared).toBe(true);
|
|
134
|
-
expect(result.message).toContain("Cleared generated documents");
|
|
135
|
-
} finally {
|
|
136
|
-
process.chdir(originalCwd);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
test("should handle absolute paths", async () => {
|
|
141
|
-
// Create test files
|
|
142
|
-
await writeFile(join(docsDir, "test.md"), "test content");
|
|
143
|
-
|
|
144
|
-
const result = await clearGeneratedDocs({ docsDir });
|
|
145
|
-
|
|
146
|
-
expect(result.cleared).toBe(true);
|
|
147
|
-
expect(result.message).toContain("Cleared generated documents");
|
|
148
|
-
|
|
149
|
-
// Verify absolute path works
|
|
150
|
-
const { pathExists } = await import("../../../utils/file-utils.mjs");
|
|
151
|
-
const exists = await pathExists(docsDir);
|
|
152
|
-
expect(exists).toBe(false);
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
test("should handle complex directory structures", async () => {
|
|
156
|
-
// Create complex nested structure
|
|
157
|
-
const nestedDirs = [
|
|
158
|
-
join(docsDir, "api"),
|
|
159
|
-
join(docsDir, "guides", "getting-started"),
|
|
160
|
-
join(docsDir, "tutorials", "advanced"),
|
|
161
|
-
join(docsDir, ".hidden"),
|
|
162
|
-
];
|
|
163
|
-
|
|
164
|
-
for (const dir of nestedDirs) {
|
|
165
|
-
await mkdir(dir, { recursive: true });
|
|
166
|
-
await writeFile(join(dir, "content.md"), "nested content");
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Create files at root level
|
|
170
|
-
await writeFile(join(docsDir, "index.md"), "root content");
|
|
171
|
-
await writeFile(join(docsDir, ".gitignore"), "node_modules/");
|
|
172
|
-
|
|
173
|
-
const result = await clearGeneratedDocs({ docsDir });
|
|
174
|
-
|
|
175
|
-
expect(result.cleared).toBe(true);
|
|
176
|
-
expect(result.message).toContain("Cleared generated documents");
|
|
177
|
-
|
|
178
|
-
// Verify entire structure is deleted
|
|
179
|
-
const { pathExists } = await import("../../../utils/file-utils.mjs");
|
|
180
|
-
const exists = await pathExists(docsDir);
|
|
181
|
-
expect(exists).toBe(false);
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
test("should handle paths with special characters", async () => {
|
|
185
|
-
// Create directory with special characters
|
|
186
|
-
const specialDocsDir = join(testDir, "docs with spaces & symbols-123");
|
|
187
|
-
await mkdir(specialDocsDir, { recursive: true });
|
|
188
|
-
await writeFile(join(specialDocsDir, "test file.md"), "special content");
|
|
189
|
-
|
|
190
|
-
const result = await clearGeneratedDocs({ docsDir: specialDocsDir });
|
|
191
|
-
|
|
192
|
-
expect(result.cleared).toBe(true);
|
|
193
|
-
expect(result.message).toContain("Cleared generated documents");
|
|
194
|
-
|
|
195
|
-
// Verify special path is deleted
|
|
196
|
-
const { pathExists } = await import("../../../utils/file-utils.mjs");
|
|
197
|
-
const exists = await pathExists(specialDocsDir);
|
|
198
|
-
expect(exists).toBe(false);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
test("should handle file system errors gracefully", async () => {
|
|
202
|
-
// Create some test files first
|
|
203
|
-
await writeFile(join(docsDir, "test.md"), "test content");
|
|
204
|
-
|
|
205
|
-
// Create a spy on rm to simulate an error
|
|
206
|
-
const rmSpy = spyOn(fsPromises, "rm");
|
|
207
|
-
rmSpy.mockImplementation(() => {
|
|
208
|
-
throw new Error("Permission denied");
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
try {
|
|
212
|
-
const result = await clearGeneratedDocs({ docsDir });
|
|
213
|
-
|
|
214
|
-
expect(result.error).toBe(true);
|
|
215
|
-
expect(result.message).toContain("Failed to clear generated documents");
|
|
216
|
-
expect(result.message).toContain("Permission denied");
|
|
217
|
-
expect(result.path).toBeDefined();
|
|
218
|
-
} finally {
|
|
219
|
-
rmSpy.mockRestore();
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
});
|