User reported on Mac/Win:
1. gpt-5.5 not appearing in client model picker after install
2. codex CLI not installed by uclaude_install.{sh,ps1}
Root causes (TDD verified):
1. ps1 hardcoded fallback (when private config fetch fails) had only 5
models without gpt-5.5; users behind firewall/with stale cache fall
back to it. Updated fallback to include latest list including gpt-5.5,
gemini-3.1-pro, gemini-3-flash, glm-5.1.
2. Codex has SEPARATE installer (codex/ucodex_install.{sh,ps1}). Users
following claude install instructions miss it. README documents both
but as separate steps. Now uclaude_install.{sh,ps1} optionally chain
to codex installer at the end (skip via UCLAUDE_SKIP_CODEX=1).
Sh installer: also expanded sparse-checkout to include codex/ directory.
README versions: bumped Codex CLI 0.122.0 → 0.125.0 in all 4 locale files
(README.md, README_ru.md, README_es.md, README_zh.md).
3 new tests in claude_code_patcher/tests/test_installers_completeness.py
verify the fix sticks (ps1 fallback has gpt-5.5, both installers mention
codex chain, README codex version current via GitHub API check).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
153 lines
5.4 KiB
Bash
Executable File
153 lines
5.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# UClaude — one-line installer with full auto-install chain
|
|
# Usage: curl -fsSL -H "Authorization: token TOKEN" https://git.sensey24.ru/aibot777/unlimitedcoding/raw/branch/master/claude/uclaude_install.sh -o /tmp/uclaude.sh && sudo bash /tmp/uclaude.sh
|
|
set -uo pipefail
|
|
|
|
# Error handler
|
|
error_handler() {
|
|
local line_no=$1
|
|
echo "ERROR: Command failed at line $line_no" >&2
|
|
echo "Last command: $BASH_COMMAND" >&2
|
|
echo "Exiting..." >&2
|
|
exit 1
|
|
}
|
|
|
|
trap 'error_handler $LINENO' ERR
|
|
|
|
# Read-only access token for private repo (scoped: read:repository only)
|
|
GITEA_TOKEN="${GITEA_TOKEN:-cadffcb0a6a3be728ac1ff619bb40c86588f6837}"
|
|
REPO_URL="https://x-token:${GITEA_TOKEN}@git.sensey24.ru/aibot777/unlimitedcoding.git"
|
|
INSTALL_DIR="${UCLAUDE_DIR:-$HOME/unlimitedcoding}"
|
|
|
|
echo "=== UClaude Installer ==="
|
|
echo " Install dir: $INSTALL_DIR"
|
|
|
|
# ---- Auto-install prerequisites ----
|
|
|
|
install_pkg() {
|
|
# Try apt, then yum/dnf, then brew
|
|
if command -v apt-get >/dev/null 2>&1; then
|
|
apt-get update -qq && apt-get install -y -qq "$@"
|
|
elif command -v dnf >/dev/null 2>&1; then
|
|
dnf install -y -q "$@"
|
|
elif command -v yum >/dev/null 2>&1; then
|
|
yum install -y -q "$@"
|
|
elif command -v brew >/dev/null 2>&1; then
|
|
brew install "$@"
|
|
else
|
|
echo "ERROR: No package manager found. Install $* manually."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
need_sudo() {
|
|
if [ "$(id -u)" -ne 0 ]; then
|
|
echo " Root privileges required to install packages."
|
|
echo " Re-run with sudo: curl -fsSL -H 'Authorization: token ${GITEA_TOKEN}' https://git.sensey24.ru/aibot777/unlimitedcoding/raw/branch/master/claude/uclaude_install.sh -o /tmp/uclaude.sh && sudo bash /tmp/uclaude.sh"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Git
|
|
if ! command -v git >/dev/null 2>&1; then
|
|
echo " git not found, installing..."
|
|
need_sudo
|
|
install_pkg git
|
|
fi
|
|
|
|
# Python 3
|
|
if ! command -v python3 >/dev/null 2>&1; then
|
|
echo " python3 not found, installing..."
|
|
need_sudo
|
|
install_pkg python3
|
|
fi
|
|
|
|
# curl (needed for nodesource)
|
|
if ! command -v curl >/dev/null 2>&1; then
|
|
echo " curl not found, installing..."
|
|
need_sudo
|
|
install_pkg curl
|
|
fi
|
|
|
|
# Node.js — updater handles version check and auto-install
|
|
if ! command -v node >/dev/null 2>&1; then
|
|
echo " Node.js not found. Updater will auto-install."
|
|
fi
|
|
|
|
# ---- Clone / Update repo ----
|
|
|
|
if [ -d "$INSTALL_DIR/.git" ]; then
|
|
echo " Already cloned, updating..."
|
|
cd "$INSTALL_DIR"
|
|
git fetch --depth 1 origin master 2>/dev/null
|
|
git reset --hard origin/master 2>/dev/null
|
|
else
|
|
echo " Cloning (shallow, sparse — only latest version)..."
|
|
|
|
# Shallow clone without checkout
|
|
git clone --depth 1 --no-checkout "$REPO_URL" "$INSTALL_DIR"
|
|
cd "$INSTALL_DIR"
|
|
|
|
# Enable sparse checkout: root + claude/ + codex/ (so optional codex
|
|
# install works) + index.json (first pass)
|
|
git sparse-checkout init --no-cone
|
|
git sparse-checkout set '/*' 'claude/*' '!claude/releases/v*' 'claude/releases/index.json' 'codex/*'
|
|
git checkout 2>/dev/null
|
|
|
|
# Read latest version from index.json and add only that release dir
|
|
if [ -f claude/releases/index.json ]; then
|
|
VER=$(python3 -c "import json; print(json.load(open('claude/releases/index.json'))['latest'])")
|
|
echo " Latest version: v${VER}"
|
|
git sparse-checkout add "claude/releases/v${VER}"
|
|
git checkout 2>/dev/null
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo " Updating repo to latest version before running updater..."
|
|
# Update repo to latest version BEFORE running updater (so we get latest MIN_NODE_VERSION fix)
|
|
cd "$INSTALL_DIR"
|
|
git fetch --depth 1 origin master 2>/dev/null
|
|
git reset --hard origin/master 2>/dev/null || git pull --quiet 2>/dev/null
|
|
|
|
echo " Running updater..."
|
|
|
|
# Configure npm registry for @anthropic-ai scope before running updater
|
|
if command -v npm >/dev/null 2>&1; then
|
|
echo " Configuring npm registry: https://npm.sensey24.ru/"
|
|
npm config set "@anthropic-ai:registry" "https://npm.sensey24.ru/" 2>/dev/null || true
|
|
fi
|
|
|
|
# Run updater (needs root for cli.js replacement + node install)
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
python3 claude/uclaude_updater.py --force
|
|
else
|
|
echo " Root privileges required to install cli.js."
|
|
sudo python3 claude/uclaude_updater.py --force
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== Claude Code installation complete ==="
|
|
echo " To update later: cd $INSTALL_DIR && sudo bash claude/uclaude_update.sh"
|
|
echo ""
|
|
|
|
# Optionally install Codex CLI (OpenAI Rust binary, separate package).
|
|
# Default: install. Set UCLAUDE_SKIP_CODEX=1 to skip.
|
|
# Why optional: codex needs ~50MB download from GitHub releases; users
|
|
# without OpenAI account / interest can skip. README documents standalone
|
|
# install path: codex/ucodex_install.sh.
|
|
if [ "${UCLAUDE_SKIP_CODEX:-0}" != "1" ] && [ -f "$INSTALL_DIR/codex/ucodex_install.sh" ]; then
|
|
echo "=== Installing Codex CLI (skip via UCLAUDE_SKIP_CODEX=1) ==="
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
bash "$INSTALL_DIR/codex/ucodex_install.sh" || echo " Codex install failed (non-fatal — re-run separately)"
|
|
else
|
|
sudo bash "$INSTALL_DIR/codex/ucodex_install.sh" || echo " Codex install failed (non-fatal — re-run separately)"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== All done ==="
|
|
echo " claude — Claude Code (Anthropic CLI, gpt-5.5/gemini-3.1/glm-5.1 etc.)"
|
|
echo " codex — OpenAI Codex CLI (gpt-5.5, --bare for scripts)"
|
|
echo " Update: cd $INSTALL_DIR && sudo bash claude/uclaude_update.sh"
|