Community程式設計與開發github.com

sublime-mcp-audit

如何執行 Sublime 套件稽核,以揭露 sublime-mcp 弱點。在透過可攜式 Sublime 實例安裝、測試或移除 Sublime 套件時使用:禁止腳本、禁止 eval_python、禁止 HTTP 橋接,以使用者方式安裝,每一步該使用的 sublime-mcp 工具,以及什麼算發現。

sublime-mcp-audit 是什麼?

此技能定義了一套嚴格的稽核程序,用於測試 Sublime Text 套件並揭露 sublime-mcp 底層工具的弱點。它強制執行「以使用者方式安裝」的哲學,禁止使用腳本、`eval_python`、HTTP 橋接,以及任何繞過 MCP 通訊協定的行為。該技能詳細說明了如何在 Donald 的主要 Sublime 實例(可攜式版本已廢棄)上執行稽核,並包含嚴格的規則:每次呼叫都必須命名標籤、在涉及破壞性操作前必須徵得同意、在每次命令調度後檢查對話框、挑選器和主控台錯誤,以及妥善記錄無法由 MCP 工具完成的任何步驟作為弱點。支援的平台是 Sublime Text (MCP 通訊協定),且適用於 Sublime Text 套件開發和測試。

相容平台✓Claude Code~Codex CLI✓Cursor
Part ofMobile
npx skills add https://github.com/dpc00/sublime-package-audit/tree/HEAD/.claude/skills/sublime-mcp-audit

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

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 間隙的行為都會破壞稽核。

