- 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>
Añade un campo `sender effects.MatrixSender` al struct Agent que reemplaza
las llamadas directas a `a.matrix` para enviar mensajes (sendReply, typing,
SendMarkdown en handleTaskEvent). En produccion, sender apunta al mismo
*matrix.Client. Esto permite inyectar un spy en tests sin requerir una
conexion real a Matrix.
El campo `a.matrix` se mantiene para operaciones que no son de envio
(SetPresence, Raw, etc.).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Las fechas hardcoded (2026-02-24, 2026-03-01, 2026-03-06) quedaron fuera
del periodo de retención de 7 días al avanzar el calendario. Ahora el test
calcula las fechas relativas a time.Now() para que no caduque.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Activar AuditCfg existente en schema.go (nunca implementada) para
escribir eventos auditables a JSONL y opcionalmente a room Matrix.
Añadir comando !metrics que agrega datos del log del día actual
(tokens, latencia, errores) usando los helpers de query existentes.
Recupera los 4 comandos de .claude/commands/ que fueron eliminados
en ff7600d: create-issue, fix-issue, git-branch y git-push.
Son esenciales para el flujo TBD del proyecto.
Issue 0033: comandos de robots sin prefijo ! — permitir que robots
respondan a comandos sin necesitar el prefijo, usando command_prefix
vacio en config. Solo aplica a robots, agentes con LLM mantienen el
prefijo para distinguir comandos de mensajes naturales.
Issue 0034: E2E para skill /create-bot — crear robot de prueba
(test-bot) con comandos custom (!echo, !dice) y tests Playwright
que validen el pipeline de creacion y los comandos funcionales.
Equivalente al issue 0032 pero para robots en vez de agentes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Skill declarativa para crear robots (command-only, sin LLM) con el
pipeline completo: scaffold → build → register → verify → conversion
a robot. Incluye template de config.yaml minimalista y soporte para
comandos custom.
Diferencia con /create-agent: los robots no tienen LLM, reglas,
memoria ni system prompt. Solo responden a comandos.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Los issues 0027, 0028 y 0031 fueron reintroducidos por el merge de
quick/claude-skills (basada en master pre-limpieza). Se eliminan
definitivamente — las copias en completed/ son la version final.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tres mejoras basadas en problemas encontrados en ejecución real:
1. dangerouslyDisableSandbox: true en todas las llamadas Bash de agentes
paralelos para evitar prompts de permisos que bloquean la ejecución.
2. README centralizado: los agentes ya NO tocan dev/issues/README.md.
Solo mueven el archivo con git mv. El orquestador actualiza el índice
una sola vez después de integrar todos los merges. Esto elimina los
merge conflicts que causaban duplicados de issues.
3. Template de prompt mejorado: variable W para paths, ejemplos explícitos
de cómo llamar Bash con dangerouslyDisableSandbox, git mv en vez de mv.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>