日本語版
最新ニュース
科学&テクノロジー

GitHub – vercel-labs/just-bash: エージェント用の Bash

TypeScript で記述された、インメモリ仮想ファイル システムを備えたシミュレートされた bash 環境。 安全なサンドボックス化された bash 環境を必要とする AI エージェント向けに設計されています。 オプションのネットワークアクセスをサポート curl デフォルトで安全な URL フィルタリングを使用します。 注記: これはベータ版ソフトウェアです。ご自身の責任で使用し、フィードバックをお寄せください。 シェルは、提供されたファイル システムにのみアクセスできます。 実行は無限ループや再帰から保護されます。ただし、Bash は入力からの DOS に対して完全に堅牢ではありません。これに対して堅牢である必要がある場合は、OS レベルでプロセス分離を使用してください。 バイナリや WASM さえも本質的にサポートされていません (使用 ヴァーセルサンドボックス 完全な VM が必要な場合は、同様の製品を使用します)。 デフォルトではネットワークアクセスはありません。 ネットワーク アクセスを有効にすることはできますが、リクエストは URL プレフィックス許可リストおよび HTTP…

GitHub – vercel-labs/just-bash: エージェント用の Bash

1772117990
2026-02-26 13:16:00

TypeScript で記述された、インメモリ仮想ファイル システムを備えたシミュレートされた bash 環境。

安全なサンドボックス化された bash 環境を必要とする AI エージェント向けに設計されています。

オプションのネットワークアクセスをサポート curl デフォルトで安全な URL フィルタリングを使用します。

注記: これはベータ版ソフトウェアです。ご自身の責任で使用し、フィードバックをお寄せください。

  • シェルは、提供されたファイル システムにのみアクセスできます。
  • 実行は無限ループや再帰から保護されます。ただし、Bash は入力からの DOS に対して完全に堅牢ではありません。これに対して堅牢である必要がある場合は、OS レベルでプロセス分離を使用してください。
  • バイナリや WASM さえも本質的にサポートされていません (使用 ヴァーセルサンドボックス 完全な VM が必要な場合は、同様の製品を使用します)。
  • デフォルトではネットワークアクセスはありません。
  • ネットワーク アクセスを有効にすることはできますが、リクエストは URL プレフィックス許可リストおよび HTTP メソッド許可リストと照合してチェックされます。見る ネットワークアクセス 詳細については
挨拶.txt’); const result = await env.exec(“猫の挨拶.txt”); console.log(結果.stdout); // “こんにちはn” console.log(result.exitCode); // 0 console.log(result.env); // 実行後の最終環境”>

import { Bash } from "just-bash";

const env = new Bash();
await env.exec('echo "Hello" > greeting.txt');
const result = await env.exec("cat greeting.txt");
console.log(result.stdout); // "Hellon"
console.log(result.exitCode); // 0
console.log(result.env); // Final environment after execution

それぞれ exec() は分離されています。環境変数、関数、CWD は呼び出しをまたいで持続しません (ファイルシステムは持続します)。

const env = new Bash({
  files: { "/data/file.txt": "content" }, // Initial files
  env: { MY_VAR: "value" }, // Initial environment
  cwd: "/app", // Starting directory (default: /home/user)
  executionLimits: { maxCallDepth: 50 }, // See "Execution Protection"
});

// Per-exec overrides
await env.exec("echo $TEMP", { env: { TEMP: "value" }, cwd: "/tmp" });

ファイル値は関数 (同期または非同期) にすることができます。この関数は最初の読み取り時に呼び出され、結果がキャッシュされます。ファイルが読み取られる前に書き込まれた場合、関数は呼び出されません。

JSON.stringify({ key: “value” }), “/data/remote.txt”: async () => (await fetch(“https://example.com”)).text(), “/data/static.txt”: “常にロードされます”, }, });”>

const env = new Bash({
  files: {
    "/data/config.json": () => JSON.stringify({ key: "value" }),
    "/data/remote.txt": async () => (await fetch("https://example.com")).text(),
    "/data/static.txt": "always loaded",
  },
});

これは、必要のない大規模なコンテンツや計算コストのかかるコンテンツに役立ちます。

以下を使用して、独自の TypeScript コマンドで just-bash を拡張します。 defineCommand:

{ const 名 = 引数[0] || “世界”; return { stdout: `こんにちは、${name}!n`、stderr: “”、exitCode: 0 }; }); const upper =defineCommand(“upper”, async (args, ctx) => { return { stdout: ctx.stdin.toUpperCase(), stderr: “”, exitCode: 0 }; }); const bash = new Bash({ カスタムコマンド: [hello, upper] }); await bash.exec(“こんにちは、アリス”); // “こんにちは、アリス!n” await bash.exec(“echo ‘test’ | upper”); // “テストn””>

import { Bash, defineCommand } from "just-bash";

const hello = defineCommand("hello", async (args, ctx) => {
  const name = args[0] || "world";
  return { stdout: `Hello, ${name}!n`, stderr: "", exitCode: 0 };
});

const upper = defineCommand("upper", async (args, ctx) => {
  return { stdout: ctx.stdin.toUpperCase(), stderr: "", exitCode: 0 };
});

const bash = new Bash({ customCommands: [hello, upper] });

await bash.exec("hello Alice"); // "Hello, Alice!n"
await bash.exec("echo 'test' | upper"); // "TESTn"

カスタムコマンドは完全に受信します CommandContext にアクセスできる fscwdenvstdin、 そして exec サブコマンドを実行するためのものです。

4 つのファイルシステム実装が利用可能です。

インメモリFs (デフォルト) – 純粋なインメモリ ファイル システム、ディスク アクセスなし:

import { Bash } from "just-bash";
const env = new Bash(); // Uses InMemoryFs by default

オーバーレイFs – 実ディレクトリへのコピーオンライト。読み取りはディスクから行われ、書き込みはメモリに残ります。

パッケージ.json’); // メモリに残ります”>

