Users can now read, search, and update existing local Obsidian notes through built-in tools without configuring an external MCP server or Obsidian plugin. Add vault discovery, an optional folder scope, and independent test, save, enablement, and runtime assignment controls in MCP settings. Bundle MCPVault 0.16.0 and its runtime dependencies, exposing 19 shared tools to direct models and managed local OpenCode and Continue conversations. Obsidian is disabled by default. Ask remains read-only; Execute permits writes. Scope and assignment changes revoke existing Obsidian grants. DeepSeek Harness and remote execution remain unsupported. Validate the isolated staged snapshot with its own dependency installation: typecheck, lint, production build, and 540 tests across 14 files passed. No paid model calls were repeated. Physical-offline, installer, and other platform acceptance remain pending as documented in the feature record. Release note: Connect local Obsidian vaults in MCP settings to find notes and write conversation results back to them. Test all registered vaults or a chosen folder before enabling access; no Obsidian plugin is required.
425 lines
13 KiB
JSON
425 lines
13 KiB
JSON
{
|
|
"name": "goodbuddy",
|
|
"version": "0.13.16",
|
|
"private": true,
|
|
"description": "Secure desktop AI workspace with controlled Agent Runtimes",
|
|
"desktopName": "GoodBuddy",
|
|
"homepage": "https://mesalogo.github.io/goodbuddy/",
|
|
"author": {
|
|
"name": "MesaLogo"
|
|
},
|
|
"license": "0BSD",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+https://github.com/mesalogo/goodbuddy.git"
|
|
},
|
|
"bugs": {
|
|
"url": "https://github.com/mesalogo/goodbuddy/issues"
|
|
},
|
|
"main": "./out/main/index.js",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "electron-vite dev",
|
|
"start": "electron-vite preview",
|
|
"typecheck": "tsc --noEmit -p tsconfig.node.json && tsc --noEmit -p tsconfig.agent.json && tsc --noEmit -p tsconfig.web.json",
|
|
"lint": "eslint .",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"eval:retrieval": "vitest run --config tests/support/knowledge-retrieval-evaluation.ts tests/knowledge-retrieval-metrics.test.ts tests/knowledge-retrieval-evaluation.test.ts",
|
|
"build": "npm run typecheck && npm run build:bundle",
|
|
"build:bundle": "electron-vite build && node build/check-control-plane-package-installer.cjs",
|
|
"smoke:deepseek-harness": "npm run build:bundle && node build/run-deepseek-harness-utility-smoke.cjs",
|
|
"smoke:deepseek-harness:packaged": "node build/run-packaged-deepseek-harness-smoke.cjs",
|
|
"agent:build": "node build/agent-bundle.cjs build",
|
|
"agent:verify": "node build/agent-bundle.cjs verify",
|
|
"agent:import": "node build/agent-bundle.cjs import",
|
|
"remote-runtime:build": "node build/remote-runtime-bundle.cjs build",
|
|
"remote-runtime:verify": "node build/remote-runtime-bundle.cjs verify",
|
|
"remote-runtime:import": "node build/remote-runtime-bundle.cjs import",
|
|
"release:notes:verify": "node build/release-notes.cjs",
|
|
"dist": "npm run build && node build/run-electron-builder.cjs",
|
|
"dist:win": "npm run build && node build/run-electron-builder.cjs --win nsis --x64 --arm64",
|
|
"dist:mac": "npm run build && node build/run-electron-builder.cjs --mac dmg --x64 --arm64",
|
|
"dist:linux": "npm run dist:linux:x64 && npm run dist:linux:arm64",
|
|
"dist:linux:x64": "npm run build && node build/run-electron-builder.cjs --linux AppImage deb rpm --x64",
|
|
"dist:linux:arm64": "npm run build && node build/run-electron-builder.cjs --linux AppImage deb rpm --arm64",
|
|
"icons": "node build/generate-icons.mjs",
|
|
"release:package": "node build/build-release.cjs",
|
|
"portable": "node build/build-portable.cjs"
|
|
},
|
|
"build": {
|
|
"appId": "live.digiman.goodbuddy",
|
|
"productName": "GoodBuddy",
|
|
"directories": {
|
|
"buildResources": "build",
|
|
"output": "dist"
|
|
},
|
|
"artifactName": "${productName}-${version}-${os}-${arch}.${ext}",
|
|
"beforePack": "build/runtime-hooks.cjs",
|
|
"asar": true,
|
|
"asarUnpack": [
|
|
"out/main/obsidian-mcpvault/**/*",
|
|
"out/main/package.json",
|
|
"out/main/deepseek-harness-*",
|
|
"out/main/embedding-inference-bootstrap.js",
|
|
"out/main/chunks/**/*",
|
|
"node_modules/node-pty/lib/**/*",
|
|
"node_modules/node-pty/package.json",
|
|
"node_modules/node-pty/prebuilds/**/*",
|
|
"node_modules/node-pty/build/Release/**/*",
|
|
"node_modules/koffi/**/*",
|
|
"node_modules/@koromix/koffi-*/**/*",
|
|
"node_modules/@napi-rs/canvas{,/**/*}",
|
|
"node_modules/@napi-rs/canvas-*/**/*",
|
|
"node_modules/onnxruntime-web/dist/**/*.wasm"
|
|
],
|
|
"npmRebuild": false,
|
|
"compression": "maximum",
|
|
"files": [
|
|
"out/**/*",
|
|
"package.json",
|
|
"!node_modules/npm{,/**/*}"
|
|
],
|
|
"extraResources": [
|
|
{
|
|
"from": "resources/skills",
|
|
"to": "skills",
|
|
"filter": [
|
|
"**/*"
|
|
]
|
|
},
|
|
{
|
|
"from": "resources/release-notes.json",
|
|
"to": "release-notes.json"
|
|
},
|
|
{
|
|
"from": "resources/tool-environment/managed-python-artifacts.json",
|
|
"to": "tool-environment/managed-python-artifacts.json"
|
|
},
|
|
{
|
|
"from": "agent-runtime-lock.json",
|
|
"to": "agent-runtime-lock.json"
|
|
},
|
|
{
|
|
"from": "remote-runtime-lock.json",
|
|
"to": "remote-runtime-lock.json"
|
|
},
|
|
{
|
|
"from": "resources/agent-release-keys.json",
|
|
"to": "agent-release-keys.json"
|
|
},
|
|
{
|
|
"from": "build/icon-taskbar.ico",
|
|
"to": "icon.ico"
|
|
},
|
|
{
|
|
"from": "build/icon.png",
|
|
"to": "icon.png"
|
|
},
|
|
{
|
|
"from": "build/icon-tray.png",
|
|
"to": "tray-icon.png"
|
|
},
|
|
{
|
|
"from": ".runtime-resources/${arch}",
|
|
"to": "runtimes/opencode",
|
|
"filter": [
|
|
"opencode",
|
|
"opencode.exe",
|
|
"rg",
|
|
"rg.exe"
|
|
]
|
|
},
|
|
{
|
|
"from": ".runtime-resources",
|
|
"to": "runtimes",
|
|
"filter": [
|
|
"opencode-config{,/**/*}"
|
|
]
|
|
},
|
|
{
|
|
"from": "node_modules/opencode-ai/LICENSE",
|
|
"to": "licenses/opencode-ai-LICENSE"
|
|
},
|
|
{
|
|
"from": "node_modules/@vscode/ripgrep/LICENSE",
|
|
"to": "licenses/vscode-ripgrep-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/@deepseek-ai/dsh-agent/LICENSE",
|
|
"to": "licenses/deepseek-harness-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/@deepseek-ai/cordis/LICENSE",
|
|
"to": "licenses/deepseek-cordis-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/@agentclientprotocol/sdk/LICENSE",
|
|
"to": "licenses/agent-client-protocol-Apache-2.0.txt"
|
|
},
|
|
{
|
|
"from": "node_modules",
|
|
"to": "runtimes",
|
|
"filter": [
|
|
"npm{,/**/*}"
|
|
]
|
|
},
|
|
{
|
|
"from": "node_modules/node-pty/LICENSE",
|
|
"to": "licenses/node-pty-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/ssh2/LICENSE",
|
|
"to": "licenses/ssh2-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/koffi/LICENSE.txt",
|
|
"to": "licenses/koffi-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/@napi-rs/canvas/LICENSE",
|
|
"to": "licenses/napi-rs-canvas-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/@continuedev/cli",
|
|
"to": "runtimes/continue",
|
|
"filter": [
|
|
"package.json",
|
|
"dist/cn.js",
|
|
"dist/index.js",
|
|
"dist/xhr-sync-worker.js"
|
|
]
|
|
},
|
|
{
|
|
"from": "node_modules/typescript/LICENSE.txt",
|
|
"to": "licenses/continuedev-cli-LICENSE"
|
|
},
|
|
{
|
|
"from": "node_modules/@fontsource-variable/inter/LICENSE",
|
|
"to": "licenses/inter-OFL-1.1.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/@fontsource-variable/noto-sans-sc/LICENSE",
|
|
"to": "licenses/noto-sans-sc-OFL-1.1.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/ppu-paddle-ocr/LICENSE",
|
|
"to": "licenses/ppu-paddle-ocr-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/ppu-ocv/LICENSE",
|
|
"to": "licenses/ppu-ocv-MIT.txt"
|
|
},
|
|
{
|
|
"from": "resources/licenses/onnxruntime-MIT.txt",
|
|
"to": "licenses/onnxruntime-web-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/@huggingface/tokenizers/LICENSE",
|
|
"to": "licenses/huggingface-tokenizers-Apache-2.0.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/katex/LICENSE",
|
|
"to": "licenses/katex-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/fabric/LICENSE",
|
|
"to": "licenses/fabric-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/jspdf/LICENSE",
|
|
"to": "licenses/jspdf-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/quill/LICENSE",
|
|
"to": "licenses/quill-BSD-3-Clause.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/pdfjs-dist/LICENSE",
|
|
"to": "licenses/pdfjs-Apache-2.0.txt"
|
|
},
|
|
{
|
|
"from": "src/renderer/src/magic-canvas/NOTICE.md",
|
|
"to": "licenses/peoplelib-canvas-NOTICE.md"
|
|
},
|
|
{
|
|
"from": "node_modules/mermaid/LICENSE",
|
|
"to": "licenses/mermaid-MIT.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/dompurify/LICENSE",
|
|
"to": "licenses/dompurify-Apache-2.0.txt"
|
|
},
|
|
{
|
|
"from": "node_modules/dompurify/LICENSE-MPL",
|
|
"to": "licenses/dompurify-MPL-2.0.txt"
|
|
}
|
|
],
|
|
"win": {
|
|
"icon": "build/icon-taskbar.ico",
|
|
"target": [
|
|
"nsis"
|
|
]
|
|
},
|
|
"nsis": {
|
|
"oneClick": false,
|
|
"allowToChangeInstallationDirectory": true,
|
|
"createDesktopShortcut": "always",
|
|
"createStartMenuShortcut": true,
|
|
"deleteAppDataOnUninstall": false
|
|
},
|
|
"mac": {
|
|
"icon": "build/icon.png",
|
|
"target": [
|
|
"dmg"
|
|
],
|
|
"category": "public.app-category.productivity",
|
|
"hardenedRuntime": true,
|
|
"gatekeeperAssess": false,
|
|
"notarize": true,
|
|
"extendInfo": {
|
|
"NSMicrophoneUsageDescription": "GoodBuddy 需要访问麦克风,将语音转换为可编辑文字。"
|
|
}
|
|
},
|
|
"linux": {
|
|
"icon": "build/icon.png",
|
|
"maintainer": "MesaLogo",
|
|
"vendor": "MesaLogo",
|
|
"synopsis": "安全可控的桌面智能助手与 Agent 工作空间",
|
|
"syncDesktopName": true,
|
|
"target": [
|
|
"AppImage",
|
|
"deb",
|
|
"rpm"
|
|
],
|
|
"category": "Utility"
|
|
}
|
|
},
|
|
"dependencies": {
|
|
"@agentclientprotocol/sdk": "0.25.1",
|
|
"@deepseek-ai/cordis": "4.0.2",
|
|
"@deepseek-ai/dsh-agent": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-agent-loop": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-bash-local": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-credentials": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-fs-local": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-llm": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-llm-pi-ai": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-pwsh-local": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-sandbox": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-sandbox-policy": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-session": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-session-projection": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-shell-env": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-skill": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-subprocess-local": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-system-prompt": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-token-meter": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-tool-bash": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-tool-fs": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-tool-pwsh": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-tool-skill": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-tools": "0.1.2-rc.1",
|
|
"@deepseek-ai/dsh-user-approval": "0.1.2-rc.1",
|
|
"@huggingface/tokenizers": "^0.1.3",
|
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
"@napi-rs/canvas": "1.0.3",
|
|
"@opencode-ai/plugin": "1.18.29",
|
|
"@opencode-ai/sdk": "1.18.29",
|
|
"@vscode/ripgrep": "1.18.0",
|
|
"@wecom/aibot-node-sdk": "^1.0.6",
|
|
"@xterm/addon-fit": "0.11.0",
|
|
"@xterm/addon-search": "0.16.0",
|
|
"@xterm/addon-webgl": "0.19.0",
|
|
"@xterm/xterm": "6.0.0",
|
|
"cross-spawn": "^7.0.6",
|
|
"dingtalk-stream": "^2.1.6-beta.1",
|
|
"dompurify": "^3.4.13",
|
|
"fflate": "^0.8.3",
|
|
"fabric": "7.4.0",
|
|
"html-to-text": "^10.0.0",
|
|
"i18next": "^25.10.10",
|
|
"json5": "^2.2.3",
|
|
"jspdf": "4.2.1",
|
|
"katex": "^0.16.47",
|
|
"koffi": "3.1.4",
|
|
"lucide-react": "^1.27.0",
|
|
"mermaid": "^11.16.1",
|
|
"node-pty": "^1.2.0-beta.15",
|
|
"npm": "11.19.0",
|
|
"onnxruntime-web": "^1.23.2",
|
|
"pdfjs-dist": "^6.2.108",
|
|
"ppu-paddle-ocr": "^6.4.0",
|
|
"qrcode": "^1.5.4",
|
|
"quill": "^2.0.3",
|
|
"react": "^19.2.8",
|
|
"react-dom": "^19.2.8",
|
|
"react-i18next": "^16.6.6",
|
|
"react-markdown": "^10.1.0",
|
|
"rehype-katex": "^7.0.1",
|
|
"remark-gfm": "^4.0.1",
|
|
"remark-math": "^6.0.0",
|
|
"sherpa-onnx": "1.13.4",
|
|
"ssh2": "^1.17.0",
|
|
"undici": "^7.29.0",
|
|
"yaml": "^2.9.0",
|
|
"zod": "^4.4.3"
|
|
},
|
|
"devDependencies": {
|
|
"@antv/g6": "^5.1.1",
|
|
"@bitbonsai/mcpvault": "0.16.0",
|
|
"@continuedev/cli": "1.5.47",
|
|
"@eslint/js": "^10.0.1",
|
|
"@fontsource-variable/inter": "^5.3.0",
|
|
"@fontsource-variable/noto-sans-sc": "^5.3.0",
|
|
"@testing-library/jest-dom": "^7.0.0",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/cross-spawn": "^6.0.6",
|
|
"@types/html-to-text": "^9.0.4",
|
|
"@types/node": "^26.1.2",
|
|
"@types/qrcode": "^1.5.5",
|
|
"@types/react": "^19.2.17",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@types/ssh2": "^1.15.5",
|
|
"@vitejs/plugin-react": "^5.2.0",
|
|
"electron": "^43.2.0",
|
|
"electron-builder": "^26.15.3",
|
|
"electron-vite": "^5.0.0",
|
|
"esbuild": "0.25.12",
|
|
"eslint": "^10.8.0",
|
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
"globals": "^17.8.0",
|
|
"jsdom": "^30.0.1",
|
|
"opencode-ai": "1.18.29",
|
|
"png-to-ico": "^3.0.2",
|
|
"pngjs": "^7.0.0",
|
|
"tar": "7.5.22",
|
|
"typescript": "^6.0.3",
|
|
"typescript-eslint": "^8.65.0",
|
|
"vite": "^7.3.6",
|
|
"vitest": "^4.1.10"
|
|
},
|
|
"optionalDependencies": {
|
|
"@koromix/koffi-darwin-arm64": "3.1.4",
|
|
"@koromix/koffi-darwin-x64": "3.1.4",
|
|
"@koromix/koffi-linux-arm64": "3.1.4",
|
|
"@koromix/koffi-linux-x64": "3.1.4",
|
|
"@koromix/koffi-win32-arm64": "3.1.4",
|
|
"@koromix/koffi-win32-x64": "3.1.4"
|
|
},
|
|
"allowScripts": {
|
|
"@deepseek-ai/dsh-subprocess-local@0.1.2-rc.1": true,
|
|
"@google/genai@1.52.0": true,
|
|
"cpu-features@0.0.10": true,
|
|
"electron-winstaller@5.4.0": true,
|
|
"esbuild@0.25.12": true,
|
|
"esbuild@0.28.1": true,
|
|
"fsevents@2.3.3": true,
|
|
"koffi@3.1.4": true,
|
|
"node-pty@1.2.0-beta.15": true,
|
|
"opencode-ai@1.18.29": true,
|
|
"protobufjs@7.6.5": true,
|
|
"ssh2@1.17.0": true
|
|
}
|
|
}
|