- /create-agent SKILL.md: pipeline 8 pasos del script, pasos 8-12 post
- /create-bot SKILL.md: pipeline con health check y self-introduce
- CLAUDE.md: seccion breve de pipeline de 12 pasos con env var clave
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Actualiza create_agent.md con el pipeline completo (12 pasos) al inicio
de la guia, referenciando los scripts de cada paso.
Actualiza system prompt de father-bot con:
- Pipeline de 12 pasos explicito con "nunca saltar pasos"
- Health check (paso 11) via health-check.sh antes de confirmar
- Self-introduce (paso 12) via notify-developer.sh
- Paso de reporte incluye confirmacion de health check y notify
- Manejo de errores para health check y notify
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pipeline de creacion formalizado con 3 mejoras:
1. Display name automatico (paso 7): create-full.sh ahora configura
el display name en Matrix via PUT al profile API con el token
del bot recien creado. Evita que los bots aparezcan como @id:server.
2. Health check post-arranque: nuevo script health-check.sh que busca
en los logs del launcher mensajes de arranque exitoso ("e2ee ready",
"runner started", etc.) con timeout configurable (default 30s).
3. Notificacion enriquecida: notify-developer.sh ahora incluye
descripcion del agente (leida de config.yaml), tools habilitadas,
formato markdown con estructura clara, y reintentos con backoff
(hasta 3 intentos) si el envio de DM falla.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pipeline de 12 pasos obligatorios:
scaffold → build → register → verify E2EE → [convert robot] →
auto-avatar → display name → personalize → rebuild → start →
health check → self-introduce (el bot habla a devs)
Nuevos pasos: display name automatico, health check post-arranque,
y mejora del mensaje de bienvenida. Garantiza consistencia entre
creacion manual (dev-scripts) y via father-bot.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Test de integracion real que:
1. Crea DM con father-bot via Matrix SDK
2. Pide crear un robot simple (e2e-father-test)
3. Espera respuesta de father-bot (timeout 9min, claude-code)
4. Verifica: config.yaml (type: robot), agent.go, compilacion, blank import
5. Cleanup automatico: borra agente, import y env vars
Validado: father-bot creo el robot en ~3min con reporte estructurado.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
El usuario principal del servidor no estaba en el grupo admins,
causando que father-bot (y cualquier agente con ACL restrictivo)
denegara el acceso. Solo @admin estaba listado.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Primer agente privilegiado en agents/_specials/. Usa claude-code provider
con acceso completo al repo para crear agentes y robots via Matrix.
Cambios principales:
- father-bot: agent.go, config.yaml (claude-code, E2EE, audit, sanitize),
system prompt con guia de creacion completa y seguridad anti-injection
- Launcher: descubre configs en _specials/ con validacion de tipo
- Seguridad: grupo privileged (admin-only), reestructura de all → general
para evitar ACL union con everyone
- dev-scripts: _common.sh escanea _specials/ en config_path_for y list_agents_raw
- Issue 0043 creado para guardrails de seguridad futuros
- Tests: ACL privileged vs general, isSpecialConfig, 11 E2E tests
Implementado como father-bot en agents/_specials/father-bot/.
Mover issue a completed/ y actualizar README.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
11 tests que verifican:
- agent.go puro (sin imports I/O, registra Rules con ActionKindLLM)
- config.yaml: claude-code provider, bypassPermissions, E2EE, sanitize, audit
- system prompt: guia de creacion, decision tree, convenciones, seguridad
- launcher: import de _specials/father-bot, discovery de _specials/
- security: father-bot en grupo privileged, solo admins en permissions.yaml,
NO en grupo general (evita ACL union)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- TestResolveACL_PrivilegedVsGeneral: verifica que father-bot solo
es accesible por admins y que agentes generales son accesibles
por todos. Reproduce la config real de produccion.
- TestIsSpecialConfig_*: 3 tests para la funcion que detecta
configs de SpecialConfig ya cargados (orchestrator) y los salta
en el loop de discovery normal del launcher.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reestructura los grupos de seguridad para soportar agentes privilegiados:
- Nuevo grupo 'privileged' con father-bot (solo admins)
- Reemplaza grupo 'all' (wildcard) con 'general' (lista explicita)
para evitar que el ACL union otorgue permisos de everyone a father-bot
- Documenta en YAML que el ACL es acumulativo y por que privileged
y general deben ser mutuamente excluyentes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Primer agente privilegiado en agents/_specials/. Usa provider claude-code
con acceso completo al repositorio para ejecutar el pipeline de creacion
de agentes de forma autonoma (scaffold, build, register, verify, restart).
Archivos:
- agent.go: reglas puras (DM/mention → LLM)
- config.yaml: claude-code provider, bypassPermissions, E2EE, audit
- prompts/system.md: guia completa de creacion con decision tree,
convencion de IDs, validaciones y seccion anti-injection
Config: claude-code con working_dir al repo, allowed_tools restringido,
model sonnet, timeout 10m, add_dirs con templates y referencias.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
El launcher ahora escanea agents/_specials/*/config.yaml ademas de
agents/*/config.yaml para descubrir agentes del sistema con identidad
Matrix (ej: father-bot). Los SpecialConfig ya cargados (orchestrator)
se detectan y saltan via isSpecialConfig() para evitar errores de
validacion.
Tambien actualiza dev-scripts/_common.sh para que config_path_for()
y list_agents_raw() incluyan _specials/ en la busqueda.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Issue futuro para implementar capas adicionales de seguridad:
- Developer allowlist via .env (deny-by-default)
- Path scoping para el subprocess claude-code
- Rate limiting de operaciones de creacion
- Audit trail extendido
- Validacion de configs de agentes creados
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Refactoriza profile.go separando UploadMedia/SetAvatarURL, añade sistema
de generacion automatica de avatares (DiceBear, RoboHash, Multiavatar)
con pkg/avatar (puro) + shell/avatar (impuro), nuevo comando
agentctl auto-avatar, e integracion en create-full.sh.
Documenta el diseño completo: proveedores (DiceBear, RoboHash, Multiavatar),
arquitectura pure/impure, integracion CLI y pipeline.
Todas las tareas completadas.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
create-full.sh ahora genera y aplica un avatar automatico tras registrar
el agente en Matrix. Usa agentctl auto-avatar internamente.
Si falla (sin internet, proveedor caido), continua sin bloquear el pipeline.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- pkg/avatar: 13 tests cubriendo todos los proveedores, estilos, sets,
edge cases (size=0, unknown provider, chars especiales, determinismo)
- shell/avatar: 6 tests con httptest server local (download OK, JPEG,
HTTP 404, context cancelled, extensiones por content-type)
No requiere acceso a internet — shell/avatar usa httptest.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nuevo sistema de generacion automatica de avatares:
- pkg/avatar/ — tipos puros y URL builders para proveedores gratuitos:
DiceBear (bottts, pixel-art, etc.), RoboHash (robots, monsters),
Multiavatar (multicultural). Sin I/O.
- shell/avatar/ — fetcher impuro: descarga imagen por HTTP a temp file.
- agentctl auto-avatar <id> — genera, descarga, sube y activa avatar
con un solo comando. Soporta --provider, --style, --set, --dry-run.
Respeta pure core / impure shell. El seed del avatar es el agent ID,
asi cada bot obtiene una imagen unica y determinista.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Expone las funciones separadas de profile.go como CLI:
- agentctl upload-media <id> <path> — sube sin activar avatar
- agentctl set-avatar-url <id> <mxc://...> — activa un mxc ya subido
Complementa la refactorizacion de shell/matrix/profile.go.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SetAvatar hacia dos cosas: subir la imagen y establecerla como avatar.
Ahora son tres funciones separadas:
- UploadMedia: solo sube, devuelve mxc:// URI
- SetAvatarURL: solo establece avatar con un mxc:// URI existente
- SetAvatar: convenience wrapper que llama a ambas
Permite subir imagenes sin activar el avatar, o reusar imagenes ya subidas.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Establece la convención de que directorios con prefijo _ en agents/
son del sistema (templates, specials), no agentes desplegables.
Cambios:
- Renombrar agents/specials/ → agents/_specials/
- Actualizar path en cmd/launcher/main.go (startOrchestrator)
- Documentar convención _ en CLAUDE.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
agents/ ahora solo contiene carpetas de agentes.
El runtime (Agent, Robot, Runner, registry, handler) vive en devagents/.
Tambien se crean 6 nuevos issues: streaming, creator-bot, widgets,
recordatorios, voz, videollamadas.
Issues planificados:
- 0036: Claude Code streaming de progreso en Matrix
- 0037: Agente que crea otros agentes/bots via Matrix
- 0038: Webapps y dashboards embebidos en Element via widgets
- 0039: Recordatorios dinámicos y crons que invocan agentes
- 0040: Soporte para mensajes de voz (audio → STT)
- 0041: Videollamadas con agentes via LiveKit
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Añadir test-personality a tabla de agentes
- Añadir nuevos specs E2E a la lista de tests
- Mover issue a completed, actualizar README
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tests funcionales (test-personality.spec.ts):
- Saludo con personalidad pirata espacial (keywords flexibles)
- Personalidad consistente en respuestas serias (fotosintesis + pirata)
- !help y !ping funcionan (assertions estrictas)
- Sin errores E2EE
Tests de pipeline (create-agent-pipeline.spec.ts):
- Valida agent.go con Rules() y ActionKindLLM
- Config sin type: robot (es agent por defecto)
- System prompt con personalidad + seccion de seguridad
- LLM configurado (openai/gpt-4o)
- Encryption habilitada, import en launcher
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Añadir test-bot a tabla de agentes en CLAUDE.md
- Añadir nuevos specs E2E a la lista de tests
- Mover issue a completed, actualizar README
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- /create-bot: usa create-full.sh --type robot (pipeline de 6 pasos)
- /create-agent: documenta --type robot y notificacion a developers
- Referencia actualizada: agents/test-bot/ como ejemplo de robot
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nuevos scripts:
- convert-to-robot.sh: convierte scaffold de agente a robot (config
minimo, agent.go con nil Rules, sin prompts, command_prefix vacio)
- notify-developer.sh: envia DM a los developers (DEVELOPER_MATRIX_USERS)
al crear un bot o agente, presentandose con nombre y tipo
Mejorado:
- create-full.sh: acepta --type robot para pipeline completo de robots
(scaffold → build → register → verify → convert → notify)
- .env.example: añade DEVELOPER_MATRIX_USERS para lista de developers
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- internal/config/loader.go: skip validacion de LLM provider cuando
agent.type es "robot" — los robots no usan LLM
- agents/test-bot/config.yaml: usar command_prefix: "" para que acepte
comandos sin prefijo ! (feature del issue 0033)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- !echo <texto>: repite el texto recibido (util para assertions exactas)
- !dice / !dado: lanza un dado aleatorio (1-6)
- Registro en cmd/launcher/main.go via testbot.Commands()
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tambien resuelve conflicto de test helper newTestAgent entre
runtime_test.go (issue 0029) y commands_metrics_test.go (issue 0035)
renombrando el segundo a newMetricsTestAgent.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Mueve el issue a dev/issues/completed/ tras implementar todas las tareas:
audit trail con AuditWriter y comando !metrics.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implementa el comando built-in !metrics que lee los JSONL logs del dia
actual usando shell/logger/query.go y calcula agregados en memoria:
- Mensajes recibidos (handling event)
- Comandos ejecutados (command_received)
- Llamadas LLM (count, tokens totales, latencia media)
- Llamadas a tools (count, errores)
- Errores totales (nivel ERROR)
- Total de entradas de log
El comando se registra como built-in disponible para todos los agentes.
Recibe logDir via Option pattern (WithLogDir) para no romper la firma
de agents.New(). El launcher pasa logDir al crear cada agente.
Formatea la salida como tabla markdown para Matrix.
Incluye tests unitarios con logs JSONL sinteticos.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Crea shell/audit/ con Writer que escribe eventos de auditoria a archivo
JSONL y opcionalmente a un room Matrix. Integra la emision de eventos
en los puntos clave del runtime:
- message_received: al recibir cualquier evento Matrix (handler.go)
- command_exec: al ejecutar un comando (handler.go)
- tool_exec: al ejecutar una tool (tools/registry.go via AuditFunc callback)
- llm_request / llm_error: al llamar al LLM (llm.go)
El Writer se inicializa en agents/runtime.go si security.audit.enabled=true.
Usa patron de inyeccion de dependencias (MatrixSender como funcion,
AuditFunc como callback) para evitar acoplamiento entre packages.
Incluye tests completos para el Writer: escritura JSONL, filtrado por
Include, modo solo-file, modo solo-room, auto-set de timestamp.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Agregar seccion "Comandos sin prefijo (robots)" que explica como configurar
command_prefix: "" para robots que no requieren el prefijo ! en sus comandos.
Tests del parser (pkg/message/parse_test.go):
- Con prefijo !: comando estandar, con args, sin prefijo no detecta, lowercase
- Sin prefijo: comando bare, con args, ! retrocompatible, primer token, lowercase
- Casos borde: mensaje vacio, solo espacios, solo "!"
- Retrocompatibilidad: "!help" con prefix="" produce mismo resultado que con "!"
- Deteccion de menciones independiente del modo de prefijo
Tests del robot (agents/robot_test.go):
- !help muestra comandos sin ! cuando command_prefix es ""
- Comandos custom en modo sin prefijo
- Mismo conjunto de built-ins en ambos modos
- newTestRobot ahora configura command_prefix: "!" explicitamente
Cuando command_prefix es "" en el config, el parser trata el primer token
del mensaje como nombre de comando sin requerir el prefijo !. Si el token
empieza con !, se le quita igualmente para retrocompatibilidad.
Cambios:
- pkg/message/parse.go: modo sin prefijo en Parse() (puro, sin side effects)
- agents/robot.go: mensaje "comando desconocido" y !help adaptados al prefijo
- agents/handler.go: mensaje "comando desconocido" adaptado al prefijo
- internal/config/schema.go: documentar command_prefix: "" en FiltersCfg
- agents/_template_robot/config.yaml: ejemplo comentado de command_prefix: ""
El comportamiento con command_prefix: "!" no cambia (retrocompatible).
Mover issue 0029-core-tests a completed/ tras implementar todos los
tests del runtime y config loader.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tests de command routing: builtin help/ping, comando desconocido,
RegisterCommand, alias, ACL deniega comando.
Tests de reglas + LLM: DM sin reglas cae a LLM, DM sin LLM ignora,
regla matchea ejecuta accion, ActionKindReply estatico, ActionKindLLM
invoca CompleteFunc, mencion sin reglas cae a LLM, mensaje sin match
ni mencion se ignora, LLM action sin LLM configurado.
Tests de tool-use loop: tool call ejecuta y retorna, tool call falla
pasa error al LLM, max iterations se respeta, RBAC deniega tool call,
error de LLM se propaga.
Infraestructura: mockCompleteFunc con respuestas configurables,
spyMatrixSender que graba mensajes, newTestAgent minimal.
Cobertura: handleEvent 86%, executeActions 79%, runLLM 85%
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>