From 78806efa0f82819451d6e8ebe9fcf8791d2a93e7 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sat, 26 Sep 2026 14:47:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(kbtree):=20=E4=BF=AE=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E8=84=9A=E6=9C=AC=E4=B8=89=E5=A4=84=E5=AE=9E=E6=B5=8B?= =?UTF-8?q?=E6=9A=B4=E9=9C=B2=E7=9A=84=E7=BC=BA=E9=99=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 都是本机装好后逐条跑命令发现的,不是设想: 1. **token 找不到**:脚本找 `scripts/../config.json`,而实际文件在 `/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 各有语义。 --- .../skills/knowledge-base/scripts/kb_tree.sh | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/assets/skills/knowledge-base/scripts/kb_tree.sh b/assets/skills/knowledge-base/scripts/kb_tree.sh index 2735e93..ddbdf84 100755 --- a/assets/skills/knowledge-base/scripts/kb_tree.sh +++ b/assets/skills/knowledge-base/scripts/kb_tree.sh @@ -8,7 +8,7 @@ # kb_tree.sh -q goroutine -c tech # 在 tech 子树内检索 # kb_tree.sh -l # 列分类 # -# token 读取顺序:环境变量 KB_TOKEN > 本目录 config.json > 报错。 +# token 读取顺序:环境变量 KB_TOKEN > /config/config.json(或 /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 + # 两种布局都试:/config/config.json(当前布局)与 /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 ;;