@glubean/runner 0.2.2 → 0.2.4

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.
@@ -0,0 +1,202 @@
1
+ /**
2
+ * @module project-runner
3
+ *
4
+ * `ProjectRunner` — single top-level API for "run the tests of a project".
5
+ *
6
+ * Wraps the orchestration primitives (`loadProjectEnv`, `bootstrap`,
7
+ * `RunOrchestrator`, `TestExecutor`) into one coherent pipeline with a
8
+ * well-typed event stream. Consumers (CLI, MCP, VSCode extension,
9
+ * third-party embedders) all go through this facade rather than re-
10
+ * assembling the primitives themselves.
11
+ *
12
+ * **Scope boundary:**
13
+ * - Facade does: env load → bootstrap → per-file-batched TestExecutor
14
+ * loop with session setup/teardown, metric recording
15
+ * - Facade does NOT: console presentation, trace-file writing, upload,
16
+ * result.json formatting, CI-specific flag guards, summary judgment.
17
+ * Consumers build their own summary by observing events.
18
+ *
19
+ * Batching is fixed at per-file batched (one tsx subprocess per file,
20
+ * all of that file's testIds batched into `TestExecutor.run(fileUrl, "",
21
+ * ctx, {testIds})`).
22
+ */
23
+ import { resolve } from "node:path";
24
+ import { pathToFileURL } from "node:url";
25
+ import { bootstrap } from "./bootstrap.js";
26
+ import { TestExecutor } from "./executor.js";
27
+ import { discoverSessionFile, RunOrchestrator, } from "./orchestrator.js";
28
+ import { MetricCollector } from "./thresholds.js";
29
+ import { toSingleExecutionOptions } from "./config.js";
30
+ // =============================================================================
31
+ // ProjectRunner
32
+ // =============================================================================
33
+ export class ProjectRunner {
34
+ options;
35
+ constructor(options) {
36
+ this.options = options;
37
+ }
38
+ /**
39
+ * Run the full pipeline as an async event stream.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * const runner = new ProjectRunner({...});
44
+ * for await (const event of runner.run()) {
45
+ * switch (event.type) { ... }
46
+ * }
47
+ * ```
48
+ */
49
+ async *run() {
50
+ const { rootDir, sharedConfig, vars: envVars, secrets, tests, noSession = false, interactive = false, signal, } = this.options;
51
+ const sessionStartDir = this.options.sessionStartDir ?? rootDir;
52
+ const metricCollector = this.options.metricCollector ?? new MetricCollector();
53
+ // ── 1. Bootstrap ─────────────────────────────────────────────────
54
+ yield { type: "bootstrap:start", projectRoot: rootDir };
55
+ try {
56
+ await bootstrap(rootDir);
57
+ }
58
+ catch (err) {
59
+ const error = err instanceof Error ? err : new Error(String(err));
60
+ yield { type: "bootstrap:failed", error };
61
+ yield { type: "run:failed", reason: "bootstrap-failed", error: error.message };
62
+ return;
63
+ }
64
+ yield { type: "bootstrap:done" };
65
+ // ── 3. Group tests by file (per-file batching) ───────────────────
66
+ const fileGroups = new Map();
67
+ for (const t of tests) {
68
+ const group = fileGroups.get(t.filePath) || [];
69
+ group.push(t);
70
+ fileGroups.set(t.filePath, group);
71
+ }
72
+ yield { type: "discovery:done", totalFiles: fileGroups.size, totalTests: tests.length };
73
+ // ── 4. Build executor (shared across all files) ──────────────────
74
+ const executor = this.options.executor ?? TestExecutor.fromSharedConfig(sharedConfig, {
75
+ cwd: rootDir,
76
+ ...(this.options.inspectBrk !== undefined && { inspectBrk: this.options.inspectBrk }),
77
+ });
78
+ const orchestrator = new RunOrchestrator(executor);
79
+ const sessionState = {};
80
+ let sessionSetupSucceeded = false;
81
+ // Wrap all post-executor-construction work in try/finally so the
82
+ // executor's own cleanup path (zero-project scratch teardown, any
83
+ // future finalizers) always runs — even on early return from
84
+ // session-setup failure or signal abort. This also covers the case
85
+ // where the generator is abandoned by its caller (iterator .return()
86
+ // triggers the finally block).
87
+ try {
88
+ // ── 5. Session setup ───────────────────────────────────────────
89
+ const sessionFile = noSession ? undefined : discoverSessionFile(sessionStartDir, rootDir);
90
+ yield { type: "session:discovered", sessionFile };
91
+ if (sessionFile) {
92
+ yield { type: "session:setup:start", sessionFile };
93
+ let setupFailed = false;
94
+ let failureInfo;
95
+ for await (const event of orchestrator.runSessionSetup(sessionFile, { vars: envVars, secrets, interactive }, toSingleExecutionOptions(sharedConfig))) {
96
+ if (event.type === "session:set") {
97
+ sessionState[event.key] = event.value;
98
+ }
99
+ else if (event.type === "status" && event.status === "failed") {
100
+ setupFailed = true;
101
+ failureInfo = { error: event.error, stack: event.stack };
102
+ }
103
+ yield { type: "session:setup:event", event };
104
+ }
105
+ if (setupFailed) {
106
+ yield { type: "session:setup:failed", ...(failureInfo ?? {}) };
107
+ // Best-effort teardown before bailing.
108
+ yield { type: "session:teardown:start", sessionFile };
109
+ for await (const event of orchestrator.runSessionTeardown(sessionFile, { vars: envVars, secrets }, sessionState, toSingleExecutionOptions(sharedConfig))) {
110
+ yield { type: "session:teardown:event", event };
111
+ }
112
+ yield { type: "session:teardown:done" };
113
+ yield {
114
+ type: "run:failed",
115
+ reason: "session-setup-failed",
116
+ ...(failureInfo?.error !== undefined && { error: failureInfo.error }),
117
+ };
118
+ return;
119
+ }
120
+ sessionSetupSucceeded = true;
121
+ yield { type: "session:setup:done", stateKeys: Object.keys(sessionState) };
122
+ }
123
+ // ── 6. File loop (per-file batched) ────────────────────────────
124
+ let passedCount = 0;
125
+ let failedCount = 0;
126
+ let skippedCount = 0;
127
+ const failureLimit = sharedConfig.failAfter ??
128
+ (sharedConfig.failFast ? 1 : undefined);
129
+ for (const [filePath, fileTests] of fileGroups) {
130
+ if (signal?.aborted)
131
+ break;
132
+ if (failureLimit !== undefined && failedCount >= failureLimit)
133
+ break;
134
+ const testFileUrl = pathToFileURL(resolve(filePath)).href;
135
+ const testIds = fileTests.map((t) => t.meta.id);
136
+ const exportNames = {};
137
+ for (const t of fileTests)
138
+ exportNames[t.meta.id] = t.exportName;
139
+ yield { type: "file:start", filePath, testCount: fileTests.length };
140
+ const fileStart = Date.now();
141
+ for await (const event of executor.run(testFileUrl, "", {
142
+ vars: envVars,
143
+ secrets,
144
+ ...(Object.keys(sessionState).length > 0 && { session: sessionState }),
145
+ }, {
146
+ ...toSingleExecutionOptions(sharedConfig),
147
+ testIds,
148
+ exportNames,
149
+ ...(fileTests.some((t) => t.meta.parallel) && sharedConfig.concurrency > 1
150
+ ? { concurrency: sharedConfig.concurrency }
151
+ : {}),
152
+ })) {
153
+ if (event.type === "session:set") {
154
+ sessionState[event.key] = event.value;
155
+ }
156
+ if (event.type === "metric") {
157
+ metricCollector.add(event.name, event.value);
158
+ }
159
+ if (event.type === "status") {
160
+ if (event.status === "completed")
161
+ passedCount += 1;
162
+ else if (event.status === "skipped")
163
+ skippedCount += 1;
164
+ else
165
+ failedCount += 1;
166
+ }
167
+ yield { type: "file:event", filePath, event };
168
+ }
169
+ yield { type: "file:complete", filePath, duration: Date.now() - fileStart };
170
+ }
171
+ // ── 7. Session teardown ────────────────────────────────────────
172
+ if (sessionFile && sessionSetupSucceeded) {
173
+ yield { type: "session:teardown:start", sessionFile };
174
+ for await (const event of orchestrator.runSessionTeardown(sessionFile, { vars: envVars, secrets }, sessionState, toSingleExecutionOptions(sharedConfig))) {
175
+ yield { type: "session:teardown:event", event };
176
+ }
177
+ yield { type: "session:teardown:done" };
178
+ }
179
+ // ── 8. Done ────────────────────────────────────────────────────
180
+ yield { type: "run:complete", passedCount, failedCount, skippedCount };
181
+ }
182
+ finally {
183
+ // Drain executor.finalize() — zero-project scratch cleanup and any
184
+ // future executor-level finalizers. Safe to call even after session
185
+ // teardown already ran (executor.finalize() guards on _sessionSetupDone,
186
+ // which stays false when sessions are driven by RunOrchestrator rather
187
+ // than executor auto-session). Discard yielded events; this is pure
188
+ // cleanup, not part of the user-visible run.
189
+ try {
190
+ for await (const _ of executor.finalize()) {
191
+ // intentionally drain
192
+ }
193
+ }
194
+ catch {
195
+ // Finalize errors are non-fatal — surface silently to avoid masking
196
+ // the primary run outcome. Could be upgraded to a warning event
197
+ // later if needed.
198
+ }
199
+ }
200
+ }
201
+ }
202
+ //# sourceMappingURL=project-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-runner.js","sourceRoot":"","sources":["../src/project-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EACL,mBAAmB,EACnB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AA8GvD,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,MAAM,OAAO,aAAa;IACP,OAAO,CAAuB;IAE/C,YAAY,OAA6B;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,CAAC,GAAG;QACR,MAAM,EACJ,OAAO,EACP,YAAY,EACZ,IAAI,EAAE,OAAO,EACb,OAAO,EACP,KAAK,EACL,SAAS,GAAG,KAAK,EACjB,WAAW,GAAG,KAAK,EACnB,MAAM,GACP,GAAG,IAAI,CAAC,OAAO,CAAC;QAEjB,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC;QAChE,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,eAAe,EAAE,CAAC;QAE9E,oEAAoE;QACpE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;YAC1C,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YAC/E,OAAO;QACT,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;QAEjC,oEAAoE;QACpE,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAExF,oEAAoE;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,YAAY,CAAC,gBAAgB,CACrE,YAAY,EACZ;YACE,GAAG,EAAE,OAAO;YACZ,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;SACtF,CACF,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,YAAY,GAA4B,EAAE,CAAC;QACjD,IAAI,qBAAqB,GAAG,KAAK,CAAC;QAElC,iEAAiE;QACjE,kEAAkE;QAClE,6DAA6D;QAC7D,mEAAmE;QACnE,qEAAqE;QACrE,+BAA+B;QAC/B,IAAI,CAAC;YACH,kEAAkE;YAClE,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC1F,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,CAAC;YAElD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC;gBACnD,IAAI,WAAW,GAAG,KAAK,CAAC;gBACxB,IAAI,WAA2D,CAAC;gBAEhE,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,eAAe,CACpD,WAAW,EACX,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EACvC,wBAAwB,CAAC,YAAY,CAAC,CACvC,EAAE,CAAC;oBACF,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACjC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;oBACxC,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAChE,WAAW,GAAG,IAAI,CAAC;wBACnB,WAAW,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC3D,CAAC;oBACD,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC;gBAC/C,CAAC;gBAED,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC;oBAE/D,uCAAuC;oBACvC,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,CAAC;oBACtD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,kBAAkB,CACvD,WAAW,EACX,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAC1B,YAAY,EACZ,wBAAwB,CAAC,YAAY,CAAC,CACvC,EAAE,CAAC;wBACF,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC;oBAClD,CAAC;oBACD,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;oBAExC,MAAM;wBACJ,IAAI,EAAE,YAAY;wBAClB,MAAM,EAAE,sBAAsB;wBAC9B,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;qBACtE,CAAC;oBACF,OAAO;gBACT,CAAC;gBAED,qBAAqB,GAAG,IAAI,CAAC;gBAC7B,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7E,CAAC;YAED,kEAAkE;YAClE,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS;gBACzC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAE1C,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC/C,IAAI,MAAM,EAAE,OAAO;oBAAE,MAAM;gBAC3B,IAAI,YAAY,KAAK,SAAS,IAAI,WAAW,IAAI,YAAY;oBAAE,MAAM;gBAErE,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC1D,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChD,MAAM,WAAW,GAA2B,EAAE,CAAC;gBAC/C,KAAK,MAAM,CAAC,IAAI,SAAS;oBAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;gBAEjE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;gBACpE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,GAAG,CACpC,WAAW,EACX,EAAE,EACF;oBACE,IAAI,EAAE,OAAO;oBACb,OAAO;oBACP,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;iBACvE,EACD;oBACE,GAAG,wBAAwB,CAAC,YAAY,CAAC;oBACzC,OAAO;oBACP,WAAW;oBACX,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC;wBACxE,CAAC,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE;wBAC3C,CAAC,CAAC,EAAE,CAAC;iBACR,CACF,EAAE,CAAC;oBACF,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACjC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;oBACxC,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC5B,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC/C,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;4BAAE,WAAW,IAAI,CAAC,CAAC;6BAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;4BAAE,YAAY,IAAI,CAAC,CAAC;;4BAClD,WAAW,IAAI,CAAC,CAAC;oBACxB,CAAC;oBACD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;gBAChD,CAAC;gBAED,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;YAC9E,CAAC;YAED,kEAAkE;YAClE,IAAI,WAAW,IAAI,qBAAqB,EAAE,CAAC;gBACzC,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,CAAC;gBACtD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,kBAAkB,CACvD,WAAW,EACX,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAC1B,YAAY,EACZ,wBAAwB,CAAC,YAAY,CAAC,CACvC,EAAE,CAAC;oBACF,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC;gBAClD,CAAC;gBACD,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;YAC1C,CAAC;YAED,kEAAkE;YAClE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;QACzE,CAAC;gBAAS,CAAC;YACT,mEAAmE;YACnE,oEAAoE;YACpE,yEAAyE;YACzE,uEAAuE;YACvE,oEAAoE;YACpE,6CAA6C;YAC7C,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;oBAC1C,sBAAsB;gBACxB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oEAAoE;gBACpE,gEAAgE;gBAChE,mBAAmB;YACrB,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glubean/runner",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -16,10 +16,11 @@
16
16
  "access": "public"
17
17
  },
18
18
  "dependencies": {
19
+ "dotenv": "^16.4.0",
19
20
  "ky": "^1.14.0",
20
21
  "p-queue": "^9.1.0",
21
22
  "tsx": "^4.19.0",
22
- "@glubean/sdk": "0.2.0"
23
+ "@glubean/sdk": "0.2.2"
23
24
  },
24
25
  "devDependencies": {
25
26
  "@types/node": "^22.0.0",