appium-mcp 1.72.16 → 1.74.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/dist/scripts/eval-documentation-rag.d.ts +23 -0
- package/dist/scripts/eval-documentation-rag.d.ts.map +1 -0
- package/dist/scripts/eval-documentation-rag.js +212 -0
- package/dist/scripts/eval-documentation-rag.js.map +1 -0
- package/dist/scripts/generate-embeddings-cache.d.ts +13 -0
- package/dist/scripts/generate-embeddings-cache.d.ts.map +1 -0
- package/dist/scripts/generate-embeddings-cache.js +24 -0
- package/dist/scripts/generate-embeddings-cache.js.map +1 -0
- package/dist/scripts/rag-eval-dataset.json +218 -0
- package/dist/tests/__mocks__/@appium/support.d.ts +32 -0
- package/dist/tests/__mocks__/@appium/support.d.ts.map +1 -1
- package/dist/tests/__mocks__/@appium/support.js +20 -0
- package/dist/tests/__mocks__/@appium/support.js.map +1 -1
- package/dist/tools/documentation/sentence-transformers-embeddings.d.ts +6 -1
- package/dist/tools/documentation/sentence-transformers-embeddings.d.ts.map +1 -1
- package/dist/tools/documentation/sentence-transformers-embeddings.js +14 -3
- package/dist/tools/documentation/sentence-transformers-embeddings.js.map +1 -1
- package/dist/tools/documentation/simple-pdf-indexer.d.ts.map +1 -1
- package/dist/tools/documentation/simple-pdf-indexer.js +194 -46
- package/dist/tools/documentation/simple-pdf-indexer.js.map +1 -1
- package/dist/tools/documentation/uploads/embeddings-Xenova-bge-small-en-v1.5.json +1 -0
- package/package.json +6 -2
- package/server.json +2 -2
- package/src/resources/submodules.zip +0 -0
- package/src/scripts/eval-documentation-rag.ts +312 -0
- package/src/scripts/generate-embeddings-cache.ts +24 -0
- package/src/scripts/rag-eval-dataset.json +218 -0
- package/src/tools/documentation/sentence-transformers-embeddings.ts +16 -4
- package/src/tools/documentation/simple-pdf-indexer.ts +281 -57
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [1.74.0](https://github.com/appium/appium-mcp/compare/v1.73.0...v1.74.0) (2026-05-16)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* **embeddings:** cache vector embeddings and ship warm cache ([#335](https://github.com/appium/appium-mcp/issues/335)) ([52c8fd3](https://github.com/appium/appium-mcp/commit/52c8fd326a7e67f2769a10e00c9c5516bd86e0bf))
|
|
6
|
+
|
|
7
|
+
## [1.73.0](https://github.com/appium/appium-mcp/compare/v1.72.16...v1.73.0) (2026-05-14)
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **rag:** upgrade to BGE-small-v1.5 + add retrieval eval harness ([#334](https://github.com/appium/appium-mcp/issues/334)) ([bcfe254](https://github.com/appium/appium-mcp/commit/bcfe2542e2f270d0a2fe314c64e7c54e752933ff))
|
|
12
|
+
|
|
1
13
|
## [1.72.16](https://github.com/appium/appium-mcp/compare/v1.72.15...v1.72.16) (2026-05-14)
|
|
2
14
|
|
|
3
15
|
### Bug Fixes
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RAG retrieval eval harness for the Appium documentation tool.
|
|
3
|
+
*
|
|
4
|
+
* Usage (after `npm run build`):
|
|
5
|
+
* node dist/scripts/eval-documentation-rag.js [--quiet] [--save] [--top-chunks=N]
|
|
6
|
+
*
|
|
7
|
+
* What it does:
|
|
8
|
+
* 1. Loads the eval dataset (src/scripts/rag-eval-dataset.json).
|
|
9
|
+
* 2. For each query, calls the existing queryVectorStore() with `topChunks`
|
|
10
|
+
* chunks (default 30), dedupes by source (preserving rank), and matches
|
|
11
|
+
* the resulting source list against expectedSources.
|
|
12
|
+
* 3. Reports Recall@{1,3,5,10} and MRR, broken down by difficulty.
|
|
13
|
+
* 4. Persists results to src/scripts/eval-results/<ISO>.json plus a
|
|
14
|
+
* `latest.json` so successive runs can be diffed.
|
|
15
|
+
*
|
|
16
|
+
* Notes:
|
|
17
|
+
* - The first run after a server restart pays the embedding cold start
|
|
18
|
+
* (~30-60s for the current corpus).
|
|
19
|
+
* - Match strategy: a retrieved source matches an expected source if its
|
|
20
|
+
* `relativePath` ends with the expected path (case-sensitive).
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=eval-documentation-rag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-documentation-rag.d.ts","sourceRoot":"","sources":["../../src/scripts/eval-documentation-rag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RAG retrieval eval harness for the Appium documentation tool.
|
|
3
|
+
*
|
|
4
|
+
* Usage (after `npm run build`):
|
|
5
|
+
* node dist/scripts/eval-documentation-rag.js [--quiet] [--save] [--top-chunks=N]
|
|
6
|
+
*
|
|
7
|
+
* What it does:
|
|
8
|
+
* 1. Loads the eval dataset (src/scripts/rag-eval-dataset.json).
|
|
9
|
+
* 2. For each query, calls the existing queryVectorStore() with `topChunks`
|
|
10
|
+
* chunks (default 30), dedupes by source (preserving rank), and matches
|
|
11
|
+
* the resulting source list against expectedSources.
|
|
12
|
+
* 3. Reports Recall@{1,3,5,10} and MRR, broken down by difficulty.
|
|
13
|
+
* 4. Persists results to src/scripts/eval-results/<ISO>.json plus a
|
|
14
|
+
* `latest.json` so successive runs can be diffed.
|
|
15
|
+
*
|
|
16
|
+
* Notes:
|
|
17
|
+
* - The first run after a server restart pays the embedding cold start
|
|
18
|
+
* (~30-60s for the current corpus).
|
|
19
|
+
* - Match strategy: a retrieved source matches an expected source if its
|
|
20
|
+
* `relativePath` ends with the expected path (case-sensitive).
|
|
21
|
+
*/
|
|
22
|
+
import * as fs from 'node:fs';
|
|
23
|
+
import * as path from 'node:path';
|
|
24
|
+
import { fileURLToPath } from 'node:url';
|
|
25
|
+
import { queryVectorStore } from '../tools/documentation/simple-pdf-indexer.js';
|
|
26
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
27
|
+
const __dirname = path.dirname(__filename);
|
|
28
|
+
const args = new Set(process.argv.slice(2));
|
|
29
|
+
const QUIET = args.has('--quiet');
|
|
30
|
+
const NO_SAVE = !args.has('--save');
|
|
31
|
+
const topChunksArg = process.argv.find((a) => a.startsWith('--top-chunks='));
|
|
32
|
+
const TOP_CHUNKS = topChunksArg ? Number(topChunksArg.split('=')[1]) : 30;
|
|
33
|
+
function resolveDatasetPath() {
|
|
34
|
+
// When compiled, this file lives in dist/scripts/. We look for the dataset
|
|
35
|
+
// beside it first (copy-docs build step), then fall back to src/scripts/.
|
|
36
|
+
const candidates = [
|
|
37
|
+
path.resolve(__dirname, 'rag-eval-dataset.json'),
|
|
38
|
+
path.resolve(__dirname, '../../src/scripts/rag-eval-dataset.json'),
|
|
39
|
+
];
|
|
40
|
+
for (const p of candidates) {
|
|
41
|
+
if (fs.existsSync(p)) {
|
|
42
|
+
return p;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
throw new Error(`Could not find rag-eval-dataset.json in any of: ${candidates.join(', ')}`);
|
|
46
|
+
}
|
|
47
|
+
function resolveResultsDir() {
|
|
48
|
+
// Always write results into the source tree so they're easy to diff/commit.
|
|
49
|
+
const candidates = [
|
|
50
|
+
path.resolve(__dirname, '../../src/scripts/eval-results'),
|
|
51
|
+
path.resolve(__dirname, 'eval-results'),
|
|
52
|
+
];
|
|
53
|
+
const dir = candidates[0];
|
|
54
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
55
|
+
return dir;
|
|
56
|
+
}
|
|
57
|
+
function matches(retrievedRelPath, expected) {
|
|
58
|
+
return retrievedRelPath === expected || retrievedRelPath.endsWith(expected);
|
|
59
|
+
}
|
|
60
|
+
function dedupeBySource(chunks) {
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
const ordered = [];
|
|
63
|
+
for (const c of chunks) {
|
|
64
|
+
const src = c.relativePath;
|
|
65
|
+
if (!src || seen.has(src)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
seen.add(src);
|
|
69
|
+
ordered.push(src);
|
|
70
|
+
}
|
|
71
|
+
return ordered;
|
|
72
|
+
}
|
|
73
|
+
function evalQuery(retrievedSources, expectedSources) {
|
|
74
|
+
for (let i = 0; i < retrievedSources.length; i++) {
|
|
75
|
+
const hit = expectedSources.find((e) => matches(retrievedSources[i], e));
|
|
76
|
+
if (hit) {
|
|
77
|
+
return { matchedAtRank: i + 1, matchedSource: retrievedSources[i] };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { matchedAtRank: null, matchedSource: null };
|
|
81
|
+
}
|
|
82
|
+
function aggregate(results) {
|
|
83
|
+
if (results.length === 0) {
|
|
84
|
+
return {
|
|
85
|
+
count: 0,
|
|
86
|
+
recallAt1: 0,
|
|
87
|
+
recallAt3: 0,
|
|
88
|
+
recallAt5: 0,
|
|
89
|
+
recallAt10: 0,
|
|
90
|
+
mrr: 0,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const n = results.length;
|
|
94
|
+
const sum = (k) => results.reduce((acc, r) => acc + r[k], 0);
|
|
95
|
+
return {
|
|
96
|
+
count: n,
|
|
97
|
+
recallAt1: sum('recallAt1') / n,
|
|
98
|
+
recallAt3: sum('recallAt3') / n,
|
|
99
|
+
recallAt5: sum('recallAt5') / n,
|
|
100
|
+
recallAt10: sum('recallAt10') / n,
|
|
101
|
+
mrr: sum('reciprocalRank') / n,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function fmt(n) {
|
|
105
|
+
return n.toFixed(3);
|
|
106
|
+
}
|
|
107
|
+
function rankStr(rank) {
|
|
108
|
+
return rank === null ? ' - ' : String(rank).padStart(3, ' ');
|
|
109
|
+
}
|
|
110
|
+
function printPerQueryTable(results) {
|
|
111
|
+
const rows = results.map((r) => ({
|
|
112
|
+
id: r.id,
|
|
113
|
+
diff: r.difficulty,
|
|
114
|
+
rank: rankStr(r.matchedAtRank),
|
|
115
|
+
query: r.query.length > 56 ? r.query.slice(0, 53) + '...' : r.query,
|
|
116
|
+
matched: r.matchedSource ?? '(none of expected found in top results)',
|
|
117
|
+
}));
|
|
118
|
+
const widths = {
|
|
119
|
+
id: 4,
|
|
120
|
+
diff: 7,
|
|
121
|
+
rank: 4,
|
|
122
|
+
query: Math.max(...rows.map((r) => r.query.length), 5),
|
|
123
|
+
matched: Math.max(...rows.map((r) => r.matched.length), 7),
|
|
124
|
+
};
|
|
125
|
+
const header = `${'id'.padEnd(widths.id)} | ${'diff'.padEnd(widths.diff)} | ${'rank'.padStart(widths.rank)} | ${'query'.padEnd(widths.query)} | matched`;
|
|
126
|
+
const sep = '-'.repeat(header.length + 10);
|
|
127
|
+
console.log(sep);
|
|
128
|
+
console.log(header);
|
|
129
|
+
console.log(sep);
|
|
130
|
+
for (const r of rows) {
|
|
131
|
+
console.log(`${r.id.padEnd(widths.id)} | ${r.diff.padEnd(widths.diff)} | ${r.rank.padStart(widths.rank)} | ${r.query.padEnd(widths.query)} | ${r.matched}`);
|
|
132
|
+
}
|
|
133
|
+
console.log(sep);
|
|
134
|
+
}
|
|
135
|
+
function printAggregate(label, m) {
|
|
136
|
+
const tag = `${label} (n=${m.count})`.padEnd(20);
|
|
137
|
+
console.log(`${tag} R@1=${fmt(m.recallAt1)} R@3=${fmt(m.recallAt3)} R@5=${fmt(m.recallAt5)} R@10=${fmt(m.recallAt10)} MRR=${fmt(m.mrr)}`);
|
|
138
|
+
}
|
|
139
|
+
async function runEval() {
|
|
140
|
+
const datasetPath = resolveDatasetPath();
|
|
141
|
+
const dataset = JSON.parse(fs.readFileSync(datasetPath, 'utf-8'));
|
|
142
|
+
if (!QUIET) {
|
|
143
|
+
console.log(`\n=== Appium RAG eval ===`);
|
|
144
|
+
console.log(`Dataset: ${datasetPath}`);
|
|
145
|
+
console.log(`Queries: ${dataset.queries.length} | topChunks: ${TOP_CHUNKS} | match: endsWith\n`);
|
|
146
|
+
}
|
|
147
|
+
const perQuery = [];
|
|
148
|
+
for (const q of dataset.queries) {
|
|
149
|
+
const docs = await queryVectorStore(q.query, TOP_CHUNKS);
|
|
150
|
+
const retrievedSources = dedupeBySource(docs.map((d) => ({
|
|
151
|
+
relativePath: d.metadata?.relativePath ??
|
|
152
|
+
d.metadata?.filename ??
|
|
153
|
+
d.metadata?.source,
|
|
154
|
+
})));
|
|
155
|
+
const { matchedAtRank, matchedSource } = evalQuery(retrievedSources, q.expectedSources);
|
|
156
|
+
perQuery.push({
|
|
157
|
+
id: q.id,
|
|
158
|
+
query: q.query,
|
|
159
|
+
difficulty: q.difficulty,
|
|
160
|
+
category: q.category,
|
|
161
|
+
expectedSources: q.expectedSources,
|
|
162
|
+
retrievedSources,
|
|
163
|
+
matchedAtRank,
|
|
164
|
+
matchedSource,
|
|
165
|
+
recallAt1: matchedAtRank !== null && matchedAtRank <= 1 ? 1 : 0,
|
|
166
|
+
recallAt3: matchedAtRank !== null && matchedAtRank <= 3 ? 1 : 0,
|
|
167
|
+
recallAt5: matchedAtRank !== null && matchedAtRank <= 5 ? 1 : 0,
|
|
168
|
+
recallAt10: matchedAtRank !== null && matchedAtRank <= 10 ? 1 : 0,
|
|
169
|
+
reciprocalRank: matchedAtRank !== null ? 1 / matchedAtRank : 0,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (!QUIET) {
|
|
173
|
+
printPerQueryTable(perQuery);
|
|
174
|
+
}
|
|
175
|
+
const overall = aggregate(perQuery);
|
|
176
|
+
const byDifficulty = {};
|
|
177
|
+
for (const d of ['easy', 'medium', 'vague']) {
|
|
178
|
+
byDifficulty[d] = aggregate(perQuery.filter((r) => r.difficulty === d));
|
|
179
|
+
}
|
|
180
|
+
console.log('');
|
|
181
|
+
printAggregate('overall', overall);
|
|
182
|
+
for (const d of ['easy', 'medium', 'vague']) {
|
|
183
|
+
printAggregate(d, byDifficulty[d]);
|
|
184
|
+
}
|
|
185
|
+
console.log('');
|
|
186
|
+
if (!NO_SAVE) {
|
|
187
|
+
const run = {
|
|
188
|
+
timestamp: new Date().toISOString(),
|
|
189
|
+
datasetVersion: dataset.version,
|
|
190
|
+
topChunks: TOP_CHUNKS,
|
|
191
|
+
overall,
|
|
192
|
+
byDifficulty,
|
|
193
|
+
perQuery,
|
|
194
|
+
};
|
|
195
|
+
const dir = resolveResultsDir();
|
|
196
|
+
const stamp = run.timestamp.replace(/[:.]/g, '-');
|
|
197
|
+
const outPath = path.join(dir, `${stamp}.json`);
|
|
198
|
+
const latestPath = path.join(dir, 'latest.json');
|
|
199
|
+
fs.writeFileSync(outPath, JSON.stringify(run, null, 2));
|
|
200
|
+
fs.writeFileSync(latestPath, JSON.stringify(run, null, 2));
|
|
201
|
+
console.log(`Saved: ${path.relative(process.cwd(), outPath)}`);
|
|
202
|
+
console.log(` ${path.relative(process.cwd(), latestPath)}\n`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
await runEval();
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
console.error('Eval failed:', err);
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=eval-documentation-rag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-documentation-rag.js","sourceRoot":"","sources":["../../src/scripts/eval-documentation-rag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate the embeddings cache for the currently configured model.
|
|
3
|
+
*
|
|
4
|
+
* Idempotent: if a valid cache already exists for the current model and the
|
|
5
|
+
* fingerprint matches documents.json, this exits quickly. Otherwise it
|
|
6
|
+
* embeds all chunks and writes the cache.
|
|
7
|
+
*
|
|
8
|
+
* Intended for the maintainer release flow:
|
|
9
|
+
* npm run build && npm run generate-cache
|
|
10
|
+
* to ensure the published tarball ships a warm cache for the default model.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=generate-embeddings-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-embeddings-cache.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-embeddings-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate the embeddings cache for the currently configured model.
|
|
3
|
+
*
|
|
4
|
+
* Idempotent: if a valid cache already exists for the current model and the
|
|
5
|
+
* fingerprint matches documents.json, this exits quickly. Otherwise it
|
|
6
|
+
* embeds all chunks and writes the cache.
|
|
7
|
+
*
|
|
8
|
+
* Intended for the maintainer release flow:
|
|
9
|
+
* npm run build && npm run generate-cache
|
|
10
|
+
* to ensure the published tarball ships a warm cache for the default model.
|
|
11
|
+
*/
|
|
12
|
+
import { queryVectorStore } from '../tools/documentation/simple-pdf-indexer.js';
|
|
13
|
+
const start = Date.now();
|
|
14
|
+
try {
|
|
15
|
+
// A single query forces the cold-start path inside queryVectorStore, which
|
|
16
|
+
// checks the cache and embeds+saves on miss. We don't care about results.
|
|
17
|
+
await queryVectorStore('warmup', 1);
|
|
18
|
+
console.log(`Embeddings cache ready (${Date.now() - start}ms)`);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
console.error('Failed to generate embeddings cache:', err);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=generate-embeddings-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-embeddings-cache.js","sourceRoot":"","sources":["../../src/scripts/generate-embeddings-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAEhF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACzB,IAAI,CAAC;IACH,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC;AAClE,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"description": "Realistic user queries for the Appium documentation RAG tool. Each query maps to one or more source files that should appear in the retrieved sources (substring match against the chunk's relativePath metadata). Difficulty buckets: easy (specific terms that should be near-trivial to retrieve), medium (real-world phrasing), vague (natural human phrasing with less direct cues).",
|
|
4
|
+
"matchMode": "endsWith",
|
|
5
|
+
"queries": [
|
|
6
|
+
{
|
|
7
|
+
"id": "q01",
|
|
8
|
+
"query": "How do I install Appium?",
|
|
9
|
+
"expectedSources": ["appium/quickstart/install.md"],
|
|
10
|
+
"difficulty": "easy",
|
|
11
|
+
"category": "setup"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"id": "q02",
|
|
15
|
+
"query": "What capabilities does the XCUITest driver support?",
|
|
16
|
+
"expectedSources": ["appium-xcuitest-driver/reference/capabilities.md"],
|
|
17
|
+
"difficulty": "easy",
|
|
18
|
+
"category": "capabilities"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "q03",
|
|
22
|
+
"query": "how to run iOS tests in parallel",
|
|
23
|
+
"expectedSources": ["appium-xcuitest-driver/guides/parallel-tests.md"],
|
|
24
|
+
"difficulty": "easy",
|
|
25
|
+
"category": "ios"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "q04",
|
|
29
|
+
"query": "push and pull files from an iOS device",
|
|
30
|
+
"expectedSources": ["appium-xcuitest-driver/guides/file-transfer.md"],
|
|
31
|
+
"difficulty": "easy",
|
|
32
|
+
"category": "ios"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "q05",
|
|
36
|
+
"query": "read and write the clipboard on iOS",
|
|
37
|
+
"expectedSources": ["appium-xcuitest-driver/guides/clipboard.md"],
|
|
38
|
+
"difficulty": "easy",
|
|
39
|
+
"category": "ios"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "q06",
|
|
43
|
+
"query": "what locator strategies are supported by XCUITest",
|
|
44
|
+
"expectedSources": [
|
|
45
|
+
"appium-xcuitest-driver/reference/locator-strategies.md"
|
|
46
|
+
],
|
|
47
|
+
"difficulty": "easy",
|
|
48
|
+
"category": "locators"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "q07",
|
|
52
|
+
"query": "how do I use iOS predicate strings to find elements",
|
|
53
|
+
"expectedSources": ["appium-xcuitest-driver/reference/ios-predicate.md"],
|
|
54
|
+
"difficulty": "easy",
|
|
55
|
+
"category": "locators"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "q08",
|
|
59
|
+
"query": "uiautomator2 driver capabilities",
|
|
60
|
+
"expectedSources": ["appium-uiautomator2-driver/capability-sets.md"],
|
|
61
|
+
"difficulty": "easy",
|
|
62
|
+
"category": "android"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "q09",
|
|
66
|
+
"query": "Appium server command line arguments",
|
|
67
|
+
"expectedSources": ["appium/cli/args.md"],
|
|
68
|
+
"difficulty": "easy",
|
|
69
|
+
"category": "cli"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "q10",
|
|
73
|
+
"query": "install a root certificate on an iOS device",
|
|
74
|
+
"expectedSources": [
|
|
75
|
+
"appium-xcuitest-driver/guides/install-certificate.md"
|
|
76
|
+
],
|
|
77
|
+
"difficulty": "easy",
|
|
78
|
+
"category": "ios"
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
{
|
|
82
|
+
"id": "q11",
|
|
83
|
+
"query": "I'm new to Appium, where should I start?",
|
|
84
|
+
"expectedSources": [
|
|
85
|
+
"appium/quickstart/index.md",
|
|
86
|
+
"appium/intro/index.md",
|
|
87
|
+
"appium/quickstart/requirements.md"
|
|
88
|
+
],
|
|
89
|
+
"difficulty": "medium",
|
|
90
|
+
"category": "intro"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "q12",
|
|
94
|
+
"query": "which driver should I use to automate android",
|
|
95
|
+
"expectedSources": [
|
|
96
|
+
"appium/quickstart/uiauto2-driver.md",
|
|
97
|
+
"appium/intro/drivers.md",
|
|
98
|
+
"appium/ecosystem/drivers.md"
|
|
99
|
+
],
|
|
100
|
+
"difficulty": "medium",
|
|
101
|
+
"category": "android"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "q13",
|
|
105
|
+
"query": "how do I switch to a webview in an iOS hybrid app",
|
|
106
|
+
"expectedSources": [
|
|
107
|
+
"appium-xcuitest-driver/guides/hybrid.md",
|
|
108
|
+
"appium/guides/context.md"
|
|
109
|
+
],
|
|
110
|
+
"difficulty": "medium",
|
|
111
|
+
"category": "hybrid"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"id": "q14",
|
|
115
|
+
"query": "how to set up code signing for real iPhone testing",
|
|
116
|
+
"expectedSources": [
|
|
117
|
+
"appium-xcuitest-driver/preparation/real-device-config.md",
|
|
118
|
+
"appium-xcuitest-driver/preparation/prov-profile-basic-auto.md",
|
|
119
|
+
"appium-xcuitest-driver/preparation/prov-profile-basic-manual.md"
|
|
120
|
+
],
|
|
121
|
+
"difficulty": "medium",
|
|
122
|
+
"category": "ios-real-device"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"id": "q15",
|
|
126
|
+
"query": "swipe gesture on android",
|
|
127
|
+
"expectedSources": [
|
|
128
|
+
"appium-uiautomator2-driver/android-mobile-gestures.md"
|
|
129
|
+
],
|
|
130
|
+
"difficulty": "medium",
|
|
131
|
+
"category": "gestures"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"id": "q16",
|
|
135
|
+
"query": "running tests against an .aab Android App Bundle",
|
|
136
|
+
"expectedSources": ["appium-uiautomator2-driver/android-appbundle.md"],
|
|
137
|
+
"difficulty": "medium",
|
|
138
|
+
"category": "android"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "q17",
|
|
142
|
+
"query": "differences between Appium 1 and Appium 2",
|
|
143
|
+
"expectedSources": ["appium/guides/migrating-1-to-2.md"],
|
|
144
|
+
"difficulty": "medium",
|
|
145
|
+
"category": "migration"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"id": "q18",
|
|
149
|
+
"query": "enable Touch ID in an iOS simulator test",
|
|
150
|
+
"expectedSources": ["appium-xcuitest-driver/guides/touch-id.md"],
|
|
151
|
+
"difficulty": "medium",
|
|
152
|
+
"category": "ios"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "q19",
|
|
156
|
+
"query": "use a custom WebDriverAgent server",
|
|
157
|
+
"expectedSources": [
|
|
158
|
+
"appium-xcuitest-driver/guides/wda-custom-server.md",
|
|
159
|
+
"appium-xcuitest-driver/guides/run-prebuilt-wda.md"
|
|
160
|
+
],
|
|
161
|
+
"difficulty": "medium",
|
|
162
|
+
"category": "wda"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "q20",
|
|
166
|
+
"query": "setting up Appium on a CI server",
|
|
167
|
+
"expectedSources": ["appium-xcuitest-driver/guides/ci-setup.md"],
|
|
168
|
+
"difficulty": "medium",
|
|
169
|
+
"category": "ci"
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
{
|
|
173
|
+
"id": "q21",
|
|
174
|
+
"query": "my tests are super slow on iOS, what's going on",
|
|
175
|
+
"expectedSources": [
|
|
176
|
+
"appium-xcuitest-driver/guides/wda-slowness.md",
|
|
177
|
+
"appium-xcuitest-driver/guides/troubleshooting.md"
|
|
178
|
+
],
|
|
179
|
+
"difficulty": "vague",
|
|
180
|
+
"category": "troubleshooting"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"id": "q22",
|
|
184
|
+
"query": "appium can't find my button",
|
|
185
|
+
"expectedSources": [
|
|
186
|
+
"appium-xcuitest-driver/guides/elements-lookup-troubleshooting.md",
|
|
187
|
+
"appium-xcuitest-driver/reference/locator-strategies.md"
|
|
188
|
+
],
|
|
189
|
+
"difficulty": "vague",
|
|
190
|
+
"category": "troubleshooting"
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"id": "q23",
|
|
194
|
+
"query": "I switched xcode versions and now nothing works",
|
|
195
|
+
"expectedSources": [
|
|
196
|
+
"appium-xcuitest-driver/guides/multiple-xcode-versions.md"
|
|
197
|
+
],
|
|
198
|
+
"difficulty": "vague",
|
|
199
|
+
"category": "troubleshooting"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"id": "q24",
|
|
203
|
+
"query": "can I reuse a WebDriverAgent that's already running",
|
|
204
|
+
"expectedSources": [
|
|
205
|
+
"appium-xcuitest-driver/guides/attach-to-running-wda.md"
|
|
206
|
+
],
|
|
207
|
+
"difficulty": "vague",
|
|
208
|
+
"category": "wda"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"id": "q25",
|
|
212
|
+
"query": "show me how to write a test in python",
|
|
213
|
+
"expectedSources": ["appium/quickstart/test-py.md"],
|
|
214
|
+
"difficulty": "vague",
|
|
215
|
+
"category": "clients"
|
|
216
|
+
}
|
|
217
|
+
]
|
|
218
|
+
}
|
|
@@ -38,6 +38,24 @@ export declare const zip: {
|
|
|
38
38
|
readEntries: (_zipPath: string, _handler: unknown) => Promise<void>;
|
|
39
39
|
toArchive: (_dstPath: string, _src?: unknown, _opts?: unknown) => Promise<void>;
|
|
40
40
|
};
|
|
41
|
+
/**
|
|
42
|
+
* Minimal `fs` mock that delegates to node:fs/promises so test code touching
|
|
43
|
+
* the real filesystem continues to work.
|
|
44
|
+
*/
|
|
45
|
+
export declare const fs: {
|
|
46
|
+
exists: (p: string) => Promise<boolean>;
|
|
47
|
+
readdir: (p: string) => Promise<string[]>;
|
|
48
|
+
stat: (p: string) => Promise<import("node:fs").Stats>;
|
|
49
|
+
readFile: (p: string, encoding?: BufferEncoding) => Promise<string | NonSharedBuffer>;
|
|
50
|
+
writeFile: (p: string, data: string | Buffer) => Promise<void>;
|
|
51
|
+
unlink: (p: string) => Promise<void>;
|
|
52
|
+
rename: (from: string, to: string) => Promise<void>;
|
|
53
|
+
mkdir: (p: string, opts?: {
|
|
54
|
+
recursive?: boolean;
|
|
55
|
+
}) => Promise<string | undefined>;
|
|
56
|
+
mkdirp: (p: string) => Promise<string | undefined>;
|
|
57
|
+
mv: (from: string, to: string) => Promise<void>;
|
|
58
|
+
};
|
|
41
59
|
declare const _default: {
|
|
42
60
|
logger: {
|
|
43
61
|
getLogger: (_name: string) => {
|
|
@@ -62,6 +80,20 @@ declare const _default: {
|
|
|
62
80
|
readEntries: (_zipPath: string, _handler: unknown) => Promise<void>;
|
|
63
81
|
toArchive: (_dstPath: string, _src?: unknown, _opts?: unknown) => Promise<void>;
|
|
64
82
|
};
|
|
83
|
+
fs: {
|
|
84
|
+
exists: (p: string) => Promise<boolean>;
|
|
85
|
+
readdir: (p: string) => Promise<string[]>;
|
|
86
|
+
stat: (p: string) => Promise<import("node:fs").Stats>;
|
|
87
|
+
readFile: (p: string, encoding?: BufferEncoding) => Promise<string | NonSharedBuffer>;
|
|
88
|
+
writeFile: (p: string, data: string | Buffer) => Promise<void>;
|
|
89
|
+
unlink: (p: string) => Promise<void>;
|
|
90
|
+
rename: (from: string, to: string) => Promise<void>;
|
|
91
|
+
mkdir: (p: string, opts?: {
|
|
92
|
+
recursive?: boolean;
|
|
93
|
+
}) => Promise<string | undefined>;
|
|
94
|
+
mkdirp: (p: string) => Promise<string | undefined>;
|
|
95
|
+
mv: (from: string, to: string) => Promise<void>;
|
|
96
|
+
};
|
|
65
97
|
};
|
|
66
98
|
export default _default;
|
|
67
99
|
//# sourceMappingURL=support.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,MAAM;uBACE,MAAM;0BAIH,MAAM,YAAY,GAAG,EAAE;yBAGxB,MAAM,YAAY,GAAG,EAAE;yBAGvB,MAAM,YAAY,GAAG,EAAE;0BAGtB,MAAM,YAAY,GAAG,EAAE;0BAGvB,MAAM,YAAY,GAAG,EAAE;;CAI9C,CAAC;AAEF;;;;;;GAMG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACpD,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,iBAAiB,CAAC;IAC7C,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,EAAE,iBAkB/B,CAAC;AAEF,eAAO,MAAM,SAAS;yBACC,QAAQ,MAAM;CACpC,CAAC;AAEF,eAAO,MAAM,GAAG;+BAEA,MAAM,YACR,MAAM,UACR,OAAO;CAIlB,CAAC;AAEF,eAAO,MAAM,KAAK;iCACmB,MAAM;CAC1C,CAAC;AAEF,eAAO,MAAM,GAAG;6BACiB,MAAM,YAAY,MAAM,UAAU,OAAO;4BAG1C,MAAM,YAAY,OAAO;0BAG3B,MAAM,SAAS,OAAO,UAAU,OAAO;CAGpE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,EAAE;gBACK,MAAM;iBACX,MAAM;cACT,MAAM;kBACF,MAAM,aAAa,cAAc;mBAEhC,MAAM,QAAQ,MAAM,GAAG,MAAM;gBAEhC,MAAM;mBACH,MAAM,MAAM,MAAM;eACtB,MAAM,SAAS;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;gBAErC,MAAM;eACD,MAAM,MAAM,MAAM;CAGpC,CAAC;;;2BA9GmB,MAAM;8BAIH,MAAM,YAAY,GAAG,EAAE;6BAGxB,MAAM,YAAY,GAAG,EAAE;6BAGvB,MAAM,YAAY,GAAG,EAAE;8BAGtB,MAAM,YAAY,GAAG,EAAE;8BAGvB,MAAM,YAAY,GAAG,EAAE;;;;6BA6CxB,QAAQ,MAAM;;;mCAKrB,MAAM,YACR,MAAM,UACR,OAAO;;;qCAOkB,MAAM;;;iCAIV,MAAM,YAAY,MAAM,UAAU,OAAO;gCAG1C,MAAM,YAAY,OAAO;8BAG3B,MAAM,SAAS,OAAO,UAAU,OAAO;;;oBAUjD,MAAM;qBACX,MAAM;kBACT,MAAM;sBACF,MAAM,aAAa,cAAc;uBAEhC,MAAM,QAAQ,MAAM,GAAG,MAAM;oBAEhC,MAAM;uBACH,MAAM,MAAM,MAAM;mBACtB,MAAM,SAAS;YAAE,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE;oBAErC,MAAM;mBACD,MAAM,MAAM,MAAM;;;AAMrC,wBAOE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Mock @appium/support for Jest tests
|
|
2
2
|
// This avoids the ESM/CommonJS mismatch with uuid dependency
|
|
3
|
+
import { promises as fsPromises, existsSync } from 'node:fs';
|
|
3
4
|
export const logger = {
|
|
4
5
|
getLogger: (_name) =>
|
|
5
6
|
// Simple logger implementation for tests
|
|
@@ -63,6 +64,24 @@ export const zip = {
|
|
|
63
64
|
// Silent in tests by default
|
|
64
65
|
},
|
|
65
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* Minimal `fs` mock that delegates to node:fs/promises so test code touching
|
|
69
|
+
* the real filesystem continues to work.
|
|
70
|
+
*/
|
|
71
|
+
export const fs = {
|
|
72
|
+
exists: async (p) => existsSync(p),
|
|
73
|
+
readdir: (p) => fsPromises.readdir(p),
|
|
74
|
+
stat: (p) => fsPromises.stat(p),
|
|
75
|
+
readFile: (p, encoding) => fsPromises.readFile(p, encoding),
|
|
76
|
+
writeFile: (p, data) => fsPromises.writeFile(p, data),
|
|
77
|
+
unlink: (p) => fsPromises.unlink(p),
|
|
78
|
+
rename: (from, to) => fsPromises.rename(from, to),
|
|
79
|
+
mkdir: (p, opts) => fsPromises.mkdir(p, opts),
|
|
80
|
+
mkdirp: (p) => fsPromises.mkdir(p, { recursive: true }),
|
|
81
|
+
mv: async (from, to) => {
|
|
82
|
+
await fsPromises.rename(from, to);
|
|
83
|
+
},
|
|
84
|
+
};
|
|
66
85
|
// Export other commonly used utilities from @appium/support if needed
|
|
67
86
|
export default {
|
|
68
87
|
logger,
|
|
@@ -70,5 +89,6 @@ export default {
|
|
|
70
89
|
net,
|
|
71
90
|
plist,
|
|
72
91
|
zip,
|
|
92
|
+
fs,
|
|
73
93
|
};
|
|
74
94
|
//# sourceMappingURL=support.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.js","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6DAA6D;AAE7D,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,SAAS,EAAE,CAAC,KAAa,EAAE,EAAE;IAC3B,yCAAyC;IACzC,kDAAkD;IAClD,CAAC;QACC,KAAK,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC3C,6BAA6B;QAC/B,CAAC;QACD,IAAI,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC1C,6BAA6B;QAC/B,CAAC;QACD,IAAI,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC1C,6BAA6B;QAC/B,CAAC;QACD,KAAK,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC3C,6BAA6B;QAC/B,CAAC;QACD,KAAK,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC3C,6BAA6B;QAC/B,CAAC;KACF,CAAC;CACL,CAAC;AAmBF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACzE,MAAM,CAAC,CAAS,EAAE,CAAS;QACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAe;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IACD,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,GAAG,EAAE,CACvB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC,iBAAiB;CAC1D,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,YAAY,EAAE,KAAK,EACjB,UAAkB,EAClB,QAAgB,EAChB,KAAe,EACf,EAAE;QACF,6BAA6B;IAC/B,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,cAAc,EAAE,KAAK,EAAE,UAAkB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,YAAY,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAgB,EAAE,KAAe,EAAE,EAAE;QAC1E,6BAA6B;IAC/B,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAiB,EAAE,EAAE;QACzD,6BAA6B;IAC/B,CAAC;IACD,SAAS,EAAE,KAAK,EAAE,QAAgB,EAAE,IAAc,EAAE,KAAe,EAAE,EAAE;QACrE,6BAA6B;IAC/B,CAAC;CACF,CAAC;AAEF,sEAAsE;AACtE,eAAe;IACb,MAAM;IACN,SAAS;IACT,GAAG;IACH,KAAK;IACL,GAAG;
|
|
1
|
+
{"version":3,"file":"support.js","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"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"}
|