@hangox/mg-cli 1.3.0 → 1.4.0
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/bin/mg-native-host.js +2 -0
- package/dist/cli.js +180 -7
- package/dist/cli.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/native-host.js +345 -0
- package/dist/native-host.js.map +1 -0
- package/dist/postinstall.js +132 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scripts/register-utils.ts","../src/scripts/postinstall.ts"],"sourcesContent":["/**\n * Native Messaging Host 注册辅助函数\n * 支持 macOS, Linux, Windows\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport { execSync } from 'node:child_process'\nimport { fileURLToPath } from 'node:url'\n\n// ==================== 配置常量 ====================\n\nexport const HOST_NAME = 'com.hangox.mgplugin'\nexport const EXTENSION_ID = 'ddhihanlpcdneicohnglnaliefnkaeja'\nconst DESCRIPTION = 'MasterGo Plugin Native Messaging Host'\n\n// ==================== 平台适配 ====================\n\ntype BrowserType = 'chrome' | 'chromium' | 'edge'\n\ninterface PlatformConfig {\n manifestDir: string\n registryKey?: string // Windows only\n}\n\nfunction getBrowserPaths(browser: BrowserType): PlatformConfig {\n const home = os.homedir()\n const platform = os.platform()\n\n const browserDirs: Record<BrowserType, Record<string, string>> = {\n chrome: {\n darwin: path.join(home, 'Library/Application Support/Google/Chrome/NativeMessagingHosts'),\n linux: path.join(home, '.config/google-chrome/NativeMessagingHosts'),\n win32: path.join(\n process.env.APPDATA || path.join(home, 'AppData/Roaming'),\n 'Google/Chrome/NativeMessagingHosts'\n ),\n },\n chromium: {\n darwin: path.join(home, 'Library/Application Support/Chromium/NativeMessagingHosts'),\n linux: path.join(home, '.config/chromium/NativeMessagingHosts'),\n win32: path.join(\n process.env.APPDATA || path.join(home, 'AppData/Roaming'),\n 'Chromium/NativeMessagingHosts'\n ),\n },\n edge: {\n darwin: path.join(\n home,\n 'Library/Application Support/Microsoft Edge/NativeMessagingHosts'\n ),\n linux: path.join(home, '.config/microsoft-edge/NativeMessagingHosts'),\n win32: path.join(\n process.env.APPDATA || path.join(home, 'AppData/Roaming'),\n 'Microsoft/Edge/NativeMessagingHosts'\n ),\n },\n }\n\n const registryKeys: Record<BrowserType, string> = {\n chrome: `HKCU\\\\Software\\\\Google\\\\Chrome\\\\NativeMessagingHosts\\\\${HOST_NAME}`,\n chromium: `HKCU\\\\Software\\\\Chromium\\\\NativeMessagingHosts\\\\${HOST_NAME}`,\n edge: `HKCU\\\\Software\\\\Microsoft\\\\Edge\\\\NativeMessagingHosts\\\\${HOST_NAME}`,\n }\n\n const manifestDir = browserDirs[browser][platform]\n if (!manifestDir) {\n throw new Error(`不支持的平台: ${platform}`)\n }\n\n return {\n manifestDir,\n registryKey: platform === 'win32' ? registryKeys[browser] : undefined,\n }\n}\n\n// ==================== Manifest 生成 ====================\n\nfunction getNativeHostPath(): string {\n // 获取当前文件位置,推算 native-host 入口\n const currentFile = fileURLToPath(import.meta.url)\n const distDir = path.dirname(currentFile)\n return path.join(distDir, 'native-host.js')\n}\n\nfunction createManifest(): { name: string; description: string; path: string; type: string; allowed_origins: string[] } {\n return {\n name: HOST_NAME,\n description: DESCRIPTION,\n path: getNativeHostPath(),\n type: 'stdio',\n allowed_origins: [`chrome-extension://${EXTENSION_ID}/`],\n }\n}\n\n// ==================== 注册逻辑 ====================\n\nexport function register(browser: BrowserType = 'chrome'): void {\n const config = getBrowserPaths(browser)\n const manifestPath = path.join(config.manifestDir, `${HOST_NAME}.json`)\n const manifest = createManifest()\n\n console.log('正在注册 Native Messaging Host...')\n console.log(` Host Name: ${HOST_NAME}`)\n console.log(` Extension ID: ${EXTENSION_ID}`)\n console.log(` Browser: ${browser}`)\n console.log(` Native Host: ${manifest.path}`)\n console.log(` Manifest: ${manifestPath}`)\n\n // 1. 确保目录存在\n fs.mkdirSync(config.manifestDir, { recursive: true })\n\n // 2. 写入 manifest\n fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2))\n\n // 3. 设置执行权限 (Unix)\n if (os.platform() !== 'win32') {\n try {\n fs.chmodSync(manifest.path, '755')\n } catch {\n console.warn(' ⚠️ 无法设置执行权限,可能需要手动设置')\n }\n }\n\n // 4. Windows: 写入注册表\n if (config.registryKey) {\n try {\n execSync(`reg add \"${config.registryKey}\" /ve /t REG_SZ /d \"${manifestPath}\" /f`, {\n stdio: 'pipe',\n })\n console.log(' ✓ Windows 注册表已更新')\n } catch {\n console.warn(' ⚠️ 注册表写入失败,可能需要管理员权限')\n }\n }\n\n console.log('✓ Native Messaging Host 注册成功')\n}\n\nexport function unregister(browser: BrowserType = 'chrome'): void {\n const config = getBrowserPaths(browser)\n const manifestPath = path.join(config.manifestDir, `${HOST_NAME}.json`)\n\n // 删除 manifest 文件\n if (fs.existsSync(manifestPath)) {\n fs.unlinkSync(manifestPath)\n console.log(` 已删除: ${manifestPath}`)\n }\n\n // Windows: 删除注册表项\n if (config.registryKey) {\n try {\n execSync(`reg delete \"${config.registryKey}\" /f`, { stdio: 'pipe' })\n console.log(' ✓ Windows 注册表项已删除')\n } catch {\n // 忽略不存在的情况\n }\n }\n}\n\nexport function checkRegistration(browser: BrowserType = 'chrome'): {\n registered: boolean\n manifestPath?: string\n manifest?: unknown\n} {\n const config = getBrowserPaths(browser)\n const manifestPath = path.join(config.manifestDir, `${HOST_NAME}.json`)\n\n if (!fs.existsSync(manifestPath)) {\n return { registered: false }\n }\n\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'))\n return {\n registered: true,\n manifestPath,\n manifest,\n }\n } catch {\n return { registered: false, manifestPath }\n }\n}\n","#!/usr/bin/env node\n/**\n * npm postinstall 脚本\n * 全局安装时自动注册 Native Messaging Host\n */\n\nimport { register, HOST_NAME, EXTENSION_ID } from './register-utils.js'\n\n// ==================== 入口 ====================\n\nfunction isGlobalInstall(): boolean {\n // npm 全局安装\n if (process.env.npm_config_global === 'true') return true\n\n // pnpm 全局安装检测\n const pnpmPatterns = ['/pnpm/global/', '/.local/share/pnpm/', '/pnpm-global/']\n if (pnpmPatterns.some((p) => __dirname.includes(p))) return true\n\n // yarn 全局安装检测\n const yarnPatterns = ['/.config/yarn/global/', '/yarn/global/']\n if (yarnPatterns.some((p) => __dirname.includes(p))) return true\n\n return false\n}\n\nfunction main(): void {\n // 仅全局安装时执行\n if (!isGlobalInstall()) {\n console.log('[mg-cli] 本地安装,跳过 Native Host 注册')\n console.log('[mg-cli] 如需注册,请运行: npx @hangox/mg-cli register')\n return\n }\n\n console.log('[mg-cli] 检测到全局安装,开始注册 Native Messaging Host...')\n console.log(`[mg-cli] Host Name: ${HOST_NAME}`)\n console.log(`[mg-cli] Extension ID: ${EXTENSION_ID}`)\n\n try {\n register('chrome')\n } catch (error) {\n console.error('[mg-cli] Native Host 注册失败:', error)\n console.log('\\n[mg-cli] 请手动运行: npx @hangox/mg-cli register')\n // 不要让 postinstall 失败阻止安装\n process.exitCode = 0\n }\n}\n\nmain()\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hangox/mg-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "MasterGo Plugin CLI 工具和 WebSocket 服务器",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"mg-cli": "./bin/mg-cli.js"
|
|
9
|
+
"mg-cli": "./bin/mg-cli.js",
|
|
10
|
+
"mg-native-host": "./bin/mg-native-host.js"
|
|
10
11
|
},
|
|
11
12
|
"files": [
|
|
12
13
|
"dist",
|
|
13
14
|
"bin"
|
|
14
15
|
],
|
|
15
16
|
"scripts": {
|
|
17
|
+
"postinstall": "node ./dist/postinstall.js || true",
|
|
16
18
|
"dev": "MG_DEV_MODE=true tsup --watch",
|
|
17
19
|
"build": "tsup",
|
|
18
20
|
"check": "pnpm typecheck && pnpm lint && pnpm test && pnpm build",
|
|
@@ -36,6 +38,10 @@
|
|
|
36
38
|
],
|
|
37
39
|
"author": "",
|
|
38
40
|
"license": "MIT",
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"registry": "https://registry.npmjs.org/",
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
39
45
|
"dependencies": {
|
|
40
46
|
"commander": "^12.1.0",
|
|
41
47
|
"posthog-node": "^5.18.0",
|