Skip to content
Foundry
Esc
↑↓navigate↵open⌘Jpreview
On this page

Workspaces and sandboxes

Choose where files, commands, agents, and isolated environments operate.

A workspace is a directory Marbles works with. A sandbox is an isolated environment that can mount a workspace or start from a set of files. A workspace selects files; a sandbox controls the environment that executes commands.

The execution context supplies a default working directory. Choose another workspace or a temporary checkout when the task needs a different set of files; add a sandbox when commands need an isolated environment.

The current workspace

With the default .foundry/marbles/ authoring folder, the workspace is your project root above .foundry. workspaces.current exposes that project: root, files(), read(id), and Git operations when it is a repository. These capabilities come from Workspaces.

Selecting a custom source changes this resolution. See the project reference for directory and single-module rules.

Declare another directory with workspace({ path: "../website" }). Relative paths resolve from the project root. The returned WorkspaceInstance loads on use; workspaces.load(definition) gives you an explicit handle. A directory selection provides context for work; it does not restrict everything arbitrary TypeScript can access.

Temporary Git worktrees

In a Git project with at least one commit, this complete module reads a revision in a temporary checkout:

import { step } from "@foundry.sh/marbles";

step("inspect-commit").do(({ workspaces, exec }) =>
  workspaces.current.git.withWorktree({ base: "HEAD" }, async (checkout) => {
    const result = await exec(["git", "rev-parse", "HEAD"]);
    return { revision: result.stdout.trim(), checkout: checkout.root };
  })
);

marbles roll inspect-commit returns the commit and temporary path. The checkout is removed when the callback ends. Supplying a new branch keeps that branch after cleanup; committed changes survive, but uncommitted work in the temporary checkout is not a durable result.

Return the commit SHA when another step must use that exact code. For reports or generated files, save an artifact before cleanup. Later steps need a result they can use after the temporary environment has been removed.

Commands and agent sessions opened inside the callback inherit the checkout’s working directory. The default sandbox mount does too. Raw filesystem calls should use checkout.root explicitly; workspaces.current.root continues to identify the original project.

Sandboxes

Sandbox supplies the file and command interfaces. The CLI uses its optional MicroSandbox adapter. A real sandbox needs microsandbox@0.6.18 resolvable from the Marbles installation and its native runtime binaries. Follow the runtime’s setup for your host; adding a package to the automation project alone does not necessarily make it resolvable from a separate global CLI installation.

This complete module uses the runtime once configured:

import { sandbox, step } from "@foundry.sh/marbles";

const box = sandbox({ image: "docker.io/oven/bun:1-slim", mount: "." });

step("sandbox-version").do(async ({ exec }) => {
  const result = await exec(["bun", "--version"], { sandbox: box });
  return result.stdout.trim();
});

The declaration does not boot a container. Its first operation starts it. Inside a step Marbles owns its lifetime, output, and cancellation. A sandbox used outside a step must be closed by its caller or runtime.

The image form mounts the current working directory read/write at /workspace; mount can also select a declared workspace. The files form, sandbox({ files: { "main.py": "print(1)" } }), seeds files without a host workspace mount. Host authentication directories are not automatically mounted. Network access defaults to disabled; executable workspace mounts require executable: true.

Sandbox exec returns the exit code even on failure. The step context’s exec(argv, { sandbox }) checks it and fails the step unless check: false.

Choose the environment for the task

Need Use
Read or change the current project workspaces.current
Inspect or change a particular revision A temporary Git worktree
Control the command environment and its access A configured sandbox

Next: Agents and sessions adds model work to these environments and explains how the session inherits its step’s location and lifecycle.

Was this page helpful?