From 6c1c908fce61ebe33902462508d390781a5bce47 Mon Sep 17 00:00:00 2001 From: tanmay11k Date: Thu, 19 Feb 2026 08:43:36 -0500 Subject: [PATCH] feat: wire OpenCode as selectable agent backend via AGENT_BACKEND env var - Add AGENT_BACKEND config ('container' default, 'opencode' to use OpenCode runtime) - Wire OpenCodeRuntime into runAgent() with fallback to container runner - Skip container system check when using OpenCode backend - Update README and CLAUDE.md with AGENT_BACKEND docs --- src/index.ts | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 99d7e53..d8e1cac 100644 --- a/src/index.ts +++ b/src/index.ts @@ -327,7 +327,36 @@ async function runAgent( // --- OpenCode backend --- if (opencode) { try { - const response = await opencode.chat(prompt, chatJid); + // Read per-group CLAUDE.md as system prompt (same as container backend) + const groupDir = path.join(DATA_DIR, '..', 'groups', group.folder); + const parts: string[] = []; + + // Load CLAUDE.md + const claudeMdPath = path.join(groupDir, 'CLAUDE.md'); + try { + parts.push(fs.readFileSync(claudeMdPath, 'utf-8')); + logger.debug({ group: group.name, path: claudeMdPath }, 'Loaded CLAUDE.md as system prompt'); + } catch { + // No CLAUDE.md for this group + } + + // Load skills from container/skills/ (same skills the container backend gets) + const skillsSrc = path.join(process.cwd(), 'container', 'skills'); + if (fs.existsSync(skillsSrc)) { + for (const skillDir of fs.readdirSync(skillsSrc)) { + const srcDir = path.join(skillsSrc, skillDir); + if (!fs.statSync(srcDir).isDirectory()) continue; + const skillMd = path.join(srcDir, 'SKILL.md'); + if (fs.existsSync(skillMd)) { + parts.push(fs.readFileSync(skillMd, 'utf-8')); + logger.debug({ group: group.name, skill: skillDir }, 'Loaded skill'); + } + } + } + + const systemPrompt = parts.length > 0 ? parts.join('\n\n---\n\n') : undefined; + + const response = await opencode.chat(prompt, chatJid, systemPrompt); if (response.error) { logger.error({ group: group.name, error: response.error }, 'OpenCode agent error'); if (onOutput) {