嚴格規則

  1. 禁止任何類型的腳本(Python、PowerShell、shell、作為腳本運作的單行命令)。
  2. 禁止使用 eval_python,用於任何事。
  3. 禁止向 MCP 橋接埠(9510、9520、9532...)發出 HTTP 呼叫。如果可攜式實例的 MCP 伺服器當機或掛起,請停止並報告;不要繞過它。
  4. 以使用者方式安裝是目標,但不總是現實。對於 Package Control 版本,請使用命令面板:「Package Control: Install Package」,輸入名稱,按 Enter。存放庫主分支(最新程式碼)無法從選取器取得,因此會手動複製進去(請參閱下方的「允許」)。對兩者都進行測試,並說明哪個結果來自哪個方式。
  5. 如果 sublime-mcp 無法執行使用者可以執行的步驟,不要繞過它。將其記錄為 sublime-mcp 弱點並告知 Donald。
  6. 安裝(他的順序,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 程式碼保持不變;這些規則是修復方案(他的決定:修復方案應屬於技能)。

  1. 取代 00 以及分支/PR 禁令(Donald,2026-10-21,在我寫下修復方案並停止之後:「如果你認為這會幫助某人,就去做。反反覆覆,不要再浪費時間。」): 對於一個真實、可重現的缺陷,完成工作:撰寫修復方案,測試在他的 Sublime 上,然後將證據加上經過測試的修復方案作為評論發布在套件的 issue 中(或一個新的簡短 issue),以「Claude reports:」開頭,並記錄下來。每個不需再獲得許可。跳過已封存的存放庫(他的規則,同日:GitHub 拒絕該處的評論)。將 findings\ 保留為記錄(將其 Status 行設定為 POSTED 並附上連結)。僅在評論無法承載修復方案時才提交 Pull Request;他於 2026-10-14 對 PR 的暫停以及禁止分支的規則需由他本人解除,因此在未經一次詢問之前,請勿開啟 PR 或分支。
  2. (較舊,已被 000 取代)未經他的同意,不得對外發布任何內容(他的擔憂,2026-10-20:錯誤的公開報告會讓他在軟體工程師面前難堪;當天已經有三個錯誤的報告發布出去了)。 禁止任何形式的 GitHub issue、評論、PR 或電子郵件。每個發現應撰寫成一個完整的 issue(標題、正文、證據、文件中怎麼說),儲存在存放庫根目錄的 findings\ 中的單獨檔案內(<套件名稱>-<簡短主題>.md,第一行 Status: not filed),就像它將被提交時的樣式。他的話:「把完整的 issue 放進去,不要提交它們」;存放庫是公開的,因此作者可以為自己的套件搜尋,並且它會被追蹤和備份(notes\ 被 git 忽略)。清除本地路徑和名稱。在 RESULTS.tsv 中記錄為「已在 findings\ 中撰寫(未提交)」。僅當他稍後針對特定一個發布時才發布,並先回讀文字。這取代了此技能和筆記中每一個較舊的「提交它」的指示,直到他解除限制為止。
  3. 使用前先閱讀(他的規則,2026-10-20:像這樣的錯誤意味著文件沒有被閱讀)。 在會話中首次使用任何會關閉、刪除、輸入、發送或更改某些內容的工具之前,先使用 discover_tools (query = 工具名稱) 閱讀其自身的描述,並說出最重要的一行(例如「不帶名稱的 close_file 會關閉活動標籤頁」)。在任何對外發送(電子郵件、GitHub 發布)之前,重新閱讀其筆記中的匹配規則,並顯示或檢查它所引用的原始內容;如果找不到原始內容,則不發送任何內容。
  4. 命名每個標籤頁。 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。
  5. 永遠不要依賴幾次呼叫前的活動內容。 在對「活動標籤頁」進行操作之前(例如 insert、帶有範圍文字的 run_command、get_active_file、ui_press_key、ui_type_text),在同一個批次中,立即查看視窗標題或 get_open_files。如果活動標籤頁不是我想要的那個,什麼也不做並用一句話說明。
  6. 更少、更短的突發操作。 先完成讀取、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。按此順序進行四個呼叫,並且四個答案將放入該行中:

  1. list_native_windows — kind:"dialog" 的條目是已凍結 Sublime 的模態對話框。讀取其 messages 和 buttons,使用 dismiss_native_window 回答(無焦點,無 AX 點擊),然後再次列出以證明它已消失。無人回答的對話框就是為什麼「當機」的編輯器實際上是一個在等待的編輯器。

  2. get_quick_panel — 非空的 items 表示一個面板已被開啟(它也可能是一個已關閉面板的過時答案,因此透過步驟 4 確認)。使用 pick_quick_panel {index} 驅動它;輸入面板(show_input_panel、ST4 輸入處理器)永遠不會出現在此處,因此圖片是其唯一的檢測器。

  3. get_console — 在調度之前取得 total 條目計數,並在之後只讀取新條目(tail = 之後 − 之前)。掃描該片段中是否有 Traceback、Error、error:、ImportError、ModuleNotFoundError、SyntaxWarning,以及套件自己的狀態行。導入失敗的插件不會列印任何內容(Uxntal,2026-11-05),因此在安裝帶有插件程式碼的套件後,空白的片段本身是一個需要追查的發現:使用 importlib.import_module('<Pkg>.<module>') 來顯示真正的例外。

  4. 測試視窗的 ui_screenshot — 唯一能顯示輸入面板、自動完成彈出視窗或殘留覆蓋層的東西,也是區分活躍選取器和過時記錄的方法。在調度後執行一次,在寫入該行前再執行一次。 在該行之前清除任何殘留狀態(面板、彈出視窗、資料夾、骯髒的標籤頁):使用 run_command hide_overlay、用於 output.exec 的 hide_panel、set_project_data {"folders": []},並在文件可丟棄時使用 set_scratch(True) 然後按名稱關閉視圖。

  5. 他的訊息或中斷會立即停止我。 如果工具結果被拒絕或他在輪次中寫入,停止發出視窗呼叫,回答他,並僅在他要求時才繼續。不要完成「就這一步」。

  6. 不要讀取我自己的標籤頁。 對一個大標籤頁使用 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)。

  7. 保持視窗與我發現它時一樣: 按名稱關閉測試標籤頁、關閉選取器、無對話框、設定哈希值與備份(暫存區 *.backup)相等。 6a. 在提交一個新型別**的發現(之前未在此稽核中提交過)之前,閱讀 Sublime 自己的文件(sublimetext.com/docs,有關 sublime-mcp 的 discover_tools/get_help)對該功能的說明,並在 issue 中引用它。基於一個觀察結果且沒有文件的發現只是一個猜測。 6b. 重複的 tabTriggers 在 build 4215 上不是缺陷(於 2026-10-20 用 Haml doctype 檢查過):Tab 鍵會顯示一個彈出列表,從中選擇。

相關技能