@moonquake2004/dsh-doctor 0.2.4 → 0.2.5
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/checks.json +59 -6
- package/dsh-doctor.mjs +11 -1
- package/package.json +1 -1
package/checks.json
CHANGED
|
@@ -8,8 +8,17 @@
|
|
|
8
8
|
"severity": "error",
|
|
9
9
|
"title": "dsh 可执行文件在 PATH 中",
|
|
10
10
|
"discussion": "#1270",
|
|
11
|
-
"when": {
|
|
12
|
-
|
|
11
|
+
"when": {
|
|
12
|
+
"os": [
|
|
13
|
+
"darwin",
|
|
14
|
+
"linux",
|
|
15
|
+
"win32"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"probe": {
|
|
19
|
+
"type": "command-exists",
|
|
20
|
+
"cmd": "dsh"
|
|
21
|
+
},
|
|
13
22
|
"detailOk": "dsh 在 PATH 中可用",
|
|
14
23
|
"detailFail": "dsh 不在 PATH(插件/CLI 安装链路不可用,#1270 同族)",
|
|
15
24
|
"fix": "安装 dsh 并将 node_modules/.bin 加入 PATH"
|
|
@@ -20,7 +29,13 @@
|
|
|
20
29
|
"severity": "warn",
|
|
21
30
|
"title": "workspace-root profile 的 .npmrc 安装开关",
|
|
22
31
|
"discussion": "#20",
|
|
23
|
-
"when": {
|
|
32
|
+
"when": {
|
|
33
|
+
"os": [
|
|
34
|
+
"darwin",
|
|
35
|
+
"linux",
|
|
36
|
+
"win32"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
24
39
|
"probe": {
|
|
25
40
|
"type": "text-contains",
|
|
26
41
|
"path": "{profile}/.npmrc",
|
|
@@ -37,7 +52,13 @@
|
|
|
37
52
|
"severity": "error",
|
|
38
53
|
"title": "patch insert name 含空格(Windows 参数 lint)",
|
|
39
54
|
"discussion": "#1420",
|
|
40
|
-
"when": {
|
|
55
|
+
"when": {
|
|
56
|
+
"os": [
|
|
57
|
+
"darwin",
|
|
58
|
+
"linux",
|
|
59
|
+
"win32"
|
|
60
|
+
]
|
|
61
|
+
},
|
|
41
62
|
"probe": {
|
|
42
63
|
"type": "text-not-contains",
|
|
43
64
|
"path": "{profile}/cordis.patch.yml",
|
|
@@ -55,11 +76,43 @@
|
|
|
55
76
|
"severity": "error",
|
|
56
77
|
"title": "config 目录 JSON 文件合法性",
|
|
57
78
|
"discussion": "#1357",
|
|
58
|
-
"when": {
|
|
59
|
-
|
|
79
|
+
"when": {
|
|
80
|
+
"os": [
|
|
81
|
+
"darwin",
|
|
82
|
+
"linux",
|
|
83
|
+
"win32"
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
"probe": {
|
|
87
|
+
"type": "json-valid",
|
|
88
|
+
"path": "{home}/config/workspace.json",
|
|
89
|
+
"required": false
|
|
90
|
+
},
|
|
60
91
|
"detailOk": "config/workspace.json 为合法 JSON",
|
|
61
92
|
"detailFail": "config/workspace.json 不是合法 JSON(#1357 并发写乱码类,工作区列表会消失)",
|
|
62
93
|
"fix": "排查多实例并发写;修复或删除损坏文件"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "E11-settings-writable",
|
|
97
|
+
"section": "env",
|
|
98
|
+
"severity": "error",
|
|
99
|
+
"title": "settings.yaml 可写性(sudo 属主问题)",
|
|
100
|
+
"discussion": "#1719",
|
|
101
|
+
"when": {
|
|
102
|
+
"os": [
|
|
103
|
+
"darwin",
|
|
104
|
+
"linux",
|
|
105
|
+
"win32"
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
"probe": {
|
|
109
|
+
"type": "file-writable",
|
|
110
|
+
"path": "{home}/settings.yaml",
|
|
111
|
+
"required": false
|
|
112
|
+
},
|
|
113
|
+
"detailOk": "settings.yaml 可写",
|
|
114
|
+
"detailFail": "settings.yaml 不可写(sudo 安装遗留的属主/权限问题),dsh 无法持久化设置",
|
|
115
|
+
"fix": "把属主改回当前用户:sudo chown <当前用户> ~/.dsh/settings.yaml(或删掉让 dsh 重建)"
|
|
63
116
|
}
|
|
64
117
|
]
|
|
65
118
|
}
|
package/dsh-doctor.mjs
CHANGED
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
* 退出码:0 = 全部通过;1 = 发现可修复问题(内置 + catalog severity=error);warn 级失败不改退出码。
|
|
45
45
|
*/
|
|
46
46
|
import { execFileSync, spawnSync } from 'node:child_process';
|
|
47
|
-
import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync, writeFileSync } from 'node:fs';
|
|
47
|
+
import { closeSync, existsSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, realpathSync, statSync, writeFileSync } from 'node:fs';
|
|
48
48
|
import { createRequire } from 'node:module';
|
|
49
49
|
import net from 'node:net';
|
|
50
50
|
import { basename, delimiter as PATH_DELIM, dirname, join } from 'node:path';
|
|
@@ -796,6 +796,16 @@ export function runCatalogCheck(check, ctx) {
|
|
|
796
796
|
if (count > max) return { ok: false, detail: check.detailFail ?? `${probe.pattern} 匹配 ${count} 个(> ${max})` };
|
|
797
797
|
return { ok: true, detail: check.detailOk ?? `${probe.pattern} 匹配 ${count} 个(${min}..${max})` };
|
|
798
798
|
}
|
|
799
|
+
case 'file-writable': {
|
|
800
|
+
const fp = p(probe.path);
|
|
801
|
+
if (!existsSync(fp)) return probe.required === false
|
|
802
|
+
? { ok: true, detail: check.detailOk ?? `${fp} 不存在(跳过)` }
|
|
803
|
+
: { ok: false, detail: check.detailFail ?? `${fp} 缺失` };
|
|
804
|
+
let writable = false;
|
|
805
|
+
try { const fd = openSync(fp, 'a'); closeSync(fd); writable = true; } catch { /* 只读/属主问题 */ }
|
|
806
|
+
return writable ? { ok: true, detail: check.detailOk ?? `${fp} 可写` }
|
|
807
|
+
: { ok: false, detail: check.detailFail ?? `${fp} 不可写(sudo 属主或只读权限,#1719)` };
|
|
808
|
+
}
|
|
799
809
|
default:
|
|
800
810
|
return { ok: true, skipped: true, detail: `探测原语 ${probe.type} 本引擎不支持,已跳过(需更新插件)` };
|
|
801
811
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moonquake2004/dsh-doctor",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"description": "Offline diagnostic for DeepSeek Harness — 19 built-in checks + self-updating catalog (Layer A) + self-update check (Layer B); 'Doctor' panel in web UI settings.",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"files": [
|