fix(kbtree): 修客户端脚本三处实测暴露的缺陷

都是本机装好后逐条跑命令发现的,不是设想:

1. **token 找不到**:脚本找 `scripts/../config.json`,而实际文件在
   `<skill>/config/config.json`。症状极具迷惑性——「明明配了 token 却说
   没找到」。改为两种布局都试,并在注释里写明为什么不能只写一种。
2. **`-h` 也要 token**:帮助段排在 token 检查之后,`kb_tree.sh -h` 会被
   拦下报「未找到访问令牌」。把 help 提到最前。
3. **`-q` 被当成命令名**:`kb_tree.sh -q 并发`(不给子命令)报
   「未知命令: -q」,而这是很自然的写法。改为:第一个参数是选项时不取作
   子命令,解析完选项后再定——有 -q 走 search,没有走 tree。

另外把 curl -f 换成 -w + 自行判状态码:-f 在 4xx 时只吐一行
`curl: (22) 404`,把响应体丢掉,而 404 响应体里恰是「现有分类」清单,
是排查时最需要的。现在 401/404 都会给出可行动的中文提示,
退出码 0/2/3/4/5/7/8 各有语义。
This commit is contained in:
JianFeeeee
2026-09-26 14:47:32 +08:00
parent 5a889007d7
commit 78806efa0f

View File

@ -8,7 +8,7 @@
# kb_tree.sh -q goroutine -c tech # 在 tech 子树内检索
# kb_tree.sh -l # 列分类
#
# token 读取顺序:环境变量 KB_TOKEN > 本目录 config.json > 报错。
# token 读取顺序:环境变量 KB_TOKEN > <skill>/config/config.json(或 <skill>/config.json)> 报错。
# 故意不放命令行参数:token 会进 shell 历史与 ps 输出。
set -euo pipefail
@ -35,10 +35,14 @@ done
if [[ -z "${KB_TOKEN:-}" ]]; then
CFG="$HERE/../config.json"
if [[ -f "$CFG" ]]; then
KB_TOKEN="$(python3 -c 'import json,sys;print(json.load(open(sys.argv[1])).get("token",""))' "$CFG" 2>/dev/null || true)"
fi
# 两种布局都试:<skill>/config/config.json(当前布局)与 <skill>/config.json。
# 只写一种会因目录结构调整而静默失效——症状是「明明配了 token 却说没找到」。
for CFG in "$HERE/../config/config.json" "$HERE/../config.json"; do
if [[ -f "$CFG" ]]; then
KB_TOKEN="$(python3 -c 'import json,sys;print(json.load(open(sys.argv[1])).get("token",""))' "$CFG" 2>/dev/null || true)"
[[ -n "$KB_TOKEN" ]] && break
fi
done
fi
if [[ -z "${KB_TOKEN:-}" ]]; then
cat >&2 <<'EOF'
@ -57,7 +61,14 @@ fi
auth=(-H "X-API-Key: ${KB_TOKEN}")
cmd="${1:-tree}"; shift || true
# 第一个参数若是选项(如 -q x),它就是选项而非子命令。
# 原先会把 "-q" 当命令名报「未知命令: -q」——而 `kb_tree.sh -q 并发` 是很自然的写法。
if [[ $# -gt 0 && "$1" == -* ]]; then
cmd=""
else
cmd="${1:-tree}"
shift || true
fi
query=""; category=""; depth=""; items=""; limit=""
while getopts "q:c:d:i:l:h" opt 2>/dev/null; do
case "$opt" in
@ -122,6 +133,11 @@ except Exception:
esac
}
# 命令在解析选项**之后**定:没显式给子命令时,
# 有 -q 走 search、没有则走 tree。
if [[ -z "$cmd" ]]; then
if [[ -n "$query" ]]; then cmd="search"; else cmd="tree"; fi
fi
case "$cmd" in
tree|categories|counts|search) ;;
*) echo "未知命令: $cmd" >&2; exit 2 ;;