WorkBuddy 个人版 / 企业版 本机切换
同一台电脑、同一个 Windows 用户,两个 WorkBuddy 账号各自保持登录,双击图标即切换。
一条铁律:绝不能"换登录态文件"
客户端的登录态在 %LOCALAPPDATA%\CodeBuddyExtension\Data\Public\auth\workbuddy-desktop.info。
替换这个文件来切账号会失败,而且失败得很隐蔽:客户端确实以新身份起来了,但几秒后所有 API 401、被踢下线。
原因是 clean()(退出登录)会撤销服务端会话,目录里那些 workbuddy-desktop.<时间>.<pid>.<uuid>.info
全是"登出后"的遗物,token 已死。而且为了登企业版你得先退出个人版,那一步又把个人版 token 撤了。
正确做法:换目录,不换文件。 把 auth 目录做成 Junction,指向 auth-store\<账号>\。
两个账号各自持有自己的登录态,谁也不登出谁。
细节、实测日志证据、以及踩过的坑:见 references/mechanism.md。
首次安装前必须读一遍,里面有 5 条会让你白忙一场的陷阱。
适用范围
- 仅 Windows,仅同一台机器同一个 Windows 用户。不能跨机同步——加密密钥绑本机(编译在 exe 里)。
- 只隔离登录态。技能、插件、会话历史、记忆仍然共用
~\.workbuddy,换版本不用重装任何东西。 - 基于 v5.9.x 客户端实测。大版本升级后先跑一次
status确认 auth 目录还是 Junction。
安装(4 步,顺序不能反)
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\install.ps1 -Wire -Autostart
install.ps1 只铺文件、建桌面图标、设开机常驻,不碰登录态。默认部署到
%USERPROFILE%\WorkBuddy\account-switch,可用 -Target 改。
之后三步必须由用户亲手做,你只负责讲清楚:
- 让用户彻底退出 WorkBuddy(托盘右键 → 退出;是"退出",不是"退出登录"),
然后双击<目标>\1-初始化.cmd。它会把现有登录态复制进auth-store\personal、
校验份数与字节数,再把 auth 目录换成 Junction。中途失败会自动恢复。 - 双击桌面「WorkBuddy 企业版」,这一次会正常弹登录页,让用户扫码登录一次。
⚠️ 必须提前说清:扫码之后有一步「选择进入哪个身份」,要选企业版,不能顺手选默认的个人版。
选错了会把个人版登录态塞进企业版存档(存档串味),比要登录更糟。 - 双击桌面「WorkBuddy 个人版」验证——应该直接进去,不再要求登录。
- 之后两边都随时双击切换,都是"打开即登录"。
验证是否真的成功,看这一步的输出:
powershell -NoProfile -ExecutionPolicy Bypass -File <目标>\wb-account.ps1 status
期望看到两个账号都列出 type= 和 token至 <日期>,且企业版是 type=ultimate、带 enterpriseId。
日常操作
| 想做的事 | 怎么做 |
|---|---|
| 切版本 | 双击桌面「WorkBuddy 个人版」/「WorkBuddy 企业版」 |
| 看当前在哪个版本、两档是否都有登录态 | wb-account.ps1 status,或双击 2-查看状态.cmd |
| 托盘(可选) | 双击 tray-start.vbs;切版本时会自动补起 |
| 取消开机常驻 | wb-account.ps1 autostart off |
| 重建桌面图标 | wb-account.ps1 wire |
切换动作序列:关客户端 → 换 Junction → 清登出标记 → 拉起客户端,正常 5~15 秒。
关客户端是"先礼后兵":先请求关窗 5 秒,被收进托盘就倒计时 3 秒后强杀。
退出码语义(写脚本/接托盘时用):
| 码 | 含义 |
|---|---|
| 0 | 成功 |
| 1 | 失败,没换版本(会按原版本把客户端重新打开) |
| 2 | 切过去了,但该版本需要登录一次(只有第一次) |
| 3 | 用户取消 |
排障:按症状查
"切过去了但要求重新登录"
先看 status 里那一档还有没有 token至。没有就是存档丢了;有就是身份不对(见下条)。
如果日志里出现 [切换失败],那是失败不是需要登录,去看 logs\switch.log 最后 40 行。
"点了企业版却进了个人版"
上次登录时在"选择进入哪个身份"页选错了。脚本会检测到并自动归位:把这份登录态送回
auth-store\personal、清空 auth-store\enterprise、原件备份到 _rescued\。让用户重登一次、这次选对即可。
"切完就 401 掉线"
说明有人用"替换 .info 文件"的思路做过。别修,直接 setup -Force 重新接管。
"auth 目录已经不是 Junction 了"
客户端升级/重装会把它重建为真实目录。直接切会把里面的登录态孤立掉,所以脚本会主动中止。
跑 wb-account.ps1 setup -Force 重新接管。
"WorkBuddy 升级之后,这套东西会不会失效"(高频问题,四层要分开说,详见 references/mechanism.md 的「升级影响面」)
- 不会失效:Junction 是操作系统功能,切换动作本身和客户端版本无关。
- 可能要重扫一次码:客户端若轮换了 AtRest 加密密钥,旧存档里的信封就解不开 ⇒ 表现为"要求重新登录"。
status 会给每个存档打一行 key=<指纹>;两个指纹不一致,说明其中一个是旧版本写的,切过去就需要重扫。
- 会被脚本挡住(可修):客户端把 auth 重建为真实目录时脚本中止并提示 setup -Force。
- 会真失效(要改代码):auth 路径、workbuddy-desktop.info 文件名、或 .info 里 account 字段形状被改。
升级后第一次运行 status(或第一次点桌面图标切换)会自动打印新旧版本号并列出待核对项,
快照存在 logs\client-version.json,同一次升级只提醒一次。托盘「自检」里也有一条 info 级提示。
双击图标闪一下就没了 / 什么都不弹
去看 logs\switch.log。.cmd 文件如果行尾变成 LF,cmd.exe 会把 setlocal、chcp 这类行拆错,
症状是一串 'cal' 不是内部或外部命令。wire 动作会自动修复行尾。
托盘图标找不到
Windows 11 默认把新图标收进任务栏的 ^ 折叠区,让用户拖出来固定。
判断托盘到底在不在,不要靠截屏(双屏 + 高 DPI 下 CopyFromScreen 抓的坐标是错的,
会得出"通知区域空的"这种假结论),用 UI 自动化读任务栏:
Add-Type -AssemblyName UIAutomationClient
Add-Type -AssemblyName UIAutomationTypes
$AE=[System.Windows.Automation.AutomationElement]; $S=[System.Windows.Automation.TreeScope]
$t=$AE::RootElement.FindFirst($S::Children,(New-Object System.Windows.Automation.PropertyCondition($AE::ClassNameProperty,'Shell_TrayWnd')))
$t.FindAll($S::Descendants,[System.Windows.Automation.Condition]::TrueCondition) | ForEach-Object { $_.Current.Name }
图标会以 WorkBuddy · 个人版 / WorkBuddy · 企业版 出现在列表里。
给用户讲清楚的三句话
- 换版本要用桌面图标切,千万不要在客户端里点「退出登录」——那会撤销服务端会话,等于把这个存档作废。
- 只有第一次给某个版本建档时要扫码,之后打开即登录。
- 两个版本不能同时开着(数据目录共用,会抢锁),所以切换要先关掉当前那个,这也是它要几秒的原因。
脚本清单
| 文件 | 作用 |
|---|---|
scripts/wb-account.ps1 |
主脚本:status / setup / use / go / wire / autostart / tray |
scripts/tray.ps1 |
常驻托盘。-SelfTest 无界面自检,退出码 0 好 / 1 有可修项 / 2 有致命项 |
scripts/install.ps1 |
部署脚本:铺脚本 + 生成启动器 + 还原图标 + 可选 wire/autostart |
scripts/icons-data.ps1 |
四个 .ico 的 base64。运行期由 install.ps1 还原成真图标 |
scripts/make-tray-icons.py |
重新生成托盘图标(需 Pillow,注意用带 Pillow 的解释器) |
scripts/make-skill-icon.py |
重新生成技能图标 _icon.png |
assets/icons/*.ico |
桌面图标(蓝/橙细边)与托盘图标(蓝 P / 橙 E)的原始文件 |
_icon.png |
技能图标(512×512,蓝橙分割 + 白色双向箭头) |
注意:.cmd / .vbs / .ico 不随包分发,全部由 install.ps1 在本地生成。
SkillHub 的上传通道只收文本类文件:.cmd、.vbs 会被服务端以「不允许的文件类型」直接拒绝,
.ico 这类二进制在解析阶段就被过滤掉。所以启动器用模板生成、图标用 base64 还原——
这两类文件不要再手工放进包里,否则发布会被打断。
主脚本的调试开关:-DryRun(只预览)、-AuthDir <路径>(拿别的目录演练,不碰真实登录态)、
-NoForce(绝不强杀进程)、-NoBox、-Yes、-NoTray。
在不确定的地方验证,一律先用 -AuthDir 指到临时目录,别拿用户的真实登录态试。