소스 검색

fix:kiro-cli部署增加sudo权限确认

Jerry Liang 2 달 전
부모
커밋
3175799404
1개의 변경된 파일과 66개의 추가작업 그리고 28개의 파일을 삭제
  1. 66 28
      deploy/scripts/deploy_kiro_cli.sh

+ 66 - 28
deploy/scripts/deploy_kiro_cli.sh

@@ -69,6 +69,10 @@ KIRO_DRY_RUN="${KIRO_DRY_RUN:-n}"
 KIRO_WIKI_DOCS="${KIRO_WIKI_DOCS:-/home/jerry-remote/web/FranklinWH-Wiki/client/docs}"
 KIRO_OFFICECLI_BIN="${KIRO_OFFICECLI_BIN:-/home/jerry-remote/.local/bin/officecli}"
 
+# 文件系统操作是否使用 sudo(默认 y,保持原行为)。当目标目录当前用户可写时可设 n。
+KIRO_USE_SUDO="${KIRO_USE_SUDO:-y}"
+if [[ "${KIRO_USE_SUDO}" == "y" ]]; then SUDO="sudo "; else SUDO=""; fi
+
 KIRO_DEST="${KIRO_HOME%/}/.kiro"
 
 # ---------------------------------------------------------------------------
@@ -204,8 +208,8 @@ ensure_prereqs() {
 # ---------------------------------------------------------------------------
 prepare_dest() {
     info "准备目标目录:${KIRO_DEST}(属主 ${KIRO_RUN_AS_USER})"
-    run_fs "sudo mkdir -p '${KIRO_DEST}/skills'"
-    run_fs "sudo chown -R '${KIRO_RUN_AS_USER}' '${KIRO_HOME%/}/.kiro'"
+    run_fs "${SUDO}mkdir -p '${KIRO_DEST}/skills'"
+    run_fs "${SUDO}chown -R '${KIRO_RUN_AS_USER}' '${KIRO_HOME%/}/.kiro'"
 }
 
 # ---------------------------------------------------------------------------
@@ -220,14 +224,14 @@ sync_config_dirs() {
             continue
         fi
         info "同步配置:${sub}/ → ${KIRO_DEST}/${sub}/"
-        run_fs "sudo mkdir -p '${KIRO_DEST}/${sub}'"
+        run_fs "${SUDO}mkdir -p '${KIRO_DEST}/${sub}'"
         if has rsync; then
-            run_fs "sudo rsync -a --delete '${src}/' '${KIRO_DEST}/${sub}/'"
+            run_fs "${SUDO}rsync -a --delete '${src}/' '${KIRO_DEST}/${sub}/'"
         else
-            run_fs "sudo rm -rf '${KIRO_DEST}/${sub}'/* && sudo cp -rf '${src}/.' '${KIRO_DEST}/${sub}/'"
+            run_fs "${SUDO}rm -rf '${KIRO_DEST}/${sub}'/* && ${SUDO}cp -rf '${src}/.' '${KIRO_DEST}/${sub}/'"
         fi
     done
-    run_fs "sudo chown -R '${KIRO_RUN_AS_USER}' '${KIRO_HOME%/}/.kiro'"
+    run_fs "${SUDO}chown -R '${KIRO_RUN_AS_USER}' '${KIRO_HOME%/}/.kiro'"
     ok "配置目录同步完成"
 }
 
@@ -255,7 +259,7 @@ install_skills_sh() {
         return 0
     fi
     info "从清单安装 skills.sh skill:${KIRO_SKILLS_LIST}"
-    local entry repo skill count=0
+    local entry repo skill ok_count=0 fail_count=0 failed_list=""
     while IFS= read -r entry; do
         [[ -z "${entry}" ]] && continue
         if [[ "${entry}" != *"@"* ]]; then
@@ -264,13 +268,47 @@ install_skills_sh() {
         fi
         repo="${entry%@*}"
         skill="${entry##*@}"
-        info "命令安装 skill:${repo} --skill ${skill} → agent ${KIRO_AGENT}"
-        # 以目标用户身份、HOME=KIRO_HOME 运行,skill 落到 ${KIRO_DEST}/skills
-        as_target_user "cd '${KIRO_HOME}' && npx --yes skills add '${repo}' --skill '${skill}' --agent '${KIRO_AGENT}' --yes" \
-            || warn "skill 安装失败(可稍后重试):${entry}"
-        count=$((count+1))
+        if install_one_skill "${repo}" "${skill}"; then
+            ok_count=$((ok_count+1))
+        else
+            fail_count=$((fail_count+1))
+            failed_list+=" ${entry}"
+        fi
     done < <(read_skills_list)
-    ok "skills.sh skill 命令安装完成(共 ${count} 个)"
+
+    if [[ ${fail_count} -eq 0 ]]; then
+        ok "skills.sh skill 安装完成(成功 ${ok_count} 个)"
+    else
+        warn "skills.sh skill 安装:成功 ${ok_count} 个,失败 ${fail_count} 个 →${failed_list}"
+        warn "可重跑本脚本重试,或手动执行:npx skills add <owner>/<repo> --skill <skill> --agent ${KIRO_AGENT} --yes"
+    fi
+}
+
+# 安装单个 skill 并校验是否真正落地;失败自动重试一次。
+# 参数:$1=<owner>/<repo>  $2=<skill>
+# 校验方式:安装后检查目标 skills 目录下是否出现该 skill 目录(含 SKILL.md)。
+install_one_skill() {
+    local repo="$1" skill="$2"
+    local dest_skill="${KIRO_DEST}/skills/${skill}"
+    local attempt
+    for attempt in 1 2; do
+        info "命令安装 skill:${repo} --skill ${skill} → agent ${KIRO_AGENT}(第 ${attempt} 次)"
+        if is_dry; then
+            as_target_user "cd '${KIRO_HOME}' && npx --yes skills add '${repo}' --skill '${skill}' --agent '${KIRO_AGENT}' --yes"
+            return 0
+        fi
+        # 逐条独立执行;stdin 接 /dev/null,避免 TUI 在管道/循环中争用输入导致后续条目静默失败
+        as_target_user "cd '${KIRO_HOME}' && npx --yes skills add '${repo}' --skill '${skill}' --agent '${KIRO_AGENT}' --yes < /dev/null" || true
+        # 安装后校验:目标目录出现且含 SKILL.md 视为成功
+        if [[ -f "${dest_skill}/SKILL.md" ]]; then
+            ok "skill 就绪:${skill}"
+            return 0
+        fi
+        warn "skill 未检测到落地:${skill}(第 ${attempt} 次),准备重试 ..."
+        sleep 1
+    done
+    err "skill 安装失败:${repo}@${skill}"
+    return 1
 }
 
 # ---------------------------------------------------------------------------
@@ -289,13 +327,13 @@ copy_custom_skills() {
         dest="${KIRO_DEST}/skills/${name}"
         info "拷贝自定义 skill:${name} → ${dest}"
         if has rsync; then
-            run_fs "sudo rsync -a --delete '${skills_src}/${name}/' '${dest}/'"
+            run_fs "${SUDO}rsync -a --delete '${skills_src}/${name}/' '${dest}/'"
         else
-            run_fs "sudo rm -rf '${dest}' && sudo mkdir -p '${dest}' && sudo cp -rf '${skills_src}/${name}/.' '${dest}/'"
+            run_fs "${SUDO}rm -rf '${dest}' && ${SUDO}mkdir -p '${dest}' && ${SUDO}cp -rf '${skills_src}/${name}/.' '${dest}/'"
         fi
         count=$((count+1))
     done
-    run_fs "sudo chown -R '${KIRO_RUN_AS_USER}' '${KIRO_DEST}/skills'"
+    run_fs "${SUDO}chown -R '${KIRO_RUN_AS_USER}' '${KIRO_DEST}/skills'"
     ok "自定义 skill 拷贝完成(共 ${count} 个)"
 }
 
@@ -315,13 +353,13 @@ render_placeholders() {
 
     # agents/*.json
     if [[ -d "${KIRO_DEST}/agents" ]]; then
-        run_fs "sudo find '${KIRO_DEST}/agents' -maxdepth 1 -type f -name '*.json' -exec sed -i -E '${sed_expr}' {} +"
+        run_fs "${SUDO}find '${KIRO_DEST}/agents' -maxdepth 1 -type f -name '*.json' -exec sed -i -E '${sed_expr}' {} +"
     fi
     # skills/**/*.md
     if [[ -d "${KIRO_DEST}/skills" ]]; then
-        run_fs "sudo find '${KIRO_DEST}/skills' -type f -name '*.md' -exec sed -i -E '${sed_expr}' {} +"
+        run_fs "${SUDO}find '${KIRO_DEST}/skills' -type f -name '*.md' -exec sed -i -E '${sed_expr}' {} +"
     fi
-    run_fs "sudo chown -R '${KIRO_RUN_AS_USER}' '${KIRO_HOME%/}/.kiro'"
+    run_fs "${SUDO}chown -R '${KIRO_RUN_AS_USER}' '${KIRO_HOME%/}/.kiro'"
     ok "占位符替换完成(agents + skills)"
 }
 
@@ -338,13 +376,13 @@ install_templates() {
         return 0
     fi
     info "部署模板:${src}/ → ${dest}/"
-    run_fs "sudo mkdir -p '${dest}'"
+    run_fs "${SUDO}mkdir -p '${dest}'"
     if has rsync; then
-        run_fs "sudo rsync -a '${src}/' '${dest}/'"
+        run_fs "${SUDO}rsync -a '${src}/' '${dest}/'"
     else
-        run_fs "sudo cp -rf '${src}/.' '${dest}/'"
+        run_fs "${SUDO}cp -rf '${src}/.' '${dest}/'"
     fi
-    run_fs "sudo chown -R '${KIRO_RUN_AS_USER}' '${dest}'"
+    run_fs "${SUDO}chown -R '${KIRO_RUN_AS_USER}' '${dest}'"
     ok "模板部署完成:${dest}"
 }
 
@@ -363,12 +401,12 @@ install_pyrun() {
         return 0
     fi
     info "部署 fwh-pyrun:${src} → ${dest}"
-    run_fs "sudo mkdir -p '${dest_dir}'"
-    run_fs "sudo cp -f '${src}' '${dest}'"
-    run_fs "sudo chmod 0755 '${dest}'"
-    run_fs "sudo chown '${KIRO_RUN_AS_USER}' '${dest}'"
+    run_fs "${SUDO}mkdir -p '${dest_dir}'"
+    run_fs "${SUDO}cp -f '${src}' '${dest}'"
+    run_fs "${SUDO}chmod 0755 '${dest}'"
+    run_fs "${SUDO}chown '${KIRO_RUN_AS_USER}' '${dest}'"
     # 沙箱可写目录(唯一持久写入点),属主为运行用户
-    run_fs "sudo mkdir -p /tmp/fwh-toolbox-agent && sudo chown '${KIRO_RUN_AS_USER}' /tmp/fwh-toolbox-agent"
+    run_fs "${SUDO}mkdir -p /tmp/fwh-toolbox-agent && ${SUDO}chown '${KIRO_RUN_AS_USER}' /tmp/fwh-toolbox-agent"
     ok "fwh-pyrun 部署完成:${dest}"
 }