[ADDED] Implementado script sora.sh para integración con aider

- Creado script para ejecutar aider con configuración de OpenRouter o Ollama

- Agregada evaluación de hardware para ejecución local

- Implementada selección de modelo con GUI usando gum

- Reemplazo completo del sistema de alias por ejecutable integrado

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Mauro Rosero P. 2025-04-07 20:32:27 -05:00
parent 6da8b9e0f6
commit 97a965417e
Signed by: mrosero
GPG key ID: 83BD2A5F674B7E26
16 changed files with 261 additions and 416 deletions

View file

@ -12,10 +12,47 @@
</center>
## 📋 Descripción
## 📋 Descripción General
**MRDevs Tools** es un conjunto de herramientas diseñado principalmente para el desarrollo en consola, aunque también se adapta a otros entornos. Está fuertemente orientado a **código como servicio**, potenciando el uso de herramientas y metodologías ágiles de **CI/CD** para optimizar el flujo de trabajo de desarrollo. Facilita la creación y gestión de **grupos de trabajo y proyectos**, permitiendo a los desarrolladores organizar su trabajo de manera eficiente y colaborativa en equipos multifuncionales. Utiliza agentes de inteligencia artificial para asistir en la escritura, corrección y refactorización de código, lo que aumenta la productividad y mejora la calidad del software. Además, pone un fuerte énfasis en la **seguridad**, incorporando **firmas GPG** para asegurar la autenticidad e integridad del código y procesos. A través de **SOPS**, facilita la gestión segura de secretos, permitiendo la encriptación y desencriptación de datos sensibles. También habilita conexiones **VPN**, garantizando un acceso seguro a infraestructuras remotas de desarrollo.
## 🤖 Asistentes de IA para el Desarrollo
MRDevs Tools integra potentes asistentes de IA que transforman el proceso de desarrollo:
### Cortana y Sora: Desarrollo Potenciado por IA
Nuestros asistentes de IA están diseñados para acelerar y mejorar el ciclo de desarrollo:
- **[Cortana](docs/cortana.md)** - Asistente general basado en Claude:
- **Generación de Código**: Crea funciones, clases y módulos completos con instrucciones en lenguaje natural
- **Documentación Automática**: Genera documentación técnica, comentarios de código y README
- **Resolución de Problemas**: Analiza errores y propone soluciones precisas
- **Refactorización Inteligente**: Mejora código existente manteniendo su funcionalidad
- **Control por Voz**: Interactúa mediante comandos hablados con reconocimiento local
- **[Sora](docs/sora.md)** - Asistente colaborativo para programación basado en Aider:
- **Pair Programming**: Trabaja directamente con tus repositorios Git
- **Edición Colaborativa**: Modifica archivos existentes aplicando cambios automáticamente
- **Integración con Git**: Crea commits, ramas y gestiona cambios con instrucciones naturales
- **Desarrollo Multidocumento**: Comprende y modifica sistemas completos de múltiples archivos
- **Seguimiento de Contexto**: Mantiene el estado de la conversación para desarrollos complejos
### Casos de Uso Principales
```bash
# Cortana: Generación de código basada en especificaciones
cortana "Crea una API REST en Express.js para gestionar una biblioteca con préstamos"
# Sora: Modificación de código existente en repositorio
sora src/*.js
> Añade validación de datos a todos los formularios y manejo de errores
```
Para una documentación completa de ambos asistentes, consulta:
- [Manual completo de Cortana](docs/cortana.md)
- [Manual completo de Sora](docs/sora.md)
## 🚀 Inicio Rápido
Para comenzar a utilizar MRDevs Tools, consulte la [Guía de Uso Completa](docs/uso.md) que incluye instrucciones detalladas de instalación, comandos disponibles y ejemplos de uso.
@ -23,7 +60,7 @@ Para comenzar a utilizar MRDevs Tools, consulte la [Guía de Uso Completa](docs/
### Requisitos Previos
- Git instalado en su sistema
- Permisos de administrador (para algunas operaciones)
- Permisos de administrador para el Sistema Operativo (para algunas operaciones)
- Conexión a Internet
### Instalación Básica
@ -66,43 +103,6 @@ MRDevs Tools está diseñado con la seguridad y privacidad en mente:
- **Podman como predeterminado**: Se usa Podman (sin privilegios) para mayor seguridad en contenedores
- **Ejecución local**: Las funcionalidades como reconocimiento de voz funcionan localmente sin enviar datos
## 🤖 Asistentes de IA para el Desarrollo
MRDevs Tools integra potentes asistentes de IA que transforman el proceso de desarrollo:
### Cortana y Sora: Desarrollo Potenciado por IA
Nuestros asistentes de IA están diseñados para acelerar y mejorar el ciclo de desarrollo:
- **[Cortana](docs/cortana.md)** - Asistente general basado en Claude:
- **Generación de Código**: Crea funciones, clases y módulos completos con instrucciones en lenguaje natural
- **Documentación Automática**: Genera documentación técnica, comentarios de código y README
- **Resolución de Problemas**: Analiza errores y propone soluciones precisas
- **Refactorización Inteligente**: Mejora código existente manteniendo su funcionalidad
- **Control por Voz**: Interactúa mediante comandos hablados con reconocimiento local
- **[Sora](docs/sora.md)** - Asistente colaborativo para programación:
- **Pair Programming**: Trabaja directamente con tus repositorios Git
- **Edición Colaborativa**: Modifica archivos existentes aplicando cambios automáticamente
- **Integración con Git**: Crea commits, ramas y gestiona cambios con instrucciones naturales
- **Desarrollo Multidocumento**: Comprende y modifica sistemas completos de múltiples archivos
- **Seguimiento de Contexto**: Mantiene el estado de la conversación para desarrollos complejos
### Casos de Uso Principales
```bash
# Cortana: Generación de código basada en especificaciones
cortana "Crea una API REST en Express.js para gestionar una biblioteca con préstamos"
# Sora: Modificación de código existente en repositorio
sora src/*.js
> Añade validación de datos a todos los formularios y manejo de errores
```
Para una documentación completa de ambos asistentes, consulta:
- [Manual completo de Cortana](docs/cortana.md)
- [Manual completo de Sora](docs/sora.md)
## 🔌 Arquitectura del Sistema
### Estructura de Directorios
@ -215,7 +215,7 @@ El texto completo de la licencia está disponible en el archivo [LICENSE.md](LIC
Para dudas o problemas, contacte con:
- Email: mauro@rosero.one
- Web: https://mauro.rosero.one
- Web: https://mrdevs.rosero.one
---

View file

@ -0,0 +1 @@
~/.developer

1
bin/config/ollama.local Normal file
View file

@ -0,0 +1 @@
http://127.0.0.1:11434

View file

@ -0,0 +1 @@
https://openrouter.ai/api/v1

View file

@ -0,0 +1 @@
openrouter/deepseek/deepseek-r1-distill-llama-70b:free

197
bin/sora.sh Executable file
View file

@ -0,0 +1,197 @@
#!/bin/bash
# [Author] Cortana Rosero One <cortana@rosero.one>
# [Generated] Created by Claude Code (claude-3-7-sonnet-20250219)
# Modified Date: 2025-04-07
# Version $(cat "$(dirname "$0")/config/version" 2>/dev/null || echo "1.0.0")
#
# Description: Script para ejecutar aider con la configuración adecuada de OpenRouter
# Usage: ./sora.sh [parámetros para aider]
# Verifica si aider está instalado
if ! command -v aider &> /dev/null; then
echo "Error: aider no está instalado."
echo "Instálelo ejecutando: bin/sora_install.sh"
exit 1
fi
# Obtiene la ruta base de tokens desde el archivo de configuración
TOKENS_BASE_PATH=$(cat "$(dirname "$0")/config/ai_tokens.path" 2>/dev/null)
if [ -z "$TOKENS_BASE_PATH" ]; then
echo "Error: No se pudo obtener la ruta base de tokens."
exit 1
fi
# Expande la ruta si comienza con ~
if [[ "$TOKENS_BASE_PATH" == "~"* ]]; then
TOKENS_BASE_PATH="${TOKENS_BASE_PATH/#\~/$HOME}"
fi
# Define el archivo de tokens de OpenRouter
OPENROUTER_TOKEN_FILE="${TOKENS_BASE_PATH}/router.sops.yaml"
# Verifica si el archivo de token existe
if [ ! -f "$OPENROUTER_TOKEN_FILE" ]; then
echo "Error: Archivo de token no encontrado: $OPENROUTER_TOKEN_FILE"
echo "Registre su token usando ai_token.sh o solicite el token al administrador del proyecto."
exit 1
fi
# Desencripta y obtiene el token de OpenRouter (decodificando base64)
OPENROUTER_API_KEY=$(sops -d "$OPENROUTER_TOKEN_FILE" | cut -d\| -f2 | tr -d '[:space:]' | base64 -d)
if [ -z "$OPENROUTER_API_KEY" ]; then
echo "Error: No se pudo desencriptar el token de OpenRouter."
exit 1
fi
# Lee o crea el archivo de configuración de la API base
API_BASE_CONFIG_FILE="$(dirname "$0")/config/sora_api_base.cfg"
if [ ! -f "$API_BASE_CONFIG_FILE" ]; then
echo "https://openrouter.ai/api/v1" > "$API_BASE_CONFIG_FILE"
fi
OPENAI_API_BASE=$(cat "$API_BASE_CONFIG_FILE" 2>/dev/null || echo "https://openrouter.ai/api/v1")
# Lee o crea el archivo de configuración del modelo
MODEL_CONFIG_FILE="$(dirname "$0")/config/sora_model.cfg"
if [ ! -f "$MODEL_CONFIG_FILE" ]; then
echo "deepseek/deepseek-r1-distill-llama-70b:free" > "$MODEL_CONFIG_FILE"
fi
AIDER_MODEL=$(cat "$MODEL_CONFIG_FILE" 2>/dev/null || echo "deepseek/deepseek-r1-distill-llama-70b:free")
# Pregunta al usuario si desea usar modelo remoto o local (ollama)
MODE=$(gum choose "Remoto (OpenRouter)" "Local (Ollama)")
if [[ "$MODE" == "Local (Ollama)" ]]; then
# Muestra advertencia sobre rendimiento
echo "⚠️ ADVERTENCIA: El uso de modelos locales requiere hardware adecuado."
echo " Si su hardware no es suficiente, las respuestas pueden ser extremadamente lentas."
# Evalúa el hardware de la máquina
CPU_CORES=$(nproc)
RAM_TOTAL_GB=$(free -g | awk '/^Mem:/{print $2}')
RAM_AVAILABLE_GB=$(free -g | awk '/^Mem:/{print $7}')
HAS_GPU=$(lspci | grep -i nvidia | grep -v "Audio\|USB" || echo "")
# Determina nivel de rendimiento
PERFORMANCE_LEVEL="Muy Malo"
if [ -n "$HAS_GPU" ] && [ $CPU_CORES -ge 8 ] && [ $RAM_AVAILABLE_GB -ge 16 ]; then
PERFORMANCE_LEVEL="Excelente"
elif [ -n "$HAS_GPU" ] && [ $CPU_CORES -ge 6 ] && [ $RAM_AVAILABLE_GB -ge 12 ]; then
PERFORMANCE_LEVEL="Muy Bueno"
elif [ $CPU_CORES -ge 8 ] && [ $RAM_AVAILABLE_GB -ge 12 ]; then
PERFORMANCE_LEVEL="Bueno"
elif [ $CPU_CORES -ge 6 ] && [ $RAM_AVAILABLE_GB -ge 8 ]; then
PERFORMANCE_LEVEL="Intermedio"
elif [ $CPU_CORES -ge 4 ] && [ $RAM_AVAILABLE_GB -ge 6 ]; then
PERFORMANCE_LEVEL="Pobre"
elif [ $CPU_CORES -ge 2 ] && [ $RAM_AVAILABLE_GB -ge 4 ]; then
PERFORMANCE_LEVEL="Malo"
fi
# Muestra estado del hardware
echo ""
echo "Evaluación de hardware:"
echo "- CPU Cores: $CPU_CORES"
echo "- RAM Total: $RAM_TOTAL_GB GB"
echo "- RAM Disponible: $RAM_AVAILABLE_GB GB"
echo "- GPU NVIDIA: $([ -n "$HAS_GPU" ] && echo "Detectada" || echo "No detectada")"
# Muestra barra de rendimiento con gum
echo ""
echo -n "Rendimiento esperado: "
case "$PERFORMANCE_LEVEL" in
"Muy Malo")
gum style --foreground 255 --background 1 " Muy Malo "
;;
"Malo")
gum style --foreground 255 --background 1 " Malo "
;;
"Pobre")
gum style --foreground 255 --background 202 " Pobre "
;;
"Intermedio")
gum style --foreground 255 --background 3 " Intermedio "
;;
"Bueno")
gum style --foreground 255 --background 35 " Bueno "
;;
"Muy Bueno")
gum style --foreground 255 --background 2 " Muy Bueno "
;;
"Excelente")
gum style --foreground 255 --background 5 " Excelente "
;;
esac
echo ""
# Pregunta si desea continuar
if ! gum confirm "¿Desea continuar con el modo local?"; then
echo "Operación cancelada por el usuario."
exit 0
fi
# Verifica si ollama está activo
if ! curl -s http://127.0.0.1:11434/api/tags >/dev/null 2>&1; then
echo "Ollama no está activo. Iniciando..."
"$(dirname "$0")/ollama_up.sh"
# Espera hasta 30 segundos para que Ollama se inicie completamente
WAIT_TIME=0
MAX_WAIT=30
while ! curl -s http://127.0.0.1:11434/api/tags >/dev/null 2>&1; do
if [ $WAIT_TIME -ge $MAX_WAIT ]; then
echo "Error: No se pudo iniciar Ollama después de $MAX_WAIT segundos."
exit 1
fi
echo "Esperando que Ollama responda... ($WAIT_TIME/$MAX_WAIT)"
sleep 1
WAIT_TIME=$((WAIT_TIME + 1))
done
OLLAMA_STARTED=true
fi
# Verifica que Ollama funcione correctamente haciendo una solicitud simple
echo "Verificando que Ollama responda correctamente..."
if ! curl -s http://127.0.0.1:11434/api/tags | jq -e '.models' >/dev/null 2>&1; then
echo "Error: Ollama está iniciado pero no responde correctamente."
exit 1
fi
# Configura para usar Ollama
OLLAMA_API_BASE=$(cat "$(dirname "$0")/config/ollama.local" 2>/dev/null)
echo "Usando Ollama con API base: $OLLAMA_API_BASE"
# Lista y permite seleccionar modelos disponibles en Ollama
echo "Consultando modelos disponibles en Ollama..."
OLLAMA_MODELS=$(curl -s http://127.0.0.1:11434/api/tags | jq -r '.models[].name')
if [ -z "$OLLAMA_MODELS" ]; then
echo "Error: No se encontraron modelos en Ollama."
exit 1
fi
# Permite seleccionar un modelo utilizando gum
echo "Seleccione un modelo:"
SELECTED_MODEL=$(echo "$OLLAMA_MODELS" | gum filter --placeholder="Buscar modelo...")
if [ -z "$SELECTED_MODEL" ]; then
echo "No se seleccionó ningún modelo. Saliendo."
exit 1
fi
echo "Modelo seleccionado: $SELECTED_MODEL"
# Añade el prefijo al modelo de Ollama
OLLAMA_FULL_MODEL="ollama_chat/$SELECTED_MODEL"
echo "Modelo con prefijo: $OLLAMA_FULL_MODEL"
# Ejecuta aider con la configuración de Ollama
OLLAMA_API_BASE="$OLLAMA_API_BASE" AIDER_MODEL="$OLLAMA_FULL_MODEL" aider --no-git --no-show-model-warnings "$@"
# Si iniciamos Ollama, lo detenemos al finalizar
if [ "$OLLAMA_STARTED" = true ]; then
echo "Deteniendo Ollama..."
"$(dirname "$0")/ollama_down.sh"
fi
else
# Ejecuta aider con la configuración de OpenRouter
OPENAI_API_BASE="$OPENAI_API_BASE" OPENROUTER_API_KEY="$OPENROUTER_API_KEY" AIDER_MODEL="$AIDER_MODEL" aider --no-git --no-show-model-warnings "$@"
fi

View file

@ -1,10 +0,0 @@
#!/bin/bash
# Verificar si ~/.local/bin está en el PATH
if [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then
# Si no está en el PATH, usamos la ruta completa en el alias
alias sora="$HOME/.local/bin/aider"
else
# Si está en el PATH, podemos usar el nombre directamente
alias sora="aider"
fi
echo "Alias sora habilitado"

View file

@ -1,120 +0,0 @@
#!/bin/bash
#Script : sora_disable.sh
#Apps : MRDEVS TOOLS
#Description : Deshabilita el alias 'sora' para Aider
#Author : Sora Rosero One <sora@rosero.one>
#Generated by : Claude Code (claude-3-7-sonnet-20250219)
#Created : 2025/03/20 12:30:00
#Modified : 2025/03/20 12:48:05
#Version : 1.0.0
#Use Notes :
# ./sora_disable.sh -> Deshabilitar
# No usa console.lib, ni console.es
#==============================================================================
# Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>]
#==============================================================================
# Este programa es software libre: usted puede redistribuirlo y/o modificarlo
# bajo los términos de la Licencia Pública Affero General de GNU tal como
# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia,
# o (a su elección) cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea útil,
# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la
# Licencia Pública Affero General de GNU para obtener más detalles.
#
# Debería haber recibido una copia de la Licencia Pública Affero General
# junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>.
# Configuración inicial
# Usar DEVELOPER_DIR de base.lib
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BIN_BASE="bin"
BIN_LIBS="lib"
BIN_MESG="msg"
BIN_CFGS="config"
# Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto
if [ -f "$SCRIPT_DIR/config/devspath.dat" ]; then
DEVSPATH=$(cat "$SCRIPT_DIR/$BIN_CFGS/devspath.dat")
else
DEVSPATH="devs"
fi
BIN_HOME="$HOME/$DEVSPATH"
VERSION=$(cat "$BIN_HOME/$BIN_BASE/$BIN_CFGS/version")
# CHECK SHELL LANGUAGE
BIN_LANG=${LANG:0:2}
# Importar bibliotecas necesarias
source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib"
# Cargar mensajes en el idioma del sistema o español por defecto
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head"
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "developers"
title="${head_000} ${srmsg_000}"
# Verificar que 'dialog' esté instalado
if ! command -v dialog &>/dev/null; then
echo "${npm_001}"
exit 1
fi
# Función para eliminar alias de Sora
remove_sora_alias() {
local alias_nombre="sora"
local shell_config=""
# Detectar el shell actual y seleccionar el archivo de configuración adecuado
case "$SHELL" in
*/bash)
shell_config="$HOME/.bashrc"
;;
*/zsh)
shell_config="$HOME/.zshrc"
;;
*)
dialog --backtitle "${title}" --title "${head_error}" --msgbox "${srmsg_021}" 7 50
return 1
;;
esac
# Verificar si el alias existe en el archivo de configuración
if grep -q "alias $alias_nombre=" "$shell_config"; then
# Eliminar el alias del archivo de configuración
sed -i "/alias $alias_nombre=/d" "$shell_config"
if [[ $? -eq 0 ]]; then
dialog --backtitle "${title}" --title "${srmsg_012}" --msgbox "${srmsg_013} $shell_config" 7 60
else
dialog --backtitle "${title}" --title "${head_error}" --msgbox "${srmsg_020}" 7 50
return 1
fi
else
dialog --backtitle "${title}" --title "${srmsg_010}" --msgbox "${srmsg_011}" 7 50
return 2
fi
}
# Confirmar desactivación
dialog --backtitle "${title}" --title "${npm_031}" --yesno "${srmsg_003}" 7 50
if [[ $? -eq 0 ]]; then
# Crear un archivo fuente para la desactivación del alias
UNALIAS_FILE="$BIN_HOME/bin/sora_unalias.sh"
echo '#!/bin/bash' > "$UNALIAS_FILE"
echo 'unalias sora 2>/dev/null' >> "$UNALIAS_FILE"
echo "echo \"${srmsg_018}\"" >> "$UNALIAS_FILE"
chmod +x "$UNALIAS_FILE"
# Ejecutar la función remove_sora_alias para el archivo de configuración permanente
remove_sora_alias
# Crear un mensaje con instrucciones para desactivar el alias en la sesión actual
dialog --backtitle "${title}" --title "${srmsg_016}" --msgbox "${srmsg_014}\n\n${srmsg_015}\n\nsource $UNALIAS_FILE\n\n" 10 70
else
dialog --backtitle "${title}" --title "${head_canceled}" --msgbox "${npm_008}" 6 40
exit 1
fi
# Limpiar consola
clear

