|
|
@@ -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}"
|
|
|
}
|
|
|
|