[DOCS] Actualizada documentación del instalador de Zettlr

- Añadida información sobre características adicionales del instalador
- Detallada la solicitud de permisos de administrador
- Clarificado el uso de interfaz gráfica y línea de comandos
- Documentada la obtención automática de la última versión desde GitHub
- Mencionada la limpieza de archivos de configuración residuales

🤖 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-04 10:51:40 -05:00
parent ac44e391c8
commit 4a372209d9
Signed by: mrosero
GPG key ID: 83BD2A5F674B7E26
23 changed files with 158 additions and 198 deletions

View file

@ -1,16 +1,16 @@
# MRDevs Tools
<p align="center">
<img src="https://img.shields.io/badge/License-AGPL--3.0-blue.svg" alt="License: AGPL-3.0">
<img src="https://img.shields.io/badge/version-1.3.1-green.svg" alt="Version: 1.3.1">
</p>
<center>
<p align="center">
<img src="https://img.shields.io/badge/Shell-80%25-yellow.svg" alt="Shell: 80%">
<img src="https://img.shields.io/badge/Python-5%25-blue.svg" alt="Python: 5%">
<img src="https://img.shields.io/badge/Bash_Lib-13%25-orange.svg" alt="Bash Lib: 13%">
<img src="https://img.shields.io/badge/Config-2%25-lightgrey.svg" alt="Config: 2%">
</p>
![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)
![Version: 1.3.1](https://img.shields.io/badge/version-1.3.1-green.svg)
![Shell: 80%](https://img.shields.io/badge/Shell-80%25-yellow.svg)
![Python: 5%](https://img.shields.io/badge/Python-5%25-blue.svg)
![Bash Lib: 13%](https://img.shields.io/badge/Bash_Lib-13%25-orange.svg)
![Config: 2%](https://img.shields.io/badge/Config-2%25-lightgrey.svg)
</center>
## 📋 Descripción
@ -339,6 +339,13 @@ El script proporciona una instalación especializada para cada plataforma:
- En macOS: Utiliza Homebrew para instalación
- En FreeBSD: Configuración manual con AppImage (no hay soporte oficial)
Características del instalador:
- Obtiene automáticamente la última versión disponible desde GitHub
- Solicita permisos de administrador cuando son necesarios
- Utiliza interfaz gráfica para confirmación y línea de comandos para instalación
- Limpia archivos de configuración residuales durante la desinstalación
- Proporciona información detallada sobre las características de Zettlr
### Herramientas para Control de Versiones
MRDevs Tools incluye scripts para simplificar la instalación de CLIs para diferentes plataformas Git:

View file

@ -149,11 +149,23 @@ install() {
os_pkgs_install $SQLITE_PACKAGE
fi
# Install python from OS Packages
command_installed $PYTHON_PACKAGE
# Install full Python package even if basic Python is already installed
command_installed python3-full
if [ $? -ne 0 ]
then
# Si python3-full no está instalado, instalarlo
python3_install
else
# Si ya está python3 básico pero queremos asegurar que python3-full esté instalado
command_installed $PYTHON_PACKAGE
if [ $? -eq 0 ]
then
echo "Asegurando instalación completa de Python..."
if [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then
apt update
apt install -y python3-full
fi
fi
fi
# Verificar si pip está instalado, instalarlo si es necesario
@ -163,6 +175,13 @@ install() {
pip_install
fi
# Verificar si pipx está instalado, instalarlo si es necesario
command_installed pipx
if [ $? -ne 0 ]
then
pipx_install
fi
# Install mozilla sops from OS Packages
command_installed $SOPS_PACKAGE
if [ $? -ne 0 ]

View file

@ -34,7 +34,7 @@ SHOW_RESULTS = True
# Directorio base del proyecto
BASE_DIR = Path(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
CONFIG_DIR = BASE_DIR / 'bin' / 'config'
RATES_DIR = CONFIG_DIR / 'rates' # Ubicación para archivos de tarifas
RATES_DIR = BASE_DIR / 'data' / 'rates' # Ubicación para archivos de tarifas
# Constantes para el modelo COCOMO básico
COCOMO_MODELS = {
@ -210,7 +210,8 @@ def estimate_cocomo(loc, model_type='organic', cost_per_pm=5000, programmer_type
# Redondear valores para presentación
effort_pm = round(effort_pm, 2)
dev_time = round(dev_time, 2)
avg_staff = round(avg_staff, 2)
# Redondear personal promedio al entero próximo (ceil)
avg_staff = ceil(avg_staff)
hourly_rate = round(hourly_rate, 2)
total_cost = round(total_cost, 2)

View file

@ -1 +0,0 @@
57.73

View file

@ -1 +0,0 @@
23.64

View file

@ -1 +0,0 @@
51.00

View file

@ -1 +0,0 @@
56.81

View file

@ -1 +0,0 @@
59.11

View file

@ -1 +0,0 @@
49.00

View file

@ -1 +0,0 @@
41.00

View file

@ -1 +0,0 @@
88.66

View file

@ -1 +0,0 @@
49.00

View file

@ -1 +0,0 @@
49.00

View file

@ -1 +0,0 @@
47.00

View file

@ -1 +0,0 @@
20.00

View file

@ -1 +0,0 @@
49.00

View file

@ -1 +0,0 @@
49.00

View file

@ -1 +0,0 @@
31.00

View file

@ -1,91 +0,0 @@
#!/bin/bash
#Script : fix_haos_paths.sh
#Apps : MRDEVS TOOLS
#Description : Corrige rutas en contenedores HAOS existentes y crea estructura correcta
#Author : Cortana Rosero One <cortana@rosero.one>
#Created : 2025/04/02 12:00:00
#Modified : 2025/04/02 12:00:00
#Version : 1.0.0
#==============================================================================
# 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/>.
# [Generated] Created by Claude Code (claude-3-7-sonnet-20250219)
echo "=== Corrigiendo rutas de Home Assistant ==="
# Configuración de contenedores
HA_CORE_CONTAINER_NAME="homeassistant"
HA_OS_CONTAINER_NAME="haos"
# Asegurar que estamos en un directorio de proyecto
if [[ ! "$PWD" == *"/projects/"* ]]; then
echo "ADVERTENCIA: No parece estar en un directorio de proyecto."
echo "Este script debe ejecutarse desde la carpeta del proyecto (ej: /home/mrosero/devs/projects/ha-home)"
read -p "¿Desea continuar de todos modos? (s/n): " CONTINUE
if [[ ! "$CONTINUE" =~ ^[Ss]$ ]]; then
echo "Operación cancelada."
exit 1
fi
fi
# Crear estructura de directorios correcta
echo "Creando estructura de directorios correcta en $PWD/ha"
mkdir -p "$PWD/ha/config" "$PWD/ha/media" "$PWD/ha/ssl" "$PWD/ha/share"
chmod -R 755 "$PWD/ha"
# Verificar y detener contenedores si están ejecutándose
for CONTAINER in $HA_CORE_CONTAINER_NAME $HA_OS_CONTAINER_NAME; do
if podman container exists $CONTAINER; then
echo "Deteniendo contenedor $CONTAINER..."
podman stop $CONTAINER
echo "Eliminando contenedor $CONTAINER (los datos persistirán)..."
podman rm $CONTAINER
fi
done
# Verificar si existe la estructura antigua
OLD_PATH="/home/mrosero/devs/homeassistant"
if [ -d "$OLD_PATH" ]; then
echo "Se encontró estructura antigua en $OLD_PATH"
# Migrar datos si es necesario
if [ -d "$OLD_PATH/config" ] && [ "$(ls -A "$OLD_PATH/config" 2>/dev/null)" ]; then
echo "Migrando datos de configuración..."
cp -r "$OLD_PATH/config/"* "$PWD/ha/config/"
fi
if [ -d "$OLD_PATH/media" ] && [ "$(ls -A "$OLD_PATH/media" 2>/dev/null)" ]; then
echo "Migrando datos de media..."
cp -r "$OLD_PATH/media/"* "$PWD/ha/media/"
fi
if [ -d "$OLD_PATH/ssl" ] && [ "$(ls -A "$OLD_PATH/ssl" 2>/dev/null)" ]; then
echo "Migrando certificados SSL..."
cp -r "$OLD_PATH/ssl/"* "$PWD/ha/ssl/"
fi
if [ -d "$OLD_PATH/share" ] && [ "$(ls -A "$OLD_PATH/share" 2>/dev/null)" ]; then
echo "Migrando datos compartidos..."
cp -r "$OLD_PATH/share/"* "$PWD/ha/share/"
fi
echo "Respaldando estructura antigua a ${OLD_PATH}_backup..."
mv "$OLD_PATH" "${OLD_PATH}_backup"
fi
echo "=== Operación completada ==="
echo "Ahora puede iniciar Home Assistant con:"
echo "../../bin/haos.sh start"

View file

@ -104,7 +104,7 @@ function python3_install() {
elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then
# En sistemas Debian y derivados, instalamos o actualizamos Python a través de apt
apt update
apt install -y python3
apt install -y python3-full
elif [ -f /etc/redhat-release ]; then
# En sistemas Red Hat, instalamos o actualizamos Python a través de yum
dnf install -y python3
@ -142,7 +142,7 @@ function python3_update() {
elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then
# En sistemas Debian y derivados
apt update
apt install --only-upgrade -y python3
apt install --only-upgrade -y python3-full
elif [ -f /etc/redhat-release ]; then
# En sistemas Red Hat
dnf upgrade -y python3
@ -190,6 +190,30 @@ function pip_install() {
}
# Install pipx package
function pipx_install() {
echo "Instalando pipx..."
# Verificar si pip está instalado
command_installed pip3
if [ $? -ne 0 ]; then
# Si pip no está instalado, llamamos a la función de instalación
pip_install
fi
if [ "$(uname)" == "Darwin" ]; then
# En macOS, instalamos pipx a través de Homebrew
brew install pipx
pipx ensurepath
else
# En otros sistemas, instalamos pipx a través de pip
python3 -m pip install --user pipx
python3 -m pipx ensurepath
fi
echo "pipx instalado correctamente."
}
# Update pip package
function pip_update() {
@ -236,6 +260,31 @@ function pip_update() {
}
# Update pipx package
function pipx_update() {
echo "Actualizando pipx..."
# Verificar si pipx está instalado
command_installed pipx
if [ $? -ne 0 ]; then
# Si pipx no está instalado, llamamos a la función de instalación
pipx_install
return $?
fi
# Actualizar pipx según el sistema operativo
if [ "$(uname)" == "Darwin" ]; then
# En macOS, actualizamos pipx a través de Homebrew
brew upgrade pipx
else
# En otros sistemas, actualizamos pipx a través de pip
python3 -m pip install --user --upgrade pipx
fi
echo "pipx actualizado correctamente."
return 0
}
# Install mozilla sops package on os system supported
function sops_install() {

View file

@ -1,55 +0,0 @@
#!/bin/bash
#Script : path_add.sh
#Apps : MRDEVS TOOLS
#Description : Add bin directory to PATH (non-persistent)
#Author : Cortana Rosero One <cortana@rosero.one>
#Generated : Created by Claude Code (claude-3-7-sonnet-20250219)
#Created : 2025/04/01 21:00:00
#Modified : 2025/04/01 21:00:00
#Version : 1.3.1
#Use Notes : Source this script to add bin directory to PATH
#==============================================================================
# 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/>.
# Determinar la ruta base de la plataforma de desarrollo
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEVSPATH=$(cat "$SCRIPT_DIR/config/devspath.dat")
BIN_DIR="$HOME/$DEVSPATH/bin"
# Función para verificar si una ruta ya está en el PATH
function path_contains() {
local check_path="$1"
echo "$PATH" | grep -q -E "(^|:)$check_path(:|$)"
return $?
}
# Función para agregar la ruta al PATH
function add_to_path() {
local bin_path="$1"
if ! path_contains "$bin_path"; then
export PATH="$bin_path:$PATH"
echo "✅ Ruta '$bin_path' agregada al PATH"
else
echo " La ruta '$bin_path' ya está en el PATH"
fi
}
# Agregar la ruta bin al PATH
add_to_path "$BIN_DIR"
echo "✨ Los comandos de desarrollo están disponibles en esta sesión"
echo "💡 Uso: source ${BIN_DIR}/path_add.sh"

View file

@ -85,7 +85,7 @@ def check_install_pycountry():
# Directorio base del proyecto
BASE_DIR = Path(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
CONFIG_DIR = BASE_DIR / 'bin' / 'config'
RATES_DIR = CONFIG_DIR / 'rates' # Nueva ubicación para archivos de tarifas
RATES_DIR = BASE_DIR / 'data' / 'rates' # Nueva ubicación para archivos de tarifas
# Archivos de configuración para la API de Perplexity
MODEL_CONFIG_FILE = CONFIG_DIR / 'rate_model.ai'
@ -157,12 +157,20 @@ def get_perplexity_api_key():
# Si seguimos sin tener API key, mostrar error y salir
if not api_key:
logger.error("No se encontró la clave API de Perplexity.")
logger.error("Opciones para configurarla:")
logger.error("Se usarán valores predeterminados para las tarifas.")
logger.error("Para obtener tarifas más precisas, configure la API key de Perplexity:")
logger.error("1. Establecer la variable de entorno PERPLEXITY_API_KEY")
logger.error("2. Crear un archivo ~/.perplexity/api_key con la clave")
logger.error("3. Crear un archivo ~/.config/perplexity/api_key con la clave")
logger.error("4. Crear un archivo bin/config/perplexity_api_key en el directorio del proyecto")
sys.exit(1)
if SHOW_RESULTS:
print("\nADVERTENCIA: No se encontró la clave API de Perplexity.")
print("Se usarán valores predeterminados para las tarifas.")
print("Para obtener tarifas más precisas, configure la API key visitando:")
print("https://docs.perplexity.ai/docs/getting-started")
return None
# Validar formato básico de la API key
if not api_key.startswith('pplx-'):
@ -463,10 +471,8 @@ def update_single_rate(programmer_type):
# Verificar disponibilidad de la API
api_available = True
try:
# Intentar obtener la clave API (si falla, saltará una excepción)
get_perplexity_api_key()
except:
api_key = get_perplexity_api_key()
if api_key is None:
api_available = False
logger.warning("API de Perplexity no disponible. Se usarán valores predeterminados.")
@ -666,10 +672,8 @@ def update_rate_files(force_update=False):
# Verificar disponibilidad de la API
api_available = True
try:
# Intentar obtener la clave API (si falla, saltará una excepción)
get_perplexity_api_key()
except:
api_key = get_perplexity_api_key()
if api_key is None:
api_available = False
logger.warning("API de Perplexity no disponible. Se usarán valores predeterminados.")

View file

@ -100,7 +100,7 @@ update_python_and_pip() {
elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then
# En sistemas Debian y derivados
apt update
apt install --only-upgrade -y python3
apt install --only-upgrade -y python3-full
elif [ -f /etc/redhat-release ]; then
# En sistemas Red Hat
dnf upgrade -y python3
@ -156,10 +156,25 @@ update_python_and_pip() {
echo -e "\n${head_info}: Actualizando Python y pip..."
# Update Python
# Update Python - asegurándonos de que python3-full esté instalado
command_installed python3-full
PYTHON_FULL_INSTALLED=$?
command_installed python3
if [ $? -eq 0 ]; then
PYTHON_BASIC_INSTALLED=$?
if [ $PYTHON_FULL_INSTALLED -eq 0 ]; then
# Si python3-full está instalado, actualízalo
python3_update
elif [ $PYTHON_BASIC_INSTALLED -eq 0 ]; then
# Si solo python3 básico está instalado, instala la versión completa
echo -e "\n${head_info}: Actualizando a la versión completa de Python..."
if [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then
apt update
apt install -y python3-full
else
python3_update
fi
else
echo -e "\n${head_error}: Python3 no está instalado. Ejecute bin/bootstrap.sh primero."
fi
@ -172,30 +187,56 @@ update_python_and_pip() {
echo -e "\n${head_error}: pip3 no está instalado. Ejecute bin/bootstrap.sh primero."
echo -e "Esta dependencia es necesaria para varias herramientas del sistema."
fi
# Update pipx separately
command_installed pipx
if [ $? -eq 0 ]; then
# Función interna para actualizar pipx
function pipx_update_internal() {
echo "Actualizando pipx..."
if [ "$(uname)" == "Darwin" ]; then
# En macOS, actualizamos pipx a través de Homebrew
brew upgrade pipx
else
# En otros sistemas, actualizamos pipx a través de pip
python3 -m pip install --user --upgrade pipx
fi
echo "pipx actualizado correctamente."
}
pipx_update_internal
else
echo -e "\n${head_error}: pipx no está instalado. Ejecute bin/bootstrap.sh primero."
fi
echo -e "\n${head_info}: Actualización de Python y pip completada."
echo -e "\n${head_info}: Actualización de Python, pip y pipx completada."
}
# Verificar si Python o pip están instalados y si se necesitan actualizar
# Verificar si Python, pip o pipx están instalados y si se necesitan actualizar
command_installed python3
PYTHON_INSTALLED=$?
command_installed pip3
PIP_INSTALLED=$?
command_installed pipx
PIPX_INSTALLED=$?
# Si cualquiera de ellos está instalado, necesitamos actualizar con privilegios de superusuario
if [ $PYTHON_INSTALLED -eq 0 ] || [ $PIP_INSTALLED -eq 0 ]; then
# Ejecutar la actualización de Python y pip con sudo
echo -e "\n${head_info}: Se necesitan privilegios de administrador para actualizar Python y pip..."
if [ $PYTHON_INSTALLED -eq 0 ] || [ $PIP_INSTALLED -eq 0 ] || [ $PIPX_INSTALLED -eq 0 ]; then
# Ejecutar la actualización de Python, pip y pipx con sudo
echo -e "\n${head_info}: Se necesitan privilegios de administrador para actualizar Python, pip y pipx..."
# Exportar todas las funciones necesarias para que estén disponibles en el subproceso sudo
# Esto incluye command_installed y otras funciones de base.lib que se necesitan
sudo bash -c "$(declare -f command_installed; declare -f update_python_and_pip); update_python_and_pip $SCRIPT_DIR $BIN_LIBS $BIN_MESG $BIN_LANG"
if [ $? -ne 0 ]; then
echo -e "\n${head_error}: No se pudo actualizar Python y pip. Verifique sus privilegios."
echo -e "\n${head_error}: No se pudo actualizar Python, pip y pipx. Verifique sus privilegios."
fi
else
echo -e "\n${head_info}: No se detectaron Python ni pip instalados. No hay actualizaciones que realizar."
echo -e "\n${head_info}: No se detectaron Python, pip ni pipx instalados. No hay actualizaciones que realizar."
echo -e "Para instalar estas dependencias, ejecute bin/bootstrap.sh primero."
fi