View file

@ -1,139 +0,0 @@
#!/bin/bash
#Script : sora_enable.sh
#Apps : MRDEVS TOOLS
#Description : Habilitar el alias 'sora' para Aider
#Author : Sora Rosero One <sora@rosero.one>
#Generated by : Claude Code (claude-3-7-sonnet-20250219)
#Created : 2025/03/20 12:30:00
#Modified : 2025/03/20 12:48:05
#Version : 1.0.0
#Use Notes :
# ./sora_enable.sh -> Habilitar
# No usa console.lib, ni console.es
#==============================================================================
# Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>]
#==============================================================================
# Este programa es software libre: usted puede redistribuirlo y/o modificarlo
# bajo los términos de la Licencia Pública Affero General de GNU tal como
# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia,
# o (a su elección) cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea útil,
# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la
# Licencia Pública Affero General de GNU para obtener más detalles.
#
# Debería haber recibido una copia de la Licencia Pública Affero General
# junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>.
# Configuración inicial
# Usar DEVELOPER_DIR de base.lib
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BIN_BASE="bin"
BIN_LIBS="lib"
BIN_MESG="msg"
BIN_CFGS="config"
# Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto
if [ -f "$SCRIPT_DIR/config/devspath.dat" ]; then
DEVSPATH=$(cat "$SCRIPT_DIR/$BIN_CFGS/devspath.dat")
else
DEVSPATH="devs"
fi
BIN_HOME="$HOME/$DEVSPATH"
VERSION=$(cat "$BIN_HOME/$BIN_BASE/$BIN_CFGS/version")
# CHECK SHELL LANGUAGE
BIN_LANG=${LANG:0:2}
# Importar bibliotecas necesarias
source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib"
# Cargar mensajes en el idioma del sistema o español por defecto
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head"
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "developers"
title="${head_000} ${srmsg_000}"
# Verificar que 'dialog' esté instalado
if ! command -v dialog &>/dev/null; then
echo "${npm_001}"
clear
exit 1
fi
# Función para agregar alias de Sora para Aider
sora_alias() {
local alias_nombre="sora"
local alias_comando=""
local shell_config=""
# Determinar la ruta del comando aider
if [[ -x "$HOME/.local/bin/aider" ]]; then
alias_comando="$HOME/.local/bin/aider"
else
alias_comando="aider" # Fallback al comando en el PATH
fi
# Detectar el shell actual y seleccionar el archivo de configuración adecuado
case "$SHELL" in
*/bash)
shell_config="$HOME/.bashrc"
;;
*/zsh)
shell_config="$HOME/.zshrc"
;;
*)
dialog --backtitle "${title}" --title "${head_error}" --msgbox "${srmsg_021}" 7 50
return 1
;;
esac
# Verificar si el alias ya existe en el archivo de configuración
if grep -q "alias $alias_nombre=" "$shell_config"; then
dialog --backtitle "${title}" --title "${srmsg_008}" --msgbox "${srmsg_004} $shell_config" 7 60
return 2
else
# Agregar el alias al final del archivo de configuración
echo "alias $alias_nombre='$alias_comando'" >> "$shell_config"
if [[ $? -eq 0 ]]; then
# Recargar el archivo de configuración
source "$shell_config" 2>/dev/null || true
dialog --backtitle "${title}" --title "${srmsg_009}" --msgbox "${srmsg_005} $shell_config\n\nRecuerde ejecutar: source $shell_config" 9 60
else
dialog --backtitle "${title}" --title "${head_error}" --msgbox "${srmsg_019}" 7 50
return 1
fi
fi
}
# Confirmar activación
dialog --backtitle "${title}" --title "${npm_031}" --yesno "${srmsg_002}" 7 50
if [[ $? -eq 0 ]]; then
# Crear un archivo fuente para la activación del alias
ALIAS_FILE="$BIN_HOME/bin/sora_alias.sh"
echo '#!/bin/bash' > "$ALIAS_FILE"
echo '# Verificar si ~/.local/bin está en el PATH' >> "$ALIAS_FILE"
echo 'if [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then' >> "$ALIAS_FILE"
echo ' # Si no está en el PATH, usamos la ruta completa en el alias' >> "$ALIAS_FILE"
echo ' alias sora="$HOME/.local/bin/aider"' >> "$ALIAS_FILE"
echo 'else' >> "$ALIAS_FILE"
echo ' # Si está en el PATH, podemos usar el nombre directamente' >> "$ALIAS_FILE"
echo ' alias sora="aider"' >> "$ALIAS_FILE"
echo 'fi' >> "$ALIAS_FILE"
echo "echo \"${srmsg_017}\"" >> "$ALIAS_FILE"
chmod +x "$ALIAS_FILE"
# Ejecutar la función sora_alias para el archivo de configuración permanente
sora_alias
# Crear un mensaje con instrucciones para activar el alias en la sesión actual
dialog --backtitle "${title}" --title "${srmsg_008}" --msgbox "${srmsg_006}\n\n${srmsg_007}\n\nsource $ALIAS_FILE\n\n" 10 70
else
dialog --backtitle "${title}" --title "${head_canceled}" --msgbox "${npm_008}" 6 40
clear
exit 1
fi
# Limpiar consola
clear

