@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,83 @@
1
+ import { z } from 'zod';
2
+ export declare const getTestRunCoverage: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ test_run_id: z.ZodString;
4
+ pr_mode: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
5
+ replay_id: z.ZodOptional<z.ZodString>;
6
+ category: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
7
+ with_diffs: "with_diffs";
8
+ without_diffs: "without_diffs";
9
+ not_compared: "not_compared";
10
+ all: "all";
11
+ }>>>;
12
+ route_filter: z.ZodOptional<z.ZodString>;
13
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
14
+ }, z.core.$strip>, z.ZodObject<{
15
+ test_run: z.ZodObject<{
16
+ id: z.ZodString;
17
+ status: z.ZodString;
18
+ commit_sha: z.ZodNullable<z.ZodString>;
19
+ created_at: z.ZodString;
20
+ updated_at: z.ZodString;
21
+ project_name: z.ZodString;
22
+ organization_name: z.ZodString;
23
+ stats: z.ZodNullable<z.ZodObject<{
24
+ total_screenshots: z.ZodNumber;
25
+ total_sessions: z.ZodNumber;
26
+ total_sessions_replayed: z.ZodNullable<z.ZodNumber>;
27
+ sessions_skipped: z.ZodNullable<z.ZodNumber>;
28
+ screenshots_skipped: z.ZodNullable<z.ZodNumber>;
29
+ }, z.core.$strip>>;
30
+ ci_provider: z.ZodNullable<z.ZodString>;
31
+ pr_title: z.ZodNullable<z.ZodString>;
32
+ pr_number: z.ZodNullable<z.ZodNumber>;
33
+ pr_url: z.ZodNullable<z.ZodString>;
34
+ approval_state: z.ZodNullable<z.ZodString>;
35
+ describe_tested: z.ZodNullable<z.ZodString>;
36
+ }, z.core.$strip>;
37
+ coverage: z.ZodObject<{
38
+ with_diffs: z.ZodArray<z.ZodObject<{
39
+ route_group: z.ZodNullable<z.ZodString>;
40
+ route_url: z.ZodNullable<z.ZodString>;
41
+ screenshots: z.ZodArray<z.ZodObject<{
42
+ filename: z.ZodString;
43
+ public_url: z.ZodString;
44
+ replay_id: z.ZodOptional<z.ZodString>;
45
+ route_url: z.ZodOptional<z.ZodString>;
46
+ route_group: z.ZodOptional<z.ZodString>;
47
+ identifier_type: z.ZodOptional<z.ZodString>;
48
+ event_number: z.ZodOptional<z.ZodNumber>;
49
+ }, z.core.$strip>>;
50
+ }, z.core.$strip>>;
51
+ without_diffs: z.ZodArray<z.ZodObject<{
52
+ route_group: z.ZodNullable<z.ZodString>;
53
+ route_url: z.ZodNullable<z.ZodString>;
54
+ screenshots: z.ZodArray<z.ZodObject<{
55
+ filename: z.ZodString;
56
+ public_url: z.ZodString;
57
+ replay_id: z.ZodOptional<z.ZodString>;
58
+ route_url: z.ZodOptional<z.ZodString>;
59
+ route_group: z.ZodOptional<z.ZodString>;
60
+ identifier_type: z.ZodOptional<z.ZodString>;
61
+ event_number: z.ZodOptional<z.ZodNumber>;
62
+ }, z.core.$strip>>;
63
+ }, z.core.$strip>>;
64
+ not_compared: z.ZodArray<z.ZodObject<{
65
+ route_group: z.ZodNullable<z.ZodString>;
66
+ route_url: z.ZodNullable<z.ZodString>;
67
+ screenshots: z.ZodArray<z.ZodObject<{
68
+ filename: z.ZodString;
69
+ public_url: z.ZodString;
70
+ replay_id: z.ZodOptional<z.ZodString>;
71
+ route_url: z.ZodOptional<z.ZodString>;
72
+ route_group: z.ZodOptional<z.ZodString>;
73
+ identifier_type: z.ZodOptional<z.ZodString>;
74
+ event_number: z.ZodOptional<z.ZodNumber>;
75
+ }, z.core.$strip>>;
76
+ }, z.core.$strip>>;
77
+ num_unmapped_files: z.ZodNumber;
78
+ total_with_diffs: z.ZodNumber;
79
+ total_without_diffs: z.ZodNumber;
80
+ total_not_compared: z.ZodNumber;
81
+ }, z.core.$strip>;
82
+ }, z.core.$strip>>;
83
+ //# sourceMappingURL=get-test-run-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-coverage.d.ts","sourceRoot":"","sources":["../../src/tools/get-test-run-coverage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0E7B,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { graphql, queries } from '../meticulous-api.js';
4
+ import { coverageSchema, testRunSchema, mapCoverage, mapTestRun } from './schemas.js';
5
+ export const getTestRunCoverage = defineTool({
6
+ name: 'get_test_run_coverage',
7
+ displayName: 'Get Test Run Coverage',
8
+ description: 'Get screenshot coverage data for a test run. Shows which routes have diffs, which were compared without diffs, and which were not compared. Use category filter to limit output size (defaults to with_diffs only). Use route_filter to search for specific routes.',
9
+ summary: 'Get test run coverage',
10
+ icon: 'shield-check',
11
+ group: 'Test Runs',
12
+ input: z.object({
13
+ test_run_id: z.string().describe('Test run ID'),
14
+ pr_mode: z.boolean().optional().default(true).describe('Whether to use PR mode for coverage calculation'),
15
+ replay_id: z.string().optional().describe('Optional replay ID to scope coverage to'),
16
+ category: z
17
+ .enum(['with_diffs', 'without_diffs', 'not_compared', 'all'])
18
+ .optional()
19
+ .default('with_diffs')
20
+ .describe('Coverage category to return (defaults to with_diffs to limit response size)'),
21
+ route_filter: z.string().optional().describe('Filter routes by substring match on route URL or group'),
22
+ limit: z.number().optional().default(50).describe('Max routes to return per category'),
23
+ }),
24
+ output: z.object({
25
+ test_run: testRunSchema,
26
+ coverage: z.object({
27
+ with_diffs: z.array(coverageSchema).describe('Routes with screenshot diffs'),
28
+ without_diffs: z.array(coverageSchema).describe('Routes compared but without diffs'),
29
+ not_compared: z.array(coverageSchema).describe('Routes not compared'),
30
+ num_unmapped_files: z.number().describe('Number of unmapped source files'),
31
+ total_with_diffs: z.number().describe('Total routes with diffs (before filtering)'),
32
+ total_without_diffs: z.number().describe('Total routes without diffs (before filtering)'),
33
+ total_not_compared: z.number().describe('Total routes not compared (before filtering)'),
34
+ }),
35
+ }),
36
+ handle: async ({ test_run_id, pr_mode, replay_id, category, route_filter, limit }) => {
37
+ const data = await graphql(queries.GET_TEST_RUN_COVERAGE, { testRunId: test_run_id, prMode: pr_mode, replayId: replay_id });
38
+ const cov = data.testRun.coverage;
39
+ const filterRoutes = (routes) => {
40
+ let mapped = routes.map(mapCoverage);
41
+ if (route_filter) {
42
+ const f = route_filter.toLowerCase();
43
+ mapped = mapped.filter(r => (r.route_url?.toLowerCase().includes(f) ?? false) || (r.route_group?.toLowerCase().includes(f) ?? false));
44
+ }
45
+ return mapped.slice(0, limit);
46
+ };
47
+ const allWithDiffs = cov.screenshotsComparedWithDiffs ?? [];
48
+ const allWithoutDiffs = cov.screenshotsComparedButWithoutDiffs ?? [];
49
+ const allNotCompared = cov.screenshotsNotCompared ?? [];
50
+ return {
51
+ test_run: mapTestRun(data.testRun),
52
+ coverage: {
53
+ with_diffs: category === 'all' || category === 'with_diffs' ? filterRoutes(allWithDiffs) : [],
54
+ without_diffs: category === 'all' || category === 'without_diffs' ? filterRoutes(allWithoutDiffs) : [],
55
+ not_compared: category === 'all' || category === 'not_compared' ? filterRoutes(allNotCompared) : [],
56
+ num_unmapped_files: cov.numUnmappedFiles ?? 0,
57
+ total_with_diffs: allWithDiffs.length,
58
+ total_without_diffs: allWithoutDiffs.length,
59
+ total_not_compared: allNotCompared.length,
60
+ },
61
+ };
62
+ },
63
+ });
64
+ //# sourceMappingURL=get-test-run-coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-coverage.js","sourceRoot":"","sources":["../../src/tools/get-test-run-coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { z } from 'zod';
2
+ export declare const getTestRunDiffs: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ test_run_id: z.ZodString;
4
+ only_with_screenshot_diffs: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
5
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
6
+ offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
7
+ }, z.core.$strip>, z.ZodObject<{
8
+ total_fetched: z.ZodNumber;
9
+ diffs: z.ZodArray<z.ZodObject<{
10
+ replay_diff_id: z.ZodString;
11
+ head_replay: z.ZodObject<{
12
+ id: z.ZodString;
13
+ status: z.ZodNullable<z.ZodString>;
14
+ is_accurate: z.ZodNullable<z.ZodBoolean>;
15
+ app_url: z.ZodNullable<z.ZodString>;
16
+ }, z.core.$strip>;
17
+ base_replay: z.ZodObject<{
18
+ id: z.ZodString;
19
+ status: z.ZodNullable<z.ZodString>;
20
+ is_accurate: z.ZodNullable<z.ZodBoolean>;
21
+ app_url: z.ZodNullable<z.ZodString>;
22
+ }, z.core.$strip>;
23
+ has_screenshot_diffs: z.ZodBoolean;
24
+ screenshot_diff_count: z.ZodNumber;
25
+ screenshot_diffs: z.ZodArray<z.ZodObject<{
26
+ outcome: z.ZodString;
27
+ user_visible_outcome: z.ZodString;
28
+ group_id: z.ZodNullable<z.ZodString>;
29
+ width: z.ZodNullable<z.ZodNumber>;
30
+ mismatch_pixels: z.ZodNullable<z.ZodNumber>;
31
+ diff_hash: z.ZodNullable<z.ZodString>;
32
+ base_screenshot: z.ZodNullable<z.ZodObject<{
33
+ filename: z.ZodString;
34
+ public_url: z.ZodString;
35
+ replay_id: z.ZodOptional<z.ZodString>;
36
+ route_url: z.ZodOptional<z.ZodString>;
37
+ route_group: z.ZodOptional<z.ZodString>;
38
+ identifier_type: z.ZodOptional<z.ZodString>;
39
+ event_number: z.ZodOptional<z.ZodNumber>;
40
+ }, z.core.$strip>>;
41
+ head_screenshot: z.ZodNullable<z.ZodObject<{
42
+ filename: z.ZodString;
43
+ public_url: z.ZodString;
44
+ replay_id: z.ZodOptional<z.ZodString>;
45
+ route_url: z.ZodOptional<z.ZodString>;
46
+ route_group: z.ZodOptional<z.ZodString>;
47
+ identifier_type: z.ZodOptional<z.ZodString>;
48
+ event_number: z.ZodOptional<z.ZodNumber>;
49
+ }, z.core.$strip>>;
50
+ diff_url_thumb: z.ZodNullable<z.ZodString>;
51
+ diff_url_full: z.ZodNullable<z.ZodString>;
52
+ changed_class_names: z.ZodArray<z.ZodString>;
53
+ }, z.core.$strip>>;
54
+ }, z.core.$strip>>;
55
+ }, z.core.$strip>>;
56
+ //# sourceMappingURL=get-test-run-diffs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-diffs.d.ts","sourceRoot":"","sources":["../../src/tools/get-test-run-diffs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8D1B,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { graphql, queries } from '../meticulous-api.js';
4
+ import { diffResultSchema, replayInfoSchema, mapDiffResult, mapReplayInfo } from './schemas.js';
5
+ export const getTestRunDiffs = defineTool({
6
+ name: 'get_test_run_diffs',
7
+ displayName: 'Get Test Run Diffs',
8
+ description: 'Get replay diffs for a test run. Each diff compares a head replay against a base replay. Set only_with_screenshot_diffs=true to skip diffs that have no visual differences (many diffs are structural-only with empty screenshot_diffs). Use compare_replays with the base_replay.id to see full comparison details including screenshots.',
9
+ summary: 'Get replay diffs for a test run',
10
+ icon: 'diff',
11
+ group: 'Test Runs',
12
+ input: z.object({
13
+ test_run_id: z.string().describe('Test run ID'),
14
+ only_with_screenshot_diffs: z
15
+ .boolean()
16
+ .optional()
17
+ .default(false)
18
+ .describe('Only return diffs that have actual visual screenshot differences'),
19
+ limit: z.number().optional().default(100).describe('Max results to return'),
20
+ offset: z.number().optional().default(0).describe('Offset for pagination'),
21
+ }),
22
+ output: z.object({
23
+ total_fetched: z.number().describe('Total diffs fetched from API before filtering'),
24
+ diffs: z.array(z.object({
25
+ replay_diff_id: z.string().describe('Replay diff ID'),
26
+ head_replay: replayInfoSchema.describe('Head (actual) replay'),
27
+ base_replay: replayInfoSchema.describe('Base (expected) replay'),
28
+ has_screenshot_diffs: z.boolean().describe('Whether this diff has visual screenshot differences'),
29
+ screenshot_diff_count: z.number().describe('Number of screenshot diffs'),
30
+ screenshot_diffs: z.array(diffResultSchema),
31
+ })),
32
+ }),
33
+ handle: async ({ test_run_id, only_with_screenshot_diffs, limit, offset }) => {
34
+ const data = await graphql(queries.GET_TEST_RUN_DIFFS, { testRunId: test_run_id, limit, offset });
35
+ const allDiffs = (data.testRun.replayDiffs ?? []).map(rd => {
36
+ const diffs = (rd.screenshotDiffResults ?? []).map(mapDiffResult);
37
+ return {
38
+ replay_diff_id: rd.id,
39
+ head_replay: mapReplayInfo(rd.headReplay ?? {}),
40
+ base_replay: mapReplayInfo(rd.baseReplay ?? {}),
41
+ has_screenshot_diffs: diffs.length > 0,
42
+ screenshot_diff_count: diffs.length,
43
+ screenshot_diffs: diffs,
44
+ };
45
+ });
46
+ const filtered = only_with_screenshot_diffs ? allDiffs.filter(d => d.has_screenshot_diffs) : allDiffs;
47
+ return {
48
+ total_fetched: allDiffs.length,
49
+ diffs: filtered,
50
+ };
51
+ },
52
+ });
53
+ //# sourceMappingURL=get-test-run-diffs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-diffs.js","sourceRoot":"","sources":["../../src/tools/get-test-run-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,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEhG,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;IACxC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,oBAAoB;IACjC,WAAW,EACT,4UAA4U;IAC9U,OAAO,EAAE,iCAAiC;IAC1C,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,0BAA0B,EAAE,CAAC;aAC1B,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,kEAAkE,CAAC;QAC/E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC3E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KAC3E,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QACnF,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;YACP,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACrD,WAAW,EAAE,gBAAgB,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAC9D,WAAW,EAAE,gBAAgB,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YAChE,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YACjG,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YACxE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;SAC5C,CAAC,CACH;KACF,CAAC;IACF,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;QAC3E,MAAM,IAAI,GAAG,MAAM,OAAO,CASvB,OAAO,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAE1E,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACzD,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAClE,OAAO;gBACL,cAAc,EAAE,EAAE,CAAC,EAAE;gBACrB,WAAW,EAAE,aAAa,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC;gBAC/C,WAAW,EAAE,aAAa,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC;gBAC/C,oBAAoB,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;gBACtC,qBAAqB,EAAE,KAAK,CAAC,MAAM;gBACnC,gBAAgB,EAAE,KAAK;aACxB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,0BAA0B,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEtG,OAAO;YACL,aAAa,EAAE,QAAQ,CAAC,MAAM;YAC9B,KAAK,EAAE,QAAQ;SAChB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ export declare const getTestRunPrDescription: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ test_run_id: z.ZodString;
4
+ }, z.core.$strip>, z.ZodObject<{
5
+ test_run_id: z.ZodString;
6
+ pr_description: z.ZodNullable<z.ZodString>;
7
+ }, z.core.$strip>>;
8
+ //# sourceMappingURL=get-test-run-pr-description.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-pr-description.d.ts","sourceRoot":"","sources":["../../src/tools/get-test-run-pr-description.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,uBAAuB;;;;;kBAwBlC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { graphql, queries } from '../meticulous-api.js';
4
+ export const getTestRunPrDescription = defineTool({
5
+ name: 'get_test_run_pr_description',
6
+ displayName: 'Get Test Run PR Description',
7
+ description: 'Get the pull request description associated with a test run.',
8
+ summary: 'Get PR description for a test run',
9
+ icon: 'file-text',
10
+ group: 'Test Runs',
11
+ input: z.object({
12
+ test_run_id: z.string().describe('Test run ID'),
13
+ }),
14
+ output: z.object({
15
+ test_run_id: z.string(),
16
+ pr_description: z.string().nullable().describe('Pull request description text'),
17
+ }),
18
+ handle: async ({ test_run_id }) => {
19
+ const data = await graphql(queries.GET_TEST_RUN_PR_DESCRIPTION, { testRunId: test_run_id });
20
+ return {
21
+ test_run_id: data.testRun.id,
22
+ pr_description: data.testRun.pullRequest?.prDescription ?? null,
23
+ };
24
+ },
25
+ });
26
+ //# sourceMappingURL=get-test-run-pr-description.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-pr-description.js","sourceRoot":"","sources":["../../src/tools/get-test-run-pr-description.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;IAChD,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,6BAA6B;IAC1C,WAAW,EAAE,8DAA8D;IAC3E,OAAO,EAAE,mCAAmC;IAC5C,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAChD,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KAChF,CAAC;IACF,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QAChC,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,OAAO,CAAC,2BAA2B,EACnC,EAAE,SAAS,EAAE,WAAW,EAAE,CAC3B,CAAC;QACF,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YAC5B,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,IAAI,IAAI;SAChE,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { z } from 'zod';
2
+ export declare const getTestRunScreenshots: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ test_run_id: z.ZodString;
4
+ replay_diff_limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
5
+ replay_diff_offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
6
+ test_case_limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
7
+ test_case_offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
8
+ }, z.core.$strip>, z.ZodObject<{
9
+ diffs: z.ZodArray<z.ZodObject<{
10
+ replay_diff_id: z.ZodString;
11
+ head_replay: z.ZodObject<{
12
+ id: z.ZodString;
13
+ status: z.ZodNullable<z.ZodString>;
14
+ is_accurate: z.ZodNullable<z.ZodBoolean>;
15
+ app_url: z.ZodNullable<z.ZodString>;
16
+ }, z.core.$strip>;
17
+ base_replay: z.ZodObject<{
18
+ id: z.ZodString;
19
+ status: z.ZodNullable<z.ZodString>;
20
+ is_accurate: z.ZodNullable<z.ZodBoolean>;
21
+ app_url: z.ZodNullable<z.ZodString>;
22
+ }, z.core.$strip>;
23
+ screenshot_diffs: z.ZodArray<z.ZodObject<{
24
+ outcome: z.ZodString;
25
+ user_visible_outcome: z.ZodString;
26
+ group_id: z.ZodNullable<z.ZodString>;
27
+ width: z.ZodNullable<z.ZodNumber>;
28
+ mismatch_pixels: z.ZodNullable<z.ZodNumber>;
29
+ diff_hash: z.ZodNullable<z.ZodString>;
30
+ base_screenshot: z.ZodNullable<z.ZodObject<{
31
+ filename: z.ZodString;
32
+ public_url: z.ZodString;
33
+ replay_id: z.ZodOptional<z.ZodString>;
34
+ route_url: z.ZodOptional<z.ZodString>;
35
+ route_group: z.ZodOptional<z.ZodString>;
36
+ identifier_type: z.ZodOptional<z.ZodString>;
37
+ event_number: z.ZodOptional<z.ZodNumber>;
38
+ }, z.core.$strip>>;
39
+ head_screenshot: z.ZodNullable<z.ZodObject<{
40
+ filename: z.ZodString;
41
+ public_url: z.ZodString;
42
+ replay_id: z.ZodOptional<z.ZodString>;
43
+ route_url: z.ZodOptional<z.ZodString>;
44
+ route_group: z.ZodOptional<z.ZodString>;
45
+ identifier_type: z.ZodOptional<z.ZodString>;
46
+ event_number: z.ZodOptional<z.ZodNumber>;
47
+ }, z.core.$strip>>;
48
+ diff_url_thumb: z.ZodNullable<z.ZodString>;
49
+ diff_url_full: z.ZodNullable<z.ZodString>;
50
+ changed_class_names: z.ZodArray<z.ZodString>;
51
+ }, z.core.$strip>>;
52
+ }, z.core.$strip>>;
53
+ test_case_screenshots: z.ZodArray<z.ZodObject<{
54
+ replay_id: z.ZodString;
55
+ replay_status: z.ZodNullable<z.ZodString>;
56
+ replay_accurate: z.ZodNullable<z.ZodBoolean>;
57
+ app_url: z.ZodNullable<z.ZodString>;
58
+ session_id: z.ZodNullable<z.ZodString>;
59
+ screenshots: z.ZodArray<z.ZodObject<{
60
+ filename: z.ZodString;
61
+ public_url: z.ZodString;
62
+ replay_id: z.ZodOptional<z.ZodString>;
63
+ route_url: z.ZodOptional<z.ZodString>;
64
+ route_group: z.ZodOptional<z.ZodString>;
65
+ identifier_type: z.ZodOptional<z.ZodString>;
66
+ event_number: z.ZodOptional<z.ZodNumber>;
67
+ }, z.core.$strip>>;
68
+ }, z.core.$strip>>;
69
+ }, z.core.$strip>>;
70
+ //# sourceMappingURL=get-test-run-screenshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-screenshots.d.ts","sourceRoot":"","sources":["../../src/tools/get-test-run-screenshots.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAgFhC,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { graphql, queries } from '../meticulous-api.js';
4
+ import { diffResultSchema, replayInfoSchema, screenshotSchema, mapDiffResult, mapReplayInfo, mapScreenshot, } from './schemas.js';
5
+ export const getTestRunScreenshots = defineTool({
6
+ name: 'get_test_run_screenshots',
7
+ displayName: 'Get Test Run Screenshots',
8
+ description: 'Get screenshot diffs and test case screenshots for a test run. Each diff includes head/base replay info and screenshot comparison URLs (base image, head image, diff image).',
9
+ summary: 'Get test run screenshot diffs',
10
+ icon: 'image',
11
+ group: 'Test Runs',
12
+ input: z.object({
13
+ test_run_id: z.string().describe('Test run ID'),
14
+ replay_diff_limit: z.number().optional().default(50).describe('Max replay diffs to return'),
15
+ replay_diff_offset: z.number().optional().default(0).describe('Offset for replay diffs pagination'),
16
+ test_case_limit: z.number().optional().default(50).describe('Max test case results to return'),
17
+ test_case_offset: z.number().optional().default(0).describe('Offset for test case pagination'),
18
+ }),
19
+ output: z.object({
20
+ diffs: z.array(z.object({
21
+ replay_diff_id: z.string().describe('Replay diff ID'),
22
+ head_replay: replayInfoSchema.describe('Head (actual) replay'),
23
+ base_replay: replayInfoSchema.describe('Base (expected) replay'),
24
+ screenshot_diffs: z.array(diffResultSchema),
25
+ })),
26
+ test_case_screenshots: z.array(z.object({
27
+ replay_id: z.string().describe('Replay ID'),
28
+ replay_status: z.string().nullable().describe('Replay status'),
29
+ replay_accurate: z.boolean().nullable().describe('Whether replay was accurate'),
30
+ app_url: z.string().nullable().describe('Application URL'),
31
+ session_id: z.string().nullable().describe('Source session ID'),
32
+ screenshots: z.array(screenshotSchema),
33
+ })),
34
+ }),
35
+ handle: async ({ test_run_id, replay_diff_limit, replay_diff_offset, test_case_limit, test_case_offset }) => {
36
+ const data = await graphql(queries.GET_TEST_RUN_SCREENSHOTS, {
37
+ testRunId: test_run_id,
38
+ replayDiffLimit: replay_diff_limit,
39
+ replayDiffOffset: replay_diff_offset,
40
+ testCaseResultLimit: test_case_limit,
41
+ testCaseResultOffset: test_case_offset,
42
+ });
43
+ return {
44
+ diffs: (data.testRun.replayDiffs ?? []).map(rd => ({
45
+ replay_diff_id: rd.id,
46
+ head_replay: mapReplayInfo(rd.headReplay ?? {}),
47
+ base_replay: mapReplayInfo(rd.baseReplay ?? {}),
48
+ screenshot_diffs: (rd.screenshotDiffResults ?? []).map(mapDiffResult),
49
+ })),
50
+ test_case_screenshots: (data.testRun.testCaseResults ?? []).map(tc => ({
51
+ replay_id: tc.headReplay?.id ?? '',
52
+ replay_status: tc.headReplay?.status ?? null,
53
+ replay_accurate: tc.headReplay?.isAccurate ?? null,
54
+ app_url: tc.headReplay?.parameters?.appUrl ?? null,
55
+ session_id: tc.session?.id ?? null,
56
+ screenshots: (tc.headReplay?.screenshotsData ?? []).map(mapScreenshot),
57
+ })),
58
+ };
59
+ },
60
+ });
61
+ //# sourceMappingURL=get-test-run-screenshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-screenshots.js","sourceRoot":"","sources":["../../src/tools/get-test-run-screenshots.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+ export declare const getTestRunSourceCode: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ test_run_id: z.ZodString;
4
+ path: z.ZodString;
5
+ }, z.core.$strip>, z.ZodObject<{
6
+ test_run_id: z.ZodString;
7
+ source_code: z.ZodNullable<z.ZodString>;
8
+ }, z.core.$strip>>;
9
+ //# sourceMappingURL=get-test-run-source-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-source-code.d.ts","sourceRoot":"","sources":["../../src/tools/get-test-run-source-code.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,oBAAoB;;;;;;kBAsB/B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { graphql, queries } from '../meticulous-api.js';
4
+ export const getTestRunSourceCode = defineTool({
5
+ name: 'get_test_run_source_code',
6
+ displayName: 'Get Test Run Source Code',
7
+ description: 'Get the source code of a file at the commit of a specific test run.',
8
+ summary: 'Get source code for a test run commit',
9
+ icon: 'file-code',
10
+ group: 'Test Runs',
11
+ input: z.object({
12
+ test_run_id: z.string().describe('Test run ID'),
13
+ path: z.string().describe('File path relative to repository root'),
14
+ }),
15
+ output: z.object({
16
+ test_run_id: z.string(),
17
+ source_code: z.string().nullable().describe('File source code content'),
18
+ }),
19
+ handle: async ({ test_run_id, path }) => {
20
+ const data = await graphql(queries.GET_TEST_RUN_SOURCE_CODE, { testRunId: test_run_id, path });
21
+ return { test_run_id: data.testRun.id, source_code: data.testRun.sourceCode };
22
+ },
23
+ });
24
+ //# sourceMappingURL=get-test-run-source-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-source-code.js","sourceRoot":"","sources":["../../src/tools/get-test-run-source-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;IAC7C,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,0BAA0B;IACvC,WAAW,EAAE,qEAAqE;IAClF,OAAO,EAAE,uCAAuC;IAChD,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KACnE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACxE,CAAC;IACF,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,OAAO,CAAC,wBAAwB,EAChC,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CACjC,CAAC;QACF,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IAChF,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ export declare const getTestRunTestCases: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ test_run_id: z.ZodString;
4
+ include_passes: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
5
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
6
+ offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
7
+ }, z.core.$strip>, z.ZodObject<{
8
+ test_cases: z.ZodArray<z.ZodObject<{
9
+ replay_id: z.ZodString;
10
+ replay_status: z.ZodNullable<z.ZodString>;
11
+ replay_accurate: z.ZodNullable<z.ZodBoolean>;
12
+ app_url: z.ZodNullable<z.ZodString>;
13
+ session_id: z.ZodNullable<z.ZodString>;
14
+ screenshots: z.ZodArray<z.ZodObject<{
15
+ filename: z.ZodString;
16
+ public_url: z.ZodString;
17
+ replay_id: z.ZodOptional<z.ZodString>;
18
+ route_url: z.ZodOptional<z.ZodString>;
19
+ route_group: z.ZodOptional<z.ZodString>;
20
+ identifier_type: z.ZodOptional<z.ZodString>;
21
+ event_number: z.ZodOptional<z.ZodNumber>;
22
+ }, z.core.$strip>>;
23
+ }, z.core.$strip>>;
24
+ }, z.core.$strip>>;
25
+ //# sourceMappingURL=get-test-run-test-cases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-test-cases.d.ts","sourceRoot":"","sources":["../../src/tools/get-test-run-test-cases.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;kBAuE9B,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { graphql, queries } from '../meticulous-api.js';
4
+ import { screenshotSchema, mapScreenshot } from './schemas.js';
5
+ export const getTestRunTestCases = defineTool({
6
+ name: 'get_test_run_test_cases',
7
+ displayName: 'Get Test Run Test Cases',
8
+ description: 'Get test case results for a test run. Each test case has a head replay with status and accuracy info. A replay with is_accurate=false means the replay diverged from the original session (non-deterministic behavior, flaky). Note: test cases do not have a base replay — they represent individual session replays, not diff comparisons. For visual diffs, use get_test_run_diffs instead.',
9
+ summary: 'Get test case results',
10
+ icon: 'list-checks',
11
+ group: 'Test Runs',
12
+ input: z.object({
13
+ test_run_id: z.string().describe('Test run ID'),
14
+ include_passes: z
15
+ .boolean()
16
+ .optional()
17
+ .default(false)
18
+ .describe('Include passing test cases (defaults to failures only)'),
19
+ limit: z.number().optional().default(100).describe('Max results to return'),
20
+ offset: z.number().optional().default(0).describe('Offset for pagination'),
21
+ }),
22
+ output: z.object({
23
+ test_cases: z.array(z.object({
24
+ replay_id: z.string().describe('Replay ID — use with get_replay for full details'),
25
+ replay_status: z
26
+ .string()
27
+ .nullable()
28
+ .describe('Replay execution status (Success = completed, may still be inaccurate)'),
29
+ replay_accurate: z
30
+ .boolean()
31
+ .nullable()
32
+ .describe('Whether the replay accurately reproduced the session. false = flaky/non-deterministic failure'),
33
+ app_url: z.string().nullable().describe('Application URL used for replay'),
34
+ session_id: z
35
+ .string()
36
+ .nullable()
37
+ .describe('Source session ID — use with get_session_events to see original user interactions'),
38
+ screenshots: z.array(screenshotSchema),
39
+ })),
40
+ }),
41
+ handle: async ({ test_run_id, include_passes, limit, offset }) => {
42
+ const data = await graphql(queries.GET_TEST_RUN_TEST_CASES, {
43
+ testRunId: test_run_id,
44
+ limit,
45
+ offset,
46
+ excludePasses: !include_passes,
47
+ });
48
+ return {
49
+ test_cases: (data.testRun.testCaseResults ?? []).map(tc => ({
50
+ replay_id: tc.headReplay?.id ?? '',
51
+ replay_status: tc.headReplay?.status ?? null,
52
+ replay_accurate: tc.headReplay?.isAccurate ?? null,
53
+ app_url: tc.headReplay?.parameters?.appUrl ?? null,
54
+ session_id: tc.session?.id ?? null,
55
+ screenshots: (tc.headReplay?.screenshotsData ?? []).map(mapScreenshot),
56
+ })),
57
+ };
58
+ },
59
+ });
60
+ //# sourceMappingURL=get-test-run-test-cases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-run-test-cases.js","sourceRoot":"","sources":["../../src/tools/get-test-run-test-cases.ts"],"names":[],"mappings":"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"}