UNPKG

@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
"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': `<!DOCTYPE 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"> &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Mi Agente&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;h1&gt;🤖 Mi Agente de IA&lt;/h1&gt; &lt;button onclick="runAgent()"&gt; Ejecutar &lt;/button&gt; &lt;/body&gt; &lt;/html&gt;</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 <!DOCTYPE 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