install_kiro_cli.sh 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #!/usr/bin/env bash
  2. # =============================================================================
  3. # FranklinWH Toolbox - Kiro CLI 安装脚本
  4. # =============================================================================
  5. # 作用:为后端 AI 对话功能安装 kiro-cli。后端通过 ACP 协议以子进程方式拉起
  6. # `kiro-cli`,并降权到 config.env 中的 KIRO_RUN_AS_USER(HOME=KIRO_HOME)。
  7. # 因此 kiro-cli 必须:
  8. # 1. 安装到可被该用户执行的位置(默认装到该用户的 ~/.local/bin);
  9. # 2. 该用户完成 `kiro-cli login`(AWS Builder ID,交互式)后方可使用。
  10. #
  11. # 安装方式(优先级):
  12. # 1. ZIP 安装包(离线/可控,默认):下载官方 kirocli-<arch>-linux[-musl].zip,
  13. # 解压后以目标用户身份运行 install.sh --no-confirm。
  14. # 2. 官方一键脚本(KIRO_INSTALL_METHOD=curl):curl -fsSL https://cli.kiro.dev/install | bash
  15. #
  16. # 前置条件:curl、unzip(缺失会尝试用 apt 安装)
  17. #
  18. # 环境变量:
  19. # KIRO_RUN_AS_USER 安装并运行 kiro-cli 的系统用户 (默认当前用户)
  20. # KIRO_HOME 该用户 HOME(决定 ~/.kiro 配置位置) (默认该用户家目录)
  21. # KIRO_INSTALL_METHOD zip | curl (默认 zip)
  22. # KIRO_LIBC gnu | musl(zip 方式的 C 库变体) (默认 gnu)
  23. # KIRO_ZIP_URL 自定义 ZIP 下载地址(覆盖自动推断) (默认空)
  24. # KIRO_DO_LOGIN 安装后是否立即交互式登录 (y/n) (默认 n)
  25. # =============================================================================
  26. set -euo pipefail
  27. KIRO_RUN_AS_USER="${KIRO_RUN_AS_USER:-$(id -un)}"
  28. KIRO_HOME="${KIRO_HOME:-}"
  29. KIRO_INSTALL_METHOD="${KIRO_INSTALL_METHOD:-zip}"
  30. KIRO_LIBC="${KIRO_LIBC:-gnu}"
  31. KIRO_ZIP_URL="${KIRO_ZIP_URL:-}"
  32. KIRO_DO_LOGIN="${KIRO_DO_LOGIN:-n}"
  33. c_reset='\033[0m'; c_blue='\033[1;34m'; c_green='\033[1;32m'; c_yellow='\033[1;33m'; c_red='\033[1;31m'
  34. info() { echo -e "${c_blue}[INFO]${c_reset} $*"; }
  35. ok() { echo -e "${c_green}[ OK ]${c_reset} $*"; }
  36. warn() { echo -e "${c_yellow}[WARN]${c_reset} $*"; }
  37. err() { echo -e "${c_red}[FAIL]${c_reset} $*" >&2; }
  38. has() { command -v "$1" >/dev/null 2>&1; }
  39. # 解析目标用户 HOME(KIRO_HOME 优先,否则取该用户 passwd 家目录)
  40. resolve_home() {
  41. if [[ -n "${KIRO_HOME}" ]]; then
  42. echo "${KIRO_HOME}"; return 0
  43. fi
  44. getent passwd "${KIRO_RUN_AS_USER}" | cut -d: -f6
  45. }
  46. # 以目标用户身份执行命令(设置正确的 HOME/USER),当前用户即目标用户时直接执行
  47. as_target_user() {
  48. local home; home="$(resolve_home)"
  49. if [[ "${KIRO_RUN_AS_USER}" == "$(id -un)" ]]; then
  50. HOME="${home}" bash -lc "$*"
  51. else
  52. sudo -u "${KIRO_RUN_AS_USER}" -H env HOME="${home}" bash -lc "$*"
  53. fi
  54. }
  55. # ---------------------------------------------------------------------------
  56. # 0. 前置依赖
  57. # ---------------------------------------------------------------------------
  58. ensure_prereqs() {
  59. local need=()
  60. has curl || need+=(curl)
  61. has unzip || need+=(unzip)
  62. if [[ ${#need[@]} -gt 0 ]]; then
  63. info "安装依赖:${need[*]}"
  64. if has apt-get; then
  65. sudo apt-get update -y
  66. sudo apt-get install -y "${need[@]}"
  67. else
  68. err "缺少 ${need[*]},且系统无 apt-get,请手动安装后重试"
  69. return 1
  70. fi
  71. fi
  72. if ! getent passwd "${KIRO_RUN_AS_USER}" >/dev/null; then
  73. err "系统用户不存在:${KIRO_RUN_AS_USER}(请先创建,或修正 KIRO_RUN_AS_USER)"
  74. return 1
  75. fi
  76. }
  77. # 已装则跳过(检测目标用户可见的 kiro-cli)
  78. already_installed() {
  79. if as_target_user 'command -v kiro-cli >/dev/null 2>&1'; then
  80. local ver; ver="$(as_target_user 'kiro-cli version 2>/dev/null | head -n1' || true)"
  81. ok "kiro-cli 已安装(用户 ${KIRO_RUN_AS_USER}):${ver:-unknown}"
  82. return 0
  83. fi
  84. return 1
  85. }
  86. # 推断 ZIP 下载地址
  87. resolve_zip_url() {
  88. if [[ -n "${KIRO_ZIP_URL}" ]]; then echo "${KIRO_ZIP_URL}"; return 0; fi
  89. local arch; arch="$(uname -m)"
  90. local platform
  91. case "${arch}" in
  92. x86_64|amd64) platform="x86_64-linux" ;;
  93. aarch64|arm64) platform="aarch64-linux" ;;
  94. *) err "未知架构:${arch}(可用 KIRO_ZIP_URL 手动指定下载地址)"; return 1 ;;
  95. esac
  96. [[ "${KIRO_LIBC}" == "musl" ]] && platform="${platform}-musl"
  97. echo "https://desktop-release.q.us-east-1.amazonaws.com/latest/kirocli-${platform}.zip"
  98. }
  99. # ---------------------------------------------------------------------------
  100. # 1a. ZIP 方式安装
  101. # ---------------------------------------------------------------------------
  102. install_via_zip() {
  103. local url; url="$(resolve_zip_url)" || return 1
  104. info "下载 Kiro CLI 安装包:${url}"
  105. local tmp; tmp="$(mktemp -d)"
  106. # 以目标用户身份下载/解压/安装,确保产物落到其家目录且属主正确
  107. local home; home="$(resolve_home)"
  108. sudo chown "${KIRO_RUN_AS_USER}" "${tmp}" 2>/dev/null || true
  109. as_target_user "cd '${tmp}' && \
  110. curl --proto '=https' --tlsv1.2 -sSf '${url}' -o kirocli.zip && \
  111. unzip -q kirocli.zip && \
  112. bash ./kirocli/install.sh --no-confirm"
  113. rm -rf "${tmp}"
  114. ok "Kiro CLI 安装完成(ZIP 方式)"
  115. }
  116. # ---------------------------------------------------------------------------
  117. # 1b. 官方一键脚本安装
  118. # ---------------------------------------------------------------------------
  119. install_via_curl() {
  120. info "使用官方一键脚本安装 Kiro CLI ..."
  121. as_target_user "curl -fsSL https://cli.kiro.dev/install | bash"
  122. ok "Kiro CLI 安装完成(curl 方式)"
  123. }
  124. # ---------------------------------------------------------------------------
  125. # 2. 校验
  126. # ---------------------------------------------------------------------------
  127. verify() {
  128. info "校验 kiro-cli 可用性(用户 ${KIRO_RUN_AS_USER})..."
  129. if as_target_user 'command -v kiro-cli >/dev/null 2>&1'; then
  130. local ver; ver="$(as_target_user 'kiro-cli version 2>/dev/null | head -n1' || true)"
  131. ok "kiro-cli 可用:${ver:-installed}"
  132. else
  133. warn "在登录 shell 中未找到 kiro-cli。安装脚本可能已把它装到 ~/.local/bin,"
  134. warn "需确保该目录在 PATH 中(安装脚本一般会写入 shell 配置,重登后生效)。"
  135. warn "后端拉起 kiro-cli 时依赖 PATH/HOME,请确认 KIRO_HOME 与该用户一致。"
  136. fi
  137. }
  138. # ---------------------------------------------------------------------------
  139. # 3. 登录(可选,交互式)
  140. # ---------------------------------------------------------------------------
  141. login() {
  142. [[ "${KIRO_DO_LOGIN}" == "y" ]] || return 0
  143. info "启动 kiro-cli 登录(AWS Builder ID,按提示在浏览器完成认证)..."
  144. as_target_user "kiro-cli login" || warn "登录未完成,可稍后以 ${KIRO_RUN_AS_USER} 身份运行 'kiro-cli login'"
  145. }
  146. main() {
  147. info "== 安装 Kiro CLI(AI 对话依赖)=="
  148. info "运行用户=${KIRO_RUN_AS_USER} HOME=$(resolve_home) 方式=${KIRO_INSTALL_METHOD}"
  149. ensure_prereqs
  150. if already_installed; then
  151. verify; login
  152. return 0
  153. fi
  154. case "${KIRO_INSTALL_METHOD}" in
  155. zip) install_via_zip ;;
  156. curl) install_via_curl ;;
  157. *) err "未知 KIRO_INSTALL_METHOD:${KIRO_INSTALL_METHOD}(可选 zip|curl)"; exit 1 ;;
  158. esac
  159. verify
  160. login
  161. cat <<EOF
  162. ${c_green}Kiro CLI 安装步骤结束${c_reset}
  163. 运行用户 : ${KIRO_RUN_AS_USER}
  164. HOME : $(resolve_home)
  165. 配置目录 : $(resolve_home)/.kiro
  166. 重要后续 :
  167. 1) 若尚未登录,请以该用户身份运行: sudo -u ${KIRO_RUN_AS_USER} -H kiro-cli login
  168. (AWS Builder ID,交互式浏览器认证;远程无浏览器时按提示复制 URL 完成)
  169. 2) 确认 config.env 的 KIRO_RUN_AS_USER=${KIRO_RUN_AS_USER}、KIRO_HOME 与此处一致
  170. 3) 确认 kiro-cli 在该用户 PATH 中(一般为 ~/.local/bin),后端方能成功拉起
  171. EOF
  172. }
  173. main "$@"