From ea879773ec0f59f34bf2bbb0cd7373b354d36558 Mon Sep 17 00:00:00 2001 From: Jayesh Sharma Date: Sat, 7 Mar 2026 14:13:29 +0530 Subject: [PATCH 1/2] chore: bump codex plugin version for npm publish (fixes --system-prompt flag) --- packages/plugins/agent-codex/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugins/agent-codex/package.json b/packages/plugins/agent-codex/package.json index 74d6e2e95..f3f7831df 100644 --- a/packages/plugins/agent-codex/package.json +++ b/packages/plugins/agent-codex/package.json @@ -1,6 +1,6 @@ { "name": "@composio/ao-plugin-agent-codex", - "version": "0.1.0", + "version": "0.1.1", "description": "Agent plugin: OpenAI Codex CLI", "license": "MIT", "type": "module", From db79ad9423dda1d8ba5f3d6d8828e9c13dd31350 Mon Sep 17 00:00:00 2001 From: Prateek Date: Sat, 7 Mar 2026 21:02:07 +0530 Subject: [PATCH 2/2] test: align codex plugin version checks and stabilize init port tests --- packages/cli/__tests__/commands/init.test.ts | 64 +++++++------------ .../agent-codex/src/app-server-client.test.ts | 2 +- .../agent-codex/src/app-server-client.ts | 2 +- .../plugins/agent-codex/src/index.test.ts | 12 ++-- packages/plugins/agent-codex/src/index.ts | 4 +- .../agent-codex/src/package-version.test.ts | 11 ++++ 6 files changed, 43 insertions(+), 52 deletions(-) create mode 100644 packages/plugins/agent-codex/src/package-version.test.ts diff --git a/packages/cli/__tests__/commands/init.test.ts b/packages/cli/__tests__/commands/init.test.ts index 0e9df03bf..fca9f0472 100644 --- a/packages/cli/__tests__/commands/init.test.ts +++ b/packages/cli/__tests__/commands/init.test.ts @@ -2,7 +2,6 @@ import { describe, it, expect, vi, afterEach } from "vitest"; import { mkdtempSync, writeFileSync, readFileSync, rmSync, existsSync } from "node:fs"; import { join } from "node:path"; import { tmpdir } from "node:os"; -import { createServer } from "node:net"; import { Command } from "commander"; import { parse as yamlParse } from "yaml"; @@ -62,61 +61,42 @@ describe("init command", () => { tmpDir = mkdtempSync(join(tmpdir(), "ao-init-test-")); const outputPath = join(tmpDir, "agent-orchestrator.yaml"); - // Occupy port 3000 - const blocker = createServer(); - await new Promise((resolve) => { - blocker.listen(3000, "127.0.0.1", () => resolve()); - }); + // Mock free-port discovery to avoid relying on host port availability + const webDirModule = await import("../../src/lib/web-dir.js"); + vi.spyOn(webDirModule, "findFreePort").mockResolvedValue(3001); - try { - const program = new Command(); - program.exitOverride(); - registerInit(program); + const program = new Command(); + program.exitOverride(); + registerInit(program); - vi.spyOn(console, "log").mockImplementation(() => {}); + vi.spyOn(console, "log").mockImplementation(() => {}); - await program.parseAsync(["node", "test", "init", "--auto", "--output", outputPath]); + await program.parseAsync(["node", "test", "init", "--auto", "--output", outputPath]); - const content = readFileSync(outputPath, "utf-8"); - // Should NOT be 3000 since we're occupying it - expect(content).not.toContain("port: 3000"); - // Should pick 3001 (or higher if 3001 is also taken) - const portMatch = content.match(/port: (\d+)/); - expect(portMatch).toBeTruthy(); - const port = parseInt(portMatch![1], 10); - expect(port).toBeGreaterThan(3000); - expect(port).toBeLessThan(3100); - } finally { - await new Promise((resolve) => blocker.close(() => resolve())); - } + const content = readFileSync(outputPath, "utf-8"); + expect(content).toContain("port: 3001"); }); it("auto mode tells user when default port is busy and which port it picked", async () => { tmpDir = mkdtempSync(join(tmpdir(), "ao-init-test-")); const outputPath = join(tmpDir, "agent-orchestrator.yaml"); - // Occupy port 3000 - const blocker = createServer(); - await new Promise((resolve) => { - blocker.listen(3000, "127.0.0.1", () => resolve()); - }); + // Mock free-port discovery to avoid relying on host port availability + const webDirModule = await import("../../src/lib/web-dir.js"); + vi.spyOn(webDirModule, "findFreePort").mockResolvedValue(3001); - try { - const logSpy = vi.spyOn(console, "log").mockImplementation(() => {}); + const logSpy = vi.spyOn(console, "log").mockImplementation(() => {}); - const program = new Command(); - program.exitOverride(); - registerInit(program); + const program = new Command(); + program.exitOverride(); + registerInit(program); - await program.parseAsync(["node", "test", "init", "--auto", "--output", outputPath]); + await program.parseAsync(["node", "test", "init", "--auto", "--output", outputPath]); - const logCalls = logSpy.mock.calls.map((args) => args.join(" ")); - const busyMessage = logCalls.find((msg) => msg.includes("Port 3000 is busy")); - expect(busyMessage).toBeDefined(); - expect(busyMessage).toContain("instead"); - } finally { - await new Promise((resolve) => blocker.close(() => resolve())); - } + const logCalls = logSpy.mock.calls.map((args) => args.join(" ")); + const busyMessage = logCalls.find((msg) => msg.includes("Port 3000 is busy")); + expect(busyMessage).toBeDefined(); + expect(busyMessage).toContain("instead"); }); it("auto mode writes name and sessionPrefix to project config", async () => { diff --git a/packages/plugins/agent-codex/src/app-server-client.test.ts b/packages/plugins/agent-codex/src/app-server-client.test.ts index c2b5db7ea..79ea3371e 100644 --- a/packages/plugins/agent-codex/src/app-server-client.test.ts +++ b/packages/plugins/agent-codex/src/app-server-client.test.ts @@ -212,7 +212,7 @@ describe("CodexAppServerClient", () => { const params = initReq!["params"] as Record; const clientInfo = params["clientInfo"] as Record; expect(clientInfo["name"]).toBe("ao-agent-codex"); - expect(clientInfo["version"]).toBe("0.1.0"); + expect(clientInfo["version"]).toBe("0.1.1"); await closeClient(client, proc); }); diff --git a/packages/plugins/agent-codex/src/app-server-client.ts b/packages/plugins/agent-codex/src/app-server-client.ts index a550000d9..24aee2875 100644 --- a/packages/plugins/agent-codex/src/app-server-client.ts +++ b/packages/plugins/agent-codex/src/app-server-client.ts @@ -379,7 +379,7 @@ export class CodexAppServerClient extends EventEmitter { clientInfo: { name: "ao-agent-codex", title: "Agent Orchestrator — Codex Plugin", - version: "0.1.0", + version: "0.1.1", }, }); diff --git a/packages/plugins/agent-codex/src/index.test.ts b/packages/plugins/agent-codex/src/index.test.ts index 363825244..76a3d92c7 100644 --- a/packages/plugins/agent-codex/src/index.test.ts +++ b/packages/plugins/agent-codex/src/index.test.ts @@ -187,7 +187,7 @@ describe("plugin manifest & exports", () => { name: "codex", slot: "agent", description: "Agent plugin: OpenAI Codex CLI", - version: "0.1.0", + version: "0.1.1", }); }); @@ -1330,7 +1330,7 @@ describe("setupWorkspaceHooks", () => { // Second call for AGENTS.md — file doesn't exist mockReadFile.mockImplementation((path: string) => { if (typeof path === "string" && path.endsWith(".ao-version")) { - return Promise.resolve("0.1.0"); + return Promise.resolve("0.1.1"); } // AGENTS.md read attempt return Promise.reject(new Error("ENOENT")); @@ -1370,7 +1370,7 @@ describe("setupWorkspaceHooks", () => { typeof call[0] === "string" && call[0].includes(".ao-version.tmp."), ); expect(versionWriteCall).toBeDefined(); - expect(versionWriteCall![1]).toBe("0.1.0"); + expect(versionWriteCall![1]).toBe("0.1.1"); const versionRenameCall = mockRename.mock.calls.find( (call: string[]) => typeof call[1] === "string" && call[1].endsWith(".ao-version"), @@ -1383,7 +1383,7 @@ describe("setupWorkspaceHooks", () => { // AGENTS.md exists without ao section mockReadFile.mockImplementation((path: string) => { if (typeof path === "string" && path.endsWith(".ao-version")) { - return Promise.resolve("0.1.0"); + return Promise.resolve("0.1.1"); } if (typeof path === "string" && path.endsWith("AGENTS.md")) { return Promise.resolve("# Existing Content\n\nSome stuff here.\n"); @@ -1408,7 +1408,7 @@ describe("setupWorkspaceHooks", () => { // Version marker matches, AGENTS.md doesn't exist mockReadFile.mockImplementation((path: string) => { if (typeof path === "string" && path.endsWith(".ao-version")) { - return Promise.resolve("0.1.0"); + return Promise.resolve("0.1.1"); } return Promise.reject(new Error("ENOENT")); }); @@ -1455,7 +1455,7 @@ describe("setupWorkspaceHooks", () => { it("does not duplicate ao section in AGENTS.md if already present", async () => { mockReadFile.mockImplementation((path: string) => { if (typeof path === "string" && path.endsWith(".ao-version")) { - return Promise.resolve("0.1.0"); + return Promise.resolve("0.1.1"); } if (typeof path === "string" && path.endsWith("AGENTS.md")) { return Promise.resolve("# Existing\n\n## Agent Orchestrator (ao) Session\n\nAlready here.\n"); diff --git a/packages/plugins/agent-codex/src/index.ts b/packages/plugins/agent-codex/src/index.ts index 0ebb69039..7d5991ab7 100644 --- a/packages/plugins/agent-codex/src/index.ts +++ b/packages/plugins/agent-codex/src/index.ts @@ -35,7 +35,7 @@ export const manifest = { name: "codex", slot: "agent" as const, description: "Agent plugin: OpenAI Codex CLI", - version: "0.1.0", + version: "0.1.1", }; // ============================================================================= @@ -240,7 +240,7 @@ async function setupCodexWorkspace(workspacePath: string): Promise { // Only write wrappers if they don't exist or are outdated (check marker) const markerPath = join(AO_BIN_DIR, ".ao-version"); - const currentVersion = "0.1.0"; + const currentVersion = "0.1.1"; let needsUpdate = true; try { const existing = await readFile(markerPath, "utf-8"); diff --git a/packages/plugins/agent-codex/src/package-version.test.ts b/packages/plugins/agent-codex/src/package-version.test.ts new file mode 100644 index 000000000..03365a962 --- /dev/null +++ b/packages/plugins/agent-codex/src/package-version.test.ts @@ -0,0 +1,11 @@ +import { describe, expect, it } from "vitest"; +import { readFileSync } from "node:fs"; + +describe("package manifest version", () => { + it("is bumped to 0.1.1", () => { + const packageJsonUrl = new URL("../package.json", import.meta.url); + const packageJson = JSON.parse(readFileSync(packageJsonUrl, "utf8")) as { version?: string }; + + expect(packageJson.version).toBe("0.1.1"); + }); +});