非鱼是本地设计文件客户端。把 Sketch / Figma 设计稿导入进来,AI 就能直接看图、读结构、写代码——还能用大白话帮你改稿。一切都在本地,数据不上传。
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 29 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
apply_operations
-
compare_render
-
compose_page
-
create_document
-
create_from_html
-
download_assets
-
export_fig
-
fork_document
-
get_code
-
get_component
-
get_component_tokens
-
get_design_tokens
-
get_html
-
get_node_dsl
-
get_page_outline
-
get_preview
-
get_styles
-
get_tokens
-
insert_html
-
list_files
-
list_pages
-
list_versions
-
map_components
-
restyle_colors
-
restyle_layout
-
restyle_text
-
rollback
-
search_nodes
-
set_token_override
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 128
filesystem 37
- fs (weak) sevenyang129-flyu-f01b0ba/scripts/inline-wasm.mjs :19
import { readFileSync, writeFileSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/scripts/visual-regression.ts :15
import { existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync, rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/scripts/visual-shot.cjs :15
require("fs").writeFileSync(outPng, img.toPNG()); - fs sevenyang129-flyu-f01b0ba/src/main/bridge.ts :13
import { mkdirSync, readFileSync, writeFileSync, unlinkSync, existsSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/db/writers.ts :9
import { rmSync, unlinkSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/export/cut-cache.ts :11
import { mkdirSync, writeFileSync, readFileSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/export/scan-components.ts :8
import { readdirSync, readFileSync, statSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/import/persist-images.ts :9
import { mkdirSync, writeFileSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/import/sketch-import.ts :14
import { readFileSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/import/sketch-library.ts :5
import { readFileSync, readdirSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/index.ts :12
import { existsSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/ipc/files.ts :10
import { copyFile, mkdir, readFile, rm, stat } from "node:fs/promises"; - fs sevenyang129-flyu-f01b0ba/src/main/ipc/mcp.ts :9
import { readFileSync, existsSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/mcp-token.ts :10
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/render/dispatch.ts :11
import { readFile } from "node:fs/promises"; - fs sevenyang129-flyu-f01b0ba/src/main/render/fig-render-dispatch.ts :10
import { existsSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/render/local-fonts.ts :12
import { readFileSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/main/render/render-worker.ts :14
import { readFileSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/mcp/tools-assets.ts :12
import { mkdirSync, writeFileSync, copyFileSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/mcp/tools-code.ts :18
import { mkdirSync, writeFileSync, copyFileSync, readFileSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/mcp/tools-visual.ts :10
import { mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs sevenyang129-flyu-f01b0ba/src/shared/paths.ts :13
import { existsSync, mkdirSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/export/cut-cache.test.ts :7
import { readFileSync, mkdtempSync, rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/export/scan-components.test.ts :4
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/fixtures/vector-torture.ts :16
import { mkdtempSync, writeFileSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/import/create-from-html.test.ts :7
import { readFileSync, mkdtempSync, rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/import/library-symbols.test.ts :4
import { mkdtempSync, writeFileSync, rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/import/sketch-import.test.ts :7
import { mkdtempSync, writeFileSync, rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/import/sketch-reimport.test.ts :9
import { mkdtempSync, writeFileSync, readFileSync, rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/import/vector-torture.test.ts :8
import { rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/import/versions.test.ts :8
import { readFileSync, mkdtempSync, writeFileSync, rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/main/folder-recursive-delete.test.ts :5
import { readFileSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/main/mcp-http.test.ts :6
import { mkdtempSync, rmSync, readFileSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/mcp/restyle.test.ts :9
import { readFileSync, mkdtempSync, writeFileSync, rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/mcp/tools.contract.test.ts :7
import { readFileSync, writeFileSync, mkdtempSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/mcp/write-docs.test.ts :8
import { readFileSync, mkdtempSync, writeFileSync, rmSync } from "node:fs"; - fs (weak) sevenyang129-flyu-f01b0ba/tests/mcp/write-ops.test.ts :8
import { readFileSync, mkdtempSync, writeFileSync, rmSync } from "node:fs";
shell / exec 1
- shell (weak) sevenyang129-flyu-f01b0ba/scripts/visual-regression.ts :13
import { execFileSync } from "node:child_process";
network 4
- net sevenyang129-flyu-f01b0ba/src/main/bridge.ts :11
import { createServer, type Server } from "node:http"; - net sevenyang129-flyu-f01b0ba/src/main/export/chromium-renderer.ts :91
return e.net.fetch(pathToFileURL(filePath).toString()); - net sevenyang129-flyu-f01b0ba/src/shared/ipc-channels.ts :76
/** 触发图片 batch fetch(Main 内部自起后台队列,前端不主动调) */ - net (weak) sevenyang129-flyu-f01b0ba/tests/main/mcp-http.test.ts :13
import type { Server } from "node:http";
database 18
- db sevenyang129-flyu-f01b0ba/src/main/db/connection.ts :8
import Database from "better-sqlite3"; - db sevenyang129-flyu-f01b0ba/src/main/export/cut-cache.ts :12
import type { Database as DB } from "better-sqlite3"; - db sevenyang129-flyu-f01b0ba/src/main/render/dispatch.ts :13
import type { Database as DB } from "better-sqlite3"; - db sevenyang129-flyu-f01b0ba/src/main/render/fig-render-dispatch.ts :11
import type { Database as DB } from "better-sqlite3"; - db sevenyang129-flyu-f01b0ba/src/main/tokens/design-tokens.ts :15
import type { Database as DB } from "better-sqlite3"; - db sevenyang129-flyu-f01b0ba/src/mcp/server.ts :20
import type { Database as BSDatabase } from "better-sqlite3"; - db sevenyang129-flyu-f01b0ba/src/mcp/tools-shared.ts :5
import type { Database as DB } from "better-sqlite3"; - db sevenyang129-flyu-f01b0ba/src/mcp/tools.ts :19
import type { Database as DB } from "better-sqlite3"; - db (weak) sevenyang129-flyu-f01b0ba/tests/export/cut-cache.test.ts :11
import type { Database as BSDatabase } from "better-sqlite3"; - db (weak) sevenyang129-flyu-f01b0ba/tests/import/create-from-html.test.ts :11
import type { Database as BSDatabase } from "better-sqlite3"; - db (weak) sevenyang129-flyu-f01b0ba/tests/import/sketch-reimport.test.ts :14
import type { Database as BSDatabase } from "better-sqlite3"; - db (weak) sevenyang129-flyu-f01b0ba/tests/import/versions.test.ts :13
import type { Database as BSDatabase } from "better-sqlite3"; - db (weak) sevenyang129-flyu-f01b0ba/tests/main/folder-recursive-delete.test.ts :8
import type { Database as BSDatabase } from "better-sqlite3"; - db (weak) sevenyang129-flyu-f01b0ba/tests/main/mcp-http.test.ts :15
import type { Database as BSDatabase } from "better-sqlite3"; - db (weak) sevenyang129-flyu-f01b0ba/tests/mcp/restyle.test.ts :14
import type { Database as BSDatabase } from "better-sqlite3"; - db (weak) sevenyang129-flyu-f01b0ba/tests/mcp/tools.contract.test.ts :11
import type { Database as BSDatabase } from "better-sqlite3"; - db (weak) sevenyang129-flyu-f01b0ba/tests/mcp/write-docs.test.ts :13
import type { Database as BSDatabase } from "better-sqlite3"; - db (weak) sevenyang129-flyu-f01b0ba/tests/mcp/write-ops.test.ts :13
import type { Database as BSDatabase } from "better-sqlite3";
tool registrations 29
- download_assets sevenyang129-flyu-f01b0ba/src/mcp/tools-assets.ts :20
- get_html sevenyang129-flyu-f01b0ba/src/mcp/tools-code.ts :34
- get_code sevenyang129-flyu-f01b0ba/src/mcp/tools-code.ts :80
- export_fig sevenyang129-flyu-f01b0ba/src/mcp/tools-code.ts :187
- get_node_dsl sevenyang129-flyu-f01b0ba/src/mcp/tools-data.ts :25
- get_tokens sevenyang129-flyu-f01b0ba/src/mcp/tools-data.ts :99
- get_styles sevenyang129-flyu-f01b0ba/src/mcp/tools-data.ts :118
- get_design_tokens sevenyang129-flyu-f01b0ba/src/mcp/tools-data.ts :147
- set_token_override sevenyang129-flyu-f01b0ba/src/mcp/tools-data.ts :184
- get_component sevenyang129-flyu-f01b0ba/src/mcp/tools-data.ts :228
- get_component_tokens sevenyang129-flyu-f01b0ba/src/mcp/tools-data.ts :281
- map_components sevenyang129-flyu-f01b0ba/src/mcp/tools-data.ts :326
- list_files sevenyang129-flyu-f01b0ba/src/mcp/tools-nav.ts :13
- list_versions sevenyang129-flyu-f01b0ba/src/mcp/tools-nav.ts :41
- list_pages sevenyang129-flyu-f01b0ba/src/mcp/tools-nav.ts :83
- get_page_outline sevenyang129-flyu-f01b0ba/src/mcp/tools-nav.ts :101
- search_nodes sevenyang129-flyu-f01b0ba/src/mcp/tools-nav.ts :151
- restyle_colors sevenyang129-flyu-f01b0ba/src/mcp/tools-restyle.ts :21
- restyle_text sevenyang129-flyu-f01b0ba/src/mcp/tools-restyle.ts :61
- restyle_layout sevenyang129-flyu-f01b0ba/src/mcp/tools-restyle.ts :112
- get_preview sevenyang129-flyu-f01b0ba/src/mcp/tools-visual.ts :19
- compare_render sevenyang129-flyu-f01b0ba/src/mcp/tools-visual.ts :55
- create_document sevenyang129-flyu-f01b0ba/src/mcp/tools-write.ts :87
- fork_document sevenyang129-flyu-f01b0ba/src/mcp/tools-write.ts :105
- compose_page sevenyang129-flyu-f01b0ba/src/mcp/tools-write.ts :134
- create_from_html sevenyang129-flyu-f01b0ba/src/mcp/tools-write.ts :244
- insert_html sevenyang129-flyu-f01b0ba/src/mcp/tools-write.ts :304
- apply_operations sevenyang129-flyu-f01b0ba/src/mcp/tools-write.ts :363
- rollback sevenyang129-flyu-f01b0ba/src/mcp/tools-write.ts :397
install hooks 1
- postinstall sevenyang129-flyu-f01b0ba/package.json :24
electron-rebuild -f -w better-sqlite3
declared dependencies 40
- @modelcontextprotocol/sdk@^1.29.0
- @ant-design/icons@^6.3.2
- @open-pencil/core@^0.13.2
- better-sqlite3@^11.5.0
- canvaskit-wasm@0.40.0
- electron-log@^5.2.0
- fflate@^0.8.3
- svgpath@^2.6.0
- zod@^4.4.3
- zustand@^5.0.14
- @electron/rebuild@^4.2.0
- @types/better-sqlite3@^7.6.11
- @types/node@^22.10.0
- @types/pngjs@^6.0.5
- @types/react@^18.3.12
- @types/react-dom@^18.3.1
- @vitejs/plugin-react@^4.3.4
- antd@^5.22.0
- electron@^33.2.0
- electron-builder@^26.15.3
- electron-vite@^2.3.0
- esbuild@^0.28.1
- eslint@^10.8.0
- eslint-plugin-react-hooks@^7.1.1
- pixelmatch@^7.2.0
- pngjs@^7.0.0
- react@^18.3.1
- react-dom@^18.3.1
- tsx@^4.23.1
- typescript@^5.7.2
- typescript-eslint@^8.66.0
- vite@^5.4.11
- wasm-bindgen@0.2
- serde@1
- serde-wasm-bindgen@0.6
- serde_json@1
- thiserror@1
- console_error_panic_hook@0.1
- flate2@1
- ruzstd@0.7