Skip to main content

SkillFS

Bash is all you need.

A persistent, version-controlled sandbox for AI agents. Runs on E2B with every change tracked in git.

Agent works → commits progress → session ends
            ↓
Next session → restores state → continues where it left off
            ↓
git log     → full history of everything it did

Installation

pip install skillfs

You'll also need:

  • An E2B API key for sandbox execution
  • An LLM API key (e.g., Anthropic) if using runners

Quick Start

import asyncio
from skillfs.workspaces import Workspace
from skillfs.sandboxes import E2BSandbox, SandboxConfig
from skillfs.storage import LocalBundleStore

async def main():
    sandbox = E2BSandbox.create(config=SandboxConfig(timeout=300))
    store = LocalBundleStore(directory="/tmp/workspaces")

    workspace = Workspace(
        workspace_id="my-workspace",
        sandbox=sandbox,
        store=store,
    )

    await workspace.load()  # Restore from previous session if exists

    # Use the sandbox directly
    sandbox.run_command("echo 'Hello, world!' > hello.txt")
    sandbox.run_command("cat hello.txt")

    workspace.save()  # Commit and upload git bundle
    sandbox.close()

asyncio.run(main())

Workspace

Workspace handles persistence. It manages:

  • Loading state from storage (git bundles)
  • Saving state back to storage
  • Setting up MCP servers
  • Managing skills
from skillfs.workspaces import Workspace

workspace = Workspace(
    workspace_id="my-workspace",
    sandbox=sandbox,
    store=store,
    mcp_servers={
        "playwright": {"command": "npx", "args": ["@playwright/mcp@latest"]}
    },
    generate_mcp_tools=True,
)

await workspace.load()
# ... do work with sandbox ...
workspace.save()

Storage Backends

# Local filesystem (development)
from skillfs.storage import LocalBundleStore
store = LocalBundleStore(directory="/tmp/workspaces")

# Google Cloud Storage (production)
from skillfs.storage import GCSBundleStore
store = GCSBundleStore(bucket="my-bucket", prefix="workspaces/")

Runners (Optional)

Runners are LLM loops that work with the sandbox. Workspace handles persistence, Runner handles agent logic.

from skillfs.workspaces import Workspace
from skillfs.runners import AnthropicProvider, MainRunner

# Workspace: persistence
workspace = Workspace(workspace_id="my-workspace", sandbox=sandbox, store=store)
await workspace.load()

# Runner: LLM loop (uses same sandbox)
provider = AnthropicProvider(api_key="sk-ant-...", model="claude-sonnet-4-5-20250929")
runner = MainRunner(
    name="assistant",
    description="General assistant",
    system_prompt="You are a helpful assistant.",
    sandbox=sandbox,
    provider=provider,
    tools=["glob", "grep", "read_file", "write_file"],
)

result = await runner.run("Find all Python files")
print(result.message)

workspace.save()

Tools

Built-in sandbox tools available to runners:

  • glob: Find files by pattern
  • grep: Search file contents (regex)
  • read_file: Read file contents
  • write_file: Create/overwrite files
  • edit_file: Make targeted string replacements
  • run_command: Execute shell commands

MCP Integration

Generate Python wrappers for MCP servers inside the sandbox:

workspace = Workspace(
    workspace_id="browser-workspace",
    sandbox=sandbox,
    store=store,
    mcp_servers={
        "playwright": {
            "command": "npx",
            "args": ["@playwright/mcp@latest"]
        }
    },
    generate_mcp_tools=True,
)
await workspace.load()

# MCP tools are now available at src/servers/playwright/

Examples

examples/browser_agent.py - Browser automation with Playwright MCP.

examples/example_with_runners.py - Using Workspace with Runners.

export ANTHROPIC_API_KEY=sk-ant-...
export E2B_API_KEY=e2b_...
python examples/browser_agent.py

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

skillfs-0.1.0.tar.gz (56.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

skillfs-0.1.0-py3-none-any.whl (77.6 kB view details)

Uploaded Python 3

File details

Details for the file skillfs-0.1.0.tar.gz.

File metadata

  • Download URL: skillfs-0.1.0.tar.gz
  • Upload date:
  • Size: 56.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for skillfs-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6e797d94672baa146caaa2f19bb5a024c78d0cea9352375edf7e7a1e40c15348
MD5 bfa042def738713865be52fe47208f1e
BLAKE2b-256 30172269716d5282ced938ff559402303ceed4e373323a2cad7d30e1cf24202c

See more details on using hashes here.

File details

Details for the file skillfs-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: skillfs-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 77.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for skillfs-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ee42e152722a750beff0d7b35cb04efd89f6507a75bbe013ae0554be4e42885c
MD5 ec6f5f5983617e3b2eb71cf1126a244d
BLAKE2b-256 9717aa1f7c2ad2807009512343f4b85141a2114f2adad88c8ce998b21db8db25

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page