swipium 1.1.0 → 1.2.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.
Files changed (75) hide show
  1. package/README.md +15 -9
  2. package/THREAT_MODEL.md +59 -0
  3. package/dist/appMap/diff.js +60 -0
  4. package/dist/appMap/diff.js.map +1 -0
  5. package/dist/automation/capabilities.js +167 -0
  6. package/dist/automation/capabilities.js.map +1 -0
  7. package/dist/automation/gestures.js +94 -0
  8. package/dist/automation/gestures.js.map +1 -0
  9. package/dist/automation/maestroIr.js +282 -0
  10. package/dist/automation/maestroIr.js.map +1 -0
  11. package/dist/automation/plan.js +268 -0
  12. package/dist/automation/plan.js.map +1 -0
  13. package/dist/automation/report.js +83 -0
  14. package/dist/automation/report.js.map +1 -0
  15. package/dist/automation/selectors.js +201 -0
  16. package/dist/automation/selectors.js.map +1 -0
  17. package/dist/automation/types.js +13 -0
  18. package/dist/automation/types.js.map +1 -0
  19. package/dist/automation/waits.js +91 -0
  20. package/dist/automation/waits.js.map +1 -0
  21. package/dist/automation/webview.js +81 -0
  22. package/dist/automation/webview.js.map +1 -0
  23. package/dist/flows/repair.js +363 -0
  24. package/dist/flows/repair.js.map +1 -0
  25. package/dist/interop/maestro.js +151 -0
  26. package/dist/interop/maestro.js.map +1 -0
  27. package/dist/mobileAudit/checks.js +251 -0
  28. package/dist/mobileAudit/checks.js.map +1 -0
  29. package/dist/mobileAudit/evidence.js +49 -0
  30. package/dist/mobileAudit/evidence.js.map +1 -0
  31. package/dist/mobileAudit/profiles.js +73 -0
  32. package/dist/mobileAudit/profiles.js.map +1 -0
  33. package/dist/mobileAudit/results.js +41 -0
  34. package/dist/mobileAudit/results.js.map +1 -0
  35. package/dist/mobileAudit/runner.js +229 -0
  36. package/dist/mobileAudit/runner.js.map +1 -0
  37. package/dist/oracle/locator.js +177 -0
  38. package/dist/oracle/locator.js.map +1 -0
  39. package/dist/server.js +20 -0
  40. package/dist/server.js.map +1 -1
  41. package/dist/testSuite/exporter.js +70 -0
  42. package/dist/testSuite/exporter.js.map +1 -0
  43. package/dist/testSuite/lint.js +53 -0
  44. package/dist/testSuite/lint.js.map +1 -0
  45. package/dist/tools/capabilities.js +46 -4
  46. package/dist/tools/capabilities.js.map +1 -1
  47. package/dist/tools/flow.js +67 -1
  48. package/dist/tools/flow.js.map +1 -1
  49. package/dist/tools/flowRepair.js +66 -0
  50. package/dist/tools/flowRepair.js.map +1 -0
  51. package/dist/tools/idling.js +104 -0
  52. package/dist/tools/idling.js.map +1 -0
  53. package/dist/tools/inputCapabilities.js +30 -0
  54. package/dist/tools/inputCapabilities.js.map +1 -0
  55. package/dist/tools/issues.js +218 -0
  56. package/dist/tools/issues.js.map +1 -0
  57. package/dist/tools/jobs.js +12 -1
  58. package/dist/tools/jobs.js.map +1 -1
  59. package/dist/tools/locator.js +57 -0
  60. package/dist/tools/locator.js.map +1 -0
  61. package/dist/tools/maestro.js +78 -0
  62. package/dist/tools/maestro.js.map +1 -0
  63. package/dist/tools/mobileAudit.js +115 -0
  64. package/dist/tools/mobileAudit.js.map +1 -0
  65. package/dist/tools/suite.js +49 -1
  66. package/dist/tools/suite.js.map +1 -1
  67. package/dist/tools/testSuite.js +233 -0
  68. package/dist/tools/testSuite.js.map +1 -0
  69. package/dist/tools/wait.js +58 -0
  70. package/dist/tools/wait.js.map +1 -0
  71. package/dist/version.js +31 -2
  72. package/dist/version.js.map +1 -1
  73. package/docs/mcp-server.md +1 -1
  74. package/docs/tools.md +46 -1
  75. package/package.json +3 -2
