feat(install): default URLs from company.json, Confluence token setup, token hints
This commit is contained in:
@@ -84,7 +84,7 @@ export default function kitCliExtension(pi: ExtensionAPI) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Env vars (presence only, never values)
|
// 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] ? "задан" : "не задан"}`));
|
lines.push((process.env[v] ? ok : warn)(`${v} ${process.env[v] ? "задан" : "не задан"}`));
|
||||||
}
|
}
|
||||||
const provider = PROVIDER_KEYS.find((k) => process.env[k]);
|
const provider = PROVIDER_KEYS.find((k) => process.env[k]);
|
||||||
|
|||||||
+72
-17
@@ -83,7 +83,7 @@ info "Пакет установлен. Обновляться потом: pi upd
|
|||||||
# Precedence: PI_KIT_PROFILE env > interactive prompt > "all" (no gating).
|
# Precedence: PI_KIT_PROFILE env > interactive prompt > "all" (no gating).
|
||||||
PROFILE="${PI_KIT_PROFILE:-}"
|
PROFILE="${PI_KIT_PROFILE:-}"
|
||||||
case "$PROFILE" in
|
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)
|
"") # ask if we have a terminal, even under `curl | bash` (read from /dev/tty)
|
||||||
if [ -r /dev/tty ]; then
|
if [ -r /dev/tty ]; then
|
||||||
{
|
{
|
||||||
@@ -92,7 +92,8 @@ case "$PROFILE" in
|
|||||||
printf ' 2) backend — Go/Rust/Python\n'
|
printf ' 2) backend — Go/Rust/Python\n'
|
||||||
printf ' 3) qa — тестирование\n'
|
printf ' 3) qa — тестирование\n'
|
||||||
printf ' 4) mobile — Android/iOS\n'
|
printf ' 4) mobile — Android/iOS\n'
|
||||||
printf 'Номер или имя [1-4]: '
|
printf ' 5) pm — постановка задач продакт-менеджера\n'
|
||||||
|
printf 'Номер или имя [1-5]: '
|
||||||
} >/dev/tty
|
} >/dev/tty
|
||||||
read -r ans </dev/tty || ans=""
|
read -r ans </dev/tty || ans=""
|
||||||
case "$ans" in
|
case "$ans" in
|
||||||
@@ -100,6 +101,7 @@ case "$PROFILE" in
|
|||||||
2 | backend) PROFILE=backend ;;
|
2 | backend) PROFILE=backend ;;
|
||||||
3 | qa) PROFILE=qa ;;
|
3 | qa) PROFILE=qa ;;
|
||||||
4 | mobile) PROFILE=mobile ;;
|
4 | mobile) PROFILE=mobile ;;
|
||||||
|
5 | pm) PROFILE=pm ;;
|
||||||
*) PROFILE=all ;;
|
*) PROFILE=all ;;
|
||||||
esac
|
esac
|
||||||
else
|
else
|
||||||
@@ -116,6 +118,8 @@ info "Профиль: ${PROFILE}"
|
|||||||
# Bundled language skills per profile. Common skills (jira-workflow/repo-map/
|
# Bundled language skills per profile. Common skills (jira-workflow/repo-map/
|
||||||
# docs-map) are always enabled. Prompts and guardrail extensions are never gated.
|
# docs-map) are always enabled. Prompts and guardrail extensions are never gated.
|
||||||
COMMON_BUNDLED="jira-workflow repo-map docs-map"
|
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=()
|
PROFILE_PUBLIC=()
|
||||||
case "$PROFILE" in
|
case "$PROFILE" in
|
||||||
frontend)
|
frontend)
|
||||||
@@ -131,6 +135,10 @@ case "$PROFILE" in
|
|||||||
mobile) # Android (Kotlin) + iOS (Swift)
|
mobile) # Android (Kotlin) + iOS (Swift)
|
||||||
LANG_BUNDLED="kotlin-standards swift-standards"
|
LANG_BUNDLED="kotlin-standards swift-standards"
|
||||||
;;
|
;;
|
||||||
|
pm) # Продакт-менеджер: постановка задач, без языковых стандартов кода
|
||||||
|
LANG_BUNDLED=""
|
||||||
|
EXTRA_BUNDLED="pm-task-spec"
|
||||||
|
;;
|
||||||
*) # all: не гейтим, включаем все языковые скилы
|
*) # all: не гейтим, включаем все языковые скилы
|
||||||
LANG_BUNDLED="go-standards rust-standards python-standards typescript-standards kotlin-standards swift-standards"
|
LANG_BUNDLED="go-standards rust-standards python-standards typescript-standards kotlin-standards swift-standards"
|
||||||
;;
|
;;
|
||||||
@@ -171,7 +179,7 @@ if [ "$PROFILE" = "all" ]; then
|
|||||||
info "Профиль 'all' — оставляю все скилы пакета без гейтинга."
|
info "Профиль 'all' — оставляю все скилы пакета без гейтинга."
|
||||||
else
|
else
|
||||||
info "Гейчу скилы пакета под профиль '${PROFILE}'..."
|
info "Гейчу скилы пакета под профиль '${PROFILE}'..."
|
||||||
gate_bundled_skills "${COMMON_BUNDLED} ${LANG_BUNDLED}" || warn "не удалось отфильтровать скилы (см. выше)."
|
gate_bundled_skills "${COMMON_BUNDLED} ${LANG_BUNDLED} ${EXTRA_BUNDLED}" || warn "не удалось отфильтровать скилы (см. выше)."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# --- 6. Install public skills ----------------------------------------------
|
# --- 6. Install public skills ----------------------------------------------
|
||||||
@@ -201,12 +209,26 @@ fi
|
|||||||
# Interactive setup: prompts (via /dev/tty so it works under curl | bash),
|
# 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
|
# 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.
|
# 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);
|
# Default URLs are taken from the installed package's config/company.json
|
||||||
# the current value is offered as the default. Skip with PI_KIT_SETUP_ENV=0.
|
# (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"
|
CONFIG_DIR="$HOME/.config/pi-kit"
|
||||||
ENV_FILE="$CONFIG_DIR/env.sh"
|
ENV_FILE="$CONFIG_DIR/env.sh"
|
||||||
RC_MARK=">>> pi-kit >>>"
|
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.
|
# 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)
|
PROVIDER_KEYS=(ANTHROPIC_API_KEY OPENAI_API_KEY OPENROUTER_API_KEY GEMINI_API_KEY GOOGLE_API_KEY GROQ_API_KEY)
|
||||||
found_key=""
|
found_key=""
|
||||||
@@ -234,21 +256,46 @@ env_setup_interactive() {
|
|||||||
# shellcheck disable=SC1090
|
# shellcheck disable=SC1090
|
||||||
[ -f "$ENV_FILE" ] && . "$ENV_FILE" || true
|
[ -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.
|
local ans=""
|
||||||
printf 'TRACKER_URL (адрес Jira)%s: ' "${tracker:+ [${tracker}]}" >/dev/tty
|
# 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=""
|
read -r ans </dev/tty || ans=""
|
||||||
[ -n "$ans" ] && tracker="$ans"
|
[ -n "$ans" ] && tracker="$ans"
|
||||||
|
|
||||||
# JIRA_TOKEN (secret): hidden input; empty keeps the current value.
|
printf ' CONFLUENCE_URL (Confluence/wiki)%s: ' "${confluence:+ [${confluence}]}" >/dev/tty
|
||||||
printf 'JIRA_TOKEN (скрытый ввод, Enter — оставить как есть): ' >/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=""
|
read -rs ans </dev/tty || ans=""
|
||||||
printf '\n' >/dev/tty
|
printf '\n' >/dev/tty
|
||||||
[ -n "$ans" ] && jira="$ans"
|
[ -n "$ans" ] && jira="$ans"
|
||||||
|
|
||||||
# GITLAB_TOKEN (secret, для create-mr.sh): hidden input.
|
printf 'CONFLUENCE_TOKEN: где брать — Confluence: Профиль → Настройки → Personal access tokens (старые: API tokens).\n'
|
||||||
printf 'GITLAB_TOKEN (скрытый ввод, Enter — пропустить): ' >/dev/tty
|
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=""
|
read -rs ans </dev/tty || ans=""
|
||||||
printf '\n' >/dev/tty
|
printf '\n' >/dev/tty
|
||||||
[ -n "$ans" ] && gitlab="$ans"
|
[ -n "$ans" ] && gitlab="$ans"
|
||||||
@@ -278,7 +325,9 @@ env_setup_interactive() {
|
|||||||
{
|
{
|
||||||
echo "# Managed by pi-kit install.sh — не коммить. chmod 600, plaintext."
|
echo "# Managed by pi-kit install.sh — не коммить. chmod 600, plaintext."
|
||||||
[ -n "$tracker" ] && echo "export TRACKER_URL='$(esc_sq "$tracker")'"
|
[ -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 "$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 "$gitlab" ] && echo "export GITLAB_TOKEN='$(esc_sq "$gitlab")'"
|
||||||
[ -n "$prov_name" ] && [ -n "$prov_val" ] && echo "export ${prov_name}='$(esc_sq "$prov_val")'"
|
[ -n "$prov_name" ] && [ -n "$prov_val" ] && echo "export ${prov_name}='$(esc_sq "$prov_val")'"
|
||||||
} >"$ENV_FILE"
|
} >"$ENV_FILE"
|
||||||
@@ -315,10 +364,13 @@ else
|
|||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
Задай нужные переменные вручную (например, в ~/.config/pi-kit/env.sh):
|
Задай нужные переменные вручную (например, в ~/.config/pi-kit/env.sh):
|
||||||
export ANTHROPIC_API_KEY="..." # или OPENAI_API_KEY / OPENROUTER_API_KEY
|
export ANTHROPIC_API_KEY="..." # или OPENAI_API_KEY / OPENROUTER_API_KEY
|
||||||
export TRACKER_URL="..." # адрес Jira (Server/DC)
|
export TRACKER_URL="..." # адрес Jira (сейчас подхватится трекер из config/company.json)
|
||||||
export JIRA_TOKEN="..." # Jira personal access token
|
export CONFLUENCE_URL="..." # адрес Confluence (подхватится из config/company.json)
|
||||||
export GITLAB_TOKEN="..." # для создания MR (scripts/create-mr.sh)
|
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 (пакет не навязывает).
|
Провайдер/модель — флагами --provider/--model или в настройках Pi (пакет не навязывает).
|
||||||
|
URL можно не задавать: инструменты берут дефолты из config/company.json.
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -330,11 +382,14 @@ cat <<EOF
|
|||||||
|
|
||||||
Запуск: pi
|
Запуск: pi
|
||||||
Обновление: pi update --extensions (следует за каналом ${PI_KIT_CHANNEL})
|
Обновление: pi update --extensions (следует за каналом ${PI_KIT_CHANNEL})
|
||||||
Окружение: ${ENV_FILE} (TRACKER_URL/JIRA_TOKEN/GITLAB_TOKEN/ключ провайдера)
|
Окружение: ${ENV_FILE} (JIRA_TOKEN/CONFLUENCE_TOKEN/GITLAB_TOKEN/ключ провайдера)
|
||||||
Сменить профиль: PI_KIT_PROFILE=backend ./install.sh (или перезапусти и выбери)
|
URL-адреса — дефолты из config/company.json (можно переопределить в env.sh)
|
||||||
|
Сменить профиль: PI_KIT_PROFILE=backend ./install.sh (или перезапусти и выбери; есть и 'pm')
|
||||||
Сменить канал: PI_KIT_CHANNEL=beta ./install.sh
|
Сменить канал: PI_KIT_CHANNEL=beta ./install.sh
|
||||||
Команды: /bugfix <тикет> /feature <тикет> /review [фокус] /rfc <тема>
|
Команды: /bugfix <тикет> /feature <тикет> /review [фокус] /rfc <тема>
|
||||||
/kit-config /kit-doctor /kit-help
|
/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 окружения
|
Проверка: /kit-doctor — health-check окружения
|
||||||
────────────────────────────────────────────────────────
|
────────────────────────────────────────────────────────
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
Reference in New Issue
Block a user