@eidra-umain/greenlight 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 (142) hide show
  1. package/README.md +391 -0
  2. package/dist/browser/browser.d.ts +24 -0
  3. package/dist/browser/browser.d.ts.map +1 -0
  4. package/dist/browser/browser.js +44 -0
  5. package/dist/browser/browser.js.map +1 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +140 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/run.d.ts +9 -0
  11. package/dist/cli/run.d.ts.map +1 -0
  12. package/dist/cli/run.js +277 -0
  13. package/dist/cli/run.js.map +1 -0
  14. package/dist/config.d.ts +48 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +107 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/globals.d.ts +21 -0
  19. package/dist/globals.d.ts.map +1 -0
  20. package/dist/globals.js +24 -0
  21. package/dist/globals.js.map +1 -0
  22. package/dist/parser/loader.d.ts +7 -0
  23. package/dist/parser/loader.d.ts.map +1 -0
  24. package/dist/parser/loader.js +43 -0
  25. package/dist/parser/loader.js.map +1 -0
  26. package/dist/parser/schema.d.ts +42 -0
  27. package/dist/parser/schema.d.ts.map +1 -0
  28. package/dist/parser/schema.js +33 -0
  29. package/dist/parser/schema.js.map +1 -0
  30. package/dist/parser/steps.d.ts +13 -0
  31. package/dist/parser/steps.d.ts.map +1 -0
  32. package/dist/parser/steps.js +44 -0
  33. package/dist/parser/steps.js.map +1 -0
  34. package/dist/parser/variables.d.ts +18 -0
  35. package/dist/parser/variables.d.ts.map +1 -0
  36. package/dist/parser/variables.js +44 -0
  37. package/dist/parser/variables.js.map +1 -0
  38. package/dist/pilot/a11y-parser.d.ts +26 -0
  39. package/dist/pilot/a11y-parser.d.ts.map +1 -0
  40. package/dist/pilot/a11y-parser.js +195 -0
  41. package/dist/pilot/a11y-parser.js.map +1 -0
  42. package/dist/pilot/assertions.d.ts +30 -0
  43. package/dist/pilot/assertions.d.ts.map +1 -0
  44. package/dist/pilot/assertions.js +219 -0
  45. package/dist/pilot/assertions.js.map +1 -0
  46. package/dist/pilot/checkbox.d.ts +12 -0
  47. package/dist/pilot/checkbox.d.ts.map +1 -0
  48. package/dist/pilot/checkbox.js +104 -0
  49. package/dist/pilot/checkbox.js.map +1 -0
  50. package/dist/pilot/executor.d.ts +17 -0
  51. package/dist/pilot/executor.d.ts.map +1 -0
  52. package/dist/pilot/executor.js +462 -0
  53. package/dist/pilot/executor.js.map +1 -0
  54. package/dist/pilot/form-fields.d.ts +34 -0
  55. package/dist/pilot/form-fields.d.ts.map +1 -0
  56. package/dist/pilot/form-fields.js +139 -0
  57. package/dist/pilot/form-fields.js.map +1 -0
  58. package/dist/pilot/llm.d.ts +49 -0
  59. package/dist/pilot/llm.d.ts.map +1 -0
  60. package/dist/pilot/llm.js +188 -0
  61. package/dist/pilot/llm.js.map +1 -0
  62. package/dist/pilot/locator.d.ts +58 -0
  63. package/dist/pilot/locator.d.ts.map +1 -0
  64. package/dist/pilot/locator.js +248 -0
  65. package/dist/pilot/locator.js.map +1 -0
  66. package/dist/pilot/message-builder.d.ts +31 -0
  67. package/dist/pilot/message-builder.d.ts.map +1 -0
  68. package/dist/pilot/message-builder.js +112 -0
  69. package/dist/pilot/message-builder.js.map +1 -0
  70. package/dist/pilot/network.d.ts +23 -0
  71. package/dist/pilot/network.d.ts.map +1 -0
  72. package/dist/pilot/network.js +92 -0
  73. package/dist/pilot/network.js.map +1 -0
  74. package/dist/pilot/pilot.d.ts +27 -0
  75. package/dist/pilot/pilot.d.ts.map +1 -0
  76. package/dist/pilot/pilot.js +249 -0
  77. package/dist/pilot/pilot.js.map +1 -0
  78. package/dist/pilot/prompts.d.ts +8 -0
  79. package/dist/pilot/prompts.d.ts.map +1 -0
  80. package/dist/pilot/prompts.js +163 -0
  81. package/dist/pilot/prompts.js.map +1 -0
  82. package/dist/pilot/providers/anthropic.d.ts +6 -0
  83. package/dist/pilot/providers/anthropic.d.ts.map +1 -0
  84. package/dist/pilot/providers/anthropic.js +45 -0
  85. package/dist/pilot/providers/anthropic.js.map +1 -0
  86. package/dist/pilot/providers/gemini.d.ts +6 -0
  87. package/dist/pilot/providers/gemini.d.ts.map +1 -0
  88. package/dist/pilot/providers/gemini.js +55 -0
  89. package/dist/pilot/providers/gemini.js.map +1 -0
  90. package/dist/pilot/providers/index.d.ts +10 -0
  91. package/dist/pilot/providers/index.d.ts.map +1 -0
  92. package/dist/pilot/providers/index.js +25 -0
  93. package/dist/pilot/providers/index.js.map +1 -0
  94. package/dist/pilot/providers/openai-compatible.d.ts +7 -0
  95. package/dist/pilot/providers/openai-compatible.d.ts.map +1 -0
  96. package/dist/pilot/providers/openai-compatible.js +34 -0
  97. package/dist/pilot/providers/openai-compatible.js.map +1 -0
  98. package/dist/pilot/providers/types.d.ts +12 -0
  99. package/dist/pilot/providers/types.d.ts.map +1 -0
  100. package/dist/pilot/providers/types.js +2 -0
  101. package/dist/pilot/providers/types.js.map +1 -0
  102. package/dist/pilot/response-parser.d.ts +31 -0
  103. package/dist/pilot/response-parser.d.ts.map +1 -0
  104. package/dist/pilot/response-parser.js +188 -0
  105. package/dist/pilot/response-parser.js.map +1 -0
  106. package/dist/pilot/state.d.ts +19 -0
  107. package/dist/pilot/state.d.ts.map +1 -0
  108. package/dist/pilot/state.js +67 -0
  109. package/dist/pilot/state.js.map +1 -0
  110. package/dist/pilot/trace.d.ts +16 -0
  111. package/dist/pilot/trace.d.ts.map +1 -0
  112. package/dist/pilot/trace.js +117 -0
  113. package/dist/pilot/trace.js.map +1 -0
  114. package/dist/planner/hasher.d.ts +14 -0
  115. package/dist/planner/hasher.d.ts.map +1 -0
  116. package/dist/planner/hasher.js +21 -0
  117. package/dist/planner/hasher.js.map +1 -0
  118. package/dist/planner/plan-generator.d.ts +23 -0
  119. package/dist/planner/plan-generator.d.ts.map +1 -0
  120. package/dist/planner/plan-generator.js +56 -0
  121. package/dist/planner/plan-generator.js.map +1 -0
  122. package/dist/planner/plan-runner.d.ts +16 -0
  123. package/dist/planner/plan-runner.d.ts.map +1 -0
  124. package/dist/planner/plan-runner.js +375 -0
  125. package/dist/planner/plan-runner.js.map +1 -0
  126. package/dist/planner/plan-store.d.ts +22 -0
  127. package/dist/planner/plan-store.d.ts.map +1 -0
  128. package/dist/planner/plan-store.js +71 -0
  129. package/dist/planner/plan-store.js.map +1 -0
  130. package/dist/planner/plan-types.d.ts +64 -0
  131. package/dist/planner/plan-types.d.ts.map +1 -0
  132. package/dist/planner/plan-types.js +7 -0
  133. package/dist/planner/plan-types.js.map +1 -0
  134. package/dist/reporter/types.d.ts +130 -0
  135. package/dist/reporter/types.d.ts.map +1 -0
  136. package/dist/reporter/types.js +5 -0
  137. package/dist/reporter/types.js.map +1 -0
  138. package/dist/types.d.ts +51 -0
  139. package/dist/types.d.ts.map +1 -0
  140. package/dist/types.js +23 -0
  141. package/dist/types.js.map +1 -0
  142. package/package.json +64 -0
