appium-mcp 1.82.2 → 1.84.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +1 -0
- package/dist/create-server.d.ts.map +1 -1
- package/dist/create-server.js +4 -0
- package/dist/create-server.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -4
- package/dist/server.js.map +1 -1
- package/dist/tests/create-server.test.js +8 -0
- package/dist/tests/create-server.test.js.map +1 -1
- package/dist/tests/tools/evidence.test.d.ts +2 -0
- package/dist/tests/tools/evidence.test.d.ts.map +1 -0
- package/dist/tests/tools/evidence.test.js +158 -0
- package/dist/tests/tools/evidence.test.js.map +1 -0
- package/dist/tests/utils/paths.test.js +5 -6
- package/dist/tests/utils/paths.test.js.map +1 -1
- package/dist/tools/evidence.d.ts +82 -0
- package/dist/tools/evidence.d.ts.map +1 -0
- package/dist/tools/evidence.js +124 -0
- package/dist/tools/evidence.js.map +1 -0
- package/dist/tools/gestures/gesture.d.ts.map +1 -1
- package/dist/tools/gestures/gesture.js +47 -25
- package/dist/tools/gestures/gesture.js.map +1 -1
- package/dist/tools/interactions/find.d.ts.map +1 -1
- package/dist/tools/interactions/find.js +27 -4
- package/dist/tools/interactions/find.js.map +1 -1
- package/package.json +8 -19
- package/server.json +2 -2
- package/src/create-server.ts +4 -0
- package/src/server.ts +9 -4
- package/src/tools/evidence.ts +198 -0
- package/src/tools/gestures/gesture.ts +63 -26
- package/src/tools/interactions/find.ts +40 -6
- package/dist/scripts/eval-documentation-rag.d.ts +0 -50
- package/dist/scripts/eval-documentation-rag.d.ts.map +0 -1
- package/dist/scripts/eval-documentation-rag.js +0 -287
- package/dist/scripts/eval-documentation-rag.js.map +0 -1
- package/dist/scripts/generate-embeddings-cache.d.ts +0 -13
- package/dist/scripts/generate-embeddings-cache.d.ts.map +0 -1
- package/dist/scripts/generate-embeddings-cache.js +0 -24
- package/dist/scripts/generate-embeddings-cache.js.map +0 -1
- package/dist/scripts/rag-eval-dataset.json +0 -516
- package/dist/scripts/simple-index-documentation.d.ts +0 -21
- package/dist/scripts/simple-index-documentation.d.ts.map +0 -1
- package/dist/scripts/simple-index-documentation.js +0 -77
- package/dist/scripts/simple-index-documentation.js.map +0 -1
- package/dist/scripts/simple-query-documentation.d.ts +0 -13
- package/dist/scripts/simple-query-documentation.d.ts.map +0 -1
- package/dist/scripts/simple-query-documentation.js +0 -52
- package/dist/scripts/simple-query-documentation.js.map +0 -1
- package/dist/tests/tools/documentation/appium-skills.test.d.ts +0 -2
- package/dist/tests/tools/documentation/appium-skills.test.d.ts.map +0 -1
- package/dist/tests/tools/documentation/appium-skills.test.js +0 -106
- package/dist/tests/tools/documentation/appium-skills.test.js.map +0 -1
- package/dist/tests/tools/documentation/plugin.test.d.ts +0 -2
- package/dist/tests/tools/documentation/plugin.test.d.ts.map +0 -1
- package/dist/tests/tools/documentation/plugin.test.js +0 -34
- package/dist/tests/tools/documentation/plugin.test.js.map +0 -1
- package/dist/tests/tools/documentation/simple-pdf-indexer.test.d.ts +0 -2
- package/dist/tests/tools/documentation/simple-pdf-indexer.test.d.ts.map +0 -1
- package/dist/tests/tools/documentation/simple-pdf-indexer.test.js +0 -46
- package/dist/tests/tools/documentation/simple-pdf-indexer.test.js.map +0 -1
- package/dist/tools/documentation/answer-appium.d.ts +0 -8
- package/dist/tools/documentation/answer-appium.d.ts.map +0 -1
- package/dist/tools/documentation/answer-appium.js +0 -38
- package/dist/tools/documentation/answer-appium.js.map +0 -1
- package/dist/tools/documentation/appium-skills.d.ts +0 -5
- package/dist/tools/documentation/appium-skills.d.ts.map +0 -1
- package/dist/tools/documentation/appium-skills.js +0 -168
- package/dist/tools/documentation/appium-skills.js.map +0 -1
- package/dist/tools/documentation/index.d.ts +0 -29
- package/dist/tools/documentation/index.d.ts.map +0 -1
- package/dist/tools/documentation/index.js +0 -66
- package/dist/tools/documentation/index.js.map +0 -1
- package/dist/tools/documentation/markdown-header-splitter.d.ts +0 -32
- package/dist/tools/documentation/markdown-header-splitter.d.ts.map +0 -1
- package/dist/tools/documentation/markdown-header-splitter.js +0 -180
- package/dist/tools/documentation/markdown-header-splitter.js.map +0 -1
- package/dist/tools/documentation/plugin.d.ts +0 -14
- package/dist/tools/documentation/plugin.d.ts.map +0 -1
- package/dist/tools/documentation/plugin.js +0 -19
- package/dist/tools/documentation/plugin.js.map +0 -1
- package/dist/tools/documentation/reasoning-rag.d.ts +0 -89
- package/dist/tools/documentation/reasoning-rag.d.ts.map +0 -1
- package/dist/tools/documentation/reasoning-rag.js +0 -282
- package/dist/tools/documentation/reasoning-rag.js.map +0 -1
- package/dist/tools/documentation/sentence-transformers-embeddings.d.ts +0 -40
- package/dist/tools/documentation/sentence-transformers-embeddings.d.ts.map +0 -1
- package/dist/tools/documentation/sentence-transformers-embeddings.js +0 -119
- package/dist/tools/documentation/sentence-transformers-embeddings.js.map +0 -1
- package/dist/tools/documentation/simple-pdf-indexer.d.ts +0 -47
- package/dist/tools/documentation/simple-pdf-indexer.d.ts.map +0 -1
- package/dist/tools/documentation/simple-pdf-indexer.js +0 -572
- package/dist/tools/documentation/simple-pdf-indexer.js.map +0 -1
- package/dist/tools/documentation/uploads/documents.json +0 -1
- package/dist/tools/documentation/uploads/embeddings-Xenova-bge-small-en-v1.5.json +0 -1
- package/scripts/setup-submodules-sparse.sh +0 -53
- package/scripts/update-submodules.sh +0 -14
- package/scripts/zip-assets.mjs +0 -55
- package/src/resources/submodules.zip +0 -0
- package/src/scripts/eval-documentation-rag.ts +0 -433
- package/src/scripts/generate-embeddings-cache.ts +0 -24
- package/src/scripts/rag-eval-dataset.json +0 -516
- package/src/scripts/simple-index-documentation.ts +0 -93
- package/src/scripts/simple-query-documentation.ts +0 -61
- package/src/tools/documentation/answer-appium.ts +0 -47
- package/src/tools/documentation/appium-skills.ts +0 -244
- package/src/tools/documentation/index.ts +0 -99
- package/src/tools/documentation/markdown-header-splitter.ts +0 -209
- package/src/tools/documentation/plugin.ts +0 -21
- package/src/tools/documentation/reasoning-rag.ts +0 -438
- package/src/tools/documentation/sentence-transformers-embeddings.ts +0 -152
- package/src/tools/documentation/simple-pdf-indexer.ts +0 -755
- package/src/tools/documentation/uploads/documents.json +0 -1
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Simple Documentation Query Script
|
|
4
|
-
*
|
|
5
|
-
* This script is used to test the answerAppiumQuery function
|
|
6
|
-
* by querying the indexed Markdown documentation in the in-memory vector store.
|
|
7
|
-
*
|
|
8
|
-
* Usage: npm run simple-query-docs "your query here"
|
|
9
|
-
*
|
|
10
|
-
* Example: npm run simple-query-docs "What is Appium?"
|
|
11
|
-
*/
|
|
12
|
-
import { answerAppiumQuery } from '../tools/documentation/index.js';
|
|
13
|
-
/**
|
|
14
|
-
* Main function to handle the documentation query process
|
|
15
|
-
*/
|
|
16
|
-
async function main() {
|
|
17
|
-
console.log('Using sentence-transformers embeddings (no API key required)');
|
|
18
|
-
console.log('Note: This script will return relevant documentation chunks without generating responses');
|
|
19
|
-
console.log('process.argv:', process.argv);
|
|
20
|
-
const args = process.argv.slice(2);
|
|
21
|
-
console.log('args:', args);
|
|
22
|
-
let query;
|
|
23
|
-
if (args.length > 0) {
|
|
24
|
-
query = args.join(' ');
|
|
25
|
-
console.log(`Using provided query: "${query}"`);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
query = 'What is Appium and how do I get started?';
|
|
29
|
-
console.log(`No query provided, using default query: "${query}"`);
|
|
30
|
-
}
|
|
31
|
-
console.log(`Querying in-memory vector store with: "${query}"`);
|
|
32
|
-
try {
|
|
33
|
-
const result = await answerAppiumQuery({
|
|
34
|
-
query,
|
|
35
|
-
});
|
|
36
|
-
console.log('\n--- ANSWER ---\n');
|
|
37
|
-
console.log(result.answer);
|
|
38
|
-
if (result.sources && result.sources.length > 0) {
|
|
39
|
-
console.log('\n--- SOURCES ---\n');
|
|
40
|
-
result.sources.forEach((source) => {
|
|
41
|
-
console.log(`- ${source}`);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
process.exit(0);
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
console.error('Query failed:', error);
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
void main();
|
|
52
|
-
//# sourceMappingURL=simple-query-documentation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simple-query-documentation.js","sourceRoot":"","sources":["../../src/scripts/simple-query-documentation.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CACT,0FAA0F,CAC3F,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,IAAI,KAAa,CAAC;IAElB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,GAAG,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,0CAA0C,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,4CAA4C,KAAK,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,KAAK,GAAG,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;YACrC,KAAK;SACN,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,EAAE;gBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,IAAI,EAAE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"appium-skills.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/appium-skills.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect, jest } from '@jest/globals';
|
|
2
|
-
jest.unstable_mockModule('appium-uiautomator2-driver', () => ({
|
|
3
|
-
AndroidUiautomator2Driver: class {
|
|
4
|
-
},
|
|
5
|
-
}));
|
|
6
|
-
jest.unstable_mockModule('appium-xcuitest-driver', () => ({
|
|
7
|
-
XCUITestDriver: class {
|
|
8
|
-
},
|
|
9
|
-
}));
|
|
10
|
-
jest.unstable_mockModule('webdriver', () => ({ default: {} }));
|
|
11
|
-
await jest.unstable_mockModule('../../../logger', () => ({
|
|
12
|
-
default: { debug: () => { }, info: () => { }, warn: () => { }, error: () => { } },
|
|
13
|
-
}));
|
|
14
|
-
const { appiumSkillsTool } = await import('../../../tools/documentation/appium-skills.js');
|
|
15
|
-
function getRegisteredTool() {
|
|
16
|
-
return appiumSkillsTool;
|
|
17
|
-
}
|
|
18
|
-
async function runTool(args) {
|
|
19
|
-
const tool = getRegisteredTool();
|
|
20
|
-
const result = await tool.execute(args, {});
|
|
21
|
-
expect(tool.name).toBe('appium_skills');
|
|
22
|
-
expect(result?.content?.[0]?.type).toBe('text');
|
|
23
|
-
return result.content[0].text;
|
|
24
|
-
}
|
|
25
|
-
function expectOrderedSkills(text, skills) {
|
|
26
|
-
expect(text).toContain('Recommended skill order:');
|
|
27
|
-
for (const [index, skill] of skills.entries()) {
|
|
28
|
-
expect(text).toContain(`${index + 1}. ${skill}`);
|
|
29
|
-
expect(text).toContain(`--- skills/${skill}/SKILL.md ---`);
|
|
30
|
-
}
|
|
31
|
-
expect(text).toContain('--- AGENTS.md ---');
|
|
32
|
-
}
|
|
33
|
-
describe('appium_skills tool contract', () => {
|
|
34
|
-
test('returns Android UiAutomator2 setup skills in expected order', async () => {
|
|
35
|
-
const text = await runTool({
|
|
36
|
-
platform: 'android',
|
|
37
|
-
driver: 'uiautomator2',
|
|
38
|
-
mode: 'setup',
|
|
39
|
-
});
|
|
40
|
-
expectOrderedSkills(text, [
|
|
41
|
-
'environment-setup-node',
|
|
42
|
-
'environment-setup-android',
|
|
43
|
-
'environment-setup-uiautomator2',
|
|
44
|
-
]);
|
|
45
|
-
expect(text).toContain('Prompt template:');
|
|
46
|
-
});
|
|
47
|
-
test('returns iOS XCUITest real-device setup skills including real-device config', async () => {
|
|
48
|
-
const text = await runTool({
|
|
49
|
-
platform: 'ios',
|
|
50
|
-
driver: 'xcuitest',
|
|
51
|
-
mode: 'setup',
|
|
52
|
-
realDevice: true,
|
|
53
|
-
});
|
|
54
|
-
expectOrderedSkills(text, [
|
|
55
|
-
'environment-setup-node',
|
|
56
|
-
'environment-setup-xcuitest',
|
|
57
|
-
'xcuitest-real-device-config',
|
|
58
|
-
]);
|
|
59
|
-
expect(text).toContain('Real device: yes');
|
|
60
|
-
});
|
|
61
|
-
test('returns troubleshooting flow with appium-troubleshooting skill', async () => {
|
|
62
|
-
const text = await runTool({
|
|
63
|
-
platform: 'android',
|
|
64
|
-
driver: 'uiautomator2',
|
|
65
|
-
mode: 'troubleshoot',
|
|
66
|
-
});
|
|
67
|
-
expectOrderedSkills(text, [
|
|
68
|
-
'environment-setup-node',
|
|
69
|
-
'environment-setup-android',
|
|
70
|
-
'environment-setup-uiautomator2',
|
|
71
|
-
'appium-troubleshooting',
|
|
72
|
-
]);
|
|
73
|
-
expect(text).toContain('Prompt template:');
|
|
74
|
-
});
|
|
75
|
-
test('includes optional skills only when applicable and reports ignored ones', async () => {
|
|
76
|
-
const androidText = await runTool({
|
|
77
|
-
platform: 'android',
|
|
78
|
-
driver: 'espresso',
|
|
79
|
-
mode: 'setup',
|
|
80
|
-
includeOptional: ['ffmpeg', 'bundletool'],
|
|
81
|
-
});
|
|
82
|
-
expectOrderedSkills(androidText, [
|
|
83
|
-
'environment-setup-node',
|
|
84
|
-
'environment-setup-android',
|
|
85
|
-
'environment-setup-espresso',
|
|
86
|
-
'environment-setup-ffmpeg',
|
|
87
|
-
'environment-setup-bundletool',
|
|
88
|
-
]);
|
|
89
|
-
const iosText = await runTool({
|
|
90
|
-
platform: 'ios',
|
|
91
|
-
driver: 'xcuitest',
|
|
92
|
-
mode: 'setup',
|
|
93
|
-
includeOptional: ['bundletool'],
|
|
94
|
-
});
|
|
95
|
-
expect(iosText).toContain('Ignored optional skills: bundletool');
|
|
96
|
-
});
|
|
97
|
-
test('rejects unsupported troubleshooting driver path', async () => {
|
|
98
|
-
const tool = getRegisteredTool();
|
|
99
|
-
await expect(tool.execute({
|
|
100
|
-
platform: 'android',
|
|
101
|
-
driver: 'espresso',
|
|
102
|
-
mode: 'troubleshoot',
|
|
103
|
-
}, {})).rejects.toThrow('Troubleshooting guidance is currently scoped');
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
//# sourceMappingURL=appium-skills.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"appium-skills.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/appium-skills.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/plugin.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { describe, expect, jest, test } from '@jest/globals';
|
|
2
|
-
jest.unstable_mockModule('appium-uiautomator2-driver', () => ({
|
|
3
|
-
AndroidUiautomator2Driver: class {
|
|
4
|
-
},
|
|
5
|
-
}));
|
|
6
|
-
jest.unstable_mockModule('appium-xcuitest-driver', () => ({
|
|
7
|
-
XCUITestDriver: class {
|
|
8
|
-
},
|
|
9
|
-
}));
|
|
10
|
-
jest.unstable_mockModule('webdriver', () => ({ default: {} }));
|
|
11
|
-
await jest.unstable_mockModule('../../../logger', () => ({
|
|
12
|
-
default: { debug: () => { }, info: () => { }, warn: () => { }, error: () => { } },
|
|
13
|
-
}));
|
|
14
|
-
const { AppiumDocumentation } = await import('../../../tools/documentation/plugin.js');
|
|
15
|
-
describe('AppiumDocumentation plugin', () => {
|
|
16
|
-
test('registers documentation query and skills tools', () => {
|
|
17
|
-
const tools = [];
|
|
18
|
-
const registry = {
|
|
19
|
-
addTool(toolDef) {
|
|
20
|
-
tools.push(toolDef);
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
new AppiumDocumentation().register(registry);
|
|
24
|
-
expect(tools.map((tool) => tool.name)).toEqual([
|
|
25
|
-
'appium_documentation_query',
|
|
26
|
-
'appium_skills',
|
|
27
|
-
]);
|
|
28
|
-
expect(tools[1].annotations).toEqual({
|
|
29
|
-
readOnlyHint: true,
|
|
30
|
-
openWorldHint: false,
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
//# sourceMappingURL=plugin.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/plugin.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE7D,IAAI,CAAC,mBAAmB,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5D,yBAAyB,EAAE;KAAQ;CACpC,CAAC,CAAC,CAAC;AACJ,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxD,cAAc,EAAE;KAAQ;CACzB,CAAC,CAAC,CAAC;AACJ,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/D,MAAM,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;CAC9E,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,mBAAmB,EAAE,GAC3B,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC;AAOzD,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,KAAK,GAAc,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG;YACf,OAAO,CAAC,OAAgB;gBACtB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;SACF,CAAC;QAEF,IAAI,mBAAmB,EAAE,CAAC,QAAQ,CAAC,QAAiB,CAAC,CAAC;QAEtD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,4BAA4B;YAC5B,eAAe;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;YACnC,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simple-pdf-indexer.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/simple-pdf-indexer.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { afterEach, describe, expect, jest, test } from '@jest/globals';
|
|
2
|
-
import * as fs from 'node:fs';
|
|
3
|
-
import * as os from 'node:os';
|
|
4
|
-
import * as path from 'node:path';
|
|
5
|
-
await jest.unstable_mockModule('../../../logger', () => ({
|
|
6
|
-
default: { debug: () => { }, info: () => { }, warn: () => { }, error: () => { } },
|
|
7
|
-
}));
|
|
8
|
-
const { getMarkdownFilesInDirectory } = await import('../../../tools/documentation/simple-pdf-indexer.js');
|
|
9
|
-
const tempDirs = [];
|
|
10
|
-
afterEach(() => {
|
|
11
|
-
while (tempDirs.length > 0) {
|
|
12
|
-
const dir = tempDirs.pop();
|
|
13
|
-
if (dir) {
|
|
14
|
-
fs.rmSync(dir, { recursive: true, force: true });
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
function makeTempDir() {
|
|
19
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'appium-mcp-markdown-'));
|
|
20
|
-
tempDirs.push(dir);
|
|
21
|
-
return dir;
|
|
22
|
-
}
|
|
23
|
-
describe('getMarkdownFilesInDirectory', () => {
|
|
24
|
-
test('excludes markdown files under appium-skills', async () => {
|
|
25
|
-
const root = makeTempDir();
|
|
26
|
-
const docsDir = path.join(root, 'docs');
|
|
27
|
-
const skillsDir = path.join(root, 'appium-skills');
|
|
28
|
-
const nestedSkillsDir = path.join(skillsDir, 'skills');
|
|
29
|
-
fs.mkdirSync(docsDir, { recursive: true });
|
|
30
|
-
fs.mkdirSync(nestedSkillsDir, { recursive: true });
|
|
31
|
-
fs.writeFileSync(path.join(root, 'README.md'), '# root');
|
|
32
|
-
fs.writeFileSync(path.join(docsDir, 'guide.md'), '# docs');
|
|
33
|
-
fs.writeFileSync(path.join(skillsDir, 'AGENTS.md'), '# agents');
|
|
34
|
-
fs.writeFileSync(path.join(nestedSkillsDir, 'SKILL.md'), '# skill');
|
|
35
|
-
const markdownFiles = await getMarkdownFilesInDirectory(root);
|
|
36
|
-
expect(markdownFiles).toEqual(expect.arrayContaining([
|
|
37
|
-
path.join(root, 'README.md'),
|
|
38
|
-
path.join(docsDir, 'guide.md'),
|
|
39
|
-
]));
|
|
40
|
-
expect(markdownFiles).not.toEqual(expect.arrayContaining([
|
|
41
|
-
path.join(skillsDir, 'AGENTS.md'),
|
|
42
|
-
path.join(nestedSkillsDir, 'SKILL.md'),
|
|
43
|
-
]));
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
//# sourceMappingURL=simple-pdf-indexer.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simple-pdf-indexer.test.js","sourceRoot":"","sources":["../../../../src/tests/tools/documentation/simple-pdf-indexer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool to query indexed Appium documentation.
|
|
3
|
-
*/
|
|
4
|
-
import type { FastMCP } from 'fastmcp';
|
|
5
|
-
type ToolDef = Parameters<FastMCP['addTool']>[0];
|
|
6
|
-
export declare const appiumDocumentationQueryTool: ToolDef;
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=answer-appium.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"answer-appium.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/answer-appium.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAMvC,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjD,eAAO,MAAM,4BAA4B,EAAE,OAmC1C,CAAC"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { answerAppiumQuery, initializeAppiumDocumentation } from './index.js';
|
|
3
|
-
import log from '../../logger.js';
|
|
4
|
-
import { errorResult, textResult } from '../tool-response.js';
|
|
5
|
-
export const appiumDocumentationQueryTool = {
|
|
6
|
-
name: 'appium_documentation_query',
|
|
7
|
-
description: `Query Appium documentation using RAG (Retrieval-Augmented Generation).
|
|
8
|
-
This tool searches through indexed Appium documentation to answer questions about Appium features, setup, configuration, drivers, and usage.
|
|
9
|
-
`,
|
|
10
|
-
parameters: z.object({
|
|
11
|
-
query: z
|
|
12
|
-
.string()
|
|
13
|
-
.describe('The question or query about Appium documentation'),
|
|
14
|
-
}),
|
|
15
|
-
execute: async (args, _context) => {
|
|
16
|
-
const query = args.query;
|
|
17
|
-
if (!query) {
|
|
18
|
-
return errorResult('Query parameter is required');
|
|
19
|
-
}
|
|
20
|
-
try {
|
|
21
|
-
const result = await answerAppiumQuery({ query });
|
|
22
|
-
return textResult(result.answer);
|
|
23
|
-
}
|
|
24
|
-
catch (_docError) {
|
|
25
|
-
// If documentation query fails, try to initialize and retry once
|
|
26
|
-
try {
|
|
27
|
-
log.info('Documentation not initialized, initializing now...');
|
|
28
|
-
await initializeAppiumDocumentation();
|
|
29
|
-
const result = await answerAppiumQuery({ query });
|
|
30
|
-
return textResult(result.answer);
|
|
31
|
-
}
|
|
32
|
-
catch (retryError) {
|
|
33
|
-
return errorResult(`Error querying Appium documentation: ${retryError.message}. Please ensure the documentation is indexed first.`);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
//# sourceMappingURL=answer-appium.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"answer-appium.js","sourceRoot":"","sources":["../../../src/tools/documentation/answer-appium.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,GAAG,MAAM,iBAAiB,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAI9D,MAAM,CAAC,MAAM,4BAA4B,GAAY;IACnD,IAAI,EAAE,4BAA4B;IAClC,WAAW,EAAE;;OAER;IACL,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,CAAC,kDAAkD,CAAC;KAChE,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAS,EAAE,QAAa,EAAgB,EAAE;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,WAAW,CAAC,6BAA6B,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAClD,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,iEAAiE;YACjE,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;gBAC/D,MAAM,6BAA6B,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClD,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,OAAO,WAAW,CAChB,wCACG,UAAoB,CAAC,OACxB,qDAAqD,CACtD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"appium-skills.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/appium-skills.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAUvC,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAkCjD,eAAO,MAAM,gBAAgB,EAAE,OAqG9B,CAAC"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import log from '../../logger.js';
|
|
5
|
-
import { resolveAppiumResourcesPath } from '../../utils/paths.js';
|
|
6
|
-
import { textResult } from '../tool-response.js';
|
|
7
|
-
const ROOT = resolveAppiumResourcesPath('submodules', 'appium-skills');
|
|
8
|
-
const AGENTS_PATH = path.join(ROOT, 'AGENTS.md');
|
|
9
|
-
const SKILL_PATH = (name) => path.join(ROOT, 'skills', name, 'SKILL.md');
|
|
10
|
-
const SETUP_SKILLS = {
|
|
11
|
-
android: {
|
|
12
|
-
uiautomator2: [
|
|
13
|
-
'environment-setup-node',
|
|
14
|
-
'environment-setup-android',
|
|
15
|
-
'environment-setup-uiautomator2',
|
|
16
|
-
],
|
|
17
|
-
espresso: [
|
|
18
|
-
'environment-setup-node',
|
|
19
|
-
'environment-setup-android',
|
|
20
|
-
'environment-setup-espresso',
|
|
21
|
-
],
|
|
22
|
-
},
|
|
23
|
-
ios: {
|
|
24
|
-
xcuitest: ['environment-setup-node', 'environment-setup-xcuitest'],
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
const TEMPLATE_HEADINGS = {
|
|
28
|
-
'setup:uiautomator2': 'UiAutomator2',
|
|
29
|
-
'setup:espresso': 'Espresso',
|
|
30
|
-
'setup:xcuitest': 'XCUITest',
|
|
31
|
-
'setup:xcuitest:real': 'XCUITest Real Device',
|
|
32
|
-
'troubleshoot:uiautomator2': 'Troubleshooting',
|
|
33
|
-
'troubleshoot:xcuitest': 'Troubleshooting',
|
|
34
|
-
};
|
|
35
|
-
export const appiumSkillsTool = {
|
|
36
|
-
name: 'appium_skills',
|
|
37
|
-
description: `Return ordered Appium setup or troubleshooting skills from the vendored appium/skills repository.
|
|
38
|
-
Use this before preparing a LOCAL Appium environment or diagnosing local prerequisite issues.`,
|
|
39
|
-
parameters: z.object({
|
|
40
|
-
platform: z.enum(['android', 'ios']).describe('Target local platform.'),
|
|
41
|
-
driver: z
|
|
42
|
-
.enum(['uiautomator2', 'espresso', 'xcuitest'])
|
|
43
|
-
.describe('Target Appium automation driver.'),
|
|
44
|
-
mode: z
|
|
45
|
-
.enum(['setup', 'troubleshoot'])
|
|
46
|
-
.optional()
|
|
47
|
-
.default('setup')
|
|
48
|
-
.describe('Whether to prepare an environment or troubleshoot an existing failure.'),
|
|
49
|
-
realDevice: z
|
|
50
|
-
.boolean()
|
|
51
|
-
.optional()
|
|
52
|
-
.default(false)
|
|
53
|
-
.describe('For ios + xcuitest only: true for a physical device, false for simulator setup.'),
|
|
54
|
-
includeOptional: z
|
|
55
|
-
.array(z.enum(['ffmpeg', 'bundletool']))
|
|
56
|
-
.optional()
|
|
57
|
-
.default([])
|
|
58
|
-
.describe('Optional shared skills to include when explicitly requested.'),
|
|
59
|
-
}),
|
|
60
|
-
annotations: {
|
|
61
|
-
readOnlyHint: true,
|
|
62
|
-
openWorldHint: false,
|
|
63
|
-
},
|
|
64
|
-
execute: async (rawArgs) => {
|
|
65
|
-
const parsed = (rawArgs ?? {});
|
|
66
|
-
const args = {
|
|
67
|
-
platform: parsed.platform,
|
|
68
|
-
driver: parsed.driver,
|
|
69
|
-
mode: parsed.mode ?? 'setup',
|
|
70
|
-
realDevice: parsed.realDevice ?? false,
|
|
71
|
-
includeOptional: Array.isArray(parsed.includeOptional)
|
|
72
|
-
? parsed.includeOptional
|
|
73
|
-
: [],
|
|
74
|
-
};
|
|
75
|
-
const { skillNames, ignoredOptional } = getSkillNames(args);
|
|
76
|
-
log.info(`Loading Appium skills for ${args.platform}/${args.driver} (${args.mode}) from ${ROOT}`);
|
|
77
|
-
const agentsMarkdown = await readMarkdown(AGENTS_PATH);
|
|
78
|
-
const promptTemplate = getPromptTemplate(agentsMarkdown, getTemplateHeading(args.mode, args.driver, args.realDevice));
|
|
79
|
-
const skillContents = await Promise.all(skillNames.map(async (skillName) => ({
|
|
80
|
-
name: skillName,
|
|
81
|
-
markdown: await readMarkdown(SKILL_PATH(skillName)),
|
|
82
|
-
})));
|
|
83
|
-
const lines = [
|
|
84
|
-
`Appium skills for ${args.platform}/${args.driver}`,
|
|
85
|
-
`Mode: ${args.mode}`,
|
|
86
|
-
`Real device: ${args.realDevice ? 'yes' : 'no'}`,
|
|
87
|
-
'',
|
|
88
|
-
'Recommended skill order:',
|
|
89
|
-
...skillNames.map((skillName, index) => `${index + 1}. ${skillName}`),
|
|
90
|
-
];
|
|
91
|
-
if (ignoredOptional.length) {
|
|
92
|
-
lines.push('', `Ignored optional skills: ${ignoredOptional.join(', ')}`);
|
|
93
|
-
}
|
|
94
|
-
lines.push('', 'Source files:', '- AGENTS.md');
|
|
95
|
-
lines.push(...skillNames.map((skillName) => `- skills/${skillName}/SKILL.md`));
|
|
96
|
-
if (promptTemplate) {
|
|
97
|
-
lines.push('', 'Prompt template:', '```text', promptTemplate, '```');
|
|
98
|
-
}
|
|
99
|
-
lines.push('', '--- AGENTS.md ---', agentsMarkdown.trim());
|
|
100
|
-
for (const skill of skillContents) {
|
|
101
|
-
lines.push('', `--- skills/${skill.name}/SKILL.md ---`, skill.markdown.trim());
|
|
102
|
-
}
|
|
103
|
-
return textResult(lines.join('\n'));
|
|
104
|
-
},
|
|
105
|
-
};
|
|
106
|
-
/**
|
|
107
|
-
* Get the list of skill names to return based on the input arguments,
|
|
108
|
-
* and determine which optional skills were ignored.
|
|
109
|
-
* @param args
|
|
110
|
-
* @returns
|
|
111
|
-
*/
|
|
112
|
-
function getSkillNames(args) {
|
|
113
|
-
const { platform, driver, mode, realDevice, includeOptional } = args;
|
|
114
|
-
if (realDevice && platform !== 'ios') {
|
|
115
|
-
throw new Error('realDevice=true is only supported for ios targets');
|
|
116
|
-
}
|
|
117
|
-
if (mode === 'troubleshoot' && driver === 'espresso') {
|
|
118
|
-
throw new Error('Troubleshooting guidance is currently scoped to uiautomator2 or xcuitest, matching the upstream appium/skills repository.');
|
|
119
|
-
}
|
|
120
|
-
const baseSkills = SETUP_SKILLS[platform][driver];
|
|
121
|
-
if (!baseSkills) {
|
|
122
|
-
throw new Error(platform === 'android'
|
|
123
|
-
? 'xcuitest is only valid for iOS local environments'
|
|
124
|
-
: 'Only xcuitest is valid for iOS local environments');
|
|
125
|
-
}
|
|
126
|
-
const skillNames = [...baseSkills];
|
|
127
|
-
if (realDevice) {
|
|
128
|
-
skillNames.push('xcuitest-real-device-config');
|
|
129
|
-
}
|
|
130
|
-
if (mode === 'troubleshoot') {
|
|
131
|
-
skillNames.push('appium-troubleshooting');
|
|
132
|
-
}
|
|
133
|
-
const ignoredOptional = [];
|
|
134
|
-
for (const optional of includeOptional) {
|
|
135
|
-
if (optional === 'ffmpeg') {
|
|
136
|
-
skillNames.push('environment-setup-ffmpeg');
|
|
137
|
-
continue;
|
|
138
|
-
}
|
|
139
|
-
if (optional === 'bundletool' && platform === 'android') {
|
|
140
|
-
skillNames.push('environment-setup-bundletool');
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
ignoredOptional.push(optional);
|
|
144
|
-
}
|
|
145
|
-
return { skillNames, ignoredOptional };
|
|
146
|
-
}
|
|
147
|
-
function getTemplateHeading(mode, driver, realDevice) {
|
|
148
|
-
return (TEMPLATE_HEADINGS[`${mode}:${driver}${realDevice && mode === 'setup' ? ':real' : ''}`] ?? null);
|
|
149
|
-
}
|
|
150
|
-
function getPromptTemplate(agentsMarkdown, heading) {
|
|
151
|
-
if (!heading) {
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
const section = agentsMarkdown.split(`### Template: ${heading}\n`)[1];
|
|
155
|
-
if (!section) {
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
return section.match(/```text\n([\s\S]*?)```/)?.[1]?.trim() ?? null;
|
|
159
|
-
}
|
|
160
|
-
async function readMarkdown(filePath) {
|
|
161
|
-
try {
|
|
162
|
-
return await readFile(filePath, 'utf8');
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
throw new Error(`Failed to load ${path.relative(ROOT, filePath)}. Ensure the appium-skills submodule is initialized.`);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
//# sourceMappingURL=appium-skills.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"appium-skills.js","sourceRoot":"","sources":["../../../src/tools/documentation/appium-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Documentation tools for Appium
|
|
3
|
-
*
|
|
4
|
-
* This module provides tools for answering queries about Appium
|
|
5
|
-
* by retrieving relevant information from indexed documentation.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Interface for the query response
|
|
9
|
-
*/
|
|
10
|
-
interface QueryResponse {
|
|
11
|
-
answer: string;
|
|
12
|
-
sources?: string[];
|
|
13
|
-
chunks?: string[];
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Initialize the Appium documentation index
|
|
17
|
-
* @param resourcesPath Path to the resources directory containing markdown files
|
|
18
|
-
*/
|
|
19
|
-
export declare function initializeAppiumDocumentation(resourcesPath?: string): Promise<void>;
|
|
20
|
-
/**
|
|
21
|
-
* Answer a query about Appium using indexed documentation
|
|
22
|
-
* @param options Query options
|
|
23
|
-
* @returns Response with relevant chunks for the client LLM to process
|
|
24
|
-
*/
|
|
25
|
-
export declare function answerAppiumQuery(options: {
|
|
26
|
-
query: string;
|
|
27
|
-
}): Promise<QueryResponse>;
|
|
28
|
-
export {};
|
|
29
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH;;GAEG;AACH,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,aAAa,CAAC,CA+CzB"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Documentation tools for Appium
|
|
3
|
-
*
|
|
4
|
-
* This module provides tools for answering queries about Appium
|
|
5
|
-
* by retrieving relevant information from indexed documentation.
|
|
6
|
-
*/
|
|
7
|
-
import { queryVectorStore, indexAllMarkdownFiles, } from './simple-pdf-indexer.js';
|
|
8
|
-
import log from '../../logger.js';
|
|
9
|
-
import { resolveAppiumResourcesPath } from '../../utils/paths.js';
|
|
10
|
-
/**
|
|
11
|
-
* Initialize the Appium documentation index
|
|
12
|
-
* @param resourcesPath Path to the resources directory containing markdown files
|
|
13
|
-
*/
|
|
14
|
-
export async function initializeAppiumDocumentation(resourcesPath) {
|
|
15
|
-
try {
|
|
16
|
-
// Default to submodules directory if not specified
|
|
17
|
-
const docsPath =
|
|
18
|
-
// Refer to the /src/resources/submodules directory where the markdown files are located.
|
|
19
|
-
resourcesPath || resolveAppiumResourcesPath('submodules');
|
|
20
|
-
log.info(`Initializing Appium documentation from: ${docsPath}`);
|
|
21
|
-
await indexAllMarkdownFiles(docsPath);
|
|
22
|
-
log.info('Appium documentation indexing completed');
|
|
23
|
-
}
|
|
24
|
-
catch (error) {
|
|
25
|
-
log.error('Error initializing Appium documentation:', error);
|
|
26
|
-
throw error;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Answer a query about Appium using indexed documentation
|
|
31
|
-
* @param options Query options
|
|
32
|
-
* @returns Response with relevant chunks for the client LLM to process
|
|
33
|
-
*/
|
|
34
|
-
export async function answerAppiumQuery(options) {
|
|
35
|
-
try {
|
|
36
|
-
const { query } = options;
|
|
37
|
-
log.info(`Querying vector store for: "${query}"`);
|
|
38
|
-
const results = await queryVectorStore(query); // Get relevant chunks
|
|
39
|
-
if (!results || results.length === 0) {
|
|
40
|
-
return {
|
|
41
|
-
answer: 'No relevant information found in the Appium documentation. Please try rephrasing your query.',
|
|
42
|
-
chunks: [],
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
// Extract the content from all retrieved documents
|
|
46
|
-
const chunks = results.map((doc) => doc.pageContent);
|
|
47
|
-
const sources = results
|
|
48
|
-
.map((doc) => doc.metadata?.relativePath ||
|
|
49
|
-
doc.metadata?.filename ||
|
|
50
|
-
doc.metadata?.source)
|
|
51
|
-
.filter((source, index, arr) => source && arr.indexOf(source) === index); // Remove duplicates
|
|
52
|
-
log.info(`Found ${results.length} relevant chunks from ${sources.length} sources`);
|
|
53
|
-
// Return the chunks for the client LLM to process
|
|
54
|
-
// The client will use its own LLM to generate the final answer
|
|
55
|
-
return {
|
|
56
|
-
answer: `Found ${results.length} relevant documentation chunks. Here are the relevant sections:\n\n${chunks.join('\n\n---\n\n')}`,
|
|
57
|
-
sources,
|
|
58
|
-
chunks,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
log.error('Error querying Appium documentation:', error);
|
|
63
|
-
throw error;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=index.js.map
|