From 6f69da1989335ca7a90f895b4333f0bc4f2521eb Mon Sep 17 00:00:00 2001 From: Jonah Snider Date: Fri, 10 Apr 2026 21:53:00 -0700 Subject: [PATCH] Add Factory Droid agent Signed-off-by: Jonah Snider --- package.json | 1 + src/agents.ts | 14 ++++++++++++++ src/types.ts | 3 +++ tests/agents.test.ts | 21 +++++++++++++++++---- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 1e7692a..f024bc1 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "claude-desktop", "codex", "cursor", + "factory-droid", "github-copilot-cli", "gemini-cli", "goose", diff --git a/src/agents.ts b/src/agents.ts index df9c0bb..e2965c7 100644 --- a/src/agents.ts +++ b/src/agents.ts @@ -387,6 +387,20 @@ export const agents: Record = { transformConfig: transformCodexConfig, }, + "factory-droid": { + name: "factory-droid", + displayName: "Factory Droid", + configPath: join(home, ".factory", "mcp.json"), + localConfigPath: ".factory/mcp.json", + projectDetectPaths: [".factory"], + configKey: "mcpServers", + format: "json", + supportedTransports: ["stdio", "http", "sse"], + detectGlobalInstall: async () => { + return existsSync(join(home, ".factory")); + }, + }, + cursor: { name: "cursor", displayName: "Cursor", diff --git a/src/types.ts b/src/types.ts index a73202a..2ee92be 100644 --- a/src/types.ts +++ b/src/types.ts @@ -6,6 +6,7 @@ export type AgentType = | "claude-desktop" | "codex" | "cursor" + | "factory-droid" | "gemini-cli" | "goose" | "github-copilot-cli" @@ -16,6 +17,8 @@ export type AgentType = export const agentAliases: Record = { "cline-vscode": "cline", + droid: "factory-droid", + factory: "factory-droid", gemini: "gemini-cli", "github-copilot": "vscode", }; diff --git a/tests/agents.test.ts b/tests/agents.test.ts index 814436d..d59a7f4 100644 --- a/tests/agents.test.ts +++ b/tests/agents.test.ts @@ -60,9 +60,9 @@ function cleanup() { // Agent Configuration Tests // ============================================ -test("getAgentTypes returns all 14 agents", () => { +test("getAgentTypes returns all 15 agents", () => { const types = getAgentTypes(); - assert.strictEqual(types.length, 14); + assert.strictEqual(types.length, 15); assert.ok(types.includes("antigravity")); assert.ok(types.includes("cline")); assert.ok(types.includes("cline-cli")); @@ -70,6 +70,7 @@ test("getAgentTypes returns all 14 agents", () => { assert.ok(types.includes("claude-desktop")); assert.ok(types.includes("codex")); assert.ok(types.includes("cursor")); + assert.ok(types.includes("factory-droid")); assert.ok(types.includes("gemini-cli")); assert.ok(types.includes("goose")); assert.ok(types.includes("github-copilot-cli")); @@ -108,6 +109,7 @@ test("All agents have required properties", () => { test("supportsProjectConfig - returns true for project-capable agents", () => { assert.strictEqual(supportsProjectConfig("claude-code"), true); assert.strictEqual(supportsProjectConfig("cursor"), true); + assert.strictEqual(supportsProjectConfig("factory-droid"), true); assert.strictEqual(supportsProjectConfig("vscode"), true); assert.strictEqual(supportsProjectConfig("opencode"), true); assert.strictEqual(supportsProjectConfig("gemini-cli"), true); @@ -124,11 +126,12 @@ test("supportsProjectConfig - returns false for global-only agents", () => { assert.strictEqual(supportsProjectConfig("goose"), false); }); -test("getProjectCapableAgents returns 9 agents", () => { +test("getProjectCapableAgents returns 10 agents", () => { const projectAgents = getProjectCapableAgents(); - assert.strictEqual(projectAgents.length, 9); + assert.strictEqual(projectAgents.length, 10); assert.ok(projectAgents.includes("claude-code")); assert.ok(projectAgents.includes("cursor")); + assert.ok(projectAgents.includes("factory-droid")); assert.ok(projectAgents.includes("vscode")); assert.ok(projectAgents.includes("opencode")); assert.ok(projectAgents.includes("gemini-cli")); @@ -234,6 +237,14 @@ test("detectProjectAgents - detects .codex directory", () => { assert.ok(detected.includes("codex")); }); +test("detectProjectAgents - detects .factory directory", () => { + const tempDir = createTempDir(); + mkdirSync(join(tempDir, ".factory")); + + const detected = detectProjectAgents(tempDir); + assert.ok(detected.includes("factory-droid")); +}); + test("detectProjectAgents - detects .zed directory", () => { const tempDir = createTempDir(); mkdirSync(join(tempDir, ".zed")); @@ -301,6 +312,7 @@ test("isTransportSupported - most agents support http", () => { "claude-code", "codex", "cursor", + "factory-droid", "gemini-cli", "github-copilot-cli", "goose", @@ -327,6 +339,7 @@ test("isTransportSupported - most agents support sse", () => { "claude-code", "codex", "cursor", + "factory-droid", "gemini-cli", "github-copilot-cli", "goose",