Files
hlamingo/install.cmd
T
alexandClaude Opus 5 17b7d49d2f hlamingo — помощник «где что лежит»
Веб-помощник для домашнего склада: помнит, в какой коробке и в каком месте
лежит вещь, и находит её по названию, тегам и маркировке. Открывается
с телефона, интеллект — локальная Ollama.

Основное:
- структурный ввод «место → ёмкость → предмет» и кнопки
  Положить / Забрать / Переместить / Удалить;
- иерархия мест (Гараж → Стеллаж А → Полка 2), ёмкости с кодом «буква+цифра»,
  состояние «на руках» для взятых вещей;
- поиск по словам с учётом русских окончаний, теги от модели расширяют
  словарь предмета, смысловой поиск — вспомогательный (замеры в search.py);
- фото к вещам и коробкам: съёмка и выбор из галереи;
- правка и удаление всех сущностей, удаление коробки не теряет её содержимое;
- работает и без Ollama: отключаются только разбор фраз, теги и поиск
  по смыслу.

Данные (data/, static/photos/) и локальный конфиг (.env) в репозиторий
не попадают. Тесты работают только в песочнице: путь к данным берётся
из окружения, tests/guard.py отказывается запускаться на живых данных.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 14:27:20 +03:00

190 lines
6.9 KiB
Batchfile

