@aigne/doc-smith 0.8.12-beta.7 → 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 +25 -0
- package/agents/clear/choose-contents.mjs +14 -1
- package/agents/clear/clear-media-description.mjs +129 -0
- package/agents/clear/index.yaml +3 -1
- package/agents/evaluate/code-snippet.mjs +28 -24
- package/agents/evaluate/document-structure.yaml +0 -4
- package/agents/evaluate/document.yaml +1 -5
- package/agents/generate/index.yaml +1 -0
- package/agents/init/index.mjs +10 -0
- package/agents/media/batch-generate-media-description.yaml +44 -0
- package/agents/media/generate-media-description.yaml +47 -0
- package/agents/media/load-media-description.mjs +238 -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/index.yaml +1 -0
- package/agents/update/update-document-detail.yaml +3 -1
- package/agents/utils/load-sources.mjs +103 -53
- package/agents/utils/update-branding.mjs +69 -0
- package/aigne.yaml +6 -0
- package/assets/report-template/report.html +34 -34
- package/package.json +17 -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/evaluate/document-structure.md +6 -7
- package/prompts/evaluate/document.md +16 -25
- package/prompts/media/media-description/system-prompt.md +35 -0
- package/prompts/media/media-description/user-prompt.md +8 -0
- package/prompts/structure/update/user-prompt.md +0 -4
- package/utils/constants/index.mjs +0 -107
- package/utils/file-utils.mjs +86 -0
- 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/output/structure-plan.json +0 -162
- package/.aigne/doc-smith/preferences.yml +0 -97
- package/.aigne/doc-smith/upload-cache.yaml +0 -1893
- 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 -179
- 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 -96
- package/docs/configuration.md +0 -96
- package/docs/configuration.zh-TW.md +0 -96
- package/docs/configuration.zh.md +0 -96
- package/docs/getting-started.ja.md +0 -88
- package/docs/getting-started.md +0 -88
- package/docs/getting-started.zh-TW.md +0 -88
- package/docs/getting-started.zh.md +0 -88
- package/docs/guides-cleaning-up.ja.md +0 -51
- package/docs/guides-cleaning-up.md +0 -51
- 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 -66
- 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 -151
- 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 -85
- 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 -48
- 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 -78
- 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 -95
- 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 -77
- 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 -255
- package/docs/release-notes.zh-TW.md +0 -255
- package/docs/release-notes.zh.md +0 -255
- package/media.md +0 -19
- 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,517 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test";
|
|
2
|
-
import findItemByPath from "../../../agents/utils/find-item-by-path.mjs";
|
|
3
|
-
|
|
4
|
-
import * as docsFinderUtils from "../../../utils/docs-finder-utils.mjs";
|
|
5
|
-
|
|
6
|
-
describe("find-item-by-path", () => {
|
|
7
|
-
let mockOptions;
|
|
8
|
-
|
|
9
|
-
// Spies for internal utils
|
|
10
|
-
let fileNameToFlatPathSpy;
|
|
11
|
-
let findItemByFlatNameSpy;
|
|
12
|
-
let findItemByPathUtilSpy;
|
|
13
|
-
let getActionTextSpy;
|
|
14
|
-
let getMainLanguageFilesSpy;
|
|
15
|
-
let readFileContentSpy;
|
|
16
|
-
let consoleDebugSpy;
|
|
17
|
-
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
mockOptions = {
|
|
20
|
-
prompts: {
|
|
21
|
-
search: async () => "selected-file.md",
|
|
22
|
-
input: async () => "user feedback",
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
// Set up spies for internal utils
|
|
27
|
-
fileNameToFlatPathSpy = spyOn(docsFinderUtils, "fileNameToFlatPath").mockReturnValue(
|
|
28
|
-
"selected-file",
|
|
29
|
-
);
|
|
30
|
-
findItemByFlatNameSpy = spyOn(docsFinderUtils, "findItemByFlatName").mockReturnValue({
|
|
31
|
-
path: "/api/users",
|
|
32
|
-
title: "Selected Item",
|
|
33
|
-
});
|
|
34
|
-
findItemByPathUtilSpy = spyOn(docsFinderUtils, "findItemByPathUtil").mockResolvedValue({
|
|
35
|
-
path: "/api/users",
|
|
36
|
-
title: "Mock Item",
|
|
37
|
-
content: "File content",
|
|
38
|
-
});
|
|
39
|
-
getActionTextSpy = spyOn(docsFinderUtils, "getActionText").mockImplementation(
|
|
40
|
-
(_, text) => text,
|
|
41
|
-
);
|
|
42
|
-
getMainLanguageFilesSpy = spyOn(docsFinderUtils, "getMainLanguageFiles").mockResolvedValue([
|
|
43
|
-
"file1.md",
|
|
44
|
-
"file2.md",
|
|
45
|
-
"subfolder-file3.md",
|
|
46
|
-
]);
|
|
47
|
-
readFileContentSpy = spyOn(docsFinderUtils, "readFileContent").mockResolvedValue(
|
|
48
|
-
"File content",
|
|
49
|
-
);
|
|
50
|
-
consoleDebugSpy = spyOn(console, "debug").mockImplementation(() => {});
|
|
51
|
-
|
|
52
|
-
// Clear spy call history
|
|
53
|
-
fileNameToFlatPathSpy.mockClear();
|
|
54
|
-
findItemByFlatNameSpy.mockClear();
|
|
55
|
-
findItemByPathUtilSpy.mockClear();
|
|
56
|
-
getActionTextSpy.mockClear();
|
|
57
|
-
getMainLanguageFilesSpy.mockClear();
|
|
58
|
-
readFileContentSpy.mockClear();
|
|
59
|
-
consoleDebugSpy.mockClear();
|
|
60
|
-
|
|
61
|
-
// Clear mock call history
|
|
62
|
-
mockOptions.prompts.search = async () => "selected-file.md";
|
|
63
|
-
mockOptions.prompts.input = async () => "user feedback";
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
afterEach(() => {
|
|
67
|
-
// Restore all spies
|
|
68
|
-
fileNameToFlatPathSpy?.mockRestore();
|
|
69
|
-
findItemByFlatNameSpy?.mockRestore();
|
|
70
|
-
findItemByPathUtilSpy?.mockRestore();
|
|
71
|
-
getActionTextSpy?.mockRestore();
|
|
72
|
-
getMainLanguageFilesSpy?.mockRestore();
|
|
73
|
-
readFileContentSpy?.mockRestore();
|
|
74
|
-
consoleDebugSpy?.mockRestore();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
// PATH PROVIDED TESTS
|
|
78
|
-
test("should find item when doc path is provided", async () => {
|
|
79
|
-
const result = await findItemByPath(
|
|
80
|
-
{
|
|
81
|
-
doc: "/api/users",
|
|
82
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
83
|
-
boardId: "board123",
|
|
84
|
-
docsDir: "./docs",
|
|
85
|
-
isTranslate: false,
|
|
86
|
-
feedback: "existing feedback",
|
|
87
|
-
locale: "en",
|
|
88
|
-
},
|
|
89
|
-
mockOptions,
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
// When doc path is provided and matches documentExecutionStructure, function should work correctly
|
|
93
|
-
expect(result).toEqual({
|
|
94
|
-
path: "/api/users",
|
|
95
|
-
title: "Mock Item",
|
|
96
|
-
content: "File content",
|
|
97
|
-
feedback: "existing feedback",
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test("should handle feedback trimming when path is provided", async () => {
|
|
102
|
-
const result = await findItemByPath(
|
|
103
|
-
{
|
|
104
|
-
doc: "/api/users",
|
|
105
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
106
|
-
boardId: "board123",
|
|
107
|
-
docsDir: "./docs",
|
|
108
|
-
isTranslate: false,
|
|
109
|
-
feedback: " trimmed feedback ",
|
|
110
|
-
locale: "en",
|
|
111
|
-
},
|
|
112
|
-
mockOptions,
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
expect(result.feedback).toBe("trimmed feedback");
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
test("should not include feedback when empty or whitespace", async () => {
|
|
119
|
-
const result = await findItemByPath(
|
|
120
|
-
{
|
|
121
|
-
doc: "/api/users",
|
|
122
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
123
|
-
boardId: "board123",
|
|
124
|
-
docsDir: "./docs",
|
|
125
|
-
isTranslate: false,
|
|
126
|
-
feedback: " ",
|
|
127
|
-
locale: "en",
|
|
128
|
-
},
|
|
129
|
-
mockOptions,
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
expect(result.feedback).toBeUndefined();
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
test("should throw error when item not found by path", async () => {
|
|
136
|
-
findItemByPathUtilSpy.mockResolvedValue(null);
|
|
137
|
-
|
|
138
|
-
await expect(
|
|
139
|
-
findItemByPath(
|
|
140
|
-
{
|
|
141
|
-
doc: "/nonexistent/path",
|
|
142
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
143
|
-
boardId: "board123",
|
|
144
|
-
docsDir: "./docs",
|
|
145
|
-
isTranslate: false,
|
|
146
|
-
locale: "en",
|
|
147
|
-
},
|
|
148
|
-
mockOptions,
|
|
149
|
-
),
|
|
150
|
-
).rejects.toThrow('Item with path "/nonexistent/path" not found in documentExecutionStructure');
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
// USER SELECTION TESTS
|
|
154
|
-
test("should prompt user selection when doc path is empty", async () => {
|
|
155
|
-
mockOptions.prompts.search = async (options) => {
|
|
156
|
-
expect(options.message).toBe("Select a document to {action}:");
|
|
157
|
-
expect(typeof options.source).toBe("function");
|
|
158
|
-
return "file1.md";
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
await findItemByPath(
|
|
162
|
-
{
|
|
163
|
-
doc: "",
|
|
164
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
165
|
-
boardId: "board123",
|
|
166
|
-
docsDir: "./docs",
|
|
167
|
-
isTranslate: false,
|
|
168
|
-
locale: "en",
|
|
169
|
-
},
|
|
170
|
-
mockOptions,
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
expect(getMainLanguageFilesSpy).toHaveBeenCalledWith("./docs", "en", [
|
|
174
|
-
{ path: "/api/users", title: "Mock Item" },
|
|
175
|
-
]);
|
|
176
|
-
expect(getActionTextSpy).toHaveBeenCalledWith(false, "Select a document to {action}:");
|
|
177
|
-
expect(readFileContentSpy).toHaveBeenCalledWith("./docs", "file1.md");
|
|
178
|
-
expect(fileNameToFlatPathSpy).toHaveBeenCalledWith("file1.md");
|
|
179
|
-
expect(findItemByFlatNameSpy).toHaveBeenCalledWith(
|
|
180
|
-
[{ path: "/api/users", title: "Mock Item" }],
|
|
181
|
-
"selected-file",
|
|
182
|
-
);
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
test("should use selected file content over utility content", async () => {
|
|
186
|
-
mockOptions.prompts.search = async () => "file2.md";
|
|
187
|
-
readFileContentSpy.mockResolvedValue("Selected file content");
|
|
188
|
-
|
|
189
|
-
const result = await findItemByPath(
|
|
190
|
-
{
|
|
191
|
-
doc: "",
|
|
192
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
193
|
-
boardId: "board123",
|
|
194
|
-
docsDir: "./docs",
|
|
195
|
-
isTranslate: false,
|
|
196
|
-
locale: "en",
|
|
197
|
-
},
|
|
198
|
-
mockOptions,
|
|
199
|
-
);
|
|
200
|
-
|
|
201
|
-
expect(result.content).toBe("Selected file content");
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
test("should handle search with input filtering", async () => {
|
|
205
|
-
mockOptions.prompts.search = async (options) => {
|
|
206
|
-
// Test the source function with empty input
|
|
207
|
-
const emptyResult = await options.source("");
|
|
208
|
-
expect(emptyResult).toEqual([
|
|
209
|
-
{ name: "file1.md", value: "file1.md" },
|
|
210
|
-
{ name: "file2.md", value: "file2.md" },
|
|
211
|
-
{ name: "subfolder-file3.md", value: "subfolder-file3.md" },
|
|
212
|
-
]);
|
|
213
|
-
|
|
214
|
-
// Test the source function with search input
|
|
215
|
-
const filteredResult = await options.source("file1");
|
|
216
|
-
expect(filteredResult).toEqual([{ name: "file1.md", value: "file1.md" }]);
|
|
217
|
-
|
|
218
|
-
return "file1.md";
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
await findItemByPath(
|
|
222
|
-
{
|
|
223
|
-
doc: "",
|
|
224
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
225
|
-
boardId: "board123",
|
|
226
|
-
docsDir: "./docs",
|
|
227
|
-
isTranslate: false,
|
|
228
|
-
locale: "en",
|
|
229
|
-
},
|
|
230
|
-
mockOptions,
|
|
231
|
-
);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
test("should handle case-insensitive search filtering", async () => {
|
|
235
|
-
mockOptions.prompts.search = async (options) => {
|
|
236
|
-
const filteredResult = await options.source("FILE1");
|
|
237
|
-
expect(filteredResult).toEqual([{ name: "file1.md", value: "file1.md" }]);
|
|
238
|
-
return "file1.md";
|
|
239
|
-
};
|
|
240
|
-
|
|
241
|
-
await findItemByPath(
|
|
242
|
-
{
|
|
243
|
-
doc: "",
|
|
244
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
245
|
-
boardId: "board123",
|
|
246
|
-
docsDir: "./docs",
|
|
247
|
-
isTranslate: false,
|
|
248
|
-
locale: "en",
|
|
249
|
-
},
|
|
250
|
-
mockOptions,
|
|
251
|
-
);
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
test("should handle partial match search filtering", async () => {
|
|
255
|
-
mockOptions.prompts.search = async (options) => {
|
|
256
|
-
const filteredResult = await options.source("subfolder");
|
|
257
|
-
expect(filteredResult).toEqual([{ name: "subfolder-file3.md", value: "subfolder-file3.md" }]);
|
|
258
|
-
return "subfolder-file3.md";
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
await findItemByPath(
|
|
262
|
-
{
|
|
263
|
-
doc: "",
|
|
264
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
265
|
-
boardId: "board123",
|
|
266
|
-
docsDir: "./docs",
|
|
267
|
-
isTranslate: false,
|
|
268
|
-
locale: "en",
|
|
269
|
-
},
|
|
270
|
-
mockOptions,
|
|
271
|
-
);
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
// ERROR HANDLING TESTS
|
|
275
|
-
test("should throw error when no documents found", async () => {
|
|
276
|
-
getMainLanguageFilesSpy.mockResolvedValue([]);
|
|
277
|
-
|
|
278
|
-
await expect(
|
|
279
|
-
findItemByPath(
|
|
280
|
-
{
|
|
281
|
-
doc: "",
|
|
282
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
283
|
-
boardId: "board123",
|
|
284
|
-
docsDir: "./docs",
|
|
285
|
-
isTranslate: false,
|
|
286
|
-
locale: "en",
|
|
287
|
-
},
|
|
288
|
-
mockOptions,
|
|
289
|
-
),
|
|
290
|
-
).rejects.toThrow(
|
|
291
|
-
"Please run 'aigne doc generate' first to generate documents, then select which document to {action}",
|
|
292
|
-
);
|
|
293
|
-
|
|
294
|
-
expect(consoleDebugSpy).toHaveBeenCalledWith("No documents found in the docs directory");
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
test("should throw error when no document selected", async () => {
|
|
298
|
-
mockOptions.prompts.search = async () => null;
|
|
299
|
-
|
|
300
|
-
await expect(
|
|
301
|
-
findItemByPath(
|
|
302
|
-
{
|
|
303
|
-
doc: "",
|
|
304
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
305
|
-
boardId: "board123",
|
|
306
|
-
docsDir: "./docs",
|
|
307
|
-
isTranslate: false,
|
|
308
|
-
locale: "en",
|
|
309
|
-
},
|
|
310
|
-
mockOptions,
|
|
311
|
-
),
|
|
312
|
-
).rejects.toThrow(
|
|
313
|
-
"Please run 'aigne doc generate' first to generate documents, then select which document to {action}",
|
|
314
|
-
);
|
|
315
|
-
|
|
316
|
-
expect(consoleDebugSpy).toHaveBeenCalledWith("No document selected");
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
test("should throw error when no matching item found by flat name", async () => {
|
|
320
|
-
findItemByFlatNameSpy.mockReturnValue(null);
|
|
321
|
-
|
|
322
|
-
await expect(
|
|
323
|
-
findItemByPath(
|
|
324
|
-
{
|
|
325
|
-
doc: "",
|
|
326
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
327
|
-
boardId: "board123",
|
|
328
|
-
docsDir: "./docs",
|
|
329
|
-
isTranslate: false,
|
|
330
|
-
locale: "en",
|
|
331
|
-
},
|
|
332
|
-
mockOptions,
|
|
333
|
-
),
|
|
334
|
-
).rejects.toThrow(
|
|
335
|
-
"Please run 'aigne doc generate' first to generate documents, then select which document to {action}",
|
|
336
|
-
);
|
|
337
|
-
|
|
338
|
-
expect(consoleDebugSpy).toHaveBeenCalledWith("No document found");
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
test("should handle getMainLanguageFiles error", async () => {
|
|
342
|
-
getMainLanguageFilesSpy.mockRejectedValue(new Error("Directory not found"));
|
|
343
|
-
|
|
344
|
-
await expect(
|
|
345
|
-
findItemByPath(
|
|
346
|
-
{
|
|
347
|
-
doc: "",
|
|
348
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
349
|
-
boardId: "board123",
|
|
350
|
-
docsDir: "./docs",
|
|
351
|
-
isTranslate: false,
|
|
352
|
-
locale: "en",
|
|
353
|
-
},
|
|
354
|
-
mockOptions,
|
|
355
|
-
),
|
|
356
|
-
).rejects.toThrow(
|
|
357
|
-
"Please run 'aigne doc generate' first to generate documents, then select which document to {action}",
|
|
358
|
-
);
|
|
359
|
-
|
|
360
|
-
expect(consoleDebugSpy).toHaveBeenCalledWith("Directory not found");
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
// FEEDBACK HANDLING TESTS
|
|
364
|
-
test("should prompt for feedback when not provided", async () => {
|
|
365
|
-
mockOptions.prompts.input = async (options) => {
|
|
366
|
-
expect(options.message).toBe("How should we improve this document? (press Enter to skip):");
|
|
367
|
-
return "prompted feedback";
|
|
368
|
-
};
|
|
369
|
-
|
|
370
|
-
const result = await findItemByPath(
|
|
371
|
-
{
|
|
372
|
-
doc: "/api/users",
|
|
373
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
374
|
-
boardId: "board123",
|
|
375
|
-
docsDir: "./docs",
|
|
376
|
-
isTranslate: false,
|
|
377
|
-
locale: "en",
|
|
378
|
-
},
|
|
379
|
-
mockOptions,
|
|
380
|
-
);
|
|
381
|
-
|
|
382
|
-
expect(result.feedback).toBe("prompted feedback");
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
test("should not prompt for feedback when provided", async () => {
|
|
386
|
-
const inputSpy = async () => {
|
|
387
|
-
throw new Error("Should not be called");
|
|
388
|
-
};
|
|
389
|
-
mockOptions.prompts.input = inputSpy;
|
|
390
|
-
|
|
391
|
-
const result = await findItemByPath(
|
|
392
|
-
{
|
|
393
|
-
doc: "/api/users",
|
|
394
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
395
|
-
boardId: "board123",
|
|
396
|
-
docsDir: "./docs",
|
|
397
|
-
isTranslate: false,
|
|
398
|
-
feedback: "existing feedback",
|
|
399
|
-
locale: "en",
|
|
400
|
-
},
|
|
401
|
-
mockOptions,
|
|
402
|
-
);
|
|
403
|
-
|
|
404
|
-
expect(result.feedback).toBe("existing feedback");
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
test("should handle empty feedback from prompt", async () => {
|
|
408
|
-
mockOptions.prompts.input = async () => "";
|
|
409
|
-
|
|
410
|
-
const result = await findItemByPath(
|
|
411
|
-
{
|
|
412
|
-
doc: "/api/users",
|
|
413
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
414
|
-
boardId: "board123",
|
|
415
|
-
docsDir: "./docs",
|
|
416
|
-
isTranslate: false,
|
|
417
|
-
locale: "en",
|
|
418
|
-
},
|
|
419
|
-
mockOptions,
|
|
420
|
-
);
|
|
421
|
-
|
|
422
|
-
expect(result.feedback).toBeUndefined();
|
|
423
|
-
});
|
|
424
|
-
|
|
425
|
-
test("should trim feedback from prompt", async () => {
|
|
426
|
-
mockOptions.prompts.input = async () => " trimmed prompted feedback ";
|
|
427
|
-
|
|
428
|
-
const result = await findItemByPath(
|
|
429
|
-
{
|
|
430
|
-
doc: "/api/users",
|
|
431
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
432
|
-
boardId: "board123",
|
|
433
|
-
docsDir: "./docs",
|
|
434
|
-
isTranslate: false,
|
|
435
|
-
locale: "en",
|
|
436
|
-
},
|
|
437
|
-
mockOptions,
|
|
438
|
-
);
|
|
439
|
-
|
|
440
|
-
expect(result.feedback).toBe("trimmed prompted feedback");
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
// TRANSLATION CONTEXT TESTS
|
|
444
|
-
test("should handle translation context in action text", async () => {
|
|
445
|
-
await findItemByPath(
|
|
446
|
-
{
|
|
447
|
-
doc: "/api/users",
|
|
448
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
449
|
-
boardId: "board123",
|
|
450
|
-
docsDir: "./docs",
|
|
451
|
-
isTranslate: true,
|
|
452
|
-
locale: "en",
|
|
453
|
-
},
|
|
454
|
-
mockOptions,
|
|
455
|
-
);
|
|
456
|
-
});
|
|
457
|
-
|
|
458
|
-
test("should handle translation context in error messages", async () => {
|
|
459
|
-
getMainLanguageFilesSpy.mockResolvedValue([]);
|
|
460
|
-
|
|
461
|
-
await expect(
|
|
462
|
-
findItemByPath(
|
|
463
|
-
{
|
|
464
|
-
doc: "",
|
|
465
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
466
|
-
boardId: "board123",
|
|
467
|
-
docsDir: "./docs",
|
|
468
|
-
isTranslate: true,
|
|
469
|
-
locale: "en",
|
|
470
|
-
},
|
|
471
|
-
mockOptions,
|
|
472
|
-
),
|
|
473
|
-
).rejects.toThrow(
|
|
474
|
-
"Please run 'aigne doc generate' first to generate documents, then select which document to {action}",
|
|
475
|
-
);
|
|
476
|
-
|
|
477
|
-
expect(getActionTextSpy).toHaveBeenCalledWith(
|
|
478
|
-
true,
|
|
479
|
-
"Please run 'aigne doc generate' first to generate documents, then select which document to {action}",
|
|
480
|
-
);
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
// PARAMETER PASSING TESTS
|
|
484
|
-
test("should pass all parameters correctly to utility functions", async () => {
|
|
485
|
-
await findItemByPath(
|
|
486
|
-
{
|
|
487
|
-
doc: "/api/complex",
|
|
488
|
-
documentExecutionStructure: [{ path: "/api/complex", title: "Complex Item" }],
|
|
489
|
-
boardId: "board456",
|
|
490
|
-
docsDir: "/custom/docs",
|
|
491
|
-
isTranslate: false,
|
|
492
|
-
feedback: "complex feedback",
|
|
493
|
-
locale: "zh",
|
|
494
|
-
},
|
|
495
|
-
mockOptions,
|
|
496
|
-
);
|
|
497
|
-
|
|
498
|
-
// The function should work correctly with complex parameters
|
|
499
|
-
});
|
|
500
|
-
|
|
501
|
-
test("should handle undefined optional parameters", async () => {
|
|
502
|
-
const result = await findItemByPath(
|
|
503
|
-
{
|
|
504
|
-
doc: "/api/users",
|
|
505
|
-
documentExecutionStructure: [{ path: "/api/users", title: "Mock Item" }],
|
|
506
|
-
boardId: "board123",
|
|
507
|
-
docsDir: "./docs",
|
|
508
|
-
locale: "en",
|
|
509
|
-
// isTranslate and feedback are undefined
|
|
510
|
-
},
|
|
511
|
-
mockOptions,
|
|
512
|
-
);
|
|
513
|
-
|
|
514
|
-
// The function should work correctly with complex parameters
|
|
515
|
-
expect(result.feedback).toBe("user feedback"); // From mock prompt
|
|
516
|
-
});
|
|
517
|
-
});
|