@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.
Files changed (121) hide show
  1. package/README.md +159 -0
  2. package/dist/adapter.iife.js +15945 -0
  3. package/dist/adapter.iife.js.map +7 -0
  4. package/dist/index.d.ts +14 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +80 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/meticulous-api.d.ts +34 -0
  9. package/dist/meticulous-api.d.ts.map +1 -0
  10. package/dist/meticulous-api.js +477 -0
  11. package/dist/meticulous-api.js.map +1 -0
  12. package/dist/tools/accept-all-diffs.d.ts +8 -0
  13. package/dist/tools/accept-all-diffs.d.ts.map +1 -0
  14. package/dist/tools/accept-all-diffs.js +23 -0
  15. package/dist/tools/accept-all-diffs.js.map +1 -0
  16. package/dist/tools/check-for-flakes.d.ts +8 -0
  17. package/dist/tools/check-for-flakes.d.ts.map +1 -0
  18. package/dist/tools/check-for-flakes.js +26 -0
  19. package/dist/tools/check-for-flakes.js.map +1 -0
  20. package/dist/tools/compare-replays.d.ts +68 -0
  21. package/dist/tools/compare-replays.d.ts.map +1 -0
  22. package/dist/tools/compare-replays.js +53 -0
  23. package/dist/tools/compare-replays.js.map +1 -0
  24. package/dist/tools/create-label-action.d.ts +16 -0
  25. package/dist/tools/create-label-action.d.ts.map +1 -0
  26. package/dist/tools/create-label-action.js +29 -0
  27. package/dist/tools/create-label-action.js.map +1 -0
  28. package/dist/tools/get-current-user.d.ts +12 -0
  29. package/dist/tools/get-current-user.d.ts.map +1 -0
  30. package/dist/tools/get-current-user.js +22 -0
  31. package/dist/tools/get-current-user.js.map +1 -0
  32. package/dist/tools/get-project-pull-request.d.ts +14 -0
  33. package/dist/tools/get-project-pull-request.d.ts.map +1 -0
  34. package/dist/tools/get-project-pull-request.js +23 -0
  35. package/dist/tools/get-project-pull-request.js.map +1 -0
  36. package/dist/tools/get-project.d.ts +20 -0
  37. package/dist/tools/get-project.d.ts.map +1 -0
  38. package/dist/tools/get-project.js +25 -0
  39. package/dist/tools/get-project.js.map +1 -0
  40. package/dist/tools/get-replay-screenshots.d.ts +16 -0
  41. package/dist/tools/get-replay-screenshots.d.ts.map +1 -0
  42. package/dist/tools/get-replay-screenshots.js +27 -0
  43. package/dist/tools/get-replay-screenshots.js.map +1 -0
  44. package/dist/tools/get-replay.d.ts +17 -0
  45. package/dist/tools/get-replay.d.ts.map +1 -0
  46. package/dist/tools/get-replay.js +21 -0
  47. package/dist/tools/get-replay.js.map +1 -0
  48. package/dist/tools/get-session-events.d.ts +14 -0
  49. package/dist/tools/get-session-events.d.ts.map +1 -0
  50. package/dist/tools/get-session-events.js +27 -0
  51. package/dist/tools/get-session-events.js.map +1 -0
  52. package/dist/tools/get-session.d.ts +19 -0
  53. package/dist/tools/get-session.d.ts.map +1 -0
  54. package/dist/tools/get-session.js +21 -0
  55. package/dist/tools/get-session.js.map +1 -0
  56. package/dist/tools/get-test-run-coverage.d.ts +83 -0
  57. package/dist/tools/get-test-run-coverage.d.ts.map +1 -0
  58. package/dist/tools/get-test-run-coverage.js +64 -0
  59. package/dist/tools/get-test-run-coverage.js.map +1 -0
  60. package/dist/tools/get-test-run-diffs.d.ts +56 -0
  61. package/dist/tools/get-test-run-diffs.d.ts.map +1 -0
  62. package/dist/tools/get-test-run-diffs.js +53 -0
  63. package/dist/tools/get-test-run-diffs.js.map +1 -0
  64. package/dist/tools/get-test-run-pr-description.d.ts +8 -0
  65. package/dist/tools/get-test-run-pr-description.d.ts.map +1 -0
  66. package/dist/tools/get-test-run-pr-description.js +26 -0
  67. package/dist/tools/get-test-run-pr-description.js.map +1 -0
  68. package/dist/tools/get-test-run-screenshots.d.ts +70 -0
  69. package/dist/tools/get-test-run-screenshots.d.ts.map +1 -0
  70. package/dist/tools/get-test-run-screenshots.js +61 -0
  71. package/dist/tools/get-test-run-screenshots.js.map +1 -0
  72. package/dist/tools/get-test-run-source-code.d.ts +9 -0
  73. package/dist/tools/get-test-run-source-code.d.ts.map +1 -0
  74. package/dist/tools/get-test-run-source-code.js +24 -0
  75. package/dist/tools/get-test-run-source-code.js.map +1 -0
  76. package/dist/tools/get-test-run-test-cases.d.ts +25 -0
  77. package/dist/tools/get-test-run-test-cases.d.ts.map +1 -0
  78. package/dist/tools/get-test-run-test-cases.js +60 -0
  79. package/dist/tools/get-test-run-test-cases.js.map +1 -0
  80. package/dist/tools/get-test-run.d.ts +29 -0
  81. package/dist/tools/get-test-run.d.ts.map +1 -0
  82. package/dist/tools/get-test-run.js +30 -0
  83. package/dist/tools/get-test-run.js.map +1 -0
  84. package/dist/tools/list-github-repositories.d.ts +11 -0
  85. package/dist/tools/list-github-repositories.d.ts.map +1 -0
  86. package/dist/tools/list-github-repositories.js +19 -0
  87. package/dist/tools/list-github-repositories.js.map +1 -0
  88. package/dist/tools/list-organization-members.d.ts +18 -0
  89. package/dist/tools/list-organization-members.d.ts.map +1 -0
  90. package/dist/tools/list-organization-members.js +21 -0
  91. package/dist/tools/list-organization-members.js.map +1 -0
  92. package/dist/tools/list-organizations.d.ts +9 -0
  93. package/dist/tools/list-organizations.d.ts.map +1 -0
  94. package/dist/tools/list-organizations.js +19 -0
  95. package/dist/tools/list-organizations.js.map +1 -0
  96. package/dist/tools/list-projects.d.ts +14 -0
  97. package/dist/tools/list-projects.d.ts.map +1 -0
  98. package/dist/tools/list-projects.js +19 -0
  99. package/dist/tools/list-projects.js.map +1 -0
  100. package/dist/tools/list-replays.d.ts +18 -0
  101. package/dist/tools/list-replays.d.ts.map +1 -0
  102. package/dist/tools/list-replays.js +25 -0
  103. package/dist/tools/list-replays.js.map +1 -0
  104. package/dist/tools/list-sessions.d.ts +20 -0
  105. package/dist/tools/list-sessions.d.ts.map +1 -0
  106. package/dist/tools/list-sessions.js +22 -0
  107. package/dist/tools/list-sessions.js.map +1 -0
  108. package/dist/tools/schemas.d.ts +560 -0
  109. package/dist/tools/schemas.d.ts.map +1 -0
  110. package/dist/tools/schemas.js +303 -0
  111. package/dist/tools/schemas.js.map +1 -0
  112. package/dist/tools/search-sessions.d.ts +24 -0
  113. package/dist/tools/search-sessions.d.ts.map +1 -0
  114. package/dist/tools/search-sessions.js +33 -0
  115. package/dist/tools/search-sessions.js.map +1 -0
  116. package/dist/tools/upsert-diff-approval.d.ts +12 -0
  117. package/dist/tools/upsert-diff-approval.d.ts.map +1 -0
  118. package/dist/tools/upsert-diff-approval.js +36 -0
  119. package/dist/tools/upsert-diff-approval.js.map +1 -0
  120. package/dist/tools.json +4020 -0
  121. package/package.json +58 -0
@@ -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":"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"}
@@ -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"}