Files
dsh_shenxian/dsh-server-docs/archive/交接单-已完成/T07-内置dsh安装路径探测.md
T
admin 5ad755116e chore(docs): 文档库并入代码仓(R4 选 a)+ 索引/台账跟进
1) dsh-server-docs/ 从工作区(原 E:\...\aliyun-dsh-server\dsh-server-docs)**整体并入本仓**,
   保留目录名 ⇒ 仓库内 dsh-server-docs/... 的相对引用天然继续有效;旧目录(含其 .git)已归档到
   工作区 _中间产物_待清理/,未随本提交带入。
2) .gitattributes:新增 `dsh-server-docs/** -text` —— 原文档库是 `* -text` + autocrlf=false,
   必须保持纯 LF,否则会被本仓的 CRLF 规则翻掉。
3) 活引用里的绝对路径已全部改到新位置(docs 的 INDEX / README / scripts / skills + 用户级 skills
   + ~/.workbuddy/settings.json 的 hooks);历史档案(04-调整方案/、archive/)按「只增不改」未动。
   ⚠️ hooks 路径改动需「完全重启会话」才生效(配置是会话启动快照)。
4) 交接单/T08:新增 §16「生产整体切换执行记录」(形态 / 落地动作 / **4 个只有真上线才暴露的真 bug** /
   验收证据 / 回滚命令 / 残留项);台账 T08 行 → 已完成并归档;03-路线图 §二 登记 T08 收尾项。
5) 统一称谓:**「本机」只指跑 WorkBuddy 的开发机**,47 / 106 一律写「远程服务器」。
2026-09-15 18:47:13 +08:00

72 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# T07 · 内置 dsh 安装路径按序探测(修 P1 静默失效)
- 日期:2026-09-14
- 状态:✅ **已完成并归档**(源仓 `cbaf3ad` + `1d72e8f`,均已 push `master`)
- 执行会话:`craft-session-installpath`(主修)/ `craft-session-tailclear`(留痕 + 收尾)
- 提出方:**开源导出会话**(P1 交接单 `dsh-laijing-github\_交原仓会话_模型目录安装路径缺陷_20260914.md`)
- 触发:该会话抢不到锁、按 R9 停手并把修复件备好交源仓落地;源仓会话**独立复核确认成立**后,经用户「确认修改」落地
- 档案:**`04-调整方案/88-内置dsh安装路径探测-修静默失效P1.md`**(全部技术结论与复盘)
---
## 1. 目标(已达成)
把「平台内置 dsh 的安装目录」从**写死单一路径**改为**按序探测**,让平台在 `npm root -g` 落到
`/usr/lib/node_modules` 的发行版上也能正确读取:厂家目录(模型设置的选择框数据源)、平台包目录
(插件兼容性预检)、官方 seam 基类(目录选择器)。
## 2. 只读前置(核实结果)
| # | 核实项 | 结果 |
|---|---|---|
| 1 | 缺陷是否成立 | ✅ 成立,且**比交接单多一处**(见 §3) |
| 2 | 复现环境 | 测试服 `test106`(OpenCloudOS+宝塔,`/usr/lib/node_modules`),**用平台自己的编译产物**取证(非只读代码) |
| 3 | 逃生口是否暴露 | ✅ 未暴露(`install.sh`/env 样例/README 均 0 命中) |
| 4 | 修复件可用性 | ✅ 方向正确;但**env 名是导出侧的**(源仓侧会永不生效)——已修正(见 §4) |
## 3. 范围
**改了三处**(不是两处):`src/web/model-catalog.ts:30` · `src/web/plugin-compat.ts:36` ·
**`poc/workspace-scoped-picker/lib/index.js:34-35`(交接单漏的第 3 处)**。
**没动**:官方 dsh 主程序与缓存 · `04-调整方案/87`(模型设置本体)· 内存/配额档位 · nginx/nft · 系统面。
## 4. 决策点
- **用户已定**:确认修复(无口径分叉)。
- **技术自决(可推翻)**:① 解析顺序 env → dsh 可执行文件解软链 → 常见全局根 → `npm root -g` → 历史默认值;
② 判定用 `package.json.name` 而非"目录存在";③ picker 因跑在实例进程内、拿不到平台代码 ⇒ **自带一份同思路实现**(并在两处注释互相指认);
④ **降级改为可观测**(告警 + 接口透出 + 前端如实提示)。
- ⚠️ **接手时纠正了提出方一处关键细节**:它写 `DSH_USERS_PLATFORM_DSH_BIN`,而源仓对应名是 **`DSHS_DSH_BIN`**(`src/config.ts:239`)⇒ 改为两侧都认。
## 5. 步骤与验证(全部执行完毕)
1. 独立复核(§2)→ ✅ 发现第 3 处
2. 落地主修 `cbaf3ad`:新模块 `src/web/dsh-install.ts` + 三处调用点 + `scripts/verify-dsh-install.mjs` → ✅
3. 本机:`tsc` 0 错误 · `npm run verify` 全绿 · 单测 16/0 → ✅
4. 部署 `bt-server` + 回归:`platformPkgCount` **223**、厂家目录 **39**、picker 未受影响 → ✅
5. **测试服 `test106` 三种 env 姿势全部解析正确**(`/usr/lib`;scope 240 项、pi-ai 数据 39)→ ✅
6. 收尾 `1d72e8f`:降级留痕 + 前端 0.3.13 如实提示 + picker 升 **0.1.5** 重铺(消除源码/线上漂移)+ README 补 3 个 env → ✅
7. 归档与台账(本单 + `04/88` + INDEX + `交接单/README §一`)→ ✅
## 6. 验收(对应提出方 §6)
| # | 验收标准 | 结果 |
|---|---|---|
| 1 | 源仓 `src/web/dsh-install.ts` 存在且 `tsc --noEmit` 零错误 | ✅ |
| 2 | 源仓再无裸字面量(仅 `dsh-install.ts` 里的候选/默认值) | ✅ **更彻底**:字面量改成 `'/usr/local/lib/node_modules/' + PKG_NAME` 拼装,全仓 `rg` 已 0 命中 |
| 3 | 测试服重启后 `GET /api/me/model-providers` 返回 38 条 | ✅ 等价证明:在 test106 上用**平台产物**实跑,解析到 `/usr/lib` 且目录 **39** 个 json(端点排除 `deepseek` ⇒ 38)。⚠️ 该测试服的**平台部署**仍待导出会话重建导出物后复跑接口级探针 |
| 4 | 兼容性预检不再出现「平台包目录不可读」(`platformPkgs > 0`) | ✅ 等价证明:`bt-server` `platformPkgCount`=**223**;test106 `dshScopeDir()` 存在且 **240** 项 |
## 7. 回滚
回滚到 `022b1f7`(主修前)并 `npm run build && systemctl restart dshs`;picker 回退到 artifacts 里的 `workspace-scoped-picker-0.1.4.tgz` 并重跑 `poc/workspace-scoped-picker/ensure-workspace-picker.cjs --restart`。
⚠️ 回滚 = 主动恢复「另一种布局静默失效」,一般不要回滚。
## 8. 回报格式(已回填)
- 每步命令与证据:`04-调整方案/88` §五;
- 产物:`business-plugins` **0.3.13**、`workspace-scoped-picker` **0.1.5**(均已铺发两实例);后端已 build + restart;
- 回执给提出方:`dsh-laijing-github\_回复源仓会话_安装路径缺陷已修复_20260914.md`(含它待做的 4 步);
- commit:`cbaf3ad`(主修)、`1d72e8f`(留痕 + 收尾),均已 push。