sublime-mcp 套件稽核
此方法的公開通用版本(供他人使用):https://github.com/dpc00/sublime-package-audit (.claude/skills/sublime-package-audit/SKILL.md 和 PROCEDURE.md)。此檔案是私有工作副本,包含 Donald 的本地規則和路徑;當某個教訓具有通用性時,也應將其放入公開技能中。
來源:Donald 於 2026-10-07 的指示以及同日使用 discover_tools 進行的工具調查。
檔案位置(更新於 2026-10-17)
所有內容均在稽核存放庫中,C:\Users\donal\projects\sublime-package-audit:data\ (.tested_packages.tsv, .package_skill_test_log.md, .package_skill_baton.md, campaign_tools\),notes\(包含有日期的筆記和接力棒,索引 notes\MEMORY.md),tools\(rec.ps1 記錄一個套件;它不會提交或推送,Donald 2026-10-20:在批次結束時執行 tools\commit_day.ps1:午夜後的第一次執行會建立當天的提交,當天的其他每次執行都會修改該提交;歷史記錄保持為每天一個提交)。以下較舊的文字以及在筆記中提到的「存放庫根目錄」或 .claude\memory 指的是這些資料夾。套件列表仍位於 C:\Users\donal\data\st_packages。
目的
稽核是我們找出 sublime-mcp 本身弱點的方法。在此過程中發現的套件錯誤是附帶結果。任何隱藏 MCP 間隙的行為都會破壞稽核。
嚴格規則
- 禁止任何類型的腳本(Python、PowerShell、shell、作為腳本運作的單行命令)。
- 禁止使用
eval_python,用於任何事。 - 禁止向 MCP 橋接埠(9510、9520、9532...)發出 HTTP 呼叫。如果可攜式實例的 MCP 伺服器當機或掛起,請停止並報告;不要繞過它。
- 以使用者方式安裝是目標,但不總是現實。對於 Package Control 版本,請使用命令面板:「Package Control: Install Package」,輸入名稱,按 Enter。存放庫主分支(最新程式碼)無法從選取器取得,因此會手動複製進去(請參閱下方的「允許」)。對兩者都進行測試,並說明哪個結果來自哪個方式。
- 如果 sublime-mcp 無法執行使用者可以執行的步驟,不要繞過它。將其記錄為 sublime-mcp 弱點並告知 Donald。
- 安裝(他的順序,2026-10-24;取代較舊的「安裝免費先決條件並測試」筆記): 不要安裝任何大型或無法解除安裝的項目(他的措辭,2026-10-31;較舊的「僅限選取器,無 winget、pip、npm -g、gem、go、cargo、apt、安裝程式,無需管理員權限」列表無效且從未遵循)。小型可移除的安裝是可以的。(「無需管理員權限」的舊條款已由 Donald 於 2026-10-31 移除:它無效且從未遵循。)缺少先決條件的套件會在
finish.ps1中記錄為「先決條件未安裝」並跳過。如果他允許在一次輪次中安裝一個,請先將其行寫入data\installs_ledger.md。每次測試後,移除已安裝的內容並驗證它已消失(Test-Path、主控台中的「Removed package」、登錄檔),然後再記錄該套件。詳細資訊:notes\feedback_install_policy_2026_10_24.md。
允許的,經 Donald 確認:將套件副本(例如存放庫主分支)複製到 Packages 資料夾中以進行測試;sublime-mcp 的 run_command 工具,它模仿使用者的選單點擊。不允許從 eval_python 內部執行命令。
僅限主要 Sublime 實例,他使用同一個鍵盤(Donald,2026-10-20;取代下方所有可攜式實例步驟)
可攜式實例已消失。稽核在他的主要 Sublime 實例中執行,一個視窗,他在其中打字、點擊標籤頁並在我工作時關閉對話框。MCP 程式碼保持不變;這些規則是修復方案(他的決定:修復方案應屬於技能)。
- 取代 00 以及分支/PR 禁令(Donald,2026-10-21,在我寫下修復方案並停止之後:「如果你認為這會幫助某人,就去做。反反覆覆,不要再浪費時間。」): 對於一個真實、可重現的缺陷,完成工作:撰寫修復方案,測試在他的 Sublime 上,然後將證據加上經過測試的修復方案作為評論發布在套件的 issue 中(或一個新的簡短 issue),以「Claude reports:」開頭,並記錄下來。每個不需再獲得許可。跳過已封存的存放庫(他的規則,同日:GitHub 拒絕該處的評論)。將
findings\保留為記錄(將其 Status 行設定為 POSTED 並附上連結)。僅在評論無法承載修復方案時才提交 Pull Request;他於 2026-10-14 對 PR 的暫停以及禁止分支的規則需由他本人解除,因此在未經一次詢問之前,請勿開啟 PR 或分支。 - (較舊,已被 000 取代)未經他的同意,不得對外發布任何內容(他的擔憂,2026-10-20:錯誤的公開報告會讓他在軟體工程師面前難堪;當天已經有三個錯誤的報告發布出去了)。 禁止任何形式的 GitHub issue、評論、PR 或電子郵件。每個發現應撰寫成一個完整的 issue(標題、正文、證據、文件中怎麼說),儲存在存放庫根目錄的
findings\中的單獨檔案內(<套件名稱>-<簡短主題>.md,第一行Status: not filed),就像它將被提交時的樣式。他的話:「把完整的 issue 放進去,不要提交它們」;存放庫是公開的,因此作者可以為自己的套件搜尋,並且它會被追蹤和備份(notes\被 git 忽略)。清除本地路徑和名稱。在 RESULTS.tsv 中記錄為「已在 findings\ 中撰寫(未提交)」。僅當他稍後針對特定一個發布時才發布,並先回讀文字。這取代了此技能和筆記中每一個較舊的「提交它」的指示,直到他解除限制為止。 - 使用前先閱讀(他的規則,2026-10-20:像這樣的錯誤意味著文件沒有被閱讀)。 在會話中首次使用任何會關閉、刪除、輸入、發送或更改某些內容的工具之前,先使用
discover_tools(query = 工具名稱) 閱讀其自身的描述,並說出最重要的一行(例如「不帶名稱的 close_file 會關閉活動標籤頁」)。在任何對外發送(電子郵件、GitHub 發布)之前,重新閱讀其筆記中的匹配規則,並顯示或檢查它所引用的原始內容;如果找不到原始內容,則不發送任何內容。 - 命名每個標籤頁。
close_file始終帶有name(未命名的標籤頁名稱是其第一行文字;錯誤的名稱會返回open_views)。永遠不要使用不帶name的close_file:它會關閉活動標籤頁,而他決定哪個標籤頁是活動的,而不是我(2026-10-20 它在他輸入/rc時關閉了我自己的 Claude 標籤頁)。 1b. 破壞性呼叫先詢問 Donald(2026-10-27,sublime-mcp 提交 1a71fa6)。 使用discard的close_file、delete_file、delete_folder、revert_file、revert、close_window、close_workspace、remove_folder、exit、eval_python以及這些命令的run_command(包括在批次內)會在他的 Claude Code 終端機中顯示一個接受/拒絕提示。在進行此類呼叫之前說一句話(例如「正在關閉測試標籤頁 'x' 並丟棄更改,將會出現一個提示」),指定確切的標籤頁名稱,並且不要重複他拒絕的呼叫(「已拒絕,未進行任何更改」是最終答案;絕不使用其他工具繞過它)。可攜式實例 (C:\Users\donal\tools\st_portable) 使用相同的插件運行,但其User\MCP Commander.sublime-settings中有"require_consent_for_destructive": false,因為其連線是舊式類型,無法被詢問;沒有這一行,這些呼叫將被拒絕。僅在該處保留 false,永遠不要在他的主要 Sublime 實例中。一個符合多個標籤頁的名稱現在會被close_file和revert_file拒絕:改用來自get_sheets的index。 - 永遠不要依賴幾次呼叫前的活動內容。 在對「活動標籤頁」進行操作之前(例如
insert、帶有範圍文字的run_command、get_active_file、ui_press_key、ui_type_text),在同一個批次中,立即查看視窗標題或get_open_files。如果活動標籤頁不是我想要的那個,什麼也不做並用一句話說明。 - 更少、更短的突發操作。 先完成讀取、gh 和檔案工作;將觸碰視窗的步驟放在一起;中間不要有等待,以免留下未完成的選取器或骯髒的標籤頁。 3b. 螢幕上留下選取器或對話框意味著測試未執行(Donald,2026-11-05,在對著一個擺在螢幕上的 CP New 選取器對我大喊之後:「如果某個東西彈出對話框或選取器,你必須檢測並處理它。否則你就讓它留在那裡,讓它留在那裡意味著插件正在等待答案**。如果你甚至沒有注意到一個選取器,你就沒有正確測試該套件。」)。仍然存在的提示是一個未回答的問題:套件尚未完成,編輯器無法使用,並且視窗屬於套件,而不是我。所以:
- 在每次命令調度後,以及在寫入任何行之前:對測試視窗進行
ui_screenshot(圖片是唯一能看到 ST4 輸入處理器選取器的檢測器 — 當套件在 3.14 主機中載入時,get_quick_panel無法看到它們,且輔助功能樹也不會顯示它們)加上list_native_windows(該工具能找到原生模態對話框)。 - 回答它,或者故意取消它並在該行中說明。永遠不要讓它留著,也不要從一個仍有未處理項目的視窗寫入任何行。
- 按此順序發布文字 + 回車:
ui_type_text→ 截圖(文字確實已輸入)→ui_press_key Return→ 截圖(步驟確實已前進)。當視窗不在前景時,發布的回車不會起作用,並且通常需要第二次按壓。ui_press_key/ui_type_text需要hwnd;可攜式實例的編輯器 hwnd 來自list_native_windows。 - 原生模態對話框(
ok_cancel_dialog、error_message)會阻塞 Sublime 的主執行緒:其他所有路由都會回應「主執行緒在 5 秒後超時...原生視窗阻塞了 Sublime 的主執行緒」。list_native_windows和dismiss_native_window {"hwnd":…, "action":"button", "button":"Yes"}在被阻塞時仍然可以回應並關閉它,且不會觸碰焦點 — 使用它們,而不是 AX 點擊(對對話框按鈕的 AX 按壓可能會默默地不起作用)。 - 將測試視窗置於前景會搶走 Donald 的鍵盤:在同一輪次中宣布「請在約 60 秒內不要觸碰可攜式實例」,以前景操作 + 按鍵 + 截圖作為一次突發,並在最後將他自己的視窗重新置於前景(
front.ps1 -Hwnd <他的 hwnd>)。在 2026-11-05,他本應用於批准提示的回車,卻落入了可攜式實例的選取器中,並為我回答了測試。
3c. 每次調度後的三項檢查——對話框、選取器、主控台(Donald,2026-11-05:「需要更勤奮地檢查對話框和選取器...如果你不注意這些事情,測試很可能會不準確。還有 python 主控台,那裡會出現錯誤。」)。 每次調度意味著每次 run_command、每次執行命令的 eval_python、每次安裝、每次建置、每次 run_syntax_tests。按此順序進行四個呼叫,並且四個答案將放入該行中:
-
list_native_windows—kind:"dialog"的條目是已凍結 Sublime 的模態對話框。讀取其messages和buttons,使用dismiss_native_window回答(無焦點,無 AX 點擊),然後再次列出以證明它已消失。無人回答的對話框就是為什麼「當機」的編輯器實際上是一個在等待的編輯器。 -
get_quick_panel— 非空的items表示一個面板已被開啟(它也可能是一個已關閉面板的過時答案,因此透過步驟 4 確認)。使用pick_quick_panel {index}驅動它;輸入面板(show_input_panel、ST4 輸入處理器)永遠不會出現在此處,因此圖片是其唯一的檢測器。 -
get_console— 在調度之前取得total條目計數,並在之後只讀取新條目(tail= 之後 − 之前)。掃描該片段中是否有Traceback、Error、error:、ImportError、ModuleNotFoundError、SyntaxWarning,以及套件自己的狀態行。導入失敗的插件不會列印任何內容(Uxntal,2026-11-05),因此在安裝帶有插件程式碼的套件後,空白的片段本身是一個需要追查的發現:使用importlib.import_module('<Pkg>.<module>')來顯示真正的例外。 -
測試視窗的
ui_screenshot— 唯一能顯示輸入面板、自動完成彈出視窗或殘留覆蓋層的東西,也是區分活躍選取器和過時記錄的方法。在調度後執行一次,在寫入該行前再執行一次。 在該行之前清除任何殘留狀態(面板、彈出視窗、資料夾、骯髒的標籤頁):使用run_command hide_overlay、用於output.exec的hide_panel、set_project_data {"folders": []},並在文件可丟棄時使用set_scratch(True)然後按名稱關閉視圖。 -
他的訊息或中斷會立即停止我。 如果工具結果被拒絕或他在輪次中寫入,停止發出視窗呼叫,回答他,並僅在他要求時才繼續。不要完成「就這一步」。
-
不要讀取我自己的標籤頁。 對一個大標籤頁使用
get_active_file會轉存多達 28 KB 的資料;不帶引數的get_sheets會轉存 7 KB 的設定。對於標籤頁列表和焦點,使用帶有settings=false的get_sheets;對於名稱使用get_open_files;對於受限的讀取使用帶有name的get_view_size/get_view_chars;對於外觀使用截圖。 5b. 始終以名稱為目標。run_command(範圍文字,帶有name)、send_to_view、get_view_content、get_view_chars、get_view_size和close_file都接受標籤頁名稱或索引。在工具提供名稱的地方,使用它們而不是「活動標籤頁」形式(insert、get_active_file、向編輯器發送ui_press_key)。 -
保持視窗與我發現它時一樣: 按名稱關閉測試標籤頁、關閉選取器、無對話框、設定哈希值與備份(暫存區
*.backup)相等。 6a. 在提交一個新型別**的發現(之前未在此稽核中提交過)之前,閱讀 Sublime 自己的文件(sublimetext.com/docs,有關 sublime-mcp 的discover_tools/get_help)對該功能的說明,並在 issue 中引用它。基於一個觀察結果且沒有文件的發現只是一個猜測。 6b. 重複的 tabTriggers 在 build 4215 上不是缺陷(於 2026-10-20 用 Hamldoctype檢查過):Tab 鍵會顯示一個彈出列表,從中選擇。