@taole/dd-playwright 0.1.7 → 0.1.8
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/README.md +4 -0
- package/bin/cli.mjs +4 -0
- package/bin/mcp-server.mjs +1 -1
- package/package.json +1 -1
- package/src/updater.mjs +111 -0
package/README.md
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
增强型 stdio MCP 服务与 CLI 工具:Playwright 浏览器自动化 + 隔离 whistle 代理 + 点点账号 storageState 免登注入。
|
|
4
4
|
可挂载到任意 AI 客户端(omp / Cursor / Claude Desktop / Codex 等)使用,不依赖任何特定宿主项目。
|
|
5
5
|
|
|
6
|
+
> 📖 **团队知识库与使用手册**:[dd-playwright 钉钉在线文档](https://alidocs.dingtalk.com/i/nodes/14lgGw3P8vL9wkv1FnOLZAlkV5daZ90D?utm_scene=person_space)(持续同步最新工具契约与最佳实践)
|
|
6
7
|
## 能力
|
|
7
8
|
|
|
8
9
|
| 工具 | 说明 |
|
|
@@ -64,6 +65,9 @@ dd-pw statusweb
|
|
|
64
65
|
# 停止后台运行的服务:
|
|
65
66
|
dd-pw stopweb
|
|
66
67
|
|
|
68
|
+
# 一键检查并升级到最新版本:
|
|
69
|
+
dd-pw update
|
|
70
|
+
|
|
67
71
|
# (可选)前台阻塞运行(Ctrl+C 退出):
|
|
68
72
|
dd-pw serve [--port 12309]
|
|
69
73
|
```
|
package/bin/cli.mjs
CHANGED
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
stopWebDaemon,
|
|
8
8
|
getWebDaemonStatus,
|
|
9
9
|
} from "../src/server/daemon.mjs";
|
|
10
|
+
import { handleUpdateCommand } from "../src/updater.mjs";
|
|
10
11
|
|
|
11
12
|
const args = process.argv.slice(2);
|
|
12
13
|
const command = args[0];
|
|
@@ -20,6 +21,7 @@ dd-playwright (别名: dd-pw) CLI
|
|
|
20
21
|
dd-pw stopweb 停止后台运行的 Web 控制台
|
|
21
22
|
dd-pw statusweb 查看后台 Web 控制台运行状态与端口
|
|
22
23
|
dd-pw serve [--port 12309] 前台阻塞启动 Web 控制台(按 Ctrl+C 退出)
|
|
24
|
+
dd-pw update 检查远端最新版本并自动升级
|
|
23
25
|
dd-pw mcp 以 stdio 模式启动 MCP 浏览器服务
|
|
24
26
|
dd-pw --help, -h 查看帮助信息
|
|
25
27
|
|
|
@@ -158,6 +160,8 @@ async function main() {
|
|
|
158
160
|
console.error(`[dd-playwright] 启动失败:`, err);
|
|
159
161
|
process.exit(1);
|
|
160
162
|
}
|
|
163
|
+
} else if (command === "update" || command === "upgrade") {
|
|
164
|
+
await handleUpdateCommand();
|
|
161
165
|
} else if (command === "mcp") {
|
|
162
166
|
// 转发至 mcp-server.mjs
|
|
163
167
|
await import("./mcp-server.mjs");
|
package/bin/mcp-server.mjs
CHANGED
|
@@ -11,7 +11,7 @@ import { resolveConfig } from "../src/config.mjs";
|
|
|
11
11
|
import { PlaywrightBrowserManager } from "../src/browser-manager.mjs";
|
|
12
12
|
import { pathToFileURL } from "node:url";
|
|
13
13
|
|
|
14
|
-
export const MCP_VERSION = "0.1.
|
|
14
|
+
export const MCP_VERSION = "0.1.8";
|
|
15
15
|
|
|
16
16
|
function textResult(payload) {
|
|
17
17
|
return {
|
package/package.json
CHANGED
package/src/updater.mjs
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
|
|
5
|
+
export const PACKAGE_NAME = "@taole/dd-playwright";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 比较两个语义化版本号 (semver)
|
|
9
|
+
* @param {string} v1
|
|
10
|
+
* @param {string} v2
|
|
11
|
+
* @returns {number} 1: v1 > v2; -1: v1 < v2; 0: v1 == v2
|
|
12
|
+
*/
|
|
13
|
+
export function compareSemver(v1, v2) {
|
|
14
|
+
const parse = (v) =>
|
|
15
|
+
(v || "")
|
|
16
|
+
.replace(/^v/i, "")
|
|
17
|
+
.split("-")[0]
|
|
18
|
+
.split(".")
|
|
19
|
+
.map((n) => parseInt(n, 10) || 0);
|
|
20
|
+
|
|
21
|
+
const [maj1, min1, pat1] = parse(v1);
|
|
22
|
+
const [maj2, min2, pat2] = parse(v2);
|
|
23
|
+
|
|
24
|
+
if (maj1 !== maj2) return maj1 > maj2 ? 1 : -1;
|
|
25
|
+
if (min1 !== min2) return min1 > min2 ? 1 : -1;
|
|
26
|
+
if (pat1 !== pat2) return pat1 > pat2 ? 1 : -1;
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 获取本地安装的版本号
|
|
32
|
+
* @returns {string}
|
|
33
|
+
*/
|
|
34
|
+
export function getLocalVersion() {
|
|
35
|
+
try {
|
|
36
|
+
const pkgPath = fileURLToPath(new URL("../package.json", import.meta.url));
|
|
37
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
38
|
+
return pkg.version || "0.0.0";
|
|
39
|
+
} catch {
|
|
40
|
+
return "0.0.0";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 查询 NPM 远端最新版本号
|
|
46
|
+
* @returns {Promise<string|null>}
|
|
47
|
+
*/
|
|
48
|
+
export async function getRemoteLatestVersion() {
|
|
49
|
+
const registries = [
|
|
50
|
+
"https://registry.npmjs.org/",
|
|
51
|
+
"https://registry.npmmirror.com/",
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
for (const reg of registries) {
|
|
55
|
+
try {
|
|
56
|
+
const url = `${reg}${PACKAGE_NAME}/latest`;
|
|
57
|
+
const res = await fetch(url, {
|
|
58
|
+
headers: { Accept: "application/json" },
|
|
59
|
+
signal: AbortSignal.timeout(4000),
|
|
60
|
+
});
|
|
61
|
+
if (res.ok) {
|
|
62
|
+
const data = await res.json();
|
|
63
|
+
if (data.version) return data.version;
|
|
64
|
+
}
|
|
65
|
+
} catch {}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 执行 update 命令核心流程
|
|
72
|
+
*/
|
|
73
|
+
export async function handleUpdateCommand(overrideCurrentVersion = null) {
|
|
74
|
+
const currentVersion = overrideCurrentVersion || getLocalVersion();
|
|
75
|
+
console.log(`[dd-playwright] 正在检查 npm 远端最新版本...`);
|
|
76
|
+
|
|
77
|
+
const latestVersion = await getRemoteLatestVersion();
|
|
78
|
+
if (!latestVersion) {
|
|
79
|
+
console.warn(`[dd-playwright] 无法连接到 npm 注册表查询最新版本,请检查网络。`);
|
|
80
|
+
console.log(`您可直接尝试执行手动更新命令:\n npm install -g ${PACKAGE_NAME}@latest\n`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const cmp = compareSemver(latestVersion, currentVersion);
|
|
85
|
+
if (cmp <= 0) {
|
|
86
|
+
console.log(`🎉 恭喜!当前已是最新版本 (v${currentVersion}),无需更新。\n`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
console.log(`\n==================================================`);
|
|
91
|
+
console.log(` 🚀 发现新版本可用: v${currentVersion} -> v${latestVersion}`);
|
|
92
|
+
console.log(`==================================================\n`);
|
|
93
|
+
|
|
94
|
+
console.log(`[dd-playwright] 正在尝试自动执行全局升级 (npm install -g ${PACKAGE_NAME}@latest)...`);
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
// 优先尝试自动升级
|
|
98
|
+
execSync(`npm install -g ${PACKAGE_NAME}@latest`, {
|
|
99
|
+
stdio: "inherit",
|
|
100
|
+
windowsHide: true,
|
|
101
|
+
});
|
|
102
|
+
console.log(`\n🎉 自动更新完成!已成功升级至最新版本 v${latestVersion}。\n`);
|
|
103
|
+
console.log(`提示:若当前后台正在运行 Web 服务,建议重启生效:`);
|
|
104
|
+
console.log(` dd-pw stopweb && dd-pw startweb\n`);
|
|
105
|
+
} catch (err) {
|
|
106
|
+
// 若因系统权限不足等原因报错,优雅降级,打印完整手工升级命令
|
|
107
|
+
console.warn(`\n⚠️ 自动升级未完成(可能需要管理员权限或当前终端权限受限)。`);
|
|
108
|
+
console.log(`请复制下方命令并在终端中执行升级:\n`);
|
|
109
|
+
console.log(`👉 npm install -g ${PACKAGE_NAME}@latest\n`);
|
|
110
|
+
}
|
|
111
|
+
}
|