@@ -0,0 +1,229 @@
1
+ // SWIPIUM-REQ-08 — executable mobile-audit runner. Orchestrates the existing driver capabilities
2
+ // (health, snapshot, network, first-run, guided exploration) into a profile-based audit that
3
+ // produces honest, evidence-backed check results and records issue-ledger entries. It NEVER claims
4
+ // a check passed without observed evidence, never purchases / bypasses OTP / deletes real accounts,
5
+ // and always restores network it changed.
6
+ import { recordObservation } from '../issues/index.js';
7
+ import { queryIssues } from '../issues/index.js';
8
+ import { restoreNetwork } from '../tools/network.js';
9
+ import { runFirstRun } from '../firstRun/firstRunRunner.js';
10
+ import { checksForProfile } from './profiles.js';
11
+ import * as C from './checks.js';
12
+ import { snapshotText, foreground } from './evidence.js';
13
+ import { auditReleaseImpact } from './results.js';
14
+ function platformOf(driver) {
15
+ return driver.kind === 'wda' || driver.kind === 'simulator' ? 'ios' : 'android';
16
+ }
17
+ function environmentOf(session, platform) {
18
+ if (session.headless !== undefined)
19
+ return platform === 'ios' ? 'simulator' : 'emulator';
20
+ return process.env.CI ? 'ci' : 'unknown';
21
+ }
22
+ export async function runMobileAudit(sessions, session, driver, opts) {
23
+ const platform = platformOf(driver);
24
+ const environment = environmentOf(session, platform);
25
+ const ev = { sessions, session, driver, appId: session.appId };
26
+ const issueIds = [];
27
+ const recurrenceWarnings = [];
28
+ let state = 'completed';
29
+ // Record a fail/blocked check as an issue (the check IS the classifier → forceCategory). Returns
30
+ // the issue id, or undefined when the check has no category (pure environment/setup gap).
31
+ const recordIssue = async (title, raw) => {
32
+ if (raw.status !== 'fail' && raw.status !== 'blocked')
33
+ return undefined;
34
+ if (!raw.category)
35
+ return undefined;
36
+ const fg = raw.screenId ?? (await foreground(ev));
37
+ const res = recordObservation(session.root, {
38
+ title: `audit: ${title}`,
39
+ summary: raw.reason ?? title,
40
+ screenPurpose: fg,
41
+ workflow: raw.workflow ?? title,
42
+ steps: raw.nextStep ? [raw.nextStep] : undefined,
43
+ }, opts.now, { environment, forceCategory: raw.category, severityHint: raw.severity }, {
44
+ appId: session.appId,
45
+ platform,
46
+ environment,
47
+ sourceRevision: opts.sourceRevision,
48
+ run: { sessionId: session.id, reportUri: opts.reportUri },
49
+ links: { evidenceRefs: raw.evidenceUris.map((uri) => ({ kind: 'evidence', uri })), appMapRefs: [{ screenId: fg }] },
50
+ });
51
+ if (res.recurrenceMessage)
52
+ recurrenceWarnings.push(res.recurrenceMessage);
53
+ return res.issueId;
54
+ };
55
+ const checks = [];
56
+ const finalize = async (id, title, raw) => {
57
+ const issueId = await recordIssue(title, raw);
58
+ if (issueId)
59
+ issueIds.push(issueId);
60
+ checks.push({ id, title, profile: opts.profile, status: raw.status, category: raw.category, severity: raw.severity, issueId, reason: raw.reason, evidenceUris: raw.evidenceUris, workflow: raw.workflow, screenId: raw.screenId, nextStep: raw.nextStep });
61
+ };
62
+ const profilesToRun = opts.profile === 'release_gate' ? ['smoke', 'account_cycle', 'store_compliance', 'resilience'] : [opts.profile];
63
+ for (const prof of profilesToRun) {
64
+ if (prof === 'smoke') {
65
+ await finalize('launch', 'App launch + main screen', await C.checkLaunch(ev));
66
+ await finalize('health_scan', 'Crash / RedBox / log scan', await C.checkHealthScan(ev));
67
+ await finalize('navigation', 'Basic navigation', await C.checkNavigation(ev));
68
+ }
69
+ else if (prof === 'store_compliance') {
70
+ const text = await snapshotText(ev);
71
+ await finalize('privacy_link', 'Privacy Policy link', await C.checkPrivacyLink(ev, text));
72
+ await finalize('terms_link', 'Terms link', await C.checkTermsLink(ev, text));
73
+ await finalize('account_deletion', 'Account deletion path', await C.checkAccountDeletion(ev, text));
74
+ await finalize('subscription_management', 'Subscription management / restore', await C.checkSubscriptionManagement(ev, text));
75
+ await finalize('paywall', 'Paywall classification', await C.checkPaywall(ev, text));
76
+ await finalize('external_links', 'External links', C.checkExternalLinks());
77
+ }
78
+ else if (prof === 'resilience') {
79
+ try {
80
+ await finalize('offline_entry', 'Offline entry', await C.checkOfflineEntry(ev));
81
+ await finalize('network_restoration', 'Network restoration', await C.checkNetworkRestoration(ev));
82
+ await finalize('process_relaunch', 'Process kill / relaunch', await C.checkProcessRelaunch(ev));
83
+ await finalize('rotation', 'Rotation', C.checkRotation());
84
+ }
85
+ finally {
86
+ // GUARANTEED network restore — even if a resilience check threw (REQ-08 safety).
87
+ try {
88
+ await driver.setAirplane(false);
89
+ await restoreNetwork(sessions, session, driver);
90
+ }
91
+ catch {
92
+ /* best-effort */
93
+ }
94
+ }
95
+ }
96
+ else if (prof === 'account_cycle') {
97
+ const acState = await runAccountCycle(sessions, session, driver, opts, finalize);
98
+ if (acState !== 'completed' && state === 'completed')
99
+ state = acState;
100
+ }
101
+ }
102
+ // Recurrence: a previously-fixed blocker/high issue reopened this run is a release blocker.
103
+ const reopened = queryIssues(session.root, opts.now, { includeSuppressed: false }).recurrenceCandidates;
104
+ const blockingRecurrence = reopened.some((r) => (r.severity === 'blocker' || r.severity === 'high') && (r.category === 'app_bug' || r.category === 'blocker_app_bug'));
105
+ for (const r of reopened)
106
+ if (r.lastRecurrenceMessage && !recurrenceWarnings.includes(r.lastRecurrenceMessage))
107
+ recurrenceWarnings.push(r.lastRecurrenceMessage);
108
+ // release_gate adds locator readiness + an explicit issue-ledger recurrence check. The recurrence
109
+ // check POINTS AT the existing reopened issue (no duplicate issue is created); plan/execute agree.
110
+ if (opts.profile === 'release_gate') {
111
+ await finalize('locator_readiness', 'Accessibility / test IDs', await C.checkLocatorReadiness(ev));
112
+ if (reopened.length === 0) {
113
+ checks.push({ id: 'issue_recurrence', title: 'Issue-ledger recurrence', profile: 'release_gate', status: 'pass', reason: 'no previously-fixed issue has regressed', evidenceUris: [] });
114
+ }
115
+ else {
116
+ const top = reopened.find((r) => r.severity === 'blocker' || r.severity === 'high') ?? reopened[0];
117
+ const blocking = top.severity === 'blocker' || top.severity === 'high';
118
+ checks.push({
119
+ id: 'issue_recurrence',
120
+ title: 'Issue-ledger recurrence',
121
+ profile: 'release_gate',
122
+ status: blocking ? 'fail' : 'blocked',
123
+ category: top.category,
124
+ severity: top.severity,
125
+ issueId: top.issueId, // link to the EXISTING reopened issue, not a new one
126
+ reason: top.lastRecurrenceMessage ?? `${reopened.length} previously-fixed issue(s) regressed`,
127
+ evidenceUris: [],
128
+ nextStep: 'A regressed blocker/high issue blocks release; re-fix and re-verify.',
129
+ });
130
+ }
131
+ }
132
+ const releaseImpact = auditReleaseImpact(checks, blockingRecurrence);
133
+ return { profile: opts.profile, state, releaseImpact, checks, issueIds, recurrenceWarnings };
134
+ }
135
+ /** Bounded, honest account-cycle: create (first-run) → logout (controlled explore). Steps that
136
+ * cannot be confirmed are reported blocked/needs_input/skipped, never a false pass. */
137
+ async function runAccountCycle(sessions, session, driver, opts, finalize) {
138
+ if (!opts.allowGeneratedData) {
139
+ const blocked = { status: 'blocked', category: 'missing_test_data', severity: 'medium', reason: 'account-cycle needs generated disposable-account data; re-run with allowGeneratedData in a test/staging environment', evidenceUris: [], workflow: 'account_cycle' };
140
+ await finalize('create_account', 'Create account', blocked);
141
+ await finalize('logout', 'Logout', { status: 'skipped', reason: 'account not created', evidenceUris: [] });
142
+ await finalize('login_again', 'Login again', { status: 'skipped', reason: 'account not created', evidenceUris: [] });
143
+ await finalize('forgot_password', 'Forgot password surface', { status: 'skipped', reason: 'account not created', evidenceUris: [] });
144
+ return 'needs_input';
145
+ }
146
+ let createResult;
147
+ let runState = 'completed';
148
+ try {
149
+ const fr = await runFirstRun(sessions, session, driver, { mode: 'until_home', allowGeneratedAccount: true });
150
+ switch (fr.accountOutcome) {
151
+ case 'created':
152
+ case 'used_provided_credentials':
153
+ createResult = { status: 'pass', reason: `account ${fr.accountOutcome} (${fr.pathTaken ?? 'auth'})`, evidenceUris: fr.evidenceUris, workflow: 'account_cycle' };
154
+ break;
155
+ case 'reached_verification':
156
+ createResult = { status: 'blocked', category: 'hard_gate', severity: 'medium', reason: 'account creation reached an OTP/verification gate (needs a real code)', evidenceUris: fr.evidenceUris, workflow: 'account_cycle' };
157
+ runState = 'needs_input';
158
+ break;
159
+ case 'refused_unsafe':
160
+ createResult = { status: 'blocked', category: 'missing_test_data', severity: 'medium', reason: fr.stoppedReason || 'environment unsafe for generated account creation', evidenceUris: fr.evidenceUris, workflow: 'account_cycle' };
161
+ runState = 'unsafe';
162
+ break;
163
+ default:
164
+ createResult = { status: 'blocked', reason: `account creation ${fr.accountOutcome}: ${fr.stoppedReason}`, evidenceUris: fr.evidenceUris, workflow: 'account_cycle' };
165
+ }
166
+ }
167
+ catch (e) {
168
+ createResult = { status: 'fail', category: 'app_bug', severity: 'high', reason: `account creation errored: ${String(e.message ?? e)}`, evidenceUris: [], workflow: 'account_cycle' };
169
+ }
170
+ await finalize('create_account', 'Create account', createResult);
171
+ // Logout is attempted only through the controlled disposable-account exploration (logout permitted
172
+ // there; delete/pay/send stay refused). We cannot positively confirm a logout without app-specific
173
+ // oracles, so the outcome is honest: skipped/blocked unless the create step already failed.
174
+ if (createResult.status === 'pass') {
175
+ // Controlled logout: find + tap a logout control (disposable account only) and READ the resulting
176
+ // logged-out auth surface immediately — without a full exploration that would auto-re-login via the
177
+ // stored generated credentials and hide the forgot-password entrypoint (REQ-08 account-cycle bug).
178
+ const ev = { sessions, session, driver, appId: session.appId };
179
+ let loggedOutText = '';
180
+ try {
181
+ const lo = await C.findAndTapLogout(ev, true);
182
+ loggedOutText = lo.loggedOutText;
183
+ if (lo.tapped && lo.authSurface)
184
+ await finalize('logout', 'Logout', { status: 'pass', reason: 'logged out — reached a logged-out auth surface', evidenceUris: [], workflow: 'account_cycle' });
185
+ else if (lo.tapped)
186
+ await finalize('logout', 'Logout', { status: 'skipped', reason: 'tapped a logout control but did not clearly reach a logged-out auth surface — confirm manually', evidenceUris: [], workflow: 'account_cycle' });
187
+ else
188
+ await finalize('logout', 'Logout', { status: 'fail', category: 'improvement', severity: 'low', reason: 'no logout control found on the post-login screens', evidenceUris: [], workflow: 'account_cycle', nextStep: 'Expose a logout control once signed in.' });
189
+ }
190
+ catch (e) {
191
+ await finalize('logout', 'Logout', { status: 'fail', category: 'app_bug', severity: 'high', reason: `logout attempt errored: ${String(e.message ?? e)}`, evidenceUris: [], workflow: 'account_cycle' });
192
+ }
193
+ // Forgot-password is evaluated on the LOGGED-OUT auth surface captured above (right after logout),
194
+ // BEFORE login_again returns to home — otherwise a valid "Forgot password?" link on the login
195
+ // screen would be falsely reported missing. Finalized after login_again to keep output order.
196
+ const forgotResult = C.checkForgotPassword(loggedOutText);
197
+ // Login again: re-run first-run, which now reuses the generated credentials (hasProvidedCredentials
198
+ // → login intent). Pass ONLY when an authenticated/home state is observed; OTP/MFA → needs_input.
199
+ try {
200
+ const fr2 = await runFirstRun(sessions, session, driver, { mode: 'until_home', allowGeneratedAccount: true });
201
+ let login;
202
+ if (fr2.state === 'completed')
203
+ login = { status: 'pass', reason: `re-authenticated to home with the generated account (${fr2.pathTaken ?? 'login'})`, evidenceUris: fr2.evidenceUris, workflow: 'account_cycle' };
204
+ else if (fr2.accountOutcome === 'reached_verification')
205
+ login = { status: 'blocked', category: 'hard_gate', severity: 'medium', reason: 'login-again hit an OTP/verification gate (needs a real code)', evidenceUris: fr2.evidenceUris, workflow: 'account_cycle' };
206
+ else if (fr2.needsInput)
207
+ login = { status: 'blocked', category: 'hard_gate', severity: 'medium', reason: `login-again needs input: ${fr2.needsInput.reason}`, evidenceUris: fr2.evidenceUris, workflow: 'account_cycle' };
208
+ else
209
+ login = { status: 'fail', category: 'app_bug', severity: 'high', reason: `could not log back in with the generated account (${fr2.state}: ${fr2.stoppedReason})`, evidenceUris: fr2.evidenceUris, workflow: 'account_cycle' };
210
+ await finalize('login_again', 'Login again', login);
211
+ }
212
+ catch (e) {
213
+ await finalize('login_again', 'Login again', { status: 'fail', category: 'app_bug', severity: 'high', reason: `login-again errored: ${String(e.message ?? e)}`, evidenceUris: [], workflow: 'account_cycle' });
214
+ }
215
+ // Finalize forgot-password with the evidence captured on the logged-out surface (above).
216
+ await finalize('forgot_password', 'Forgot password surface', forgotResult);
217
+ }
218
+ else {
219
+ for (const [id, title] of [['logout', 'Logout'], ['login_again', 'Login again'], ['forgot_password', 'Forgot password surface']]) {
220
+ await finalize(id, title, { status: 'skipped', reason: 'account not established this run', evidenceUris: [], workflow: 'account_cycle' });
221
+ }
222
+ }
223
+ return runState;
224
+ }
225
+ /** Plan-only: the profile checklist + account-cycle safety, without driving the device. */
226
+ export function planMobileAudit(profile) {
227
+ return { checks: checksForProfile(profile) };
228
+ }
229
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/mobileAudit/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ // Locator suggestions + durability scoring (NEXT-PLAN: Locator And Maintainability). For each
2
+ // element, recommend the most durable way to target it and score how brittle that is, following
3
+ // the QA-standard priority: accessibility id / content-desc > resource-id / test tag > stable
4
+ // visible text > relative structure > coordinate/image (last resort). The screen-level
5
+ // "automation readiness" grade tells a developer how much of the UI needs testIDs.
6
+ const TIER_DURABILITY = {
7
+ accessibility: 95,
8
+ resource_id: 88,
9
+ visible_text: 60,
10
+ structure: 30,
11
+ coordinate: 10,
12
+ };
13
+ // Framework-noise resource ids that aren't durable QA handles.
14
+ const NOISE_ID = /(^android:id\/)|(:id\/(content|action_bar|decor_content_parent|navigationBarBackground|statusBarBackground)$)/i;
15
+ const isMeaningful = (s) => !!s && s.trim().length > 0;
16
+ function roleStem(role) {
17
+ const cleaned = role.split('.').pop()?.replace(/^XCUIElementType/i, '') || role;
18
+ const stem = cleaned.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '');
19
+ return stem || 'element';
20
+ }
21
+ function textStem(value) {
22
+ if (!isMeaningful(value))
23
+ return null;
24
+ const stem = value.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '').slice(0, 40).replace(/_+$/g, '');
25
+ return stem.length >= 2 ? stem : null;
26
+ }
27
+ function refStem(ref) {
28
+ return ref.replace(/[^a-z0-9]+/gi, '_').replace(/^_+|_+$/g, '').toLowerCase() || 'control';
29
+ }
30
+ function suggestedHandle(el, platform) {
31
+ const label = textStem(el.label) ?? textStem(el.text);
32
+ const role = roleStem(el.role);
33
+ const suffix = platform === 'ios' ? role : `${role}_testid`;
34
+ return label ? `${label}_${suffix}` : `${role}_${refStem(el.ref)}`;
35
+ }
36
+ function dynamicTextReason(value) {
37
+ if (!isMeaningful(value))
38
+ return null;
39
+ const text = value.trim();
40
+ if (text.length > 60)
41
+ return 'text is long and likely to change with content or localization';
42
+ if (/\b\d{1,2}[:/.-]\d{1,2}([:/.-]\d{2,4})?\b/.test(text))
43
+ return 'text contains a date/time-like value';
44
+ if (/\b\d+(?:[.,]\d+)?\b/.test(text) && /[$€£¥%]|\b(items?|results?|messages?|notifications?|total|balance|km|mi|min|sec|hours?)\b/i.test(text))
45
+ return 'text contains count, currency, percent, or measurement data';
46
+ if (/[0-9a-f]{8,}/i.test(text))
47
+ return 'text contains an id/hash-like token';
48
+ return null;
49
+ }
50
+ export function suggestLocator(el, opts = {}) {
51
+ const platform = opts.platform ?? 'generic';
52
+ const base = { ref: el.ref, role: el.role };
53
+ if (platform === 'ios') {
54
+ // iOS/XCUITest priority: accessibilityIdentifier first. Labels/names are useful, but copy
55
+ // and localization often change them; clickable controls without identifiers still need work.
56
+ if (isMeaningful(el.id) && !NOISE_ID.test(el.id)) {
57
+ return { ...base, platform, locatorKind: 'accessibility_identifier', tier: 'accessibility', durability: TIER_DURABILITY.accessibility, locator: el.id, rationale: 'accessibilityIdentifier — preferred durable iOS/XCUITest locator', needsTestId: false };
58
+ }
59
+ if (isMeaningful(el.label)) {
60
+ return { ...base, platform, locatorKind: 'accessibility_label', tier: 'accessibility', durability: 78, locator: el.label, rationale: 'accessibility label/name — usable, but add an accessibilityIdentifier for CI-stable iOS flows', needsTestId: el.clickable, suggestedTestId: el.clickable ? suggestedHandle(el, platform) : undefined };
61
+ }
62
+ if (isMeaningful(el.text)) {
63
+ const short = el.text.trim().length <= 2 || /^\d+$/.test(el.text.trim());
64
+ return { ...base, platform, locatorKind: 'visible_text', tier: 'visible_text', durability: short ? 35 : 58, locator: el.text, rationale: short ? 'visible value/text is short or numeric — brittle on iOS; add an accessibilityIdentifier' : 'visible value/text — usable but copy/localization dependent; prefer accessibilityIdentifier', needsTestId: el.clickable, suggestedTestId: el.clickable ? suggestedHandle(el, platform) : undefined };
65
+ }
66
+ if (el.clickable) {
67
+ return { ...base, platform, locatorKind: 'structure', tier: 'structure', durability: TIER_DURABILITY.structure, locator: null, rationale: 'hittable control has no accessibilityIdentifier, label, or text — predicate/class-chain/coordinates only; add an accessibilityIdentifier', needsTestId: true, suggestedTestId: suggestedHandle(el, platform) };
68
+ }
69
+ return { ...base, platform, locatorKind: 'coordinate', tier: 'coordinate', durability: TIER_DURABILITY.coordinate, locator: null, rationale: 'no durable iOS handle — visual/coordinate targeting only', needsTestId: el.clickable, suggestedTestId: el.clickable ? suggestedHandle(el, platform) : undefined };
70
+ }
71
+ // 1) accessibility id / content description (most durable; survives copy + layout changes)
72
+ if (isMeaningful(el.label)) {
73
+ return { ...base, platform, locatorKind: 'accessibility_label', tier: 'accessibility', durability: TIER_DURABILITY.accessibility, locator: el.label, rationale: 'content-desc / accessibility label — durable and a11y-friendly', needsTestId: false };
74
+ }
75
+ // 2) resource-id / test tag (durable when it's a real testID, not framework noise)
76
+ if (isMeaningful(el.id) && !NOISE_ID.test(el.id)) {
77
+ return { ...base, platform, locatorKind: 'resource_id', tier: 'resource_id', durability: TIER_DURABILITY.resource_id, locator: el.id, rationale: 'resource-id / testID — durable', needsTestId: false };
78
+ }
79
+ // 3) stable visible text (works, but copy/localization can change it)
80
+ if (isMeaningful(el.text)) {
81
+ const short = el.text.trim().length <= 2 || /^\d+$/.test(el.text.trim());
82
+ return { ...base, platform, locatorKind: 'visible_text', tier: 'visible_text', durability: short ? 40 : TIER_DURABILITY.visible_text, locator: el.text, rationale: short ? 'visible text, but very short/numeric — brittle; add a testID' : 'visible text — usable but breaks if copy/localization changes', needsTestId: el.clickable, suggestedTestId: el.clickable ? suggestedHandle(el, platform) : undefined };
83
+ }
84
+ // 4) relative structure (no handle at all on an interactive control)
85
+ if (el.clickable) {
86
+ return { ...base, platform, locatorKind: 'structure', tier: 'structure', durability: TIER_DURABILITY.structure, locator: null, rationale: 'clickable but has no id/label/text — only structural/coordinate targeting; add a testID', needsTestId: true, suggestedTestId: suggestedHandle(el, platform) };
87
+ }
88
+ // 5) coordinate / image (last resort)
89
+ return { ...base, platform, locatorKind: 'coordinate', tier: 'coordinate', durability: TIER_DURABILITY.coordinate, locator: null, rationale: 'no durable handle — coordinate/image match only', needsTestId: el.clickable, suggestedTestId: el.clickable ? suggestedHandle(el, platform) : undefined };
90
+ }
91
+ export function automationReadiness(suggestions, elements, opts = {}) {
92
+ const platform = opts.platform ?? 'generic';
93
+ const interactive = elements.filter((e) => e.clickable);
94
+ const byRef = new Map(suggestions.map((s) => [s.ref, s]));
95
+ const durable = interactive.filter((e) => {
96
+ const s = byRef.get(e.ref);
97
+ if (platform === 'ios')
98
+ return s?.locatorKind === 'accessibility_identifier';
99
+ const t = s?.tier;
100
+ return t === 'accessibility' || t === 'resource_id';
101
+ });
102
+ const durablePct = interactive.length ? Math.round((durable.length / interactive.length) * 100) : 100;
103
+ const grade = durablePct >= 90 ? 'A' : durablePct >= 70 ? 'B' : durablePct >= 50 ? 'C' : 'D';
104
+ const needTestIds = suggestions
105
+ .filter((s) => s.needsTestId)
106
+ .map((s) => ({ ref: s.ref, role: s.role, hint: byRef.get(s.ref)?.locator ? `currently targeted by ${byRef.get(s.ref).tier}: "${byRef.get(s.ref).locator}"` : 'no durable handle', suggestedTestId: s.suggestedTestId }));
107
+ return { grade, durablePct, interactiveCount: interactive.length, durableCount: durable.length, needTestIds, platform };
108
+ }
109
+ export function locatorReadinessIssues(suggestions, elements, opts = {}) {
110
+ const platform = opts.platform ?? 'generic';
111
+ const issues = [];
112
+ const byRef = new Map(elements.map((e) => [e.ref, e]));
113
+ if (platform === 'ios') {
114
+ const missing = suggestions.filter((s) => s.needsTestId && byRef.get(s.ref)?.clickable);
115
+ if (missing.length) {
116
+ const nameCounts = missing.reduce((acc, s) => {
117
+ if (s.suggestedTestId)
118
+ acc[s.suggestedTestId] = (acc[s.suggestedTestId] ?? 0) + 1;
119
+ return acc;
120
+ }, {});
121
+ issues.push({
122
+ code: 'IOS_MISSING_ACCESSIBILITY_IDENTIFIER',
123
+ severity: 'warn',
124
+ message: `${missing.length} interactive iOS control(s) lack a stable accessibilityIdentifier.`,
125
+ refs: missing.map((s) => s.ref),
126
+ suggestion: 'Add SwiftUI .accessibilityIdentifier(...), UIKit accessibilityIdentifier, or React Native testID for these controls.',
127
+ suggestedTestIds: missing
128
+ .filter((s) => s.suggestedTestId)
129
+ .map((s) => ({ ref: s.ref, name: nameCounts[s.suggestedTestId] > 1 ? `${s.suggestedTestId}_${refStem(s.ref)}` : s.suggestedTestId })),
130
+ });
131
+ }
132
+ const labels = new Map();
133
+ for (const e of elements) {
134
+ const label = e.label?.trim();
135
+ if (!label || !e.clickable)
136
+ continue;
137
+ const key = label.toLowerCase();
138
+ labels.set(key, [...(labels.get(key) ?? []), e.ref]);
139
+ }
140
+ for (const [label, refs] of labels) {
141
+ if (refs.length < 2)
142
+ continue;
143
+ issues.push({
144
+ code: 'IOS_DUPLICATE_LABEL',
145
+ severity: 'warn',
146
+ message: `Duplicate iOS accessibility label "${label}" appears on ${refs.length} interactive controls.`,
147
+ refs,
148
+ suggestion: 'Keep user-facing labels, but give each control a unique accessibilityIdentifier for automation.',
149
+ });
150
+ }
151
+ const dynamicText = suggestions
152
+ .filter((s) => s.locatorKind === 'visible_text' || s.locatorKind === 'accessibility_label')
153
+ .map((s) => ({ suggestion: s, reason: dynamicTextReason(s.locator ?? undefined) }))
154
+ .filter((x) => !!x.reason);
155
+ if (dynamicText.length) {
156
+ issues.push({
157
+ code: 'DYNAMIC_TEXT_LOCATOR',
158
+ severity: 'warn',
159
+ message: `${dynamicText.length} iOS locator candidate(s) depend on dynamic text.`,
160
+ refs: dynamicText.map((x) => x.suggestion.ref),
161
+ suggestion: 'Avoid dynamic labels/text in CI flows; add stable accessibilityIdentifier values and target those instead.',
162
+ });
163
+ }
164
+ }
165
+ const coordinateOnly = suggestions.filter((s) => s.tier === 'structure' || s.tier === 'coordinate');
166
+ if (coordinateOnly.length) {
167
+ issues.push({
168
+ code: 'COORDINATE_ONLY',
169
+ severity: 'warn',
170
+ message: `${coordinateOnly.length} element(s) have no semantic locator and would require structure, image, or coordinates.`,
171
+ refs: coordinateOnly.map((s) => s.ref),
172
+ suggestion: platform === 'ios' ? 'Add accessibilityIdentifier values before relying on these controls in CI.' : 'Add testID/resource-id/content-desc values before relying on these controls in CI.',
173
+ });
174
+ }
175
+ return issues;
176
+ }
177
+ //# sourceMappingURL=locator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locator.js","sourceRoot":"","sources":["../../src/oracle/locator.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -43,6 +43,15 @@ import { registerFirstRun } from './tools/firstRun.js';
43
43
  import { registerAutomationGenerate } from './tools/automationGenerate.js';
