#!/bin/sh # Instalador del comando tododeia. Cómo se usa: https://www.tododeia.com/instalar # # curl -fsSL https://www.tododeia.com/install.sh | bash # curl -fsSL https://www.tododeia.com/install.sh | bash -s -- # # Qué hace: baja el comando de www.tododeia.com, comprueba su huella sha256, lo deja en # ~/.local/bin/tododeia y, si le pasas nombres, los instala. No pide sudo ni toca nada más. # Para leerlo antes de correrlo: curl -fsSL https://www.tododeia.com/install.sh -o install.sh && less install.sh # (Es sh POSIX: también corre con | sh. /instalar es el mismo archivo.) set -eu TMP="" JSON="" decir() { printf '%s\n' "$*"; } morir() { printf 'tododeia: %s\n' "$*" >&2; exit 1; } limpiar() { if [ -n "$TMP" ]; then rm -f "$TMP"; fi if [ -n "$JSON" ]; then rm -f "$JSON"; fi } # main hace todo; cada paso que puede fallar lleva su «|| morir» (dentro de «main || exit 1», set -e no aplica). main() { [ -n "${HOME:-}" ] || morir "No encontré tu carpeta personal (HOME)." DESTINO="$HOME/.local/bin" # Solo https:// o http://127.0.0.1: (pruebas), igual que el comando. SITIO=${TODODEIA_SITIO:-https://www.tododeia.com} SITIO=${SITIO%/} local_prueba=0 case "$SITIO" in https://*/*|http://127.0.0.1:*/*) morir "TODODEIA_SITIO no lleva ruta: $SITIO" ;; https://?*) ;; http://127.0.0.1:[0-9]*) case "${SITIO#http://127.0.0.1:}" in *[!0-9]*) morir "TODODEIA_SITIO no válido: $SITIO" ;; esac local_prueba=1 ;; *) morir "TODODEIA_SITIO solo acepta https:// o http://127.0.0.1:" ;; esac case "$SITIO" in *@*|*\?*|*\#*|*' '*) morir "TODODEIA_SITIO no válido: $SITIO" ;; esac # sudo por error: se instalaría en la carpeta de root. Root a secas (Docker, CI) sí puede. if [ "$(id -u)" = 0 ] && [ -n "${SUDO_USER:-}" ] && [ "$SUDO_USER" != root ] && [ "${TODODEIA_PERMITIR_SUDO:-}" != 1 ]; then morir "No lo corras con sudo: se instala en tu carpeta personal, sin permisos de administrador. Córrelo sin sudo. (Si de verdad lo necesitas: TODODEIA_PERMITIR_SUDO=1)" fi # Sistema y procesador. case "$(uname -s)" in Darwin) so=darwin ;; Linux) so=linux ;; *) morir "Este instalador es para macOS y Linux. En Windows usa PowerShell: irm https://www.tododeia.com/install.ps1 | iex" ;; esac case "$(uname -m)" in x86_64|amd64) cpu=amd64 ;; arm64|aarch64) cpu=arm64 ;; *) morir "Tu procesador ($(uname -m)) todavía no tiene versión del comando." ;; esac # Una terminal bajo Rosetta dice x86_64 en una Mac con Apple Silicon: usamos la nativa. if [ "$so" = darwin ] && [ "$cpu" = amd64 ] && [ "$(sysctl -n sysctl.proc_translated 2>/dev/null || echo 0)" = 1 ]; then cpu=arm64 fi target="$so-$cpu" # Para bajar: curl o wget, solo por https (http solo contra el sitio de pruebas en 127.0.0.1). if command -v curl >/dev/null 2>&1; then proto='=https' if [ "$local_prueba" = 1 ]; then proto='=https,http'; fi bajar() { curl -fsSL --proto "$proto" --tlsv1.2 --retry 3 -A "tododeia-instalar ($target)" -o "$2" "$1"; } elif command -v wget >/dev/null 2>&1; then solo_https="" # BusyBox wget no conoce --https-only. if [ "$local_prueba" = 0 ] && ! wget --help 2>&1 | grep -q BusyBox; then solo_https="--https-only"; fi # shellcheck disable=SC2086 # $solo_https vacío o una sola bandera bajar() { wget -q $solo_https -U "tododeia-instalar ($target)" -O "$2" "$1"; } else morir "Necesito curl o wget para bajar el comando. Instala uno de los dos y vuelve a intentar." fi # Para la huella: sha256sum o shasum. if command -v sha256sum >/dev/null 2>&1; then huella() { sha256sum "$1" | cut -d' ' -f1; } elif command -v shasum >/dev/null 2>&1; then huella() { shasum -a 256 "$1" | cut -d' ' -f1; } else morir "Necesito sha256sum o shasum para comprobar el archivo." fi # El temporal vive junto al destino: el mv final es atómico. mkdir -p "$DESTINO" || morir "No pude crear $DESTINO." TMP=$(mktemp "$DESTINO/.tododeia.XXXXXX") || morir "No pude escribir en $DESTINO." JSON=$(mktemp "$DESTINO/.tododeia-version.XXXXXX") || morir "No pude escribir en $DESTINO." # La versión publicada y la huella de este sistema (sin jq). bajar "$SITIO/api/cli/version" "$JSON" || morir "No pude conectarme con $SITIO. Revisa tu internet e intenta otra vez." version=$(sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([0-9A-Za-z.+-]*\)".*/\1/p' "$JSON") esperada=$(sed -n "s/.*\"$target\"[[:space:]]*:[[:space:]]*\"\([0-9a-f]\{64\}\)\".*/\1/p" "$JSON") [ -n "$esperada" ] || morir "No hay versión del comando para $target todavía." decir "Bajando tododeia ${version:-} para ${target}…" bajar "$SITIO/api/cli/binario/$target" "$TMP" || morir "La descarga falló. Intenta otra vez en un momento." [ "$(huella "$TMP")" = "$esperada" ] || morir "El archivo no coincide con el publicado (sha256 distinto). No instalé nada." chmod 755 "$TMP" || morir "No pude darle permisos a $TMP." mv -f "$TMP" "$DESTINO/tododeia" || morir "No pude dejar el comando en $DESTINO/tododeia." TMP="" decir "✓ Quedó en $DESTINO/tododeia" # ¿Está ~/.local/bin en el PATH de esta shell? Si no, se agrega una sola vez al archivo de tu shell. case ":$PATH:" in *":$DESTINO:"*) ;; *) agregar_path ;; esac limpiar if [ "$#" -gt 0 ]; then exec "$DESTINO/tododeia" instalar "$@" fi # Deja la skill tododeia para que Claude Code y Codex sepan usar el comando. "$DESTINO/tododeia" preparar >/dev/null 2>&1 || true decir "" decir "Listo. Para empezar:" decir " tododeia buscar (lo que hay en la Bóveda)" decir " tododeia instalar (skills: para todo; herramientas y agentes: en la carpeta donde estés)" } agregar_path() { # shellcheck disable=SC2016 # las líneas se escriben literales en el archivo de la shell linea='export PATH="$HOME/.local/bin:$PATH"' # shellcheck disable=SC2016 ahora='export PATH="$HOME/.local/bin:$PATH"' case "${SHELL:-}" in */zsh) rc="${ZDOTDIR:-$HOME}/.zshrc" ;; */bash) if [ "$so" = darwin ]; then # bash de login en macOS lee el primero que exista; crear .bash_profile esconde un ~/.profile existente. rc="$HOME/.bash_profile" for f in "$HOME/.bash_profile" "$HOME/.bash_login" "$HOME/.profile"; do if [ -f "$f" ]; then rc=$f; break; fi done else rc="$HOME/.bashrc" fi ;; */fish) rc="$HOME/.config/fish/conf.d/tododeia.fish" # shellcheck disable=SC2016 linea='fish_add_path -g $HOME/.local/bin' # shellcheck disable=SC2016 ahora='fish_add_path $HOME/.local/bin' mkdir -p "$HOME/.config/fish/conf.d" 2>/dev/null || true ;; *) rc="$HOME/.profile" ;; esac if grep -qsF "$linea" "$rc"; then : elif printf '\n# tododeia\n%s\n' "$linea" >> "$rc" 2>/dev/null; then decir "Agregué ~/.local/bin a tu PATH en $rc: en terminales nuevas ya funciona tododeia." else decir "No pude escribir $rc; agrégalo a mano: $linea" fi decir "En esta terminal, corre antes: $ahora" } trap limpiar EXIT trap 'exit 130' INT trap 'exit 143' TERM main "$@" || exit 1