From 6614b0634d053a2a5cc703bc9f9239e689fd92a2 Mon Sep 17 00:00:00 2001 From: Alexander Dines Date: Tue, 25 Nov 2025 14:03:18 -0800 Subject: [PATCH 1/2] cp dines --- README.md | 12 ++--- src/index.ts | 2 +- src/sdk.ts | 10 ++-- src/sdk/devbox.ts | 35 ++++++++------ src/sdk/execution-result.ts | 2 +- src/sdk/execution.ts | 7 ++- tests/objects/devbox.test.ts | 6 +-- .../smoketests/object-oriented/devbox.test.ts | 38 +++++---------- .../object-oriented/execution.test.ts | 47 +++++-------------- .../object-oriented/storage-object.test.ts | 2 +- 10 files changed, 64 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index 98e94a33a..5f8f9364f 100644 --- a/README.md +++ b/README.md @@ -29,14 +29,12 @@ const sdk = new RunloopSDK({ const devbox = await sdk.devbox.create(); // Execute a synchronous command -const result = await devbox.cmd.exec({ command: 'echo "Hello, World!"' }); +const result = await devbox.cmd.exec('echo "Hello, World!"'); console.log('Output:', await result.stdout()); // "Hello, World!" console.log('Exit code:', result.exitCode); // 0 // Start a long-running HTTP server asynchronously -const serverExec = await devbox.cmd.execAsync({ - command: 'npx http-server -p 8080', -}); +const serverExec = await devbox.cmd.execAsync('npx http-server -p 8080'); console.log(`Started server with execution ID: ${serverExec.executionId}`); // Check server status @@ -104,7 +102,7 @@ const runloop = new Runloop() const devboxResult = await runloop.devboxes.createAndAwaitRunning() -await runloop.devboxes.executeAndAwaitCompletion(devboxResult.id, {"command": "touch example.txt"}) +await runloop.devboxes.executeAndAwaitCompletion(devboxResult.id, { command: "touch example.txt" }) const snapshotResult = await runloop.devbox.snapshotDisk() await runloop.devboxes.snapshotDisk(devboxResult.id) @@ -118,7 +116,7 @@ import { RunloopSDK } from '@runloop/api-client'; const runloop = new RunloopSDK(); const devbox = await runloop.devbox.create(); -await devbox.cmd.exec({ command: "touch example.txt" }); +await devbox.cmd.exec("touch example.txt"); const snapshot = await devbox.snapshotDisk(); await snapshot.createDevbox(); ... @@ -144,7 +142,7 @@ The SDK provides comprehensive error handling with typed exceptions: ```typescript try { const devbox = await runloop.devbox.create(); - const result = await devbox.cmd.exec({ command: 'invalid-command' }); + const result = await devbox.cmd.exec('invalid-command'); } catch (error) { if (error instanceof RunloopSDK.APIError) { console.log('API Error:', error.status, error.message); diff --git a/src/index.ts b/src/index.ts index 5c1aed960..59536fcb2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -246,7 +246,7 @@ export interface ClientOptions { * import { RunloopSDK } from '@runloop/api-client'; * const runloop = new RunloopSDK(); * const devbox = await runloop.devbox.create(); - * const result = await devbox.cmd.exec({ command: 'echo "Hello, World!"' }); + * const result = await devbox.cmd.exec('echo "Hello, World!"'); * console.log(result.exitCode); * ``` */ diff --git a/src/sdk.ts b/src/sdk.ts index e7c8943f8..ba9b52007 100644 --- a/src/sdk.ts +++ b/src/sdk.ts @@ -39,7 +39,7 @@ type ContentType = ObjectCreateParams['content_type']; * ```typescript * const runloop = new RunloopSDK(); // export RUNLOOP_API_KEY will automatically be used. * const devbox = await runloop.devbox.create({ name: 'my-devbox' }); - * const result = await devbox.cmd.exec({ command: 'echo "Hello, World!"' }); + * const result = await devbox.cmd.exec('echo "Hello, World!"'); * console.log(result.exitCode); * ``` * @@ -141,7 +141,7 @@ export class RunloopSDK { * ```typescript * const runloop = new RunloopSDK(); * const devbox = await runloop.devbox.create({ name: 'my-devbox' }); - * const result = await devbox.cmd.exec({ command: 'echo "Hello, World!"' }); + * const result = await devbox.cmd.exec('echo "Hello, World!"'); * ``` */ export class DevboxOps { @@ -162,9 +162,9 @@ export class DevboxOps { * const runloop = new RunloopSDK(); * const devbox = await runloop.devbox.create({ name: 'my-devbox' }); * - * devbox.cmd.exec({ command: 'echo "Hello, World!"' }); - * ... - * ``` + * devbox.cmd.exec('echo "Hello, World!"'); + * ... + * ``` * * @param {DevboxCreateParams} [params] - Parameters for creating the devbox. * @param {Core.RequestOptions & { polling?: Partial> }} [options] - Request options including polling configuration. diff --git a/src/sdk/devbox.ts b/src/sdk/devbox.ts index acfc7c7ae..e8338ddb9 100644 --- a/src/sdk/devbox.ts +++ b/src/sdk/devbox.ts @@ -155,30 +155,32 @@ export class DevboxCmdOps { * @example * ```typescript * // Simple execution - * const result = await devbox.cmd.exec({ command: 'ls -la' }); + * const result = await devbox.cmd.exec('ls -la'); * console.log(await result.stdout()); * * // With streaming callbacks - * const result = await devbox.cmd.exec({ - * command: 'npm install', + * const result = await devbox.cmd.exec('npm install', { * stdout: (line) => process.stdout.write(line), * stderr: (line) => process.stderr.write(line), * }); * ``` * - * @param {DevboxExecuteParams & ExecuteStreamingCallbacks} params - Parameters containing the command, optional shell name, and optional callbacks + * @param {string} command - The command to execute + * @param {Omit & ExecuteStreamingCallbacks} [params] - Optional parameters including shell name and callbacks * @param {Core.RequestOptions & { polling?: Partial> }} [options] - Request options with optional polling configuration * @returns {Promise} {@link ExecutionResult} with stdout, stderr, and exit status */ async exec( - params: DevboxExecuteParams & ExecuteStreamingCallbacks, + command: string, + params?: Omit & ExecuteStreamingCallbacks, options?: Core.RequestOptions & { polling?: Partial> }, ): Promise { - const hasCallbacks = params.stdout || params.stderr || params.output; + const fullParams = { ...params, command }; + const hasCallbacks = fullParams.stdout || fullParams.stderr || fullParams.output; if (hasCallbacks) { // With callbacks: use async execution workflow to enable streaming - const { stdout, stderr, output, ...executeParams } = params; + const { stdout, stderr, output, ...executeParams } = fullParams; const execution = await this.client.devboxes.executeAsync(this.devboxId, executeParams, options); // Start streaming and await both completion and streaming @@ -204,7 +206,7 @@ export class DevboxCmdOps { return new ExecutionResult(this.client, this.devboxId, execution.execution_id, result); } else { // Without callbacks: use existing optimized workflow - const result = await this.client.devboxes.executeAndAwaitCompletion(this.devboxId, params, options); + const result = await this.client.devboxes.executeAndAwaitCompletion(this.devboxId, fullParams, options); return new ExecutionResult(this.client, this.devboxId, result.execution_id, result); } } @@ -218,8 +220,7 @@ export class DevboxCmdOps { * * @example * ```typescript - * const execution = await devbox.cmd.execAsync({ - * command: 'long-running-task.sh', + * const execution = await devbox.cmd.execAsync('long-running-task.sh', { * stdout: (line) => console.log(`[LOG] ${line}`), * }); * @@ -231,15 +232,18 @@ export class DevboxCmdOps { * } * ``` * - * @param {DevboxExecuteAsyncParams & ExecuteStreamingCallbacks} params - Parameters containing the command, optional shell name, and optional callbacks + * @param {string} command - The command to execute + * @param {Omit & ExecuteStreamingCallbacks} [params] - Optional parameters including shell name and callbacks * @param {Core.RequestOptions} [options] - Request options * @returns {Promise} {@link Execution} object for tracking and controlling the command */ async execAsync( - params: DevboxExecuteAsyncParams & ExecuteStreamingCallbacks, + command: string, + params?: Omit & ExecuteStreamingCallbacks, options?: Core.RequestOptions, ): Promise { - const { stdout, stderr, output, ...executeParams } = params; + const fullParams = { ...params, command }; + const { stdout, stderr, output, ...executeParams } = fullParams; const execution = await this.client.devboxes.executeAsync(this.devboxId, executeParams, options); // Start streaming in background if callbacks provided @@ -359,7 +363,7 @@ export class DevboxFileOps { * * const runloop = new RunloopSDK(); * const devbox = await runloop.devbox.create({ name: 'my-devbox' }); - * devbox.cmd.exec({ command: 'echo "Hello, World!"' }); + * devbox.cmd.exec('echo "Hello, World!"'); * ... * ``` * @@ -403,7 +407,7 @@ export class Devbox { * const runloop = new RunloopSDK(); * const devbox = await runloop.devbox.create({ name: 'my-devbox' }); * - * devbox.cmd.exec({ command: 'echo "Hello, World!"' }); + * devbox.cmd.exec('echo "Hello, World!"'); * ... * ``` * @@ -715,6 +719,7 @@ export class Devbox { * @example * ```typescript * await devbox.suspend(); + * // Optionally, wait for the devbox to reach the suspended state * await devbox.awaitSuspended(); * ``` * diff --git a/src/sdk/execution-result.ts b/src/sdk/execution-result.ts index a27fded67..de1ed9ae2 100644 --- a/src/sdk/execution-result.ts +++ b/src/sdk/execution-result.ts @@ -19,7 +19,7 @@ import type { DevboxAsyncExecutionDetailView } from '../resources/devboxes/devbo * const devbox = runloop.devbox.fromId('devbox-123'); * * // Get result from synchronous execution - * const result = await devbox.cmd.exec({ command: 'ls -la' }); + * const result = await devbox.cmd.exec('ls -la'); * * // Check success * if (result.success) { diff --git a/src/sdk/execution.ts b/src/sdk/execution.ts index 2db4bfb99..12b4e46f1 100644 --- a/src/sdk/execution.ts +++ b/src/sdk/execution.ts @@ -23,8 +23,7 @@ import { ExecutionResult } from './execution-result'; * const devbox = runloop.devbox.fromId('devbox-123'); * * // Start async execution with streaming - * const execution = await devbox.cmd.execAsync({ - * command: 'npx http-server -p 8080', + * const execution = await devbox.cmd.execAsync('npx http-server -p 8080', { * stdout: (line) => console.log(`[LOG] ${line}`), * stderr: (line) => console.error(`[ERROR] ${line}`), * }); @@ -86,7 +85,7 @@ export class Execution { * ```typescript * const runloop = new RunloopSDK(); * const devbox = runloop.devbox.fromId('devbox-123'); - * const execution = await devbox.cmd.execAsync({ command: 'npm install' }); + * const execution = await devbox.cmd.execAsync('npm install'); * * // Other work while command runs... * @@ -133,7 +132,7 @@ export class Execution { * * @example * ```typescript - * const execution = await devbox.cmd.execAsync({ command: 'npx http-server -p 8080' }); + * const execution = await devbox.cmd.execAsync('npx http-server -p 8080'); * const state = await execution.getState(); * console.log(`Status: ${state.status}`); * ``` diff --git a/tests/objects/devbox.test.ts b/tests/objects/devbox.test.ts index e714bf1c6..b4d737997 100644 --- a/tests/objects/devbox.test.ts +++ b/tests/objects/devbox.test.ts @@ -120,7 +120,7 @@ describe('Devbox (New API)', () => { mockClient.devboxes.executeAndAwaitCompletion.mockResolvedValue(mockExecution); - const result = await devbox.cmd.exec({ command: 'echo "Hello World"' }); + const result = await devbox.cmd.exec('echo "Hello World"'); expect(mockClient.devboxes.executeAndAwaitCompletion).toHaveBeenCalledWith( 'devbox-123', @@ -142,7 +142,7 @@ describe('Devbox (New API)', () => { mockClient.devboxes.executeAsync.mockResolvedValue(mockExecution); - const result = await devbox.cmd.execAsync({ command: 'sleep 10' }); + const result = await devbox.cmd.execAsync('sleep 10'); expect(mockClient.devboxes.executeAsync).toHaveBeenCalledWith( 'devbox-123', @@ -288,7 +288,7 @@ describe('Devbox (New API)', () => { const error = new Error('Command failed'); mockClient.devboxes.executeAndAwaitCompletion.mockRejectedValue(error); - await expect(devbox.cmd.exec({ command: 'failing-command' })).rejects.toThrow('Command failed'); + await expect(devbox.cmd.exec('failing-command')).rejects.toThrow('Command failed'); }); }); }); diff --git a/tests/smoketests/object-oriented/devbox.test.ts b/tests/smoketests/object-oriented/devbox.test.ts index 9ff2b7e14..d5528e59c 100644 --- a/tests/smoketests/object-oriented/devbox.test.ts +++ b/tests/smoketests/object-oriented/devbox.test.ts @@ -38,7 +38,7 @@ describe('smoketest: object-oriented devbox', () => { test('execute synchronous command', async () => { expect(devbox).toBeDefined(); - const result = await devbox.cmd.exec({ command: 'echo "Hello from SDK!"' }); + const result = await devbox.cmd.exec('echo "Hello from SDK!"'); expect(result).toBeDefined(); expect(result.exitCode).toBe(0); const output = await result.stdout(); @@ -47,7 +47,7 @@ describe('smoketest: object-oriented devbox', () => { test('execute asynchronous command', async () => { expect(devbox).toBeDefined(); - const execution = await devbox.cmd.execAsync({ command: 'sleep 2 && echo "Async command completed"' }); + const execution = await devbox.cmd.execAsync('sleep 2 && echo "Async command completed"'); expect(execution).toBeDefined(); expect(execution.executionId).toBeTruthy(); @@ -298,8 +298,7 @@ describe('smoketest: object-oriented devbox', () => { test('exec with stdout callback', async () => { const stdoutLines: string[] = []; - const result = await devbox.cmd.exec({ - command: 'echo "line1" && echo "line2" && echo "line3"', + const result = await devbox.cmd.exec('echo "line1" && echo "line2" && echo "line3"', { stdout: (line) => { stdoutLines.push(line); }, @@ -319,8 +318,7 @@ describe('smoketest: object-oriented devbox', () => { test('exec with stderr callback', async () => { const stderrLines: string[] = []; - const result = await devbox.cmd.exec({ - command: 'echo "error1" >&2 && echo "error2" >&2', + const result = await devbox.cmd.exec('echo "error1" >&2 && echo "error2" >&2', { stderr: (line) => { stderrLines.push(line); }, @@ -339,8 +337,7 @@ describe('smoketest: object-oriented devbox', () => { test('exec with output callback (both stdout and stderr)', async () => { const allLines: string[] = []; - const result = await devbox.cmd.exec({ - command: 'echo "stdout1" && echo "stderr1" >&2 && echo "stdout2"', + const result = await devbox.cmd.exec('echo "stdout1" && echo "stderr1" >&2 && echo "stdout2"', { output: (line) => { allLines.push(line); }, @@ -360,8 +357,7 @@ describe('smoketest: object-oriented devbox', () => { const stderrLines: string[] = []; const outputLines: string[] = []; - const result = await devbox.cmd.exec({ - command: 'echo "out1" && echo "err1" >&2 && echo "out2"', + const result = await devbox.cmd.exec('echo "out1" && echo "err1" >&2 && echo "out2"', { stdout: (line) => stdoutLines.push(line), stderr: (line) => stderrLines.push(line), output: (line) => outputLines.push(line), @@ -387,9 +383,7 @@ describe('smoketest: object-oriented devbox', () => { }); test('exec WITHOUT callbacks (preserve existing behavior)', async () => { - const result = await devbox.cmd.exec({ - command: 'echo "test output"', - }); + const result = await devbox.cmd.exec('echo "test output"'); expect(result.success).toBe(true); expect(result.exitCode).toBe(0); @@ -402,8 +396,7 @@ describe('smoketest: object-oriented devbox', () => { let receivedBeforeCompletion = false; // Start async execution with streaming - const execution = await devbox.cmd.execAsync({ - command: 'echo "immediate" && sleep 2 && echo "delayed"', + const execution = await devbox.cmd.execAsync('echo "immediate" && sleep 2 && echo "delayed"', { stdout: (line) => { stdoutLines.push(line); if (line.includes('immediate')) { @@ -434,8 +427,7 @@ describe('smoketest: object-oriented devbox', () => { test('execAsync with stderr callback', async () => { const stderrLines: string[] = []; - const execution = await devbox.cmd.execAsync({ - command: 'echo "error output" >&2', + const execution = await devbox.cmd.execAsync('echo "error output" >&2', { stderr: (line) => { stderrLines.push(line); }, @@ -455,8 +447,7 @@ describe('smoketest: object-oriented devbox', () => { const stdoutLines: string[] = []; const stderrLines: string[] = []; - const result = await devbox.cmd.exec({ - command: 'echo "to stdout" && echo "to stderr" >&2 && echo "more stdout"', + const result = await devbox.cmd.exec('echo "to stdout" && echo "to stderr" >&2 && echo "more stdout"', { stdout: (line) => stdoutLines.push(line), stderr: (line) => stderrLines.push(line), }); @@ -480,8 +471,7 @@ describe('smoketest: object-oriented devbox', () => { test('exec with long output - verify all lines received', async () => { const stdoutLines: string[] = []; - const result = await devbox.cmd.exec({ - command: 'for i in {1..1000}; do echo "line $i"; done', + const result = await devbox.cmd.exec('for i in {1..1000}; do echo "line $i"; done', { stdout: (line) => stdoutLines.push(line), }); @@ -511,16 +501,14 @@ describe('smoketest: object-oriented devbox', () => { let taskBCount = 0; // Start both executions at the same time (don't await) - const executionA = devbox.cmd.execAsync({ - command: 'echo "A1" && sleep 0.5 && echo "A2" && sleep 0.5 && echo "A3"', + const executionA = devbox.cmd.execAsync('echo "A1" && sleep 0.5 && echo "A2" && sleep 0.5 && echo "A3"', { stdout: (line) => { taskALogs.push(line); taskACount++; }, }); - const executionB = devbox.cmd.execAsync({ - command: 'sleep 0.3 && echo "B1" && sleep 0.5 && echo "B2" && sleep 0.5 && echo "B3"', + const executionB = devbox.cmd.execAsync('sleep 0.3 && echo "B1" && sleep 0.5 && echo "B2" && sleep 0.5 && echo "B3"', { stdout: (line) => { taskBLogs.push(line); taskBCount++; diff --git a/tests/smoketests/object-oriented/execution.test.ts b/tests/smoketests/object-oriented/execution.test.ts index 2dfa9d05a..0261bf6b1 100644 --- a/tests/smoketests/object-oriented/execution.test.ts +++ b/tests/smoketests/object-oriented/execution.test.ts @@ -28,9 +28,7 @@ describe('smoketest: object-oriented execution', () => { test('start asynchronous execution', async () => { expect(devbox).toBeDefined(); - execution = await devbox.cmd.execAsync({ - command: 'sleep 5 && echo "Execution completed successfully"', - }); + execution = await devbox.cmd.execAsync('sleep 5 && echo "Execution completed successfully"'); expect(execution).toBeDefined(); expect(execution.executionId).toBeTruthy(); expect(execution.devboxId).toBeTruthy(); @@ -92,8 +90,7 @@ describe('smoketest: object-oriented execution', () => { test.skip('start execution with stdin enabled', async () => { expect(devbox).toBeDefined(); - execution = await devbox.cmd.execAsync({ - command: 'cat', + execution = await devbox.cmd.execAsync('cat', { attach_stdin: true, }); expect(execution).toBeDefined(); @@ -145,9 +142,7 @@ describe('smoketest: object-oriented execution', () => { test('handle execution with non-zero exit code', async () => { expect(devbox).toBeDefined(); - execution = await devbox.cmd.execAsync({ - command: 'exit 42', - }); + execution = await devbox.cmd.execAsync('exit 42'); expect(execution).toBeDefined(); const result = await execution.result(); @@ -160,9 +155,7 @@ describe('smoketest: object-oriented execution', () => { test('handle execution with stderr output', async () => { expect(devbox).toBeDefined(); // Generate 1000 lines to stderr to test large output handling - const result = await devbox.cmd.exec({ - command: 'for i in {1..1000}; do echo "Error message $i" >&2; done', - }); + const result = await devbox.cmd.exec('for i in {1..1000}; do echo "Error message $i" >&2; done'); expect(result).toBeDefined(); expect(result.exitCode).toBe(0); @@ -197,9 +190,7 @@ describe('smoketest: object-oriented execution', () => { test('handle execution with no output', async () => { expect(devbox).toBeDefined(); - const result = await devbox.cmd.exec({ - command: 'true', // Command that produces no output - }); + const result = await devbox.cmd.exec('true'); // Command that produces no output expect(result).toBeDefined(); expect(result.exitCode).toBe(0); @@ -232,9 +223,7 @@ describe('smoketest: object-oriented execution', () => { test('get last N lines from stdout', async () => { expect(devbox).toBeDefined(); // Generate output with multiple lines - const result = await devbox.cmd.exec({ - command: 'for i in {1..10}; do echo "Line $i"; done', - }); + const result = await devbox.cmd.exec('for i in {1..10}; do echo "Line $i"; done'); expect(result).toBeDefined(); expect(result.exitCode).toBe(0); @@ -267,9 +256,7 @@ describe('smoketest: object-oriented execution', () => { test('get last N lines from stderr', async () => { expect(devbox).toBeDefined(); // Generate stderr output with multiple lines - const result = await devbox.cmd.exec({ - command: 'for i in {1..10}; do echo "Error $i" >&2; done', - }); + const result = await devbox.cmd.exec('for i in {1..10}; do echo "Error $i" >&2; done'); expect(result).toBeDefined(); expect(result.exitCode).toBe(0); @@ -299,9 +286,7 @@ describe('smoketest: object-oriented execution', () => { test('get last 1 line (most recent)', async () => { expect(devbox).toBeDefined(); - const result = await devbox.cmd.exec({ - command: 'echo "First line"; echo "Second line"; echo "Last line"', - }); + const result = await devbox.cmd.exec('echo "First line"; echo "Second line"; echo "Last line"'); expect(result).toBeDefined(); expect(result.exitCode).toBe(0); @@ -318,9 +303,7 @@ describe('smoketest: object-oriented execution', () => { test('get all lines when numLines exceeds available lines', async () => { expect(devbox).toBeDefined(); - const result = await devbox.cmd.exec({ - command: 'echo "Line 1"; echo "Line 2"', - }); + const result = await devbox.cmd.exec('echo "Line 1"; echo "Line 2"'); expect(result).toBeDefined(); expect(result.exitCode).toBe(0); @@ -332,9 +315,7 @@ describe('smoketest: object-oriented execution', () => { test('get last N lines from both stdout and stderr', async () => { expect(devbox).toBeDefined(); - const result = await devbox.cmd.exec({ - command: 'for i in {1..5}; do echo "Out $i"; echo "Err $i" >&2; done', - }); + const result = await devbox.cmd.exec('for i in {1..5}; do echo "Out $i"; echo "Err $i" >&2; done'); expect(result).toBeDefined(); expect(result.exitCode).toBe(0); @@ -374,9 +355,7 @@ describe('smoketest: object-oriented execution', () => { test('handle truncated output with last N lines', async () => { expect(devbox).toBeDefined(); // Generate 1000 lines to trigger truncation - const result = await devbox.cmd.exec({ - command: 'for i in {1..1000}; do echo "Line $i"; done', - }); + const result = await devbox.cmd.exec('for i in {1..1000}; do echo "Line $i"; done'); expect(result).toBeDefined(); expect(result.exitCode).toBe(0); @@ -418,9 +397,7 @@ describe('smoketest: object-oriented execution', () => { test('handle truncated stderr with last N lines', async () => { expect(devbox).toBeDefined(); // Generate 1000 lines to stderr to trigger truncation - const result = await devbox.cmd.exec({ - command: 'for i in {1..1000}; do echo "Error $i" >&2; done', - }); + const result = await devbox.cmd.exec('for i in {1..1000}; do echo "Error $i" >&2; done'); expect(result).toBeDefined(); expect(result.exitCode).toBe(0); diff --git a/tests/smoketests/object-oriented/storage-object.test.ts b/tests/smoketests/object-oriented/storage-object.test.ts index b28708ed9..1772f1314 100644 --- a/tests/smoketests/object-oriented/storage-object.test.ts +++ b/tests/smoketests/object-oriented/storage-object.test.ts @@ -359,7 +359,7 @@ describe('smoketest: object-oriented storage object', () => { }); // List the mounted directory - const result = await devbox.cmd.exec({ command: 'ls -la /home/user/mounted-data' }); + const result = await devbox.cmd.exec('ls -la /home/user/mounted-data'); expect(result.exitCode).toBe(0); // Read the mounted file From ff2f192b713f146c2162dea136b1459175dd571b Mon Sep 17 00:00:00 2001 From: Alexander Dines Date: Tue, 25 Nov 2025 14:05:27 -0800 Subject: [PATCH 2/2] cp dines --- src/sdk.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sdk.ts b/src/sdk.ts index ba9b52007..ae0cd57b8 100644 --- a/src/sdk.ts +++ b/src/sdk.ts @@ -162,9 +162,9 @@ export class DevboxOps { * const runloop = new RunloopSDK(); * const devbox = await runloop.devbox.create({ name: 'my-devbox' }); * - * devbox.cmd.exec('echo "Hello, World!"'); - * ... - * ``` + * devbox.cmd.exec('echo "Hello, World!"'); + * ... + * ``` * * @param {DevboxCreateParams} [params] - Parameters for creating the devbox. * @param {Core.RequestOptions & { polling?: Partial> }} [options] - Request options including polling configuration.