From 1bbd7c8e55d8f98d541c0388403e9013eced573e Mon Sep 17 00:00:00 2001 From: Simbiot Harness Date: Fri, 2 Oct 2026 20:28:41 +0000 Subject: [PATCH] =?UTF-8?q?t-261002202105/t-261002202021:=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D1=89=D0=B8=D0=BA=20=D1=87=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D1=82=20=D0=B1=D0=B8=D1=82=D1=8B=D0=B9=20venv=20(W?= =?UTF-8?q?SL:=20python=20=D0=B1=D0=B5=D0=B7=20pip=20=E2=86=92=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20+=20fallback=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20pip3),=20=D1=87=D0=B8=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D1=82=20=D0=BC=D1=83=D1=81=D0=BE=D1=80=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=80=D0=BE=D0=B3=D0=BE=20PoC-=D0=BA=D0=BB=D0=BE=D0=BD=D0=B0,?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=81=D1=82-=D1=88=D0=B0=D0=B3:=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82=D0=B0=D0=BB=20cil.by=20=D0=B4=D0=BB=D1=8F=20=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B0=20API=20+=20wizard=20--router-key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++++ scripts/install.sh | 54 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2d3687c..870fca8 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,12 @@ curl -fsSL https://raw.cil.by/simbiot/install.sh | bash `simbiot status`. Флаги: `--dir DIR`, `--repo URL`, `--wizard` / `--no-wizard`, `--systemd` (юнит, только root), `-q` (тихо). +Если в каталоге установки остался битый venv (python без pip — частый кейс +WSL/старых клонов), скрипт пересоздаёт его и ставит зависимости (при +недоступном ensurepip — системным pip3 в site-packages venv). В конце +установки предлагается следующий шаг: портал https://cil.by — залогиниться +и взять ключ API, затем `simbiot wizard --router-key <КЛЮЧ>`. + Первый запуск — визард настройки (токен TG-бота, ключ 9router, модель): ```bash diff --git a/scripts/install.sh b/scripts/install.sh index 6acf49c..7c4df67 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -55,6 +55,9 @@ if [ -d "$INSTALL_DIR/.git" ]; then git -C "$INSTALL_DIR" fetch --depth=1 origin >/dev/null 2>&1 || true git -C "$INSTALL_DIR" reset --hard origin/HEAD >/dev/null 2>&1 || \ git -C "$INSTALL_DIR" reset --hard origin/main >/dev/null 2>&1 || true + # старый PoC-клон мог тащить мусорные/полу-удалённые файлы → чистим трекинг, + # но сохраняем локальное: venv, .env, *.db, токены + git -C "$INSTALL_DIR" clean -qfd -e venv -e .env -e '*.db' -e '.simbiot-portal-token' 2>/dev/null || true else say "${CYAN}→${NC} Клонирую репозиторий → $INSTALL_DIR" mkdir -p "$(dirname "$INSTALL_DIR")" @@ -81,14 +84,29 @@ if [ "$PYMAJOR" -lt 3 ] || { [ "$PYMAJOR" = 3 ] && [ "$PYMINOR" -lt 11 ]; }; the exit 1 fi -if [ ! -x venv/bin/python ]; then +# venv считается годным только если есть И python, И pip (WSL/долгоживущие +# машины оставляют битые venv: python есть, pip нет → "./venv/bin/pip: No such +# file or directory"). Битый/неполный пересоздаём. +if [ ! -x venv/bin/python ] || [ ! -x venv/bin/pip ]; then say "${CYAN}→${NC} Создаю venv (python $PYV)…" - python3 -m venv venv + rm -rf venv # сносим битый/неполный venv целиком + python3 -m venv venv 2>/dev/null || python3 -m venv --without-pip venv fi say "${CYAN}→${NC} Ставлю зависимости…" -./venv/bin/pip install --upgrade pip >/dev/null -./venv/bin/pip install -r requirements.txt >/dev/null 2>&1 || \ - ./venv/bin/pip install -r requirements.txt +if [ -x venv/bin/pip ]; then + ./venv/bin/pip install --upgrade pip >/dev/null + ./venv/bin/pip install -r requirements.txt >/dev/null 2>&1 || \ + ./venv/bin/pip install -r requirements.txt +else + # WSL/deadsnakes-кейс: ensurepip недоступен → ставим зависимости системным pip + # прямо в site-packages этого venv (python venv подхватит их по sys.path). + if ! command -v pip3 >/dev/null 2>&1; then + echo "pip3 не найден. Установи: apt install -y python3-venv python3-pip" >&2 + exit 1 + fi + say "${YELLOW}→${NC} venv без pip (ensurepip отсутствует) — ставлю зависимости системным pip3 в venv" + pip3 install --quiet --target="venv/lib/python$PYV/site-packages" -r requirements.txt +fi # ---------------------------------------------------------------------------- # 3. Обёртка `simbiot` (аналог /usr/local/bin/hermes) @@ -147,4 +165,28 @@ else echo "⚠ simbiot status вернул ошибку — см. вывод выше." >&2 exit 1 fi -say "Дальше: simbiot wizard (настройка), simbiot --help (команды)." \ No newline at end of file + +# ---------------------------------------------------------------------------- +# 7. Следующий шаг: подключение API агенту (ключи берутся на портале) +# ---------------------------------------------------------------------------- +PORTAL_URL="https://cil.by" +if [ -s .env ] && grep -q '^ROUTER_KEY=..*' .env 2>/dev/null; then + say "${GREEN}→${NC} Ключ API уже задан в .env — агент готов." + say "Дальше: simbiot status (проверка), scripts/install.sh --systemd (автозапуск)." +else + say "${CYAN}→${NC} Остался один шаг — подключить API агенту:" + if [ "$INTERACTIVE" = 1 ]; then + # macOS / десктоп-линукс / WSL: открываем портал в браузере + if grep -qi microsoft /proc/version 2>/dev/null; then + { command -v wslview >/dev/null 2>&1 && wslview "$PORTAL_URL" >/dev/null 2>&1; } || \ + { command -v explorer.exe >/dev/null 2>&1 && explorer.exe "$PORTAL_URL" >/dev/null 2>&1 || true; } + else + command -v xdg-open >/dev/null 2>&1 && { xdg-open "$PORTAL_URL" >/dev/null 2>&1 || true; } + fi + command -v open >/dev/null 2>&1 && { open "$PORTAL_URL" >/dev/null 2>&1 || true; } + say "→ Открыл портал в браузере (если не открылся — ссылка ниже)." + fi + say "${GREEN} $PORTAL_URL${NC} ${CYAN}← залогинься и возьми ключ API${NC}" + say " Затем: $BIN_DIR/simbiot wizard --router-key <КЛЮЧ>" + say " (или просто $BIN_DIR/simbiot wizard — спросит всё интерактивно)" +fi \ No newline at end of file