diff --git a/README.md b/README.md index 7c1eb9b..4a7b4a8 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,15 @@ curl -fsSL https://git.codelab.vc/ai/pi-kit/-/raw/main/install.sh | bash ``` Скрипт проверит Node.js (>= 20), поставит Pi (если нет), установит этот пакет, **спросит -твой профиль**, поставит нужные скилы и подскажет, какие переменные окружения нужны -(ключ вашего LLM-провайдера, `TRACKER_URL`, `JIRA_TOKEN`). +твой профиль**, поставит нужные скилы и **интерактивно настроит окружение** (`TRACKER_URL`, +`JIRA_TOKEN`, `GITLAB_TOKEN`, ключ LLM-провайдера). Секреты вводятся скрыто и сохраняются в +`~/.config/pi-kit/env.sh` (`chmod 600`), который подключается из твоего `~/.zshrc`/`~/.bashrc`. Pi провайдер-агностичен — модель/провайдера пакет не навязывает, каждый выбирает свой (Anthropic, OpenAI, OpenRouter, …). +Пропустить интерактивную настройку окружения: `PI_KIT_SETUP_ENV=0`. Значения потом можно +поменять прямо в `~/.config/pi-kit/env.sh` или перезапустив `./install.sh`. + Профиль можно задать заранее (для CI/неинтерактивной установки): ```bash diff --git a/install.sh b/install.sh index 2154db2..5200103 100755 --- a/install.sh +++ b/install.sh @@ -187,10 +187,17 @@ if [ "${#PROFILE_PUBLIC[@]}" -gt 0 ]; then done fi -# --- 7. Provider API keys --------------------------------------------------- -# Pi is provider-agnostic: engineers use different LLM providers (Anthropic, -# OpenAI, OpenRouter, Google, ...). The package does NOT pin a provider/model. -# We only check that *some* provider key is present and hint if none is. +# --- 7. Environment (URLs + secrets) --------------------------------------- +# Interactive setup: prompts (via /dev/tty so it works under curl | bash), +# stores chosen values in ~/.config/pi-kit/env.sh (chmod 600) and sources it +# from the shell rc. Secrets are read hidden and never echoed/logged. +# URLs have no package default yet (config/company.json is filled by maintainers); +# the current value is offered as the default. Skip with PI_KIT_SETUP_ENV=0. +CONFIG_DIR="$HOME/.config/pi-kit" +ENV_FILE="$CONFIG_DIR/env.sh" +RC_MARK=">>> pi-kit >>>" + +# Which provider key (if any) is already present in the environment. PROVIDER_KEYS=(ANTHROPIC_API_KEY OPENAI_API_KEY OPENROUTER_API_KEY GEMINI_API_KEY GOOGLE_API_KEY GROQ_API_KEY) found_key="" for k in "${PROVIDER_KEYS[@]}"; do @@ -199,21 +206,109 @@ for k in "${PROVIDER_KEYS[@]}"; do break fi done -if [ -n "$found_key" ]; then - info "Найден ключ LLM-провайдера: ${found_key} — ок." -else - warn "Не найден ни один ключ LLM-провайдера." - cat <<'EOF' - Pi работает с разными провайдерами — выбери свой и задай ключ, например: - export ANTHROPIC_API_KEY="..." # Anthropic - export OPENAI_API_KEY="..." # OpenAI - export OPENROUTER_API_KEY="..." # OpenRouter - Провайдер и модель выбираются флагами --provider/--model или в настройках Pi - (см. `pi --list-models`) — пакет их не навязывает. - Для скилла работы с трекером также понадобятся: - export TRACKER_URL="..." # адрес Jira (или возьмётся из корп. контекста) - export JIRA_TOKEN="..." # Jira personal access token (Server/DC) +detect_rc() { + case "$(basename "${SHELL:-}")" in + zsh) echo "$HOME/.zshrc" ;; + bash) echo "$HOME/.bashrc" ;; + *) echo "$HOME/.profile" ;; + esac +} + +# Escape a value for safe embedding inside single quotes. +esc_sq() { printf "%s" "$1" | sed "s/'/'\\\\''/g"; } + +env_setup_interactive() { + info "Настройка окружения — значения сохранятся в ${ENV_FILE} (chmod 600)." + # Load previously stored values so re-runs keep them as defaults. + # shellcheck disable=SC1090 + [ -f "$ENV_FILE" ] && . "$ENV_FILE" || true + + local tracker="${TRACKER_URL:-}" jira="${JIRA_TOKEN:-}" gitlab="${GITLAB_TOKEN:-}" ans="" + + # TRACKER_URL (not a secret): visible prompt, current value as default. + printf 'TRACKER_URL (адрес Jira)%s: ' "${tracker:+ [${tracker}]}" >/dev/tty + read -r ans /dev/tty + read -rs ans /dev/tty + [ -n "$ans" ] && jira="$ans" + + # GITLAB_TOKEN (secret, для create-mr.sh): hidden input. + printf 'GITLAB_TOKEN (скрытый ввод, Enter — пропустить): ' >/dev/tty + read -rs ans /dev/tty + [ -n "$ans" ] && gitlab="$ans" + + # LLM provider key — only ask if none is already set. + local prov_name="" prov_val="" + if [ -z "$found_key" ]; then + printf 'LLM-провайдер: 1) anthropic 2) openai 3) openrouter 4) пропустить [1-4]: ' >/dev/tty + read -r ans /dev/tty + read -rs prov_val /dev/tty + fi + fi + + # Write env file with restrictive permissions (umask 077 => 600). + mkdir -p "$CONFIG_DIR" + ( + umask 077 + { + echo "# Managed by pi-kit install.sh — не коммить. chmod 600, plaintext." + [ -n "$tracker" ] && echo "export TRACKER_URL='$(esc_sq "$tracker")'" + [ -n "$jira" ] && echo "export JIRA_TOKEN='$(esc_sq "$jira")'" + [ -n "$gitlab" ] && echo "export GITLAB_TOKEN='$(esc_sq "$gitlab")'" + [ -n "$prov_name" ] && [ -n "$prov_val" ] && echo "export ${prov_name}='$(esc_sq "$prov_val")'" + } >"$ENV_FILE" + ) + chmod 600 "$ENV_FILE" + info "Сохранено: ${ENV_FILE}" + + # Ensure the shell rc sources the env file (managed block, idempotent). + local rc + rc="$(detect_rc)" + if [ -f "$rc" ] && grep -qF "$RC_MARK" "$rc" 2>/dev/null; then + info "Подключение уже есть в ${rc}." + else + { + echo "" + echo "# ${RC_MARK}" + echo '[ -f "$HOME/.config/pi-kit/env.sh" ] && . "$HOME/.config/pi-kit/env.sh"' + echo "# <<< pi-kit <<<" + } >>"$rc" + info "Добавил подключение в ${rc}. Применить сейчас: source ${rc}" + fi + warn "Токены лежат в ${ENV_FILE} (chmod 600, plaintext). Для строгих требований — секрет-менеджер." +} + +if [ "${PI_KIT_SETUP_ENV:-1}" != 0 ] && [ -r /dev/tty ]; then + env_setup_interactive +else + # Non-interactive fallback: just check for a provider key and print guidance. + if [ -n "$found_key" ]; then + info "Найден ключ LLM-провайдера: ${found_key} — ок." + else + warn "Не найден ключ LLM-провайдера (установка неинтерактивная — пропускаю настройку)." + fi + cat <<'EOF' + Задай нужные переменные вручную (например, в ~/.config/pi-kit/env.sh): + export ANTHROPIC_API_KEY="..." # или OPENAI_API_KEY / OPENROUTER_API_KEY + export TRACKER_URL="..." # адрес Jira (Server/DC) + export JIRA_TOKEN="..." # Jira personal access token + export GITLAB_TOKEN="..." # для создания MR (scripts/create-mr.sh) + Провайдер/модель — флагами --provider/--model или в настройках Pi (пакет не навязывает). EOF fi @@ -225,6 +320,7 @@ cat < /feature <тикет> /review [фокус] /rfc <тема> /kit-config