外掛中心
外掛中心讓你不必離開編輯器就能安裝外掛。它和 cdui plugin install 是同一套安裝流程的兩個入口,所以一次安裝會做哪些事、什麼算失敗、失敗叫什麼名字,兩邊都是同一份答案。
打開它有兩條路:側邊欄的自訂與外掛分頁裡,外掛區段標題上有一顆按鈕,寫著外掛中心...;或是工具列 > 設定 > 外掛 > 開啟。旁邊的套件中心是另一個視窗、管的是另一件事——模型檔與 Python 套件,不是節點;見選用套件包。
清單
視窗分成三塊:最上面是輸入 GitHub 來源的欄位,下面是外掛清單,右邊那一欄則回報目前進行中的安裝。
全部、已安裝、可安裝用來篩選清單。「可安裝」是這台機器上沒有的——你從沒裝過的,以及你解除安裝掉的。其餘都算在「已安裝」裡,包括你停用掉的,以及安裝還在跑的。
每張卡片會寫上外掛名稱、一顆狀態標籤(已安裝、停用、未安裝、已移除、安裝中或檔案遺失)與版本,接著是說明文字,然後是兩行小字。第一行說它從哪裡來:內建、官方或本機連結,抓取來源的 owner/repo 連結,以及它鎖定的那個 commit。第二行說它帶來什麼:涵蓋哪些章節、註冊幾個節點,以及安裝它會一併裝進來的 Python 套件。按鈕排在最後,而且只要這一列有任何動作在進行中,全部按鈕都會關掉。
安裝內建套件包
這個版本本身就帶了五個套件包:edu、foundations、deep、rl、stats。找到那一列,按安裝即可。內建套件包不是第三方,所以沒有東西要你同意,也沒有第二顆按鈕要按。
工作結束後,面板會重新讀取型錄、節點定義與外掛介面,所以新節點會直接出現在節點面板裡,不需要重新整理頁面。它們的名稱都帶著所屬套件包——edu:FilterRows、foundations:Edu-KNN——所以在節點面板搜尋套件包 id 就找得到。
從 GitHub 安裝
最上面的欄位接受 owner/repo、owner/repo@ref(標籤、分支或 commit)或 GitHub URL。檢視只會讀取某一個確定 commit 上的 manifest,不會安裝任何東西。回來的是清單最上方的一張卡片,之後的安裝是對這張卡片動作,而不是對分支一分鐘後的內容動作。
卡片會寫出外掛名稱、作者、版本與 commit,以及它會安裝的 Python 套件。下面則是它要求的東西:
- 這個外掛要求: 每個宣告的能力各一行——
network、filesystem或process-env——每一行都說明授予它的代價是什麼。清單下面那句話才是重點:「授予是一種聲明,不是沙箱:外掛可使用這些模組,之後不會再詢問。」勾選框寫的是同意授予這些能力。 - 我信任這位作者。允許使用:…… 是第二個勾選框,對應這個外掛要求關閉安全掃描的那些模組。這是對作者的判斷,不是對某個功能的判斷。
- 外掛帶有介面時,卡片上會多出一則警告:「包含會在編輯器中以完整權限執行的 JavaScript。」瀏覽器端的程式碼不在上面兩個勾選框的範圍內。
manifest 提出的每個勾選框都勾完之前,安裝都是不能按的;取消則把這次檢視丟掉。已經裝過的外掛,按鈕會變成重新安裝,意思是用這一版取代現有的安裝。
啟用、停用、更新、解除安裝
停用會把外掛留在磁碟上,只把它的節點從註冊表拿掉;啟用再放回去。兩者都不下載任何東西。
更新只會出現在從儲存庫抓來的外掛上,而且有三種答案:已經是最新、新版本比目前安裝的版本多要求了什麼(於是打開一張檢視卡片,上面列出多出來的能力),或是沒有新東西需要同意、工作直接開始。內建套件包沒有更新按鈕:它隨版本發佈,用 cdui update 更新。用 cdui plugin link 連結的目錄也沒有,因為它本來就是你磁碟上的內容。
解除安裝會先問一次,而且那句話會寫出外掛名稱與移除它的兩個後果:使用它節點的圖將無法執行,以及它安裝的 Python 套件會保留。下載來的外掛,目錄會被刪掉;內建套件包則保留檔案並記成「已移除」,在你再次按名稱安裝之前都不會回來。這裡不會移除任何外掛的 Python 套件:伺服器不能把自己正在使用的套件從執行中的直譯器底下抽掉。解除安裝完成後,右邊那一欄會列出留下來的套件,以及停掉伺服器後用來移除它們的那行 uv pip uninstall 指令。
觀看安裝進度
右邊那一欄會寫出外掛名稱、目前在哪個步驟(正在解析來源、正在下載、正在解壓縮、正在檢查程式碼、正在安裝 Python 套件、正在複製檔案、正在寫入安裝紀錄、正在載入節點),以及整個工作的進度,下面則是安裝程式自己的紀錄。取消安裝會停掉它;關掉視窗則不會:工作屬於伺服器,所以重新打開面板、換一個分頁,或重新整理頁面,都會接回同一個工作。這個面板和套件中心加起來,同一時間只跑一個安裝。
失敗的工作會在「或在終端機安裝:」底下,提供能重現這一列的那行 cdui plugin install 指令。見外掛指令。
從網路安裝
檢視、安裝、更新、取消與解除安裝,在伺服器不是綁在回送(loopback)位址時一律拒絕,這是在每個寫入動作本來就需要的工作階段 token 之外再加一層:這幾件事決定的是這台機器會匯入哪些程式碼。把編輯器開在區域網路位址上時,這些按鈕在所有瀏覽器裡都是關的,包括伺服器本機那一個,底部會寫著「只能在執行伺服器的那台電腦上安裝。」刻意對區域網路提供服務的教室或實驗室,可以用 CODEFYUI_ALLOW_REMOTE_PLUGIN_INSTALL=1 重新開放。啟用與停用不受這道限制——它們處理的是這台機器已經有、而且你已經同意過的程式碼——所以遠端瀏覽器只要有 token,仍然可以把外掛開開關關。
檔案放在哪裡
下載來的外掛放在 <USER_DATA>/plugins/<id>/,而 <USER_DATA>/plugins/installed.json 記錄每一次安裝,包含你授予的能力,所以下次 cdui start 還找得到它們。<USER_DATA> 在 Windows 是 %LOCALAPPDATA%\codefyui,在 macOS 是 ~/Library/Application Support/codefyui,在 Linux 是 ~/.local/share/codefyui;有設 CODEFYUI_USER_DATA_DIR 時就是那個目錄。內建套件包不會被複製到任何地方:它們放在版本內的 plugins/<id>/,就地啟用,所以鎖定檔對它們記的是一筆紀錄,不是一份副本。
疑難排解
- 「請輸入內建套件名稱、
owner/repo[@ref]或 GitHub URL。」 這個字串連伺服器都沒問就被擋下來了,因為它不是一個來源:這個欄位接受的是這個版本內建的套件包名稱、帶有選用@ref的owner/repo,或 GitHub URL。如果打的是一個這個版本不認得的單字,則是由伺服器拒絕,並在下面印出哪些名稱才有效。 - 「安裝在改動任何東西前停住了」。 外掛的 Python 套件一律以「只新增」的方式安裝,並套用一份把伺服器已載入的每個套件都鎖住的約束檔,所以外掛要求的任何東西都不會取代你這次工作階段正在使用的版本。當這件事沒辦法在執行中完成時,工作會在複製檔案與寫入紀錄之前就停下來——外掛沒有被安裝,磁碟上也沒有任何改變。停掉伺服器,執行面板印出的那行
uv pip install,再安裝一次。對同一台執行中的伺服器再試一次,結果會完全一樣。 - 解除安裝時說目錄還在。 有東西開著裡面的檔案,這在 Windows 上是最常見的原因。這種情況什麼都沒被移除:鎖定檔的紀錄還在,外掛也還是安裝狀態。關掉正在使用那個目錄的程式,或停掉伺服器,再解除安裝一次。
- 檔案遺失。 鎖定檔裡有這個外掛,但它的目錄不見了。安裝會重新抓一次;解除安裝則清掉那筆紀錄。
- 「已達 GitHub 請求上限」。 未帶憑證的 GitHub 請求是按來源位址計算的,一整間教室共用一個 NAT 出口,一個上午就可能用完。在伺服器設定
CODEFYUI_GITHUB_TOKEN,或稍後再試。
路由、安全性層級,以及每一種拒絕的正式名稱,見外掛包。