@opentabs-dev/opentabs-plugin-meticulous 0.0.76
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/README.md +159 -0
- package/dist/adapter.iife.js +15945 -0
- package/dist/adapter.iife.js.map +7 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/meticulous-api.d.ts +34 -0
- package/dist/meticulous-api.d.ts.map +1 -0
- package/dist/meticulous-api.js +477 -0
- package/dist/meticulous-api.js.map +1 -0
- package/dist/tools/accept-all-diffs.d.ts +8 -0
- package/dist/tools/accept-all-diffs.d.ts.map +1 -0
- package/dist/tools/accept-all-diffs.js +23 -0
- package/dist/tools/accept-all-diffs.js.map +1 -0
- package/dist/tools/check-for-flakes.d.ts +8 -0
- package/dist/tools/check-for-flakes.d.ts.map +1 -0
- package/dist/tools/check-for-flakes.js +26 -0
- package/dist/tools/check-for-flakes.js.map +1 -0
- package/dist/tools/compare-replays.d.ts +68 -0
- package/dist/tools/compare-replays.d.ts.map +1 -0
- package/dist/tools/compare-replays.js +53 -0
- package/dist/tools/compare-replays.js.map +1 -0
- package/dist/tools/create-label-action.d.ts +16 -0
- package/dist/tools/create-label-action.d.ts.map +1 -0
- package/dist/tools/create-label-action.js +29 -0
- package/dist/tools/create-label-action.js.map +1 -0
- package/dist/tools/get-current-user.d.ts +12 -0
- package/dist/tools/get-current-user.d.ts.map +1 -0
- package/dist/tools/get-current-user.js +22 -0
- package/dist/tools/get-current-user.js.map +1 -0
- package/dist/tools/get-project-pull-request.d.ts +14 -0
- package/dist/tools/get-project-pull-request.d.ts.map +1 -0
- package/dist/tools/get-project-pull-request.js +23 -0
- package/dist/tools/get-project-pull-request.js.map +1 -0
- package/dist/tools/get-project.d.ts +20 -0
- package/dist/tools/get-project.d.ts.map +1 -0
- package/dist/tools/get-project.js +25 -0
- package/dist/tools/get-project.js.map +1 -0
- package/dist/tools/get-replay-screenshots.d.ts +16 -0
- package/dist/tools/get-replay-screenshots.d.ts.map +1 -0
- package/dist/tools/get-replay-screenshots.js +27 -0
- package/dist/tools/get-replay-screenshots.js.map +1 -0
- package/dist/tools/get-replay.d.ts +17 -0
- package/dist/tools/get-replay.d.ts.map +1 -0
- package/dist/tools/get-replay.js +21 -0
- package/dist/tools/get-replay.js.map +1 -0
- package/dist/tools/get-session-events.d.ts +14 -0
- package/dist/tools/get-session-events.d.ts.map +1 -0
- package/dist/tools/get-session-events.js +27 -0
- package/dist/tools/get-session-events.js.map +1 -0
- package/dist/tools/get-session.d.ts +19 -0
- package/dist/tools/get-session.d.ts.map +1 -0
- package/dist/tools/get-session.js +21 -0
- package/dist/tools/get-session.js.map +1 -0
- package/dist/tools/get-test-run-coverage.d.ts +83 -0
- package/dist/tools/get-test-run-coverage.d.ts.map +1 -0
- package/dist/tools/get-test-run-coverage.js +64 -0
- package/dist/tools/get-test-run-coverage.js.map +1 -0
- package/dist/tools/get-test-run-diffs.d.ts +56 -0
- package/dist/tools/get-test-run-diffs.d.ts.map +1 -0
- package/dist/tools/get-test-run-diffs.js +53 -0
- package/dist/tools/get-test-run-diffs.js.map +1 -0
- package/dist/tools/get-test-run-pr-description.d.ts +8 -0
- package/dist/tools/get-test-run-pr-description.d.ts.map +1 -0
- package/dist/tools/get-test-run-pr-description.js +26 -0
- package/dist/tools/get-test-run-pr-description.js.map +1 -0
- package/dist/tools/get-test-run-screenshots.d.ts +70 -0
- package/dist/tools/get-test-run-screenshots.d.ts.map +1 -0
- package/dist/tools/get-test-run-screenshots.js +61 -0
- package/dist/tools/get-test-run-screenshots.js.map +1 -0
- package/dist/tools/get-test-run-source-code.d.ts +9 -0
- package/dist/tools/get-test-run-source-code.d.ts.map +1 -0
- package/dist/tools/get-test-run-source-code.js +24 -0
- package/dist/tools/get-test-run-source-code.js.map +1 -0
- package/dist/tools/get-test-run-test-cases.d.ts +25 -0
- package/dist/tools/get-test-run-test-cases.d.ts.map +1 -0
- package/dist/tools/get-test-run-test-cases.js +60 -0
- package/dist/tools/get-test-run-test-cases.js.map +1 -0
- package/dist/tools/get-test-run.d.ts +29 -0
- package/dist/tools/get-test-run.d.ts.map +1 -0
- package/dist/tools/get-test-run.js +30 -0
- package/dist/tools/get-test-run.js.map +1 -0
- package/dist/tools/list-github-repositories.d.ts +11 -0
- package/dist/tools/list-github-repositories.d.ts.map +1 -0
- package/dist/tools/list-github-repositories.js +19 -0
- package/dist/tools/list-github-repositories.js.map +1 -0
- package/dist/tools/list-organization-members.d.ts +18 -0
- package/dist/tools/list-organization-members.d.ts.map +1 -0
- package/dist/tools/list-organization-members.js +21 -0
- package/dist/tools/list-organization-members.js.map +1 -0
- package/dist/tools/list-organizations.d.ts +9 -0
- package/dist/tools/list-organizations.d.ts.map +1 -0
- package/dist/tools/list-organizations.js +19 -0
- package/dist/tools/list-organizations.js.map +1 -0
- package/dist/tools/list-projects.d.ts +14 -0
- package/dist/tools/list-projects.d.ts.map +1 -0
- package/dist/tools/list-projects.js +19 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-replays.d.ts +18 -0
- package/dist/tools/list-replays.d.ts.map +1 -0
- package/dist/tools/list-replays.js +25 -0
- package/dist/tools/list-replays.js.map +1 -0
- package/dist/tools/list-sessions.d.ts +20 -0
- package/dist/tools/list-sessions.d.ts.map +1 -0
- package/dist/tools/list-sessions.js +22 -0
- package/dist/tools/list-sessions.js.map +1 -0
- package/dist/tools/schemas.d.ts +560 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +303 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/search-sessions.d.ts +24 -0
- package/dist/tools/search-sessions.d.ts.map +1 -0
- package/dist/tools/search-sessions.js +33 -0
- package/dist/tools/search-sessions.js.map +1 -0
- package/dist/tools/upsert-diff-approval.d.ts +12 -0
- package/dist/tools/upsert-diff-approval.d.ts.map +1 -0
- package/dist/tools/upsert-diff-approval.js +36 -0
- package/dist/tools/upsert-diff-approval.js.map +1 -0
- package/dist/tools.json +4020 -0
- package/package.json +58 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import type { ToolDefinition } from '@opentabs-dev/plugin-sdk';
|
|
3
|
+
declare class MeticulousPlugin extends OpenTabsPlugin {
|
|
4
|
+
readonly name = "meticulous";
|
|
5
|
+
readonly description = "OpenTabs plugin for Meticulous";
|
|
6
|
+
readonly displayName = "Meticulous";
|
|
7
|
+
readonly urlPatterns: string[];
|
|
8
|
+
readonly homepage = "https://app.meticulous.ai";
|
|
9
|
+
readonly tools: ToolDefinition[];
|
|
10
|
+
isReady(): Promise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
declare const _default: MeticulousPlugin;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAuC/D,cAAM,gBAAiB,SAAQ,cAAc;IAC3C,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,oCAAoC;IACxD,SAAkB,WAAW,gBAAgB;IAC7C,QAAQ,CAAC,WAAW,WAA+B;IACnD,SAAkB,QAAQ,+BAA+B;IAEzD,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAoC9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAsC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { isAuthenticated, waitForAuth } from './meticulous-api.js';
|
|
3
|
+
// User & Organizations
|
|
4
|
+
import { getCurrentUser } from './tools/get-current-user.js';
|
|
5
|
+
import { listOrganizations } from './tools/list-organizations.js';
|
|
6
|
+
import { listOrganizationMembers } from './tools/list-organization-members.js';
|
|
7
|
+
// Projects
|
|
8
|
+
import { listProjects } from './tools/list-projects.js';
|
|
9
|
+
import { getProject } from './tools/get-project.js';
|
|
10
|
+
import { getProjectPullRequest } from './tools/get-project-pull-request.js';
|
|
11
|
+
import { listGithubRepositories } from './tools/list-github-repositories.js';
|
|
12
|
+
// Test Runs
|
|
13
|
+
import { getTestRun } from './tools/get-test-run.js';
|
|
14
|
+
import { getTestRunScreenshots } from './tools/get-test-run-screenshots.js';
|
|
15
|
+
import { getTestRunDiffs } from './tools/get-test-run-diffs.js';
|
|
16
|
+
import { getTestRunTestCases } from './tools/get-test-run-test-cases.js';
|
|
17
|
+
import { getTestRunCoverage } from './tools/get-test-run-coverage.js';
|
|
18
|
+
import { getTestRunSourceCode } from './tools/get-test-run-source-code.js';
|
|
19
|
+
import { getTestRunPrDescription } from './tools/get-test-run-pr-description.js';
|
|
20
|
+
import { acceptAllDiffs } from './tools/accept-all-diffs.js';
|
|
21
|
+
import { checkForFlakes } from './tools/check-for-flakes.js';
|
|
22
|
+
import { createLabelAction } from './tools/create-label-action.js';
|
|
23
|
+
import { upsertDiffApproval } from './tools/upsert-diff-approval.js';
|
|
24
|
+
// Replays
|
|
25
|
+
import { getReplay } from './tools/get-replay.js';
|
|
26
|
+
import { listReplays } from './tools/list-replays.js';
|
|
27
|
+
import { getReplayScreenshots } from './tools/get-replay-screenshots.js';
|
|
28
|
+
import { compareReplays } from './tools/compare-replays.js';
|
|
29
|
+
// Sessions
|
|
30
|
+
import { listSessions } from './tools/list-sessions.js';
|
|
31
|
+
import { getSession } from './tools/get-session.js';
|
|
32
|
+
import { searchSessions } from './tools/search-sessions.js';
|
|
33
|
+
import { getSessionEvents } from './tools/get-session-events.js';
|
|
34
|
+
class MeticulousPlugin extends OpenTabsPlugin {
|
|
35
|
+
name = 'meticulous';
|
|
36
|
+
description = 'OpenTabs plugin for Meticulous';
|
|
37
|
+
displayName = 'Meticulous';
|
|
38
|
+
urlPatterns = ['*://app.meticulous.ai/*'];
|
|
39
|
+
homepage = 'https://app.meticulous.ai';
|
|
40
|
+
tools = [
|
|
41
|
+
// User & Organizations
|
|
42
|
+
getCurrentUser,
|
|
43
|
+
listOrganizations,
|
|
44
|
+
listOrganizationMembers,
|
|
45
|
+
// Projects
|
|
46
|
+
listProjects,
|
|
47
|
+
getProject,
|
|
48
|
+
getProjectPullRequest,
|
|
49
|
+
listGithubRepositories,
|
|
50
|
+
// Test Runs
|
|
51
|
+
getTestRun,
|
|
52
|
+
getTestRunScreenshots,
|
|
53
|
+
getTestRunDiffs,
|
|
54
|
+
getTestRunTestCases,
|
|
55
|
+
getTestRunCoverage,
|
|
56
|
+
getTestRunSourceCode,
|
|
57
|
+
getTestRunPrDescription,
|
|
58
|
+
acceptAllDiffs,
|
|
59
|
+
checkForFlakes,
|
|
60
|
+
createLabelAction,
|
|
61
|
+
upsertDiffApproval,
|
|
62
|
+
// Replays
|
|
63
|
+
getReplay,
|
|
64
|
+
listReplays,
|
|
65
|
+
getReplayScreenshots,
|
|
66
|
+
compareReplays,
|
|
67
|
+
// Sessions
|
|
68
|
+
listSessions,
|
|
69
|
+
getSession,
|
|
70
|
+
searchSessions,
|
|
71
|
+
getSessionEvents,
|
|
72
|
+
];
|
|
73
|
+
async isReady() {
|
|
74
|
+
if (isAuthenticated())
|
|
75
|
+
return true;
|
|
76
|
+
return waitForAuth();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export default new MeticulousPlugin();
|
|
80
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnE,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAE7E,YAAY;AACZ,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,UAAU;AACV,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,gBAAiB,SAAQ,cAAc;IAClC,IAAI,GAAG,YAAY,CAAC;IACpB,WAAW,GAAG,gCAAgC,CAAC;IACtC,WAAW,GAAG,YAAY,CAAC;IACpC,WAAW,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACjC,QAAQ,GAAG,2BAA2B,CAAC;IAEhD,KAAK,GAAqB;QACjC,uBAAuB;QACvB,cAAc;QACd,iBAAiB;QACjB,uBAAuB;QAEvB,WAAW;QACX,YAAY;QACZ,UAAU;QACV,qBAAqB;QACrB,sBAAsB;QAEtB,YAAY;QACZ,UAAU;QACV,qBAAqB;QACrB,eAAe;QACf,mBAAmB;QACnB,kBAAkB;QAClB,oBAAoB;QACpB,uBAAuB;QACvB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,kBAAkB;QAElB,UAAU;QACV,SAAS;QACT,WAAW;QACX,oBAAoB;QACpB,cAAc;QAEd,WAAW;QACX,YAAY;QACZ,UAAU;QACV,cAAc;QACd,gBAAgB;KACjB,CAAC;IAEF,KAAK,CAAC,OAAO;QACX,IAAI,eAAe,EAAE;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;CACF;AAED,eAAe,IAAI,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const isAuthenticated: () => boolean;
|
|
2
|
+
export declare const waitForAuth: () => Promise<boolean>;
|
|
3
|
+
export declare const graphql: <T>(query: string, variables?: Record<string, unknown>) => Promise<T>;
|
|
4
|
+
export declare const queries: {
|
|
5
|
+
GET_USER_CONTEXT: string;
|
|
6
|
+
GET_ORGANIZATIONS: string;
|
|
7
|
+
GET_ORGANIZATION_MEMBERSHIPS: string;
|
|
8
|
+
GET_PROJECTS: string;
|
|
9
|
+
GET_PROJECT: string;
|
|
10
|
+
GET_PROJECT_PULL_REQUEST: string;
|
|
11
|
+
GET_TEST_RUN: string;
|
|
12
|
+
GET_TEST_RUN_SCREENSHOTS: string;
|
|
13
|
+
GET_TEST_RUN_DIFFS: string;
|
|
14
|
+
GET_TEST_RUN_TEST_CASES: string;
|
|
15
|
+
GET_TEST_RUN_COVERAGE: string;
|
|
16
|
+
GET_TEST_RUN_SOURCE_CODE: string;
|
|
17
|
+
GET_TEST_RUN_PR_DESCRIPTION: string;
|
|
18
|
+
GET_REPLAY: string;
|
|
19
|
+
GET_REPLAYS_FOR_PROJECT: string;
|
|
20
|
+
GET_REPLAY_SCREENSHOTS: string;
|
|
21
|
+
GET_COMPARE_REPLAYS: string;
|
|
22
|
+
GET_SESSIONS_FOR_PROJECT: string;
|
|
23
|
+
GET_SESSION: string;
|
|
24
|
+
SEARCH_SESSIONS: string;
|
|
25
|
+
GET_SESSION_EVENTS: string;
|
|
26
|
+
GET_GITHUB_REPOSITORIES: string;
|
|
27
|
+
};
|
|
28
|
+
export declare const mutations: {
|
|
29
|
+
ACCEPT_ALL_DIFFS: string;
|
|
30
|
+
CHECK_FOR_FLAKES: string;
|
|
31
|
+
CREATE_LABEL_ACTION: string;
|
|
32
|
+
UPSERT_DIFF_APPROVAL_STATES: string;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=meticulous-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meticulous-api.d.ts","sourceRoot":"","sources":["../src/meticulous-api.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,eAAe,QAAO,OAGlC,CAAC;AAEF,eAAO,MAAM,WAAW,QAAO,OAAO,CAAC,OAAO,CAI3C,CAAC;AA0KJ,eAAO,MAAM,OAAO,GAAU,CAAC,EAAE,OAAO,MAAM,EAAE,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,CAAC,CA2B9F,CAAC;AAIF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;CA8QnB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;CA4CrB,CAAC"}
|
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import { ToolError, getLocalStorage, postJSON, waitUntil } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
// --- Auth detection ---
|
|
3
|
+
// Meticulous uses HttpOnly session cookies (meticulous.sid) for API auth.
|
|
4
|
+
// The meticulous_auth localStorage key is set when the user is logged in,
|
|
5
|
+
// serving as a client-side indicator. Actual API auth uses the session cookie
|
|
6
|
+
// sent automatically via credentials: 'include' (handled by postJSON).
|
|
7
|
+
export const isAuthenticated = () => {
|
|
8
|
+
const auth = getLocalStorage('meticulous_auth');
|
|
9
|
+
return auth !== null && auth.length > 0;
|
|
10
|
+
};
|
|
11
|
+
export const waitForAuth = () => waitUntil(() => isAuthenticated(), { interval: 500, timeout: 5000 }).then(() => true, () => false);
|
|
12
|
+
// --- GraphQL fragments ---
|
|
13
|
+
const ORGANIZATION_FRAGMENT = `
|
|
14
|
+
fragment OrganizationFragment on Organization {
|
|
15
|
+
id name createdAt updatedAt
|
|
16
|
+
}
|
|
17
|
+
`;
|
|
18
|
+
const USER_FRAGMENT = `
|
|
19
|
+
fragment UserFragment on User {
|
|
20
|
+
id sub email firstName lastName isAdmin canAccessMetrics
|
|
21
|
+
createdAt updatedAt
|
|
22
|
+
}
|
|
23
|
+
`;
|
|
24
|
+
const PROJECT_FRAGMENT = `
|
|
25
|
+
fragment ProjectFragment on Project {
|
|
26
|
+
id name hostKind repositoryData recordingToken apiToken status
|
|
27
|
+
createdAt updatedAt
|
|
28
|
+
organization { ...OrganizationFragment }
|
|
29
|
+
settings { enterpriseGradeSecurity }
|
|
30
|
+
sessionSelectionConfig { autoSessionSelection { enabled } }
|
|
31
|
+
}
|
|
32
|
+
${ORGANIZATION_FRAGMENT}
|
|
33
|
+
`;
|
|
34
|
+
const PROJECT_LIST_ITEM_FRAGMENT = `
|
|
35
|
+
fragment ProjectListItemFragment on Project {
|
|
36
|
+
id name hostKind repositoryData status
|
|
37
|
+
organization { ...OrganizationFragment }
|
|
38
|
+
latestSuccessfulTestRun {
|
|
39
|
+
createdAt
|
|
40
|
+
stats { totalSessions totalScreenshots }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
${ORGANIZATION_FRAGMENT}
|
|
44
|
+
`;
|
|
45
|
+
const SCREENSHOTS_DATA_FRAGMENT = `
|
|
46
|
+
fragment ScreenshotsDataFragment on ReplayScreenshotData {
|
|
47
|
+
publicUrl filename
|
|
48
|
+
identifier {
|
|
49
|
+
... on ScreenshotAfterEvent { __typename type eventNumber }
|
|
50
|
+
... on EndStateScreenshot { __typename type }
|
|
51
|
+
}
|
|
52
|
+
route { url group }
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
const SCREENSHOT_DIFF_RESULT_FRAGMENT = `
|
|
56
|
+
fragment ScreenshotDiffResultFragment on ScreenshotDiffResult {
|
|
57
|
+
outcome userVisibleOutcome groupId
|
|
58
|
+
changedSectionsClassNames isClassNamesListTruncated
|
|
59
|
+
diffInBoundingBoxOfIgnoredElement
|
|
60
|
+
width mismatchPixels diffHash
|
|
61
|
+
baseReplayScreenshot {
|
|
62
|
+
filename publicUrl replayId
|
|
63
|
+
route { url group }
|
|
64
|
+
identifier {
|
|
65
|
+
... on ScreenshotAfterEvent { type eventNumber }
|
|
66
|
+
... on EndStateScreenshot { type }
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
headReplayScreenshot {
|
|
70
|
+
filename publicUrl replayId
|
|
71
|
+
route { url group }
|
|
72
|
+
identifier {
|
|
73
|
+
... on ScreenshotAfterEvent { type eventNumber }
|
|
74
|
+
... on EndStateScreenshot { type }
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
diffScreenshot {
|
|
78
|
+
baseReplayId filename publicUrlThumb publicUrlFull
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
`;
|
|
82
|
+
const REPLAY_FRAGMENT = `
|
|
83
|
+
fragment ReplayFragment on Replay {
|
|
84
|
+
id commitSha meticulousSha status version createdAt updatedAt isAccurate
|
|
85
|
+
project { id name organization { name } }
|
|
86
|
+
parameters { appUrl originalAppUrl }
|
|
87
|
+
session { id }
|
|
88
|
+
}
|
|
89
|
+
`;
|
|
90
|
+
const TEST_RUN_CONTEXT_FIELDS = `
|
|
91
|
+
... on TestRunGitHubPullRequestContext {
|
|
92
|
+
type event title number htmlUrl baseSha baseRef headSha headRef runId
|
|
93
|
+
}
|
|
94
|
+
... on TestRunGitHubPushContext {
|
|
95
|
+
type event beforeSha afterSha ref runId
|
|
96
|
+
}
|
|
97
|
+
... on TestRunGitLabMergeRequestContext {
|
|
98
|
+
type event title internalId baseSha headSha webUrl baseRef headRef
|
|
99
|
+
}
|
|
100
|
+
... on TestRunGitLabPushContext {
|
|
101
|
+
type event beforeSha afterSha ref
|
|
102
|
+
}
|
|
103
|
+
... on TestRunBitbucketPullRequestContext {
|
|
104
|
+
type event title number htmlUrl baseSha baseRef headSha headRef
|
|
105
|
+
}
|
|
106
|
+
`;
|
|
107
|
+
const TEST_RUN_FRAGMENT = `
|
|
108
|
+
fragment TestRunFragment on TestRun {
|
|
109
|
+
id commitSha executionSha meticulousSha status
|
|
110
|
+
createdAt updatedAt
|
|
111
|
+
project { ...ProjectFragment }
|
|
112
|
+
configData {
|
|
113
|
+
testCases arguments
|
|
114
|
+
environment {
|
|
115
|
+
ci cloudReplay trigger
|
|
116
|
+
context { ${TEST_RUN_CONTEXT_FIELDS} }
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
stats {
|
|
120
|
+
totalScreenshots totalSessions
|
|
121
|
+
totalSessionsReplayed sessionsSkipped screenshotsSkipped
|
|
122
|
+
}
|
|
123
|
+
describeTested
|
|
124
|
+
pullRequest { id approvalState createdAt updatedAt latestTestRunId }
|
|
125
|
+
labelActions { id replayDiffId screenshotFileName label data createdAt }
|
|
126
|
+
}
|
|
127
|
+
${PROJECT_FRAGMENT}
|
|
128
|
+
`;
|
|
129
|
+
const ROUTE_COVERAGE_FRAGMENT = `
|
|
130
|
+
fragment RouteCoverageFragment on RouteCoverage {
|
|
131
|
+
route { group url }
|
|
132
|
+
variants {
|
|
133
|
+
variantId
|
|
134
|
+
screenshots { filename publicUrl replayId fetchedFromBase }
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
`;
|
|
138
|
+
const PULL_REQUEST_FRAGMENT = `
|
|
139
|
+
fragment PullRequestFragment on PullRequest {
|
|
140
|
+
id approvalState createdAt updatedAt latestTestRunId
|
|
141
|
+
}
|
|
142
|
+
`;
|
|
143
|
+
const SESSION_FRAGMENT = `
|
|
144
|
+
fragment RecordedSessionFragment on RecordedSession {
|
|
145
|
+
id hostname datetime numberUserEvents numberBytes
|
|
146
|
+
source startUrl abandoned description isPatched
|
|
147
|
+
project { id name organization { id name } }
|
|
148
|
+
metadata { navigator { webdriver } }
|
|
149
|
+
}
|
|
150
|
+
`;
|
|
151
|
+
const SESSION_USER_EVENTS_FRAGMENT = `
|
|
152
|
+
fragment RecordedSessionUserEventsFragment on RecordedSession {
|
|
153
|
+
id
|
|
154
|
+
data {
|
|
155
|
+
userEvents { type timestamp selector clientX clientY }
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
`;
|
|
159
|
+
export const graphql = async (query, variables) => {
|
|
160
|
+
if (!isAuthenticated()) {
|
|
161
|
+
throw ToolError.auth('Not authenticated — please log in to Meticulous.');
|
|
162
|
+
}
|
|
163
|
+
const result = (await postJSON('/api/graphql', {
|
|
164
|
+
query,
|
|
165
|
+
variables,
|
|
166
|
+
}));
|
|
167
|
+
if (!result) {
|
|
168
|
+
throw ToolError.internal('GraphQL response was empty');
|
|
169
|
+
}
|
|
170
|
+
if (result.errors?.length) {
|
|
171
|
+
const msg = result.errors.map(e => e.message).join('; ');
|
|
172
|
+
const code = result.errors[0]?.extensions?.code;
|
|
173
|
+
if (code === 'UNAUTHENTICATED')
|
|
174
|
+
throw ToolError.auth(msg);
|
|
175
|
+
if (code === 'FORBIDDEN')
|
|
176
|
+
throw ToolError.auth(msg);
|
|
177
|
+
throw ToolError.internal(`GraphQL error: ${msg}`);
|
|
178
|
+
}
|
|
179
|
+
if (!result.data) {
|
|
180
|
+
throw ToolError.internal('GraphQL response contained no data');
|
|
181
|
+
}
|
|
182
|
+
return result.data;
|
|
183
|
+
};
|
|
184
|
+
// --- Typed query helpers ---
|
|
185
|
+
export const queries = {
|
|
186
|
+
GET_USER_CONTEXT: `
|
|
187
|
+
query GetUserContext {
|
|
188
|
+
authInfo {
|
|
189
|
+
isSignedIn
|
|
190
|
+
user { ...UserFragment }
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
${USER_FRAGMENT}
|
|
194
|
+
`,
|
|
195
|
+
GET_ORGANIZATIONS: `
|
|
196
|
+
query GetOrganizations {
|
|
197
|
+
organizations { ...OrganizationFragment }
|
|
198
|
+
}
|
|
199
|
+
${ORGANIZATION_FRAGMENT}
|
|
200
|
+
`,
|
|
201
|
+
GET_ORGANIZATION_MEMBERSHIPS: `
|
|
202
|
+
query GetOrganizationMemberships($organizationName: String!) {
|
|
203
|
+
organizationMemberships(organizationName: $organizationName) {
|
|
204
|
+
id role createdAt
|
|
205
|
+
user { ...UserFragment }
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
${USER_FRAGMENT}
|
|
209
|
+
`,
|
|
210
|
+
GET_PROJECTS: `
|
|
211
|
+
query GetProjectListItems {
|
|
212
|
+
projects { ...ProjectListItemFragment }
|
|
213
|
+
}
|
|
214
|
+
${PROJECT_LIST_ITEM_FRAGMENT}
|
|
215
|
+
`,
|
|
216
|
+
GET_PROJECT: `
|
|
217
|
+
query GetProject($organizationName: String!, $projectName: String!) {
|
|
218
|
+
project(input: { organizationName: $organizationName, projectName: $projectName }) {
|
|
219
|
+
...ProjectFragment
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
${PROJECT_FRAGMENT}
|
|
223
|
+
`,
|
|
224
|
+
GET_PROJECT_PULL_REQUEST: `
|
|
225
|
+
query GetProjectPullRequest($organizationName: String!, $projectName: String!, $pullRequestId: String!) {
|
|
226
|
+
project(input: { organizationName: $organizationName, projectName: $projectName }) {
|
|
227
|
+
pullRequest(hostingProviderPullRequestId: $pullRequestId) {
|
|
228
|
+
...PullRequestFragment
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
${PULL_REQUEST_FRAGMENT}
|
|
233
|
+
`,
|
|
234
|
+
GET_TEST_RUN: `
|
|
235
|
+
query GetTestRun($testRunId: String!) {
|
|
236
|
+
testRun(id: $testRunId) { ...TestRunFragment }
|
|
237
|
+
}
|
|
238
|
+
${TEST_RUN_FRAGMENT}
|
|
239
|
+
`,
|
|
240
|
+
GET_TEST_RUN_SCREENSHOTS: `
|
|
241
|
+
query GetTestRunScreenshots(
|
|
242
|
+
$testRunId: String!
|
|
243
|
+
$replayDiffLimit: Int!
|
|
244
|
+
$replayDiffOffset: Int!
|
|
245
|
+
$testCaseResultLimit: Int!
|
|
246
|
+
$testCaseResultOffset: Int!
|
|
247
|
+
) {
|
|
248
|
+
testRun(id: $testRunId) {
|
|
249
|
+
replayDiffs(excludeNoDiffs: true, limit: $replayDiffLimit, offset: $replayDiffOffset) {
|
|
250
|
+
id
|
|
251
|
+
headReplay { id status isAccurate parameters { appUrl } }
|
|
252
|
+
baseReplay { id status isAccurate parameters { appUrl } }
|
|
253
|
+
screenshotDiffResults {
|
|
254
|
+
...ScreenshotDiffResultFragment
|
|
255
|
+
firstFailedRetry {
|
|
256
|
+
...ScreenshotDiffResultFragment
|
|
257
|
+
headReplayId
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
testCaseResults(excludePasses: true, limit: $testCaseResultLimit, offset: $testCaseResultOffset) {
|
|
262
|
+
headReplay {
|
|
263
|
+
id status isAccurate
|
|
264
|
+
parameters { appUrl }
|
|
265
|
+
screenshotsData { ...ScreenshotsDataFragment }
|
|
266
|
+
}
|
|
267
|
+
session { id }
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
${SCREENSHOT_DIFF_RESULT_FRAGMENT}
|
|
272
|
+
${SCREENSHOTS_DATA_FRAGMENT}
|
|
273
|
+
`,
|
|
274
|
+
GET_TEST_RUN_DIFFS: `
|
|
275
|
+
query GetTestRunReplayDiffs($testRunId: String!, $limit: Int!, $offset: Int!) {
|
|
276
|
+
testRun(id: $testRunId) {
|
|
277
|
+
replayDiffs(excludeNoDiffs: true, limit: $limit, offset: $offset) {
|
|
278
|
+
id
|
|
279
|
+
headReplay { id status isAccurate parameters { appUrl } }
|
|
280
|
+
baseReplay { id status isAccurate parameters { appUrl } }
|
|
281
|
+
screenshotDiffResults {
|
|
282
|
+
...ScreenshotDiffResultFragment
|
|
283
|
+
firstFailedRetry {
|
|
284
|
+
...ScreenshotDiffResultFragment
|
|
285
|
+
headReplayId
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
${SCREENSHOT_DIFF_RESULT_FRAGMENT}
|
|
292
|
+
`,
|
|
293
|
+
GET_TEST_RUN_TEST_CASES: `
|
|
294
|
+
query GetTestRunTestCaseResults($testRunId: String!, $limit: Int!, $offset: Int!, $excludePasses: Boolean!) {
|
|
295
|
+
testRun(id: $testRunId) {
|
|
296
|
+
testCaseResults(excludePasses: $excludePasses, limit: $limit, offset: $offset) {
|
|
297
|
+
headReplay {
|
|
298
|
+
id status isAccurate
|
|
299
|
+
parameters { appUrl }
|
|
300
|
+
screenshotsData { ...ScreenshotsDataFragment }
|
|
301
|
+
}
|
|
302
|
+
session { id }
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
${SCREENSHOTS_DATA_FRAGMENT}
|
|
307
|
+
`,
|
|
308
|
+
GET_TEST_RUN_COVERAGE: `
|
|
309
|
+
query GetTestRunWithCoverage($testRunId: String!, $prMode: Boolean!, $replayId: String) {
|
|
310
|
+
testRun(id: $testRunId) {
|
|
311
|
+
...TestRunFragment
|
|
312
|
+
coverage(prMode: $prMode, replayId: $replayId) {
|
|
313
|
+
screenshotsComparedWithDiffs { ...RouteCoverageFragment }
|
|
314
|
+
screenshotsComparedButWithoutDiffs { ...RouteCoverageFragment }
|
|
315
|
+
screenshotsNotCompared { ...RouteCoverageFragment }
|
|
316
|
+
numUnmappedFiles
|
|
317
|
+
coveredSourcesBlobUrl coverageDetailsBlobUrl
|
|
318
|
+
coveredReplaysByFileBlobUrl coveredScreenshotsByFileBlobUrl
|
|
319
|
+
coverageByReplayBlobUrl
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
${TEST_RUN_FRAGMENT}
|
|
324
|
+
${ROUTE_COVERAGE_FRAGMENT}
|
|
325
|
+
`,
|
|
326
|
+
GET_TEST_RUN_SOURCE_CODE: `
|
|
327
|
+
query GetTestRunWithSourceCodeFile($testRunId: String!, $path: String!) {
|
|
328
|
+
testRun(id: $testRunId) { id sourceCode(path: $path) }
|
|
329
|
+
}
|
|
330
|
+
`,
|
|
331
|
+
GET_TEST_RUN_PR_DESCRIPTION: `
|
|
332
|
+
query GetTestRunPullRequestDescription($testRunId: String!) {
|
|
333
|
+
testRun(id: $testRunId) {
|
|
334
|
+
id
|
|
335
|
+
pullRequest { id prDescription }
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
`,
|
|
339
|
+
GET_REPLAY: `
|
|
340
|
+
query GetReplay($replayId: String!) {
|
|
341
|
+
replay(id: $replayId) { ...ReplayFragment }
|
|
342
|
+
}
|
|
343
|
+
${REPLAY_FRAGMENT}
|
|
344
|
+
`,
|
|
345
|
+
GET_REPLAYS_FOR_PROJECT: `
|
|
346
|
+
query GetReplaysForProject($projectId: String!, $n: Int!) {
|
|
347
|
+
replaysForProject(input: { projectId: $projectId, n: $n }) {
|
|
348
|
+
...ReplayFragment
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
${REPLAY_FRAGMENT}
|
|
352
|
+
`,
|
|
353
|
+
GET_REPLAY_SCREENSHOTS: `
|
|
354
|
+
query GetReplayScreenshots($replayId: String!) {
|
|
355
|
+
replay(id: $replayId) {
|
|
356
|
+
id
|
|
357
|
+
screenshotsData { ...ScreenshotsDataFragment }
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
${SCREENSHOTS_DATA_FRAGMENT}
|
|
361
|
+
`,
|
|
362
|
+
GET_COMPARE_REPLAYS: `
|
|
363
|
+
query GetTestRunForCompareReplaysPage($testRunId: String!, $baseReplayId: String!) {
|
|
364
|
+
testRun(id: $testRunId) {
|
|
365
|
+
id
|
|
366
|
+
replayDiff(baseReplayId: $baseReplayId) {
|
|
367
|
+
id divergences
|
|
368
|
+
headReplay {
|
|
369
|
+
id status isAccurate
|
|
370
|
+
parameters { appUrl }
|
|
371
|
+
screenshotsData { ...ScreenshotsDataFragment }
|
|
372
|
+
}
|
|
373
|
+
baseReplay {
|
|
374
|
+
id status isAccurate
|
|
375
|
+
parameters { appUrl }
|
|
376
|
+
screenshotsData { ...ScreenshotsDataFragment }
|
|
377
|
+
}
|
|
378
|
+
screenshotDiffResults {
|
|
379
|
+
...ScreenshotDiffResultFragment
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
${SCREENSHOTS_DATA_FRAGMENT}
|
|
385
|
+
${SCREENSHOT_DIFF_RESULT_FRAGMENT}
|
|
386
|
+
`,
|
|
387
|
+
GET_SESSIONS_FOR_PROJECT: `
|
|
388
|
+
query GetSessionsForProject($projectId: String!, $n: Int!) {
|
|
389
|
+
sessionsForProject(input: { projectId: $projectId, n: $n }) {
|
|
390
|
+
...RecordedSessionFragment
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
${SESSION_FRAGMENT}
|
|
394
|
+
`,
|
|
395
|
+
GET_SESSION: `
|
|
396
|
+
query GetSession($sessionId: String!) {
|
|
397
|
+
session(id: $sessionId) { ...RecordedSessionFragment }
|
|
398
|
+
}
|
|
399
|
+
${SESSION_FRAGMENT}
|
|
400
|
+
`,
|
|
401
|
+
SEARCH_SESSIONS: `
|
|
402
|
+
query GetSessionsBySearch(
|
|
403
|
+
$projectId: String!
|
|
404
|
+
$searchQuery: String!
|
|
405
|
+
$n: Int!
|
|
406
|
+
$offset: Int!
|
|
407
|
+
$includeEmptySessions: Boolean!
|
|
408
|
+
$includeAutomatedSessions: Boolean!
|
|
409
|
+
) {
|
|
410
|
+
sessionsBySearch(input: {
|
|
411
|
+
projectId: $projectId
|
|
412
|
+
searchQuery: $searchQuery
|
|
413
|
+
n: $n
|
|
414
|
+
offset: $offset
|
|
415
|
+
includeEmptySessions: $includeEmptySessions
|
|
416
|
+
includeAutomatedSessions: $includeAutomatedSessions
|
|
417
|
+
}) {
|
|
418
|
+
...RecordedSessionFragment
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
${SESSION_FRAGMENT}
|
|
422
|
+
`,
|
|
423
|
+
GET_SESSION_EVENTS: `
|
|
424
|
+
query GetSessionUserEvents($sessionId: String!) {
|
|
425
|
+
session(id: $sessionId) { ...RecordedSessionUserEventsFragment }
|
|
426
|
+
}
|
|
427
|
+
${SESSION_USER_EVENTS_FRAGMENT}
|
|
428
|
+
`,
|
|
429
|
+
GET_GITHUB_REPOSITORIES: `
|
|
430
|
+
query GetGitHubRepositories {
|
|
431
|
+
gitHubRepositories { id name owner url fullName }
|
|
432
|
+
}
|
|
433
|
+
`,
|
|
434
|
+
};
|
|
435
|
+
export const mutations = {
|
|
436
|
+
ACCEPT_ALL_DIFFS: `
|
|
437
|
+
mutation AcceptAllDiffs($pullRequestId: String!, $testRunId: String!) {
|
|
438
|
+
acceptAllDiffs(input: { pullRequestId: $pullRequestId, testRunId: $testRunId }) {
|
|
439
|
+
pullRequest { id approvalState }
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
`,
|
|
443
|
+
CHECK_FOR_FLAKES: `
|
|
444
|
+
mutation CheckForFlakes($testRunId: String!, $rerunTestsNTimes: Int!) {
|
|
445
|
+
checkForFlakes(input: { testRunId: $testRunId, rerunTestsNTimes: $rerunTestsNTimes }) {
|
|
446
|
+
id
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
`,
|
|
450
|
+
CREATE_LABEL_ACTION: `
|
|
451
|
+
mutation CreateLabelAction(
|
|
452
|
+
$testRunId: String!
|
|
453
|
+
$replayDiffId: String
|
|
454
|
+
$screenshotFileName: String
|
|
455
|
+
$label: String!
|
|
456
|
+
$data: Json
|
|
457
|
+
) {
|
|
458
|
+
createLabelAction(input: {
|
|
459
|
+
testRunId: $testRunId
|
|
460
|
+
replayDiffId: $replayDiffId
|
|
461
|
+
screenshotFileName: $screenshotFileName
|
|
462
|
+
label: $label
|
|
463
|
+
data: $data
|
|
464
|
+
}) {
|
|
465
|
+
id testRunId replayDiffId screenshotFileName label data createdAt
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
`,
|
|
469
|
+
UPSERT_DIFF_APPROVAL_STATES: `
|
|
470
|
+
mutation upsertDiffApprovalStates($input: UpsertDiffApprovalStatesInput!) {
|
|
471
|
+
upsertDiffApprovalStates(input: $input) {
|
|
472
|
+
pullRequest { id approvalState }
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
`,
|
|
476
|
+
};
|
|
477
|
+
//# sourceMappingURL=meticulous-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meticulous-api.js","sourceRoot":"","sources":["../src/meticulous-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE3F,yBAAyB;AACzB,0EAA0E;AAC1E,0EAA0E;AAC1E,8EAA8E;AAC9E,uEAAuE;AAEvE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAY,EAAE;IAC3C,MAAM,IAAI,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAChD,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAqB,EAAE,CAChD,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;AAEJ,4BAA4B;AAE5B,MAAM,qBAAqB,GAAG;;;;CAI7B,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;CAKrB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;IAQrB,qBAAqB;CACxB,CAAC;AAEF,MAAM,0BAA0B,GAAG;;;;;;;;;IAS/B,qBAAqB;CACxB,CAAC;AAEF,MAAM,yBAAyB,GAAG;;;;;;;;;CASjC,CAAC;AAEF,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BvC,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;CAOvB,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;CAgB/B,CAAC;AAEF,MAAM,iBAAiB,GAAG;;;;;;;;;oBASN,uBAAuB;;;;;;;;;;;IAWvC,gBAAgB;CACnB,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;CAQ/B,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;CAI7B,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;CAOxB,CAAC;AAEF,MAAM,4BAA4B,GAAG;;;;;;;CAOpC,CAAC;AASF,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAK,KAAa,EAAE,SAAmC,EAAc,EAAE;IACjG,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,MAAM,SAAS,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAqB,cAAc,EAAE;QACjE,KAAK;QACL,SAAS;KACV,CAAC,CAAmC,CAAC;IAEtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,SAAS,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC;QAChD,IAAI,IAAI,KAAK,iBAAiB;YAAE,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,IAAI,KAAK,WAAW;YAAE,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,SAAS,CAAC,QAAQ,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC,CAAC;AAEF,8BAA8B;AAE9B,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,gBAAgB,EAAE;;;;;;;MAOd,aAAa;GAChB;IAED,iBAAiB,EAAE;;;;MAIf,qBAAqB;GACxB;IAED,4BAA4B,EAAE;;;;;;;MAO1B,aAAa;GAChB;IAED,YAAY,EAAE;;;;MAIV,0BAA0B;GAC7B;IAED,WAAW,EAAE;;;;;;MAMT,gBAAgB;GACnB;IAED,wBAAwB,EAAE;;;;;;;;MAQtB,qBAAqB;GACxB;IAED,YAAY,EAAE;;;;MAIV,iBAAiB;GACpB;IAED,wBAAwB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+BtB,+BAA+B;MAC/B,yBAAyB;GAC5B;IAED,kBAAkB,EAAE;;;;;;;;;;;;;;;;;MAiBhB,+BAA+B;GAClC;IAED,uBAAuB,EAAE;;;;;;;;;;;;;MAarB,yBAAyB;GAC5B;IAED,qBAAqB,EAAE;;;;;;;;;;;;;;;MAenB,iBAAiB;MACjB,uBAAuB;GAC1B;IAED,wBAAwB,EAAE;;;;GAIzB;IAED,2BAA2B,EAAE;;;;;;;GAO5B;IAED,UAAU,EAAE;;;;MAIR,eAAe;GAClB;IAED,uBAAuB,EAAE;;;;;;MAMrB,eAAe;GAClB;IAED,sBAAsB,EAAE;;;;;;;MAOpB,yBAAyB;GAC5B;IAED,mBAAmB,EAAE;;;;;;;;;;;;;;;;;;;;;;MAsBjB,yBAAyB;MACzB,+BAA+B;GAClC;IAED,wBAAwB,EAAE;;;;;;MAMtB,gBAAgB;GACnB;IAED,WAAW,EAAE;;;;MAIT,gBAAgB;GACnB;IAED,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;MAoBb,gBAAgB;GACnB;IAED,kBAAkB,EAAE;;;;MAIhB,4BAA4B;GAC/B;IAED,uBAAuB,EAAE;;;;GAIxB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,gBAAgB,EAAE;;;;;;GAMjB;IAED,gBAAgB,EAAE;;;;;;GAMjB;IAED,mBAAmB,EAAE;;;;;;;;;;;;;;;;;;GAkBpB;IAED,2BAA2B,EAAE;;;;;;GAM5B;CACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const acceptAllDiffs: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
pull_request_id: z.ZodString;
|
|
4
|
+
test_run_id: z.ZodString;
|
|
5
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
6
|
+
approval_state: z.ZodNullable<z.ZodString>;
|
|
7
|
+
}, z.core.$strip>>;
|
|
8
|
+
//# sourceMappingURL=accept-all-diffs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accept-all-diffs.d.ts","sourceRoot":"","sources":["../../src/tools/accept-all-diffs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,cAAc;;;;;kBAsBzB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { graphql, mutations } from '../meticulous-api.js';
|
|
4
|
+
export const acceptAllDiffs = defineTool({
|
|
5
|
+
name: 'accept_all_diffs',
|
|
6
|
+
displayName: 'Accept All Diffs',
|
|
7
|
+
description: 'Accept (approve) all visual differences in a test run. This marks all screenshot diffs as expected/approved for the associated pull request.',
|
|
8
|
+
summary: 'Approve all diffs in a test run',
|
|
9
|
+
icon: 'check-circle',
|
|
10
|
+
group: 'Test Runs',
|
|
11
|
+
input: z.object({
|
|
12
|
+
pull_request_id: z.string().describe("Pull request ID (from test run's pullRequest.id field)"),
|
|
13
|
+
test_run_id: z.string().describe('Test run ID'),
|
|
14
|
+
}),
|
|
15
|
+
output: z.object({
|
|
16
|
+
approval_state: z.string().nullable().describe('Updated PR approval state'),
|
|
17
|
+
}),
|
|
18
|
+
handle: async ({ pull_request_id, test_run_id }) => {
|
|
19
|
+
const data = await graphql(mutations.ACCEPT_ALL_DIFFS, { pullRequestId: pull_request_id, testRunId: test_run_id });
|
|
20
|
+
return { approval_state: data.acceptAllDiffs.pullRequest?.approvalState ?? null };
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=accept-all-diffs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accept-all-diffs.js","sourceRoot":"","sources":["../../src/tools/accept-all-diffs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,kBAAkB;IAC/B,WAAW,EACT,8IAA8I;IAChJ,OAAO,EAAE,iCAAiC;IAC1C,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;QAC9F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAChD,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KAC5E,CAAC;IACF,MAAM,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,SAAS,CAAC,gBAAgB,EAC1B,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,CAC3D,CAAC;QACF,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,aAAa,IAAI,IAAI,EAAE,CAAC;IACpF,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const checkForFlakes: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
test_run_id: z.ZodString;
|
|
4
|
+
rerun_count: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
5
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
6
|
+
id: z.ZodNullable<z.ZodString>;
|
|
7
|
+
}, z.core.$strip>>;
|
|
8
|
+
//# sourceMappingURL=check-for-flakes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-for-flakes.d.ts","sourceRoot":"","sources":["../../src/tools/check-for-flakes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,cAAc;;;;;kBAsBzB,CAAC"}
|