@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,478 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from "bun:test";
|
|
2
|
-
import * as yaml from "yaml";
|
|
3
|
-
import checkFeedbackRefiner from "../../../agents/utils/check-feedback-refiner.mjs";
|
|
4
|
-
|
|
5
|
-
import * as preferencesUtils from "../../../utils/preferences-utils.mjs";
|
|
6
|
-
|
|
7
|
-
describe("check-feedback-refiner", () => {
|
|
8
|
-
let mockOptions;
|
|
9
|
-
|
|
10
|
-
// Spies for external dependencies
|
|
11
|
-
let yamlStringifySpy;
|
|
12
|
-
|
|
13
|
-
// Spies for internal utils
|
|
14
|
-
let readPreferencesSpy;
|
|
15
|
-
let addPreferenceRuleSpy;
|
|
16
|
-
let consoleErrorSpy;
|
|
17
|
-
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
mock.restore();
|
|
20
|
-
|
|
21
|
-
mockOptions = {
|
|
22
|
-
context: {
|
|
23
|
-
agents: {
|
|
24
|
-
feedbackRefiner: { mockAgent: true },
|
|
25
|
-
},
|
|
26
|
-
invoke: mock(async () => ({ refined: "feedback" })),
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// Set up spies for internal utils
|
|
31
|
-
readPreferencesSpy = spyOn(preferencesUtils, "readPreferences").mockReturnValue({
|
|
32
|
-
rules: [],
|
|
33
|
-
});
|
|
34
|
-
addPreferenceRuleSpy = spyOn(preferencesUtils, "addPreferenceRule").mockReturnValue({
|
|
35
|
-
id: "pref_123",
|
|
36
|
-
});
|
|
37
|
-
consoleErrorSpy = spyOn(console, "error").mockImplementation(() => {});
|
|
38
|
-
|
|
39
|
-
// Set up spy for external dependencies
|
|
40
|
-
yamlStringifySpy = spyOn(yaml, "stringify").mockImplementation(() => "mocked yaml");
|
|
41
|
-
|
|
42
|
-
// Clear context mock call history
|
|
43
|
-
mockOptions.context.invoke.mockClear();
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
afterEach(() => {
|
|
47
|
-
// Restore all spies
|
|
48
|
-
yamlStringifySpy?.mockRestore();
|
|
49
|
-
readPreferencesSpy?.mockRestore();
|
|
50
|
-
addPreferenceRuleSpy?.mockRestore();
|
|
51
|
-
consoleErrorSpy?.mockRestore();
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
// BASIC FUNCTIONALITY TESTS
|
|
55
|
-
test("should return empty object when no feedback provided", async () => {
|
|
56
|
-
const result = await checkFeedbackRefiner(
|
|
57
|
-
{
|
|
58
|
-
feedback: "",
|
|
59
|
-
documentStructureFeedback: "",
|
|
60
|
-
stage: "structure",
|
|
61
|
-
selectedPaths: ["/doc1"],
|
|
62
|
-
},
|
|
63
|
-
mockOptions,
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
expect(result).toEqual({});
|
|
67
|
-
expect(mockOptions.context.invoke).not.toHaveBeenCalled();
|
|
68
|
-
expect(readPreferencesSpy).not.toHaveBeenCalled();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test("should return empty object when feedback is null/undefined", async () => {
|
|
72
|
-
const result = await checkFeedbackRefiner(
|
|
73
|
-
{
|
|
74
|
-
feedback: null,
|
|
75
|
-
documentStructureFeedback: undefined,
|
|
76
|
-
stage: "structure",
|
|
77
|
-
selectedPaths: ["/doc1"],
|
|
78
|
-
},
|
|
79
|
-
mockOptions,
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
expect(result).toEqual({});
|
|
83
|
-
expect(mockOptions.context.invoke).not.toHaveBeenCalled();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
test("should process feedback when provided", async () => {
|
|
87
|
-
mockOptions.context.invoke.mockResolvedValue({
|
|
88
|
-
refined: "refined feedback",
|
|
89
|
-
save: false,
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
const result = await checkFeedbackRefiner(
|
|
93
|
-
{
|
|
94
|
-
feedback: "User feedback here",
|
|
95
|
-
stage: "structure",
|
|
96
|
-
selectedPaths: ["/doc1", "/doc2"],
|
|
97
|
-
},
|
|
98
|
-
mockOptions,
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
expect(readPreferencesSpy).toHaveBeenCalled();
|
|
102
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
103
|
-
{ mockAgent: true },
|
|
104
|
-
expect.objectContaining({
|
|
105
|
-
feedback: "User feedback here",
|
|
106
|
-
stage: "structure",
|
|
107
|
-
paths: ["/doc1", "/doc2"],
|
|
108
|
-
existingPreferences: "",
|
|
109
|
-
}),
|
|
110
|
-
);
|
|
111
|
-
expect(result).toEqual({
|
|
112
|
-
refined: "refined feedback",
|
|
113
|
-
save: false,
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
test("should process documentStructureFeedback when feedback is empty", async () => {
|
|
118
|
-
mockOptions.context.invoke.mockResolvedValue({
|
|
119
|
-
refined: "refined structure feedback",
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
const result = await checkFeedbackRefiner(
|
|
123
|
-
{
|
|
124
|
-
feedback: "",
|
|
125
|
-
documentStructureFeedback: "Structure feedback here",
|
|
126
|
-
stage: "structure",
|
|
127
|
-
selectedPaths: ["/doc1"],
|
|
128
|
-
},
|
|
129
|
-
mockOptions,
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
133
|
-
{ mockAgent: true },
|
|
134
|
-
expect.objectContaining({
|
|
135
|
-
feedback: "Structure feedback here",
|
|
136
|
-
}),
|
|
137
|
-
);
|
|
138
|
-
expect(result.refined).toBe("refined structure feedback");
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
test("should prefer feedback over documentStructureFeedback when both provided", async () => {
|
|
142
|
-
mockOptions.context.invoke.mockResolvedValue({ refined: "result" });
|
|
143
|
-
|
|
144
|
-
await checkFeedbackRefiner(
|
|
145
|
-
{
|
|
146
|
-
feedback: "Main feedback",
|
|
147
|
-
documentStructureFeedback: "Structure feedback",
|
|
148
|
-
stage: "structure",
|
|
149
|
-
selectedPaths: ["/doc1"],
|
|
150
|
-
},
|
|
151
|
-
mockOptions,
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
155
|
-
{ mockAgent: true },
|
|
156
|
-
expect.objectContaining({
|
|
157
|
-
feedback: "Main feedback",
|
|
158
|
-
}),
|
|
159
|
-
);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
// PREFERENCES HANDLING TESTS
|
|
163
|
-
test("should include existing active preferences in context", async () => {
|
|
164
|
-
readPreferencesSpy.mockReturnValue({
|
|
165
|
-
rules: [
|
|
166
|
-
{ id: "rule1", active: true, rule: "Active rule 1" },
|
|
167
|
-
{ id: "rule2", active: false, rule: "Inactive rule" },
|
|
168
|
-
{ id: "rule3", active: true, rule: "Active rule 2" },
|
|
169
|
-
],
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
yamlStringifySpy.mockReturnValue("yaml_preferences");
|
|
173
|
-
|
|
174
|
-
await checkFeedbackRefiner(
|
|
175
|
-
{
|
|
176
|
-
feedback: "Test feedback",
|
|
177
|
-
stage: "structure",
|
|
178
|
-
selectedPaths: ["/doc1"],
|
|
179
|
-
},
|
|
180
|
-
mockOptions,
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
expect(yamlStringifySpy).toHaveBeenCalledWith(
|
|
184
|
-
{
|
|
185
|
-
rules: [
|
|
186
|
-
{ id: "rule1", active: true, rule: "Active rule 1" },
|
|
187
|
-
{ id: "rule3", active: true, rule: "Active rule 2" },
|
|
188
|
-
],
|
|
189
|
-
},
|
|
190
|
-
{ indent: 2 },
|
|
191
|
-
);
|
|
192
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
193
|
-
{ mockAgent: true },
|
|
194
|
-
expect.objectContaining({
|
|
195
|
-
existingPreferences: "yaml_preferences",
|
|
196
|
-
}),
|
|
197
|
-
);
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
test("should handle empty preferences gracefully", async () => {
|
|
201
|
-
readPreferencesSpy.mockReturnValue({ rules: [] });
|
|
202
|
-
|
|
203
|
-
await checkFeedbackRefiner(
|
|
204
|
-
{
|
|
205
|
-
feedback: "Test feedback",
|
|
206
|
-
stage: "structure",
|
|
207
|
-
selectedPaths: ["/doc1"],
|
|
208
|
-
},
|
|
209
|
-
mockOptions,
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
213
|
-
{ mockAgent: true },
|
|
214
|
-
expect.objectContaining({
|
|
215
|
-
existingPreferences: "",
|
|
216
|
-
}),
|
|
217
|
-
);
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
test("should handle missing rules property in preferences", async () => {
|
|
221
|
-
readPreferencesSpy.mockReturnValue({});
|
|
222
|
-
|
|
223
|
-
await checkFeedbackRefiner(
|
|
224
|
-
{
|
|
225
|
-
feedback: "Test feedback",
|
|
226
|
-
stage: "structure",
|
|
227
|
-
selectedPaths: ["/doc1"],
|
|
228
|
-
},
|
|
229
|
-
mockOptions,
|
|
230
|
-
);
|
|
231
|
-
|
|
232
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
233
|
-
{ mockAgent: true },
|
|
234
|
-
expect.objectContaining({
|
|
235
|
-
existingPreferences: "",
|
|
236
|
-
}),
|
|
237
|
-
);
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
// PREFERENCE SAVING TESTS
|
|
241
|
-
test("should save preference when result indicates save is needed", async () => {
|
|
242
|
-
mockOptions.context.invoke.mockResolvedValue({
|
|
243
|
-
save: true,
|
|
244
|
-
scope: "structure",
|
|
245
|
-
rule: "New preference rule",
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
addPreferenceRuleSpy.mockReturnValue({ id: "pref_456" });
|
|
249
|
-
|
|
250
|
-
const result = await checkFeedbackRefiner(
|
|
251
|
-
{
|
|
252
|
-
feedback: "Save this feedback",
|
|
253
|
-
stage: "structure",
|
|
254
|
-
selectedPaths: ["/doc1", "/doc2"],
|
|
255
|
-
},
|
|
256
|
-
mockOptions,
|
|
257
|
-
);
|
|
258
|
-
|
|
259
|
-
expect(addPreferenceRuleSpy).toHaveBeenCalledWith(
|
|
260
|
-
expect.objectContaining({
|
|
261
|
-
save: true,
|
|
262
|
-
scope: "structure",
|
|
263
|
-
rule: "New preference rule",
|
|
264
|
-
}),
|
|
265
|
-
"Save this feedback",
|
|
266
|
-
["/doc1", "/doc2"],
|
|
267
|
-
);
|
|
268
|
-
|
|
269
|
-
expect(result.savedPreference).toEqual({
|
|
270
|
-
id: "pref_456",
|
|
271
|
-
saved: true,
|
|
272
|
-
});
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
test("should not save preference when result indicates save is false", async () => {
|
|
276
|
-
mockOptions.context.invoke.mockResolvedValue({
|
|
277
|
-
save: false,
|
|
278
|
-
refined: "Just refined",
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
const result = await checkFeedbackRefiner(
|
|
282
|
-
{
|
|
283
|
-
feedback: "Don't save this",
|
|
284
|
-
stage: "structure",
|
|
285
|
-
selectedPaths: ["/doc1"],
|
|
286
|
-
},
|
|
287
|
-
mockOptions,
|
|
288
|
-
);
|
|
289
|
-
|
|
290
|
-
expect(addPreferenceRuleSpy).not.toHaveBeenCalled();
|
|
291
|
-
expect(result.savedPreference).toBeUndefined();
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
test("should not save preference when result has no save property", async () => {
|
|
295
|
-
mockOptions.context.invoke.mockResolvedValue({
|
|
296
|
-
refined: "Just refined",
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
const result = await checkFeedbackRefiner(
|
|
300
|
-
{
|
|
301
|
-
feedback: "No save property",
|
|
302
|
-
stage: "structure",
|
|
303
|
-
selectedPaths: ["/doc1"],
|
|
304
|
-
},
|
|
305
|
-
mockOptions,
|
|
306
|
-
);
|
|
307
|
-
|
|
308
|
-
expect(addPreferenceRuleSpy).not.toHaveBeenCalled();
|
|
309
|
-
expect(result.savedPreference).toBeUndefined();
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
test("should handle preference save errors gracefully", async () => {
|
|
313
|
-
mockOptions.context.invoke.mockResolvedValue({
|
|
314
|
-
save: true,
|
|
315
|
-
rule: "Failed save rule",
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
addPreferenceRuleSpy.mockImplementation(() => {
|
|
319
|
-
throw new Error("Save failed");
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
const result = await checkFeedbackRefiner(
|
|
323
|
-
{
|
|
324
|
-
feedback: "This will fail to save",
|
|
325
|
-
stage: "structure",
|
|
326
|
-
selectedPaths: ["/doc1"],
|
|
327
|
-
},
|
|
328
|
-
mockOptions,
|
|
329
|
-
);
|
|
330
|
-
|
|
331
|
-
expect(consoleErrorSpy).toHaveBeenCalledWith(
|
|
332
|
-
"Failed to save user preference rule:",
|
|
333
|
-
"Save failed",
|
|
334
|
-
"\nFeedback:",
|
|
335
|
-
"This will fail to save",
|
|
336
|
-
);
|
|
337
|
-
|
|
338
|
-
expect(result.savedPreference).toEqual({
|
|
339
|
-
saved: false,
|
|
340
|
-
error: "Save failed",
|
|
341
|
-
});
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
test("should use documentStructureFeedback for saving when feedback is empty", async () => {
|
|
345
|
-
mockOptions.context.invoke.mockResolvedValue({
|
|
346
|
-
save: true,
|
|
347
|
-
rule: "Structure rule",
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
await checkFeedbackRefiner(
|
|
351
|
-
{
|
|
352
|
-
feedback: "",
|
|
353
|
-
documentStructureFeedback: "Structure feedback to save",
|
|
354
|
-
stage: "structure",
|
|
355
|
-
selectedPaths: ["/doc1"],
|
|
356
|
-
},
|
|
357
|
-
mockOptions,
|
|
358
|
-
);
|
|
359
|
-
|
|
360
|
-
expect(addPreferenceRuleSpy).toHaveBeenCalledWith(
|
|
361
|
-
expect.anything(),
|
|
362
|
-
"Structure feedback to save",
|
|
363
|
-
["/doc1"],
|
|
364
|
-
);
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
// PARAMETER PASSING TESTS
|
|
368
|
-
test("should pass all parameters correctly to feedbackRefiner", async () => {
|
|
369
|
-
readPreferencesSpy.mockReturnValue({
|
|
370
|
-
rules: [{ id: "rule1", active: true, rule: "Test rule" }],
|
|
371
|
-
});
|
|
372
|
-
yamlStringifySpy.mockReturnValue("test_yaml");
|
|
373
|
-
|
|
374
|
-
await checkFeedbackRefiner(
|
|
375
|
-
{
|
|
376
|
-
feedback: "Detailed feedback",
|
|
377
|
-
stage: "detail",
|
|
378
|
-
selectedPaths: ["/api/auth", "/api/users"],
|
|
379
|
-
},
|
|
380
|
-
mockOptions,
|
|
381
|
-
);
|
|
382
|
-
|
|
383
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
384
|
-
{ mockAgent: true },
|
|
385
|
-
{
|
|
386
|
-
feedback: "Detailed feedback",
|
|
387
|
-
stage: "detail",
|
|
388
|
-
paths: ["/api/auth", "/api/users"],
|
|
389
|
-
existingPreferences: "test_yaml",
|
|
390
|
-
},
|
|
391
|
-
);
|
|
392
|
-
});
|
|
393
|
-
|
|
394
|
-
test("should handle undefined selectedPaths", async () => {
|
|
395
|
-
await checkFeedbackRefiner(
|
|
396
|
-
{
|
|
397
|
-
feedback: "Test feedback",
|
|
398
|
-
stage: "structure",
|
|
399
|
-
selectedPaths: undefined,
|
|
400
|
-
},
|
|
401
|
-
mockOptions,
|
|
402
|
-
);
|
|
403
|
-
|
|
404
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
405
|
-
{ mockAgent: true },
|
|
406
|
-
expect.objectContaining({
|
|
407
|
-
paths: undefined,
|
|
408
|
-
}),
|
|
409
|
-
);
|
|
410
|
-
});
|
|
411
|
-
|
|
412
|
-
test("should handle empty selectedPaths array", async () => {
|
|
413
|
-
await checkFeedbackRefiner(
|
|
414
|
-
{
|
|
415
|
-
feedback: "Test feedback",
|
|
416
|
-
stage: "structure",
|
|
417
|
-
selectedPaths: [],
|
|
418
|
-
},
|
|
419
|
-
mockOptions,
|
|
420
|
-
);
|
|
421
|
-
|
|
422
|
-
expect(mockOptions.context.invoke).toHaveBeenCalledWith(
|
|
423
|
-
{ mockAgent: true },
|
|
424
|
-
expect.objectContaining({
|
|
425
|
-
paths: [],
|
|
426
|
-
}),
|
|
427
|
-
);
|
|
428
|
-
});
|
|
429
|
-
|
|
430
|
-
// EDGE CASES
|
|
431
|
-
test("should handle context invoke errors gracefully", async () => {
|
|
432
|
-
mockOptions.context.invoke.mockRejectedValue(new Error("Context invoke failed"));
|
|
433
|
-
|
|
434
|
-
await expect(
|
|
435
|
-
checkFeedbackRefiner(
|
|
436
|
-
{
|
|
437
|
-
feedback: "Test feedback",
|
|
438
|
-
stage: "structure",
|
|
439
|
-
selectedPaths: ["/doc1"],
|
|
440
|
-
},
|
|
441
|
-
mockOptions,
|
|
442
|
-
),
|
|
443
|
-
).rejects.toThrow("Context invoke failed");
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
test("should preserve result structure when saving preference", async () => {
|
|
447
|
-
mockOptions.context.invoke.mockResolvedValue({
|
|
448
|
-
save: true,
|
|
449
|
-
refined: "refined feedback",
|
|
450
|
-
scope: "structure",
|
|
451
|
-
rule: "New rule",
|
|
452
|
-
customProperty: "custom value",
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
addPreferenceRuleSpy.mockReturnValue({ id: "pref_789" });
|
|
456
|
-
|
|
457
|
-
const result = await checkFeedbackRefiner(
|
|
458
|
-
{
|
|
459
|
-
feedback: "Test feedback",
|
|
460
|
-
stage: "structure",
|
|
461
|
-
selectedPaths: ["/doc1"],
|
|
462
|
-
},
|
|
463
|
-
mockOptions,
|
|
464
|
-
);
|
|
465
|
-
|
|
466
|
-
expect(result).toEqual({
|
|
467
|
-
save: true,
|
|
468
|
-
refined: "refined feedback",
|
|
469
|
-
scope: "structure",
|
|
470
|
-
rule: "New rule",
|
|
471
|
-
customProperty: "custom value",
|
|
472
|
-
savedPreference: {
|
|
473
|
-
id: "pref_789",
|
|
474
|
-
saved: true,
|
|
475
|
-
},
|
|
476
|
-
});
|
|
477
|
-
});
|
|
478
|
-
});
|