/
Watashicuvu
/
agentic-tools
Обзор
Документация
Войти
/
Watashicuvu
/
agentic-tools
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/entrypoint.sh
302 строки
11 KB
Якуб
mts update
12 апр 2026, 21:19
12 апр 2026, 21:19
bff6dcd
Код
Авторство
О чём код?
#!/usr/bin/env bash # ============================================================================= # entrypoint.sh — Точка входа для MCP Server контейнера # ============================================================================= # Назначение: # - Автодетект языка проекта (если PROJECT_LANG не задан) # - Установка зависимостей по языку (если RUN_SCRIPTS=1) # - Запуск MCP сервера с правильным --project-dir # # Переменные окружения: # PROJECT_DIR — путь к проекту (по умолчанию /projects/project_a) # PROJECT_LANG — язык (python|typescript|lua|mixed, или "auto" для детекта) # LLM_BACKEND — бэкенд LLM (llama_cpp|ollama, по умолчанию llama_cpp) # OPENAI_BASE_URL — URL LLM API (auto для авто-настройки по LLM_BACKEND) # MCP_PORT — порт MCP сервера (по умолчанию 8000) # MCP_INDEX_ON_START — индексация при старте (true|false) # MCP_MERGE_ENV — слияние .env (true|false) # RUN_SCRIPTS — запускать ли скрипты установки зависимостей (1|0) # RUN_MODE — режим (minimal|agent|full, для логирования) # # Использование: # scripts/entrypoint.sh # или через Docker: ENTRYPOINT ["scripts/entrypoint.sh"] # ============================================================================= set -e # Цвета RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # ============================================================================= # Конфигурация # ============================================================================= PROJECT_DIR="${PROJECT_DIR:-auto}" PROJECT_LANG="${PROJECT_LANG:-auto}" LLM_BACKEND="${LLM_BACKEND:-llama_cpp}" MCP_PORT="${MCP_PORT:-8000}" RUN_SCRIPTS="${RUN_SCRIPTS:-0}" RUN_MODE="${RUN_MODE:-minimal}" echo "" echo -e "${BLUE}╔══════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║${NC} ${CYAN}Agentic Tools — MCP Server Entrypoint${NC} ${BLUE}║${NC}" echo -e "${BLUE}╚══════════════════════════════════════════════════════╝${NC}" echo "" echo -e " Mode: ${YELLOW}${RUN_MODE}${NC}" echo -e " Project: ${YELLOW}${PROJECT_DIR}${NC}" echo -e " Language: ${YELLOW}${PROJECT_LANG}${NC}" echo -e " LLM Backend: ${YELLOW}${LLM_BACKEND}${NC}" echo -e " Port: ${YELLOW}${MCP_PORT}${NC}" echo "" # ============================================================================= # Авто-настройка OPENAI_BASE_URL по LLM_BACKEND # ============================================================================= if [[ "$OPENAI_BASE_URL" == "auto" ]] || [[ -z "$OPENAI_BASE_URL" ]]; then case "$LLM_BACKEND" in llama_cpp) OPENAI_BASE_URL="http://llama-cpp:9191/v1" ;; ollama) OPENAI_BASE_URL="http://ollama:11434/v1" ;; *) echo -e " ${RED}⚠️ Unknown LLM_BACKEND: $LLM_BACKEND, defaulting to llama.cpp${NC}" OPENAI_BASE_URL="http://llama-cpp:9191/v1" ;; esac echo -e " ${CYAN}🔗 OPENAI_BASE_URL auto-configured: $OPENAI_BASE_URL${NC}" export OPENAI_BASE_URL fi # ============================================================================= # Auto-create PROJECT_DIR если не задан # ============================================================================= if [[ "$PROJECT_DIR" == "auto" ]]; then echo "" echo -e "${YELLOW}📁 PROJECT_DIR not set — auto-creating project...${NC}" # Генерируем UUID PROJECT_UUID=$(head -c 6 /dev/urandom | xxd -p 2>/dev/null || head -c 6 /dev/urandom | od -An -tx1 | tr -d ' \n') AUTO_PROJECT="/projects/auto/${PROJECT_UUID}" echo -e " UUID: ${PROJECT_UUID}" echo -e " Path: ${AUTO_PROJECT}" echo "" # Создаём директорию auto на хосте (монтируется как volume) mkdir -p /projects/auto # Запускаем init-project.sh if [[ -x "/app/scripts/init-project.sh" ]]; then /app/scripts/init-project.sh "$AUTO_PROJECT" "$PROJECT_LANG" PROJECT_DIR="$AUTO_PROJECT" echo "" echo -e " ${GREEN}✅ Auto-project ready: $PROJECT_DIR${NC}" else echo -e " ${RED}❌ init-project.sh not found or not executable${NC}" echo " Falling back to /projects/main" PROJECT_DIR="/projects/main" fi fi # ============================================================================= # Автодетект языка # ============================================================================= detect_language() { local detected="" local has_python=0 local has_typescript=0 local has_lua=0 # Python if [[ -f "${PROJECT_DIR}/pyproject.toml" ]] || \ [[ -f "${PROJECT_DIR}/requirements.txt" ]] || \ [[ -f "${PROJECT_DIR}/setup.py" ]] || \ [[ -f "${PROJECT_DIR}/Pipfile" ]] || \ [[ -f "${PROJECT_DIR}/uv.lock" ]]; then has_python=1 fi # TypeScript/JavaScript if [[ -f "${PROJECT_DIR}/package.json" ]] || \ [[ -f "${PROJECT_DIR}/tsconfig.json" ]] || \ [[ -f "${PROJECT_DIR}/jsconfig.json" ]]; then has_typescript=1 fi # Lua if [[ -f "${PROJECT_DIR}/rockspec" ]] || \ [[ -f "${PROJECT_DIR}/.luacheckrc" ]] || \ [[ -f "${PROJECT_DIR}/lua_modules" ]] || \ find "${PROJECT_DIR}" -maxdepth 2 -name "*.lua" -print -quit 2>/dev/null | grep -q .; then has_lua=1 fi # Определяем результат if [[ $has_python -eq 1 ]] && [[ $has_typescript -eq 1 ]] && [[ $has_lua -eq 1 ]]; then detected="mixed" elif [[ $has_python -eq 1 ]]; then detected="python" elif [[ $has_typescript -eq 1 ]]; then detected="typescript" elif [[ $has_lua -eq 1 ]]; then detected="lua" else detected="unknown" fi echo "$detected" } if [[ "$PROJECT_LANG" == "auto" ]]; then echo -e "${YELLOW}🔍 Auto-detecting project language...${NC}" if [[ -d "$PROJECT_DIR" ]]; then DETECTED_LANG=$(detect_language) echo -e " Detected: ${GREEN}${DETECTED_LANG}${NC}" PROJECT_LANG="$DETECTED_LANG" else echo -e " ${RED}⚠️ Project directory not found: $PROJECT_DIR${NC}" echo -e " Falling back to: ${YELLOW}python${NC}" PROJECT_LANG="python" fi echo "" fi # ============================================================================= # Установка зависимостей (опционально) # ============================================================================= install_deps() { local lang="$1" echo -e "${YELLOW}📦 Installing dependencies for: ${lang}${NC}" echo "" case "$lang" in python) echo " → uv sync --frozen" uv sync --frozen 2>/dev/null || { echo -e " ${RED}⚠️ uv sync failed, trying pip install -e .${NC}" pip install -e . 2>/dev/null || true } ;; typescript) if [[ -f "${PROJECT_DIR}/package.json" ]]; then echo " → npm install (in project)" cd "$PROJECT_DIR" && npm install 2>/dev/null || true cd /app fi echo " → Global: typescript eslint jest" npm install -g typescript eslint jest 2>/dev/null || true ;; lua) echo " → luarocks: luacheck busted" luarocks install luacheck 2>/dev/null || true luarocks install busted 2>/dev/null || true ;; mixed) echo " → Python: uv sync" uv sync --frozen 2>/dev/null || true echo " → TypeScript: global tools" npm install -g typescript eslint jest 2>/dev/null || true echo " → Lua: luacheck" luarocks install luacheck 2>/dev/null || true ;; *) echo -e " ${YELLOW}⚠️ Unknown language: ${lang}, skipping deps${NC}" ;; esac echo "" echo -e " ${GREEN}✅ Dependencies installed${NC}" echo "" } if [[ "$RUN_SCRIPTS" == "1" ]]; then install_deps "$PROJECT_LANG" fi # ============================================================================= # Guardrails scripts (agent/full режимы) # ============================================================================= setup_guardrails() { echo -e "${YELLOW}🛡️ Guardrails scripts available${NC}" if [[ -d "/app/scripts" ]]; then echo " Scripts directory: /app/scripts" ls -la /app/scripts/*.sh 2>/dev/null | while read -r line; do echo " $line" done fi if [[ -d "/app/.githooks" ]]; then echo " Git hooks: /app/.githooks" ls -la /app/.githooks 2>/dev/null | while read -r line; do echo " $line" done fi echo "" echo -e " ${GREEN}✅ Guardrails ready${NC}" echo "" } if [[ "$RUN_MODE" == "agent" ]] || [[ "$RUN_MODE" == "full" ]]; then setup_guardrails fi # ============================================================================= # Full режим: установка git hooks # ============================================================================= install_git_hooks() { if [[ "$RUN_MODE" != "full" ]]; then return fi echo -e "${YELLOW}🔧 Full mode: Installing git hooks...${NC}" if [[ -d "$PROJECT_DIR/.git" ]]; then if [[ -x "/app/scripts/init-git-hooks.sh" ]]; then /app/scripts/init-git-hooks.sh "$PROJECT_DIR" || { echo -e " ${RED}⚠️ Git hooks installation failed${NC}" } else echo -e " ${RED}⚠️ init-git-hooks.sh not found${NC}" fi else echo -e " ${YELLOW}⚠️ Not a git repository: $PROJECT_DIR${NC}" echo " Skipping git hooks" fi echo "" } install_git_hooks # ============================================================================= # Запуск MCP сервера # ============================================================================= echo -e "${GREEN}🚀 Starting MCP Server...${NC}" echo "" echo " Command: uv run python -m mcp_server" echo " Options:" echo " --project-dir $PROJECT_DIR" echo " --port $MCP_PORT" echo " Environment:" echo " LLM_BACKEND=$LLM_BACKEND" echo " OPENAI_BASE_URL=$OPENAI_BASE_URL" echo "" echo -e "${CYAN}══════════════════════════════════════════════════════${NC}" echo "" exec uv run python -m mcp_server \ --project-dir "$PROJECT_DIR" \ --port "$MCP_PORT"