@personnn/personnnkit
Version:
🇵 PersonnnKit - El Agente Kit Universal. Framework revolucionario para crear agentes de IA con HTML + Python. Simplicidad radical vs frameworks gigantes.
1,135 lines (954 loc) • 38.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.basicAgent = void 0;
exports.basicAgent = {
id: 'basic',
name: 'Agente Básico',
description: 'Plantilla básica con HTML, Python y tests para empezar rápidamente',
category: 'starter',
dependencies: [
'fastapi',
'uvicorn',
'requests',
'pytest',
'python-dotenv'
],
scripts: {
'start': 'npm run dev',
'dev': 'node runtime/dev-server.js',
'build': 'node runtime/build.js',
'test': 'python -m pytest tests/ -v',
'install': 'bash scripts/install.sh',
'setup': 'bash scripts/install.sh'
},
files: {
'pages/index.html': `
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PersonnnKit - El Futuro de los Agentes de IA</title>
<link href="./css/tailwind.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🇵</text></svg>">
<style>
:root {
--primary: #3B82F6;
--primary-dark: #1E40AF;
--secondary: #8B5CF6;
--accent: #06B6D4;
--success: #10B981;
--warning: #F59E0B;
--danger: #EF4444;
--background: #0F172A;
--surface: #1E293B;
--surface-light: #334155;
--text-primary: #F8FAFC;
--text-secondary: #CBD5E1;
--text-muted: #64748B;
--border: #475569;
--glow: rgba(59, 130, 246, 0.3);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', sans-serif;
background: linear-gradient(135deg, var(--background) 0%, #1E293B 100%);
color: var(--text-primary);
line-height: 1.6;
overflow-x: hidden;
}
.gradient-text {
background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.glass-card {
background: rgba(30, 41, 59, 0.7);
backdrop-filter: blur(20px);
border: 1px solid rgba(71, 85, 105, 0.3);
border-radius: 20px;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.glass-card:hover {
transform: translateY(-8px);
border-color: var(--primary);
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5), 0 0 30px var(--glow);
}
.btn-primary {
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
color: white;
border: none;
padding: 16px 32px;
border-radius: 16px;
font-weight: 600;
font-size: 16px;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.btn-primary::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
transition: left 0.5s;
}
.btn-primary:hover::before {
left: 100%;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 20px 40px rgba(59, 130, 246, 0.4);
}
.feature-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
margin: 3rem 0;
}
.hero-section {
text-align: center;
padding: 4rem 0;
position: relative;
}
.hero-section::before {
content: '';
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 200px;
height: 200px;
background: radial-gradient(circle, var(--glow) 0%, transparent 70%);
border-radius: 50%;
z-index: -1;
}
.code-block {
background: #0D1117;
border: 1px solid var(--border);
border-radius: 12px;
padding: 1.5rem;
font-family: 'SF Mono', Monaco, Consolas, monospace;
font-size: 14px;
overflow-x: auto;
position: relative;
}
.code-block::before {
content: '💻';
position: absolute;
top: 1rem;
right: 1rem;
font-size: 1.2rem;
}
.terminal {
background: linear-gradient(135deg, #0D1117 0%, #161B22 100%);
border: 1px solid var(--border);
border-radius: 16px;
padding: 2rem;
font-family: 'SF Mono', Monaco, Consolas, monospace;
min-height: 300px;
overflow-y: auto;
max-height: 500px;
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
margin-right: 8px;
}
.status-online { background: var(--success); animation: pulse 2s infinite; }
.status-processing { background: var(--warning); animation: pulse 1s infinite; }
.status-error { background: var(--danger); }
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
@keyframes float {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-10px); }
}
.floating { animation: float 3s ease-in-out infinite; }
.highlight-box {
background: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, rgba(139, 92, 246, 0.1) 100%);
border: 1px solid rgba(59, 130, 246, 0.3);
border-radius: 16px;
padding: 2rem;
margin: 2rem 0;
}
.step-indicator {
display: flex;
align-items: center;
margin: 1rem 0;
padding: 1rem;
background: rgba(30, 41, 59, 0.5);
border-radius: 12px;
border-left: 4px solid var(--primary);
}
.navbar {
background: rgba(15, 23, 42, 0.8);
backdrop-filter: blur(20px);
border-bottom: 1px solid rgba(71, 85, 105, 0.3);
position: sticky;
top: 0;
z-index: 100;
}
</style>
</head>
<body>
<!-- Navigation -->
<nav class="navbar">
<div class="max-w-7xl mx-auto px-6 py-4">
<div class="flex justify-between items-center">
<div class="flex items-center space-x-3">
<div class="text-3xl floating">🇵</div>
<div>
<h1 class="text-xl font-bold gradient-text">PersonnnKit</h1>
<p class="text-sm text-gray-400">Agente Kit Universal</p>
</div>
</div>
<div class="flex items-center space-x-4">
<div class="flex items-center space-x-2">
<span class="status-dot status-online"></span>
<span class="text-sm text-gray-300">Sistema Activo</span>
</div>
</div>
</div>
</div>
</nav>
<main class="max-w-7xl mx-auto px-6 py-8">
<!-- Hero Section -->
<section class="hero-section">
<div class="text-6xl mb-6 floating">🤖</div>
<h1 class="text-5xl md:text-7xl font-black mb-6">
<span class="gradient-text">PersonnnKit</span>
</h1>
<p class="text-2xl md:text-3xl text-gray-300 mb-4 font-light">
El Agente Kit Universal
</p>
<p class="text-xl text-gray-400 mb-8 max-w-3xl mx-auto">
La forma más simple y clara de crear agentes de IA.
<strong>Un agente es solo una carpeta con un HTML y un Python. Córrelo y ya.</strong>
</p>
<div class="highlight-box max-w-4xl mx-auto">
<h3 class="text-2xl font-bold mb-4 gradient-text">🧠 ¿Qué inventamos?</h3>
<p class="text-lg text-gray-300 mb-4">
Un formato de ejecución estándar para agentes de IA, que puede correr en local o en un VPS,
y que se construye con solo:
</p>
<div class="grid md:grid-cols-2 gap-4 mt-6">
<div class="step-indicator">
<span class="text-2xl mr-3">📄</span>
<div>
<strong>index.html</strong>
<p class="text-sm text-gray-400">Interfaz visual embebible o directa</p>
</div>
</div>
<div class="step-indicator">
<span class="text-2xl mr-3">🐍</span>
<div>
<strong>agent.py</strong>
<p class="text-sm text-gray-400">Código de IA, herramientas, flujo, tareas</p>
</div>
</div>
<div class="step-indicator">
<span class="text-2xl mr-3">⚡</span>
<div>
<strong>npm run agent</strong>
<p class="text-sm text-gray-400">Un comando y ya está corriendo</p>
</div>
</div>
<div class="step-indicator">
<span class="text-2xl mr-3">🔗</span>
<div>
<strong>Integración total</strong>
<p class="text-sm text-gray-400">iframe, streamlit, consola, web</p>
</div>
</div>
</div>
</div>
</section>
<!-- Why It's Revolutionary -->
<section class="my-16">
<h2 class="text-4xl font-bold text-center mb-12 gradient-text">🚀 ¿Por qué es revolucionario?</h2>
<div class="feature-grid">
<div class="glass-card p-8">
<div class="text-4xl mb-4">🔲</div>
<h3 class="text-2xl font-bold mb-4">Modularidad Real</h3>
<p class="text-gray-300">
Puedes copiar-pegar un agente y editarlo como un archivo cualquiera.
Sin abstracciones complicadas, sin magia oculta.
</p>
</div>
<div class="glass-card p-8">
<div class="text-4xl mb-4">🔁</div>
<h3 class="text-2xl font-bold mb-4">Dualidad Local/Web</h3>
<p class="text-gray-300">
Corre igual en tu PC que en la web. Desarrolla local,
despliega global. Sin cambios de código.
</p>
</div>
<div class="glass-card p-8">
<div class="text-4xl mb-4">⚡</div>
<h3 class="text-2xl font-bold mb-4">Despliegue Inmediato</h3>
<p class="text-gray-300">
Sin necesidad de Docker, FastAPI complejo o Nginx.
Aunque puedes integrarlos si quieres.
</p>
</div>
<div class="glass-card p-8">
<div class="text-4xl mb-4">🧠</div>
<h3 class="text-2xl font-bold mb-4">Código Explícito</h3>
<p class="text-gray-300">
Sin magia, sin hooks, sin abstracciones forzadas.
Ves exactamente qué hace tu agente.
</p>
</div>
<div class="glass-card p-8">
<div class="text-4xl mb-4">🧩</div>
<h3 class="text-2xl font-bold mb-4">Bridge Amigable</h3>
<p class="text-gray-300">
Sirve para desarrolladores, no-desarrolladores y
para que la IA entienda el proyecto.
</p>
</div>
<div class="glass-card p-8">
<div class="text-4xl mb-4">🎯</div>
<h3 class="text-2xl font-bold mb-4">Claridad Total</h3>
<p class="text-gray-300">
Mientras otros hacen frameworks gigantes, nosotros
proponemos simplicidad que funciona.
</p>
</div>
</div>
</section>
<!-- Demo Section -->
<section class="my-16">
<h2 class="text-4xl font-bold text-center mb-12 gradient-text">🎮 Prueba el Agente</h2>
<div class="grid lg:grid-cols-2 gap-8">
<div class="glass-card p-8">
<h3 class="text-2xl font-bold mb-6">🚀 Acciones del Agente</h3>
<div class="space-y-4">
<button onclick="runDemo('hello')" class="btn-primary w-full">
👋 Demostrar Saludo Inteligente
</button>
<button onclick="runDemo('explain')" class="btn-primary w-full">
🧠 Explicar PersonnnKit
</button>
<button onclick="runDemo('structure')" class="btn-primary w-full">
📁 Mostrar Estructura Simple
</button>
<button onclick="testConnection()" class="btn-primary w-full" style="background: linear-gradient(135deg, var(--accent) 0%, #0891B2 100%);">
🔌 Test de Conexión
</button>
</div>
<div class="mt-8 p-4 bg-gray-800 rounded-lg">
<h4 class="font-bold mb-2">💡 Estructura del Agente:</h4>
<div class="code-block text-sm">
mi-agente/
├── pages/index.html ← Esta interfaz
├── scripts/agent.py ← Lógica de IA
├── npm run dev ← Un comando
└── ¡Listo! 🎉</div>
</div>
</div>
<div class="glass-card p-8">
<div class="flex justify-between items-center mb-4">
<h3 class="text-2xl font-bold">📊 Terminal de Salida</h3>
<button onclick="clearTerminal()" class="px-4 py-2 bg-gray-700 rounded-lg text-sm hover:bg-gray-600 transition-colors">
🗑️ Limpiar
</button>
</div>
<div id="terminal" class="terminal">
<div class="text-green-400">✅ PersonnnKit Agent inicializado</div>
<div class="text-blue-400">🌟 Sistema listo para demostrar capacidades</div>
<div class="text-gray-400">💡 Haz clic en cualquier acción para ver la magia...</div>
</div>
</div>
</div>
</section>
<!-- Code Example -->
<section class="my-16">
<h2 class="text-4xl font-bold text-center mb-12 gradient-text">💻 Es Así de Simple</h2>
<div class="grid lg:grid-cols-2 gap-8">
<div class="glass-card p-8">
<h3 class="text-xl font-bold mb-4">📄 index.html</h3>
<div class="code-block">
<!DOCTYPE html>
<html>
<head>
<title>Mi Agente</title>
</head>
<body>
<h1>🤖 Mi Agente de IA</h1>
<button onclick="runAgent()">
Ejecutar
</button>
</body>
</html></div>
</div>
<div class="glass-card p-8">
<h3 class="text-xl font-bold mb-4">🐍 agent.py</h3>
<div class="code-block">
#!/usr/bin/env python3
import json
def main():
return {
"status": "success",
"message": "¡Hola desde PersonnnKit!",
"data": "Procesando..."
}
if __name__ == "__main__":
print(json.dumps(main()))</div>
</div>
</div>
<div class="text-center mt-8">
<div class="inline-block glass-card p-6">
<h3 class="text-xl font-bold mb-2">⚡ Ejecutar</h3>
<div class="code-block">
$ npm run dev
🚀 Agente corriendo en http://localhost:3333</div>
</div>
</div>
</section>
</main>
<!-- Footer -->
<footer class="border-t border-gray-800 mt-20 py-12">
<div class="max-w-7xl mx-auto px-6 text-center">
<div class="text-4xl mb-4">🇵</div>
<p class="text-xl text-gray-300 mb-2">
Construido con <span class="gradient-text font-bold">PersonnnKit</span>
</p>
<p class="text-gray-400">
El futuro de los agentes de IA es simple, claro y poderoso.
</p>
</div>
</footer>
<script>
const terminal = document.getElementById('terminal');
function addToTerminal(message, type = 'info') {
const timestamp = new Date().toLocaleTimeString();
const colors = {
success: 'text-green-400',
error: 'text-red-400',
warning: 'text-yellow-400',
info: 'text-blue-400'
};
const div = document.createElement('div');
div.className = colors[type] || 'text-gray-300';
div.innerHTML = \`[\${timestamp}] \${message}\`;
terminal.appendChild(div);
terminal.scrollTop = terminal.scrollHeight;
}
function clearTerminal() {
terminal.innerHTML = \`
<div class="text-green-400">✅ Terminal limpiado</div>
<div class="text-gray-400">💡 Listo para nuevas demostraciones...</div>
\`;
}
async function runDemo(demoType) {
const demos = {
hello: {
message: '👋 Ejecutando demostración de saludo...',
response: '🤖 ¡Hola! Soy un agente PersonnnKit. HTML + Python = Agente completo.'
},
explain: {
message: '🧠 Explicando PersonnnKit...',
response: '💡 PersonnnKit: Un agente es solo una carpeta con HTML y Python. Sin complicaciones, sin abstracciones innecesarias. Simplicidad que funciona.'
},
structure: {
message: '📁 Mostrando estructura...',
response: '🏗️ Estructura: pages/ (HTML) + scripts/ (Python) + npm run dev = Agente funcionando. Así de simple.'
}
};
const demo = demos[demoType];
addToTerminal(demo.message, 'info');
// Simular procesamiento
setTimeout(() => {
addToTerminal('⚙️ Procesando...', 'warning');
}, 500);
setTimeout(() => {
addToTerminal(demo.response, 'success');
addToTerminal('✅ Demostración completada', 'success');
}, 1500);
}
async function testConnection() {
addToTerminal('🔍 Probando conexión del agente...', 'info');
setTimeout(() => {
addToTerminal('🌐 Conectando con runtime Python...', 'warning');
}, 500);
setTimeout(() => {
addToTerminal('✅ Conexión exitosa - HTML ↔ Python', 'success');
addToTerminal('🎯 PersonnnKit funcionando perfectamente', 'success');
}, 1500);
}
// Animación inicial
window.addEventListener('load', () => {
setTimeout(() => {
addToTerminal('🚀 PersonnnKit Agent Demo cargado', 'success');
addToTerminal('💡 Haz clic en cualquier botón para ver la magia', 'info');
}, 1000);
});
</script>
</body>
</html>`,
'scripts/hello.py': `#!/usr/bin/env python3
"""
PersonnnKit Agent - Script de Demostración
Ejemplo perfecto de la simplicidad de PersonnnKit
"""
import sys
import json
from datetime import datetime
def main():
"""Función principal que demuestra la simplicidad de PersonnnKit"""
try:
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
result = {
"status": "success",
"message": "¡Hola desde PersonnnKit! 🇵",
"timestamp": timestamp,
"framework": "PersonnnKit",
"philosophy": "Un agente es solo una carpeta con HTML y Python. Córrelo y ya.",
"advantages": [
"🔲 Modularidad real - copia, pega, edita",
"🔁 Local/Web - mismo código, cualquier lugar",
"⚡ Despliegue inmediato - sin Docker, sin complicaciones",
"🧠 Código explícito - sin magia, sin abstracciones forzadas",
"🧩 Bridge amigable - para humanos y máquinas"
],
"innovation": "Packaging revolucionario: las grandes disrupciones vienen del empaquetado, no del algoritmo"
}
# Output para la consola
print("🇵 PersonnnKit Agent Activado")
print(f"⏰ Timestamp: {timestamp}")
print("💡 Filosofía: HTML + Python = Agente Universal")
print("✅ Demostración completada exitosamente")
return json.dumps(result, indent=2, ensure_ascii=False)
except Exception as e:
error_result = {
"status": "error",
"message": f"Error en demostración: {str(e)}",
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"note": "Incluso los errores son simples en PersonnnKit"
}
print(f"❌ Error: {str(e)}")
return json.dumps(error_result, indent=2, ensure_ascii=False)
if __name__ == "__main__":
output = main()
print("\\n" + "="*60)
print("JSON OUTPUT (PersonnnKit Standard):")
print(output)`,
'scripts/process.py': `#!/usr/bin/env python3
"""
PersonnnKit Agent - Script de Explicación del Framework
Demuestra por qué PersonnnKit es revolucionario
"""
import sys
import json
import time
import random
from datetime import datetime
def explain_personnnkit():
"""Explica paso a paso por qué PersonnnKit es revolucionario"""
explanations = [
{
"step": "🧠 Inventamos un Agente Kit Universal",
"detail": "Un formato estándar para agentes de IA que funciona local y web",
"impact": "Nadie había hecho algo tan claro y útil"
},
{
"step": "🔧 Solo necesitas HTML + Python",
"detail": "index.html (interfaz) + agent.py (lógica) + npm run dev",
"impact": "Simplicidad radical vs frameworks gigantes"
},
{
"step": "🚀 Packaging revolucionario",
"detail": "Mientras otros hacen abstracciones complejas, nosotros: claridad",
"impact": "Las disrupciones vienen del empaquetado, no del algoritmo"
},
{
"step": "🧱 Modularidad real",
"detail": "Copiar-pegar un agente y editarlo como cualquier archivo",
"impact": "Sin magia, sin hooks, sin abstracciones forzadas"
},
{
"step": "⚡ Despliegue inmediato",
"detail": "Sin Docker, FastAPI complejo o Nginx (aunque puedes usarlos)",
"impact": "De desarrollo a producción en segundos"
}
]
results = []
for i, explanation in enumerate(explanations, 1):
print(f"📊 Paso {i}/5: {explanation['step']}")
print(f" 💡 {explanation['detail']}")
print(f" 🎯 Impacto: {explanation['impact']}")
time.sleep(0.8) # Dar tiempo para leer
results.append({
"step": i,
"title": explanation["step"],
"explanation": explanation["detail"],
"impact": explanation["impact"],
"progress": f"{(i / len(explanations)) * 100:.1f}%"
})
return results
def main():
"""Función principal que explica PersonnnKit"""
try:
print("🚀 Explicando por qué PersonnnKit es revolucionario...")
# Explicar el framework
explanation_steps = explain_personnnkit()
result = {
"status": "success",
"message": "PersonnnKit explicado completamente",
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"framework_explanation": explanation_steps,
"key_insight": "Un agente es solo una carpeta con un HTML y un Python. Córrelo y ya.",
"vs_competition": {
"langchain": "Miles de abstracciones vs simplicidad clara",
"autogen": "Frameworks gigantes vs formato liviano",
"others": "Soluciones cerradas vs código explícito"
},
"innovation_type": "Innovación de forma, no de tecnología",
"why_it_works": [
"Legible para humanos",
"Portable entre sistemas",
"Ejecutable inmediatamente",
"Modificable sin abstracciones",
"Escalable sin complejidad"
]
}
print("✅ Explicación completada")
print("🎯 PersonnnKit: Simplicidad que revoluciona")
return json.dumps(result, indent=2, ensure_ascii=False)
except Exception as e:
error_result = {
"status": "error",
"message": f"Error explicando PersonnnKit: {str(e)}",
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"note": "Incluso nuestros errores son claros y útiles"
}
print(f"❌ Error: {str(e)}")
return json.dumps(error_result, indent=2, ensure_ascii=False)
if __name__ == "__main__":
output = main()
print("\\n" + "="*60)
print("JSON OUTPUT (PersonnnKit Standard):")
print(output)`,
'tests/test_basic.py': `#!/usr/bin/env python3
"""
Tests para PersonnnKit Agent
Demostrando que incluso los tests son simples
"""
import pytest
import json
import sys
import os
# Agregar el directorio scripts al path para importar
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'scripts'))
def test_hello_script():
"""Test del script de demostración PersonnnKit"""
try:
import hello
result = hello.main()
# Verificar que retorna JSON válido
parsed = json.loads(result)
# Verificar estructura esperada de PersonnnKit
assert "status" in parsed
assert "message" in parsed
assert "timestamp" in parsed
assert "philosophy" in parsed
assert parsed["status"] == "success"
assert "PersonnnKit" in parsed["message"]
assert "HTML y Python" in parsed["philosophy"]
print("✅ Test PersonnnKit hello.py pasó correctamente")
print("💡 Filosofía verificada: HTML + Python = Agente Universal")
except Exception as e:
pytest.fail(f"Test PersonnnKit hello.py falló: {str(e)}")
def test_explanation_script():
"""Test del script de explicación del framework"""
try:
import process
result = process.main()
# Verificar que retorna JSON válido
parsed = json.loads(result)
# Verificar estructura esperada
assert "status" in parsed
assert "framework_explanation" in parsed
assert "key_insight" in parsed
assert parsed["status"] == "success"
assert len(parsed["framework_explanation"]) == 5
assert "HTML y Python" in parsed["key_insight"]
print("✅ Test PersonnnKit process.py pasó correctamente")
print("🧠 Framework explicado y verificado")
except Exception as e:
pytest.fail(f"Test PersonnnKit process.py falló: {str(e)}")
def test_personnnkit_philosophy():
"""Test de la filosofía central de PersonnnKit"""
try:
import hello
result = hello.main()
parsed = json.loads(result)
# Verificar que contiene los principios clave
philosophy = parsed.get("philosophy", "")
advantages = parsed.get("advantages", [])
assert "HTML y Python" in philosophy
assert len(advantages) >= 5
assert any("Modularidad real" in adv for adv in advantages)
assert any("Local/Web" in adv for adv in advantages)
assert any("Despliegue inmediato" in adv for adv in advantages)
print("✅ Test filosofía PersonnnKit pasó correctamente")
print("🎯 Principios verificados: Simplicidad + Potencia")
except Exception as e:
pytest.fail(f"Test filosofía PersonnnKit falló: {str(e)}")
def test_json_output_format():
"""Test del formato de salida JSON estándar de PersonnnKit"""
try:
import hello
result = hello.main()
# Verificar que es JSON válido
parsed = json.loads(result)
# Verificar que tiene los campos requeridos de PersonnnKit
required_fields = ["status", "message", "timestamp", "framework"]
for field in required_fields:
assert field in parsed, f"Campo requerido '{field}' no encontrado"
# Verificar que el framework es PersonnnKit
assert parsed["framework"] == "PersonnnKit"
print("✅ Test formato JSON PersonnnKit pasó correctamente")
print("📋 Estándar PersonnnKit verificado")
except json.JSONDecodeError:
pytest.fail("La salida no es JSON válido")
except Exception as e:
pytest.fail(f"Test formato JSON PersonnnKit falló: {str(e)}")
def test_simplicity_principle():
"""Test del principio de simplicidad de PersonnnKit"""
try:
# Verificar que los scripts son simples y legibles
script_path = os.path.join(os.path.dirname(__file__), '..', 'scripts', 'hello.py')
with open(script_path, 'r', encoding='utf-8') as f:
content = f.read()
# Verificar que no hay abstracciones complejas
assert "import" in content # Usa imports estándar
assert "def main()" in content # Función principal clara
assert "json.dumps" in content # Salida estándar
assert len(content.split('\\n')) < 100 # Mantiene simplicidad
print("✅ Test principio de simplicidad pasó correctamente")
print("🔍 Código verificado: Simple, claro, sin magia")
except Exception as e:
pytest.fail(f"Test principio de simplicidad falló: {str(e)}")
if __name__ == "__main__":
print("🧪 Ejecutando tests de PersonnnKit Agent...")
print("🎯 Verificando: Simplicidad + Potencia + Claridad")
print("")
test_hello_script()
test_explanation_script()
test_personnnkit_philosophy()
test_json_output_format()
test_simplicity_principle()
print("")
print("✅ Todos los tests de PersonnnKit pasaron correctamente!")
print("🇵 PersonnnKit: Un agente es solo HTML + Python. Córrelo y ya.")`,
'scripts/install.sh': `#!/bin/bash
# Script de instalación para Agente Básico
# Evitar bucle infinito - si ya estamos instalando, salir
if [ "$PERSONNNKIT_INSTALLING" = "true" ]; then
echo "⚠️ Instalación ya en progreso, evitando bucle infinito..."
exit 0
fi
# Marcar que estamos instalando
export PERSONNNKIT_INSTALLING=true
echo "🚀 Instalando Agente Básico..."
# Verificar Python
if ! command -v python3 &> /dev/null; then
echo "❌ Python3 no está instalado"
exit 1
fi
# Crear entorno virtual si no existe
if [ ! -d "venv" ]; then
echo "📦 Creando entorno virtual..."
python3 -m venv venv
fi
# Activar entorno virtual
echo "🔄 Activando entorno virtual..."
source venv/bin/activate
# Actualizar pip
echo "⬆️ Actualizando pip..."
pip install --upgrade pip
# Instalar dependencias Python
echo "📚 Instalando dependencias Python..."
pip install fastapi uvicorn requests pytest python-dotenv
# Crear directorios necesarios
echo "📁 Creando directorios..."
mkdir -p data
mkdir -p public/css
# Hacer scripts ejecutables
echo "🔧 Configurando permisos..."
chmod +x scripts/*.py
chmod +x scripts/*.sh
# Limpiar variable de entorno
unset PERSONNNKIT_INSTALLING
echo "✅ Instalación completada!"
echo ""
echo "🎯 Para usar el agente:"
echo "1. Inicia el servidor: npm run dev"
echo "2. Abre http://localhost:3333 en tu navegador"
echo ""
echo "🧪 Para ejecutar tests: npm run test"`,
'README.md': `# 🇵 PersonnnKit Agent
**El Agente Kit Universal** - La forma más simple y clara de crear agentes de IA.
## 🧠 ¿Qué es PersonnnKit?
PersonnnKit es un **formato de ejecución estándar** para agentes de IA que revoluciona la forma de crear y desplegar inteligencia artificial.
### 💡 Filosofía Central
> **Un agente es solo una carpeta con un HTML y un Python. Córrelo y ya.**
## 🚀 ¿Por qué es Revolucionario?
Mientras otros frameworks hacen:
- ❌ Miles de abstracciones (LangChain, AutoGen)
- ❌ Soluciones cerradas que necesitan sus servidores
- ❌ Wrappers complicados para tareas simples
**PersonnnKit propone:**
- ✅ **Formato liviano y legible**
- ✅ **Portable entre sistemas**
- ✅ **Ejecutable inmediatamente**
## 🔧 Estructura Simple
\`\`\`
mi-agente/
├── pages/index.html ← Interfaz visual (esta página)
├── scripts/agent.py ← Lógica de IA y herramientas
├── npm run dev ← Un comando para ejecutar
└── ¡Listo! 🎉
\`\`\`
## ⚡ Inicio Rápido
\`\`\`bash
# 1. Instalar dependencias
npm install
# 2. Iniciar agente
npm run dev
# 3. Abrir navegador
# http://localhost:3333
\`\`\`
**¡Eso es todo!** Tu agente está corriendo.
## 🧱 Ventajas Únicas
### 🔲 Modularidad Real
- Copia-pega un agente y editalo como cualquier archivo
- Sin abstracciones complicadas, sin magia oculta
### 🔁 Dualidad Local/Web
- Desarrolla local, despliega global
- Mismo código, cualquier lugar
### ⚡ Despliegue Inmediato
- Sin Docker, FastAPI complejo o Nginx
- (Aunque puedes integrarlos si quieres)
### 🧠 Código Explícito
- Sin magia, sin hooks, sin abstracciones forzadas
- Ves exactamente qué hace tu agente
### 🧩 Bridge Amigable
- Para desarrolladores y no-desarrolladores
- Para que la IA entienda el proyecto
## 💻 Ejemplo Mínimo
**index.html**
\`\`\`html
<html>
<head><title>Mi Agente</title></head>
<body>
<h1>🤖 Mi Agente de IA</h1>
<button onclick="runAgent()">Ejecutar</button>
</body>
</html>
\`\`\`
**agent.py**
\`\`\`python
#!/usr/bin/env python3
import json
def main():
return {
"status": "success",
"message": "¡Hola desde PersonnnKit!",
"data": "Procesando..."
}
if __name__ == "__main__":
print(json.dumps(main()))
\`\`\`
**Ejecutar**
\`\`\`bash
$ npm run dev
🚀 Agente corriendo en http://localhost:3333
\`\`\`
## 🧪 Testing
\`\`\`bash
# Ejecutar tests
npm run test
# Tests incluidos:
# ✅ Verificación de filosofía PersonnnKit
# ✅ Formato JSON estándar
# ✅ Principio de simplicidad
# ✅ Funcionalidad básica
\`\`\`
## 🎯 Scripts Disponibles
- **hello.py**: Demostración de la filosofía PersonnnKit
- **process.py**: Explicación completa del framework
## 🌟 Innovación Clave
**PersonnnKit** es una **innovación de forma, no de tecnología**:
> Las grandes disrupciones vienen del packaging, no del algoritmo.
Mientras otros construyen frameworks gigantes, nosotros proponemos **simplicidad que funciona**.
## 🔗 Integración
PersonnnKit funciona con:
- ✅ **iframe** - Embebe en cualquier web
- ✅ **Streamlit** - Integración directa
- ✅ **Consola** - Ejecución por terminal
- ✅ **Web** - Servidor independiente
- ✅ **Local** - Desarrollo sin internet
## 📚 Filosofía vs Competencia
| Framework | Enfoque | PersonnnKit |
|-----------|---------|-------------|
| LangChain | Miles de abstracciones | Simplicidad clara |
| AutoGen | Framework gigante | Formato liviano |
| Otros | Soluciones cerradas | Código explícito |
## 🎨 Personalización
Edita directamente:
- **HTML** para cambiar la interfaz
- **Python** para modificar la lógica
- **CSS** para personalizar el diseño
- **Scripts** para agregar funcionalidades
Sin abstracciones. Sin magia. **Solo código claro.**
## 🚀 Despliegue
### Local
\`\`\`bash
npm run dev
\`\`\`
### Producción
\`\`\`bash
npm run build
# Despliega la carpeta dist/
\`\`\`
### Docker (Opcional)
\`\`\`dockerfile
FROM node:18
COPY . .
RUN npm install
CMD ["npm", "run", "dev"]
\`\`\`
## 🤝 Contribuir
PersonnnKit es **código abierto** y **simple por diseño**.
1. Fork el repositorio
2. Edita los archivos directamente
3. Envía un Pull Request
**No hay abstracciones complejas que aprender.**
## 📄 Licencia
MIT License - Úsalo como quieras.
---
## 🇵 PersonnnKit
**El futuro de los agentes de IA es simple, claro y poderoso.**
> Un agente es solo una carpeta con un HTML y un Python. Córrelo y ya.
**Construido con ❤️ usando PersonnnKit**`
}
};
//# sourceMappingURL=basic.js.map