@bunny-agent/runner-cli 0.9.28

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/runner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ // Mock @bunny-agent/runner-claude
3
+ vi.mock("@bunny-agent/runner-claude", () => ({
4
+ createClaudeRunner: vi.fn().mockReturnValue({
5
+ run: vi.fn().mockImplementation(async function* () {
6
+ yield "data: test message\n\n";
7
+ }),
8
+ }),
9
+ }));
10
+ vi.mock("@bunny-agent/runner-codex", () => ({
11
+ createCodexRunner: vi.fn().mockReturnValue({
12
+ run: vi.fn().mockImplementation(async function* () {
13
+ yield '0:"codex message"\\n';
14
+ yield 'd:{"finishReason":"stop"}\\n';
15
+ }),
16
+ }),
17
+ }));
18
+ vi.mock("@bunny-agent/runner-gemini", () => ({
19
+ createGeminiRunner: vi.fn().mockReturnValue({
20
+ run: vi.fn().mockImplementation(async function* () {
21
+ yield '0:"gemini message"\\n';
22
+ yield 'd:{"finishReason":"stop"}\\n';
23
+ }),
24
+ }),
25
+ }));
26
+ import { createClaudeRunner } from "@bunny-agent/runner-claude";
27
+ import { createCodexRunner } from "@bunny-agent/runner-codex";
28
+ import { createGeminiRunner } from "@bunny-agent/runner-gemini";
29
+ import { runAgent } from "../runner.js";
30
+ describe("runAgent", () => {
31
+ let originalWrite;
32
+ let writtenData;
33
+ beforeEach(() => {
34
+ writtenData = [];
35
+ originalWrite = process.stdout.write;
36
+ process.stdout.write = vi.fn((data) => {
37
+ writtenData.push(data);
38
+ return true;
39
+ });
40
+ });
41
+ afterEach(() => {
42
+ process.stdout.write = originalWrite;
43
+ vi.clearAllMocks();
44
+ });
45
+ it("should create a Claude runner with correct options (with default template)", async () => {
46
+ await runAgent({
47
+ runner: "claude",
48
+ model: "claude-sonnet-4-20250514",
49
+ userInput: "Hello, world!",
50
+ });
51
+ // The runner should be called with template values loaded
52
+ expect(createClaudeRunner).toHaveBeenCalled();
53
+ const callArgs = vi.mocked(createClaudeRunner).mock.calls[0][0];
54
+ expect(callArgs.model).toBe("claude-sonnet-4-20250514");
55
+ // Template provides default allowed tools and maxTurns
56
+ // (or undefined if template not found)
57
+ expect(typeof callArgs.maxTurns === "number" || callArgs.maxTurns === undefined).toBe(true);
58
+ });
59
+ it("should pass optional parameters to runner (overriding template)", async () => {
60
+ await runAgent({
61
+ runner: "claude",
62
+ model: "claude-sonnet-4-20250514",
63
+ userInput: "Hello, world!",
64
+ systemPrompt: "You are a helpful assistant",
65
+ maxTurns: 5,
66
+ allowedTools: ["bash", "write_file"],
67
+ });
68
+ // Explicit parameters override template values
69
+ expect(createClaudeRunner).toHaveBeenCalledWith(expect.objectContaining({
70
+ model: "claude-sonnet-4-20250514",
71
+ systemPrompt: "You are a helpful assistant",
72
+ maxTurns: 5,
73
+ allowedTools: ["bash", "write_file"],
74
+ }));
75
+ });
76
+ it("should stream output to stdout without modification", async () => {
77
+ await runAgent({
78
+ runner: "claude",
79
+ model: "claude-sonnet-4-20250514",
80
+ userInput: "Hello, world!",
81
+ });
82
+ expect(process.stdout.write).toHaveBeenCalledWith("data: test message\n\n");
83
+ expect(writtenData).toEqual(["data: test message\n\n"]);
84
+ });
85
+ it("should call runner.run with user input", async () => {
86
+ const mockRunner = {
87
+ run: vi.fn().mockImplementation(async function* () {
88
+ yield "test";
89
+ }),
90
+ };
91
+ vi.mocked(createClaudeRunner).mockReturnValue(mockRunner);
92
+ await runAgent({
93
+ runner: "claude",
94
+ model: "claude-sonnet-4-20250514",
95
+ userInput: "Create a file",
96
+ });
97
+ expect(mockRunner.run).toHaveBeenCalledWith("Create a file");
98
+ });
99
+ it("should create Codex runner when --runner codex is selected", async () => {
100
+ await runAgent({
101
+ runner: "codex",
102
+ model: "gpt-5-codex",
103
+ userInput: "Implement feature X",
104
+ });
105
+ expect(createCodexRunner).toHaveBeenCalledWith(expect.objectContaining({
106
+ model: "gpt-5-codex",
107
+ }));
108
+ });
109
+ it("should create Gemini runner when --runner gemini is selected", async () => {
110
+ await runAgent({
111
+ runner: "gemini",
112
+ model: "gemini-2.5-pro",
113
+ userInput: "Implement feature Y",
114
+ });
115
+ expect(createGeminiRunner).toHaveBeenCalledWith(expect.objectContaining({
116
+ model: "gemini-2.5-pro",
117
+ }));
118
+ });
119
+ });
120
+ //# sourceMappingURL=runner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../../src/__tests__/runner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface BuildImageOptions {
2
+ /** Image name, e.g. "vikadata/bunny-agent-seo" */
3
+ name: string;
4
+ /** Image tag, e.g. "0.1.0" */
5
+ tag: string;
6
+ /** Full image override, e.g. "myorg/myimage:v1" */
7
+ image?: string;
8
+ /** Docker platform (default: linux/amd64) */
9
+ platform: string;
10
+ /** Path to agent template directory to bake into the image */
11
+ template?: string;
12
+ /** Push image to registry after build */
13
+ push: boolean;
14
+ }
15
+ export declare function buildImage(opts: BuildImageOptions): Promise<void>;
16
+ //# sourceMappingURL=build-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-image.d.ts","sourceRoot":"","sources":["../src/build-image.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,IAAI,EAAE,OAAO,CAAC;CACf;AA2ED,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EvE"}
@@ -0,0 +1,122 @@
1
+ import { execSync } from "node:child_process";
2
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from "node:fs";
3
+ import { basename, dirname, join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ // ---------------------------------------------------------------------------
6
+ // Helpers
7
+ // ---------------------------------------------------------------------------
8
+ function getPackageRoot() {
9
+ const thisDir = dirname(fileURLToPath(import.meta.url));
10
+ return resolve(thisDir, "..");
11
+ }
12
+ function getShippedDockerfile() {
13
+ // Look for Dockerfile in several locations:
14
+ // 1. Package root (apps/runner-cli/Dockerfile) — shipped with npm package
15
+ // 2. docker/bunny-agent-claude/Dockerfile — monorepo development
16
+ const packageRoot = getPackageRoot();
17
+ const candidates = [
18
+ join(packageRoot, "Dockerfile"),
19
+ resolve(packageRoot, "..", "..", "docker", "bunny-agent-claude", "Dockerfile"),
20
+ ];
21
+ for (const p of candidates) {
22
+ if (existsSync(p))
23
+ return p;
24
+ }
25
+ console.error(`❌ Dockerfile not found. Searched:\n${candidates.map((c) => ` ${c}`).join("\n")}`);
26
+ process.exit(1);
27
+ }
28
+ function run(cmd, cwd) {
29
+ execSync(cmd, { stdio: "inherit", cwd });
30
+ }
31
+ function ensureDocker() {
32
+ try {
33
+ execSync("docker info", { stdio: "ignore" });
34
+ }
35
+ catch {
36
+ console.error("❌ Docker is not running. Please start Docker first.");
37
+ process.exit(1);
38
+ }
39
+ }
40
+ function resolveTemplatePath(template) {
41
+ const abs = resolve(process.cwd(), template);
42
+ if (!existsSync(abs)) {
43
+ console.error(`❌ Template directory not found: ${abs}`);
44
+ process.exit(1);
45
+ }
46
+ return abs;
47
+ }
48
+ function copyDirSync(src, dest) {
49
+ mkdirSync(dest, { recursive: true });
50
+ for (const entry of readdirSync(src)) {
51
+ const srcPath = join(src, entry);
52
+ const destPath = join(dest, entry);
53
+ if (statSync(srcPath).isDirectory()) {
54
+ copyDirSync(srcPath, destPath);
55
+ }
56
+ else {
57
+ copyFileSync(srcPath, destPath);
58
+ }
59
+ }
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Build (and optionally push)
63
+ // ---------------------------------------------------------------------------
64
+ export async function buildImage(opts) {
65
+ const templatePath = opts.template
66
+ ? resolveTemplatePath(opts.template)
67
+ : null;
68
+ const templateName = templatePath ? basename(templatePath) : null;
69
+ const localImage = opts.image ?? `${opts.name}:${opts.tag}`;
70
+ console.log("📦 BunnyAgent Docker Image Builder");
71
+ console.log("========================");
72
+ console.log(` Image: ${localImage}`);
73
+ console.log(` Platform: ${opts.platform}`);
74
+ console.log(` Template: ${templateName ?? "(none)"}`);
75
+ console.log(` Push: ${opts.push}`);
76
+ console.log("");
77
+ ensureDocker();
78
+ const buildContext = join(process.cwd(), ".docker-staging");
79
+ mkdirSync(buildContext, { recursive: true });
80
+ let dockerfile = readFileSync(getShippedDockerfile(), "utf8");
81
+ if (templatePath && templateName) {
82
+ const destDir = join(buildContext, "templates", templateName);
83
+ mkdirSync(destDir, { recursive: true });
84
+ const claudeMd = join(templatePath, "CLAUDE.md");
85
+ if (existsSync(claudeMd))
86
+ copyFileSync(claudeMd, join(destDir, "CLAUDE.md"));
87
+ const claudeDir = join(templatePath, ".claude");
88
+ if (existsSync(claudeDir))
89
+ copyDirSync(claudeDir, join(destDir, ".claude"));
90
+ let copyLines = "\n# Template files\nRUN mkdir -p /opt/bunny-agent/templates";
91
+ if (existsSync(join(destDir, "CLAUDE.md"))) {
92
+ copyLines += `\nCOPY templates/${templateName}/CLAUDE.md /opt/bunny-agent/templates/CLAUDE.md`;
93
+ }
94
+ if (existsSync(join(destDir, ".claude"))) {
95
+ copyLines += `\nCOPY templates/${templateName}/.claude /opt/bunny-agent/templates/.claude`;
96
+ }
97
+ dockerfile = dockerfile.replace(/^CMD /m, `${copyLines}\n\nCMD `);
98
+ console.log("🧩 Injected template files into Dockerfile");
99
+ }
100
+ writeFileSync(join(buildContext, "Dockerfile"), dockerfile);
101
+ console.log("🐳 Building Docker image...");
102
+ run(`docker build --platform=${opts.platform} -t ${localImage} -f ${join(buildContext, "Dockerfile")} ${buildContext}`);
103
+ console.log(`\n✅ Image built: ${localImage}`);
104
+ if (!opts.push)
105
+ return;
106
+ if (!localImage.includes("/")) {
107
+ console.error("❌ --push requires --name to include namespace (e.g. vikadata/bunny-agent-seo)");
108
+ process.exit(1);
109
+ }
110
+ console.log("🚀 Pushing image...");
111
+ run(`docker push ${localImage}`);
112
+ console.log(`\n✅ Image pushed: ${localImage}`);
113
+ // Also push the latest tag
114
+ const latestImage = `${opts.name}:latest`;
115
+ if (localImage !== latestImage) {
116
+ console.log("🏷️ Tagging and pushing latest...");
117
+ run(`docker tag ${localImage} ${latestImage}`);
118
+ run(`docker push ${latestImage}`);
119
+ console.log(`✅ Image pushed: ${latestImage}`);
120
+ }
121
+ }
122
+ //# sourceMappingURL=build-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-image.js","sourceRoot":"","sources":["../src/build-image.ts"],"names":[],"mappings":"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"}