@joeytheman/gemini-mcp-tool 1.3.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/README.md +127 -35
  2. package/dist/__tests__/agyModelSteps.test.d.ts +2 -0
  3. package/dist/__tests__/agyModelSteps.test.d.ts.map +1 -0
  4. package/dist/__tests__/agyModelSteps.test.js +58 -0
  5. package/dist/__tests__/agyModelSteps.test.js.map +1 -0
  6. package/dist/__tests__/ask-gemini.test.js +99 -37
  7. package/dist/__tests__/ask-gemini.test.js.map +1 -1
  8. package/dist/__tests__/capture-script.chromium.test.d.ts +2 -0
  9. package/dist/__tests__/capture-script.chromium.test.d.ts.map +1 -0
  10. package/dist/__tests__/capture-script.chromium.test.js +235 -0
  11. package/dist/__tests__/capture-script.chromium.test.js.map +1 -0
  12. package/dist/__tests__/layout-snippet.chromium.test.d.ts +2 -0
  13. package/dist/__tests__/layout-snippet.chromium.test.d.ts.map +1 -0
  14. package/dist/__tests__/layout-snippet.chromium.test.js +333 -0
  15. package/dist/__tests__/layout-snippet.chromium.test.js.map +1 -0
  16. package/dist/__tests__/layout-snippet.test.d.ts +2 -0
  17. package/dist/__tests__/layout-snippet.test.d.ts.map +1 -0
  18. package/dist/__tests__/layout-snippet.test.js +12 -0
  19. package/dist/__tests__/layout-snippet.test.js.map +1 -0
  20. package/dist/__tests__/live-pass.test.d.ts +2 -0
  21. package/dist/__tests__/live-pass.test.d.ts.map +1 -0
  22. package/dist/__tests__/live-pass.test.js +1249 -0
  23. package/dist/__tests__/live-pass.test.js.map +1 -0
  24. package/dist/__tests__/screen-review.test.d.ts +2 -0
  25. package/dist/__tests__/screen-review.test.d.ts.map +1 -0
  26. package/dist/__tests__/screen-review.test.js +553 -0
  27. package/dist/__tests__/screen-review.test.js.map +1 -0
  28. package/dist/__tests__/server-progress.test.d.ts +2 -0
  29. package/dist/__tests__/server-progress.test.d.ts.map +1 -0
  30. package/dist/__tests__/server-progress.test.js +63 -0
  31. package/dist/__tests__/server-progress.test.js.map +1 -0
  32. package/dist/__tests__/server.test.js +17 -19
  33. package/dist/__tests__/server.test.js.map +1 -1
  34. package/dist/__tests__/simple-tools.test.d.ts +2 -0
  35. package/dist/__tests__/simple-tools.test.d.ts.map +1 -0
  36. package/dist/__tests__/simple-tools.test.js +30 -0
  37. package/dist/__tests__/simple-tools.test.js.map +1 -0
  38. package/dist/__tests__/tools.test.js +91 -0
  39. package/dist/__tests__/tools.test.js.map +1 -1
  40. package/dist/__tests__/utils/agyExecutor.test.d.ts +2 -0
  41. package/dist/__tests__/utils/agyExecutor.test.d.ts.map +1 -0
  42. package/dist/__tests__/utils/agyExecutor.test.js +731 -0
  43. package/dist/__tests__/utils/agyExecutor.test.js.map +1 -0
  44. package/dist/__tests__/utils/agyTranscriptRecovery.test.d.ts +2 -0
  45. package/dist/__tests__/utils/agyTranscriptRecovery.test.d.ts.map +1 -0
  46. package/dist/__tests__/utils/agyTranscriptRecovery.test.js +127 -0
  47. package/dist/__tests__/utils/agyTranscriptRecovery.test.js.map +1 -0
  48. package/dist/__tests__/utils/chunkCache.test.js +26 -2
  49. package/dist/__tests__/utils/chunkCache.test.js.map +1 -1
  50. package/dist/__tests__/utils/commandExecutor.test.js +185 -7
  51. package/dist/__tests__/utils/commandExecutor.test.js.map +1 -1
  52. package/dist/__tests__/utils/fileReferences.test.d.ts +2 -0
  53. package/dist/__tests__/utils/fileReferences.test.d.ts.map +1 -0
  54. package/dist/__tests__/utils/fileReferences.test.js +87 -0
  55. package/dist/__tests__/utils/fileReferences.test.js.map +1 -0
  56. package/dist/__tests__/utils/gitStatusGuard.test.d.ts +2 -0
  57. package/dist/__tests__/utils/gitStatusGuard.test.d.ts.map +1 -0
  58. package/dist/__tests__/utils/gitStatusGuard.test.js +106 -0
  59. package/dist/__tests__/utils/gitStatusGuard.test.js.map +1 -0
  60. package/dist/__tests__/utils/progressUpdates.test.d.ts +2 -0
  61. package/dist/__tests__/utils/progressUpdates.test.d.ts.map +1 -0
  62. package/dist/__tests__/utils/progressUpdates.test.js +62 -0
  63. package/dist/__tests__/utils/progressUpdates.test.js.map +1 -0
  64. package/dist/__tests__/utils/responseCache.test.js +31 -11
  65. package/dist/__tests__/utils/responseCache.test.js.map +1 -1
  66. package/dist/__tests__/utils/test-helpers.d.ts +4 -0
  67. package/dist/__tests__/utils/test-helpers.d.ts.map +1 -1
  68. package/dist/__tests__/utils/test-helpers.js +16 -0
  69. package/dist/__tests__/utils/test-helpers.js.map +1 -1
  70. package/dist/constants.d.ts +91 -26
  71. package/dist/constants.d.ts.map +1 -1
  72. package/dist/constants.js +101 -28
  73. package/dist/constants.js.map +1 -1
  74. package/dist/index.js +20 -95
  75. package/dist/index.js.map +1 -1
  76. package/dist/layoutCheckSnippet.generated.d.ts +2 -0
  77. package/dist/layoutCheckSnippet.generated.d.ts.map +1 -0
  78. package/dist/layoutCheckSnippet.generated.js +3 -0
  79. package/dist/layoutCheckSnippet.generated.js.map +1 -0
  80. package/dist/tools/ask-gemini.tool.d.ts +34 -0
  81. package/dist/tools/ask-gemini.tool.d.ts.map +1 -1
  82. package/dist/tools/ask-gemini.tool.js +40 -23
  83. package/dist/tools/ask-gemini.tool.js.map +1 -1
  84. package/dist/tools/brainstorm.tool.d.ts.map +1 -1
  85. package/dist/tools/brainstorm.tool.js +7 -5
  86. package/dist/tools/brainstorm.tool.js.map +1 -1
  87. package/dist/tools/index.d.ts.map +1 -1
  88. package/dist/tools/index.js +3 -1
  89. package/dist/tools/index.js.map +1 -1
  90. package/dist/tools/live-pass.tool.d.ts +206 -0
  91. package/dist/tools/live-pass.tool.d.ts.map +1 -0
  92. package/dist/tools/live-pass.tool.js +670 -0
  93. package/dist/tools/live-pass.tool.js.map +1 -0
  94. package/dist/tools/registry.d.ts +6 -4
  95. package/dist/tools/registry.d.ts.map +1 -1
  96. package/dist/tools/registry.js +14 -11
  97. package/dist/tools/registry.js.map +1 -1
  98. package/dist/tools/screen-review.tool.d.ts +124 -0
  99. package/dist/tools/screen-review.tool.d.ts.map +1 -0
  100. package/dist/tools/screen-review.tool.js +449 -0
  101. package/dist/tools/screen-review.tool.js.map +1 -0
  102. package/dist/tools/simple-tools.d.ts.map +1 -1
  103. package/dist/tools/simple-tools.js +9 -3
  104. package/dist/tools/simple-tools.js.map +1 -1
  105. package/dist/utils/agyExecutor.d.ts +76 -0
  106. package/dist/utils/agyExecutor.d.ts.map +1 -0
  107. package/dist/utils/agyExecutor.js +449 -0
  108. package/dist/utils/agyExecutor.js.map +1 -0
  109. package/dist/utils/agyModelSteps.d.ts +5 -0
  110. package/dist/utils/agyModelSteps.d.ts.map +1 -0
  111. package/dist/utils/agyModelSteps.js +33 -0
  112. package/dist/utils/agyModelSteps.js.map +1 -0
  113. package/dist/utils/agyReport.d.ts +19 -0
  114. package/dist/utils/agyReport.d.ts.map +1 -0
  115. package/dist/utils/agyReport.js +62 -0
  116. package/dist/utils/agyReport.js.map +1 -0
  117. package/dist/utils/agyTranscriptRecovery.d.ts +16 -0
  118. package/dist/utils/agyTranscriptRecovery.d.ts.map +1 -0
  119. package/dist/utils/agyTranscriptRecovery.js +149 -0
  120. package/dist/utils/agyTranscriptRecovery.js.map +1 -0
  121. package/dist/utils/artifactFile.d.ts +6 -0
  122. package/dist/utils/artifactFile.d.ts.map +1 -0
  123. package/dist/utils/artifactFile.js +55 -0
  124. package/dist/utils/artifactFile.js.map +1 -0
  125. package/dist/utils/captureScript.d.ts +24 -0
  126. package/dist/utils/captureScript.d.ts.map +1 -0
  127. package/dist/utils/captureScript.js +83 -0
  128. package/dist/utils/captureScript.js.map +1 -0
  129. package/dist/utils/chunkCache.d.ts.map +1 -1
  130. package/dist/utils/chunkCache.js +19 -5
  131. package/dist/utils/chunkCache.js.map +1 -1
  132. package/dist/utils/commandExecutor.d.ts +7 -1
  133. package/dist/utils/commandExecutor.d.ts.map +1 -1
  134. package/dist/utils/commandExecutor.js +162 -22
  135. package/dist/utils/commandExecutor.js.map +1 -1
  136. package/dist/utils/fileReferences.d.ts +45 -0
  137. package/dist/utils/fileReferences.d.ts.map +1 -0
  138. package/dist/utils/fileReferences.js +169 -0
  139. package/dist/utils/fileReferences.js.map +1 -0
  140. package/dist/utils/gitCheckout.d.ts +14 -0
  141. package/dist/utils/gitCheckout.d.ts.map +1 -0
  142. package/dist/utils/gitCheckout.js +36 -0
  143. package/dist/utils/gitCheckout.js.map +1 -0
  144. package/dist/utils/gitStatusGuard.d.ts +35 -0
  145. package/dist/utils/gitStatusGuard.d.ts.map +1 -0
  146. package/dist/utils/gitStatusGuard.js +82 -0
  147. package/dist/utils/gitStatusGuard.js.map +1 -0
  148. package/dist/utils/layoutCheck.d.ts +58 -0
  149. package/dist/utils/layoutCheck.d.ts.map +1 -0
  150. package/dist/utils/layoutCheck.js +84 -0
  151. package/dist/utils/layoutCheck.js.map +1 -0
  152. package/dist/utils/logger.d.ts +0 -1
  153. package/dist/utils/logger.d.ts.map +1 -1
  154. package/dist/utils/logger.js +0 -6
  155. package/dist/utils/logger.js.map +1 -1
  156. package/dist/utils/progressUpdates.d.ts +14 -0
  157. package/dist/utils/progressUpdates.d.ts.map +1 -0
  158. package/dist/utils/progressUpdates.js +40 -0
  159. package/dist/utils/progressUpdates.js.map +1 -0
  160. package/dist/utils/responseCache.d.ts +3 -3
  161. package/dist/utils/responseCache.d.ts.map +1 -1
  162. package/dist/utils/responseCache.js +11 -6
  163. package/dist/utils/responseCache.js.map +1 -1
  164. package/package.json +19 -16
  165. package/dist/__tests__/utils/geminiExecutor.test.d.ts +0 -2
  166. package/dist/__tests__/utils/geminiExecutor.test.d.ts.map +0 -1
  167. package/dist/__tests__/utils/geminiExecutor.test.js +0 -337
  168. package/dist/__tests__/utils/geminiExecutor.test.js.map +0 -1
  169. package/dist/utils/geminiExecutor.d.ts +0 -17
  170. package/dist/utils/geminiExecutor.d.ts.map +0 -1
  171. package/dist/utils/geminiExecutor.js +0 -238
  172. package/dist/utils/geminiExecutor.js.map +0 -1
