Просмотр исходного кода

feat(plugin): 0.8.3 —— endpoint 支持交互选择,并规定 agent 该把选择权交回用户

两件相关的事:

1. `wikipali endpoint` 不带参数时,**在真实终端里**列出后提示选序号,回车不改。
   按 sys.stdin.isatty() 判断——agent 的 Bash 调用、CI、管道都没有 tty,那里保持
   纯展示,不会卡在等输入上(这正是当初做成纯展示的顾虑,但解法不该是「所有人都
   别想交互」;grant 的 channel 选择早就在用同样的 tty 判断)。另加 -l/--list,
   在终端里也想只看不选时用。

2. 规程加一条:用户说「切换服务器」却没指定目标时,**把站点列表作为选择题呈现**
   再执行。起因是我自己犯的错——用户只说「切换 endpoint」,我根据部署状态推断
   替他切到了 next。切换会写回凭据文件、改变之后所有操作的落点,那是用户的决定。
   同时点明「不要指望命令行弹选单」,因为 agent 环境永远等不到 tty。

规则写进 conventions.md(跨 skill 共用),两个 SKILL.md 各留一行硬提示指过去——
只写在 conventions 里不够,模型未必每次都读到那一层。

实测覆盖:序号/简称/完整 url 三种参数形式、桶随之切换、三类错误输入、--api 一次性
覆盖不写回、pty 模拟下的选号/回车/无效输入、切换后两个桶的凭据互不影响。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
visuddhinanda 1 неделя назад
Родитель
Сommit
0e3ab3a8d2

+ 1 - 1
plugins/wikipali/.claude-plugin/plugin.json

@@ -1,7 +1,7 @@
 {
   "name": "wikipali",
   "description": "WikiPali 巴利三藏平台的客户端:检索与阅读语料做研究(词形展开、全文检索、出处分布、按坐标取原文与译本),以及以 AI 模型身份写入句子。",
-  "version": "0.8.2",
+  "version": "0.8.3",
   "author": {
     "name": "visuddhinanda",
     "url": "https://github.com/visuddhinanda"

+ 3 - 1
plugins/wikipali/lib/cli.py

@@ -32,7 +32,9 @@ def build_parser():
 
     # -- 站点与状态 --------------------------------------------------------
     p = add('endpoint', '查看 / 切换 API 地址', needs_json=False)
-    p.add_argument('target', nargs='?', help='序号、简称(www/www.cc/next/next.cc/local)或完整 url')
+    p.add_argument('target', nargs='?', help='序号、简称(www/www.cc/next/next.cc/staging/local)或完整 url')
+    p.add_argument('-l', '--list', action='store_true',
+                   help='只列出不提示选择(在终端里跑而又不想被追问时用)')
     p.set_defaults(func=cmd_site.cmd_endpoint)
 
     p = add('whoami', '显示当前凭据状态', needs_json=False)

+ 17 - 2
plugins/wikipali/lib/cmd_site.py

@@ -23,8 +23,23 @@ def cmd_endpoint(args):
         if current_url not in [s["url"] for s in SITES]:
             print(f"  *) {current_url:<32} 自定义地址  ← 当前")
         keys = "|".join(x["key"] for x in SITES)
-        print(f"\n切换:wikipali endpoint <序号|{keys}|完整url>")
-        return 0
+
+        # 只有在真正的终端里才提示选择。agent 的 Bash 调用、CI、管道都没有 tty,
+        # 那里必须保持纯展示——否则会卡在等输入上,且没人看得到提示符。
+        if args.list or not sys.stdin.isatty():
+            print(f"\n切换:wikipali endpoint <序号|{keys}|完整url>")
+            return 0
+
+        print(f"\n输入序号切换,直接回车不改(也可以 wikipali endpoint <{keys}|完整url>)")
+        try:
+            raw = input("选择:").strip()
+        except (EOFError, KeyboardInterrupt):
+            print()
+            return 0
+        if not raw:
+            print("未改动。")
+            return 0
+        args.target = raw
 
     url = normalize_api_url(expand_site_alias(args.target))
     name = bucket_name_for(url)

+ 14 - 0
plugins/wikipali/references/conventions.md

@@ -84,6 +84,20 @@ AI-汉译-Nissaya(**AI 生成**,deepseek-v3)(216:35)         ← 机器译
 
 `wikipali endpoint` 查看与切换,`--api` 只影响单次调用。
 
+### 用户要切换站点时,把选择权交回去
+
+用户说「切换服务器 / 换个站点」而**没指定目标**时:**把站点列表作为选择题呈现给他**,
+等他选定再执行。
+
+- **不要替他挑一个**——切换会写回凭据文件、改变之后所有操作的落点,那是他的决定;
+- **不要指望命令行弹出选单**——`wikipali endpoint` 的交互选择只在真实终端里出现,
+  agent 的 Bash 调用没有 tty,永远等不到;
+- 选项里要标明**哪些共享数据库、哪些是独立库**(见上),因为切到独立库意味着凭据、
+  缓存、乃至查到的坐标都换了一套。
+
+用户明确说了目标(`next`、`staging`、序号、完整 url)时直接执行,不必多问。
+
+
 ## 凭据
 
 `~/.wikipali/credentials.json`(0600)。**任何 skill 都不得打印 token 全文,也不得

+ 3 - 0
plugins/wikipali/skills/research/SKILL.md

@@ -203,6 +203,9 @@ wikipali get 216:512 --channel <uid>    # 取指定译本
 
 ⚠ `versions` 依赖的端点在稳定版站点上有缺陷,会提示你切到 `next`(`wikipali endpoint next`)。
 
+⚠ 用户要切换站点却**没指定目标**时,把站点列表**作为选择题呈现给他**再执行——不要替他挑,
+也不要指望命令行弹选单(agent 没有 tty,永远等不到)。见 `references/conventions.md`。
+
 ⚠ 输出里标 **⚠疑似机器译** 的按机器译文标注引用;但**没标的不等于人译**——很多 channel
 直接用模型名命名(`deepseek`、`qwen-max`、`grok-简体中文`),判定要看 `get` 返回的作者,
 见 `references/conventions.md`。

+ 3 - 0
plugins/wikipali/skills/write/SKILL.md

@@ -93,6 +93,9 @@ wikipali write sentences.json --channel <uid或名字片段>            # 再真
 ```bash
 wikipali endpoint            # 列出并标出当前
 wikipali endpoint next       # 改默认(唯一会写回凭据的方式)
+
+⚠ 用户要切换站点却**没指定目标**时,把站点列表**作为选择题呈现给他**再执行——不要
+替他挑,也不要指望命令行弹选单(agent 没有 tty,永远等不到)。见 conventions.md。
 wikipali --api next write …  # 只影响这一次调用
 ```