Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/reference/supported-tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Rulesync supports both **generation** and **import** for All of the major AI cod
| Factory Droid | factorydroid | ✅ 🌏 | | ✅ 🌏 | 🎮 | 🎮 | 🎮 | ✅ 🌏 | |
| OpenCode | opencode | ✅ 🌏 | | ✅ 🌏 🔧 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 |
| Cline | cline | ✅ | ✅ | ✅ | ✅ 🌏 | | ✅ 🌏 | | ✅ |
| Kilo Code | kilo | ✅ 🌏 | ✅ | | ✅ 🌏 | | ✅ 🌏 | | ✅ 🌏 |
| Kilo Code | kilo | ✅ 🌏 | ✅ | ✅ 🌏 | ✅ 🌏 | | ✅ 🌏 | | ✅ 🌏 |
| Roo Code | roo | ✅ | ✅ | ✅ | ✅ | 🎮 | ✅ 🌏 | | |
| Rovodev (Atlassian) | rovodev | ✅ 🌏 | | 🌏 | | ✅ 🌏 | ✅ 🌏 | | |
| Takt | takt | ✅ 🌏 | | | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | | |
Expand Down
2 changes: 1 addition & 1 deletion skills/rulesync/supported-tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Rulesync supports both **generation** and **import** for All of the major AI cod
| Factory Droid | factorydroid | ✅ 🌏 | | ✅ 🌏 | 🎮 | 🎮 | 🎮 | ✅ 🌏 | |
| OpenCode | opencode | ✅ 🌏 | | ✅ 🌏 🔧 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 |
| Cline | cline | ✅ | ✅ | ✅ | ✅ 🌏 | | ✅ 🌏 | | ✅ |
| Kilo Code | kilo | ✅ 🌏 | ✅ | | ✅ 🌏 | | ✅ 🌏 | | ✅ 🌏 |
| Kilo Code | kilo | ✅ 🌏 | ✅ | ✅ 🌏 | ✅ 🌏 | | ✅ 🌏 | | ✅ 🌏 |
| Roo Code | roo | ✅ | ✅ | ✅ | ✅ | 🎮 | ✅ 🌏 | | |
| Rovodev (Atlassian) | rovodev | ✅ 🌏 | | 🌏 | | ✅ 🌏 | ✅ 🌏 | | |
| Takt | takt | ✅ 🌏 | | | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | | |
Expand Down
1 change: 1 addition & 0 deletions src/e2e/e2e-mcp.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ describe("E2E: mcp (global mode)", () => {
{ target: "deepagents", outputPath: join(".deepagents", ".mcp.json") },
{ target: "factorydroid", outputPath: join(".factory", "mcp.json") },
{ target: "rovodev", outputPath: join(".rovodev", "mcp.json") },
{ target: "kilo", outputPath: join(".config", "kilo", "kilo.jsonc") },
])("should generate $target mcp in home directory", async ({ target, outputPath }) => {
const projectDir = getProjectDir();
const homeDir = getHomeDir();
Expand Down
10 changes: 10 additions & 0 deletions src/features/mcp/mcp-processor.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1095,6 +1095,16 @@ describe("McpProcessor", () => {
expect(targets).toContain("cursor");
expect(targets).toContain("roo");
expect(targets).toContain("codexcli"); // codexcli supports both project and global
expect(targets).toContain("kilo"); // kilo supports both project and global
});

it("should include kilo in global tool targets", () => {
// Kilo CLI is an OpenCode fork and reads global MCP from
// ~/.config/kilo/kilo.json(c), so it must be present in the
// global-mode supported targets list.
const globalTargets = McpProcessor.getToolTargets({ global: true });
expect(globalTargets).toContain("kilo");
expect(globalTargets).toContain("opencode"); // sanity: parity with opencode
});
});

Expand Down
8 changes: 7 additions & 1 deletion src/features/mcp/mcp-processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,13 @@ const toolMcpFactories = new Map<McpProcessorToolTarget, ToolMcpFactory>([
class: KiloMcp,
meta: {
supportsProject: true,
supportsGlobal: false,
// Kilo CLI reads global MCP from `~/.config/kilo/kilo.json` (or
// `kilo.jsonc`). The path machinery in `KiloMcp.getSettablePaths`
// already routes global mode to that location; only this flag
// was gating it off. Kilo is an OpenCode fork and uses an
// identical native MCP schema, so global parity with opencode
// is the natural state.
supportsGlobal: true,
supportsEnabledTools: false,
supportsDisabledTools: false,
},
Expand Down
Loading