@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,45 +0,0 @@
|
|
|
1
|
-
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import { AIAgent } from "@aigne/core";
|
|
4
|
-
import { loadAgent } from "@aigne/core/loader/index.js";
|
|
5
|
-
import { loadModel } from "../../utils/mock-chat-model.mjs";
|
|
6
|
-
|
|
7
|
-
describe("checkDocumentStructure Agent", () => {
|
|
8
|
-
beforeAll(() => {
|
|
9
|
-
process.env.AIGNE_OBSERVABILITY_DISABLED = "true";
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
afterAll(() => {
|
|
13
|
-
delete process.env.AIGNE_OBSERVABILITY_DISABLED;
|
|
14
|
-
});
|
|
15
|
-
test("should load agent correctly with proper configuration", async () => {
|
|
16
|
-
const agent = await loadAgent(
|
|
17
|
-
join(import.meta.dirname, "../../../agents/generate/check-document-structure.yaml"),
|
|
18
|
-
{
|
|
19
|
-
model: loadModel,
|
|
20
|
-
},
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
expect(agent).toBeDefined();
|
|
24
|
-
|
|
25
|
-
// Verify agent exists and is correct type
|
|
26
|
-
expect(agent).toBeDefined();
|
|
27
|
-
expect(agent).toBeInstanceOf(AIAgent);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test("should have instructions loaded from file", async () => {
|
|
31
|
-
const agent = await loadAgent(
|
|
32
|
-
join(import.meta.dirname, "../../../agents/generate/check-document-structure.yaml"),
|
|
33
|
-
{
|
|
34
|
-
model: loadModel,
|
|
35
|
-
},
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
expect(agent).toBeDefined();
|
|
39
|
-
|
|
40
|
-
// Verify instructions are loaded
|
|
41
|
-
expect(agent.instructions).toBeDefined();
|
|
42
|
-
const instructions = await agent.instructions.build({});
|
|
43
|
-
expect(instructions.messages).toBeDefined();
|
|
44
|
-
});
|
|
45
|
-
});
|
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from "bun:test";
|
|
2
|
-
import * as fsPromises from "node:fs/promises";
|
|
3
|
-
import checkNeedGenerateStructure from "../../../agents/generate/check-need-generate-structure.mjs";
|
|
4
|
-
|
|
5
|
-
import * as preferencesUtils from "../../../utils/preferences-utils.mjs";
|
|
6
|
-
import * as utils from "../../../utils/utils.mjs";
|
|
7
|
-
|
|
8
|
-
describe("check-need-generate-structure", () => {
|
|
9
|
-
let mockOptions;
|
|
10
|
-
let originalDocumentStructure;
|
|
11
|
-
|
|
12
|
-
// Spies for external dependencies
|
|
13
|
-
let accessSpy;
|
|
14
|
-
|
|
15
|
-
// Spies for internal utils
|
|
16
|
-
let getActiveRulesForScopeSpy;
|
|
17
|
-
let getCurrentGitHeadSpy;
|
|
18
|
-
let hasFileChangesBetweenCommitsSpy;
|
|
19
|
-
let getProjectInfoSpy;
|
|
20
|
-
let loadConfigFromFileSpy;
|
|
21
|
-
let saveValueToConfigSpy;
|
|
22
|
-
|
|
23
|
-
beforeEach(() => {
|
|
24
|
-
// Set test environment variable
|
|
25
|
-
process.env.NODE_ENV = "test";
|
|
26
|
-
|
|
27
|
-
// Reset all mocks
|
|
28
|
-
mock.restore();
|
|
29
|
-
|
|
30
|
-
originalDocumentStructure = [
|
|
31
|
-
{ path: "/getting-started", title: "Getting Started" },
|
|
32
|
-
{ path: "/api", title: "API Reference" },
|
|
33
|
-
];
|
|
34
|
-
|
|
35
|
-
mockOptions = {
|
|
36
|
-
prompts: {
|
|
37
|
-
input: mock(async () => ""),
|
|
38
|
-
select: mock(async () => "generate"),
|
|
39
|
-
},
|
|
40
|
-
context: {
|
|
41
|
-
agents: {
|
|
42
|
-
generateStructure: {},
|
|
43
|
-
generateStructureWithoutTools: {},
|
|
44
|
-
},
|
|
45
|
-
invoke: mock(async () => ({
|
|
46
|
-
documentStructure: originalDocumentStructure,
|
|
47
|
-
projectName: "Test Project",
|
|
48
|
-
projectDesc: "Test Description",
|
|
49
|
-
})),
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
// Set up spies for internal utils
|
|
54
|
-
getActiveRulesForScopeSpy = spyOn(preferencesUtils, "getActiveRulesForScope").mockReturnValue(
|
|
55
|
-
[],
|
|
56
|
-
);
|
|
57
|
-
getCurrentGitHeadSpy = spyOn(utils, "getCurrentGitHead").mockReturnValue(null);
|
|
58
|
-
hasFileChangesBetweenCommitsSpy = spyOn(utils, "hasFileChangesBetweenCommits").mockReturnValue(
|
|
59
|
-
false,
|
|
60
|
-
);
|
|
61
|
-
getProjectInfoSpy = spyOn(utils, "getProjectInfo").mockResolvedValue({
|
|
62
|
-
name: "Test Project",
|
|
63
|
-
description: "Test Description",
|
|
64
|
-
fromGitHub: false,
|
|
65
|
-
});
|
|
66
|
-
loadConfigFromFileSpy = spyOn(utils, "loadConfigFromFile").mockResolvedValue({});
|
|
67
|
-
saveValueToConfigSpy = spyOn(utils, "saveValueToConfig").mockResolvedValue();
|
|
68
|
-
|
|
69
|
-
// Set up spy for external dependencies
|
|
70
|
-
accessSpy = spyOn(fsPromises, "access").mockImplementation(() =>
|
|
71
|
-
Promise.reject(new Error("File not found")),
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
// Clear prompts mock call history
|
|
75
|
-
mockOptions.prompts.input.mockClear();
|
|
76
|
-
mockOptions.context.invoke.mockClear();
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
afterEach(() => {
|
|
80
|
-
// Clean up environment variable
|
|
81
|
-
delete process.env.NODE_ENV;
|
|
82
|
-
|
|
83
|
-
// Restore all spies
|
|
84
|
-
accessSpy?.mockRestore();
|
|
85
|
-
getActiveRulesForScopeSpy?.mockRestore();
|
|
86
|
-
getCurrentGitHeadSpy?.mockRestore();
|
|
87
|
-
hasFileChangesBetweenCommitsSpy?.mockRestore();
|
|
88
|
-
getProjectInfoSpy?.mockRestore();
|
|
89
|
-
loadConfigFromFileSpy?.mockRestore();
|
|
90
|
-
saveValueToConfigSpy?.mockRestore();
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
test("should return original documentation structure when no regeneration needed", async () => {
|
|
94
|
-
// Test when no feedback and no sidebar file exists (default mock behavior)
|
|
95
|
-
const result = await checkNeedGenerateStructure(
|
|
96
|
-
{ originalDocumentStructure, docsDir: "./docs" },
|
|
97
|
-
mockOptions,
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
expect(result).toBeDefined();
|
|
101
|
-
expect(result.documentStructure).toEqual(originalDocumentStructure);
|
|
102
|
-
expect(mockOptions.context.invoke).not.toHaveBeenCalled();
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
test("should return original structure when it exists and no force regenerate", async () => {
|
|
106
|
-
const result = await checkNeedGenerateStructure(
|
|
107
|
-
{ originalDocumentStructure, docsDir: "./docs" },
|
|
108
|
-
mockOptions,
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
expect(mockOptions.prompts.input).not.toHaveBeenCalled();
|
|
112
|
-
expect(mockOptions.context.invoke).not.toHaveBeenCalled();
|
|
113
|
-
expect(result.documentStructure).toEqual(originalDocumentStructure);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
test("should handle empty user feedback input", async () => {
|
|
117
|
-
mockOptions.prompts.input.mockImplementation(async () => " ");
|
|
118
|
-
|
|
119
|
-
const result = await checkNeedGenerateStructure(
|
|
120
|
-
{ originalDocumentStructure, docsDir: "./docs" },
|
|
121
|
-
mockOptions,
|
|
122
|
-
);
|
|
123
|
-
|
|
124
|
-
expect(result.documentStructure).toEqual(originalDocumentStructure);
|
|
125
|
-
expect(mockOptions.context.invoke).not.toHaveBeenCalled();
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
test("should force regenerate when forceRegenerate is true", async () => {
|
|
129
|
-
await checkNeedGenerateStructure(
|
|
130
|
-
{ originalDocumentStructure, forceRegenerate: true, docsDir: "./docs" },
|
|
131
|
-
mockOptions,
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
expect(mockOptions.context.invoke).toHaveBeenCalled();
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
test("should include user preferences when generating", async () => {
|
|
138
|
-
const mockRules = [{ rule: "Structure rule 1" }];
|
|
139
|
-
getActiveRulesForScopeSpy.mockImplementation(() => mockRules);
|
|
140
|
-
|
|
141
|
-
await checkNeedGenerateStructure(
|
|
142
|
-
{ originalDocumentStructure, forceRegenerate: true, docsDir: "./docs" },
|
|
143
|
-
mockOptions,
|
|
144
|
-
);
|
|
145
|
-
|
|
146
|
-
expect(getActiveRulesForScopeSpy).toHaveBeenCalledWith("structure", []);
|
|
147
|
-
expect(mockOptions.context.invoke).toHaveBeenCalled();
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
test("should save project info when appropriate", async () => {
|
|
151
|
-
mockOptions.context.invoke.mockImplementation(async () => ({
|
|
152
|
-
documentStructure: originalDocumentStructure,
|
|
153
|
-
projectName: "New Project Name",
|
|
154
|
-
projectDesc: "New Description",
|
|
155
|
-
}));
|
|
156
|
-
|
|
157
|
-
const result = await checkNeedGenerateStructure(
|
|
158
|
-
{ originalDocumentStructure, forceRegenerate: true, docsDir: "./docs" },
|
|
159
|
-
mockOptions,
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
expect(saveValueToConfigSpy).toHaveBeenCalledWith("projectName", "New Project Name");
|
|
163
|
-
expect(result.projectInfoMessage).toContain("New Project Name");
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
test("should handle project info save errors", async () => {
|
|
167
|
-
loadConfigFromFileSpy.mockImplementation(async () => {
|
|
168
|
-
throw new Error("Config load failed");
|
|
169
|
-
});
|
|
170
|
-
const consoleSpy = spyOn(console, "warn").mockImplementation(() => {});
|
|
171
|
-
|
|
172
|
-
mockOptions.context.invoke.mockImplementation(async () => ({
|
|
173
|
-
documentStructure: originalDocumentStructure,
|
|
174
|
-
projectName: "New Project",
|
|
175
|
-
projectDesc: "New Description",
|
|
176
|
-
}));
|
|
177
|
-
|
|
178
|
-
const result = await checkNeedGenerateStructure(
|
|
179
|
-
{ originalDocumentStructure, forceRegenerate: true, docsDir: "./docs" },
|
|
180
|
-
mockOptions,
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
184
|
-
|
|
185
|
-
expect(result).toBeDefined();
|
|
186
|
-
expect(consoleSpy).toHaveBeenCalled();
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
test("should return correct structure when no originalDocumentStructure provided", async () => {
|
|
190
|
-
const newDocumentStructure = [{ path: "/new", title: "New Section" }];
|
|
191
|
-
|
|
192
|
-
mockOptions.context.invoke.mockImplementation(async () => ({
|
|
193
|
-
documentStructure: newDocumentStructure,
|
|
194
|
-
}));
|
|
195
|
-
|
|
196
|
-
const result = await checkNeedGenerateStructure({ docsDir: "./docs" }, mockOptions);
|
|
197
|
-
|
|
198
|
-
expect(result.documentStructure).toEqual(newDocumentStructure);
|
|
199
|
-
expect(result.originalDocumentStructure).toEqual(newDocumentStructure);
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
test("should clear feedback in result when regenerating", async () => {
|
|
203
|
-
const result = await checkNeedGenerateStructure(
|
|
204
|
-
{
|
|
205
|
-
originalDocumentStructure,
|
|
206
|
-
forceRegenerate: true,
|
|
207
|
-
feedback: "some feedback",
|
|
208
|
-
docsDir: "./docs",
|
|
209
|
-
},
|
|
210
|
-
mockOptions,
|
|
211
|
-
);
|
|
212
|
-
|
|
213
|
-
expect(result.feedback).toBe("");
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
test("should pass through additional parameters when regenerating", async () => {
|
|
217
|
-
const additionalParams = {
|
|
218
|
-
customParam1: "value1",
|
|
219
|
-
customParam2: "value2",
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
await checkNeedGenerateStructure(
|
|
223
|
-
{
|
|
224
|
-
originalDocumentStructure,
|
|
225
|
-
forceRegenerate: true,
|
|
226
|
-
docsDir: "./docs",
|
|
227
|
-
...additionalParams,
|
|
228
|
-
},
|
|
229
|
-
mockOptions,
|
|
230
|
-
);
|
|
231
|
-
|
|
232
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
233
|
-
mockOptions.context.agents.generateStructureWithoutTools,
|
|
234
|
-
expect.objectContaining(additionalParams),
|
|
235
|
-
);
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
test("should return userDeferred when user selects 'later' and no originalDocumentStructure exists", async () => {
|
|
239
|
-
mockOptions.prompts.select.mockImplementation(async () => "later");
|
|
240
|
-
|
|
241
|
-
const result = await checkNeedGenerateStructure({ docsDir: "./docs" }, mockOptions);
|
|
242
|
-
|
|
243
|
-
expect(result).toBeDefined();
|
|
244
|
-
expect(result.userDeferred).toBe(true);
|
|
245
|
-
expect(result.documentStructure).toBe(null);
|
|
246
|
-
|
|
247
|
-
expect(mockOptions.prompts.select).toHaveBeenCalled();
|
|
248
|
-
expect(mockOptions.context.invoke).not.toHaveBeenCalled();
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
test("should use generateStructure agent when isLargeContext is true", async () => {
|
|
252
|
-
await checkNeedGenerateStructure(
|
|
253
|
-
{ originalDocumentStructure, forceRegenerate: true, isLargeContext: true, docsDir: "./docs" },
|
|
254
|
-
mockOptions,
|
|
255
|
-
);
|
|
256
|
-
|
|
257
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
258
|
-
mockOptions.context.agents.generateStructure,
|
|
259
|
-
expect.any(Object),
|
|
260
|
-
);
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
test("should use generateStructureWithoutTools agent when isLargeContext is false", async () => {
|
|
264
|
-
await checkNeedGenerateStructure(
|
|
265
|
-
{
|
|
266
|
-
originalDocumentStructure,
|
|
267
|
-
forceRegenerate: true,
|
|
268
|
-
isLargeContext: false,
|
|
269
|
-
docsDir: "./docs",
|
|
270
|
-
},
|
|
271
|
-
mockOptions,
|
|
272
|
-
);
|
|
273
|
-
|
|
274
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
275
|
-
mockOptions.context.agents.generateStructureWithoutTools,
|
|
276
|
-
expect.any(Object),
|
|
277
|
-
);
|
|
278
|
-
});
|
|
279
|
-
});
|