@moonquake2004/dsh-doctor 0.4.26 → 0.4.27

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.
Files changed (2) hide show
  1. package/dsh-doctor.mjs +42 -5
  2. package/package.json +1 -1
package/dsh-doctor.mjs CHANGED
@@ -246,11 +246,31 @@ function resolveProfile(name) {
246
246
  * 即 `@deepseek-ai/dsh-root`(`private: true`,非发布包)。**没有任何已发布包继承它**,
247
247
  * 所以 registry 查不到、npm 安装时既不校验也不警告;这正是社区里"没有 engines"印象的由来。
248
248
  * 我们内置的范围与之一致(等于官方声明值),但它是**手写维护**的:上游改动时需同步。 */
249
- function nodeInSupportedRange(v) {
249
+ /**
250
+ * 支持范围。默认是**内置常量**(出处与核对日期见上一条注释);若设置了
251
+ * `DSH_DOCTOR_HARNESS_ROOT` 指向 harness 检出,则**真读**其仓库根 package.json 的
252
+ * `engines.node` —— 这是社区建议的方向(#6651 @ciceroyang):手维护的常量会随上游漂移,
253
+ * 能读元数据就别抄数字。真正的解法仍是 #2259(让**已发布**的入口包带上 engines)。
254
+ */
255
+ const NODE_RANGE_FALLBACK = '^22.19.0 || >=24.0.0'; // 核对日期 2026-09-15(master)
256
+ function nodeRangeSource() {
257
+ const root = process.env.DSH_DOCTOR_HARNESS_ROOT;
258
+ if (root) {
259
+ try {
260
+ const e = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')).engines?.node;
261
+ if (typeof e === 'string' && e.trim()) return { range: e.trim(), from: `真读 ${root}/package.json` };
262
+ } catch { /* 落到内置常量 */ }
263
+ }
264
+ return { range: NODE_RANGE_FALLBACK, from: '内置常量(出处:仓库根 package.json engines.node,核对 2026-09-15)' };
265
+ }
266
+ function nodeInSupportedRange(v, range = NODE_RANGE_FALLBACK) {
250
267
  const m = /^v?(\d+)\.(\d+)\.(\d+)/.exec(String(v));
251
268
  if (!m) return false;
252
269
  const major = Number(m[1]); const minor = Number(m[2]);
253
- return (major === 22 && minor >= 19) || major >= 24;
270
+ // 规则来自该范围本身(^22.19.0 || >=24.0.0):22.19+ 或 24+
271
+ if (range === NODE_RANGE_FALLBACK) return (major === 22 && minor >= 19) || major >= 24;
272
+ const cur = { nums: [Number(m[1]), Number(m[2]), Number(m[3])], pre: [] };
273
+ return peerRangeState(String(v).replace(/^v/, ''), range).state === 'satisfied';
254
274
  }
255
275
  function checkEnv() {
256
276
  if (!wants('env')) return;
@@ -265,12 +285,29 @@ function checkEnv() {
265
285
  report('env', 'E2-env', !isDir, isDir ? `${envFile} 是目录,dsh 启动会报 failed to load .env: EISDIR(#71)` : `${envFile} 正常`, isDir ? '删除或改名该目录' : undefined);
266
286
  }
267
287
  const nv = spawnSync('node', ['-e', 'console.log(process.version)']);
288
+ // 支持范围:优先**从仓库根 manifest 真读**(若给了 DSH_DOCTOR_HARNESS_ROOT 或存在检出),
289
+ // 否则用内置常量。社区(#6651 @ciceroyang)指出:两个实现都把这个范围写成手维护常量,
290
+ // 上游一改就各自漂移;真正的解法在 #2259(让已发布的入口包带上 engines,从而可读安装树元数据)。
291
+ // 在那之前,任何写死它的地方都必须标注**出处与核对日期**。
292
+ const RANGE_FALLBACK = '^22.19.0 || >=24.0.0'; // 出处:deepseek-harness 仓库根 package.json engines.node(@deepseek-ai/dsh-root,private);核对日期 2026-09-15(master)
293
+ const rangeInfo = (() => {
294
+ const root = process.env.DSH_DOCTOR_HARNESS_ROOT;
295
+ if (root) {
296
+ try {
297
+ const e = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')).engines?.node;
298
+ if (typeof e === 'string' && e.trim()) return { range: e.trim(), from: `${root}/package.json(真读)` };
299
+ } catch { /* 落到内置 */ }
300
+ }
301
+ return { range: RANGE_FALLBACK, from: '内置常量(出处:仓库根 package.json engines.node;核对日期 2026-09-15)' };
302
+ })();
303
+
268
304
  if (nv.status === 0) {
269
305
  const version = String(nv.stdout).trim();
270
- const supported = nodeInSupportedRange(version);
306
+ const rangeSrc = nodeRangeSource();
307
+ const supported = nodeInSupportedRange(version, rangeSrc.range);
271
308
  report('env', 'E3-node', supported,
272
- supported ? `node ${version}(满足声明范围 ^22.19.0 || >=24.0.0——出处为仓库根私有 workspace package.json 的 engines,#2259)` : `node ${version} 不在支持范围(^22.19.0 || >=24.0.0,v1 词汇表)——会话日志读取等能力受限`,
273
- supported ? undefined : '升级 node 到 ^22.19.0 或 >=24.0.0(仓库根 engines 声明的范围,见 #2259)');
309
+ supported ? `node ${version}(满足 ${rangeSrc.range}——${rangeSrc.from};该范围声明在私有 workspace 上、无发布物继承,见 #2259/#6651)` : `node ${version} 不在支持范围(^22.19.0 || >=24.0.0,v1 词汇表)——会话日志读取等能力受限`,
310
+ supported ? undefined : `升级 node 到 ${rangeSrc.range}(${rangeSrc.from},见 #2259)`);
274
311
  }
275
312
 
276
313
  // E12:运行时 zstd 稳定性(#6651 的运行时线索)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moonquake2004/dsh-doctor",
3
- "version": "0.4.26",
3
+ "version": "0.4.27",
4
4
  "description": "Offline diagnostic for DeepSeek Harness — 28 built-in + 5 catalog checks across env/profile/session (Layer A checks-as-data), self-update (Layer B), and a semi-automatic LLM observer (Layer C, --observe); Doctor panel in web UI settings.",
5
5
  "main": "lib/index.js",
6
6
  "files": [