merlion 0.1.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 (162) hide show
  1. package/bin/merlion.js +2 -0
  2. package/dist/artifacts/agents.d.ts +11 -0
  3. package/dist/artifacts/agents.d.ts.map +1 -0
  4. package/dist/artifacts/agents.js +81 -0
  5. package/dist/artifacts/agents.js.map +1 -0
  6. package/dist/artifacts/codebase_index.d.ts +16 -0
  7. package/dist/artifacts/codebase_index.d.ts.map +1 -0
  8. package/dist/artifacts/codebase_index.js +193 -0
  9. package/dist/artifacts/codebase_index.js.map +1 -0
  10. package/dist/artifacts/progress.d.ts +23 -0
  11. package/dist/artifacts/progress.d.ts.map +1 -0
  12. package/dist/artifacts/progress.js +152 -0
  13. package/dist/artifacts/progress.js.map +1 -0
  14. package/dist/cli/diff.d.ts +11 -0
  15. package/dist/cli/diff.d.ts.map +1 -0
  16. package/dist/cli/diff.js +58 -0
  17. package/dist/cli/diff.js.map +1 -0
  18. package/dist/cli/experience.d.ts +71 -0
  19. package/dist/cli/experience.d.ts.map +1 -0
  20. package/dist/cli/experience.js +489 -0
  21. package/dist/cli/experience.js.map +1 -0
  22. package/dist/cli/keybindings.d.ts +3 -0
  23. package/dist/cli/keybindings.d.ts.map +1 -0
  24. package/dist/cli/keybindings.js +14 -0
  25. package/dist/cli/keybindings.js.map +1 -0
  26. package/dist/cli/markdown.d.ts +7 -0
  27. package/dist/cli/markdown.d.ts.map +1 -0
  28. package/dist/cli/markdown.js +77 -0
  29. package/dist/cli/markdown.js.map +1 -0
  30. package/dist/cli/message_content.d.ts +13 -0
  31. package/dist/cli/message_content.d.ts.map +1 -0
  32. package/dist/cli/message_content.js +23 -0
  33. package/dist/cli/message_content.js.map +1 -0
  34. package/dist/cli/render.d.ts +23 -0
  35. package/dist/cli/render.d.ts.map +1 -0
  36. package/dist/cli/render.js +44 -0
  37. package/dist/cli/render.js.map +1 -0
  38. package/dist/cli/repl.d.ts +32 -0
  39. package/dist/cli/repl.d.ts.map +1 -0
  40. package/dist/cli/repl.js +54 -0
  41. package/dist/cli/repl.js.map +1 -0
  42. package/dist/cli/sanitize.d.ts +2 -0
  43. package/dist/cli/sanitize.d.ts.map +1 -0
  44. package/dist/cli/sanitize.js +66 -0
  45. package/dist/cli/sanitize.js.map +1 -0
  46. package/dist/cli/status.d.ts +3 -0
  47. package/dist/cli/status.d.ts.map +1 -0
  48. package/dist/cli/status.js +27 -0
  49. package/dist/cli/status.js.map +1 -0
  50. package/dist/cli/tui_frame.d.ts +10 -0
  51. package/dist/cli/tui_frame.d.ts.map +1 -0
  52. package/dist/cli/tui_frame.js +44 -0
  53. package/dist/cli/tui_frame.js.map +1 -0
  54. package/dist/config/store.d.ts +27 -0
  55. package/dist/config/store.d.ts.map +1 -0
  56. package/dist/config/store.js +73 -0
  57. package/dist/config/store.js.map +1 -0
  58. package/dist/config/wizard.d.ts +27 -0
  59. package/dist/config/wizard.d.ts.map +1 -0
  60. package/dist/config/wizard.js +83 -0
  61. package/dist/config/wizard.js.map +1 -0
  62. package/dist/context/compact.d.ts +11 -0
  63. package/dist/context/compact.d.ts.map +1 -0
  64. package/dist/context/compact.js +38 -0
  65. package/dist/context/compact.js.map +1 -0
  66. package/dist/context/orientation.d.ts +19 -0
  67. package/dist/context/orientation.d.ts.map +1 -0
  68. package/dist/context/orientation.js +111 -0
  69. package/dist/context/orientation.js.map +1 -0
  70. package/dist/index.d.ts +2 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +401 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/permissions/store.d.ts +3 -0
  75. package/dist/permissions/store.d.ts.map +1 -0
  76. package/dist/permissions/store.js +22 -0
  77. package/dist/permissions/store.js.map +1 -0
  78. package/dist/providers/openai.d.ts +16 -0
  79. package/dist/providers/openai.d.ts.map +1 -0
  80. package/dist/providers/openai.js +75 -0
  81. package/dist/providers/openai.js.map +1 -0
  82. package/dist/runtime/budget.d.ts +11 -0
  83. package/dist/runtime/budget.d.ts.map +1 -0
  84. package/dist/runtime/budget.js +43 -0
  85. package/dist/runtime/budget.js.map +1 -0
  86. package/dist/runtime/cost_gate.d.ts +34 -0
  87. package/dist/runtime/cost_gate.d.ts.map +1 -0
  88. package/dist/runtime/cost_gate.js +85 -0
  89. package/dist/runtime/cost_gate.js.map +1 -0
  90. package/dist/runtime/executor.d.ts +25 -0
  91. package/dist/runtime/executor.d.ts.map +1 -0
  92. package/dist/runtime/executor.js +136 -0
  93. package/dist/runtime/executor.js.map +1 -0
  94. package/dist/runtime/loop.d.ts +48 -0
  95. package/dist/runtime/loop.d.ts.map +1 -0
  96. package/dist/runtime/loop.js +184 -0
  97. package/dist/runtime/loop.js.map +1 -0
  98. package/dist/runtime/retry.d.ts +7 -0
  99. package/dist/runtime/retry.d.ts.map +1 -0
  100. package/dist/runtime/retry.js +42 -0
  101. package/dist/runtime/retry.js.map +1 -0
  102. package/dist/runtime/session.d.ts +26 -0
  103. package/dist/runtime/session.d.ts.map +1 -0
  104. package/dist/runtime/session.js +146 -0
  105. package/dist/runtime/session.js.map +1 -0
  106. package/dist/runtime/usage.d.ts +29 -0
  107. package/dist/runtime/usage.d.ts.map +1 -0
  108. package/dist/runtime/usage.js +71 -0
  109. package/dist/runtime/usage.js.map +1 -0
  110. package/dist/tools/builtin/bash.d.ts +3 -0
  111. package/dist/tools/builtin/bash.d.ts.map +1 -0
  112. package/dist/tools/builtin/bash.js +104 -0
  113. package/dist/tools/builtin/bash.js.map +1 -0
  114. package/dist/tools/builtin/create_file.d.ts +3 -0
  115. package/dist/tools/builtin/create_file.d.ts.map +1 -0
  116. package/dist/tools/builtin/create_file.js +64 -0
  117. package/dist/tools/builtin/create_file.js.map +1 -0
  118. package/dist/tools/builtin/edit_file.d.ts +3 -0
  119. package/dist/tools/builtin/edit_file.d.ts.map +1 -0
  120. package/dist/tools/builtin/edit_file.js +128 -0
  121. package/dist/tools/builtin/edit_file.js.map +1 -0
  122. package/dist/tools/builtin/fetch.d.ts +3 -0
  123. package/dist/tools/builtin/fetch.d.ts.map +1 -0
  124. package/dist/tools/builtin/fetch.js +82 -0
  125. package/dist/tools/builtin/fetch.js.map +1 -0
  126. package/dist/tools/builtin/index.d.ts +3 -0
  127. package/dist/tools/builtin/index.d.ts.map +1 -0
  128. package/dist/tools/builtin/index.js +18 -0
  129. package/dist/tools/builtin/index.js.map +1 -0
  130. package/dist/tools/builtin/read_file.d.ts +3 -0
  131. package/dist/tools/builtin/read_file.d.ts.map +1 -0
  132. package/dist/tools/builtin/read_file.js +77 -0
  133. package/dist/tools/builtin/read_file.js.map +1 -0
  134. package/dist/tools/builtin/search.d.ts +3 -0
  135. package/dist/tools/builtin/search.d.ts.map +1 -0
  136. package/dist/tools/builtin/search.js +91 -0
  137. package/dist/tools/builtin/search.js.map +1 -0
  138. package/dist/tools/registry.d.ts +8 -0
  139. package/dist/tools/registry.d.ts.map +1 -0
  140. package/dist/tools/registry.js +16 -0
  141. package/dist/tools/registry.js.map +1 -0
  142. package/dist/tools/types.d.ts +45 -0
  143. package/dist/tools/types.d.ts.map +1 -0
  144. package/dist/tools/types.js +2 -0
  145. package/dist/tools/types.js.map +1 -0
  146. package/dist/types.d.ts +56 -0
  147. package/dist/types.d.ts.map +1 -0
  148. package/dist/types.js +2 -0
  149. package/dist/types.js.map +1 -0
  150. package/dist/verification/checks.d.ts +10 -0
  151. package/dist/verification/checks.d.ts.map +1 -0
  152. package/dist/verification/checks.js +501 -0
  153. package/dist/verification/checks.js.map +1 -0
  154. package/dist/verification/fix_round.d.ts +20 -0
  155. package/dist/verification/fix_round.d.ts.map +1 -0
  156. package/dist/verification/fix_round.js +59 -0
  157. package/dist/verification/fix_round.js.map +1 -0
  158. package/dist/verification/runner.d.ts +26 -0
  159. package/dist/verification/runner.d.ts.map +1 -0
  160. package/dist/verification/runner.js +155 -0
  161. package/dist/verification/runner.js.map +1 -0
  162. package/package.json +29 -0