44
44
  import { registerAgentTools } from './tools/agent.js';
45
45
  import { registerAppMap, resolveAppMapRoot, readAppMapResource } from './tools/appMap.js';
46
+ import { registerIssues } from './tools/issues.js';
47
+ import { registerTestSuite } from './tools/testSuite.js';
48
+ import { registerFlowRepair } from './tools/flowRepair.js';
49
+ import { registerLocator } from './tools/locator.js';
50
+ import { registerWait } from './tools/wait.js';
51
+ import { registerIdling } from './tools/idling.js';
52
+ import { registerInputCapabilities } from './tools/inputCapabilities.js';
53
+ import { registerMaestro } from './tools/maestro.js';
54
+ import { registerMobileAudit } from './tools/mobileAudit.js';
46
55
  import { registerPrompts } from './prompts/index.js';
47
56
  import { log } from './lib/logger.js';
48
57
  import { runWithResponseMode } from './lib/result.js';
@@ -128,6 +137,17 @@ export function createServer() {
128
137
  registerAutomationGenerate(server, sessions);
129
138
  registerAgentTools(server, sessions);
130
139
  registerAppMap(server, sessions);
140
+ // Durable QA memory + repeatable assets (v3)
141
+ registerIssues(server, sessions);
142
+ registerMobileAudit(server, sessions);
143
+ registerTestSuite(server, sessions);
144
+ registerFlowRepair(server, sessions);
145
+ registerMaestro(server, sessions);
146
+ // Agent-efficiency helpers (v3)
147
+ registerLocator(server, sessions);
148
+ registerWait(server, sessions);
149
+ registerIdling(server, sessions);
150
+ registerInputCapabilities(server, sessions);
131
151
  // Tool surface is now fully registered. Freeze its content fingerprint.
132
152
  setSchemaHash(computeSchemaHash(surface));
133
153
  // Reusable workflow templates (MCP prompts capability) — thin orchestration of the tools above.
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAyB,MAAM,qBAAqB,CAAC;AAChH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAO1E;;;;GAIG;AACH,SAAS,0BAA0B,CAAC,MAAiB,EAAE,QAAsB,EAAE,OAA2B;IACxG,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAsF,CAAC;IACnI,MAAM,KAAK,GAAG,CAAC,CAAU,EAAyC,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS,CAAC;IACzH,MAAmD,CAAC,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QAC5F,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QAC/C,iGAAiG;QACjG,4FAA4F;QAC5F,MAAM,GAAG,GAAG,MAAqF,CAAC;QAClG,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxG,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,CAAY,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAA+D,CAAC;YACjF,yFAAyF;YACzF,kFAAkF;YAClF,MAAM,WAAW,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/F,MAAM,IAAI,GAAG,WAAW,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,KAAM,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC1F,OAAO,mBAAmB,CAAC,IAAwC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,0BAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEtD,kBAAkB;IAClB,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9B,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9B,4CAA4C;IAC5C,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,gCAAgC;IAChC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9B,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,6CAA6C;IAC7C,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrC,yBAAyB;IACzB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,oCAAoC;IACpC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,8CAA8C;IAC9C,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3C,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEjC,wEAAwE;IACxE,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE1C,gGAAgG;IAChG,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,2FAA2F;IAC3F,MAAM,CAAC,gBAAgB,CACrB,aAAa,EACb,IAAI,gBAAgB,CAAC,6CAA6C,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EACxF,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,uDAAuD,EAAE,EAC9F,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;QACtB,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAChH,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACrG,CAAC,CACF,CAAC;IAEF,8FAA8F;IAC9F,kGAAkG;IAClG,MAAM,CAAC,gBAAgB,CACrB,YAAY,EACZ,IAAI,gBAAgB,CAAC,mDAAmD,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAC9F,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,oEAAoE,EAAE,EACjH,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvD,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACnF,CAAC,CACF,CAAC;IACF,kFAAkF;IAClF,MAAM,CAAC,gBAAgB,CACrB,iBAAiB,EACjB,IAAI,gBAAgB,CAAC,uCAAuC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAClF,EAAE,KAAK,EAAE,0BAA0B,EAAE,WAAW,EAAE,oCAAoC,EAAE,EACxF,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAC9F,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACnF,CAAC,CACF,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,0FAA0F;IAC1F,0FAA0F;IAC1F,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,eAAe,GAAG,KAAK,EAAE,IAAY,EAAE,GAAW,EAAE,EAAE;QAC1D,IAAI,SAAS;YAAE,OAAO;QACtB,SAAS,GAAG,IAAI,CAAC;QACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;QACzE,GAAG,CAAC,MAAM,EAAE,6BAA6B,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAClC,MAAM,iBAAiB,EAAE,CAAC,CAAC,sDAAsD;YACjF,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,yDAAyD;YACvF,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,MAAM,EAAE,0BAA0B,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IAEpE,6FAA6F;IAC7F,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAEjF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,yFAAyF;IACzF,0FAA0F;IAC1F,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC;IACrC,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;QACvB,UAAU,EAAE,EAAE,CAAC;QACf,KAAK,eAAe,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC7C,CAAC,CAAC;IACF,GAAG,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ // Exporters for the persistent suite (SWIPIUM-REQ-06 "qa_test_suite_export"). PURE: serialize the
2
+ // canonical suite to Markdown (review-ready), a per-functionality YAML directory, JSON, and a
3
+ // JUnit-like results doc. TestRail CSV / Jira-Xray are explicitly deferred (Non-Goals) — the shapes
4
+ // here are the v1 surface other tools can build on.
5
+ import { stringify } from 'yaml';
6
+ import { functionalitySlug } from './schema.js';
7
+ function groupByFunctionality(cases) {
8
+ const groups = new Map();
9
+ for (const c of cases) {
10
+ const key = c.functionality;
11
+ (groups.get(key) ?? groups.set(key, []).get(key)).push(c);
12
+ }
13
+ return groups;
14
+ }
15
+ function xmlEscape(s) {
16
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
17
+ }
18
+ export function exportMarkdown(suite) {
19
+ const out = ['# QA Test Suite', '', `Updated: ${suite.updatedAt}`, `Cases: ${suite.cases.length}`, ''];
20
+ for (const [functionality, cases] of groupByFunctionality(suite.cases)) {
21
+ out.push(`## ${functionality}`, '');
22
+ for (const c of cases) {
23
+ out.push(`### ${c.id}: ${c.title}`, '', `- **Priority:** ${c.priority} **Type:** ${c.type} **Creativity:** ${c.creativityLevel} **Status:** ${c.status}`, `- **Platforms:** ${c.platforms.join(', ')} **Automation:** ${c.automation.status} (locators ${c.automation.locatorReadiness}, replay ${c.automation.replayStatus})`, `- **Objective:** ${c.objective}`, '', '**Preconditions:**', ...(c.preconditions.length ? c.preconditions.map((p) => `- ${p}`) : ['- _none_']), '', '**Steps:**', ...(c.steps.length ? c.steps.map((s) => `${s.index}. ${s.action}${s.target ? ` → ${s.target}` : ''}${s.data ? ` [${s.data}]` : ''}`) : ['- _none_']), '', '**Expected:**', ...c.expectedResult.map((e) => `- ${e}`), '', `**Actual:** ${c.actualResult.status} — ${c.actualResult.summary}`, ...(c.evidence.length ? ['', `**Evidence:** ${c.evidence.map((e) => e.uri).join(', ')}`] : []), ...(c.ticketRefs.length ? [`**Tickets:** ${c.ticketRefs.join(', ')}`] : []), ...(c.requirementRefs.length ? [`**Requirements:** ${c.requirementRefs.join(', ')}`] : []), ...(c.issueRefs?.length ? [`**Linked issues:** ${c.issueRefs.map((r) => `${r.issueId} (${r.relationship}, ${r.lastIssueState})`).join(', ')}`] : []), ...(c.risk.length ? ['', '**Risks:**', ...c.risk.map((r) => `- ${r}`)] : []), `- **History:** ${c.history.length} run(s)`, '');
24
+ }
25
+ }
26
+ return out.join('\n');
27
+ }
28
+ export function exportYamlFiles(suite) {
29
+ return suite.cases.map((c) => ({
30
+ path: `${functionalitySlug(c.functionality)}/${c.id}.yaml`,
31
+ content: stringify(c),
32
+ }));
33
+ }
34
+ export function exportJunit(suite) {
35
+ const groups = groupByFunctionality(suite.cases);
36
+ const lines = ['<?xml version="1.0" encoding="UTF-8"?>', '<testsuites name="swipium-test-suite">'];
37
+ for (const [functionality, cases] of groups) {
38
+ const failures = cases.filter((c) => c.actualResult.status === 'fail').length;
39
+ const skipped = cases.filter((c) => c.actualResult.status === 'skipped' || c.actualResult.status === 'not_run' || c.actualResult.status === 'blocked').length;
40
+ lines.push(` <testsuite name="${xmlEscape(functionality)}" tests="${cases.length}" failures="${failures}" skipped="${skipped}">`);
41
+ for (const c of cases) {
42
+ lines.push(` <testcase classname="${xmlEscape(functionality)}" name="${xmlEscape(`${c.id}: ${c.title}`)}">`);
43
+ if (c.actualResult.status === 'fail') {
44
+ lines.push(` <failure message="${xmlEscape(c.actualResult.summary)}"${c.actualResult.failureCode ? ` type="${xmlEscape(c.actualResult.failureCode)}"` : ''}/>`);
45
+ }
46
+ else if (c.actualResult.status === 'skipped' || c.actualResult.status === 'not_run' || c.actualResult.status === 'blocked') {
47
+ lines.push(` <skipped message="${xmlEscape(c.actualResult.status)}: ${xmlEscape(c.actualResult.summary)}"/>`);
48
+ }
49
+ lines.push(' </testcase>');
50
+ }
51
+ lines.push(' </testsuite>');
52
+ }
53
+ lines.push('</testsuites>');
54
+ return lines.join('\n');
55
+ }
56
+ export function exportSuite(suite, format) {
57
+ switch (format) {
58
+ case 'json':
59
+ return { format, content: JSON.stringify(suite, null, 2), summary: `Exported ${suite.cases.length} case(s) as JSON.` };
60
+ case 'markdown':
61
+ return { format, content: exportMarkdown(suite), summary: `Exported ${suite.cases.length} case(s) as Markdown.` };
62
+ case 'junit':
63
+ return { format, content: exportJunit(suite), summary: `Exported ${suite.cases.length} case(s) as JUnit XML.` };
64
+ case 'yaml': {
65
+ const files = exportYamlFiles(suite);
66
+ return { format, files, summary: `Exported ${files.length} case file(s) as YAML.` };
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=exporter.js.map