#!/usr/bin/env bash set -euo pipefail # Prepara o Codex CLI pelo instalador oficial da OpenAI e instala o pacote AJUR. # --no-login permite instalar primeiro e conectar a conta depois. # --login-only repete a conexão sem reinstalar o pacote. mode="${1:-install}" package_url='https://www.ajur.com.br/codex/releases/ajur-264aeda0fc00e660730086593e3bbff77396b2b4c9d4edf1e022b048480d3dd1.tar.gz' package_sha256='264aeda0fc00e660730086593e3bbff77396b2b4c9d4edf1e022b048480d3dd1' case "$mode" in install|--no-login|--login-only) ;; *) echo 'Uso: bash install.sh [--no-login|--login-only]' >&2; exit 2 ;; esac command -v curl >/dev/null 2>&1 || { echo 'O comando curl é necessário para a instalação.' >&2; exit 1; } temporary_dir=$(mktemp -d "${TMPDIR:-/tmp}/ajur-codex.XXXXXX") trap 'rm -rf -- "$temporary_dir"' EXIT ajur_platform=$(uname -s) case "$ajur_platform" in MINGW*|MSYS*|CYGWIN*) command -v cygpath >/dev/null 2>&1 || { echo 'No Windows, execute este comando no Git Bash.' >&2; exit 1; } ajur_cli_dir=$(cygpath -u "${CODEX_INSTALL_DIR:-${LOCALAPPDATA:?LOCALAPPDATA não está definido}/Programs/OpenAI/Codex/bin}") ajur_cli_installed="$ajur_cli_dir/codex.exe" ;; *) ajur_cli_dir="${CODEX_INSTALL_DIR:-$HOME/.local/bin}" ajur_cli_installed="$ajur_cli_dir/codex" ;; esac ajur_cli=$(command -v codex || true) if [ -z "$ajur_cli" ] && [ -x "$ajur_cli_installed" ]; then ajur_cli="$ajur_cli_installed" fi run_codex() { "$ajur_cli" "$@"; } cli_compatible() { [ -n "$ajur_cli" ] || return 1 run_codex plugin add --help >/dev/null 2>&1 || return 1 local ajur_mcp_help ajur_mcp_help=$(run_codex mcp add --help 2>/dev/null) || return 1 [[ "$ajur_mcp_help" == *--oauth-client-id* ]] } if ! cli_compatible; then echo 'Preparando o Codex CLI pelo instalador oficial da OpenAI...' case "$ajur_platform" in Darwin|Linux) curl --proto '=https' --tlsv1.2 -fsSL --connect-timeout 15 --max-time 120 \ https://chatgpt.com/codex/install.sh -o "$temporary_dir/openai-install.sh" CODEX_NON_INTERACTIVE=1 sh "$temporary_dir/openai-install.sh" /dev/null 2>&1 || { echo 'O PowerShell é necessário para preparar o Codex CLI no Windows.' >&2; exit 1; } curl --proto '=https' --tlsv1.2 -fsSL --connect-timeout 15 --max-time 120 \ https://chatgpt.com/codex/install.ps1 -o "$temporary_dir/openai-install.ps1" CODEX_NON_INTERACTIVE=1 powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass \ -File "$(cygpath -w "$temporary_dir/openai-install.ps1")" &2; exit 1 ;; esac ajur_cli="$ajur_cli_installed" fi if ! cli_compatible; then echo 'Não foi possível preparar um Codex CLI compatível. Contate o suporte AJUR.' >&2 exit 1 fi echo 'Codex CLI pronto.' if [ "$mode" != '--login-only' ]; then if command -v shasum >/dev/null 2>&1; then checksum() { shasum -a 256 "$1" | awk '{print $1}'; } elif command -v sha256sum >/dev/null 2>&1; then checksum() { sha256sum "$1" | awk '{print $1}'; } else echo 'É necessário shasum ou sha256sum para verificar o pacote AJUR.' >&2 exit 1 fi echo 'Baixando o plugin diretamente do AJUR...' curl --proto '=https' --tlsv1.2 -fsS --connect-timeout 15 --max-time 120 "$package_url" -o "$temporary_dir/pacote.tar.gz" if [ "$(checksum "$temporary_dir/pacote.tar.gz")" != "$package_sha256" ]; then echo 'O pacote não passou na verificação de integridade. Instalação interrompida.' >&2 exit 1 fi mkdir "$temporary_dir/catalogo" tar -xzf "$temporary_dir/pacote.tar.gz" -C "$temporary_dir/catalogo" install_root="${XDG_DATA_HOME:-$HOME/.local/share}/ajur/codex" release_root="$install_root/$package_sha256" mkdir -p "$install_root" if [ -e "$release_root" ]; then if ! diff -qr "$temporary_dir/catalogo" "$release_root" >/dev/null; then echo 'A cópia local do pacote foi modificada. Contate o suporte AJUR antes de reinstalar.' >&2 exit 1 fi else mv "$temporary_dir/catalogo" "$release_root" fi # Atualiza apenas o catálogo AJUR e preserva as credenciais da conexão. marketplace_list=$(run_codex plugin marketplace list --json) if printf '%s' "$marketplace_list" | grep -Eq '"name"[[:space:]]*:[[:space:]]*"ajur-plugins"'; then run_codex plugin marketplace remove ajur-plugins fi run_codex plugin marketplace add "$release_root" run_codex plugin add ajur-ai-connect@ajur-plugins echo 'Plugin AJUR instalado.' fi if [ "$mode" = '--no-login' ]; then echo 'Para conectar: curl -fsSL https://www.ajur.com.br/codex/instalar.sh | bash -s -- --login-only' exit 0 fi echo 'Abra o link exibido abaixo e entre com sua conta AJUR AI Connect.' echo 'A senha e o código de autenticação são informados somente no navegador.' # Overrides valem somente para este login. Não alteram os outros servidores MCP. # localhost é exigido pelo login gerenciado do Cognito para retorno HTTP local. run_codex mcp login ajur-ai-connect \ -c 'mcp_servers.ajur-ai-connect.url="https://mcp.ajur.com.br/mcp"' \ -c 'mcp_servers.ajur-ai-connect.oauth.client_id="1626vqo5dsfnksb227f8luvqg5"' \ -c 'mcp_servers.ajur-ai-connect.oauth.callback_url="http://localhost:18765/callback/RAMUH8r3Srxj"' \ -c 'mcp_servers.ajur-ai-connect.oauth.callback_port=18765' \ -c 'mcp_oauth_callback_url="http://localhost:18765/callback"' echo 'Conta conectada. Reabra o Codex e inicie uma nova conversa para usar o AJUR.'