dsh-startup-command
Đã xác minh@kagurazakayashi/dsh-startup-command · v1.1.2 · MIT · Giao diện web
A DeepSeek Harness Web plugin that runs a user-defined command after the web profile has started successfully.
Cài đặt
dsh plugin add @kagurazakayashi/dsh-startup-command Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.
Mã nguồn
Thẻ
Readme
dsh-startup-command
在 dsh web 啟動成功後執行使用者自訂命令的 DeepSeek Harness Web 外掛。
當 dsh web 完成啟動(Loader 樹全部穩定、webServer 開始監聽)後,本外掛會執行你在 profile 中配置的自訂命令——例如用特定瀏覽器、帶特定參數開啟 Web GUI。
命令完全由配置(profile 的 cordis.patch.yml 中 dsh-startup-command 的 config 條目,可從網頁設定卡片編輯)決定,不硬編碼在外掛原始碼中。{url} 佔位符會被替換為實際 GUI 地址(http://127.0.0.1:<port>/?token=…),因此即使使用 --port 0 由作業系統分配埠也能正確工作。
截圖
本外掛自己的「插件」頁(側邊欄「外掛」→ 開啟本外掛,設定區位於外掛說明與各項之間)顯示的設定卡片:

功能特性
- 啟動成功後觸發:與內建
web-app的openBrowser走完全相同的生命週期——等整棵 Loader 樹 settle、webServer服務就緒之後才執行,保證拿到的一定是「監聽啟動後」的實際地址。 - 命令完全可配置:外掛自己宣告設定 schema,名稱空間即 profile 入口 id(
dsh-startup-command),command支援單條字串或多條陣列;多條命令按順序依次執行(前一條退出後才執行下一條)。改配置無需動外掛原始碼。 {url}/{home}/{browser}佔位符:{url}執行前替換為http://127.0.0.1:<實際埠>/?token=…(新版 dsh web 需要 token 換取瀏覽器登入 cookie;舊版或無connection服務時自動退回不帶 token 的乾淨 URL),埠自動分配(--port 0)時同樣生效;{home}替換為使用者資料夾;{browser}自動查詢 Chromium 家族瀏覽器(優先Chromium > Chrome > Edge,若預設瀏覽器是其中之一則採用預設瀏覽器)。- 不阻塞 dsh 行程:以
detached方式生成子行程並忽略其標準輸入輸出,命令獨立執行,dsh 退出時不會被拖住。 - 開關與模式:
enabled: false可臨時關閉;shell: true可走系統 shell 執行(預設關閉,直接以參數陣列 spawn,路徑含空格也安全)。 - 配置缺失即跳過:未設定
command時列印警告並跳過,不會靜默失敗或誤執行。 - 網頁設定卡片:在本外掛自己的「插件」頁(側邊欄「外掛」→ 開啟本外掛)提供一張可展開卡片,就地編輯
enabled/shell/command,並提供「新增示例命令」按鈕——彈出說明框介紹示例命令後,一鍵插入自動查詢瀏覽器的現成命令,無需手改 cordis.patch.yml。
掛載方式
本外掛是「雙面」外掛:host 半側(index.js,啟動時執行命令)+ 瀏覽器半側(client.js,在側邊欄「外掛」頁中本外掛自己的頁面註冊設定卡片)。
1. 獲取包
從 npm 安裝(推薦):
npm install @kagurazakayashi/dsh-startup-command
# pnpm 型 profile 可用:
# pnpm add @kagurazakayashi/dsh-startup-command
或從原始碼安裝(本地開發)——將外掛目錄放到 profile 下並軟鏈:
C:\Users\<你>\.dsh\profiles\web\plugins\dsh-startup-command\
{
"dependencies": {
"@kagurazakayashi/dsh-startup-command": "link:plugins/dsh-startup-command"
}
}
然後執行 pnpm install 生成軟鏈;或手動建立
node_modules/@kagurazakayashi/dsh-startup-command 指向
../../plugins/dsh-startup-command 的 junction/symlink。
2. 掛載外掛
在 C:\Users\<你>\.dsh\profiles\web\cordis.patch.yml 中新增 insert 條目(該行只負責掛載;命令本身作為 config 條目在下一節新增):
- insert:
- id: dsh-startup-command
name: '@kagurazakayashi/dsh-startup-command'
inject: [webServer]
3. 配置並重啟
在 C:\Users\<你>\.dsh\profiles\web\cordis.patch.yml 中為 dsh-startup-command 新增 config 條目(見下節),然後重啟 dsh web 生效。重啟後,本外掛自己的「插件」頁(側邊欄「外掛」→ 開啟本外掛)會出現設定卡片,可就地編輯 enabled / shell / command。
在哪裡找到這張卡片(dsh 0.2.x 起外掛配置已不在「設定」對話方塊裡,而在外掛自己的頁面上):
- 在側欄頂部開啟「外掛」頁(四宮格圖示,位於「工作區」之上),不是底部的「設定」。
- 等「已安裝」清單填充出來。該頁需要向 host 查詢外掛清單,冷啟動的瀏覽器會話裡可能要十幾秒;清單未出現時頁面幾乎是空的,並非沒有內容。
- 在「已安裝」裡點本外掛的條目開啟詳情頁——
1.1.1起清單顯示本地化名稱「啟動命令」,舊版本顯示包名@kagurazakayashi/dsh-startup-command;點右側開關或空白處不會進入詳情頁。 - 配置區位於該外掛的說明與包含的元件之間;卡片預設收起,點卡片標題展開。
若啟用了帶背景圖案的皮膚,插件頁的文字會壓在畫面上、對比度偏低(該頁沒有不透明底色,卡片保留自己的底色),臨時切換或停用皮膚會更容易看清。
配置詳解
配置位於 profile 的 cordis.patch.yml(例如 $DSH_HOME/profiles/<profile>/cordis.patch.yml)中 dsh-startup-command 的 config 條目。schema 由外掛自己宣告,名稱空間即本 bundle 的 cordis.patch.yml 宣告的 profile 入口 id dsh-startup-command;未配置時以下 schema 預設值生效:
- id: dsh-startup-command
config:
enabled: true
shell: false
command: '"C:\Program Files\Chromium\Application\chrome.exe" --user-data-dir="..." --app={url}'
支援以下欄位:
command(string | string[]) — 單條命令直接寫字串;多條命令寫成陣列,按順序依次執行,前一條退出後才執行下一條;每條按引號分組成 argv,路徑含空格必須用雙引號包住enabled(boolean, 預設true) — 設為false臨時關閉shell(boolean, 預設false) — 設為true時經系統 shell 執行
command 支援以下佔位符,均在執行前替換:
{url}— 實際 GUI 地址(新版 dsh web 為帶?token=的認證 URL){home}— 當前使用者資料夾(os.homedir()){browser}— 自動查詢的 Chromium 家族瀏覽器可執行檔案路徑。查詢規則:系統預設瀏覽器若是 Chromium / Chrome / Edge 之一,則採用預設瀏覽器;否則按Chromium > Chrome > Edge的優先順序返回第一個已安裝者
網頁設定卡片上的「新增示例命令」按鈕會先彈出說明框介紹示例命令,確認後再追加一條使用 {browser}、{home}、{url} 的現成命令;查詢結果來自 host 上只讀路由 GET /dsh-startup-command/browser,卡片掛載時讀取一次;若未找到 Chromium / Chrome / Edge,則會提示「無法生成示例命令」並說明原因。
使用示例
用 Chrome 以獨立配置目錄、快取目錄、仿 APP 視窗開啟 GUI,不顯示歡迎畫面、不載入任何擴充套件:
- id: dsh-startup-command
config:
command: '"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="D:\dsh-chrome-profile" --disk-cache-dir="D:\dsh-chrome-cache" --app={url} --no-first-run --disable-extensions'
各參數含義:
--app={url}— 仿 APP 視窗(應用模式,無位址列/工具欄)--no-first-run— 不顯示首次執行歡迎畫面--disable-extensions— 不載入任何擴充套件--user-data-dir=<路徑>— 指定配置(profile)目錄--disk-cache-dir=<路徑>— 指定快取目錄
注:使用獨立 --user-data-dir 可避免與已執行的 Chrome 例項衝突(否則 --app 會被已有例項接管、開關不生效)。
自動查詢 Chromium / Chrome / Edge 並帶上上述參數(等效於網頁卡片上的「新增示例命令」按鈕):
- id: dsh-startup-command
config:
command: '"{browser}" --user-data-dir="{home}/.dsh/dsh-browser-data" --disk-cache-dir="{home}/.dsh/dsh-browser-cache" --app={url} --no-first-run --disable-extensions'
多條命令按順序依次執行(前一條退出後才執行下一條):
- id: dsh-startup-command
config:
command:
- 'cmd /c ping -n 3 127.0.0.1' # 先做點準備工作(此例約 2 秒後退出)
- '"C:\Program Files\Google\Chrome\Application\chrome.exe" --app={url}'
開啟任意程式(例如記事本):
- id: dsh-startup-command
config:
command: 'C:\Windows\System32\notepad.exe'
與內建「開啟預設瀏覽器」的關係
dsh web 內建會在啟動成功後用 open 包開啟系統預設瀏覽器(web-runtime 行的 openBrowser)。如果你用本外掛指定瀏覽器開啟,通常會希望關掉內建行為,避免雙重開啟。在 cordis.patch.yml 中覆蓋該行(patch 會整行替換 config,必須重述所有鍵):
- id: web-runtime
config:
openBrowser: false
printUrl: true
surfaceContext: true
trustedHosts: !!js ctx.webStartup.trustedHosts
如果不需要禁用內建行為(例如想讓預設瀏覽器與自訂命令共存),去掉這段即可。
觸發時序
dsh web 啟動
│
▼
Loader 樹全部 settle(webServer 開始監聽)
│
▼
dsh-startup-command 執行:{url} 替換 → spawn(命令)
│
▼
子行程 detached 執行,dsh 持續服務
解除安裝
從 profile 的 cordis.patch.yml 中刪除 dsh-startup-command 的 insert 條目(以及不再需要的 web-runtime 覆蓋)與該檔案中 id: dsh-startup-command 的 config: 條目,刪除外掛目錄,重啟 dsh web。該 config: 條目是本外掛唯一的持久痕跡,刪掉它即無殘留。
注意事項
- 需重啟生效:執行中的行程不會載入新的 patch 行,修改配置後必須重啟
dsh web。 - ESM 目錄匯入限制:
name必須指向index.js檔案而非目錄,否則 Node 報ERR_UNSUPPORTED_DIR_IMPORT。 - 命令解析:每條命令字串按「雙引號分組」拆成 argv;路徑含空格但未加引號時會被錯誤拆分。
- 多命令序列:多條命令按順序執行,前一條退出後才啟動下一條;如果某條是長駐行程(如瀏覽器),排在它後面的命令會一直等待——請把長駐命令放在最後。
- 未配置即跳過:
command未設定時列印警告並跳過,不會執行任何東西。 - 不會等待整個序列完成:外掛以
detached方式啟動每條命令,dsh 退出時未啟動的後續命令不再執行,已啟動的獨立行程繼續執行;如需確認命令已執行,請檢視 dsh 啟動紀錄中的dsh-startup-command:行。
版本相容性
本外掛適配的 DSH 版本與執行環境:
| 專案 | 版本 / 說明 |
|---|---|
| 適配的 DSH core | 最低 0.2.0-rc.1(engines.dsh;@deepseek-ai/dsh-settings 與 @deepseek-ai/dsh-host-webserver 兩個 peer 為 >=0.2.0-rc.1 <0.3.0-0);執行實測於 0.2.0-rc.2 |
| 外掛版本 | 1.1.2 |
| 設定 schema | 外掛自己的 schemastery Config,.volatile() 欄位為 enabled、command(字串或字串陣列)、shell;不再有 settings.register / settings.get |
| 設定名稱空間 | 本 bundle 的 cordis.patch.yml 宣告的 profile 入口 id dsh-startup-command;值持久化在 profile 的 cordis.patch.yml(例如 $DSH_HOME/profiles/<profile>/cordis.patch.yml),不在 $DSH_HOME/settings.yaml |
| 設定卡片席位 | plugins.bundle.config,以 npm 包名 @kagurazakayashi/dsh-startup-command 為鍵,由 @deepseek-ai/dsh-client-ui-plugin-manager 提供;卡片透過 ctx.configForms.get("dsh-startup-command")(getSnapshot / subscribe / set / unset)讀寫 |
| 客戶端注入依賴 | @deepseek-ai/dsh-client-locale、@deepseek-ai/dsh-client-ui-plugin-manager、@deepseek-ai/dsh-client-ui-settings |
| 瀏覽器資訊路由 | host 上只讀的 GET /dsh-startup-command/browser;非 GET 傳回 405 METHOD_NOT_ALLOWED;路由不存在時卡片退回「未找到」 |
| 外掛版本 | 可用 core 版本 | 依據 |
|---|---|---|
1.1.2 |
>= 0.2.0-rc.1 < 0.3.0-0 |
新增 screenshots.json(市場截圖清單),README 改為引用單一 screenshot.png、語言列與圖示改為原生 Markdown;功能與設定機制與 1.1.1 相同 |
1.1.1 |
>= 0.2.0-rc.1 < 0.3.0-0 |
新增外掛展示元資訊:locale/{en,zh}.json 提供本地化的外掛名與簡介,icon.svg 提供外掛頁圖示;功能與設定機制與 1.1.0 相同 |
1.1.0 |
>= 0.2.0-rc.1 < 0.3.0-0 |
適配 dsh 0.2.x:宣告式 Config、configForms(取代已被移除的 settingsScope)、本外掛自己「外掛」頁上的 plugins.bundle.config 卡片,以及取代主機注入 schema 欄位的瀏覽器資訊路由 |
1.0.1 |
僅 0.1.x |
透過 settings.register 註冊 schema、以 settings.get 讀取;配置存放於 $DSH_HOME/settings.yaml 的 dsh-startup-command: 段;卡片經 settingsScope 服務註冊進 settings.plugin.item 席位 |
1.0.0 |
僅 0.1.x |
新增示例命令說明框與多條命令編輯卡片;設定機制同 0.1.x |
0.1.0 |
僅 0.1.x |
首個版本:settings.yaml 中的 dsh-startup-command 設定 schema 與網頁設定卡片 |
兩個區間沒有重疊:dsh 0.2.0 移除了 0.1.x 的 settings API,因此 1.1.0 需要 0.2.x,而 1.0.1 及更早版本無法在 0.2.x 上執行。
從 1.0.1(dsh 0.1.x)遷移:dsh 0.2.0 只會為「匯入時已存在於組合中的 profile 入口 id」匯入舊的 $DSH_HOME/settings.yaml 段(該匯入是一次性且已執行完畢)。因此若 settings.yaml.imported 中還留著 dsh-startup-command: 段,必須按上文「配置詳解」中的 YAML 片段手工搬進 profile 的 cordis.patch.yml。
License
MIT — 見 LICENSE,版權歸 KagurazakaYashi(KagurazakaMiyabi) 所有。