@genduo/desk 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cli.py +3 -3
- package/jdy_secrets.py +52 -21
- package/keychain_util.py +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -113,7 +113,7 @@ genduo-desk install-service --skip-caffeinate
|
|
|
113
113
|
|
|
114
114
|
| service | account | 覆盖 |
|
|
115
115
|
|---|---|---|
|
|
116
|
-
| `JDY_MCP` | `服务器URL
|
|
116
|
+
| `JDY_MCP` | `本机JDY服务器URL`(兼容 `服务器URL`) | 环境变量 `JDY_MCP_URL` 优先 |
|
|
117
117
|
|
|
118
118
|
JDY API Key:经 MCP `member_data_list` 查密码表,Title 精确匹配 **`api key 精细化运营`**(同销量系统 `config.JDY_API_KEY_TITLE`)。不硬编码、不打印。
|
|
119
119
|
|
package/cli.py
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
主 UX(门店):
|
|
6
6
|
genduo-desk login --shop 5RT2
|
|
7
|
-
本机 Keychain 只需已有 JDY_MCP / 服务器URL;
|
|
7
|
+
本机 Keychain 只需已有 JDY_MCP / 本机JDY服务器URL;
|
|
8
8
|
Agent token 与 R-Login 两组从简道云密码表经 MCP 读取,
|
|
9
9
|
可选验证 RMS 登录、注册心跳、安装 LaunchAgent + caffeinate 防休眠。
|
|
10
10
|
|
|
@@ -250,7 +250,7 @@ def cmd_admin_checklist(a: argparse.Namespace) -> None:
|
|
|
250
250
|
======== 超管 · {shop} 开店清单 ========
|
|
251
251
|
|
|
252
252
|
凭据逻辑与「销量计算系统」一致:
|
|
253
|
-
· 店机 Keychain:仅 JDY_MCP / 服务器URL(开发机可无)
|
|
253
|
+
· 店机 Keychain:仅 JDY_MCP / 本机JDY服务器URL(开发机可无)
|
|
254
254
|
· 或环境变量 JDY_MCP_URL
|
|
255
255
|
· JDY API Key:MCP 密码表 Title={kc.JDY_API_KEY_TITLE}
|
|
256
256
|
· 不再使用 dataanalyst-agent-token / dataanalyst/rms/* Keychain
|
|
@@ -266,7 +266,7 @@ def cmd_admin_checklist(a: argparse.Namespace) -> None:
|
|
|
266
266
|
· login --verify-rms 时可交互写入「本进程环境」(不写 Keychain)
|
|
267
267
|
|
|
268
268
|
C. 店机 Keychain(用户维护;与销量系统相同)
|
|
269
|
-
· service=JDY_MCP account
|
|
269
|
+
· service=JDY_MCP account=本机JDY服务器URL
|
|
270
270
|
· 本开发机没有该条目是正常的
|
|
271
271
|
|
|
272
272
|
D. 门店执行
|
package/jdy_secrets.py
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
本机钥匙串只存一件(店机由用户维护;本开发机可以没有):
|
|
6
6
|
service = JDY_MCP
|
|
7
|
-
account = 服务器URL
|
|
7
|
+
account = 本机JDY服务器URL(兼容旧账户名 服务器URL)
|
|
8
8
|
|
|
9
9
|
环境变量优先:JDY_MCP_URL
|
|
10
10
|
|
|
@@ -37,7 +37,9 @@ JDY_PWD_F_TITLE = "_widget_1729661480436" # Title (text)
|
|
|
37
37
|
JDY_PWD_F_PASSWORD = "_widget_1729661480439" # Password (text)
|
|
38
38
|
JDY_API_KEY_TITLE = "api key 精细化运营"
|
|
39
39
|
JDY_MCP_KEYRING_SERVICE = "JDY_MCP"
|
|
40
|
-
JDY_MCP_KEYRING_ACCOUNT = "服务器URL"
|
|
40
|
+
JDY_MCP_KEYRING_ACCOUNT = "本机JDY服务器URL"
|
|
41
|
+
# 兼容旧条目(早期文档写过 account=服务器URL)
|
|
42
|
+
JDY_MCP_KEYRING_ACCOUNT_ALIASES = ("本机JDY服务器URL", "服务器URL")
|
|
41
43
|
|
|
42
44
|
# 别名(旧调用方)
|
|
43
45
|
JDY_MCP_SERVICE = JDY_MCP_KEYRING_SERVICE
|
|
@@ -47,33 +49,62 @@ _API_KEY: Optional[str] = None
|
|
|
47
49
|
|
|
48
50
|
|
|
49
51
|
def _get_mcp_url() -> str:
|
|
50
|
-
"""MCP URL 优先级:环境变量 >
|
|
52
|
+
"""MCP URL 优先级:环境变量 > 钥匙串(账户优先本机JDY服务器URL,兼容服务器URL)"""
|
|
51
53
|
env = os.environ.get("JDY_MCP_URL")
|
|
52
54
|
if env:
|
|
53
55
|
return env
|
|
54
56
|
try:
|
|
55
57
|
import keyring
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
except Exception:
|
|
61
|
-
pass
|
|
62
|
-
# keyring 未装或读失败时:同条目的 security CLI(仍是 JDY_MCP/服务器URL)
|
|
63
|
-
try:
|
|
64
|
-
r = subprocess.run(
|
|
65
|
-
["security", "find-generic-password",
|
|
66
|
-
"-s", JDY_MCP_KEYRING_SERVICE,
|
|
67
|
-
"-a", JDY_MCP_KEYRING_ACCOUNT, "-w"],
|
|
68
|
-
capture_output=True, text=True,
|
|
69
|
-
)
|
|
70
|
-
if r.returncode == 0 and (r.stdout or "").strip():
|
|
71
|
-
return (r.stdout or "").rstrip("\n")
|
|
58
|
+
for acct in JDY_MCP_KEYRING_ACCOUNT_ALIASES:
|
|
59
|
+
v = keyring.get_password(JDY_MCP_KEYRING_SERVICE, acct)
|
|
60
|
+
if v:
|
|
61
|
+
return v
|
|
72
62
|
except Exception:
|
|
73
63
|
pass
|
|
64
|
+
# keyring 未装或读失败时:同条目的 security CLI(通用密码)
|
|
65
|
+
for acct in JDY_MCP_KEYRING_ACCOUNT_ALIASES:
|
|
66
|
+
try:
|
|
67
|
+
r = subprocess.run(
|
|
68
|
+
["security", "find-generic-password",
|
|
69
|
+
"-s", JDY_MCP_KEYRING_SERVICE,
|
|
70
|
+
"-a", acct, "-w"],
|
|
71
|
+
capture_output=True, text=True,
|
|
72
|
+
)
|
|
73
|
+
if r.returncode == 0 and (r.stdout or "").strip():
|
|
74
|
+
return (r.stdout or "").rstrip("\n")
|
|
75
|
+
except Exception:
|
|
76
|
+
pass
|
|
77
|
+
# 「密码」App 网站密码(用户常写成 本机 JDY 服务器 URL + jiandaoyun.com)
|
|
78
|
+
for acct in (
|
|
79
|
+
"本机JDY服务器URL",
|
|
80
|
+
"本机 JDY 服务器 URL",
|
|
81
|
+
"服务器URL",
|
|
82
|
+
):
|
|
83
|
+
for server in ("jiandaoyun.com", "www.jiandaoyun.com"):
|
|
84
|
+
try:
|
|
85
|
+
r = subprocess.run(
|
|
86
|
+
["security", "find-internet-password",
|
|
87
|
+
"-s", server, "-a", acct, "-w"],
|
|
88
|
+
capture_output=True, text=True,
|
|
89
|
+
)
|
|
90
|
+
if r.returncode == 0 and (r.stdout or "").strip():
|
|
91
|
+
return (r.stdout or "").rstrip("\n")
|
|
92
|
+
except Exception:
|
|
93
|
+
pass
|
|
94
|
+
# 仅按账户名扫(不限网站)
|
|
95
|
+
try:
|
|
96
|
+
r = subprocess.run(
|
|
97
|
+
["security", "find-internet-password", "-a", acct, "-w"],
|
|
98
|
+
capture_output=True, text=True,
|
|
99
|
+
)
|
|
100
|
+
if r.returncode == 0 and (r.stdout or "").strip():
|
|
101
|
+
return (r.stdout or "").rstrip("\n")
|
|
102
|
+
except Exception:
|
|
103
|
+
pass
|
|
74
104
|
raise RuntimeError(
|
|
75
|
-
"未找到 JDY MCP URL:请设置环境变量 JDY_MCP_URL
|
|
76
|
-
"
|
|
105
|
+
"未找到 JDY MCP URL:请设置环境变量 JDY_MCP_URL,"
|
|
106
|
+
"或通用密码 JDY_MCP/本机JDY服务器URL,"
|
|
107
|
+
"或「密码」App 网站条目(账户 本机 JDY 服务器 URL)"
|
|
77
108
|
)
|
|
78
109
|
|
|
79
110
|
|
package/keychain_util.py
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"""凭据入口(兼容旧 import 名 keychain_util)。
|
|
4
4
|
|
|
5
5
|
与「销量计算系统」一致:
|
|
6
|
-
· 本机 Keychain 只用于 JDY_MCP / 服务器URL(店机维护;本开发机可无)
|
|
6
|
+
· 本机 Keychain 只用于 JDY_MCP / 本机JDY服务器URL(店机维护;本开发机可无)
|
|
7
7
|
· JDY API Key 经 MCP 密码表读取(Title = api key 精细化运营)
|
|
8
8
|
|
|
9
9
|
已废弃(不再读写):
|
|
@@ -90,7 +90,7 @@ def has_generic(service: str, account: Optional[str] = None) -> bool:
|
|
|
90
90
|
def set_generic(*_a, **_k) -> None:
|
|
91
91
|
raise RuntimeError(
|
|
92
92
|
"已废弃:不再写入 dataanalyst/* Keychain。"
|
|
93
|
-
"与销量计算系统一致,本机只维护 JDY_MCP / 服务器URL。"
|
|
93
|
+
"与销量计算系统一致,本机只维护 JDY_MCP / 本机JDY服务器URL。"
|
|
94
94
|
)
|
|
95
95
|
|
|
96
96
|
|