Action: file_editor create /app/terminal-engine/README.md --file-text "# Terminal Narrative Engine
Motor de terminal narrativa interactiva modular construido con JavaScript puro, HTML y CSS. Inspirado en las terminales de Fallout, Hacknet y sistemas BBS retro.
- ✅ Motor completamente modular y extensible
- ✅ Sistema de comandos dinámicos (Strategy Pattern)
- ✅ Contextos intercambiables (Local Shell, BBS, SSH)
- ✅ Filesystem virtual navegable
- ✅ Sistema de persistencia con localStorage
- ✅ EventBus para comunicación desacoplada
- ✅ Efectos CRT retro completos (scanlines, glow, curvatura, grain)
- ✅ Typing effect configurable
- ✅ Historial de comandos (↑/↓)
- ✅ Autocompletado con TAB
- ✅ Cursor parpadeante animado
- ✅ Efectos de corrupción/glitch
- ✅ Mini-juegos integrados (password cracking)
- ✅ Sistema de logros
- ✅ Easter eggs (cowsay, matrix, etc.)
- ✅ Narrativas JSON-driven
- ✅ Sistema de progreso con flags
- ✅ Múltiples slots de guardado
- Abre
index.htmlen tu navegador - Escribe
helppara ver comandos disponibles - Lee el briefing:
cat welcome.txt - Explora el filesystem:
ls -a - Descubre credenciales ocultas
- Conecta al BBS:
telnet darknet.bbs.net - Descarga archivos y encuentra fragmentos de contraseña
- Accede al mainframe:
ssh vault-mainframe.local - Completa la misión
ls [-a] [path]- Listar directoriocd <dir>- Cambiar directoriopwd- Directorio actualcat <file>- Leer archivogrep <pattern> <file>- Buscar en archivofind <pattern>- Buscar archivosmkdir <dir>- Crear directoriorm <path>- Eliminar archivo/directorioecho <text>- Mostrar textossh <address>- Conectar vía SSHtelnet <address>- Conectar a BBSclear- Limpiar pantallahistory- Ver historialsave [slot]- Guardar progresoload [slot]- Cargar partidainventory- Ver inventariostatus- Estado del juegohack [target]- Iniciar minijuego de hackeo
cowsay <message>- Vaca ASCIImatrix- Entrar en Matrix- Descubre más explorando...
login <user> <pass>- Autenticarsemenu- Mostrar menúmessages- Ver mensajesfiles- Biblioteca de archivosdownload <file>- Descargar archivoread <num>- Leer mensajeusers- Lista de usuariosinfo- Info del sistemaexit- Desconectar
auth <password>- Autenticarsels- Listar archivoscat <file>- Leer archivoscan- Escanear sistemastatus- Estado del sistemainitiate <protocol>- Iniciar protocolodisconnect- Cerrar conexión
terminal-engine/
├── index.html # Punto de entrada
├── css/
│ └── terminal.css # Estilos CRT retro
├── core/
│ ├── event-bus.js # Sistema de eventos
│ ├── state-manager.js # Gestión de estado
│ ├── filesystem.js # Sistema de archivos virtual
│ ├── terminal-renderer.js # Renderizado y efectos
│ ├── input-handler.js # Manejo de entrada
│ ├── command-registry.js # Registro de comandos
│ └── context-manager.js # Gestión de contextos
├── contexts/
│ ├── base-context.js # Clase base abstracta
│ ├── local-shell.js # Shell local Unix-like
│ ├── bbs-system.js # Sistema BBS
│ └── ssh-client.js # Cliente SSH
├── narratives/
│ ├── narrative-loader.js # Cargador de narrativas
│ ├── demo-story/ # Narrativa demo
│ │ └── config.json # Configuración
│ └── schema.json # JSON Schema
└── utils/
├── ascii-renderer.js # Renderizado ASCII
├── logger.js # Sistema de logging
└── validator.js # Validación JSON
narratives/
└── mi-historia/
├── config.json
└── assets/
{
\"narrative\": \"mi-historia\",
\"version\": \"1.0\",
\"startContext\": \"localhost\",
\"description\": \"Tu descripción\",
\"systems\": [
{
\"id\": \"localhost\",
\"type\": \"local\",
\"hostname\": \"mi-sistema\",
\"filesystem\": {
\"/home/user\": [\"archivo1.txt\", \"archivo2.txt\"]
}
}
],
\"progression\": {
\"flags\": [\"flag1\", \"flag2\"],
\"winCondition\": {
\"flags\": [\"flag1\", \"flag2\"]
}
},
\"dialogues\": {
\"intro\": \"Texto de introducción\",
\"victory\": \"Texto de victoria\"
}
}import { narrativeLoader } from './narratives/narrative-loader.js';
await narrativeLoader.loadFromFile('narratives/mi-historia/config.json');commandRegistry.register({
name: 'micomando',
aliases: ['mc'],
contexts: ['local'], // o ['*'] para todos
description: 'Mi comando personalizado',
usage: 'micomando <arg>',
execute: async (args, context) => {
// Tu lógica aquí
return {
success: true,
output: 'Resultado del comando',
className: 'text-success'
};
}
});import { BaseContext } from './contexts/base-context.js';
class MiContexto extends BaseContext {
constructor() {
super('mi-id', 'Mi Contexto', 'custom');
}
getPrompt() {
return 'mi-prompt>';
}
getCommands() {
return [
// Tus comandos aquí
];
}
async onEnter(params) {
// Lógica al entrar al contexto
}
async onExit() {
// Lógica al salir del contexto
}
}import { eventBus } from './core/event-bus.js';
// Escuchar eventos
eventBus.on('comando:ejecutado', (data) => {
console.log('Comando ejecutado:', data);
});
// Emitir eventos
eventBus.emit('evento:personalizado', { datos: 'valor' });// Establecer flag
stateManager.setFlag('mi_flag');
// Verificar flag
if (stateManager.hasFlag('mi_flag')) {
// Hacer algo
}
// Añadir a inventario
stateManager.addToInventory('objeto');
// Otorgar logro
stateManager.grantAchievement('Nombre del Logro');// Efecto glitch
eventBus.emit('terminal:glitch', { duration: 1000 });
// Barra de progreso
await renderer.showProgressBar('Cargando...', 3000);
// Arte ASCII
renderer.printASCII(`
╔═══════════╗
║ TITLE ║
╚═══════════╝
`);Edita css/terminal.css y modifica las variables:
/* Color principal del texto */
color: #00ff00; /* Verde fosforescente */
/* Colores de estado */
.text-error { color: #ff4444; }
.text-success { color: #00ff00; }
.text-warning { color: #ffaa00; }
.text-info { color: #00ccff; }renderer.setTypingSpeed(5); // ms por carácter (0 = instantáneo)Modifica en index.html:
<link href=\"https://fonts.googleapis.com/css2?family=Share+Tech+Mono&display=swap\" rel=\"stylesheet\">Y en css/terminal.css:
font-family: 'Share Tech Mono', monospace;Enter- Ejecutar comando↑/↓- Navegar historialTab- AutocompletarCtrl+L- Limpiar pantallaCtrl+C- Cancelar comando
- ✅ Chrome/Edge (última versión)
- ✅ Firefox (última versión)
- ✅ Safari (última versión)
- ✅ Funciona offline después de la primera carga
- ✅ Responsive (mobile-friendly)
- JavaScript ES6+ puro (sin frameworks)
- HTML5
- CSS3 con animaciones y efectos
- LocalStorage para persistencia
- Módulos ES6
- Tamaño total: ~50KB (sin comprimir)
- Tiempo de carga: <1s
- Sin dependencias externas
- Optimizado para typing fluido
- Verifica la consola del navegador (F12)
- Asegúrate de que todos los archivos estén cargados
- Intenta refrescar la página
- Verifica que el contexto esté correctamente inicializado
- Revisa que los comandos estén registrados para el contexto actual
- Verifica que localStorage esté habilitado
- Comprueba el espacio disponible en localStorage
- No uses modo incógnito (el estado se perderá al cerrar)
Desarrollado para demostrar arquitectura modular en JavaScript puro.
Inspirado por:
- Fallout (series de juegos)
- Hacknet
- Uplink
- BBS clásicos de los 80s-90s
Proyecto educativo de código abierto. Siéntete libre de modificar y extender según tus necesidades.
¡Feliz hackeo en la terminal! 🖥️💚 " Observation: Create successful: /app/terminal-engine/README.md