@@ -0,0 +1,501 @@
1
+ import { readdir, readFile, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ async function fileExists(path) {
4
+ try {
5
+ const info = await stat(path);
6
+ return info.isFile();
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ async function directoryExists(path) {
13
+ try {
14
+ const info = await stat(path);
15
+ return info.isDirectory();
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ async function readTextIfExists(path) {
22
+ try {
23
+ return await readFile(path, 'utf8');
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ async function readDirSafe(path) {
30
+ try {
31
+ return await readdir(path);
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ }
37
+ function toStringArray(value) {
38
+ if (value === undefined)
39
+ return undefined;
40
+ if (!Array.isArray(value))
41
+ return undefined;
42
+ const parts = value.filter((item) => typeof item === 'string' && item.trim() !== '');
43
+ return parts.length > 0 ? parts : undefined;
44
+ }
45
+ function normalizeCheck(raw) {
46
+ if (!raw)
47
+ return null;
48
+ if (typeof raw.id !== 'string' || raw.id.trim() === '')
49
+ return null;
50
+ if (typeof raw.name !== 'string' || raw.name.trim() === '')
51
+ return null;
52
+ if (typeof raw.command !== 'string' || raw.command.trim() === '')
53
+ return null;
54
+ const command = raw.command.trim();
55
+ const requiresEnv = toStringArray(raw.requiresEnv);
56
+ const requiresCommands = toStringArray(raw.requiresCommands);
57
+ const requiresAnyCommands = toStringArray(raw.requiresAnyCommands);
58
+ const inferredCommand = requiresCommands || requiresAnyCommands ? undefined : inferCommandBinary(command);
59
+ return {
60
+ id: raw.id.trim(),
61
+ name: raw.name.trim(),
62
+ command,
63
+ requiresEnv,
64
+ requiresCommands: requiresCommands ?? (inferredCommand ? [inferredCommand] : undefined),
65
+ requiresAnyCommands
66
+ };
67
+ }
68
+ function pushUnique(checks, check) {
69
+ if (checks.some((item) => item.id === check.id || item.command === check.command))
70
+ return;
71
+ checks.push(check);
72
+ }
73
+ async function loadCustomChecks(cwd) {
74
+ const candidates = [join(cwd, '.merlion', 'verify.json'), join(cwd, 'merlion.verify.json')];
75
+ for (const path of candidates) {
76
+ const text = await readTextIfExists(path);
77
+ if (!text)
78
+ continue;
79
+ try {
80
+ const parsed = JSON.parse(text);
81
+ const checks = (parsed.checks ?? [])
82
+ .map((item) => normalizeCheck(item))
83
+ .filter((item) => item !== null);
84
+ // Explicit config file (even empty checks) means "do not auto-discover".
85
+ return checks;
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+ function hasTomlSection(text, section) {
94
+ if (!text)
95
+ return false;
96
+ return new RegExp(`\\[\\s*${section.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*\\]`, 'm').test(text);
97
+ }
98
+ function inferCommandBinary(command) {
99
+ const firstSegment = command.split(/&&|\|\||;/)[0]?.trim() ?? '';
100
+ if (firstSegment === '')
101
+ return undefined;
102
+ const tokens = firstSegment.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) ?? [];
103
+ let index = 0;
104
+ while (index < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(tokens[index])) {
105
+ index += 1;
106
+ }
107
+ const token = tokens[index];
108
+ if (!token)
109
+ return undefined;
110
+ const normalized = token.replace(/^['"]|['"]$/g, '');
111
+ if (normalized === '' ||
112
+ normalized.startsWith('./') ||
113
+ normalized.startsWith('/') ||
114
+ normalized.startsWith('$') ||
115
+ normalized.includes('/')) {
116
+ return undefined;
117
+ }
118
+ return normalized;
119
+ }
120
+ function buildCheck(id, name, command, extras) {
121
+ const requiresCommands = extras?.requiresCommands ?? (() => {
122
+ if (extras?.requiresAnyCommands)
123
+ return undefined;
124
+ const inferred = inferCommandBinary(command);
125
+ return inferred ? [inferred] : undefined;
126
+ })();
127
+ return {
128
+ id,
129
+ name,
130
+ command,
131
+ requiresEnv: extras?.requiresEnv,
132
+ requiresCommands,
133
+ requiresAnyCommands: extras?.requiresAnyCommands
134
+ };
135
+ }
136
+ function pythonModuleCommand(moduleAndArgs) {
137
+ return [
138
+ 'if command -v python3 >/dev/null 2>&1; then',
139
+ ` python3 -m ${moduleAndArgs};`,
140
+ 'else',
141
+ ` python -m ${moduleAndArgs};`,
142
+ 'fi'
143
+ ].join(' ');
144
+ }
145
+ function isLikelyVerificationCommand(command) {
146
+ const signal = /(test|pytest|mypy|ruff|lint|typecheck|clippy|ctest|check|verify|spec)/i;
147
+ if (!signal.test(command))
148
+ return false;
149
+ const noisy = /(deploy|release|publish|docker push|helm|terraform apply|kubectl apply)/i;
150
+ return !noisy.test(command);
151
+ }
152
+ function extractGithubRunCommands(text) {
153
+ const commands = [];
154
+ const lines = text.split(/\r?\n/);
155
+ for (let i = 0; i < lines.length; i += 1) {
156
+ const line = lines[i] ?? '';
157
+ const inline = line.match(/^\s*-\s*run:\s*(.+?)\s*$/);
158
+ if (inline && inline[1] && inline[1] !== '|' && inline[1] !== '>') {
159
+ commands.push(inline[1].trim());
160
+ continue;
161
+ }
162
+ const block = line.match(/^(\s*)-\s*run:\s*[|>]\s*$/);
163
+ if (!block)
164
+ continue;
165
+ const indent = block[1]?.length ?? 0;
166
+ const blockLines = [];
167
+ let j = i + 1;
168
+ while (j < lines.length) {
169
+ const next = lines[j] ?? '';
170
+ if (next.trim() === '') {
171
+ j += 1;
172
+ continue;
173
+ }
174
+ const currentIndent = next.match(/^(\s*)/)?.[1].length ?? 0;
175
+ if (currentIndent <= indent)
176
+ break;
177
+ blockLines.push(next.trim());
178
+ j += 1;
179
+ }
180
+ if (blockLines.length > 0) {
181
+ commands.push(blockLines.join(' && '));
182
+ }
183
+ i = Math.max(i, j - 1);
184
+ }
185
+ return commands;
186
+ }
187
+ function extractGitlabScriptCommands(text) {
188
+ const commands = [];
189
+ const lines = text.split(/\r?\n/);
190
+ let inScript = false;
191
+ let scriptIndent = -1;
192
+ for (const line of lines) {
193
+ const indent = line.match(/^(\s*)/)?.[1].length ?? 0;
194
+ const inlineScript = line.match(/^\s*script:\s*(.+)\s*$/);
195
+ if (inlineScript && inlineScript[1] && inlineScript[1] !== '|') {
196
+ commands.push(inlineScript[1].trim());
197
+ inScript = false;
198
+ scriptIndent = -1;
199
+ continue;
200
+ }
201
+ if (/^\s*script:\s*$/.test(line)) {
202
+ inScript = true;
203
+ scriptIndent = indent;
204
+ continue;
205
+ }
206
+ if (!inScript)
207
+ continue;
208
+ if (line.trim() === '')
209
+ continue;
210
+ if (indent <= scriptIndent) {
211
+ inScript = false;
212
+ scriptIndent = -1;
213
+ continue;
214
+ }
215
+ const cmd = line.match(/^\s*-\s+(.+?)\s*$/)?.[1];
216
+ if (cmd)
217
+ commands.push(cmd.trim());
218
+ }
219
+ return commands;
220
+ }
221
+ async function discoverCiChecks(cwd) {
222
+ const checks = [];
223
+ const githubDir = join(cwd, '.github', 'workflows');
224
+ if (await directoryExists(githubDir)) {
225
+ const names = await readDirSafe(githubDir);
226
+ const workflowFiles = names.filter((name) => name.endsWith('.yml') || name.endsWith('.yaml')).sort();
227
+ let ciIndex = 1;
228
+ for (const name of workflowFiles) {
229
+ const text = await readTextIfExists(join(githubDir, name));
230
+ if (!text)
231
+ continue;
232
+ const commands = extractGithubRunCommands(text).filter(isLikelyVerificationCommand);
233
+ for (const command of commands) {
234
+ pushUnique(checks, buildCheck(`ci_${ciIndex}`, `CI Check ${ciIndex}`, command));
235
+ ciIndex += 1;
236
+ }
237
+ }
238
+ }
239
+ const gitlab = await readTextIfExists(join(cwd, '.gitlab-ci.yml'));
240
+ if (gitlab) {
241
+ let ciIndex = checks.length + 1;
242
+ const commands = extractGitlabScriptCommands(gitlab).filter(isLikelyVerificationCommand);
243
+ for (const command of commands) {
244
+ pushUnique(checks, buildCheck(`ci_${ciIndex}`, `CI Check ${ciIndex}`, command));
245
+ ciIndex += 1;
246
+ }
247
+ }
248
+ return checks;
249
+ }
250
+ async function loadPackageJson(cwd) {
251
+ const text = await readTextIfExists(join(cwd, 'package.json'));
252
+ if (!text)
253
+ return null;
254
+ try {
255
+ return JSON.parse(text);
256
+ }
257
+ catch {
258
+ return null;
259
+ }
260
+ }
261
+ async function pickNodeRunner(cwd) {
262
+ if (await fileExists(join(cwd, 'pnpm-lock.yaml')))
263
+ return { label: 'pnpm', command: 'pnpm run' };
264
+ if (await fileExists(join(cwd, 'yarn.lock')))
265
+ return { label: 'yarn', command: 'yarn' };
266
+ if (await fileExists(join(cwd, 'bun.lockb')) || await fileExists(join(cwd, 'bun.lock'))) {
267
+ return { label: 'bun', command: 'bun run' };
268
+ }
269
+ return { label: 'npm', command: 'npm run' };
270
+ }
271
+ async function discoverNodeChecks(cwd) {
272
+ const pkg = await loadPackageJson(cwd);
273
+ const scripts = pkg?.scripts ?? {};
274
+ const checks = [];
275
+ if (Object.keys(scripts).length === 0)
276
+ return checks;
277
+ const runner = await pickNodeRunner(cwd);
278
+ const run = (name) => `${runner.command} ${name}`;
279
+ if (scripts.typecheck) {
280
+ checks.push(buildCheck('typecheck', 'TypeCheck', run('typecheck'), { requiresCommands: [runner.label] }));
281
+ }
282
+ if (scripts.test) {
283
+ checks.push(buildCheck('test', 'Unit Tests', run('test'), { requiresCommands: [runner.label] }));
284
+ }
285
+ if (scripts['test:e2e']) {
286
+ checks.push(buildCheck('test_e2e', 'E2E Tests', run('test:e2e'), {
287
+ requiresEnv: ['OPENROUTER_API_KEY'],
288
+ requiresCommands: [runner.label]
289
+ }));
290
+ }
291
+ if (scripts.lint) {
292
+ checks.push(buildCheck('lint', 'Lint', run('lint'), { requiresCommands: [runner.label] }));
293
+ }
294
+ return checks;
295
+ }
296
+ async function discoverPythonChecks(cwd) {
297
+ const checks = [];
298
+ const pyprojectPath = join(cwd, 'pyproject.toml');
299
+ const [hasPyproject, hasRequirements, hasSetupPy, hasPytestIni, hasMypyIni, hasRuffToml, hasTestsDir] = await Promise.all([
300
+ fileExists(pyprojectPath),
301
+ fileExists(join(cwd, 'requirements.txt')),
302
+ fileExists(join(cwd, 'setup.py')),
303
+ fileExists(join(cwd, 'pytest.ini')),
304
+ fileExists(join(cwd, 'mypy.ini')),
305
+ fileExists(join(cwd, '.ruff.toml')),
306
+ directoryExists(join(cwd, 'tests'))
307
+ ]);
308
+ const pyprojectText = hasPyproject ? await readTextIfExists(pyprojectPath) : null;
309
+ const rootNames = await readDirSafe(cwd);
310
+ const hasRootPyFile = rootNames.some((name) => name.endsWith('.py'));
311
+ const hasPythonProject = hasPyproject || hasRequirements || hasSetupPy || hasRootPyFile;
312
+ if (!hasPythonProject)
313
+ return checks;
314
+ if (hasPytestIni ||
315
+ hasTestsDir ||
316
+ hasTomlSection(pyprojectText, 'tool.pytest') ||
317
+ hasTomlSection(pyprojectText, 'tool.pytest.ini_options')) {
318
+ pushUnique(checks, buildCheck('python_test', 'Python Tests', pythonModuleCommand('pytest -q'), {
319
+ requiresAnyCommands: ['python3', 'python']
320
+ }));
321
+ }
322
+ if (hasMypyIni || hasTomlSection(pyprojectText, 'tool.mypy')) {
323
+ pushUnique(checks, buildCheck('python_typecheck', 'Python TypeCheck', pythonModuleCommand('mypy .'), {
324
+ requiresAnyCommands: ['python3', 'python']
325
+ }));
326
+ }
327
+ if (hasRuffToml || hasTomlSection(pyprojectText, 'tool.ruff')) {
328
+ pushUnique(checks, buildCheck('python_lint', 'Python Lint', pythonModuleCommand('ruff check .'), {
329
+ requiresAnyCommands: ['python3', 'python']
330
+ }));
331
+ }
332
+ return checks;
333
+ }
334
+ async function discoverJavaChecks(cwd) {
335
+ const checks = [];
336
+ const [hasPom, hasGradle, hasGradleKts, hasGradlew] = await Promise.all([
337
+ fileExists(join(cwd, 'pom.xml')),
338
+ fileExists(join(cwd, 'build.gradle')),
339
+ fileExists(join(cwd, 'build.gradle.kts')),
340
+ fileExists(join(cwd, 'gradlew'))
341
+ ]);
342
+ if (hasGradlew || hasGradle || hasGradleKts) {
343
+ if (hasGradlew) {
344
+ checks.push(buildCheck('java_test_gradle', 'Java Tests (Gradle)', './gradlew test --console=plain'));
345
+ }
346
+ else {
347
+ checks.push(buildCheck('java_test_gradle', 'Java Tests (Gradle)', 'gradle test --console=plain'));
348
+ }
349
+ return checks;
350
+ }
351
+ if (hasPom) {
352
+ checks.push(buildCheck('java_test_maven', 'Java Tests (Maven)', 'mvn -B test'));
353
+ }
354
+ return checks;
355
+ }
356
+ async function discoverMakeAndCmakeChecks(cwd) {
357
+ const checks = [];
358
+ const makefilePath = (await fileExists(join(cwd, 'Makefile')))
359
+ ? join(cwd, 'Makefile')
360
+ : (await fileExists(join(cwd, 'makefile')))
361
+ ? join(cwd, 'makefile')
362
+ : null;
363
+ if (makefilePath) {
364
+ const makeText = await readTextIfExists(makefilePath);
365
+ if (makeText) {
366
+ if (/^[\t ]*test\s*:/m.test(makeText)) {
367
+ checks.push(buildCheck('make_test', 'C/C++ Tests (make test)', 'make test'));
368
+ }
369
+ else if (/^[\t ]*check\s*:/m.test(makeText)) {
370
+ checks.push(buildCheck('make_check', 'C/C++ Checks (make check)', 'make check'));
371
+ }
372
+ }
373
+ }
374
+ const hasCmakeProject = await fileExists(join(cwd, 'CMakeLists.txt'));
375
+ const hasCTest = (await fileExists(join(cwd, 'CTestTestfile.cmake'))) ||
376
+ (await fileExists(join(cwd, 'build', 'CTestTestfile.cmake'))) ||
377
+ hasCmakeProject;
378
+ if (hasCTest) {
379
+ checks.push(buildCheck('ctest', 'C/C++ Tests (ctest)', 'ctest --output-on-failure'));
380
+ }
381
+ return checks;
382
+ }
383
+ async function discoverGoChecks(cwd) {
384
+ const checks = [];
385
+ if (!await fileExists(join(cwd, 'go.mod')))
386
+ return checks;
387
+ checks.push(buildCheck('go_test', 'Go Tests', 'go test ./...'));
388
+ const hasGolangci = (await fileExists(join(cwd, '.golangci.yml'))) ||
389
+ (await fileExists(join(cwd, '.golangci.yaml'))) ||
390
+ (await fileExists(join(cwd, '.golangci.toml'))) ||
391
+ (await fileExists(join(cwd, '.golangci.json')));
392
+ if (hasGolangci) {
393
+ checks.push(buildCheck('go_lint', 'Go Lint', 'golangci-lint run'));
394
+ }
395
+ return checks;
396
+ }
397
+ async function discoverRustChecks(cwd) {
398
+ if (!await fileExists(join(cwd, 'Cargo.toml')))
399
+ return [];
400
+ return [
401
+ buildCheck('rust_test', 'Rust Tests', 'cargo test'),
402
+ buildCheck('rust_lint', 'Rust Lint', 'cargo clippy --all-targets --all-features -- -D warnings')
403
+ ];
404
+ }
405
+ async function discoverDotnetChecks(cwd) {
406
+ const names = await readDirSafe(cwd);
407
+ const hasDotnet = names.some((name) => name.endsWith('.sln') || name.endsWith('.csproj') || name.endsWith('.fsproj'));
408
+ if (!hasDotnet)
409
+ return [];
410
+ return [buildCheck('dotnet_test', '.NET Tests', 'dotnet test --nologo')];
411
+ }
412
+ async function discoverPhpChecks(cwd) {
413
+ const checks = [];
414
+ const composerText = await readTextIfExists(join(cwd, 'composer.json'));
415
+ if (!composerText)
416
+ return checks;
417
+ try {
418
+ const parsed = JSON.parse(composerText);
419
+ if (parsed.scripts && Object.prototype.hasOwnProperty.call(parsed.scripts, 'test')) {
420
+ checks.push(buildCheck('php_test', 'PHP Tests', 'composer test'));
421
+ return checks;
422
+ }
423
+ }
424
+ catch {
425
+ // keep fallback checks
426
+ }
427
+ if (await fileExists(join(cwd, 'phpunit.xml')) || await fileExists(join(cwd, 'phpunit.xml.dist'))) {
428
+ checks.push(buildCheck('php_test', 'PHP Tests', 'vendor/bin/phpunit'));
429
+ }
430
+ return checks;
431
+ }
432
+ async function discoverRubyChecks(cwd) {
433
+ const checks = [];
434
+ const [hasGemfile, hasRakefile, hasRspec, hasSpecDir] = await Promise.all([
435
+ fileExists(join(cwd, 'Gemfile')),
436
+ fileExists(join(cwd, 'Rakefile')),
437
+ fileExists(join(cwd, '.rspec')),
438
+ directoryExists(join(cwd, 'spec'))
439
+ ]);
440
+ if (!hasGemfile && !hasRakefile && !hasSpecDir && !hasRspec)
441
+ return checks;
442
+ if (hasSpecDir || hasRspec) {
443
+ checks.push(buildCheck('ruby_test_rspec', 'Ruby Tests (RSpec)', 'bundle exec rspec'));
444
+ }
445
+ else if (hasRakefile) {
446
+ checks.push(buildCheck('ruby_test_rake', 'Ruby Tests (Rake)', 'bundle exec rake test'));
447
+ }
448
+ return checks;
449
+ }
450
+ async function discoverElixirChecks(cwd) {
451
+ if (!await fileExists(join(cwd, 'mix.exs')))
452
+ return [];
453
+ return [buildCheck('elixir_test', 'Elixir Tests', 'mix test')];
454
+ }
455
+ async function discoverSwiftChecks(cwd) {
456
+ if (!await fileExists(join(cwd, 'Package.swift')))
457
+ return [];
458
+ return [buildCheck('swift_test', 'Swift Package Tests', 'swift test')];
459
+ }
460
+ async function discoverDartChecks(cwd) {
461
+ const pubspec = await readTextIfExists(join(cwd, 'pubspec.yaml'));
462
+ if (!pubspec)
463
+ return [];
464
+ if (/^\s*flutter\s*:/m.test(pubspec)) {
465
+ return [buildCheck('flutter_test', 'Flutter Tests', 'flutter test')];
466
+ }
467
+ return [buildCheck('dart_test', 'Dart Tests', 'dart test')];
468
+ }
469
+ export async function discoverVerificationChecks(cwd) {
470
+ const customChecks = await loadCustomChecks(cwd);
471
+ if (customChecks !== null) {
472
+ return customChecks;
473
+ }
474
+ // CI workflow commands are project-defined and language-agnostic.
475
+ const ciChecks = await discoverCiChecks(cwd);
476
+ if (ciChecks.length > 0) {
477
+ return ciChecks;
478
+ }
479
+ const checks = [];
480
+ const discovered = await Promise.all([
481
+ discoverNodeChecks(cwd),
482
+ discoverPythonChecks(cwd),
483
+ discoverJavaChecks(cwd),
484
+ discoverMakeAndCmakeChecks(cwd),
485
+ discoverGoChecks(cwd),
486
+ discoverRustChecks(cwd),
487
+ discoverDotnetChecks(cwd),
488
+ discoverPhpChecks(cwd),
489
+ discoverRubyChecks(cwd),
490
+ discoverElixirChecks(cwd),
491
+ discoverSwiftChecks(cwd),
492
+ discoverDartChecks(cwd)
493
+ ]);
494
+ for (const group of discovered) {
495
+ for (const check of group) {
496
+ pushUnique(checks, check);
497
+ }
498
+ }
499
+ return checks;
500
+ }
501
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/verification/checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { VerificationCheckResult, VerificationRunResult } from './runner.ts';
2
+ export interface FixRoundOptions {
3
+ maxRounds: number;
4
+ runVerification: () => Promise<VerificationRunResult>;
5
+ runFixTurn: (prompt: string, round: number) => Promise<void>;
6
+ onRound?: (event: {
7
+ round: number;
8
+ verification: VerificationRunResult;
9
+ action: 'pass' | 'fix' | 'stop';
10
+ prompt?: string;
11
+ }) => Promise<void> | void;
12
+ }
13
+ export interface FixRoundOutcome {
14
+ passed: boolean;
15
+ roundsUsed: number;
16
+ lastVerification: VerificationRunResult | null;
17
+ }
18
+ export declare function buildVerificationFixPrompt(round: number, failed: VerificationCheckResult[]): string;
19
+ export declare function runVerificationFixRounds(options: FixRoundOptions): Promise<FixRoundOutcome>;
20
+ //# sourceMappingURL=fix_round.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix_round.d.ts","sourceRoot":"","sources":["../../src/verification/fix_round.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEjF,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACrD,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,KAAK,EAAE,MAAM,CAAA;QACb,YAAY,EAAE,qBAAqB,CAAA;QACnC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;QAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,qBAAqB,GAAG,IAAI,CAAA;CAC/C;AAQD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,CAgBnG;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAuCjG"}
@@ -0,0 +1,59 @@
1
+ function cleanOutput(output, maxChars = 1200) {
2
+ const normalized = output.replace(/\s+/g, ' ').trim();
3
+ if (normalized.length <= maxChars)
4
+ return normalized;
5
+ return `${normalized.slice(0, maxChars)}...`;
6
+ }
7
+ export function buildVerificationFixPrompt(round, failed) {
8
+ const summary = failed
9
+ .map((item) => {
10
+ const signal = cleanOutput(item.output);
11
+ return `- ${item.name} (${item.command})\n failure signal: ${signal || '(no output)'}`;
12
+ })
13
+ .join('\n');
14
+ return [
15
+ `Verification failed after the previous attempt (fix round ${round}).`,
16
+ 'Address the failed checks below with minimal, safe edits.',
17
+ 'After edits, summarize what changed and why it should pass.',
18
+ '',
19
+ 'Failed checks:',
20
+ summary,
21
+ ].join('\n');
22
+ }
23
+ export async function runVerificationFixRounds(options) {
24
+ const maxRounds = Math.max(0, Math.floor(options.maxRounds));
25
+ let roundsUsed = 0;
26
+ let lastVerification = null;
27
+ for (let round = 0; round <= maxRounds; round += 1) {
28
+ const verification = await options.runVerification();
29
+ lastVerification = verification;
30
+ if (verification.allPassed) {
31
+ await options.onRound?.({
32
+ round,
33
+ verification,
34
+ action: 'pass',
35
+ });
36
+ return { passed: true, roundsUsed, lastVerification };
37
+ }
38
+ const failed = verification.results.filter((r) => r.status === 'failed');
39
+ if (round >= maxRounds || failed.length === 0) {
40
+ await options.onRound?.({
41
+ round,
42
+ verification,
43
+ action: 'stop',
44
+ });
45
+ return { passed: false, roundsUsed, lastVerification };
46
+ }
47
+ const prompt = buildVerificationFixPrompt(round + 1, failed);
48
+ await options.onRound?.({
49
+ round,
50
+ verification,
51
+ action: 'fix',
52
+ prompt,
53
+ });
54
+ await options.runFixTurn(prompt, round + 1);
55
+ roundsUsed += 1;
56
+ }
57
+ return { passed: false, roundsUsed, lastVerification };
58
+ }
59
+ //# sourceMappingURL=fix_round.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix_round.js","sourceRoot":"","sources":["../../src/verification/fix_round.ts"],"names":[],"mappings":"AAoBA,SAAS,WAAW,CAAC,MAAc,EAAE,QAAQ,GAAG,IAAI;IAClD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IACrD,IAAI,UAAU,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,UAAU,CAAA;IACpD,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAa,EAAE,MAAiC;IACzF,MAAM,OAAO,GAAG,MAAM;SACnB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,wBAAwB,MAAM,IAAI,aAAa,EAAE,CAAA;IACzF,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;QACL,6DAA6D,KAAK,IAAI;QACtE,2DAA2D;QAC3D,6DAA6D;QAC7D,EAAE;QACF,gBAAgB;QAChB,OAAO;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAAwB;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;IAC5D,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,gBAAgB,GAAiC,IAAI,CAAA;IAEzD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,CAAA;QACpD,gBAAgB,GAAG,YAAY,CAAA;QAC/B,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACtB,KAAK;gBACL,YAAY;gBACZ,MAAM,EAAE,MAAM;aACf,CAAC,CAAA;YACF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAA;QACvD,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;QACxE,IAAI,KAAK,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACtB,KAAK;gBACL,YAAY;gBACZ,MAAM,EAAE,MAAM;aACf,CAAC,CAAA;YACF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAA;QACxD,CAAC;QAED,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;QAC5D,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACtB,KAAK;YACL,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,MAAM;SACP,CAAC,CAAA;QACF,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;QAC3C,UAAU,IAAI,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAA;AACxD,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { VerificationCheck } from './checks.ts';
2
+ export type VerificationStatus = 'passed' | 'failed' | 'skipped';
3
+ export interface VerificationCheckResult {
4
+ id: string;
5
+ name: string;
6
+ command: string;
7
+ status: VerificationStatus;
8
+ durationMs: number;
9
+ exitCode: number | null;
10
+ output: string;
11
+ timedOut: boolean;
12
+ }
13
+ export interface VerificationRunResult {
14
+ allPassed: boolean;
15
+ results: VerificationCheckResult[];
16
+ }
17
+ export interface RunVerificationChecksOptions {
18
+ cwd: string;
19
+ checks: VerificationCheck[];
20
+ timeoutMs?: number;
21
+ maxOutputChars?: number;
22
+ onCheckStart?: (check: VerificationCheck) => Promise<void> | void;
23
+ onCheckResult?: (result: VerificationCheckResult) => Promise<void> | void;
24
+ }
25
+ export declare function runVerificationChecks(options: RunVerificationChecksOptions): Promise<VerificationRunResult>;
26
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/verification/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEhE,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,kBAAkB,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,uBAAuB,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,iBAAiB,EAAE,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACjE,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAC1E;AAuFD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,qBAAqB,CAAC,CAkFhC"}