@@ -0,0 +1,277 @@
1
+ import { loadSuite } from "../parser/loader.js";
2
+ import { launchBrowser, createContext, createPage, closeBrowser, toBrowserOptions, } from "../browser/browser.js";
3
+ import { attachConsoleCollector, attachNetworkTracker, } from "../pilot/network.js";
4
+ import { resolveLLMConfig, createLLMClient, } from "../pilot/llm.js";
5
+ import { runTestCase } from "../pilot/pilot.js";
6
+ import { computeTestHash, slugify } from "../planner/hasher.js";
7
+ import { loadHashIndex, saveHashIndex, loadPlan, savePlan, ensureGitignore, } from "../planner/plan-store.js";
8
+ import { createPlanRecorder } from "../planner/plan-generator.js";
9
+ import { runCachedPlan } from "../planner/plan-runner.js";
10
+ import { resolveModelConfig } from "../types.js";
11
+ import { globals } from "../globals.js";
12
+ /** Print step-by-step results for a test case. */
13
+ function printStepResults(result) {
14
+ for (const stepResult of result.steps) {
15
+ const icon = stepResult.status === "passed"
16
+ ? "\x1b[32m\u2713\x1b[0m"
17
+ : "\x1b[31m\u2717\x1b[0m";
18
+ const dur = `${String(Math.round(stepResult.duration))}ms`;
19
+ const t = stepResult.timing;
20
+ const phases = t
21
+ ? ` \x1b[90m[capture:${String(Math.round(t.capture))} llm:${String(Math.round(t.llm))} exec:${String(Math.round(t.execute))} post:${String(Math.round(t.postCapture))}ms]\x1b[0m`
22
+ : "";
23
+ console.log(` ${icon} ${stepResult.step} (${dur})${phases}`);
24
+ if (stepResult.error) {
25
+ console.log(` \x1b[31m${stepResult.error}\x1b[0m`);
26
+ }
27
+ if (globals.debug && stepResult.action) {
28
+ console.log(` Action: ${JSON.stringify(stepResult.action)}`);
29
+ }
30
+ }
31
+ }
32
+ /** Print pass/fail summary for a test case. */
33
+ function printTestSummary(result) {
34
+ const modeTag = result.mode === "cached" ? " \x1b[36m[cached]\x1b[0m" : "";
35
+ const testIcon = result.status === "passed"
36
+ ? "\x1b[32mPASSED\x1b[0m"
37
+ : "\x1b[31mFAILED\x1b[0m";
38
+ console.log(`\n ${testIcon}${modeTag} (${String(Math.round(result.duration))}ms)`);
39
+ }
40
+ /** Show plan status for all test cases across all suites. */
41
+ export async function showPlanStatus(suiteFiles, cwd, config) {
42
+ const hashIndex = await loadHashIndex(cwd);
43
+ for (const file of suiteFiles) {
44
+ let suite;
45
+ try {
46
+ suite = await loadSuite(file);
47
+ }
48
+ catch (err) {
49
+ console.error(`Failed to load suite: ${file}`);
50
+ if (err instanceof Error)
51
+ console.error(err.message);
52
+ continue;
53
+ }
54
+ const suiteSlug = slugify(suite.suite);
55
+ const tests = config.testFilter
56
+ ? suite.tests.filter((t) => t.name === config.testFilter)
57
+ : suite.tests;
58
+ console.log(`\nSuite: ${suite.suite}`);
59
+ for (const test of tests) {
60
+ const testSlug = slugify(test.name);
61
+ const testHash = computeTestHash(test);
62
+ const hashKey = `${suiteSlug}/${testSlug}`;
63
+ const cachedHash = hashIndex[hashKey];
64
+ if (!cachedHash) {
65
+ console.log(` ${hashKey}: \x1b[33mno cached plan\x1b[0m`);
66
+ }
67
+ else if (cachedHash !== testHash) {
68
+ console.log(` ${hashKey}: \x1b[33mstale\x1b[0m (definition changed)`);
69
+ }
70
+ else {
71
+ const plan = await loadPlan(cwd, suiteSlug, testSlug);
72
+ if (plan) {
73
+ console.log(` ${hashKey}: \x1b[32mcached\x1b[0m (hash: ${cachedHash.slice(0, 8)}, generated: ${plan.generatedAt.split("T")[0]})`);
74
+ }
75
+ else {
76
+ console.log(` ${hashKey}: \x1b[33mhash exists but plan file missing\x1b[0m`);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ /**
83
+ * Run all test suites according to the resolved configuration.
84
+ * This is the main test execution entry point called by the CLI.
85
+ */
86
+ export async function runCommand(config, resolvedFiles) {
87
+ const cwd = process.cwd();
88
+ // Load and run each suite
89
+ for (const file of resolvedFiles) {
90
+ // Load suite
91
+ let suite;
92
+ try {
93
+ suite = await loadSuite(file);
94
+ }
95
+ catch (err) {
96
+ console.error(`\nFailed to load suite: ${file}`);
97
+ if (err instanceof Error)
98
+ console.error(err.message);
99
+ process.exit(1);
100
+ }
101
+ // Resolve base URL: CLI flag > deployment/config > suite
102
+ const baseUrl = config.baseUrl ?? suite.base_url;
103
+ if (!baseUrl) {
104
+ console.error(`No base_url for suite "${suite.suite}". Set it in the suite YAML, greenlight.yaml, or pass --base-url.`);
105
+ process.exit(1);
106
+ }
107
+ suite.base_url = baseUrl;
108
+ // Apply suite-level model override
109
+ const effectiveModel = suite.model ?? config.model;
110
+ const suiteSlug = slugify(suite.suite);
111
+ const resolved = resolveModelConfig(effectiveModel);
112
+ console.log(`\nSuite: ${suite.suite}`);
113
+ console.log(`URL: ${baseUrl}`);
114
+ console.log(`Provider: ${config.provider}`);
115
+ if (resolved.planner === resolved.pilot) {
116
+ console.log(`Model: ${resolved.planner}`);
117
+ }
118
+ else {
119
+ console.log(`Model: planner=${resolved.planner}, pilot=${resolved.pilot}`);
120
+ }
121
+ // Load hash index for plan caching
122
+ const hashIndex = await loadHashIndex(cwd);
123
+ // LLM client — created lazily, only when a test needs discovery
124
+ let llm;
125
+ function getOrCreateLLM() {
126
+ if (!llm) {
127
+ const llmConfig = resolveLLMConfig({
128
+ ...config,
129
+ model: effectiveModel,
130
+ });
131
+ llm = createLLMClient(llmConfig);
132
+ }
133
+ return llm;
134
+ }
135
+ // Launch browser
136
+ const browserOpts = toBrowserOptions(config);
137
+ let browser;
138
+ try {
139
+ browser = await launchBrowser(browserOpts);
140
+ }
141
+ catch (err) {
142
+ const msg = err instanceof Error ? err.message : String(err);
143
+ console.error(`\nFailed to launch browser: ${msg}`);
144
+ process.exit(1);
145
+ }
146
+ let hashIndexDirty = false;
147
+ try {
148
+ // Filter tests
149
+ const tests = config.testFilter
150
+ ? suite.tests.filter((t) => t.name === config.testFilter)
151
+ : suite.tests;
152
+ for (const test of tests) {
153
+ const testSlug = slugify(test.name);
154
+ const testHash = computeTestHash(test);
155
+ const hashKey = `${suiteSlug}/${testSlug}`;
156
+ const cachedHash = hashIndex[hashKey];
157
+ // Determine execution mode
158
+ let useCachedPlan = false;
159
+ let cachedPlan = null;
160
+ if (!config.discover && cachedHash === testHash) {
161
+ cachedPlan = await loadPlan(cwd, suiteSlug, testSlug);
162
+ if (cachedPlan) {
163
+ useCachedPlan = true;
164
+ }
165
+ }
166
+ const modeLabel = useCachedPlan
167
+ ? "\x1b[36mcached\x1b[0m"
168
+ : "\x1b[33mdiscovery\x1b[0m";
169
+ console.log(`\n Test: ${test.name} [${modeLabel}]`);
170
+ if (!config.discover &&
171
+ cachedHash &&
172
+ cachedHash !== testHash) {
173
+ console.log(` \x1b[33mPlan stale, re-discovering\x1b[0m`);
174
+ }
175
+ // Fresh context per test case
176
+ const context = await createContext(browser, browserOpts);
177
+ const page = await createPage(context);
178
+ const { drain } = attachConsoleCollector(page);
179
+ const { waitForNetworkIdle } = attachNetworkTracker(page);
180
+ globals.trace.attachToPage(page);
181
+ try {
182
+ globals.trace.log("goto", suite.base_url);
183
+ await page.goto(suite.base_url);
184
+ }
185
+ catch (err) {
186
+ const msg = err instanceof Error ? err.message : String(err);
187
+ console.error(`\n \x1b[31m\u2717\x1b[0m Failed to navigate to ${suite.base_url}: ${msg}`);
188
+ globals.trace.detachFromPage(page);
189
+ await context.close();
190
+ continue;
191
+ }
192
+ let result;
193
+ if (useCachedPlan && cachedPlan) {
194
+ // Fast run — replay cached plan
195
+ result = await runCachedPlan(page, cachedPlan, test.name, { waitForNetworkIdle });
196
+ // Handle plan drift
197
+ if (result.drifted && config.onDrift === "rerun") {
198
+ console.log(` \x1b[33mPlan drift detected, re-running with LLM\x1b[0m`);
199
+ // Close and re-create context for fresh state
200
+ globals.trace.detachFromPage(page);
201
+ await context.close();
202
+ const ctx2 = await createContext(browser, browserOpts);
203
+ const page2 = await createPage(ctx2);
204
+ const { drain: drain2 } = attachConsoleCollector(page2);
205
+ const { waitForNetworkIdle: waitForNetworkIdle2 } = attachNetworkTracker(page2);
206
+ globals.trace.attachToPage(page2);
207
+ await page2.goto(suite.base_url);
208
+ const modelLabel = typeof effectiveModel === "string"
209
+ ? effectiveModel
210
+ : `${effectiveModel.planner}/${effectiveModel.pilot}`;
211
+ const recorder = createPlanRecorder(suiteSlug, testSlug, testHash, modelLabel);
212
+ result = await runTestCase(page2, test, getOrCreateLLM(), {
213
+ timeout: config.timeout,
214
+ consoleDrain: drain2,
215
+ recorder,
216
+ waitForNetworkIdle: waitForNetworkIdle2,
217
+ });
218
+ result.mode = "discovery";
219
+ if (result.status === "passed") {
220
+ const plan = recorder.finalize();
221
+ await savePlan(cwd, plan);
222
+ hashIndex[hashKey] = testHash;
223
+ hashIndexDirty = true;
224
+ await ensureGitignore(cwd);
225
+ console.log(` \x1b[32mCached plan updated\x1b[0m`);
226
+ }
227
+ globals.trace.detachFromPage(page2);
228
+ await ctx2.close();
229
+ printStepResults(result);
230
+ printTestSummary(result);
231
+ if (config.headed) {
232
+ await new Promise((r) => setTimeout(r, 2000));
233
+ }
234
+ continue;
235
+ }
236
+ }
237
+ else {
238
+ // Discovery run — full LLM loop with recorder
239
+ const discoveryModelLabel = typeof effectiveModel === "string"
240
+ ? effectiveModel
241
+ : `${effectiveModel.planner}/${effectiveModel.pilot}`;
242
+ const recorder = createPlanRecorder(suiteSlug, testSlug, testHash, discoveryModelLabel);
243
+ result = await runTestCase(page, test, getOrCreateLLM(), {
244
+ timeout: config.timeout,
245
+ consoleDrain: drain,
246
+ recorder,
247
+ waitForNetworkIdle,
248
+ });
249
+ result.mode = "discovery";
250
+ // Save plan only if the test passed
251
+ if (result.status === "passed") {
252
+ const plan = recorder.finalize();
253
+ await savePlan(cwd, plan);
254
+ hashIndex[hashKey] = testHash;
255
+ hashIndexDirty = true;
256
+ await ensureGitignore(cwd);
257
+ console.log(` \x1b[32mCached plan generated for: ${test.name}\x1b[0m`);
258
+ }
259
+ }
260
+ printStepResults(result);
261
+ printTestSummary(result);
262
+ if (config.headed) {
263
+ await new Promise((r) => setTimeout(r, 2000));
264
+ }
265
+ globals.trace.detachFromPage(page);
266
+ await context.close();
267
+ }
268
+ }
269
+ finally {
270
+ if (hashIndexDirty) {
271
+ await saveHashIndex(cwd, hashIndex);
272
+ }
273
+ await closeBrowser(browser);
274
+ }
275
+ }
276
+ }
277
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Load project-level configuration from greenlight.yaml.
3
+ *
4
+ * Supports multiple deployments. Each deployment can override any config field.
5
+ * If only one deployment exists it is used automatically. Otherwise the file
6
+ * must specify `default_deployment` or the user must pass `--deployment`.
7
+ */
8
+ import { z } from "zod";
9
+ /** Fields that can appear at the top level or inside a deployment. */
10
+ declare const ConfigFieldsSchema: z.ZodObject<{
11
+ base_url: z.ZodOptional<z.ZodString>;
12
+ model: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
13
+ planner: z.ZodString;
14
+ pilot: z.ZodString;
15
+ }, z.core.$strip>]>>;
16
+ provider: z.ZodOptional<z.ZodEnum<{
17
+ openrouter: "openrouter";
18
+ openai: "openai";
19
+ gemini: "gemini";
20
+ claude: "claude";
21
+ }>>;
22
+ llm_base_url: z.ZodOptional<z.ZodString>;
23
+ timeout: z.ZodOptional<z.ZodNumber>;
24
+ headed: z.ZodOptional<z.ZodBoolean>;
25
+ parallel: z.ZodOptional<z.ZodNumber>;
26
+ reporter: z.ZodOptional<z.ZodEnum<{
27
+ cli: "cli";
28
+ json: "json";
29
+ html: "html";
30
+ }>>;
31
+ viewport: z.ZodOptional<z.ZodObject<{
32
+ width: z.ZodNumber;
33
+ height: z.ZodNumber;
34
+ }, z.core.$strip>>;
35
+ }, z.core.$strip>;
36
+ /** The resolved config after selecting a deployment. */
37
+ export type ProjectConfig = z.infer<typeof ConfigFieldsSchema> & {
38
+ suites: string[];
39
+ };
40
+ /**
41
+ * Try to load greenlight.yaml from the current working directory.
42
+ * Returns the parsed and deployment-resolved config, or undefined if the file doesn't exist.
43
+ *
44
+ * @param deploymentFlag - The --deployment CLI flag value, if provided.
45
+ */
46
+ export declare function loadProjectConfig(deploymentFlag?: string, cwd?: string): Promise<ProjectConfig | undefined>;
47
+ export {};
48
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,sEAAsE;AACtE,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBtB,CAAA;AAUF,wDAAwD;AACxD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,GAAG;IAChE,MAAM,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAID;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACtC,cAAc,CAAC,EAAE,MAAM,EACvB,GAAG,GAAE,MAAsB,GACzB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAapC"}
package/dist/config.js ADDED
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Load project-level configuration from greenlight.yaml.
3
+ *
4
+ * Supports multiple deployments. Each deployment can override any config field.
5
+ * If only one deployment exists it is used automatically. Otherwise the file
6
+ * must specify `default_deployment` or the user must pass `--deployment`.
7
+ */
8
+ import { readFile } from "node:fs/promises";
9
+ import { resolve } from "node:path";
10
+ import { parse as parseYaml } from "yaml";
11
+ import { z } from "zod";
12
+ /** Fields that can appear at the top level or inside a deployment. */
13
+ const ConfigFieldsSchema = z.object({
14
+ base_url: z.string().optional(),
15
+ model: z
16
+ .union([
17
+ z.string().min(1),
18
+ z.object({ planner: z.string().min(1), pilot: z.string().min(1) }),
19
+ ])
20
+ .optional(),
21
+ provider: z.enum(["openrouter", "openai", "gemini", "claude"]).optional(),
22
+ llm_base_url: z.string().optional(),
23
+ timeout: z.number().int().positive().optional(),
24
+ headed: z.boolean().optional(),
25
+ parallel: z.number().int().positive().optional(),
26
+ reporter: z.enum(["cli", "json", "html"]).optional(),
27
+ viewport: z
28
+ .object({
29
+ width: z.number().int().positive(),
30
+ height: z.number().int().positive(),
31
+ })
32
+ .optional(),
33
+ });
34
+ const ProjectConfigSchema = ConfigFieldsSchema.extend({
35
+ suites: z.array(z.string().min(1)).min(1),
36
+ deployments: z.record(z.string(), ConfigFieldsSchema).optional(),
37
+ default_deployment: z.string().optional(),
38
+ });
39
+ const CONFIG_FILE = "greenlight.yaml";
40
+ /**
41
+ * Try to load greenlight.yaml from the current working directory.
42
+ * Returns the parsed and deployment-resolved config, or undefined if the file doesn't exist.
43
+ *
44
+ * @param deploymentFlag - The --deployment CLI flag value, if provided.
45
+ */
46
+ export async function loadProjectConfig(deploymentFlag, cwd = process.cwd()) {
47
+ const configPath = resolve(cwd, CONFIG_FILE);
48
+ let raw;
49
+ try {
50
+ raw = await readFile(configPath, "utf-8");
51
+ }
52
+ catch {
53
+ return undefined;
54
+ }
55
+ const data = parseYaml(raw);
56
+ const parsed = ProjectConfigSchema.parse(data);
57
+ return resolveDeployment(parsed, deploymentFlag);
58
+ }
59
+ /**
60
+ * Select a deployment and merge its fields over the top-level config.
61
+ */
62
+ function resolveDeployment(parsed, deploymentFlag) {
63
+ const { deployments, default_deployment, suites, ...topLevel } = parsed;
64
+ const deploymentNames = Object.keys(deployments ?? {});
65
+ // No deployments section — use top-level config as-is
66
+ if (deploymentNames.length === 0) {
67
+ return { ...topLevel, suites };
68
+ }
69
+ // Determine which deployment to use
70
+ let name;
71
+ if (deploymentFlag) {
72
+ name = deploymentFlag;
73
+ }
74
+ else if (deploymentNames.length === 1) {
75
+ name = deploymentNames[0];
76
+ }
77
+ else if (default_deployment) {
78
+ name = default_deployment;
79
+ }
80
+ else {
81
+ console.error(`Multiple deployments found (${deploymentNames.join(", ")}) but no default specified.\n` +
82
+ `Set default_deployment in greenlight.yaml or pass --deployment <name>.`);
83
+ process.exit(1);
84
+ }
85
+ const deployment = deployments?.[name];
86
+ if (!deployment) {
87
+ console.error(`Deployment "${name}" not found. Available: ${deploymentNames.join(", ")}`);
88
+ process.exit(1);
89
+ }
90
+ // Merge: deployment fields override top-level fields
91
+ return {
92
+ ...topLevel,
93
+ ...stripUndefined(deployment),
94
+ suites,
95
+ };
96
+ }
97
+ /** Remove keys with undefined values so they don't override top-level values during spread. */
98
+ function stripUndefined(obj) {
99
+ const result = {};
100
+ for (const [key, value] of Object.entries(obj)) {
101
+ if (value !== undefined) {
102
+ result[key] = value;
103
+ }
104
+ }
105
+ return result;
106
+ }
107
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Global runtime state — set once at CLI startup, read anywhere.
3
+ * Eliminates the need to thread debug/trace through every function signature.
4
+ */
5
+ import type { TraceLogger } from "./pilot/trace.js";
6
+ export declare const globals: {
7
+ /** Verbose debug output (--debug). */
8
+ debug: boolean;
9
+ /** Trace logger instance (--trace). Always present; no-op when tracing is disabled. */
10
+ trace: TraceLogger;
11
+ /** Value store for remember/compare across steps within a test case. */
12
+ valueStore: Map<string, string>;
13
+ };
14
+ /**
15
+ * Initialize globals from CLI options. Call once at startup.
16
+ */
17
+ export declare function initGlobals(opts: {
18
+ debug: boolean;
19
+ trace: TraceLogger;
20
+ }): void;
21
+ //# sourceMappingURL=globals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globals.d.ts","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,eAAO,MAAM,OAAO;IACnB,sCAAsC;;IAEtC,uFAAuF;WAKlF,WAAW;IAChB,wEAAwE;;CAExE,CAAA;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IACjC,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,WAAW,CAAA;CAClB,GAAG,IAAI,CAGP"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Global runtime state — set once at CLI startup, read anywhere.
3
+ * Eliminates the need to thread debug/trace through every function signature.
4
+ */
5
+ export const globals = {
6
+ /** Verbose debug output (--debug). */
7
+ debug: false,
8
+ /** Trace logger instance (--trace). Always present; no-op when tracing is disabled. */
9
+ trace: {
10
+ log() { },
11
+ attachToPage() { },
12
+ detachFromPage() { },
13
+ },
14
+ /** Value store for remember/compare across steps within a test case. */
15
+ valueStore: new Map(),
16
+ };
17
+ /**
18
+ * Initialize globals from CLI options. Call once at startup.
19
+ */
20
+ export function initGlobals(opts) {
21
+ globals.debug = opts.debug;
22
+ globals.trace = opts.trace;
23
+ }
24
+ //# sourceMappingURL=globals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globals.js","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,sCAAsC;IACtC,KAAK,EAAE,KAAK;IACZ,uFAAuF;IACvF,KAAK,EAAE;QACN,GAAG,KAAgB,CAAC;QACpB,YAAY,KAAgB,CAAC;QAC7B,cAAc,KAAgB,CAAC;KAChB;IAChB,wEAAwE;IACxE,UAAU,EAAE,IAAI,GAAG,EAAkB;CACrC,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAG3B;IACA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IAC1B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type Suite } from "./schema.js";
2
+ /**
3
+ * Load a suite YAML file: parse, validate, expand reusable steps, interpolate variables.
4
+ * Returns a fully resolved Suite ready for execution.
5
+ */
6
+ export declare function loadSuite(filePath: string): Promise<Suite>;
7
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/parser/loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,KAAK,EAAiB,MAAM,aAAa,CAAA;AAGpE;;;GAGG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAkBhE"}
@@ -0,0 +1,43 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { parse as parseYaml } from "yaml";
3
+ import { SuiteSchema } from "./schema.js";
4
+ import { interpolateSteps } from "./variables.js";
5
+ /**
6
+ * Load a suite YAML file: parse, validate, expand reusable steps, interpolate variables.
7
+ * Returns a fully resolved Suite ready for execution.
8
+ */
9
+ export async function loadSuite(filePath) {
10
+ const raw = await readFile(filePath, "utf-8");
11
+ const parsed = parseYaml(raw);
12
+ // Validate against schema
13
+ const suite = SuiteSchema.parse(parsed);
14
+ const variables = suite.variables ?? {};
15
+ const reusableSteps = suite.reusable_steps ?? {};
16
+ // Expand reusable steps and interpolate variables for each test case
17
+ const resolvedTests = suite.tests.map((test) => {
18
+ const expanded = expandReusableSteps(test.steps, reusableSteps);
19
+ const interpolated = interpolateSteps(expanded, variables);
20
+ return { ...test, steps: interpolated };
21
+ });
22
+ return { ...suite, tests: resolvedTests };
23
+ }
24
+ /**
25
+ * Expand reusable step references.
26
+ * If a step string exactly matches a reusable step name, replace it
27
+ * with that reusable step's list of steps (recursively).
28
+ */
29
+ function expandReusableSteps(steps, reusableSteps) {
30
+ const result = [];
31
+ for (const step of steps) {
32
+ if (step in reusableSteps) {
33
+ // Recurse in case reusable steps reference other reusable steps
34
+ const expanded = expandReusableSteps(reusableSteps[step], reusableSteps);
35
+ result.push(...expanded);
36
+ }
37
+ else {
38
+ result.push(step);
39
+ }
40
+ }
41
+ return result;
42
+ }
43
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/parser/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAA;AACzC,OAAO,EAAE,WAAW,EAA6B,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC/C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAY,SAAS,CAAC,GAAG,CAAC,CAAA;IAEtC,0BAA0B;IAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAEvC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,EAAE,CAAA;IACvC,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,IAAI,EAAE,CAAA;IAEhD,qEAAqE;IACrE,MAAM,aAAa,GAAe,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;QAC/D,MAAM,YAAY,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QAC1D,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAA;AAC1C,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAC3B,KAAe,EACf,aAAuC;IAEvC,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,IAAI,IAAI,aAAa,EAAE,CAAC;YAC3B,gEAAgE;YAChE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAA;YACxE,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;QACzB,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAA;AACd,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ /** Viewport dimensions. */
3
+ export declare const ViewportSchema: z.ZodObject<{
4
+ width: z.ZodNumber;
5
+ height: z.ZodNumber;
6
+ }, z.core.$strip>;
7
+ /** A single test case: a name and ordered list of plain-English steps. */
8
+ export declare const TestCaseSchema: z.ZodObject<{
9
+ name: z.ZodString;
10
+ description: z.ZodOptional<z.ZodString>;
11
+ steps: z.ZodArray<z.ZodString>;
12
+ }, z.core.$strip>;
13
+ /**
14
+ * Top-level suite definition — matches the YAML format from the spec.
15
+ *
16
+ * reusable_steps is a map of name → step list.
17
+ * variables is a map of name → string value.
18
+ */
19
+ export declare const SuiteSchema: z.ZodObject<{
20
+ suite: z.ZodString;
21
+ base_url: z.ZodOptional<z.ZodURL>;
22
+ viewport: z.ZodOptional<z.ZodObject<{
23
+ width: z.ZodNumber;
24
+ height: z.ZodNumber;
25
+ }, z.core.$strip>>;
26
+ model: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
27
+ planner: z.ZodString;
28
+ pilot: z.ZodString;
29
+ }, z.core.$strip>]>>;
30
+ variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
31
+ reusable_steps: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
32
+ tests: z.ZodArray<z.ZodObject<{
33
+ name: z.ZodString;
34
+ description: z.ZodOptional<z.ZodString>;
35
+ steps: z.ZodArray<z.ZodString>;
36
+ }, z.core.$strip>>;
37
+ }, z.core.$strip>;
38
+ /** Inferred TypeScript types from the schemas. */
39
+ export type Suite = z.infer<typeof SuiteSchema>;
40
+ export type TestCase = z.infer<typeof TestCaseSchema>;
41
+ export type Viewport = z.infer<typeof ViewportSchema>;
42
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/parser/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,2BAA2B;AAC3B,eAAO,MAAM,cAAc;;;iBAGzB,CAAA;AAEF,0EAA0E;AAC1E,eAAO,MAAM,cAAc;;;;iBAIzB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;iBAatB,CAAA;AAEF,kDAAkD;AAClD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAC/C,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AACrD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA"}