From 0cdbf52c4ad2bdf607edd5dcab98e0ce2641e99a Mon Sep 17 00:00:00 2001 From: maogeigei Date: Sat, 19 Sep 2026 15:42:56 +0800 Subject: [PATCH] =?UTF-8?q?chore(=E5=BC=80=E6=BA=90=E8=84=B1=E6=95=8F):=20?= =?UTF-8?q?find-ui=20=E6=89=AB=E6=8F=8F=E5=99=A8=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E7=A1=AC=E7=BC=96=E7=A0=81=E6=9C=8D=E5=8A=A1=E5=99=A8=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=20+=20=E7=99=BB=E8=AE=B0=E6=A1=A3=E6=A1=88=20140?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/find-ui-scan.py:PROFILE_GLOB 改由 DSHS_USERS_DIR 注入,缺失即显式失败(不再写死 /var/lib/dshs)⇒ 补上上一轮涉密外置扫描的唯一漏项(大小写不敏感扫描 1 → 0) - scripts/find-ui.mjs:用 config/index.cjs#usersDir() 取值并随 ssh 命令注入远端; 解析不出 POSIX 绝对路径即报错退出(⛔ 不静默回落,避免假阴性) - dsh-server-docs/INDEX.md:登记 04-140(涉密内容外置到配置目录) 验证:py 语法 OK / node --check OK / 缺 env 显式 exit=2 / 实跑命中 8-8 个 UI 分区(与原行为一致) --- dsh-server-docs/INDEX.md | 1 + scripts/find-ui-scan.py | 10 +++++++++- scripts/find-ui.mjs | 14 +++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/dsh-server-docs/INDEX.md b/dsh-server-docs/INDEX.md index 89e1549..22eee35 100644 --- a/dsh-server-docs/INDEX.md +++ b/dsh-server-docs/INDEX.md @@ -184,6 +184,7 @@ | 04-137 | ✅ | **品牌标识改造 —— 去 DeepSeek 图形 → 平台自有标识**(2026-09-19 上线):**四页 + favicon 一并替换** —— `login` / `register` / `admin` 页头删 **DeepSeek 鲸鱼图标 +「DeepSeek」文字图形** 改平台标识(中文「**能力枢纽**」/英语及其他语言「**CapabilityNet**」,走 i18n 词条 `brand.name`,`en` 一条即覆盖其他语言回退);`portal` 顶栏换图标(页面名「管理门户」保留);**新建 `web/favicon.svg`**(平台自有 hub 图标,避开 DeepSeek 蓝);🔴 **会话页面左上角那处不动**(用户明示「先不替换」+它属官方 dsh client bundle,受 R2 约束);🔴 踩坑:**SVG 的 XML 注释不得含 ASCII 双连字符 `--`**(写 CSS 变量名即踩)⇒ 整份 SVG 解析失败、图标**静默不显示**,已加进 `verify-static.mjs` 并做反向自证;新增 `test/i18n-brand.test.mjs`|档案 `04-调整方案/137-品牌标识改造-去DeepSeek图形.md` | | 04-138 | ✅ | **平台共享模型 —— 管理员逐用户授权(默认关闭)**(2026-09-19 上线):新增列 `users.shared_model_granted`(v11,**默认 0**),**生效 = `granted ∧ enabled`** —— 前者 admin 在**用户列表**里逐个开(新增「共享模型」列),后者仍是用户自己的偏好(保留);未授权时设置页**连"平台共享模型"那一块都不渲染**(插件 0.3.24);🔴 **顺带修掉一个既有真缺陷**:落地层原先用**本机 fs** 写用户 home,而用户卷在 worker 上 ⇒ **模型落地对"实例不在本机"的用户一直是静默空操作**(托管清单被清空、目标文件一字节没动;档案 87 的模型设置页对 guest 这类用户从未生效)⇒ 改为走 `UserFs` + worker agent 新增**白名单**端点 `/fs/home-read|write`;两腿实测(未授权撤销 / 授权恢复)|档案 `04-调整方案/138-平台共享模型-管理员逐用户授权.md` | | 04-139 | ✅ | **品牌中文名:能力枢纽 → 能力网络**(2026-09-19 上线):其他语言仍 `CapabilityNet`(en 词条即回退);落点四处 = i18n 中文词条 / `admin.html` 顶栏 / **`favicon.svg` 的 ``+`aria-label`**(最易漏)/ `design.css` 注释;品牌回归测试期望值同步,`verify-static` + SVG 真解析全绿;🔴 行尾按**目标目录既有风格**逐文件对齐(服务器 `admin.html`=CRLF 而本机=LF,直传会翻掉整个文件)|档案 `04-调整方案/139-品牌中文名改为能力网络.md` | +| 04-140 | ✅ | **涉密内容外置到配置目录**(2026-09-19 落地):把散落在代码里的**真实部署值**(域名 / IP / 主机号 / 内网路径 / Worker 令牌 / PG 口令)统一收进 `config/`,代码改为**引用配置**—— TS 走 `src/platform-paths.ts`、shell 走 `config/load.sh`、node 走 `config/index.cjs`;🔴 **真实值只放 `config/platform.env`**(`.gitignore` 排除、服务器侧 **600**),仓库内只留 `platform.env.example`;🔴 优先级 = **系统 env > `config/platform.env` > 代码内中性默认值**(代码默认一律中性 ⇒ ⛔ 别把生产值写回默认);🔴 `platform-dirs.conf` **必须保留 `DSH_PLATFORM_DIR=/opt/dsh`**(删掉它 `platformDir` 退化成 `<dataRoot>/platform` ⇒ state/backups/artifacts **静默搬家**);🔴 `DEFAULT_OVERLAY_SEED` / `DEFAULT_OVERLAY_BOOTSTRAP_SEEDS` **刻意留空**(种子只由 env 给,已固化为回归断言);`src/platform-paths.ts` **必须零副作用**(不 mkdir / 不写文件);注释里的真标识无法引用配置 ⇒ **一律中性化**(`<server-public-ip>` / `<base-domain>` / `<host-a>`);`web/wake.html` 注册域白名单改为**运行时从 `location.hostname` 推导**(换域名零改动);改造后**完整检查两遍**(第 2 遍抓到第 1 遍的漏项);零回归 = `tsc` 0 错 · `npm test` **373/375**(唯一失败 `lease` 属既有)· `/opt/dsh/{state,backups}` 未搬家 · `/var/lib/dshs/platform` 未误建;**下线核实轮**(09-19 15:3x)复扫补修 `scripts/find-ui-scan.py` 里残留的 `/var/lib/dshs` 字面量(改为由 `find-ui.mjs` 注入 `DSHS_USERS_DIR`,缺失即显式失败、⛔ 不静默回落)|档案 `04-调整方案/140-涉密内容外置到配置目录.md` | | — | 🗄 | `archive/dsh-improvement-plan-20260909-full.md`:拆分前 19 章 | | — | ✅ | `skills/dsh-change-workflow/SKILL.md`:六阶段 + **红线 R1-R11**(工作副本在本机 `.workbuddy/skills/`)| | — | ✅ | `skills/dsh-decision-method/SKILL.md`:**改造决策方法论**(用户有效决策 U1-U12 / AI 有效决策 A1-A13 / 反例 X1-X8 + 确认最优解十问 + 交互 UI 专项清单)(工作副本在本机 `.workbuddy/skills/`)| diff --git a/scripts/find-ui-scan.py b/scripts/find-ui-scan.py index 6f48516..53419b5 100644 --- a/scripts/find-ui-scan.py +++ b/scripts/find-ui-scan.py @@ -13,10 +13,18 @@ scan 顺序:**自研(@dsh-local)在前**,官方在后 —— 排查时 """ import glob import json +import os import re import sys -PROFILE_GLOB = '/var/lib/dshs/users/*/home/profiles/web/node_modules/@dsh-local/*/lib/client.js' +# 用户根目录由调用方(`scripts/find-ui.mjs`)通过 `DSHS_USERS_DIR` 传入 —— 它从 `config/` 读, +# 不在这里写死服务器布局。⛔ 缺失时**显式失败**,绝不回落到某个猜测值(静默 0 命中 = 假阴性)。 +USERS_DIR = os.environ.get('DSHS_USERS_DIR', '').rstrip('/') +if not USERS_DIR: + sys.stderr.write('!! 未收到 DSHS_USERS_DIR(用户数据根)—— 由 scripts/find-ui.mjs 注入,勿手动直连\n') + sys.exit(2) + +PROFILE_GLOB = USERS_DIR + '/*/home/profiles/web/node_modules/@dsh-local/*/lib/client.js' OFFICIAL_GLOB = '/usr/local/lib/node_modules/@deepseek-ai/dsh/node_modules/@deepseek-ai/*/lib/client.js' # 注册对象形如: { name: "settings.section", id: "x", order: 100, label: … } diff --git a/scripts/find-ui.mjs b/scripts/find-ui.mjs index e641cca..ae406ae 100644 --- a/scripts/find-ui.mjs +++ b/scripts/find-ui.mjs @@ -26,10 +26,22 @@ import { readFileSync } from 'node:fs' import { spawnSync } from 'node:child_process' import { fileURLToPath } from 'node:url' import { dirname, join } from 'node:path' +import cfg from '../config/index.cjs' const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..') const SSH = process.env.DSHS_SSH ?? 'bt-server' +// 用户数据根:从 `config/` 读(本机权威单一来源),随 ssh 命令注入远端扫描器 —— +// ⛔ 扫描器内不写死服务器布局。解析不出来就**显式失败**,不猜、不静默(静默 0 命中 = 假阴性)。 +const USERS_DIR = cfg.usersDir().replace(/\\/g, '/').replace(/\/+$/, '') +if (!USERS_DIR.startsWith('/')) { + console.error( + '!! 解析不出远端用户数据根:' + USERS_DIR + '\n' + + ' 本机 config/platform.env 需含 DSHS_DATA_ROOT(或用 DSHS_USERS_DIR 覆盖),见 config/README.md。', + ) + process.exit(2) +} + const argv = process.argv.slice(2) const asMd = argv.includes('--md') const withGrep = argv.includes('--grep') @@ -39,7 +51,7 @@ const keyword = argv.find((a) => !a.startsWith('--')) ?? '' const scanner = readFileSync(join(ROOT, 'scripts', 'find-ui-scan.py'), 'utf8') const r = spawnSync( 'ssh', - ['-o', 'BatchMode=yes', '-o', 'ConnectTimeout=15', '-o', 'StrictHostKeyChecking=accept-new', SSH, 'python3 -'], + ['-o', 'BatchMode=yes', '-o', 'ConnectTimeout=15', '-o', 'StrictHostKeyChecking=accept-new', SSH, `DSHS_USERS_DIR='${USERS_DIR}' python3 -`], { input: scanner, encoding: 'utf8', maxBuffer: 1 << 24 }, ) if (r.status !== 0 && (r.stdout ?? '') === '') {