Ver Fonte

fix(plugin): 0.7.1 —— 本地缓存按站点分桶,否则会静默串库

0.7.0 的 books 与 terms 把整表缓存在 ~/.wikipali/cache/ 下,**没有按站点区分**。
后果是:用过一次 --api local 拉取,之后查线上会静默复用开发机的缓存——而开发机
是另一个数据库。发版后立刻在验证中撞到:books --tags ṭīkā 打线上竟然成功了
(线上根本没部署 book-title 的扩展),删掉缓存才暴露出来。

看起来一切正常、数据却是错的,正是本项目最该防的那类错误。凭据早就按桶存
(online / local / site:xxx),缓存漏了这一层。

改为 ~/.wikipali/cache/<桶>/<文件>,并把这条写进 conventions.md 的凭据一节。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
visuddhinanda há 1 semana atrás
pai
commit
dc3f1db729

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

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

+ 12 - 10
plugins/wikipali/lib/cmd_read.py

@@ -583,16 +583,24 @@ def cmd_count(args):
 # ---------------------------------------------------------------------------
 # ---------------------------------------------------------------------------
 
 
 
 
-def terms_cache_path(lang, view):
+def cache_path(client, name):
+    """缓存文件按**站点分桶**存放。
+
+    线上四站共享同一个库,可以共用;但开发机(local)与任何自定义地址是**另一个
+    数据库**。不分桶的话,用过一次 --api local 之后,之后打线上会静默拿到开发机的
+    数据——看起来一切正常,数据却是错的。凭据早就是按桶存的,缓存同理。
+    """
     import os
     import os
+    import re as _re
     from creds import CREDS_DIR
     from creds import CREDS_DIR
-    return os.path.join(CREDS_DIR, 'cache', f'terms-{view}-{lang}.json')
+    bucket = _re.sub(r'[^A-Za-z0-9_.-]', '_', client.bucket_name)
+    return os.path.join(CREDS_DIR, 'cache', bucket, name)
 
 
 
 
 def cmd_terms(args):
 def cmd_terms(args):
     import os
     import os
     client = make_client(args)
     client = make_client(args)
-    path = terms_cache_path(args.lang, args.view)
+    path = cache_path(client, f'terms-{args.view}-{args.lang}.json')
     rows = None
     rows = None
     if os.path.exists(path) and not args.refresh:
     if os.path.exists(path) and not args.refresh:
         try:
         try:
@@ -798,17 +806,11 @@ def cmd_anthology(args):
 # ---------------------------------------------------------------------------
 # ---------------------------------------------------------------------------
 
 
 
 
-def books_cache_path():
-    import os
-    from creds import CREDS_DIR
-    return os.path.join(CREDS_DIR, 'cache', 'book-titles.json')
-
-
 def fetch_books(client, refresh=False):
 def fetch_books(client, refresh=False):
     """书目清单整表拉一次缓存在本地。服务端也缓存 24 小时,这里再缓存一层是为了
     """书目清单整表拉一次缓存在本地。服务端也缓存 24 小时,这里再缓存一层是为了
     让按 tag 筛选变成本地操作——281 条全量在手,筛什么都不用再请求。"""
     让按 tag 筛选变成本地操作——281 条全量在手,筛什么都不用再请求。"""
     import os
     import os
-    path = books_cache_path()
+    path = cache_path(client, 'book-titles.json')
     if os.path.exists(path) and not refresh:
     if os.path.exists(path) and not refresh:
         try:
         try:
             with open(path, encoding='utf-8') as fh:
             with open(path, encoding='utf-8') as fh:

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

@@ -94,3 +94,8 @@ AI-汉译-Nissaya(**AI 生成**,deepseek-v3)(216:35)         ← 机器译
 内置终端按 <kbd>Ctrl</kbd>+<kbd>`</kbd> 打开(仅本地会话)。
 内置终端按 <kbd>Ctrl</kbd>+<kbd>`</kbd> 打开(仅本地会话)。
 
 
 登录是**一次性**的:用户 token 有效期 365 天,同一台机器上所有副本共用这一份凭据。
 登录是**一次性**的:用户 token 有效期 365 天,同一台机器上所有副本共用这一份凭据。
+
+**本地缓存(术语表、书目清单)与凭据一样按站点分桶存放**(`~/.wikipali/cache/<桶>/`)。
+线上四站共享同一个库可以共用;开发机(`local`)与任何自定义地址是**另一个数据库**,
+不分桶的话,用过一次 `--api local` 之后打线上会静默拿到开发机的数据——看起来一切
+正常,数据却是错的。