🚧 PROYECTO EN CONSTRUCCIÓN - Este proyecto está actualmente en desarrollo activo. Algunas funcionalidades pueden estar incompletas o sujetas a cambios.
Proyecto Personal | Un gestor visual de plantillas de comandos para desarrolladores
Alice App es una aplicación de escritorio basada en Electron diseñada para resolver un problema común en el desarrollo de software: la gestión, estandarización y ejecución segura de comandos CLI complejos y repetitivos. Permite crear plantillas con variables controladas mediante selectores, limitando las opciones disponibles y asegurando la consistencia en los comandos ejecutados por todo el equipo.
Los desarrolladores frecuentemente ejecutan comandos largos y complejos que requieren múltiples parámetros, nombres de archivos específicos, y convenciones de formato (camelCase, snake_case, etc.). Estos comandos son propensos a errores tipográficos, difíciles de recordar, complicados de compartir con el equipo, y carecen de estandarización, lo que resulta en comandos ejecutados de manera inconsistente entre diferentes miembros del equipo.
Alice App proporciona una interfaz visual intuitiva donde puedes:
- Crear plantillas estandarizadas de comandos con variables parametrizadas
- Controlar las opciones mediante selectores dropdown que limitan valores a opciones predefinidas
- Validar formatos automáticamente (snake_case, camelCase, etc.) antes de la ejecución
- Garantizar consistencia en todos los comandos ejecutados por el equipo
- Ejecutar comandos con un terminal integrado que muestra el output en tiempo real
- Organizar comandos por proyectos y etiquetas para fácil acceso
- Compartir plantillas estandarizadas con tu equipo mediante archivos JSON
En lugar de memorizar rails g migration AddUsernameTo{{TableName}} username:string:uniq, simplemente seleccionas la plantilla y completas los campos en un formulario visual.
- Gestión de Plantillas de Comandos: Crea, edita y organiza plantillas de comandos
- Entrada Visual de Variables: Completa variables de comandos mediante una interfaz amigable
- Terminal Integrada: Ejecuta comandos y visualiza la salida en tiempo real
- Gestión de Proyectos: Organiza comandos por proyectos con rutas de ejecución específicas
- Sistema de Etiquetas: Categoriza y filtra comandos usando etiquetas
- Validación de Formatos: Formateo automático para variables (snake_case, camelCase, upperCamelCase, etc.)
- Importación/Exportación JSON: Comparte plantillas de comandos entre equipos usando archivos JSON
- Base de Datos SQLite: Almacenamiento local rápido y confiable
- Electron Forge - Framework para aplicaciones de escritorio
- React - Librería de UI con React Router para navegación
- Redux Toolkit - Gestión de estado
- Material-UI (MUI) - Librería de componentes
- TypeScript - Tipado estático
- SQLite - Base de datos local
- SASS (SCSS) - Estilos con metodología BEM
- Instalar dependencias:
npm installEjecutar la aplicación en modo desarrollo:
npm startCompilar la aplicación para producción:
npm run makealice-app/
├── src/
│ ├── main/
│ │ ├── database/
│ │ │ ├── index.ts # Inicialización de base de datos
│ │ │ └── schema.sql # Esquema de base de datos
│ │ └── services/
│ │ └── ipcHandlers.ts # Manejadores de comunicación IPC
│ ├── renderer/
│ │ ├── components/
│ │ │ ├── ModalNewCommand.tsx # Modal de creación de comandos
│ │ │ ├── ModalNewProject.tsx # Modal de creación de proyectos
│ │ │ ├── ModalNewTag.tsx # Modal de creación de etiquetas
│ │ │ └── Terminal.tsx # Componente de terminal
│ │ ├── views/
│ │ │ ├── CommandList.tsx # Vista de lista de comandos
│ │ │ ├── CommandList.scss # Estilos de lista de comandos
│ │ │ ├── CommandDetail.tsx # Vista de ejecución de comandos
│ │ │ ├── ProjectList.tsx # Gestión de proyectos
│ │ │ ├── TagList.tsx # Gestión de etiquetas
│ │ │ ├── TagList.scss # Estilos de etiquetas
│ │ │ ├── ConfigView.tsx # Vista de configuración
│ │ │ ├── Home.tsx # Dashboard principal
│ │ │ └── Splash.tsx # Pantalla de inicio
│ │ ├── ui/
│ │ │ ├── ViewContainer.tsx # Contenedor de vista estilo Metro
│ │ │ ├── ViewContainer.scss # Estilos del contenedor
│ │ │ ├── ViewBackButton.tsx # Botón de navegación atrás
│ │ │ └── ViewTitle.tsx # Componente de título de página
│ │ ├── store/
│ │ │ ├── index.ts # Configuración de Redux store
│ │ │ ├── hooks.ts # Hooks tipados de Redux
│ │ │ ├── commandsSlice.ts # Estado de comandos
│ │ │ ├── projectsSlice.ts # Estado de proyectos
│ │ │ └── tagsSlice.ts # Estado de etiquetas
│ │ ├── types/
│ │ │ └── index.ts # Definiciones de tipos TypeScript
│ │ ├── utils/
│ │ │ ├── formatValidation.ts # Funciones de validación de formato
│ │ │ └── homeModules.tsx # Configuración de módulos del home
│ │ └── App.tsx # Componente principal de React con routing
│ ├── index.ts # Proceso principal de Electron
│ ├── preload.ts # Script de preload (puente IPC)
│ └── renderer.ts # Punto de entrada de React
├── webpack.main.config.ts # Configuración de Webpack para main
├── webpack.renderer.config.ts # Configuración de Webpack para renderer
├── webpack.plugins.ts # Plugins de Webpack
├── tsconfig.json # Configuración de TypeScript
├── example-config.json # Archivo de configuración de ejemplo
└── package.json # Dependencias y scripts
- BEM (Block Element Modifier) para nomenclatura de clases SCSS
- Diseño Metro/Outlook para componentes UI (botones grandes, interfaz minimalista)
- Arquitectura basada en componentes con separación de responsabilidades
@/- src/@main/- src/main/@renderer/- src/renderer/@components/- src/renderer/components/@views/- src/renderer/views/@store/- src/renderer/store/@types/- src/renderer/types/@utils/- src/renderer/utils/@ui/- src/renderer/ui/
- Primary Dark:
#005461 - Primary Main:
#018790 - Primary Light:
#00B7B5 - Background:
#F4F4F4
La pantalla principal proporciona acceso a cuatro secciones principales:
- Commands: Navegar y ejecutar plantillas de comandos
- Projects: Gestionar configuraciones de proyectos
- Tags: Organizar etiquetas para filtrado
- Config: Configurar ajustes de la aplicación
- Navegar a Commands
- Hacer clic en Add Command
- Completar:
- Name (nombre)
- Detail (explicación completa)
- Resumen (resumen breve)
- Tags (para filtrado)
- Projects (opcional, dónde ejecutar)
- Steps con variables
- string: Entrada de texto libre con formato opcional
- option: Selección dropdown de opciones predefinidas
- number: Entrada numérica
- boolean: Selección verdadero/falso
snake_case: minúsculas_con_guiones_bajoscamelCase: primeraPalabraMinúsculaRestoCapitalizadoupperCamelCase: TodasPalabrasCapitalizadaskebab-case: minúsculas-con-guionesUPPER_CASE: MAYÚSCULAS_CON_GUIONES_BAJOS
Consulta example-config.json para ver la estructura. Puedes:
- Crear archivos JSON con plantillas de comandos
- Importarlos vía Config → Import JSON
- Exportar tu base de datos a JSON vía Config → Export to JSON
{
"codeindex": "unique-id",
"name": "Add Migration",
"detail": "Explicación larga de lo que hace esto",
"resumen": "Resumen corto",
"project": ["project-codeindex-1"],
"tags": ["migration", "rails"],
"steps": [
{
"name": "Generate Migration",
"detail": "Crea el archivo de migración",
"command": "rails g migration Add{{fieldName}}To{{tableName}} {{field_name}}:{{fieldType}}",
"variables": [
{
"name": "fieldName",
"type": "string",
"detail": "Nombre del campo en UpperCamelCase",
"format": "upperCamelCase"
},
{
"name": "tableName",
"type": "string",
"detail": "Nombre de la tabla en UpperCamelCase",
"format": "upperCamelCase"
},
{
"name": "field_name",
"type": "string",
"detail": "Nombre del campo en snake_case",
"format": "snake_case"
},
{
"name": "fieldType",
"type": "option",
"detail": "Tipo de columna",
"options": ["string", "integer", "boolean"]
}
]
}
]
}La aplicación usa SQLite para almacenamiento local. La base de datos se crea automáticamente en el directorio de datos de la aplicación del usuario.
Tablas:
projects- Configuraciones de proyectostags- Etiquetas disponiblescommand_templates- Plantillas de comandoscommand_projects- Relación muchos a muchoscommand_tags- Relación muchos a muchosconfig- Configuración de la aplicación
- Crear un nuevo componente en
src/renderer/views/ - Agregar la ruta en
src/renderer/App.tsx - Actualizar la navegación según sea necesario
- Usar el componente
ViewContainerpara un diseño Metro consistente
- Agregar el manejador en
src/main/services/ipcHandlers.ts - Exponerlo en
src/preload.ts - Usarlo en tus componentes React vía
window.electronAPI
- Vistas: Forma singular (ej.
CommandList,ProjectList,TagList) - Componentes: Nombres descriptivos (ej.
ModalNewCommand,ViewContainer) - SCSS: Metodología BEM (ej.
.command-list__filters)
graph TB
subgraph "RENDERER PROCESS (Frontend - React)"
subgraph "Views Layer"
Home[Home]
CommandList[CommandList]
CommandDetail[CommandDetail]
ProjectList[ProjectList]
TagList[TagList]
ConfigView[ConfigView]
end
subgraph "UI Components"
ViewContainer[ViewContainer<br/>Metro UI]
ModalNewCommand[ModalNewCommand]
ModalNewProject[ModalNewProject]
ModalNewTag[ModalNewTag]
Terminal[Terminal]
end
subgraph "Redux Store"
commandsSlice[commandsSlice<br/>• commands<br/>• currentCommand<br/>• filters]
projectsSlice[projectsSlice<br/>• projects<br/>• loading]
tagsSlice[tagsSlice<br/>• tags<br/>• loading]
end
subgraph "Utils"
formatValidation[formatValidation<br/>• snake_case<br/>• camelCase<br/>• upperCamelCase]
homeModules[homeModules<br/>• Navigation config]
end
end
subgraph "IPC Bridge"
Preload[Preload Script<br/>window.electronAPI]
end
subgraph "MAIN PROCESS (Backend - Electron)"
subgraph "IPC Handlers"
IPCHandlers[IPC Handlers<br/>• commands:get/create/update<br/>• projects:get/create/update<br/>• tags:get/create/update]
end
subgraph "Database"
SQLite[(SQLite DB<br/>• command_templates<br/>• projects<br/>• tags<br/>• command_projects<br/>• command_tags<br/>• config)]
end
subgraph "Execution"
TerminalExec[Terminal Execution<br/>child_process.spawn<br/>stdout/stderr streaming]
end
end
Home --> ViewContainer
CommandList --> ViewContainer
ProjectList --> ViewContainer
TagList --> ViewContainer
CommandList --> ModalNewCommand
ProjectList --> ModalNewProject
TagList --> ModalNewTag
CommandDetail --> Terminal
CommandList --> commandsSlice
ProjectList --> projectsSlice
TagList --> tagsSlice
CommandDetail --> commandsSlice
commandsSlice --> Preload
projectsSlice --> Preload
tagsSlice --> Preload
Preload <--> IPCHandlers
IPCHandlers <--> SQLite
IPCHandlers --> TerminalExec
style Home fill:#018790,color:#fff
style CommandList fill:#018790,color:#fff
style ProjectList fill:#018790,color:#fff
style TagList fill:#018790,color:#fff
style ViewContainer fill:#00B7B5,color:#fff
style commandsSlice fill:#005461,color:#fff
style projectsSlice fill:#005461,color:#fff
style tagsSlice fill:#005461,color:#fff
style SQLite fill:#07405E,color:#fff
sequenceDiagram
participant U as Usuario
participant R as Renderer<br/>(CommandDetail)
participant S as Redux Store
participant P as Preload Script
participant M as Main Process<br/>(IPC Handler)
participant T as Terminal<br/>(child_process)
participant SYS as Sistema
U->>R: 1. Click Execute
R->>S: 2. dispatch(executeCommand)
S->>P: 3. window.electronAPI.executeCommand(template, vars)
P->>M: 4. IPC: executeCommand
Note over M: Parse template<br/>Apply variables<br/>Format values
M->>T: 5. spawn(command, args)
T->>SYS: 6. Execute command
loop Streaming
SYS-->>T: stdout/stderr
T-->>M: Stream data
M-->>P: Send output
P-->>S: Update terminal state
S-->>R: Re-render
R-->>U: Display output
end
SYS-->>T: Exit code
T-->>M: Process complete
M-->>P: Execution finished
P-->>S: Update state
S-->>R: Show complete
erDiagram
COMMAND_TEMPLATES ||--o{ COMMAND_PROJECTS : "belongs to"
COMMAND_TEMPLATES ||--o{ COMMAND_TAGS : "has"
PROJECTS ||--o{ COMMAND_PROJECTS : "contains"
TAGS ||--o{ COMMAND_TAGS : "categorizes"
COMMAND_TEMPLATES {
int id PK
string codeindex
string name
string detail
string resumen
json steps
}
PROJECTS {
int id PK
string codeindex
string name
string path
}
TAGS {
int id PK
string codeindex
string name
}
COMMAND_PROJECTS {
int command_id FK
int project_id FK
}
COMMAND_TAGS {
int command_id FK
int tag_id FK
}
CONFIG {
string key PK
string value
}
graph TD
App[App.tsx<br/>Router + Theme]
App --> Splash[Splash<br/>Pantalla de inicio]
App --> Home[Home<br/>Dashboard]
App --> CommandList[CommandList<br/>Lista de comandos]
App --> CommandDetail[CommandDetail<br/>Ejecutar comando]
App --> ProjectList[ProjectList<br/>Gestión proyectos]
App --> TagList[TagList<br/>Gestión tags]
App --> ConfigView[ConfigView<br/>Configuración]
CommandList --> ViewContainer1[ViewContainer]
ProjectList --> ViewContainer2[ViewContainer]
TagList --> ViewContainer3[ViewContainer]
ViewContainer1 --> ViewBackButton1[ViewBackButton]
ViewContainer1 --> ViewTitle1[ViewTitle]
CommandList --> ModalNewCommand[ModalNewCommand]
ProjectList --> ModalNewProject[ModalNewProject]
TagList --> ModalNewTag[ModalNewTag]
CommandDetail --> Terminal[Terminal<br/>Ejecución en tiempo real]
style App fill:#018790,color:#fff
style ViewContainer1 fill:#00B7B5,color:#fff
style ViewContainer2 fill:#00B7B5,color:#fff
style ViewContainer3 fill:#00B7B5,color:#fff
style Terminal fill:#005461,color:#fff
MIT
¡Las contribuciones son bienvenidas! Por favor, siéntete libre de enviar un Pull Request.