Open-source CLI utility for local dependency analysis with AI-powered update recommendations.
Project description
Tech Update Recommender
Tech Update Recommender — open-source CLI-утилита для локального анализа зависимостей проекта. Она находит application-level зависимости через Syft, проверяет их версии и известные уязвимости через deps.dev, и опционально генерирует AI-рекомендации по обновлению через LiteLLM.
Ключевые возможности:
- Локально, без отправки исходного кода на сервер.
- Поддержка ecosystem'ов npm, PyPI, Maven, Go, Cargo, RubyGems, NuGet.
- Кеш ответов deps.dev (SQLite, TTL 1 час) — повторные запуски быстрые.
- Несколько форматов вывода:
table(rich),json,markdown. - Выбор LLM-провайдера через LiteLLM (OpenAI / Anthropic / Gemini / Yandex Cloud / Ollama и любые OpenAI-совместимые API).
Установка
Требует Python 3.11+.
# Из PyPI:
pip install tech-upd-recommender
# или через pipx:
pipx install tech-upd-recommender
# Из исходников (для разработки):
pip install -e ".[dev]"
Все зависимости (включая LiteLLM для AI-рекомендаций) ставятся автоматически.
Установка Syft
Syft нужно ставить отдельно — это системный инструмент для сканирования зависимостей.
# macOS:
brew install syft
# Linux / любой UNIX (официальный установщик):
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
Если syft установлен в нестандартное место — передайте путь через
--syft-path или поле syft.path в ~/.tech-update-recommender.yaml.
Quickstart
# 1. Простой отчёт по фактам (без LLM):
tech-upd-recommender scan ./my-project
# 2. Полный отчёт с AI-рекомендациями (Gemini):
tech-upd-recommender scan ./my-project --mode full \
--llm-model gemini/gemini-2.0-flash
# 3. С OpenAI-совместимым провайдером (Yandex Cloud, DeepSeek и т.п.):
# Создайте .env в корне проекта:
# OPENAI_API_BASE=https://ai.api.cloud.yandex.net/v1
# OPENAI_API_KEY=ваш_ключ
tech-upd-recommender scan ./my-project --mode full \
--llm-model "openai/gpt://folder_id/model_name"
# 4. JSON в файл:
tech-upd-recommender scan ./my-project --output json --save out.json
Режимы работы
| Режим | Что делает |
|---|---|
report |
(default) только факты: версии, дельты semver, advisories. |
advice |
только AI-рекомендации (без таблицы фактов в LLM-секции — но summary остаётся). |
full |
факты + AI-рекомендации. |
Режимы advice и full требуют указать LLM-модель (через CLI-аргумент,
env var или конфиг). Без модели будет ошибка конфигурации (exit code 5)
с подсказкой что делать.
Флаг --no-llm принудительно понижает режим до report — удобно,
если конфиг по умолчанию содержит модель, но прямо сейчас не хочется
дёргать API.
Конфигурационный файл
Путь по умолчанию: ~/.tech-update-recommender.yaml. Файл опционален — при отсутствии
используются значения по умолчанию.
llm:
model: "gemini/gemini-2.0-flash"
max_context_tokens: 8000
cache:
enabled: true
ttl_seconds: 3600
path: "~/.cache/tech-update-recommender/"
API-ключи лучше держать в env vars, а не в файле. Если всё-таки храните
в файле — chmod 600 ~/.tech-update-recommender.yaml.
Переменные окружения
Переменные можно задавать через .env файл в корне сканируемого проекта —
утилита подхватит его автоматически. Скопируйте шаблон:
cp .env.example .env
# отредактируйте .env — впишите свои ключи
| Переменная | Что задаёт |
|---|---|
TUR_LLM_MODEL |
Имя LLM-модели (как --llm-model). |
TUR_LLM_API_KEY |
Универсальный API-ключ. |
OPENAI_API_KEY |
API-ключ для OpenAI-совместимых провайдеров. |
OPENAI_API_BASE |
URL эндпоинта для OpenAI-совместимых провайдеров (Yandex Cloud, DeepSeek и др.). |
ANTHROPIC_API_KEY |
API-ключ Anthropic. |
GEMINI_API_KEY |
API-ключ Google Gemini. |
TUR_SYFT_PATH |
Путь к бинарнику syft (как --syft-path). |
Каскад приоритетов значений (от высшего к низшему):
CLI > .env / env vars > ~/.tech-update-recommender.yaml > дефолты.
Поддерживаемые экосистемы
| Экосистема | Примеры файлов зависимостей |
|---|---|
npm |
package.json, package-lock.json |
pypi |
requirements.txt, pyproject.toml, Pipfile |
maven |
pom.xml |
golang |
go.mod, go.sum |
cargo |
Cargo.toml, Cargo.lock |
gem (RubyGems) |
Gemfile, Gemfile.lock |
nuget |
*.csproj, packages.config |
Системные пакеты (deb, apk, rpm и т.п.), найденные Syft, не
проверяются — они показываются отдельной секцией «Не проверено через
deps.dev» (это ограничение API deps.dev).
Коды возврата
| Код | Значение |
|---|---|
| 0 | Успех. |
| 1 | Любая прочая ошибка (с подсказкой использовать --verbose). |
| 2 | Ошибка Syft (SyftError). |
| 3 | Ошибка deps.dev (DepsDevError). |
| 4 | Ошибка LLM (LLMError и его подклассы). |
| 5 | Ошибка конфигурации (ConfigError). |
| 130 | Отменено пользователем (Ctrl+C). |
Разработка
# Установить с dev-зависимостями:
pip install -e ".[dev]"
# Тесты:
pytest -q
# Линтер:
ruff check .
ruff format --check .
Лицензия
MIT — см. файл LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tech_upd_recommender-0.2.1.tar.gz.
File metadata
- Download URL: tech_upd_recommender-0.2.1.tar.gz
- Upload date:
- Size: 75.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4740d287af090bf36eea8976b71516f7d64be281f41304728f43905cfd9aaaac
|
|
| MD5 |
cf6856c6f126ebef4e99f3e8dd1ca03c
|
|
| BLAKE2b-256 |
84488ca02530585ad4c1975acc377328644313b89bbd3e6f185fa49c1db6dfd2
|
File details
Details for the file tech_upd_recommender-0.2.1-py3-none-any.whl.
File metadata
- Download URL: tech_upd_recommender-0.2.1-py3-none-any.whl
- Upload date:
- Size: 40.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc8a0f5b593109349037c07fa0e4d5ecd34654bd38997dd3362dc972ce3c1e1c
|
|
| MD5 |
5b35211b24ba30a68d85112a7e83ecc4
|
|
| BLAKE2b-256 |
b3c17c95ded341635a017ed412c75adaaf74a79b2979ff262106ee5eceb28724
|