This is an automated email from the ASF dual-hosted git repository. luigidemasi pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-kit.git
commit d98f170f336725f931bbb996e141eda3c3271f09 Author: Jinal Sarvaiya <[email protected]> AuthorDate: Fri Nov 6 11:26:51 2026 +0000 fix #99:inline config content, safe ancestor test, generation-path tests --- .../camel/kit/generator/OpenCodeGenerator.java | 25 ++++- .../camel/kit/generator/OpenCodeGeneratorTest.java | 111 ++++++++++++++------- 2 files changed, 98 insertions(+), 38 deletions(-) diff --git a/kit/camel-kit-core/src/main/java/org/apache/camel/kit/generator/OpenCodeGenerator.java b/kit/camel-kit-core/src/main/java/org/apache/camel/kit/generator/OpenCodeGenerator.java index 32943b3c..ab1abcf0 100644 --- a/kit/camel-kit-core/src/main/java/org/apache/camel/kit/generator/OpenCodeGenerator.java +++ b/kit/camel-kit-core/src/main/java/org/apache/camel/kit/generator/OpenCodeGenerator.java @@ -92,11 +92,24 @@ public class OpenCodeGenerator extends DefaultGenerator { if (explicitConfig != null) { collectMcpServersFromFile(explicitConfig, names); } + String inlineContent = inlineConfigContent(); + if (inlineContent != null && !inlineContent.isBlank()) { + collectMcpServersFromContent(inlineContent, names); + } return List.copyOf(names); } static void collectMcpServersFromFile(Path configFile, Set<String> names) throws IOException { - JsonNode config = OpenCodeProjectConfig.newJsonMapper().readTree(configFile.toFile()); + collectMcpServersFromNode( + OpenCodeProjectConfig.newJsonMapper().readTree(configFile.toFile()), names); + } + + static void collectMcpServersFromContent(String jsonContent, Set<String> names) throws IOException { + collectMcpServersFromNode( + OpenCodeProjectConfig.newJsonMapper().readTree(jsonContent), names); + } + + private static void collectMcpServersFromNode(JsonNode config, Set<String> names) { if (config == null) { return; } @@ -142,7 +155,7 @@ public class OpenCodeGenerator extends DefaultGenerator { return result; } - static List<Path> globalConfigFiles() { + List<Path> globalConfigFiles() { Path globalDir = globalConfigDir(); return GLOBAL_CONFIG_FILES.stream() .map(globalDir::resolve) @@ -150,7 +163,7 @@ public class OpenCodeGenerator extends DefaultGenerator { .toList(); } - private static Path globalConfigDir() { + Path globalConfigDir() { String xdgConfigHome = System.getenv("XDG_CONFIG_HOME"); if (xdgConfigHome != null && !xdgConfigHome.isBlank()) { return Path.of(xdgConfigHome, "opencode"); @@ -158,7 +171,7 @@ public class OpenCodeGenerator extends DefaultGenerator { return Path.of(System.getProperty("user.home"), ".config", "opencode"); } - static Path explicitConfigFile() { + Path explicitConfigFile() { String explicitPath = System.getenv("OPENCODE_CONFIG"); if (explicitPath != null && !explicitPath.isBlank()) { Path path = Path.of(explicitPath); @@ -169,6 +182,10 @@ public class OpenCodeGenerator extends DefaultGenerator { return null; } + String inlineConfigContent() { + return System.getenv("OPENCODE_CONFIG_CONTENT"); + } + private void generateAgents(InitContext ctx, Map<String, Object> data, boolean includeShipWorker) throws Exception { Path agentsDir = ctx.projectDir().resolve(".opencode/agents"); diff --git a/kit/camel-kit-core/src/test/java/org/apache/camel/kit/generator/OpenCodeGeneratorTest.java b/kit/camel-kit-core/src/test/java/org/apache/camel/kit/generator/OpenCodeGeneratorTest.java index 7bfd50b8..82f130f8 100644 --- a/kit/camel-kit-core/src/test/java/org/apache/camel/kit/generator/OpenCodeGeneratorTest.java +++ b/kit/camel-kit-core/src/test/java/org/apache/camel/kit/generator/OpenCodeGeneratorTest.java @@ -5,7 +5,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.PosixFileAttributeView; import java.nio.file.attribute.PosixFilePermission; -import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Set; @@ -1160,11 +1159,9 @@ class OpenCodeGeneratorTest { @Test void shipWorkerDeniesServersFromAncestorConfig() throws Exception { - InitContext ctx = createContext(); - - Path ancestorDir = tempDir.getParent(); - Path ancestorConfig = ancestorDir.resolve("opencode.json"); - Files.writeString(ancestorConfig, """ + Path projectDir = tempDir.resolve("project"); + Files.createDirectories(projectDir); + Files.writeString(tempDir.resolve("opencode.json"), """ { "mcp": { "ancestor-probe": {"type": "local", "command": ["echo"], "enabled": true} @@ -1172,22 +1169,29 @@ class OpenCodeGeneratorTest { } """); - try { - new OpenCodeGenerator().generate(ctx); + AgentConfig agent = AgentRegistry.get("opencode"); + String agentBaseFolder = agent.folder().substring(0, agent.folder().lastIndexOf("/")); + InitContext ctx = new InitContext( + agent, "opencode", + projectDir.resolve(agent.folder()), + projectDir.resolve(agentBaseFolder + "/skills"), + projectDir, + "camel-kit", DistributionConfig.loadFromClasspathOrDefaults(), + true, Printer.noop()); - String worker = Files.readString( - tempDir.resolve(".opencode/agents/camel-ship-worker.md")); - assertTrue(worker.contains("ancestor-probe_*: deny"), - "Ship worker must deny MCP servers inherited from ancestor config"); - } finally { - Files.deleteIfExists(ancestorConfig); - } + new OpenCodeGenerator().generate(ctx); + + String worker = Files.readString( + projectDir.resolve(".opencode/agents/camel-ship-worker.md")); + assertTrue(worker.contains("ancestor-probe_*: deny"), + "Ship worker must deny MCP servers inherited from ancestor config"); } @Test - void collectMcpServersFromFileHandlesGlobalConfig() throws Exception { - Path globalConfig = tempDir.resolve("global-opencode.json"); - Files.writeString(globalConfig, """ + void shipWorkerDeniesServersFromGlobalConfig() throws Exception { + Path globalDir = tempDir.resolve("fake-global"); + Files.createDirectories(globalDir); + Files.writeString(globalDir.resolve("opencode.json"), """ { "mcp": { "global-probe": {"type": "local", "command": ["echo"], "enabled": true} @@ -1195,31 +1199,70 @@ class OpenCodeGeneratorTest { } """); - Set<String> names = new LinkedHashSet<>(); - OpenCodeGenerator.collectMcpServersFromFile(globalConfig, names); - assertTrue(names.contains("global-probe"), - "collectMcpServersFromFile must extract servers from global-style config"); + OpenCodeGenerator gen = new OpenCodeGenerator() { + @Override + Path globalConfigDir() { + return globalDir; + } + }; + InitContext ctx = createContext(); + gen.generate(ctx); + + String worker = Files.readString( + tempDir.resolve(".opencode/agents/camel-ship-worker.md")); + assertTrue(worker.contains("global-probe_*: deny"), + "Ship worker must deny MCP servers from global config"); } @Test - void collectMcpServersFromFileHandlesNativeGlobalConfig() throws Exception { - Path globalConfig = tempDir.resolve("global-opencode.json"); - Files.writeString(globalConfig, """ + void shipWorkerDeniesServersFromExplicitConfig() throws Exception { + Path explicitFile = tempDir.resolve("explicit-opencode.json"); + Files.writeString(explicitFile, """ { "mcp": { - "servers": { - "global-native": {"type": "local", "command": ["echo"], "enabled": true} - } + "explicit-probe": {"type": "local", "command": ["echo"], "enabled": true} } } """); - Set<String> names = new LinkedHashSet<>(); - OpenCodeGenerator.collectMcpServersFromFile(globalConfig, names); - assertTrue(names.contains("global-native"), - "collectMcpServersFromFile must extract servers from native mcp.servers format in global config"); - assertFalse(names.contains("servers"), - "collectMcpServersFromFile must not treat native servers container as a server"); + OpenCodeGenerator gen = new OpenCodeGenerator() { + @Override + Path explicitConfigFile() { + return explicitFile; + } + }; + InitContext ctx = createContext(); + gen.generate(ctx); + + String worker = Files.readString( + tempDir.resolve(".opencode/agents/camel-ship-worker.md")); + assertTrue(worker.contains("explicit-probe_*: deny"), + "Ship worker must deny MCP servers from OPENCODE_CONFIG"); + } + + @Test + void shipWorkerDeniesServersFromInlineConfigContent() throws Exception { + String inlineJson = """ + { + "mcp": { + "inline-probe": {"type": "local", "command": ["echo"], "enabled": true} + } + } + """; + + OpenCodeGenerator gen = new OpenCodeGenerator() { + @Override + String inlineConfigContent() { + return inlineJson; + } + }; + InitContext ctx = createContext(); + gen.generate(ctx); + + String worker = Files.readString( + tempDir.resolve(".opencode/agents/camel-ship-worker.md")); + assertTrue(worker.contains("inline-probe_*: deny"), + "Ship worker must deny MCP servers from OPENCODE_CONFIG_CONTENT"); } @Test
