@sandagent/runner-cli 0.1.2-beta.1 → 0.1.2-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -4
- package/dist/__tests__/runner-cli.integration.test.d.ts +6 -0
- package/dist/__tests__/runner-cli.integration.test.d.ts.map +1 -0
- package/dist/__tests__/runner-cli.integration.test.js +76 -0
- package/dist/__tests__/runner-cli.integration.test.js.map +1 -0
- package/dist/__tests__/runner.test.js +7 -3
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/bundle.mjs +334 -198
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -1
- package/dist/runner.d.ts +2 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +31 -14
- package/dist/runner.js.map +1 -1
- package/package.json +16 -1
- package/dist/bundle.js +0 -377
package/README.md
CHANGED
|
@@ -1,8 +1,33 @@
|
|
|
1
1
|
# @sandagent/runner-cli
|
|
2
2
|
|
|
3
|
-
SandAgent Runner CLI - A command-line interface for running AI agents
|
|
3
|
+
SandAgent Runner CLI - A **lightweight, local** command-line interface for running AI agents in your terminal.
|
|
4
4
|
|
|
5
|
-
Like gemini-cli
|
|
5
|
+
Like gemini-cli, claude-code, or codex-cli, this tool runs **directly on your local filesystem** and streams AI SDK UI messages to stdout.
|
|
6
|
+
|
|
7
|
+
## 🎯 Key Features
|
|
8
|
+
|
|
9
|
+
- 🔌 **Choose Different Runners**: Switch between Claude, Codex, Copilot with `--runner` flag
|
|
10
|
+
- 🚀 **Local Execution**: Runs directly on your filesystem, no sandbox required
|
|
11
|
+
- 💨 **Lightweight**: No manager dependency, minimal overhead
|
|
12
|
+
- 📡 **Streaming**: Real-time AI SDK UI streaming
|
|
13
|
+
|
|
14
|
+
## 📐 Architecture
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
runner-cli → runner-* (direct, NO dependencies on manager or sandbox)
|
|
18
|
+
├─ runner-claude ✅
|
|
19
|
+
├─ runner-codex 🚧
|
|
20
|
+
└─ runner-copilot 🚧
|
|
21
|
+
|
|
22
|
+
Dependencies:
|
|
23
|
+
✅ @sandagent/runner-claude (runtime)
|
|
24
|
+
❌ NO @sandagent/manager
|
|
25
|
+
❌ NO @sandagent/sandbox-*
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Difference from manager-cli:**
|
|
29
|
+
- `runner-cli`: Local filesystem, no isolation, lightweight, direct runner usage
|
|
30
|
+
- `manager-cli`: Sandboxed execution, uses manager + sandbox adapters + runner
|
|
6
31
|
|
|
7
32
|
## Installation
|
|
8
33
|
|
|
@@ -19,17 +44,27 @@ sandagent run [options] -- "<user input>"
|
|
|
19
44
|
### Basic Examples
|
|
20
45
|
|
|
21
46
|
```bash
|
|
22
|
-
#
|
|
47
|
+
# Using Claude (default)
|
|
23
48
|
sandagent run -- "Create a hello world script"
|
|
24
49
|
|
|
50
|
+
# Explicitly choose Claude
|
|
51
|
+
sandagent run --runner claude -- "Create a hello world script"
|
|
52
|
+
|
|
53
|
+
# Using Codex (when implemented)
|
|
54
|
+
sandagent run --runner codex -- "Build a REST API with Express"
|
|
55
|
+
|
|
56
|
+
# Using GitHub Copilot (when implemented)
|
|
57
|
+
sandagent run --runner copilot -- "Refactor this code"
|
|
58
|
+
|
|
25
59
|
# With custom system prompt
|
|
26
|
-
sandagent run --system-prompt "You are a coding assistant" -- "Build a REST API with Express"
|
|
60
|
+
sandagent run --runner claude --system-prompt "You are a coding assistant" -- "Build a REST API with Express"
|
|
27
61
|
```
|
|
28
62
|
|
|
29
63
|
## Options
|
|
30
64
|
|
|
31
65
|
| Option | Short | Description | Default |
|
|
32
66
|
|--------|-------|-------------|---------|
|
|
67
|
+
| `--runner <runner>` | `-r` | Runner to use: `claude`, `codex`, `copilot` | `claude` |
|
|
33
68
|
| `--model <model>` | `-m` | Model to use | `claude-sonnet-4-20250514` |
|
|
34
69
|
| `--cwd <path>` | `-c` | Working directory | Current directory |
|
|
35
70
|
| `--system-prompt <prompt>` | `-s` | Custom system prompt | - |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-cli.integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/runner-cli.integration.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for runner-cli
|
|
3
|
+
* Tests actual process execution
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { describe, expect, it } from "vitest";
|
|
8
|
+
// Get CLI path - works in both compiled and source context
|
|
9
|
+
const CLI_PATH = join(process.cwd(), "dist/bundle.mjs");
|
|
10
|
+
describe("runner-cli Integration Tests", () => {
|
|
11
|
+
const TIMEOUT = 10000;
|
|
12
|
+
it("should display help message", async () => {
|
|
13
|
+
const output = await runCLI(["--help"]);
|
|
14
|
+
expect(output.stdout).toContain("SandAgent Runner CLI");
|
|
15
|
+
expect(output.stdout).toContain("--runner");
|
|
16
|
+
expect(output.stdout).toContain("--model");
|
|
17
|
+
expect(output.exitCode).toBe(0);
|
|
18
|
+
}, TIMEOUT);
|
|
19
|
+
it("should show error when no user input provided", async () => {
|
|
20
|
+
const output = await runCLI(["run"]);
|
|
21
|
+
expect(output.stderr).toContain("User input is required");
|
|
22
|
+
expect(output.exitCode).toBe(1);
|
|
23
|
+
}, TIMEOUT);
|
|
24
|
+
it("should show error for invalid runner", async () => {
|
|
25
|
+
const output = await runCLI([
|
|
26
|
+
"run",
|
|
27
|
+
"--runner",
|
|
28
|
+
"invalid",
|
|
29
|
+
"--",
|
|
30
|
+
"test task",
|
|
31
|
+
]);
|
|
32
|
+
expect(output.stderr).toContain("must be one of");
|
|
33
|
+
expect(output.exitCode).toBe(1);
|
|
34
|
+
}, TIMEOUT);
|
|
35
|
+
it("should accept claude runner option", async () => {
|
|
36
|
+
// This will fail without API key, but should parse arguments correctly
|
|
37
|
+
const output = await runCLI(["run", "--runner", "claude", "--", "echo hello"], {
|
|
38
|
+
env: { ...process.env, ANTHROPIC_API_KEY: "" },
|
|
39
|
+
});
|
|
40
|
+
// Should fail due to missing API key, not argument parsing
|
|
41
|
+
expect(output.stderr).toContain("ANTHROPIC_API_KEY");
|
|
42
|
+
}, TIMEOUT);
|
|
43
|
+
});
|
|
44
|
+
/**
|
|
45
|
+
* Helper to run CLI and capture output
|
|
46
|
+
*/
|
|
47
|
+
function runCLI(args, options = {}) {
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
const proc = spawn("node", [CLI_PATH, ...args], {
|
|
50
|
+
env: options.env || process.env,
|
|
51
|
+
stdio: "pipe",
|
|
52
|
+
});
|
|
53
|
+
let stdout = "";
|
|
54
|
+
let stderr = "";
|
|
55
|
+
proc.stdout?.on("data", (data) => {
|
|
56
|
+
stdout += data.toString();
|
|
57
|
+
});
|
|
58
|
+
proc.stderr?.on("data", (data) => {
|
|
59
|
+
stderr += data.toString();
|
|
60
|
+
});
|
|
61
|
+
proc.on("close", (code) => {
|
|
62
|
+
resolve({
|
|
63
|
+
stdout,
|
|
64
|
+
stderr,
|
|
65
|
+
exitCode: code || 0,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
proc.on("error", reject);
|
|
69
|
+
// Timeout
|
|
70
|
+
setTimeout(() => {
|
|
71
|
+
proc.kill();
|
|
72
|
+
reject(new Error("Process timed out"));
|
|
73
|
+
}, 15000);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=runner-cli.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-cli.integration.test.js","sourceRoot":"","sources":["../../src/__tests__/runner-cli.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,7 @@ describe("runAgent", () => {
|
|
|
27
27
|
});
|
|
28
28
|
it("should create a Claude runner with correct options (with default template)", async () => {
|
|
29
29
|
await runAgent({
|
|
30
|
+
runner: "claude",
|
|
30
31
|
model: "claude-sonnet-4-20250514",
|
|
31
32
|
userInput: "Hello, world!",
|
|
32
33
|
});
|
|
@@ -40,6 +41,7 @@ describe("runAgent", () => {
|
|
|
40
41
|
});
|
|
41
42
|
it("should pass optional parameters to runner (overriding template)", async () => {
|
|
42
43
|
await runAgent({
|
|
44
|
+
runner: "claude",
|
|
43
45
|
model: "claude-sonnet-4-20250514",
|
|
44
46
|
userInput: "Hello, world!",
|
|
45
47
|
systemPrompt: "You are a helpful assistant",
|
|
@@ -47,15 +49,16 @@ describe("runAgent", () => {
|
|
|
47
49
|
allowedTools: ["bash", "write_file"],
|
|
48
50
|
});
|
|
49
51
|
// Explicit parameters override template values
|
|
50
|
-
expect(createClaudeRunner).toHaveBeenCalledWith({
|
|
52
|
+
expect(createClaudeRunner).toHaveBeenCalledWith(expect.objectContaining({
|
|
51
53
|
model: "claude-sonnet-4-20250514",
|
|
52
54
|
systemPrompt: "You are a helpful assistant",
|
|
53
55
|
maxTurns: 5,
|
|
54
56
|
allowedTools: ["bash", "write_file"],
|
|
55
|
-
});
|
|
57
|
+
}));
|
|
56
58
|
});
|
|
57
59
|
it("should stream output to stdout without modification", async () => {
|
|
58
60
|
await runAgent({
|
|
61
|
+
runner: "claude",
|
|
59
62
|
model: "claude-sonnet-4-20250514",
|
|
60
63
|
userInput: "Hello, world!",
|
|
61
64
|
});
|
|
@@ -70,10 +73,11 @@ describe("runAgent", () => {
|
|
|
70
73
|
};
|
|
71
74
|
vi.mocked(createClaudeRunner).mockReturnValue(mockRunner);
|
|
72
75
|
await runAgent({
|
|
76
|
+
runner: "claude",
|
|
73
77
|
model: "claude-sonnet-4-20250514",
|
|
74
78
|
userInput: "Create a file",
|
|
75
79
|
});
|
|
76
|
-
expect(mockRunner.run).toHaveBeenCalledWith("Create a file"
|
|
80
|
+
expect(mockRunner.run).toHaveBeenCalledWith("Create a file");
|
|
77
81
|
});
|
|
78
82
|
});
|
|
79
83
|
//# sourceMappingURL=runner.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../../src/__tests__/runner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,gCAAgC;AAChC,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;QAC1C,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,SAAS,CAAC;YAC7C,MAAM,wBAAwB,CAAC;QACjC,CAAC,CAAC;KACH,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,aAA0C,CAAC;IAC/C,IAAI,WAAqB,CAAC;IAE1B,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,EAAE,CAAC;QACjB,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACrC,oCAAoC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE;YAC5C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC;QACrC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,QAAQ,CAAC;YACb,KAAK,EAAE,0BAA0B;YACjC,SAAS,EAAE,eAAe;SAC3B,CAAC,CAAC;QAEH,0DAA0D;QAC1D,MAAM,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxD,uDAAuD;QACvD,uCAAuC;QACvC,MAAM,CACJ,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,CACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,QAAQ,CAAC;YACb,KAAK,EAAE,0BAA0B;YACjC,SAAS,EAAE,eAAe;YAC1B,YAAY,EAAE,6BAA6B;YAC3C,QAAQ,EAAE,CAAC;YACX,YAAY,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;SACrC,CAAC,CAAC;QAEH,+CAA+C;QAC/C,MAAM,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../../src/__tests__/runner.test.ts"],"names":[],"mappings":"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"}
|