Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.mirage.strukto.ai/llms.txt

Use this file to discover all available pages before exploring further.

Claude Code is Anthropic’s CLI for Claude. It expects a real filesystem and doesn’t expose a pluggable backend, so instead of an SDK integration, Mirage exposes any workspace as a real filesystem via FUSE and lets you point claude at the mountpoint.

Install

pnpm add @struktoai/mirage-node @zkochan/fuse-native
See TypeScript FUSE setup for the pnpm onlyBuiltDependencies allow-list and macOS macFUSE 4 symlink workaround. Then install Claude Code separately.

Usage

import { MountMode, RAMResource, S3Resource, Workspace } from '@struktoai/mirage-node'

const ws = new Workspace(
  {
    '/': new RAMResource(),
    '/s3/': new S3Resource({ bucket: 'my-bucket', /* ... */ }),
  },
  { mode: MountMode.WRITE, fuse: true },
)
await ws.execute('true') // wait for mount

console.log(`cd ${ws.fuseMountpoint} && claude`)
// ... run claude in another terminal, then:
await ws.close() // auto-unmounts
The mountpoint behaves like a regular directory. claude reads, writes, runs bash, and patches files just like it would on a normal disk, every operation goes through Mirage’s ops layer, so writes to /s3/... hit S3, writes to / stay in RAM.

Why FUSE instead of an SDK integration?

Claude Code’s tool-use loop is fully internal, there’s no Backend interface to swap. FUSE gives Mirage a single unforced way in: present a real path, let the agent be the agent. You lose:
  • Per-tool prompt customization
  • Observation hooks on tool calls
  • Mirage’s op-record telemetry on the agent’s specific calls (host syscalls aren’t recorded the same way)
You gain:
  • Zero integration effort
  • Compatibility with every Claude Code feature, including future ones
  • The same approach works for any other directory-based agent (OpenAI Codex, aider, etc.)