OpenPencil 设计预览与编辑插件。
安装
# npm 包(预构建)
dsh plugin --profile web add @zseven-w/dsh-openpencil
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:ZSeven-W/dsh-openpencil
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
為什麼選擇 DSH OpenPencil
DSH OpenPencil 將 DeepSeek Harness 與 OpenPencil 串接起來,讓代理(Agent)直接驅動一個真實、可編輯、可互動的設計畫布,而不是回傳一張生成的圖片。
🖼️ 精確多影格預覽
所安裝的 OpenPencil 無頭匯出器會產生忠於設計的預覽:第一個頂層影格以大型、可安全重播的 PNG 呈現,另附水平捲動的縮圖列,可點選選取,並為多影格文件提供上一張/下一張導覽。
🗺️ 互動式畫布
「開啟互動式畫布」會以惰性載入方式掛載唯讀的 OpenPencil Web SDK,支援平移、縮放與適配——不必離開對話,即可檢視任何頁面、巢狀節點或未啟用的頁面。
✏️ 受管編輯器
當 editable: true 時,編輯動作會在可調整大小的右側工作台開啟受管的 OpenPencil 編輯器,並提供全螢幕選項——包含選取、圖層、屬性、繪圖工具、復原/重做,以及明確的儲存語意。
🤖 代理原生設計工具
五個直接操作畫布的工具,加上六個 openpencil_pipeline_* 工具,讓代理能透過受管的 OpenPencil 執行期建立、檢查、細化、發布、修改並讀取真實畫布。
🔐 能力門控授權
圖片與文件授權是經過簽署、綁定雜湊的能力。瀏覽器後設資料絕不會暴露任意的宿主路徑,而簽署過的預覽/編輯器能力也絕不會進入標準工具結果或模型上下文。
⚡ 交易性安全
完整管線中的文件會留在私有、未發布的草稿內,直到通過全部原生與 DSH 品質門檻。發布絕不會覆寫既有路徑,中止或批次失敗也不會留下空的目標檔案。
🌍 延續 DSH 的外觀與操作感受
工具卡片與受管編輯器會沿用 DSH 的中/英文語系與淺色/深色主題,無須重新載入編輯階段。
🎯 一套完整的工作流程
「需求 → 側邊欄中的 private live canvas → 兩次向使用者展示精確 PNG 的語意化批次 → 原生/DSH 確定性品質門檻 → 原子發布」——全程在 DSH 內完成閉環。
安裝到 DSH
DSH 是獨立的套件。若尚未安裝,先裝一次:
npm install -g @deepseek-ai/dsh@latest
接著把外掛裝進某個 profile 並啟動 Web 應用:
dsh plugin --profile web add @zseven-w/dsh-openpencil@next
dsh web
本機開發時,先建置目前的 checkout,再將其絕對路徑連結至 Web profile,然後完整重新啟動 DSH:
pnpm run build
dsh plugin --profile web add link:/absolute/path/to/dsh-openpencil
dsh web
link: 相依項目會讓後續重新建置的產物直接從此 checkout 生效;但替換 profile 相依項目後必須完整重新啟動 DSH,因為隨附的 Web profile 預設不會熱重載宿主套件。
不想全域安裝 DSH?用 pnpm dlx 執行同樣的兩步:
pnpm dlx --package=@deepseek-ai/dsh@latest dsh plugin --profile web add @zseven-w/dsh-openpencil@next
pnpm dlx --package=@deepseek-ai/dsh@latest dsh web
OpenPencil 外掛程式是公開的,不需要 npm token。如果 DSH 預發行版本身需要 registry 驗證,請將該憑證存放在 checkout 目錄以外的使用者層級或暫時性 npm 設定中。本儲存庫刻意不包含任何 registry 憑證。
設計工具
| 工具 | 功能說明 |
|---|---|
openpencil_new |
適合簡單工作的相容快速路徑:執行一份交易性 QuickJS batch_design 指令碼,以「僅在不存在時建立」語意發布並回傳可編輯呈現。正式設計應優先使用下方完整管線。 |
openpencil_pipeline_begin |
啟動僅屬於目前工作階段的私有草稿與唯一 root,立即在側邊欄開啟同一個 live canvas;目標 .op 仍維持未發布。 |
openpencil_pipeline_context |
只有 begin contract 確實缺少某項 guideline、style、theme 或 UI kit 細節時,才定向載入一次;不是啟動時的 refresh loop。 |
openpencil_pipeline_batch |
最多執行兩段直接 QuickJS generation script。每次成功交易只會嘗試向使用者展示精確 PNG;工具回傳後立即遵循 next。 |
openpencil_pipeline_inspect |
僅在使用者明確要求時提供手動診斷;普通生成不會把它當作預覽或模型看圖步驟。 |
openpencil_pipeline_finish |
執行原生與 DSH 的確定性門檻,渲染最終化後的精確 PNG,再透過 createIfAbsent 原子發布。只有結果同時為 needs_correction、canContinue: true、含完整非空 repairTargets 且 omitted: 0 時,才允許一次純 U(...) 修復與最後一次 finish;其他未發布結果一律終止。 |
openpencil_pipeline_abort |
捨棄未發布草稿,不建立目標檔案。 |
openpencil_create |
套用交易性的 batch_design 程式,在既有的即時畫布上產生或重構節點。 |
openpencil_edit |
修改明確指定的節點,或使用者選取的單一節點。 |
openpencil_render |
建立不可變、以內容定址的 .op 快照,並渲染作用中頁面上的所有頂層影格——可選的 scale 與 editable。 |
openpencil_selection |
讀取即時編輯器畫布中實際選取的節點。 |
代理設計工作流程
普通生成採用固定短路徑:openpencil_pipeline_begin → 兩次直接 QuickJS openpencil_pipeline_batch → 一次 openpencil_pipeline_finish。Begin 會建立唯一 root,並立即在側邊欄開啟私有 live canvas;發布成功前,要求的工作區路徑並不存在。每次 begin 或 batch 成功後,都必須不加敘述、規劃、比較、檢查或無關工具呼叫地立即執行下一步。除非使用者明確要求多圖,整份設計預設只用一張 image;每個 Hero/Product/Art/Media frame 只能有一個主視覺,禁止 image 與佔位 icon 並存。
兩次成功 batch 都會嘗試向使用者展示精確 PNG 預覽。工具回傳後立即遵循 next。若 next 回報 previewUnavailable,指令碼已提交到 live canvas:禁止重跑 batch,也不要呼叫 openpencil_pipeline_inspect 或 read_image。openpencil_pipeline_inspect 只用於使用者明確要求的診斷。
Finish 會執行 OpenPencil 原生最終化、lint、對比與版面檢查,以及 DSH 確定性品質門檻,並在同一次健康呼叫中渲染精確最終 PNG、原子發布目標。只有結果同時包含 stage: "needs_correction"、canContinue: true、完整非空 repairTargets、omitted: 0,且每個 target 都有 operation: "U"、精確非空 nodeId 與非空 patch 時,才允許修復:一次把所有 target 套用到唯一一段純 U-only batch,然後不加敘述地只再呼叫一次 finish。其他未發布結果、error 或 canContinue: false 一律終止:只回報一次,禁止 retry、inspect、讀取 image/context、abort 或另起 draft。門檻失敗或呼叫 openpencil_pipeline_abort 時不會建立目標。published result 中的精確最終 PNG 與 live editor 已是權威結果,應直接回傳並結束。側邊欄只在 idle 時自動開啟,並保留 編輯畫布 供明確切換。
在同一個持續執行的 DSH 服務內,切換瀏覽器或重新載入後,經過嚴格解析的 openpencil_new 或 openpencil_pipeline_finish 持久化 publication 可以還原為精確 PNG 與明確的 編輯畫布 動作。歷史卡片絕不會自動開啟側邊欄,必須由使用者點擊該動作。一般歷史 openpencil_render 一律維持唯讀,非 loopback 連線也絕不會取得編輯器授權。
隨套件提供的 openpencil-design skill 仍負責指令碼與品質指引,受管執行期也不依賴桌面版二進位檔。openpencil_new 繼續作為相容的單批次快速路徑,但正式設計生成應優先使用完整管線。
只有在處理既有的即時畫布時,才使用 openpencil_create 與 openpencil_edit。它們的編輯內容在執行編輯器的儲存動作之前都會維持未儲存狀態。
Web 檢視器資源
DSH 僅為用戶端外掛程式提供 client.js,因此 OpenPencil ESM SDK、其 WASM 與 CanvasKit 會以明確的同源資源方式進行暫存:
pnpm run sync:viewer-assets
同步指令優先使用同層的 ../openpencil checkout(本機開發),並在無法取得時退回使用 vendored 的 vendor/openpencil submodule(CI 與全新 clone)。可用 OPENPENCIL_ROOT 或 --openpencil-root 覆寫。完整的預先建置資源目錄可透過 DSHPLUGIN_OPENPENCIL_VIEWER_SOURCE 選取。執行期的查詢路徑則可用 DSHPLUGIN_OPENPENCIL_VIEWER_ASSET_DIR 覆寫。
檢視器資源會在使用者開啟畫布之後才進行惰性載入。如果資源缺失或無效,PNG 預覽仍然可用,且不會宣傳畫布按鈕。
受管編輯器
可編輯的階段使用 OpenPencil 的受管 Web 宿主——與 op-vscode 所使用的架構相同。外掛程式只在經過授權的使用者動作之後才會啟動宿主,將守護程式的 token 保存在記憶體中,驗證 iframe 的來源與 origin,並在編輯階段結束時關閉程序。編輯器介面會逐步選定:當宿主宣告該接縫時使用原生的 Tool 詳細資訊,否則使用外掛程式具備調整大小與全螢幕控制項的右側工作台。
啟動流程採用可安全因應慢速掛載的 listening handshake:只有在隨套件宿主回報已綁定位址後才開始就緒探測。無須安裝桌面版 OpenPencil。
發行版提供六個原生平台套件目標:darwin-arm64、darwin-x64、linux-arm64、linux-x64、win32-arm64 與 win32-x64;兩個 Linux 套件皆以 glibc 為目標。根套件將所有平台套件宣告為精確版本的 optionalDependencies,由 npm 依 OS 與 CPU 選用相符的套件。每個平台套件都會將 op-host-web-server、編輯器 Web 套件與 CanvasKit 作為一組彼此相符的原子執行期一併提供。因此,受管編輯器預設不依賴 /Applications/OpenPencil.app、PATH 中的 openpencil-desktop,也不依賴 OpenPencil 原始碼 checkout。
如果在畫布仍有未儲存變更時,DSH 重新載入或卸載外掛程式,宿主會保留一份不透明的本機復原草稿,最長七天。重新開啟相同來源時,會先詢問再將草稿還原到即時畫布;在使用者明確儲存之前,復原絕不會覆寫 .op 檔案。
正式六平台套件會在受保護的 release 建置中注入並驗證中國區/全球區協作 bootstrap 端點,通過驗證後才發佈。未注入該設定的本機自建版本,可在啟動 DSH 前以 OPENPENCIL_COLLAB_BOOTSTRAP_URL=https://<your-host>/api/v1/collaboration/bootstrap 覆寫;該值必須使用 https,且路徑必須嚴格為 /api/v1/collaboration/bootstrap。
跨裝置畫布同步要求 PC/DSH 原生執行期與行動端 App 都更新至包含目前協作佇列修正的同一 OpenPencil 發行線。舊版行動端與新版 PC 執行期混用時,仍可能只看得到遠端游標,卻收不到畫布提交。
在此儲存庫中開發時,啟動 DSH 前必須依序建置編輯器 Web bundle、建置原生宿主,再暫存這套彼此相符的執行期。
pnpm run build:editor-web 會執行 OpenPencil 正式支援的 WASM bundle gate。它需要 Bash、具備 wasm32-unknown-unknown target 的 Cargo/Rust、wasm-bindgen CLI、Binaryen 的 wasm-opt、Node.js 與 gzip;CanvasKit 不需要 EMSDK。Web 建置不使用協作 bootstrap 建置變數。執行 pnpm run build:editor-runtime 前必須同時設定 OPENPENCIL_BUILD_COLLAB_BOOTSTRAP_URL_CN 與 OPENPENCIL_BUILD_COLLAB_BOOTSTRAP_URL_GLOBAL;它們只供原生 Cargo 建置使用,缺少任一變數都會 fail closed。兩項建置都成功後,再執行最後一個命令暫存執行期。
pnpm run build:editor-web
pnpm run build:editor-runtime
pnpm run stage:editor-runtime
若要明確覆寫執行期,下列三項必須作為完整且彼此相符的一組同時提供:
DSHPLUGIN_OPENPENCIL_EDITOR_BINARY:用於op-host-web-server;DSHPLUGIN_OPENPENCIL_EDITOR_WEB_BUNDLE_DIR:用於已建置的編輯器 Web 套件;DSHPLUGIN_OPENPENCIL_EDITOR_CANVASKIT_DIR:用於 CanvasKit 資源。
只提供其中一部分屬於無效設定;外掛程式不會將自訂路徑與隨套件提供的執行期資源混合使用。
儲存採用樂觀的來源雜湊、原子替換與後繼(successor)能力。如果來源在編輯器之外發生變更,外掛程式會回報衝突,而不是覆寫它。
結果後設資料
模型可見的結果維持為純 JSON。僅供瀏覽器使用的 presentationMeta.$dshOpenPencil 承載下列附加授權:
image:PNG 路徑、預覽/下載 URL,以及真實的寬/高;frames:依作用中頁面順序排列、每個精確渲染的頂層影格,包含其節點 id/名稱/索引與簽署的 PNG URL;document:來源動作路徑,加上不可變的快照 URL、位元組數與 SHA-256;viewer:在資源路由已掛接時提供帶版本修訂的 SDK/WASM/CanvasKit URL;editor:在editable: true獲得授權時提供具範疇的啟動/重新整理能力。
結果也會記錄 renderer、rendererBinary、fidelity 與任何警告。既有、僅含 PNG 的 schema-v1 訊息仍可正常渲染。
DSH 0.1.1-rc.2 不會為巢狀於 PTC/Code Mode 之下的工具持久化瀏覽器呈現後設資料。外掛程式會透過同源、綁定 session 的端點復原該 UI-only 投影:瀏覽器只會傳送 session id、call id 與不可變的文件 SHA-256,而宿主則從持久的 DSH session 記錄中解析權威結果,並僅使用短暫的處理程序內標記來授權近期的即時編輯。簽署過的預覽/編輯器能力絕不會進入標準工具結果或模型上下文。一般 openpencil_render 的持久歷史一律唯讀。經過嚴格解析的 openpencil_new 或 openpencil_pipeline_finish 持久化 publication,只有在 loopback 連線且使用者明確點擊後才可能取得編輯器授權;自動開啟側邊欄僅保留給近期、可信的即時結果。
為控制重播範圍,巢狀後設資料的復原最多接受 128 個頂層影格;更大的 Code Mode 結果仍可透過其標準 JSON 備援取得。
目前的限制
- 對既有畫布進行後續編輯,需要一個已開啟的受管編輯器。在使用者執行其儲存動作之前,變更都會維持未儲存狀態。
- 輕量的 Web SDK 畫布為唯讀;完整的編輯功能使用獨立的受管編輯器介面。在 DSH
0.1.1-rc.2上,外掛程式使用具全螢幕選項的可調整大小右側工作台。 - 精確畫廊涵蓋作用中頁面上的頂層影格;互動式畫布仍是檢視未啟用頁面與巢狀節點的方式。
- 渲染與快照快取仍需要產品層級的保留策略。
專案結構
dsh-openpencil/
├── src/ Plugin sources (TypeScript)
│ ├── index.ts Host plugin entry — Cordis service, tools, assets
│ ├── tool.ts / design-tools.ts / new-tool.ts Host-side design tools
│ ├── renderer.ts Exact OpenPencil renderer + Jian fallback
│ ├── editor-host.ts / editor-recovery.ts Managed editor lifecycle + drafts
│ ├── viewer-assets.ts Web SDK / WASM / CanvasKit asset staging
│ ├── mcp-client.ts OpenPencil MCP connection
│ └── client/ Browser client — React workbench, gallery, selection dock
├── lib/ Compiled output (published to npm)
├── scripts/ Build helpers — viewer asset sync, client build, host tests
├── tests/ Node test suites (client, host API, MCP, viewer assets)
├── docs/images/ Documentation screenshots
├── vendor/openpencil/ OpenPencil checkout (git submodule — viewer asset source)
├── cordis.patch.yml DSH bundle patch that mounts the plugin
├── tsconfig.json Host / Node TypeScript config
└── tsconfig.client.json Browser client TypeScript config
建置與驗證
pnpm run sync:viewer-assets
pnpm run build
pnpm run test:viewer-assets
pnpm run test:client
pnpm run test:host /absolute/path/to/design.op 375 1091
建置需要 Node 24.11 或更新版本,以及 pnpm。DSH 的 host/client 套件是由目標 DSH profile 提供的對等相依(peer dependency)。建置工具會從本機開發相依、目前連結的 DSH checkout 或已安裝的 DSH 來源套件中解析;DSH_SOURCE_ROOT 可明確指定來源 checkout。當該環境為另行佈建時,lockfile 會固定獨立的公開建置工具。
若為私有的 DSH 預發行版,請將核發的 npm 憑證存放在本儲存庫之外(例如使用者層級或暫時性的 .npmrc),並直接執行要求的版本:
pnpm dlx --package=@deepseek-ai/dsh@latest dsh web
絕對不要提交 .npmrc、NPM_TOKEN 或複製的 registry 憑證。本儲存庫預設會忽略本機的 npm 設定。
test:host 會執行一次真實的精確渲染,驗證 PNG IHDR 幾何與 SHA-256,透過 HTTP 測試不可變的圖片/文件能力,並檢查檢視器資源是否可被授權。預期的尺寸會依測試樣本(fixture)而異。
生態系
DSH OpenPencil 是 OpenPencil 的 DeepSeek Harness 外掛程式——OpenPencil 是全球第一款開源的 AI 原生向量設計工具——同時也是 ZSeven-W 這個純 Rust、AI 原生工具家族的一份子。
| 專案 | 說明 |
|---|---|
| OpenPencil | 本外掛程式所驅動的設計工具——提示詞到畫布的生成、並行代理團隊、以設計即程式碼(design-as-code)呈現的 .op 檔案,以及內建的 MCP 伺服器。這裡的精確預覽、互動式畫布與受管編輯器皆由 OpenPencil 本身驅動。 |
| agent-rs | 純 Rust 的非同步執行期,用於交付 LLM 代理——多供應商、端到端具備工具能力、結構化權限、真正的 MCP、零 unsafe。為 OpenPencil 內建的代理執行期提供動力。 |
| jian | 純 Rust、GPU-Skia 的 UI 框架——將 widgets、版面配置、事件與熱重載整合在單一技術棧中。是 OpenPencil 的 UI 框架,也是此外掛程式備援渲染器的來源。 |
| Zode | 開源、AI 原生的終端機程式設計助手——讀取你的程式碼、執行指令,並透過 MCP 驅動 OpenPencil。 |
| noema | 為程式設計代理打造、以本機為優先的非向量記憶系統——以可檢視的檔案形式提供持久記憶,可跨執行期運作。 |
| openpencil-skill | 教導 AI 代理如何使用 op 進行設計的 LLM skill 外掛程式——是此 DSH 外掛程式的夥伴專案。 |
同系列的 DSH 外掛:
- DSH Android — 在對話中執行 Android 模擬器或 USB 實機,全部由 adb 驅動
- DSH Crew — 從 Claude Code / Codex 把任務派給 DSH agent
- DSH iOS — 在對話中執行 iOS 模擬器與 USB 連接的實機
- DSH Noema — DSH 的長期記憶
貢獻
歡迎貢獻!Fork 並 clone、建立分支、執行 pnpm run build 與測試套件、使用 Conventional Commits 提交,並針對 main 開啟 PR。
社群
認可社群:LINUX DO
授權
MIT — 版權所有(c)2026 ZSeven-W
第三方元件列於 THIRD_PARTY_NOTICES.md。
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-task-board★ 8076
侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
zhu1090093659/dsh-web#packages/dsh-web-all★ 8076
DSH Web UI 插件与皮肤合集:任务看板、git 图、右侧面板、远程移动端 UI、桌宠、实时 token 统计与皮肤中心。
omdsh-dev/DSH-better-sidebar★ 3828
侧边栏完整工作台:内置文件渲染编辑、终端、Git 与子代理,支持三方插件注册新 Tab。
ccch1mneyyy/dsh-TUI★ 3661
Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 3277
右下角常驻的小鲸鱼挂件:余额、今日已用与每轮对话消耗(含峰谷价),余额预警与今日预算的泡泡内容都可编辑;泡泡点击序列模块化自定义,支持并列加权 A/B、随机台词与随机图片;内置 30+ 厂商模板(OpenAI / OpenRouter / Kimi / 硅基流动 / 方舟 / 智谱 / MiniMax 等),按模型查余额与订阅额度;另有任务结束音效、导入音频、自定义角色与资源管理。数据全在本机,无遥测。
Devin-AXIS/deepseek-design#deepseek-idesign★ 1628
可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。