View file

@ -1,3 +0,0 @@
#!/bin/bash
unalias sora 2>/dev/null
echo "Alias sora deshabilitado"

View file

@ -357,26 +357,6 @@ cortana "Diseña una API RESTful completa para gestionar una biblioteca con usua
cortana --file legacy-app.php "Este código PHP usa una versión antigua (5.6). Actualízalo a PHP 8.0, utilizando características modernas como tipos estrictos, propiedades tipadas, y construcciones match. Mantén la funcionalidad original."
```
## Consideraciones Éticas y Limitaciones
### Limitaciones Actuales
- Cortana puede proporcionar información imprecisa o desactualizada
- El conocimiento está limitado a la fecha de corte del modelo
- No puede ejecutar código directamente ni acceder a recursos online
- Podría generar soluciones que no se adaptan perfectamente a tu caso específico
### Uso Ético
- No uses Cortana para generar código malicioso o engañoso
- Verifica y comprende el código generado antes de implementarlo
- Cita apropiadamente cuando uses asistencia de IA en trabajos académicos o profesionales
- Respeta los términos de servicio de Anthropic
## Créditos y Reconocimientos
Cortana está basada en Claude de Anthropic, un asistente de IA de última generación. Todas las capacidades de procesamiento de lenguaje natural son proporcionadas por Claude, mientras que la interfaz CLI y las integraciones específicas para desarrollo han sido implementadas por el equipo de MRDevs Tools.
## Archivo CLAUDE.md de Configuración
El archivo `CLAUDE.md` es una poderosa herramienta para personalizar y controlar el comportamiento de Cortana en proyectos específicos. Este archivo de configuración, cuando se coloca en la raíz de un proyecto, permite establecer parámetros, directrices y comportamientos personalizados que Cortana seguirá automáticamente al trabajar en ese proyecto.
@ -619,6 +599,26 @@ cp template-CLAUDE.md ~/nuevo-proyecto/CLAUDE.md
4. **Incluye ejemplos**: Proporciona ejemplos específicos de lo que consideras código "bueno" y "malo".
5. **Versionamiento**: Mantén el archivo CLAUDE.md en control de versiones junto con el código.
## Consideraciones Éticas y Limitaciones
### Limitaciones Actuales
- Cortana puede proporcionar información imprecisa o desactualizada
- El conocimiento está limitado a la fecha de corte del modelo
- No puede ejecutar código directamente ni acceder a recursos online
- Podría generar soluciones que no se adaptan perfectamente a tu caso específico
### Uso Ético
- No uses Cortana para generar código malicioso o engañoso
- Verifica y comprende el código generado antes de implementarlo
- Cita apropiadamente cuando uses asistencia de IA en trabajos académicos o profesionales
- Respeta los términos de servicio de Anthropic
## Créditos y Reconocimientos
Cortana está basada en Claude de Anthropic, un asistente de IA de última generación. Todas las capacidades de procesamiento de lenguaje natural son proporcionadas por Claude, mientras que la interfaz CLI y las integraciones específicas para desarrollo han sido implementadas por el equipo de MRDevs Tools.
## Recursos Adicionales
- [Documentación Oficial de Claude](https://docs.anthropic.com/)

View file

@ -1,21 +0,0 @@
{
"data": "ENC[AES256_GCM,data:xZ84DDD9N8+It9MgjWpCkMRwWQCXv/+QrsAs7ZEof50WmsLIhWp0ZMEZKzr35vZmboLHeRd0iCZ6QWElwfEWTnOqPTrt1RHfZ3sw3JhWmWXmyTO/pY9xS21WLTLkFWnZPj6lrqRd,iv:FRzRXlxS6IGZL6FT/1CbwgAXkIlMxPyuW6gxPe5Np9s=,tag:kcvzc+KkH7AaE0HEBmhlzw==,type:str]",
"sops": {
"kms": null,
"gcp_kms": null,
"azure_kv": null,
"hc_vault": null,
"age": null,
"lastmodified": "2025-03-27T05:20:30Z",
"mac": "ENC[AES256_GCM,data:6DoGPsyt5nMjQSadGebJ7g+Lg0DO+gjdoriK4i+/xkoTeYHDThrTeujuGR7RR8pKvHhUCqhAaniu/VY1g4UHKkhwMbBL/gaTPY8816KzPDIoaSDYwThxJLpq0V2+FVAQ106+Ey8gGtzP1B17VSFQEsRBorb91B1wvpAfpB+eOnc=,iv:cRSNvc2QegVSw2M7PKnPWSeHD719atrpTR/uf1DHMTU=,tag:221g5vI3e6FK/JqaxfOPSA==,type:str]",
"pgp": [
{
"created_at": "2025-03-27T05:20:30Z",
"enc": "-----BEGIN PGP MESSAGE-----\n\nhQIMAx5Q8cfEImn/AQ/8DEkDwYJw+hl/xJHlH1Wl6dC2GGZtvbgGrJV83T9V+0a9\nh+rLqYe3aW6EBlpJTiSkdC0t0ZNNrvSFKl96SyLlc7PMVOZIr9pLYVwhGJwOEK8c\nJ+wzN19dGPY0TvAmv/2lUZyIDS1lvNTofJQRe4LuakRjBOOOqmtpI2FS1WGyWo6A\nYNqqMcYBjLVQVtvt74LgY3PPolGBvf/j4lK7PWzd7FiN3fGzN5dGJZDr35swI+sN\nsHPbrkVKZovHojkno46uAYy9AG+r/MvvhEc2nVuSXUHbzlzzuSsDSfMwMo+MBPMv\ndPWL6+qYruMM7xmem9l6k7Z32p3QPudb/JVtCqolqyY0ReT9oOAKSIuFVrxdKoN2\nVgdwWXvSK2/f5+kTaNv0zU8E+Zh5I6jt2BybdF6eABzlggYYo89yasgw7pLgwmND\nxdFKzXvOdPUpkWsuMzHTLRJ3H3TBc1QImj/yuilOoqrcUB+Dp2S1B0/u6GFpmPXU\nbgXKoTqnlAmBNFJsEFJDZCwxZg1ONrw2qzfpFc1lff0d5qidZgWPm89K64oxT/22\nQ397fe7EuNWddLSEjg9jiV31Ur5ZJXtLvHnaZpOvlpDyS52nTJIlYrLwLK0/k1yN\n1Jaxz2OhcfCbzWMl6Qp72kpMOCjszeC1aY1wxTZK0E44ZYG8o+EZyeoUD7QNkb/S\nXgGdOUnOC6RD/VtXSkzjhjEPnV641G/XwlfbNzsLQAZMxrXH2yto7WCYR8opRNPa\n1hhmaMtNec64eVnkCiJvfnzlGY7h3WBxCL9v3DkEta1bOmn4Ay4OOYT9Mh29ais=\n=1NAN\n-----END PGP MESSAGE-----",
"fp": "ACB17A9DB7A680D0FED714E2A17ADF8EA1E9DB07"
}
],
"unencrypted_suffix": "_unencrypted",
"version": "3.9.2"
}
}

View file

@ -1,21 +0,0 @@
{
"data": "ENC[AES256_GCM,data:wzUuXCw/03iQx/uBbYZaH2RUUOS9kRNsOxeYnf9gxg9EtTnHcAKCdgsi57MjCAOoJNFModUP1oiI,iv:0OxbnDf+YpAUxPKD4pwWr1m2SKigjltl2Tia9Ebvha0=,tag:IfBggkQeIxnNIa1L6WOp8Q==,type:str]",
"sops": {
"kms": null,
"gcp_kms": null,
"azure_kv": null,
"hc_vault": null,
"age": null,
"lastmodified": "2025-03-22T19:17:45Z",
"mac": "ENC[AES256_GCM,data:3DYGOmI8egY+KHpzhF8grzCs1cJ0nMc0YeQlDV7X0B4+vEK/Ja7YR7bUG4zIR38OhpENZbHMDK2ciyoifJdO4hPZKQk/+MsmdmfxV9WF+lJ0AXe3U/mGmpDv5W9KHmR13zgaN0On2cQT9cLziA7KpaSGw4CfLNgxKU/OSJC7iW0=,iv:J34Sj4LMzGCD6TOB6IU71kT8Sxj7orUb0A0yRfyB8kI=,tag:quu2v+T8lTyqRKGtE7vs8Q==,type:str]",
"pgp": [
{
"created_at": "2025-03-22T19:17:45Z",
"enc": "-----BEGIN PGP MESSAGE-----\n\nhQIMAx5Q8cfEImn/AQ//TNSynZiJbXr16tKHNusO/8UHpS1bWIuSjJG0lcdc7c/7\nGbmDzl5mRxi38FhP/evzNiArB8uL81P0hfKogdNIFe+19yVXzuCBxd9FMLLKnFkX\nvm+0O7fkQsAU266w0snbDZdZuM6gDqiERdgeUrUh4rSdgjeHMoa2MvfpL62ncjF3\nhZL8RMGSF6Q2mjYWkjgJqVbPzKeB4x7adm3HD7YTTzSBoAChVXXSUhXl4ZMfglWb\nlF9bXrOXFwzZtiWDsLfciJdlM6hy7sDsMUIXcMXTEPNv4cMkftKzKSbD9iN1MYP0\nZC7r/yhQtZqbN1IKjtqmSBPgvhS6CbCGt7GG5iH5ohqt1L/+bJYiEkuves1DRkBq\nREDiVhHL0Dn4qTafBuE2zDB8T1MzKagUS62qJM5ODyHaC8UXz7C2OSsFIxwccZI6\njkCCW5Kx9inxNvvtwkQo8f1RH1ui+CE1f18quxCR9cTqM4Z1hADZSRQCc9DFOBC/\nVVMcdlXRluD2cwtqUyzjIAMzmDske4GRVgJsEib8b8m1Y6P783kfHJI6qjFCzLmE\npnTwOYs946K8NmVawcl6FgdDxuIZltQgMuD7xCaVR+p3IDFUNH1EYPEO8lhtTGAS\n7ScRrZYmOM+T+sHk3U+3T4OtDUjWrWMPXVC4+FrFaBUhZQ4jsjNnBkuQeqPshy3S\nXAHS4cfo9VIixvbwVibiAVkGCc4eUFiIQO/7FArmQ66Cp1YxtmbD2jCyoHAl+bMl\nlfOnww8y4AwB3+cnj2PkxnEPr2D5bvC4XPWSqhcPziUY/y7m9GUkYadKSIRq\n=wLIg\n-----END PGP MESSAGE-----",
"fp": "ACB17A9DB7A680D0FED714E2A17ADF8EA1E9DB07"
}
],
"unencrypted_suffix": "_unencrypted",
"version": "3.9.2"
}
}

View file

@ -1,21 +0,0 @@
{
"data": "ENC[AES256_GCM,data:G4t/rJUQ+D5kXKpa9Z6ho0j63PjcqAJszUHfTaj6mY99HO5Oq44cmoNTJF3B8T+jLe6L+tCmGjCprtxf9gn6rJH2J7yZNg+rM34AZnE=,iv:mUjUwD+JxfGdWQCU3EpkSEdAtJfeagK2qgWRe50aQb0=,tag:IfMBpStbF1WN8QED8ce4iA==,type:str]",
"sops": {
"kms": null,
"gcp_kms": null,
"azure_kv": null,
"hc_vault": null,
"age": null,
"lastmodified": "2025-03-21T22:05:23Z",
"mac": "ENC[AES256_GCM,data:bJhHUYvPCnW70WDrmMQlXYVl+YlUXISaq3Jl0+yUn0f58UTAw+tV/VRAhwQ4Idem2qh/O9O/z6agoRfAmcBsM33nFqltS19jDkfH8p69wSAqkpgFG+5/1uQuQuFdZPsDuBHWWVQPifk8B7ou9K+aZoBMtDN3+1KXKOfzy5ZE/6A=,iv:K1IDjtKZZbrkJ/d/KHLqv27fE8C+PkCWAO2UF5kvUKo=,tag:k4jvC0x0Aptr4iHrJNhB6A==,type:str]",
"pgp": [
{
"created_at": "2025-03-21T22:05:23Z",
"enc": "-----BEGIN PGP MESSAGE-----\n\nhQIMAx5Q8cfEImn/ARAAlnbMPu1hX3CoWRbVBL4WoLM/4YkI63hMyezqVVGX9H0i\nFt+nts0Y+quG9NcS0VBdEhR/fsCoJMIsDRf4KG6Hx0iW7KizOpOMhekhjoDKDms/\n4qAy5y5JxSLJCi2Q/6ATOsBMceK+tZyvsMEEcptsp+rd1i6Ij19+mWY3S6HCtIjT\nRbK54vMgOOmmoja6RZpYS+1jwEm3Elk6MfnKRBuZf1DYbcp3VL9jQdsViG9rB5gf\nJvvo8/nACa1Du4plgrwLEL70OFU0ZYq5Ag1J3e5G3wSD4Wfvynn/vw7Cc4mixmlj\nuZyPgsoLFxEYMGDoIupi/ztdWGTH7rFJxc0wFgVIj1bLKXJ0MRarR0tNkuTN2tFV\n7oZoRzEjU7yKP+OEXBn4EKNrAXzgDQK4x/Vrp111ucsZd6hlz0EhbUHSuXZDzkVX\nm7uKa/1/drjYNuOoaFOEAjAC8C0lYbatncihOjqsv/4QNCL0xW5Lhm7kn0CeUxnk\nSt5KNIejL8aTgtWTGuHmgDMIjVwcifIMi4TY11z9s1Qm8qWraTr83dufuMRfJ/S2\nn4WA0sRNLhPjaLrNX6TqhsBbbdDa7qZugVWiy1vFfO3s25WWMGjuee7PC3ROziTF\n0Z8PNYUliMCpkwnzrIXZLJGiSDa2pYgjdj7Oq8FFXKqWhlAROvMprdX5lBPX7h7S\nXgGfnc1LlfxuK1fZ5jIUgq5g089+gUaRh7w04a2hEfAdLjMwuy3Pp5M+q4dBDwj/\nrtMNLfsLx7KZvY5RH5t/kp9EO652ckxRp+6q+XFUf0vc/Be/H2FhioCIAakq3MI=\n=KHeg\n-----END PGP MESSAGE-----",
"fp": "ACB17A9DB7A680D0FED714E2A17ADF8EA1E9DB07"
}
],
"unencrypted_suffix": "_unencrypted",
"version": "3.9.2"
}
}

View file

@ -1,21 +0,0 @@
{
"data": "ENC[AES256_GCM,data:dbwrHE/0qqxyl1IJ6zd8hR3PmAYPF4lDDnWSDTKhW9kBNEf5WHRjgCK55bNBWVw7F9zcQa4vTuuyMzxXfy3iSJNeXDKDdKEZetf/x4KIl/RCsDwvN6fbxfBBeIL9O/xKzJiH5QXFMJIlWXUfAI/BUpndamKp/8zIqGjSI/rUnEIFB/JdU7puBxw6/3npct9oNVY=,iv:k4Da7Vfhnusbq5eLaF4TEFTyF2tswhKEWPuA9h6I2EU=,tag:geUtJ1HP2+q9cKRuEWHPgA==,type:str]",
"sops": {
"kms": null,
"gcp_kms": null,
"azure_kv": null,
"hc_vault": null,
"age": null,
"lastmodified": "2025-03-21T22:27:06Z",
"mac": "ENC[AES256_GCM,data:DEEEq9qvSGhsgWb6k5br0mxB85LAgA7XWxuFyi3TF+kIe/f2/Du/RNnvU9/jDU5eN6w6K+ERQQNwG9YcL8VlWK07xrQYxL40SEuPB0vhWFCA+yXXrNGLalv+vWHDK2S9wnv1p//fk9IwrDLDfk6ki+/P/hxne7IV31lYoF+EOLc=,iv:QOcBMPiSrKDzWflQ1loDb1+E29GooZwGYXkbsWOJvyg=,tag:cSy6ImCXKKZSitQWuB6s4Q==,type:str]",
"pgp": [
{
"created_at": "2025-03-21T22:27:06Z",
"enc": "-----BEGIN PGP MESSAGE-----\n\nhQIMAx5Q8cfEImn/AQ/9FbFO7illKRiQoiRWszamHYbEGLDNCnOwzdqvMCC1k3EK\nsqtp6MzNbO3LvR6BOHNPuybvSQUdf4xKMAKOsWHk3i61nJhzc0q6Q7SWYmDli4xi\nD2YF3NQEYcyCS/rf45jKtm5eJuvQGZT+y9+hVWXV+NRCoG86eiQabY+MoCJ1y0k7\nKq+/uza6Tvpnaxqeyf9a0kwUnskjmcRt2r72+BfMVpDlHSQ079zhpRo4VdGoDizW\nFJ3XrFiLqP8LAEFZaBpJzXBphXp0uvSHq9Fq+ELTHWArcoT/48Gqm8ZPuuU+J8TV\nA4E4TwfWjxJojcrPHCisXapW/5WiYssR+QZxmeoTgoCJXHpFkWFiHiGWWOYslQdb\noBlvr0+qnPlaFdx11hqvJ2Yoo4pWWsdDi/MYQEP5+ExVpfbCH+V6OeQ+YsmSdHhF\nHZXH8eqRFI7QY46Wyn3NiOnhVt+iRNrd9mWDanzkCPEE3BgounwA4nmvvfOie8qU\nkbcsAdfnd4VJK4G5qe1bz3BfsQmJf5xtVCV9XFDT47uyIJub2fc4Z0DQCherfhvc\n07RSYGU6/r2niIt9p79xoUNn6gcl40vFUTObR1BGoUcuulNMr9mf57N3OHwEp+le\ni3eFZA8yw5PVzTuAhqkhRlNP5vtP9MVongIbhD0MGgfJ11RHzwekccsILZyelWPS\nXAEHpLpxLyD8FQBtL7C7tC/kwi8Pr1wtSpgWH0aI2oEgtZR39uKxVp0x6vn9c4ZV\npVxnQQb6IhsgGn2ZUjzkkegaXIASqi4kXKV4FIhOtU9EVMDkiCSwnKgPYJtH\n=+1pw\n-----END PGP MESSAGE-----",
"fp": "ACB17A9DB7A680D0FED714E2A17ADF8EA1E9DB07"
}
],
"unencrypted_suffix": "_unencrypted",
"version": "3.9.2"
}
}