feat: desacoplar launcher del registro estatico de agentes

Introduce un registro global de reglas en agents/registry.go con
Register() y GetRules(). Cada paquete de agente se auto-registra
via init(), eliminando la necesidad de editar manualmente el map
rulesRegistry en cmd/launcher/main.go.

Cambios:
- agents/registry.go: nuevo registro global con sync.RWMutex
- agents/*/agent.go: cada agente llama agents.Register() en init()
- agents/_template/agent.go: placeholder AGENT_ID_PLACEHOLDER para scaffold
- cmd/launcher/main.go: elimina rulesRegistry, usa blank imports +
  agents.GetRules() para obtener reglas por agent ID

Patron: init() + blank import (estandar Go: database/sql, image codecs)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-08 23:00:08 +00:00
parent fc235c71c6
commit 0cd7e36a14
6 changed files with 96 additions and 15 deletions
+11 -14
View File
@@ -20,9 +20,6 @@ import (
"github.com/spf13/cobra"
"github.com/enmanuel/agents/agents"
assistantagent "github.com/enmanuel/agents/agents/assistant-bot"
asistente2agent "github.com/enmanuel/agents/agents/asistente-2"
meteorologoagent "github.com/enmanuel/agents/agents/meteorologo"
"github.com/enmanuel/agents/internal/config"
"github.com/enmanuel/agents/pkg/decision"
"github.com/enmanuel/agents/pkg/orchestration"
@@ -31,15 +28,12 @@ import (
agentlog "github.com/enmanuel/agents/shell/logger"
orchshell "github.com/enmanuel/agents/shell/orchestration"
shellsecurity "github.com/enmanuel/agents/shell/security"
)
// rulesRegistry maps agent IDs to their rule factories.
// Add a new entry here when you create a new agent package.
var rulesRegistry = map[string]func() []decision.Rule{
"assistant-bot": assistantagent.Rules,
"asistente-2": asistente2agent.Rules,
"meteorologo": meteorologoagent.Rules,
}
// Blank imports: each agent self-registers its rules via init().
_ "github.com/enmanuel/agents/agents/assistant-bot"
_ "github.com/enmanuel/agents/agents/asistente-2"
_ "github.com/enmanuel/agents/agents/meteorologo"
)
func main() {
var (
@@ -289,10 +283,13 @@ func startOrchestrator(agentBus *bus.Bus, logger *slog.Logger) (*orchHandle, err
return &orchHandle{orchestrator: orch, cfg: cfg}, nil
}
// rulesFor retrieves the rule factory for the given agent ID from the
// global registry (populated by init() in each agent package).
// Returns nil if no rules are registered (command-only bot).
func rulesFor(agentID string, logger *slog.Logger) []decision.Rule {
factory, ok := rulesRegistry[agentID]
if !ok {
logger.Warn("no rules registered for agent, using empty ruleset", "id", agentID)
factory := agents.GetRules(agentID)
if factory == nil {
logger.Warn("no rules registered for agent, using empty ruleset (command-only)", "id", agentID)
return nil
}
return factory()