feat: import agents_and_robots platform as unibots (Matrix-out, unibus transport)

Reemplaza el scaffold del echobot por la plataforma completa de bots traida
desde ~/DataProyects/Github/agents_and_robots tras la operacion Matrix-out:
los bots ya no hablan por Matrix sino por el bus unibus (modelo todo-rooms +
E2E via shell/transportunibus sobre github.com/enmanuel/unibus/pkg/client).

- go.mod: replace de unibus -> ../unibus y de fn-registry -> ../../../.. (paths
  relativos reajustados a la nueva ubicacion dentro de fn_registry).
- app.md: bump a 0.2.0, descripcion + arquitectura + comandos + gotchas reales.
- modulo Go conservado como github.com/enmanuel/agents (sin reescribir imports).

agents_and_robots queda archivado como museo de la era Matrix.
This commit is contained in:
agent
2026-06-07 11:50:13 +02:00
parent bb5b0e09b1
commit fc644ecd6e
308 changed files with 38829 additions and 474 deletions
+127
View File
@@ -0,0 +1,127 @@
package skills
import (
"context"
"os"
"path/filepath"
"strings"
"testing"
"time"
)
func TestExecutor(t *testing.T) {
tmpDir := t.TempDir()
// Create a simple bash script
scriptPath := filepath.Join(tmpDir, "test.sh")
scriptContent := `#!/bin/bash
echo "Hello from script"
echo "Args: $@"
`
if err := os.WriteFile(scriptPath, []byte(scriptContent), 0755); err != nil {
t.Fatal(err)
}
// Create a script that times out
timeoutScriptPath := filepath.Join(tmpDir, "timeout.sh")
timeoutContent := `#!/bin/bash
sleep 10
`
if err := os.WriteFile(timeoutScriptPath, []byte(timeoutContent), 0755); err != nil {
t.Fatal(err)
}
// Create a failing script
failScriptPath := filepath.Join(tmpDir, "fail.sh")
failContent := `#!/bin/bash
exit 1
`
if err := os.WriteFile(failScriptPath, []byte(failContent), 0755); err != nil {
t.Fatal(err)
}
executor := NewExecutor([]string{"bash", "sh"}, 2*time.Second)
// Test successful execution
t.Run("successful_execution", func(t *testing.T) {
ctx := context.Background()
output, err := executor.Run(ctx, scriptPath, []string{"arg1", "arg2"})
if err != nil {
t.Fatalf("Run failed: %v", err)
}
if !strings.Contains(output, "Hello from script") {
t.Errorf("expected 'Hello from script' in output, got: %q", output)
}
if !strings.Contains(output, "Args: arg1 arg2") {
t.Errorf("expected 'Args: arg1 arg2' in output, got: %q", output)
}
})
// Test timeout
t.Run("timeout", func(t *testing.T) {
ctx := context.Background()
_, err := executor.Run(ctx, timeoutScriptPath, nil)
if err == nil {
t.Error("expected timeout error")
}
if !strings.Contains(err.Error(), "timeout") {
t.Errorf("expected timeout error, got: %v", err)
}
})
// Test script failure
t.Run("script_failure", func(t *testing.T) {
ctx := context.Background()
_, err := executor.Run(ctx, failScriptPath, nil)
if err == nil {
t.Error("expected script failure error")
}
})
// Test disallowed interpreter
t.Run("disallowed_interpreter", func(t *testing.T) {
pyScriptPath := filepath.Join(tmpDir, "test.py")
pyContent := `#!/usr/bin/env python3
print("hello")
`
if err := os.WriteFile(pyScriptPath, []byte(pyContent), 0755); err != nil {
t.Fatal(err)
}
ctx := context.Background()
_, err := executor.Run(ctx, pyScriptPath, nil)
if err == nil {
t.Error("expected error for disallowed interpreter")
}
if !strings.Contains(err.Error(), "not allowed") {
t.Errorf("expected 'not allowed' error, got: %v", err)
}
})
// Test allowed python interpreter
t.Run("allowed_python", func(t *testing.T) {
pyExecutor := NewExecutor([]string{"python3"}, 2*time.Second)
pyScriptPath := filepath.Join(tmpDir, "hello.py")
pyContent := `#!/usr/bin/env python3
print("Hello from Python")
`
if err := os.WriteFile(pyScriptPath, []byte(pyContent), 0755); err != nil {
t.Fatal(err)
}
ctx := context.Background()
output, err := pyExecutor.Run(ctx, pyScriptPath, nil)
if err != nil {
t.Fatalf("Run failed: %v", err)
}
if !strings.Contains(output, "Hello from Python") {
t.Errorf("expected 'Hello from Python' in output, got: %q", output)
}
})
}