import { Bash } from "just-bash";
import { OverlayFs } from "just-bash/fs/overlay-fs";

const overlay = new OverlayFs({ root: "/path/to/project" });
const env = new Bash({ fs: overlay, cwd: overlay.getMountPoint() });

await env.exec("cat package.json"); // reads from disk
await env.exec('echo "modified" > package.json'); // stays in memory

読み取り書き込みFs – 実ディレクトリへの直接読み取り/書き込みアクセス。エージェントがディスクに書き込むことができるようにする場合は、これを使用します。

ファイル.txt’); // 実際のファイルシステムに書き込みます”>

import { Bash } from "just-bash";
import { ReadWriteFs } from "just-bash/fs/read-write-fs";

const rwfs = new ReadWriteFs({ root: "/path/to/sandbox" });
const env = new Bash({ fs: rwfs });

await env.exec('echo "hello" > file.txt'); // writes to real filesystem

マウント可能なFs – 複数のファイルシステムを異なるパスにマウントします。読み取り専用ファイルシステムと読み取り/書き込みファイルシステムを統合した名前空間に統合します。

メモ.txt’); // ワークスペースに書き込みます”>

import { Bash, MountableFs, InMemoryFs } from "just-bash";
import { OverlayFs } from "just-bash/fs/overlay-fs";
import { ReadWriteFs } from "just-bash/fs/read-write-fs";

const fs = new MountableFs({ base: new InMemoryFs() });

// Mount read-only knowledge base
fs.mount("/mnt/knowledge", new OverlayFs({ root: "/path/to/knowledge", readOnly: true }));

// Mount read-write workspace
fs.mount("/home/agent", new ReadWriteFs({ root: "/path/to/workspace" }));

const bash = new Bash({ fs, cwd: "/home/agent" });

await bash.exec("ls /mnt/knowledge"); // reads from knowledge base
await bash.exec("cp /mnt/knowledge/doc.txt ./"); // cross-mount copy
await bash.exec('echo "notes" > notes.txt'); // writes to workspace

コンストラクターでマウントを構成することもできます。

import { MountableFs, InMemoryFs } from "just-bash";
import { OverlayFs } from "just-bash/fs/overlay-fs";
import { ReadWriteFs } from "just-bash/fs/read-write-fs";

const fs = new MountableFs({
  base: new InMemoryFs(),
  mounts: [
    { mountPoint: "/data", filesystem: new OverlayFs({ root: "/shared/data" }) },
    { mountPoint: "/workspace", filesystem: new ReadWriteFs({ root: "/tmp/work" }) },
  ],
});

AI エージェントの場合は、次を使用します。 bash-tool これは just-bash 用に最適化されており、すぐに使用できる機能を提供します。 AI SDK 道具:

import { createBashTool } from "bash-tool";
import { generateText } from "ai";

const bashTool = createBashTool({
  files: { "/data/users.json": '[{"name": "Alice"}, {"name": "Bob"}]' },
});

const result = await generateText({
  model: "anthropic/claude-sonnet-4",
  tools: { bash: bashTool },
  prompt: "Count the users in /data/users.json",
});

を参照してください。 bash ツールのドキュメント 詳細と例については、こちらをご覧ください。

Vercel サンドボックス互換 API

Bash が提供するのは、 Sandbox API互換のクラス @vercel/sandbox実装を簡単に交換できるようになります。 Bash から始めて、完全な VM の能力が必要な場合 (ノード、Python、またはカスタム バイナリを実行する場合など)、実際のサンドボックスに切り替えることができます。

import { Sandbox } from "just-bash";

// Create a sandbox instance
const sandbox = await Sandbox.create({ cwd: "/app" });

// Write files to the virtual filesystem
await sandbox.writeFiles({
  "/app/script.sh": 'echo "Hello World"',
  "/app/data.json": '{"key": "value"}',
});

// Run commands and get results
const cmd = await sandbox.runCommand("bash /app/script.sh");
const output = await cmd.stdout(); // "Hello Worldn"
const exitCode = (await cmd.wait()).exitCode; // 0

// Read files back
const content = await sandbox.readFile("/app/data.json");

// Create directories
await sandbox.mkDir("/app/logs", { recursive: true });

// Clean up (no-op for Bash, but API-compatible)
await sandbox.stop();

グローバルにインストールした後 (npm install -g just-bash)、を使用します。 just-bash の安全な代替としてのコマンド bash AI エージェントの場合:

# Execute inline script
just-bash -c 'ls -la && cat package.json | head -5'

# Execute with specific project root
just-bash -c 'grep -r "TODO" src/' --root /path/to/project

# Pipe script from stdin
echo 'find . -name "*.ts" | wc -l' | just-bash

# Execute a script file
just-bash ./scripts/deploy.sh

# Get JSON output for programmatic use
just-bash -c 'echo hello' --json
# Output: {"stdout":"hellon","stderr":"","exitCode":0}

CLI は OverlayFS を使用します。読み取りは実際のファイルシステムから行われますが、書き込みはすべてメモリ内に留まり、実行後に破棄されます。プロジェクトのルートは次の場所にマウントされます。 /home/user/project

オプション:

  • -c
執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。