refactor: mover runtime Go de agents/ a devagents/

agents/ ahora solo contiene carpetas de agentes (config, reglas, prompts).
El runtime (Agent, Robot, Runner, registry, handler, commands, llm, memory)
vive en devagents/ como package devagents.

Cambios:
- git mv agents/*.go → devagents/*.go
- package agents → package devagents en todos los archivos movidos
- Actualizar imports en agents/*/agent.go, cmd/launcher/, dev-scripts/
- Actualizar docs: CLAUDE.md, rules/, docs/e2ee.md, issues pendientes

Build y tests pasan sin errores.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-09 21:19:25 +00:00
parent 52d5632d89
commit bd0c8c0dd3
30 changed files with 61 additions and 59 deletions
+8 -7
View File
@@ -9,10 +9,11 @@ Monorepo Go para bots Matrix autonomos. Modulo: `github.com/enmanuel/agents`.
### 1. Functional PRogramming: Pure core / Impure shell
```
pkg/ → PURO: tipos, funciones puras, cero side effects
shell/ → IMPURO: todo I/O (Matrix, LLM, SSH, filesystem)
agents/ composicion: reglas puras + ensamblado con shell
tools/ → Def (puro) + Exec (impuro)
pkg/ → PURO: tipos, funciones puras, cero side effects
shell/ → IMPURO: todo I/O (Matrix, LLM, SSH, filesystem)
devagents/ → runtime: Agent/Robot ensambla core + shell
agents/ reglas puras por agente + config.yaml + prompts
tools/ → Def (puro) + Exec (impuro)
```
**Nunca** side effects en `pkg/`. El core produce `[]decision.Action` (datos puros), el shell los interpreta.
@@ -56,9 +57,9 @@ shell/mcp/ cliente y servidor MCP (Model Context Protocol)
shell/skills/ loader (filesystem) + executor (scripts)
shell/effects/ Runner: []Action → side effects
shell/bus/ comunicacion inter-agente
agents/types.go Runner interface (comun a Agent y Robot)
agents/runtime.go Agent{}: ensambla core + shell (runtime completo con LLM)
agents/robot.go Robot{}: runtime ligero command-only (sin LLM, reglas, memoria)
devagents/types.go Runner interface (comun a Agent y Robot)
devagents/runtime.go Agent{}: ensambla core + shell (runtime completo con LLM)
devagents/robot.go Robot{}: runtime ligero command-only (sin LLM, reglas, memoria)
agents/<id>/ agent.go (reglas puras) + config.yaml + prompts/system.md
tools/ tool registry + tool implementations (subpackages)
tools/mcptools/ bridge: convierte MCP tools → tools.Tool
+6 -6
View File
@@ -7,7 +7,7 @@ Guia ejecutable para Claude. Seguir paso a paso sin desviarse.
| | Agent | Robot |
|---|---|---|
| **Cuando usar** | Necesita LLM, reglas, memoria, tools | Solo responde comandos (!xxx) |
| **Runtime** | `agents.New()` — completo | `agents.NewRobot()` — ligero |
| **Runtime** | `devagents.New()` — completo | `devagents.NewRobot()` — ligero |
| **Config type** | `type: agent` (default) | `type: robot` |
| **LLM** | Si | No |
| **Reglas** | Si (`agent.go` con `Rules()`) | No (sin `agent.go`) |
@@ -57,12 +57,12 @@ Template base (generado por el scaffold):
package <pkgname> // sin guiones: "monitor-bot" → package monitor (strip hyphens, strip _bot)
import (
"github.com/enmanuel/agents/agents"
"github.com/enmanuel/agents/devagents"
"github.com/enmanuel/agents/pkg/decision"
)
func init() {
agents.Register("<agent-id>", Rules)
devdevagents.Register("<agent-id>", Rules)
}
func Rules() []decision.Rule {
@@ -84,7 +84,7 @@ func Rules() []decision.Rule {
**Reglas estrictas:**
- **PURO**: solo imports de `pkg/decision` y `agents` (para Register), cero I/O, cero side effects
- **Auto-registro**: cada agente se registra via `init()` con `agents.Register("<agent-id>", Rules)`
- **Auto-registro**: cada agente se registra via `init()` con `devagents.Register("<agent-id>", Rules)`
- Package name = ID sin guiones ni `_bot` (e.g. `monitor-bot``package monitor`)
- **No usar reglas para comandos** (`!help`, `!ping`, etc.) — los comandos se gestionan via `RegisterCommand` (ver policy `create_command.md`)
- Las reglas solo aplican a mensajes normales (sin prefijo `!`)
@@ -174,7 +174,7 @@ _ "github.com/enmanuel/agents/agents/<agent-id>"
Las reglas se registran automáticamente via `init()` en el paquete del agente.
No se necesita editar ningún map ni registry manualmente.
**El ID en `agents.Register()` DEBE coincidir exactamente con `agent.id` en config.yaml.**
**El ID en `devagents.Register()` DEBE coincidir exactamente con `agent.id` en config.yaml.**
## Convención de env vars — REGLA CRÍTICA
@@ -228,7 +228,7 @@ tail -f run/launcher.log
- **Nunca** side effects en `agent.go`
- **Siempre** compilar con `-tags goolm`
- **Siempre** que `agent.id` coincida entre config.yaml, `agents.Register()` y directorio
- **Siempre** que `agent.id` coincida entre config.yaml, `devagents.Register()` y directorio
- **No** crear `data/` manualmente — se auto-genera
- **No** commitear tokens ni passwords
- **No** compartir crypto stores entre agentes
+3 -3
View File
@@ -28,7 +28,7 @@ Todos los agentes los tienen automáticamente: `!help`, `!ping`, `!tools`, `!too
### Agent-specific (por agente)
Se registran con `agent.RegisterCommand(spec, handler)` en el launcher, después de `agents.New()` y antes de `agent.Run()`.
Se registran con `agent.RegisterCommand(spec, handler)` en el launcher, después de `devagents.New()` y antes de `agent.Run()`.
## Pasos para crear un comando de agente
@@ -79,10 +79,10 @@ type CommandEntry struct {
### 2. Registrar en el launcher (`cmd/launcher/main.go`)
Después de `agents.New()` y antes de `wg.Add(1)`:
Después de `devagents.New()` y antes de `wg.Add(1)`:
```go
a, err := agents.New(cfg, rules, agentLogger)
a, err := devagents.New(cfg, rules, agentLogger)
if err != nil { ... }
// Register agent-specific commands
+1 -1
View File
@@ -41,7 +41,7 @@ func NewMiTool(/* deps */) Tool {
}
```
### 2. Registrar en `agents/runtime.go` → `buildToolRegistry()`
### 2. Registrar en `devagents/registry_build.go` → `buildToolRegistry()`
```go
if /* condición basada en config */ {
+2 -1
View File
@@ -66,5 +66,6 @@ Filosofia completa documentada en `CLAUDE.md` seccion "Trunk-based development".
Todas las reglas respetan el patron **pure core / impure shell**:
- `pkg/` es puro — nunca añadir side effects
- `shell/` es impuro — todo I/O va aqui
- `agents/` compone ambos — reglas puras + ensamblado con shell
- `devagents/` runtime: Agent/Robot ensambla core + shell
- `agents/` reglas puras por agente + config + prompts
- `tools/` sigue el mismo patron: `Def` (datos puros) + `Exec` (funcion impura)