feat: sistema de personalidades enriquecido + agente template
Fase 1: Sistema de personalidades enriquecido - Ampliar PersonalityCfg con role, backstory, expertise, limitations - Añadir CommunicationCfg (formality, humor, personality, response_style, quirks, catchphrases) - Crear tipos puros en pkg/personality/traits.go - Implementar BuildPersonalityPrompt() para generar bloque de system prompt - Integrar personalidad en agents/runtime.go (FromConfig + concatenacion al system prompt) Fase 2: Agente plantilla - Añadir campo Template bool a AgentMeta - Filtrar agentes template en launcher (skip si template: true) - Crear agents/_template/ con config.yaml completo y documentado - Incluir TODAS las secciones (skills, shared_knowledge, schedules, security) - agent.go minimo + prompts/system.md plantilla - Actualizar dev-scripts/agent/new-agent.sh para copiar desde _template/ Fase 3: Ejemplos de personalidades - Crear agents/_template/PERSONALITIES.md con 4 perfiles: * DevOps pragmatico * Analista meticuloso * Asistente amigable * Guardian de seguridad 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -8,9 +8,9 @@
|
||||
# ./dev-scripts/agent/new-agent.sh monitor-bot "Monitor Agent"
|
||||
#
|
||||
# Crea:
|
||||
# agents/<agent-id>/config.yaml (basado en el assistant como plantilla)
|
||||
# agents/<agent-id>/agent.go (reglas puras vacías, listo para extender)
|
||||
# agents/<agent-id>/prompts/ (directorio para system prompt)
|
||||
# agents/<agent-id>/config.yaml (copiado desde agents/_template/)
|
||||
# agents/<agent-id>/agent.go (copiado desde agents/_template/)
|
||||
# agents/<agent-id>/prompts/ (copiado desde agents/_template/prompts/)
|
||||
# agents/<agent-id>/data/ (directorio de datos, en .gitignore)
|
||||
#
|
||||
# También te recuerda los dos pasos manuales que quedan.
|
||||
@@ -25,15 +25,30 @@ DISPLAYNAME="${2:-$ID}"
|
||||
PACKAGE="$(echo "$ID" | tr '-' '_' | sed 's/_bot//')" # "monitor-bot" → "monitor"
|
||||
NORM="$(normalize_id "$ID")" # "monitor-bot" → "MONITOR_BOT"
|
||||
DIR="agents/$ID"
|
||||
TEMPLATE="agents/_template"
|
||||
|
||||
[[ -d "$DIR" ]] && fail "Ya existe agents/$ID — ¿ya fue creado?"
|
||||
[[ ! -d "$TEMPLATE" ]] && fail "No existe el directorio _template en agents/_template/"
|
||||
|
||||
info "Creando scaffold para $ID..."
|
||||
info "Creando scaffold para $ID desde _template..."
|
||||
|
||||
mkdir -p "$DIR/prompts" "$DIR/data"
|
||||
|
||||
# ── config.yaml ────────────────────────────────────────────────────────────
|
||||
cat > "$DIR/config.yaml" <<YAML
|
||||
# ── Copiar config.yaml desde template y personalizar ─────────────────────
|
||||
cp "$TEMPLATE/config.yaml" "$DIR/config.yaml"
|
||||
sed -i "s/_template/$ID/g" "$DIR/config.yaml"
|
||||
sed -i "s/Template Agent/$DISPLAYNAME/g" "$DIR/config.yaml"
|
||||
sed -i "s/template: true/template: false/g" "$DIR/config.yaml"
|
||||
sed -i "s/enabled: true/enabled: true/g" "$DIR/config.yaml"
|
||||
sed -i "s/MATRIX_TOKEN_TEMPLATE/MATRIX_TOKEN_${NORM}/g" "$DIR/config.yaml"
|
||||
sed -i "s/PICKLE_KEY_TEMPLATE/PICKLE_KEY_${NORM}/g" "$DIR/config.yaml"
|
||||
sed -i "s/@template:matrix.example.com/@$ID:\${MATRIX_SERVER_NAME}/g" "$DIR/config.yaml"
|
||||
sed -i "s|https://matrix.example.com|\${MATRIX_HOMESERVER}|g" "$DIR/config.yaml"
|
||||
|
||||
ok "config.yaml creado desde template"
|
||||
|
||||
# DEPRECATED: generacion inline — ahora copiamos desde _template
|
||||
: <<'YAML'
|
||||
# ============================================
|
||||
# IDENTIDAD
|
||||
# ============================================
|
||||
@@ -291,56 +306,16 @@ storage:
|
||||
retention: 168h
|
||||
YAML
|
||||
|
||||
# ── agent.go ───────────────────────────────────────────────────────────────
|
||||
cat > "$DIR/agent.go" <<GO
|
||||
// Package $PACKAGE defines the pure rules for the $DISPLAYNAME.
|
||||
package $PACKAGE
|
||||
# ── Copiar agent.go desde template y personalizar ────────────────────────
|
||||
cp "$TEMPLATE/agent.go" "$DIR/agent.go"
|
||||
sed -i "s/_template/$PACKAGE/g" "$DIR/agent.go"
|
||||
sed -i "s/Package _template/Package $PACKAGE/g" "$DIR/agent.go"
|
||||
ok "agent.go creado desde template"
|
||||
|
||||
import "github.com/enmanuel/agents/pkg/decision"
|
||||
|
||||
// Rules returns the decision rules for the $ID.
|
||||
func Rules() []decision.Rule {
|
||||
return []decision.Rule{
|
||||
{
|
||||
Name: "help",
|
||||
Match: decision.MatchCommand("help"),
|
||||
Actions: []decision.Action{{
|
||||
Kind: decision.ActionKindReply,
|
||||
Reply: &decision.ReplyAction{
|
||||
Content: "Soy $DISPLAYNAME. Escríbeme lo que necesitas.",
|
||||
},
|
||||
}},
|
||||
},
|
||||
// Catch-all: DMs y menciones van al LLM
|
||||
{
|
||||
Name: "llm-fallback",
|
||||
Match: func(ctx decision.MessageContext) bool {
|
||||
return ctx.IsDirectMsg || ctx.IsMention
|
||||
},
|
||||
Actions: []decision.Action{{
|
||||
Kind: decision.ActionKindLLM,
|
||||
LLM: &decision.LLMAction{},
|
||||
}},
|
||||
},
|
||||
}
|
||||
}
|
||||
GO
|
||||
|
||||
# ── system prompt ──────────────────────────────────────────────────────────
|
||||
cat > "$DIR/prompts/system.md" <<MD
|
||||
# $DISPLAYNAME — System Prompt
|
||||
|
||||
Eres $DISPLAYNAME. Describe aquí el rol, capacidades y restricciones del agente.
|
||||
|
||||
## Rol
|
||||
...
|
||||
|
||||
## Capacidades
|
||||
...
|
||||
|
||||
## Restricciones
|
||||
...
|
||||
MD
|
||||
# ── Copiar prompts/system.md desde template y personalizar ───────────────
|
||||
cp "$TEMPLATE/prompts/system.md" "$DIR/prompts/system.md"
|
||||
sed -i "s/Template Agent/$DISPLAYNAME/g" "$DIR/prompts/system.md"
|
||||
ok "prompts/system.md creado desde template"
|
||||
|
||||
ok "Scaffold creado en $DIR/"
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user