feat(install): default URLs from company.json, Confluence token setup, token hints

This commit is contained in:
Aleksey Shakhmatov
2026-08-06 14:43:17 +03:00
parent 8b273c9a72
commit f802f06930
2 changed files with 73 additions and 18 deletions
+1 -1
View File
@@ -84,7 +84,7 @@ export default function kitCliExtension(pi: ExtensionAPI) {
}
// Env vars (presence only, never values)
for (const v of ["TRACKER_URL", "JIRA_TOKEN", "GITLAB_TOKEN"]) {
for (const v of ["TRACKER_URL", "JIRA_TOKEN", "CONFLUENCE_TOKEN", "GITLAB_TOKEN"]) {
lines.push((process.env[v] ? ok : warn)(`${v} ${process.env[v] ? "задан" : "не задан"}`));
}
const provider = PROVIDER_KEYS.find((k) => process.env[k]);
+72 -17
View File
@@ -83,7 +83,7 @@ info "Пакет установлен. Обновляться потом: pi upd
# Precedence: PI_KIT_PROFILE env > interactive prompt > "all" (no gating).
PROFILE="${PI_KIT_PROFILE:-}"
case "$PROFILE" in
frontend | backend | qa | mobile) ;; # valid, keep
frontend | backend | qa | mobile | pm) ;; # valid, keep
"") # ask if we have a terminal, even under `curl | bash` (read from /dev/tty)
if [ -r /dev/tty ]; then
{
@@ -92,7 +92,8 @@ case "$PROFILE" in
printf ' 2) backend — Go/Rust/Python\n'
printf ' 3) qa — тестирование\n'
printf ' 4) mobile — Android/iOS\n'
printf 'Номер или имя [1-4]: '
printf ' 5) pm — постановка задач продакт-менеджера\n'
printf 'Номер или имя [1-5]: '
} >/dev/tty
read -r ans </dev/tty || ans=""
case "$ans" in
@@ -100,6 +101,7 @@ case "$PROFILE" in
2 | backend) PROFILE=backend ;;
3 | qa) PROFILE=qa ;;
4 | mobile) PROFILE=mobile ;;
5 | pm) PROFILE=pm ;;
*) PROFILE=all ;;
esac
else
@@ -116,6 +118,8 @@ info "Профиль: ${PROFILE}"
# Bundled language skills per profile. Common skills (jira-workflow/repo-map/
# docs-map) are always enabled. Prompts and guardrail extensions are never gated.
COMMON_BUNDLED="jira-workflow repo-map docs-map"
# Extra bundled skills beyond language standards, added per profile (e.g. product/PM tooling).
EXTRA_BUNDLED=""
PROFILE_PUBLIC=()
case "$PROFILE" in
frontend)
@@ -131,6 +135,10 @@ case "$PROFILE" in
mobile) # Android (Kotlin) + iOS (Swift)
LANG_BUNDLED="kotlin-standards swift-standards"
;;
pm) # Продакт-менеджер: постановка задач, без языковых стандартов кода
LANG_BUNDLED=""
EXTRA_BUNDLED="pm-task-spec"
;;
*) # all: не гейтим, включаем все языковые скилы
LANG_BUNDLED="go-standards rust-standards python-standards typescript-standards kotlin-standards swift-standards"
;;
@@ -171,7 +179,7 @@ if [ "$PROFILE" = "all" ]; then
info "Профиль 'all' — оставляю все скилы пакета без гейтинга."
else
info "Гейчу скилы пакета под профиль '${PROFILE}'..."
gate_bundled_skills "${COMMON_BUNDLED} ${LANG_BUNDLED}" || warn "не удалось отфильтровать скилы (см. выше)."
gate_bundled_skills "${COMMON_BUNDLED} ${LANG_BUNDLED} ${EXTRA_BUNDLED}" || warn "не удалось отфильтровать скилы (см. выше)."
fi
# --- 6. Install public skills ----------------------------------------------
@@ -201,12 +209,26 @@ fi
# 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.
# Default URLs are taken from the installed package's config/company.json
# (single source of truth) and offered for confirmation — the user can keep or
# override them. Skip with PI_KIT_SETUP_ENV=0.
CONFIG_DIR="$HOME/.config/pi-kit"
ENV_FILE="$CONFIG_DIR/env.sh"
RC_MARK=">>> pi-kit >>>"
# Locate the installed package's config/company.json (where `pi install` cloned it).
# Tries the git-based package dir used by pi, falling back to a local checkout.
PACKAGE_JSON=""
for cand in "$HOME/.pi/agent/git/${PI_KIT_HOST}/config/company.json" "$HOME/.config/pi-kit/company.json" "./config/company.json"; do
if [ -f "$cand" ]; then PACKAGE_JSON="$cand"; break; fi
done
# read_pkg_url <field> — get a default URL from config/company.json (or "").
read_pkg_url() {
[ -z "$PACKAGE_JSON" ] && { echo ""; return; }
node -e 'const f=process.argv[1];try{const c=require(f);const v=c[process.argv[2]]||"";process.stdout.write(typeof v==="string"&&v&&v!=="TODO"?v:"")}catch(e){process.stdout.write("")}' "$PACKAGE_JSON" "$1" 2>/dev/null
}
# 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=""
@@ -234,21 +256,46 @@ env_setup_interactive() {
# shellcheck disable=SC1090
[ -f "$ENV_FILE" ] && . "$ENV_FILE" || true
local tracker="${TRACKER_URL:-}" jira="${JIRA_TOKEN:-}" gitlab="${GITLAB_TOKEN:-}" ans=""
# Package defaults from config/company.json (offer, user may override).
local pkg_tracker pkg_docs pkg_host
pkg_tracker="$(read_pkg_url trackerUrl)"
pkg_docs="$(read_pkg_url docsUrl)"
pkg_host="$(read_pkg_url gitHost)"
# TRACKER_URL (not a secret): visible prompt, current value as default.
printf 'TRACKER_URL (адрес Jira)%s: ' "${tracker:+ [${tracker}]}" >/dev/tty
local ans=""
# Seed res from current env (keep on re-run) else package default.
local tracker="${TRACKER_URL:-${pkg_tracker}}"
local confluence="${CONFLUENCE_URL:-${pkg_docs}}"
local jira="${JIRA_TOKEN:-}"
local conf="${CONFLUENCE_TOKEN:-}"
local gitlab="${GITLAB_TOKEN:-}"
# ---- URLs (visible prompts; current/default value shown) ----
printf '\nURL-адреса корпоративных сервисов (Enter — оставить дефолт):\n'
printf ' TRACKER_URL (Jira)%s: ' "${tracker:+ [${tracker}]}" >/dev/tty
read -r ans </dev/tty || ans=""
[ -n "$ans" ] && tracker="$ans"
# JIRA_TOKEN (secret): hidden input; empty keeps the current value.
printf 'JIRA_TOKEN (скрытый ввод, Enter — оставить как есть): ' >/dev/tty
printf ' CONFLUENCE_URL (Confluence/wiki)%s: ' "${confluence:+ [${confluence}]}" >/dev/tty
read -r ans </dev/tty || ans=""
[ -n "$ans" ] && confluence="$ans"
# ---- Tokens (secret, hidden input; empty keeps current) ----
printf '\nТокены сервисов (скрытый ввод, Enter — оставить как есть / пропустить):\n'
printf 'JIRA_TOKEN: где брать — Jira: Профиль (аватар) → Безопасность → Personal access tokens → создать.\n'
printf 'JIRA_TOKEN (скрытый ввод): ' >/dev/tty
read -rs ans </dev/tty || ans=""
printf '\n' >/dev/tty
[ -n "$ans" ] && jira="$ans"
# GITLAB_TOKEN (secret, для create-mr.sh): hidden input.
printf 'GITLAB_TOKEN (скрытый ввод, Enter — пропустить): ' >/dev/tty
printf 'CONFLUENCE_TOKEN: где брать — Confluence: Профиль → Настройки → Personal access tokens (старые: API tokens).\n'
printf 'CONFLUENCE_TOKEN (скрытый ввод): ' >/dev/tty
read -rs ans </dev/tty || ans=""
printf '\n' >/dev/tty
[ -n "$ans" ] && conf="$ans"
printf 'GITLAB_TOKEN: где брать — GitLab: Настройки → Access Tokens → Personal; scope: api (или read_api).\n'
printf 'GITLAB_TOKEN (скрытый ввод): ' >/dev/tty
read -rs ans </dev/tty || ans=""
printf '\n' >/dev/tty
[ -n "$ans" ] && gitlab="$ans"
@@ -278,7 +325,9 @@ env_setup_interactive() {
{
echo "# Managed by pi-kit install.sh — не коммить. chmod 600, plaintext."
[ -n "$tracker" ] && echo "export TRACKER_URL='$(esc_sq "$tracker")'"
[ -n "$confluence" ] && echo "export CONFLUENCE_URL='$(esc_sq "$confluence")'"
[ -n "$jira" ] && echo "export JIRA_TOKEN='$(esc_sq "$jira")'"
[ -n "$conf" ] && echo "export CONFLUENCE_TOKEN='$(esc_sq "$conf")'"
[ -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"
@@ -315,10 +364,13 @@ else
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)
export TRACKER_URL="..." # адрес Jira (сейчас подхватится трекер из config/company.json)
export CONFLUENCE_URL="..." # адрес Confluence (подхватится из config/company.json)
export JIRA_TOKEN="..." # Jira personal access token
export CONFLUENCE_TOKEN="..." # Confluence personal access token
export GITLAB_TOKEN="..." # GitLab token (scope api) для MR/пайплайнов/поиска
Провайдер/модель — флагами --provider/--model или в настройках Pi (пакет не навязывает).
URL можно не задавать: инструменты берут дефолты из config/company.json.
EOF
fi
@@ -330,11 +382,14 @@ cat <<EOF
Запуск: pi
Обновление: pi update --extensions (следует за каналом ${PI_KIT_CHANNEL})
Окружение: ${ENV_FILE} (TRACKER_URL/JIRA_TOKEN/GITLAB_TOKEN/ключ провайдера)
Сменить профиль: PI_KIT_PROFILE=backend ./install.sh (или перезапусти и выбери)
Окружение: ${ENV_FILE} (JIRA_TOKEN/CONFLUENCE_TOKEN/GITLAB_TOKEN/ключ провайдера)
URL-адреса — дефолты из config/company.json (можно переопределить в env.sh)
Сменить профиль: PI_KIT_PROFILE=backend ./install.sh (или перезапусти и выбери; есть и 'pm')
Сменить канал: PI_KIT_CHANNEL=beta ./install.sh
Команды: /bugfix <тикет> /feature <тикет> /review [фокус] /rfc <тема>
/kit-config /kit-doctor /kit-help
Инструменты: jira_issue_* | gitlab_mr_create/gitlab_pipeline_status/gitlab_code_search
| confluence_search/confluence_page_* (нативные, для агента)
Проверка: /kit-doctor — health-check окружения
────────────────────────────────────────────────────────
EOF