@@ -0,0 +1,553 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { execFileSync } from 'child_process';
5
+ vi.mock('../utils/logger.js', () => ({
6
+ Logger: { debug: vi.fn(), warn: vi.fn(), error: vi.fn(), log: vi.fn(), toolInvocation: vi.fn() },
7
+ }));
8
+ const mockExecuteAgyJson = vi.fn();
9
+ vi.mock('../utils/agyExecutor.js', async (importOriginal) => {
10
+ const actual = await importOriginal();
11
+ return { ...actual, executeAgyJson: (...args) => mockExecuteAgyJson(...args) };
12
+ });
13
+ const mockSnapshotWorkingTree = vi.fn().mockReturnValue({ root: '/repo', lines: [], hashes: new Map(), truncated: false });
14
+ vi.mock('../utils/gitStatusGuard.js', async (importOriginal) => {
15
+ const actual = await importOriginal();
16
+ return { ...actual, snapshotWorkingTree: (...args) => mockSnapshotWorkingTree(...args) };
17
+ });
18
+ import { screenReviewTool, screenReviewArgsSchema, buildScreenReviewPrompt, deriveReviewVerdict, } from '../tools/screen-review.tool.js';
19
+ import { ERROR_MESSAGES, LIVE_PASS, MODELS } from '../constants.js';
20
+ import { makeTempDir, cleanupTempDirs } from './utils/test-helpers.js';
21
+ // ------------------------------------------------------------------ helpers
22
+ const makeWorkDir = () => makeTempDir('screen-review');
23
+ const PNG = fs.readFileSync(new URL('./fixtures/images/pixel.png', import.meta.url));
24
+ const JPEG = fs.readFileSync(new URL('./fixtures/images/pixel.jpg', import.meta.url));
25
+ function writeFile(dir, name, contents) {
26
+ const file = path.join(dir, name);
27
+ fs.mkdirSync(path.dirname(file), { recursive: true });
28
+ fs.writeFileSync(file, contents ?? (/\.png$/i.test(name) ? PNG : /\.jpe?g$/i.test(name) ? JPEG : 'x'));
29
+ return file;
30
+ }
31
+ function makeReviewResult(overrides = {}) {
32
+ return {
33
+ verdict: 'APPROVE',
34
+ screens: [],
35
+ cross_screen_findings: [],
36
+ summary: 'Everything reads correctly.',
37
+ ...overrides,
38
+ };
39
+ }
40
+ function makeScreen(file, findings = [], route_file = '') {
41
+ return { file, subject: 'home / default', route_file, inventory: ['Retry button', 'Title'], findings };
42
+ }
43
+ function makeFinding(overrides = {}) {
44
+ return {
45
+ severity: 'MAJOR',
46
+ confirmed: true,
47
+ location: 'header, right edge',
48
+ observed: 'the title is cut off after "Order det"',
49
+ rule: 'composition contract §2',
50
+ fix: 'let the title wrap to two lines',
51
+ ...overrides,
52
+ };
53
+ }
54
+ function envelope(structured, overrides = {}) {
55
+ return {
56
+ conversation_id: 'conv-xyz',
57
+ status: 'SUCCESS',
58
+ response: '',
59
+ structured_output: structured,
60
+ num_turns: 2,
61
+ duration_seconds: 20,
62
+ usage: { input_tokens: 9000, output_tokens: 400, total_tokens: 9400 },
63
+ denied_actions: [],
64
+ ...overrides,
65
+ };
66
+ }
67
+ function run(args) {
68
+ return screenReviewTool.execute(args);
69
+ }
70
+ beforeEach(() => {
71
+ vi.clearAllMocks();
72
+ mockSnapshotWorkingTree.mockReturnValue({ root: '/repo', lines: [], hashes: new Map(), truncated: false });
73
+ });
74
+ afterEach(cleanupTempDirs);
75
+ // ------------------------------------------------------------------- schema
76
+ describe('screenReviewArgsSchema', () => {
77
+ it('applies the documented defaults', () => {
78
+ const workDir = makeWorkDir();
79
+ const image = writeFile(workDir, 'home.png');
80
+ const parsed = screenReviewArgsSchema.parse({
81
+ mode: 'review', instructions: 'judge these', workingDirectory: workDir, images: [image],
82
+ });
83
+ expect(parsed.yolo).toBe(false);
84
+ expect(parsed.model).toBe(MODELS.MEDIUM);
85
+ expect(parsed.model).toBe('Gemini 3.8 Flash (Medium)');
86
+ expect(parsed.printTimeout).toBe(LIVE_PASS.SCREEN_REVIEW_PRINT_TIMEOUT);
87
+ });
88
+ it.each([
89
+ ['no images key', {}],
90
+ ['an empty images list', { images: [] }],
91
+ ['a relative image path', { images: ['frames/home.png'] }],
92
+ ['an image that does not exist', { images: ['/tmp/definitely-not-here-9d3f.png'] }],
93
+ ])('rejects review mode with %s', (_label, overrides) => {
94
+ const workDir = makeWorkDir();
95
+ expect(() => screenReviewArgsSchema.parse({
96
+ mode: 'review', instructions: 'judge these', workingDirectory: workDir, ...overrides,
97
+ })).toThrow();
98
+ });
99
+ it('rejects paths containing whitespace, which agy cannot resolve as an @reference', () => {
100
+ const workDir = makeWorkDir();
101
+ const spaced = writeFile(workDir, 'my frames/home.png');
102
+ expect(() => screenReviewArgsSchema.parse({
103
+ mode: 'review', instructions: 'i', workingDirectory: workDir, images: [spaced],
104
+ })).toThrow(ERROR_MESSAGES.UNREFERENCEABLE_PATH);
105
+ const spacedRoute = writeFile(workDir, 'my app/orders.tsx');
106
+ expect(() => screenReviewArgsSchema.parse({
107
+ mode: 'plan', instructions: 'i', workingDirectory: workDir, routeFile: spacedRoute,
108
+ })).toThrow(ERROR_MESSAGES.UNREFERENCEABLE_PATH);
109
+ });
110
+ it('rejects a non-image file in review mode', () => {
111
+ const workDir = makeWorkDir();
112
+ const notAnImage = writeFile(workDir, 'notes.txt');
113
+ expect(() => screenReviewArgsSchema.parse({
114
+ mode: 'review', instructions: 'judge these', workingDirectory: workDir, images: [notAnImage],
115
+ })).toThrow(/PNG or JPEG/);
116
+ });
117
+ it('rejects text disguised as a PNG in review mode', () => {
118
+ const workDir = makeWorkDir();
119
+ const notAnImage = writeFile(workDir, 'home.png', 'not an image');
120
+ expect(() => screenReviewArgsSchema.parse({
121
+ mode: 'review', instructions: 'judge these', workingDirectory: workDir, images: [notAnImage],
122
+ })).toThrow(/PNG or JPEG/);
123
+ });
124
+ it('accepts a real JPEG in review mode', () => {
125
+ const workDir = makeWorkDir();
126
+ const image = writeFile(workDir, 'home.jpg');
127
+ expect(screenReviewArgsSchema.parse({
128
+ mode: 'review', instructions: 'judge these', workingDirectory: workDir, images: [image],
129
+ }).images).toEqual([image]);
130
+ });
131
+ it('rejects a routeFile in review mode and images in plan mode', () => {
132
+ const workDir = makeWorkDir();
133
+ const image = writeFile(workDir, 'home.png');
134
+ const route = writeFile(workDir, 'app/orders.tsx');
135
+ expect(() => screenReviewArgsSchema.parse({
136
+ mode: 'review', instructions: 'i', workingDirectory: workDir, images: [image], routeFile: route,
137
+ })).toThrow(/plan mode only/);
138
+ expect(() => screenReviewArgsSchema.parse({
139
+ mode: 'plan', instructions: 'i', workingDirectory: workDir, routeFile: route, images: [image],
140
+ })).toThrow(/review mode only/);
141
+ });
142
+ it('rejects a plan routeFile that is missing, relative or outside the working directory', () => {
143
+ const workDir = makeWorkDir();
144
+ const outside = writeFile(makeWorkDir(), 'other.tsx');
145
+ for (const routeFile of [undefined, 'app/orders.tsx', '/tmp/nope-8a21.tsx', outside]) {
146
+ expect(() => screenReviewArgsSchema.parse({
147
+ mode: 'plan', instructions: 'i', workingDirectory: workDir, routeFile,
148
+ })).toThrow(ERROR_MESSAGES.SCREEN_REVIEW_ROUTE_FILE);
149
+ }
150
+ });
151
+ it('rejects baseRef in plan mode', () => {
152
+ const workDir = makeWorkDir();
153
+ const route = writeFile(workDir, 'app/orders.tsx');
154
+ expect(() => screenReviewArgsSchema.parse({
155
+ mode: 'plan', instructions: 'i', workingDirectory: workDir, routeFile: route, baseRef: 'origin/main',
156
+ })).toThrow(/baseRef is review mode only/);
157
+ });
158
+ it('accepts a plan routeFile inside the working directory', () => {
159
+ const workDir = makeWorkDir();
160
+ const route = writeFile(workDir, 'app/orders.tsx');
161
+ const parsed = screenReviewArgsSchema.parse({
162
+ mode: 'plan', instructions: 'i', workingDirectory: workDir, routeFile: route,
163
+ });
164
+ expect(parsed.routeFile).toBe(route);
165
+ });
166
+ });
167
+ // ------------------------------------------------------------------- prompt
168
+ describe('buildScreenReviewPrompt', () => {
169
+ it('puts one @reference per image and demands schema-only output', () => {
170
+ const prompt = buildScreenReviewPrompt({
171
+ mode: 'review',
172
+ instructions: '## Reviewer prompt\nCheck every control.',
173
+ context: 'composition contract v3',
174
+ images: ['/frames/a.png', '/frames/b.png'],
175
+ });
176
+ expect(prompt).toContain('Open every image below before reading any code');
177
+ expect(prompt).toContain('@/frames/a.png\n@/frames/b.png');
178
+ expect(prompt).toContain('## Reviewer prompt');
179
+ expect(prompt).toContain('composition contract v3');
180
+ expect(prompt).toContain('Enumerate what is in each image');
181
+ expect(prompt).toContain('ONLY the schema JSON');
182
+ });
183
+ it('keeps the caller instructions verbatim and first in their own block', () => {
184
+ const instructions = 'ROLE: screen reviewer\nCheck every control.';
185
+ const prompt = buildScreenReviewPrompt({ mode: 'review', instructions, images: ['/frames/a.png'] });
186
+ expect(prompt).toContain(`## Instructions\n${instructions}`);
187
+ });
188
+ it.each(['review', 'plan'])('labels the caller context under its own heading in %s mode', (mode) => {
189
+ const supplied = buildScreenReviewPrompt({
190
+ mode,
191
+ instructions: 'ROLE: screen reviewer',
192
+ context: 'composition contract v3\nchanged: app/orders.tsx',
193
+ images: mode === 'review' ? ['/frames/a.png'] : undefined,
194
+ routeFile: mode === 'plan' ? '/work/app/orders.tsx' : undefined,
195
+ });
196
+ const absent = buildScreenReviewPrompt({
197
+ mode,
198
+ instructions: 'ROLE: screen reviewer',
199
+ images: mode === 'review' ? ['/frames/a.png'] : undefined,
200
+ routeFile: mode === 'plan' ? '/work/app/orders.tsx' : undefined,
201
+ });
202
+ const heading = '## Context supplied by the caller (composition contract, changed files)';
203
+ expect(supplied).toContain(`${heading}\ncomposition contract v3\nchanged: app/orders.tsx`);
204
+ expect(absent).toContain(`${heading}\nNo context supplied.`);
205
+ });
206
+ it('tells Gemini to echo each image path verbatim as screens[].file', () => {
207
+ const images = ['/frames/a.png', '/frames/b space.png'];
208
+ const prompt = buildScreenReviewPrompt({ mode: 'review', instructions: 'i', images });
209
+ for (const image of images) {
210
+ expect(prompt).toContain(image);
211
+ }
212
+ expect(prompt).toContain('absolute path copied verbatim from the @ line');
213
+ expect(prompt).toContain('One "screens" entry per image');
214
+ });
215
+ it('references the route file and asks for no verdict in plan mode', () => {
216
+ const prompt = buildScreenReviewPrompt({
217
+ mode: 'plan',
218
+ instructions: 'inventory the actions',
219
+ routeFile: '/work/app/orders.tsx',
220
+ });
221
+ expect(prompt).toContain('@/work/app/orders.tsx');
222
+ expect(prompt).toContain('no verdict');
223
+ expect(prompt).not.toContain('Open every image');
224
+ });
225
+ });
226
+ describe('buildScreenReviewPrompt: bounded reads', () => {
227
+ const SHARED = [
228
+ 'Read only the code the checklist needs as evidence, and only the lines you need:',
229
+ '- the changed files listed above or named in the context;',
230
+ '- the producer lines (serializers, services, hooks) behind a capability or viewer-scoped field the checklist asks about;',
231
+ '- the rule files and READMEs the instructions cite, and the board or design files they name.',
232
+ ];
233
+ const BANNED = 'Never run tests, Jest, npm or any package script. Never read node_modules, release notes or changelog fragments. Never re-read the file the instructions came from: they are above, verbatim.';
234
+ const SHA = '0123456789abcdef0123456789abcdef01234567';
235
+ const review = (overrides = {}) => buildScreenReviewPrompt({ mode: 'review', instructions: 'i', images: ['/frames/a.png'], ...overrides });
236
+ const plan = () => buildScreenReviewPrompt({ mode: 'plan', instructions: 'i', routeFile: '/work/app/orders.tsx' });
237
+ it.each([['review', review], ['plan', plan]])('allows the evidence reads and bans tests, npm, node_modules and release notes in %s mode', (_mode, build) => {
238
+ const prompt = build();
239
+ expect(prompt).toContain('## Reading code (bounded)');
240
+ for (const line of SHARED) {
241
+ expect(prompt).toContain(line);
242
+ }
243
+ expect(prompt).toContain(BANNED);
244
+ });
245
+ it('lets review mode read the route file each image shows and what it renders, changed or not', () => {
246
+ expect(review()).toContain('- the route file each image shows, and the components and UI primitives it renders;');
247
+ });
248
+ it('lets plan mode read its own route file and what it renders', () => {
249
+ expect(plan()).toContain('- the route file above, and the components and UI primitives it renders;');
250
+ });
251
+ it('puts the changed files the reading rule points at above it', () => {
252
+ const prompt = review({ changedRoutes: ['app/orders.tsx'] });
253
+ expect(prompt.indexOf('## Changed files in this diff')).toBeLessThan(prompt.indexOf('## Reading code (bounded)'));
254
+ });
255
+ it('allows only three-dot git diff and git show against the resolved merge base in review mode', () => {
256
+ const prompt = review({ mergeBase: SHA });
257
+ expect(prompt).toContain(`The diff under review is ${SHA}...HEAD (${SHA} is the merge base of the caller's base ref and HEAD, resolved for you).`);
258
+ expect(prompt).toContain(`you may run read-only \`git diff ${SHA}...HEAD\`, optionally with \`--name-only\` and \`-- <paths>\`, and \`git show ${SHA}:<path>\`. No other git command.`);
259
+ expect(prompt).not.toContain('Never run git.');
260
+ });
261
+ it('allows no git in review mode without a merge base, nor in plan mode', () => {
262
+ expect(review()).toContain('Never run git.');
263
+ expect(review()).not.toContain('git diff');
264
+ expect(plan()).toContain('Never run git.');
265
+ expect(plan()).not.toContain('git diff');
266
+ });
267
+ it('keeps the image instruction ahead of any code reading', () => {
268
+ const prompt = review({ mergeBase: SHA });
269
+ expect(prompt).toContain('Open every image below before reading any code. You are the second pair of eyes on frames someone else captured');
270
+ expect(prompt.indexOf('Open every image below')).toBeLessThan(prompt.indexOf('## Reading code (bounded)'));
271
+ });
272
+ });
273
+ // ----------------------------------------------------------------- verdicts
274
+ describe('deriveReviewVerdict', () => {
275
+ const image = '/frames/a.png';
276
+ it('requests changes for a confirmed MAJOR even when Gemini approved', () => {
277
+ const result = makeReviewResult({ screens: [makeScreen(image, [makeFinding()])] });
278
+ const decision = deriveReviewVerdict(result, [image]);
279
+ expect(decision.verdict).toBe('REQUEST_CHANGES');
280
+ expect(decision.reported).toBe('APPROVE');
281
+ });
282
+ it('requests changes for any BLOCKER', () => {
283
+ const result = makeReviewResult({
284
+ screens: [makeScreen(image, [makeFinding({ severity: 'BLOCKER', confirmed: false })])],
285
+ });
286
+ expect(deriveReviewVerdict(result, [image]).verdict).toBe('REQUEST_CHANGES');
287
+ });
288
+ it('approves when the only MAJOR is unconfirmed, and counts the downgrade', () => {
289
+ const result = makeReviewResult({
290
+ screens: [makeScreen(image, [makeFinding({ confirmed: false })])],
291
+ });
292
+ const decision = deriveReviewVerdict(result, [image]);
293
+ expect(decision.verdict).toBe('APPROVE');
294
+ expect(decision.downgraded).toBe(1);
295
+ });
296
+ it('requests changes when an image was never reviewed', () => {
297
+ const decision = deriveReviewVerdict(makeReviewResult({ screens: [makeScreen(image)] }), [image, '/frames/b.png']);
298
+ expect(decision.verdict).toBe('REQUEST_CHANGES');
299
+ expect(decision.unreviewed).toEqual(['/frames/b.png']);
300
+ });
301
+ it('matches an image Gemini echoed through a different spelling of the same path', () => {
302
+ const workDir = makeWorkDir();
303
+ const supplied = writeFile(workDir, 'frames/home.png');
304
+ const echoed = path.join(workDir, 'frames', '.', 'home.png');
305
+ const decision = deriveReviewVerdict(makeReviewResult({ screens: [makeScreen(echoed)] }), [supplied]);
306
+ expect(decision.unreviewed).toEqual([]);
307
+ expect(decision.unknownFiles).toEqual([]);
308
+ expect(decision.verdict).toBe('APPROVE');
309
+ });
310
+ it('notes screens naming an image that was not supplied', () => {
311
+ const decision = deriveReviewVerdict(makeReviewResult({ screens: [makeScreen('/frames/ghost.png')] }), [image]);
312
+ expect(decision.unknownFiles).toEqual(['/frames/ghost.png']);
313
+ });
314
+ it('requests changes when a changed screen has no frame, even with only MINOR findings', () => {
315
+ const result = makeReviewResult({
316
+ screens: [makeScreen(image, [makeFinding({ severity: 'MINOR' })], 'app/(tabs)/orders.tsx')],
317
+ });
318
+ const decision = deriveReviewVerdict(result, [image], ['app/(tabs)/orders.tsx', 'app/(tabs)/settings.tsx']);
319
+ expect(decision.verdict).toBe('REQUEST_CHANGES');
320
+ expect(decision.reported).toBe('APPROVE');
321
+ expect(decision.reasons).toContain('no evidence for changed screen app/(tabs)/settings.tsx');
322
+ expect(decision.coverage).toEqual([
323
+ { route: 'app/(tabs)/orders.tsx', image },
324
+ { route: 'app/(tabs)/settings.tsx', image: null },
325
+ ]);
326
+ });
327
+ it('leaves the verdict alone when every changed screen has a frame', () => {
328
+ const second = '/frames/b.png';
329
+ const result = makeReviewResult({
330
+ screens: [
331
+ makeScreen(image, [], 'app/(tabs)/orders.tsx'),
332
+ makeScreen(second, [], 'src/app/(tabs)/settings.tsx'),
333
+ ],
334
+ });
335
+ const decision = deriveReviewVerdict(result, [image, second], ['app/(tabs)/orders.tsx', 'app/(tabs)/settings.tsx']);
336
+ expect(decision.verdict).toBe('APPROVE');
337
+ expect(decision.reasons).toEqual([]);
338
+ });
339
+ it('refuses a truncated route_file that would cover several changed screens', () => {
340
+ const result = makeReviewResult({ screens: [makeScreen(image, [], 'app/orders.tsx')] });
341
+ const decision = deriveReviewVerdict(result, [image], [
342
+ 'apps/admin/app/orders.tsx',
343
+ 'apps/customer/app/orders.tsx',
344
+ ]);
345
+ expect(decision.verdict).toBe('REQUEST_CHANGES');
346
+ expect(decision.coverage.every(entry => entry.image === null)).toBe(true);
347
+ });
348
+ it('still accepts an absolute route_file naming the changed path', () => {
349
+ const result = makeReviewResult({
350
+ screens: [makeScreen(image, [], '/repo/apps/admin/app/orders.tsx')],
351
+ });
352
+ const decision = deriveReviewVerdict(result, [image], ['apps/admin/app/orders.tsx']);
353
+ expect(decision.verdict).toBe('APPROVE');
354
+ expect(decision.coverage[0].image).toBe(image);
355
+ });
356
+ it('only warns for a changed component with no frame', () => {
357
+ const result = makeReviewResult({ screens: [makeScreen(image, [], 'app/(tabs)/orders.tsx')] });
358
+ const decision = deriveReviewVerdict(result, [image], ['app/(tabs)/orders.tsx', 'components/ActionRow.tsx']);
359
+ expect(decision.verdict).toBe('APPROVE');
360
+ expect(decision.warnings).toEqual(['changed component with no frame showing it: components/ActionRow.tsx']);
361
+ });
362
+ it('reports no coverage at all when changedRoutes is omitted', () => {
363
+ const decision = deriveReviewVerdict(makeReviewResult({ screens: [makeScreen(image)] }), [image]);
364
+ expect(decision.coverage).toEqual([]);
365
+ expect(decision.verdict).toBe('APPROVE');
366
+ });
367
+ it('counts cross-screen findings too', () => {
368
+ const result = makeReviewResult({ cross_screen_findings: [makeFinding()] });
369
+ expect(deriveReviewVerdict(result, []).verdict).toBe('REQUEST_CHANGES');
370
+ });
371
+ });
372
+ // ------------------------------------------------------------------ execute
373
+ describe('screen-review execute', () => {
374
+ it('runs read-only from the working directory and adds every image directory', async () => {
375
+ const workDir = makeWorkDir();
376
+ const image = writeFile(workDir, 'frames/home.png');
377
+ mockExecuteAgyJson.mockResolvedValue(envelope(makeReviewResult({ screens: [makeScreen(image)] })));
378
+ await run({ mode: 'review', instructions: 'judge', workingDirectory: workDir, images: [image] });
379
+ const [prompt, options] = mockExecuteAgyJson.mock.calls[0];
380
+ expect(prompt).toContain(`@${image}`);
381
+ expect(options).toMatchObject({ cwd: workDir, yolo: false, noCache: true, model: MODELS.MEDIUM });
382
+ expect(options.includeDirectories).toEqual([workDir, path.dirname(image)]);
383
+ });
384
+ it('resolves baseRef to its merge base with HEAD and prints that commit', async () => {
385
+ const workDir = makeWorkDir();
386
+ const git = (...args) => execFileSync('git', args, { cwd: workDir, encoding: 'utf-8' }).trim();
387
+ const commit = (message) => git('-c', 'user.email=t@example.com', '-c', 'user.name=t', 'commit', '--quiet', '--allow-empty', '-m', message);
388
+ git('init', '--quiet', '--initial-branch', 'main');
389
+ commit('base');
390
+ const mergeBase = git('rev-parse', 'HEAD');
391
+ git('checkout', '--quiet', '-b', 'feature');
392
+ commit('feature work');
393
+ git('checkout', '--quiet', 'main');
394
+ commit('main moved on');
395
+ git('checkout', '--quiet', 'feature');
396
+ const image = writeFile(workDir, 'frames/home.png');
397
+ mockExecuteAgyJson.mockResolvedValue(envelope(makeReviewResult({ screens: [makeScreen(image)] })));
398
+ await run({ mode: 'review', instructions: 'judge', workingDirectory: workDir, images: [image], baseRef: 'main' });
399
+ expect(mockExecuteAgyJson.mock.calls[0][0]).toContain(`\`git diff ${mergeBase}...HEAD\``);
400
+ });
401
+ it.each([
402
+ ['an unknown ref', 'no-such-branch'],
403
+ ['an option-like ref', '--output=/tmp/screen-review-should-not-exist'],
404
+ ['a brace expansion that would spell options in a shell', '{-1..-2}'],
405
+ ])('fails before calling Gemini on %s', async (_label, baseRef) => {
406
+ const workDir = makeWorkDir();
407
+ execFileSync('git', ['init', '--quiet'], { cwd: workDir });
408
+ execFileSync('git', ['-c', 'user.email=t@example.com', '-c', 'user.name=t', 'commit', '--quiet', '--allow-empty', '-m', 'base'], { cwd: workDir });
409
+ const image = writeFile(workDir, 'frames/home.png');
410
+ await expect(run({ mode: 'review', instructions: 'judge', workingDirectory: workDir, images: [image], baseRef }))
411
+ .rejects.toThrow(`${ERROR_MESSAGES.SCREEN_REVIEW_BASE_REF}: '${baseRef}'. fatal: Not a valid object name ${baseRef}`);
412
+ expect(mockExecuteAgyJson).not.toHaveBeenCalled();
413
+ expect(fs.existsSync('/tmp/screen-review-should-not-exist')).toBe(false);
414
+ });
415
+ it('fails before calling Gemini when baseRef is given outside a git checkout', async () => {
416
+ const workDir = makeWorkDir();
417
+ const image = writeFile(workDir, 'frames/home.png');
418
+ await expect(run({ mode: 'review', instructions: 'judge', workingDirectory: workDir, images: [image], baseRef: 'main' }))
419
+ .rejects.toThrow(`${ERROR_MESSAGES.SCREEN_REVIEW_BASE_REF}: 'main'.`);
420
+ expect(mockExecuteAgyJson).not.toHaveBeenCalled();
421
+ });
422
+ it('rejects a working directory that does not exist', async () => {
423
+ const workDir = makeWorkDir();
424
+ const image = writeFile(workDir, 'home.png');
425
+ await expect(run({
426
+ mode: 'review', instructions: 'judge', workingDirectory: '/no/such/dir/here', images: [image],
427
+ })).rejects.toThrow();
428
+ expect(mockExecuteAgyJson).not.toHaveBeenCalled();
429
+ });
430
+ it('reports the review as text with inventory, findings and the conversation line', async () => {
431
+ const workDir = makeWorkDir();
432
+ const image = writeFile(workDir, 'frames/home.png');
433
+ mockExecuteAgyJson.mockResolvedValue(envelope(makeReviewResult({
434
+ screens: [makeScreen(image, [makeFinding(), makeFinding({ confirmed: false, observed: 'maybe clipped' })])],
435
+ })));
436
+ const report = await run({ mode: 'review', instructions: 'judge', workingDirectory: workDir, images: [image] });
437
+ expect(report).toContain('[GEMINI_CONVERSATION_ID=conv-xyz]');
438
+ expect(report).toContain('# Screen review: REQUEST_CHANGES (Gemini reported APPROVE)');
439
+ expect(report).toContain('inventory: Retry button, Title');
440
+ expect(report).toContain('MAJOR — the title is cut off');
441
+ expect(report).toContain('MINOR (unconfirmed, downgraded) — maybe clipped');
442
+ expect(report).toContain('Usage:');
443
+ expect(report).not.toMatch(/data:image|base64/);
444
+ });
445
+ it('lists the changed files for Gemini and prints the coverage table', async () => {
446
+ const workDir = makeWorkDir();
447
+ const image = writeFile(workDir, 'frames/orders.png');
448
+ mockExecuteAgyJson.mockResolvedValue(envelope(makeReviewResult({
449
+ screens: [makeScreen(image, [], 'app/(tabs)/orders.tsx')],
450
+ })));
451
+ const report = await run({
452
+ mode: 'review', instructions: 'judge', workingDirectory: workDir, images: [image],
453
+ changedRoutes: ['app/(tabs)/orders.tsx', 'app/(tabs)/settings.tsx'],
454
+ });
455
+ const prompt = mockExecuteAgyJson.mock.calls[0][0];
456
+ expect(prompt).toContain('## Changed files in this diff\n- app/(tabs)/orders.tsx\n- app/(tabs)/settings.tsx');
457
+ expect(prompt).toContain('Set each screen\'s "route_file"');
458
+ expect(report).toContain('## Screenshot coverage');
459
+ expect(report).toContain(`- app/(tabs)/orders.tsx → ${image}`);
460
+ expect(report).toContain('- app/(tabs)/settings.tsx → MISSING');
461
+ expect(report).toContain('# Screen review: REQUEST_CHANGES (Gemini reported APPROVE)');
462
+ });
463
+ it('omits the coverage section when no changed routes were given', async () => {
464
+ const workDir = makeWorkDir();
465
+ const image = writeFile(workDir, 'frames/orders.png');
466
+ mockExecuteAgyJson.mockResolvedValue(envelope(makeReviewResult({ screens: [makeScreen(image)] })));
467
+ const report = await run({ mode: 'review', instructions: 'judge', workingDirectory: workDir, images: [image] });
468
+ expect(report).not.toContain('Screenshot coverage');
469
+ expect(report).not.toContain('Changed files in this diff');
470
+ });
471
+ it('renders the plan table in the documented column order with no verdict', async () => {
472
+ const workDir = makeWorkDir();
473
+ const route = writeFile(workDir, 'app/orders.tsx');
474
+ mockExecuteAgyJson.mockResolvedValue(envelope({
475
+ route_file: route,
476
+ controls: [{
477
+ control: 'Reassign', primitive: 'ActionRow', placement: 'top slot', promoted: true,
478
+ verb_today: 'Reassign', verb_per_rule: 'Reassign driver', operation: 'update',
479
+ capability: 'orders:write', scope: 'order',
480
+ }],
481
+ top_slot_priority: ['Reassign', 'Cancel'],
482
+ hand_rolls_to_delete: [{ line: 'app/orders.tsx:42', primitive: 'ActionRow' }],
483
+ notes: 'Cancel is destructive.',
484
+ }));
485
+ const report = await run({ mode: 'plan', instructions: 'inventory', workingDirectory: workDir, routeFile: route });
486
+ expect(report).toContain('| control | primitive | placement | promoted | verb today | verb per rule | operation | capability | scope |');
487
+ expect(report).toContain('| Reassign | ActionRow | top slot | true |');
488
+ expect(report).toContain('app/orders.tsx:42 → ActionRow');
489
+ expect(report).not.toContain('APPROVE');
490
+ expect(report).not.toContain('Warnings');
491
+ });
492
+ it('reports uninvited edits in plan mode too, when yolo gave Gemini a shell', async () => {
493
+ const workDir = makeWorkDir();
494
+ const route = writeFile(workDir, 'app/orders.tsx');
495
+ mockSnapshotWorkingTree
496
+ .mockReturnValueOnce({ root: workDir, lines: [], hashes: new Map(), truncated: false })
497
+ .mockReturnValueOnce({ root: workDir, lines: [' M app/orders.tsx'], hashes: new Map(), truncated: false });
498
+ mockExecuteAgyJson.mockResolvedValue(envelope({
499
+ route_file: route, controls: [], top_slot_priority: [], hand_rolls_to_delete: [], notes: '',
500
+ }));
501
+ const report = await run({
502
+ mode: 'plan', instructions: 'inventory', workingDirectory: workDir, routeFile: route, yolo: true,
503
+ });
504
+ expect(report).toContain('## Working tree');
505
+ expect(report).toContain('app/orders.tsx');
506
+ });
507
+ it('reports uninvited edits when the agy call itself fails', async () => {
508
+ const workDir = makeWorkDir();
509
+ const image = writeFile(workDir, 'frames/home.png');
510
+ mockSnapshotWorkingTree
511
+ .mockReturnValueOnce({ root: workDir, lines: [], hashes: new Map(), truncated: false })
512
+ .mockReturnValueOnce({
513
+ root: workDir,
514
+ lines: [' M app/orders.tsx'],
515
+ hashes: new Map(),
516
+ truncated: false,
517
+ });
518
+ mockExecuteAgyJson.mockRejectedValue(new Error('Error: timed out waiting for response'));
519
+ await expect(run({
520
+ mode: 'review', instructions: 'judge', workingDirectory: workDir, images: [image], yolo: true,
521
+ })).rejects.toThrow(/timed out[\s\S]*Working tree[\s\S]*app\/orders\.tsx/);
522
+ });
523
+ it('accepts a route file reached through a symlinked spelling of the working directory', () => {
524
+ const workDir = makeWorkDir();
525
+ const route = writeFile(workDir, 'app/orders.tsx');
526
+ const link = path.join(makeWorkDir(), 'link');
527
+ fs.symlinkSync(workDir, link);
528
+ const parsed = screenReviewArgsSchema.parse({
529
+ mode: 'plan', instructions: 'i', workingDirectory: link, routeFile: route,
530
+ });
531
+ expect(parsed.routeFile).toBe(route);
532
+ });
533
+ it('warns when the plan answer names a different route file', async () => {
534
+ const workDir = makeWorkDir();
535
+ const route = writeFile(workDir, 'app/orders.tsx');
536
+ mockExecuteAgyJson.mockResolvedValue(envelope({
537
+ route_file: '/somewhere/else.tsx',
538
+ controls: [], top_slot_priority: [], hand_rolls_to_delete: [], notes: '',
539
+ }));
540
+ const report = await run({ mode: 'plan', instructions: 'inventory', workingDirectory: workDir, routeFile: route });
541
+ expect(report).toContain('## Warnings');
542
+ expect(report).toContain('/somewhere/else.tsx');
543
+ });
544
+ it('says so when the answer does not match the schema', async () => {
545
+ const workDir = makeWorkDir();
546
+ const image = writeFile(workDir, 'home.png');
547
+ mockExecuteAgyJson.mockResolvedValue(envelope({ verdict: 'MAYBE' }));
548
+ const report = await run({ mode: 'review', instructions: 'judge', workingDirectory: workDir, images: [image] });
549
+ expect(report).toContain('no usable answer');
550
+ expect(report).toContain('Schema issues');
551
+ });
552
+ });
553
+ //# sourceMappingURL=screen-review.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-review.test.js","sourceRoot":"","sources":["../../src/__tests__/screen-review.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server-progress.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-progress.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/server-progress.test.ts"],"names":[],"mappings":""}