@echo off
rem ============================================================
rem hlamingo installer
rem
rem Downloads the app and sets up everything needed to run it.
rem Put this file in an empty folder and double-click it.
rem
rem ASCII only: cmd.exe reads .cmd in the system codepage, so Cyrillic here
rem would turn into garbage and break the script. Russian text is printed
rem from Python instead.
rem ============================================================
setlocal
chcp 65001 >nul
cls
set REPO_WEB=https://git.08h.ru/alex/hlamingo
set REPO_GIT=https://git.08h.ru/alex/hlamingo.git
set BRANCH=main
set TARGET=hlamingo
echo ========================================
echo hlamingo - installer
echo ========================================
echo.
echo Source: %REPO_WEB%
echo Target: %CD%\%TARGET%
echo.
cd /d "%~dp0"
rem ---------- 1. Python ----------
where python >nul 2>&1
if errorlevel 1 (
echo [ERROR] Python not found in PATH.
echo.
echo Install Python 3.9 or newer from https://www.python.org/downloads/
echo IMPORTANT: check "Add python.exe to PATH" in the installer.
echo Then run this file again.
pause
exit /b 1
)
for /f "delims=" %%v in ('python -c "import sys;print(sys.version.split()[0])"') do set PYVER=%%v
echo [1/4] Python %PYVER% found.
rem ---------- 2. Download ----------
if exist "%TARGET%\hlamingo\app.py" goto :update
where git >nul 2>&1
if errorlevel 1 goto :download_zip
echo [2/4] Cloning with git...
git clone --branch %BRANCH% "%REPO_GIT%" "%TARGET%"
if errorlevel 1 (
echo git clone failed, falling back to zip download.
goto :download_zip
)
goto :setup
:download_zip
echo [2/4] Downloading archive (git not available or clone failed)...
rem PowerShell does the work: no curl/tar dependency on older Windows.
rem Проверяем, что скачался именно архив: сервер, требующий входа, отдаёт
rem HTML-страницу логина с кодом 200, и распаковка падала бы невнятно.
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
"$ErrorActionPreference='Stop';" ^
"$url='%REPO_WEB%/archive/%BRANCH%.zip';" ^
"$zip=Join-Path $env:TEMP 'hlamingo-src.zip';" ^
"$tmp=Join-Path $env:TEMP 'hlamingo-unpack';" ^
"Write-Host (' ' + $url);" ^
"Invoke-WebRequest -Uri $url -OutFile $zip -UseBasicParsing -MaximumRedirection 0 -ErrorAction SilentlyContinue;" ^
"if (-not (Test-Path $zip)) { throw 'server returned nothing' }" ^
"$head=[IO.File]::ReadAllBytes($zip) | Select-Object -First 2;" ^
"if ($head[0] -ne 0x50 -or $head[1] -ne 0x4B) { Remove-Item $zip -Force; throw 'the server sent a web page instead of an archive - the repository is private or requires signing in' }" ^
"if (Test-Path $tmp) { Remove-Item -Recurse -Force $tmp }" ^
"Expand-Archive -Path $zip -DestinationPath $tmp -Force;" ^
"$root=Get-ChildItem $tmp -Directory | Select-Object -First 1;" ^
"if (-not $root) { throw 'archive looks empty' }" ^
"Move-Item $root.FullName (Join-Path (Get-Location) '%TARGET%');" ^
"Remove-Item -Recurse -Force $tmp, $zip"
if errorlevel 1 (
echo.
echo [ERROR] Download failed.
echo.
echo Possible reasons:
echo - %REPO_WEB% is not reachable from this computer;
echo - the repository is private, or the server requires signing in
echo to view anything. In that case download the project manually
echo and run setup.cmd inside it.
pause
exit /b 1
)
goto :setup
:update
echo [2/4] Already downloaded - updating.
where git >nul 2>&1
if not errorlevel 1 (
if exist "%TARGET%\.git" (
pushd "%TARGET%"
git pull --ff-only
popd
)
)
rem ---------- 3. venv and dependencies ----------
:setup
if not exist "%TARGET%\requirements.txt" (
echo [ERROR] Download looks incomplete: requirements.txt is missing.
pause
exit /b 1
)
pushd "%TARGET%"
echo [3/4] Creating virtual environment and installing dependencies...
if not exist "venv" python -m venv venv
if errorlevel 1 (
echo [ERROR] Could not create venv.
popd
pause
exit /b 1
)
venv\Scripts\python.exe -m pip install --upgrade pip --quiet
venv\Scripts\python.exe -m pip install -r requirements.txt --quiet
if errorlevel 1 (
echo [ERROR] Dependency installation failed.
popd
pause
exit /b 1
)
rem ---------- 4. Ollama address ----------
echo.
echo [4/4] Where is Ollama running?
echo Enter to accept the default (this computer).
echo Otherwise type the address of the machine on your network,
echo for example: http://192.168.1.50:11434
echo.
set OLLAMA_ADDR=
set /p OLLAMA_ADDR="Ollama URL [http://localhost:11434]: "
if "%OLLAMA_ADDR%"=="" set OLLAMA_ADDR=http://localhost:11434
rem Локальный конфиг делаем из образца: рядом с адресом Ollama человек увидит
rem и остальные настройки с пояснениями, а не одну голую строку.
if exist ".env" (
echo .env already exists - left as is. Edit it by hand if needed.
) else (
rem -Encoding UTF8 обязателен: без него PowerShell 5.1 читает файл в
rem системной кодировке, и русские пояснения превращаются в кракозябры.
powershell -NoProfile -Command ^
"$src = if (Test-Path '.env.example') { Get-Content '.env.example' -Encoding UTF8 } else { @('OLLAMA_HOST=') };" ^
"$out = $src -replace '^\s*#?\s*OLLAMA_HOST=.*', 'OLLAMA_HOST=%OLLAMA_ADDR%';" ^
"if (-not ($out -match '^OLLAMA_HOST=')) { $out += 'OLLAMA_HOST=%OLLAMA_ADDR%' }" ^
"Set-Content -Path '.env' -Value $out -Encoding UTF8"
if errorlevel 1 (
> .env echo OLLAMA_HOST=%OLLAMA_ADDR%
)
echo Saved to .env ^(OLLAMA_HOST=%OLLAMA_ADDR%^)
)
rem Check whether Ollama actually answers, and report in plain language.
venv\Scripts\python.exe -c "from hlamingo import ollama, config; ok=ollama.check(); print((' Ollama ' + config.OLLAMA_HOST + (' отвечает.' if ok else ' НЕ отвечает — приложение будет работать, но без разбора фраз и поиска по смыслу.')))"
echo.
echo ========================================
echo Done.
echo ========================================
echo.
echo Start the app: %CD%\start.cmd
echo Run tests: %CD%\tests\run.cmd
echo.
echo A shortcut named "hlamingo" is on your Desktop.
powershell -NoProfile -Command ^
"$s=(New-Object -ComObject WScript.Shell).CreateShortcut([IO.Path]::Combine([Environment]::GetFolderPath('Desktop'),'hlamingo.lnk'));" ^
"$s.TargetPath=(Join-Path (Get-Location) 'start.cmd');" ^
"$s.WorkingDirectory=(Get-Location).Path;" ^
"$s.Description='hlamingo - where my stuff is';" ^
"$s.Save()" 2>nul
popd
echo.
set RUNNOW=
set /p RUNNOW="Start it now? [Y/n]: "
if /i "%RUNNOW%"=="n" goto :end
pushd "%TARGET%"
call start.cmd
popd
:end
endlocal