CommunityCodierung & Entwicklunggithub.com

sublime-mcp-audit

So führen Sie das Sublime-Paketaudit durch, um Schwachstellen in sublime-mcp aufzudecken. Verwenden Sie es immer beim Installieren, Testen oder Entfernen von Sublime-Paketen über portable Sublime-Instanzen: keine Skripte, kein eval_python, keine HTTP-Brücke, Installation wie ein Benutzer, welche sublime-mcp-Tools für jeden Schritt zu verwenden sind und was als Fund gilt.

Was ist sublime-mcp-audit?

Diese Fähigkeit definiert eine strenge Audit-Methodik, um Schwachstellen im sublime-mcp-Tool selbst aufzudecken, indem Sublime-Text-Pakete so installiert und getestet werden, wie es ein normaler Benutzer tun würde – ohne Skripte, ohne eval_python und ohne die MCP-Bridge zu umgehen. Sie legt harte Regeln fest: keine Workarounds für fehlende MCP-Funktionen (diese werden als Schwachstellen dokumentiert), Installation über die Befehlspalette für offizielle Releases und manuelles Kopieren für Repository-Master. Die Fähigkeit priorisiert die Arbeit in Donalds Haupt-Sublime-Fenster (keine Portables mehr) mit strengen Protokollen für Benennung von Tabs, Erkennung von Dialogen und Pickern (via Screenshots und nativer Fensterauflistung) sowie Konsolenüberwachung nach jedem Befehl. Funde werden als vollständige Issues im öffentlichen Repo abgelegt (ohne Einreichung), und echte Defekte werden mit einem Fix und Test versehen, bevor sie als Kommentare auf GitHub gepostet werden. Die Fähigkeit behandelt auch Batch-Verwaltung, Commit-Protokolle und die zentrale Regel, dass ein unbeantworteter Dialog oder Picker bedeutet, dass der Test ungültig ist.

Funktioniert mit✓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 Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

sublime-mcp Paketaudit

Öffentliche, allgemeine Version dieser Methode für andere Personen: https://github.com/dpc00/sublime-package-audit (.claude/skills/sublime-package-audit/SKILL.md und PROCEDURE.md). Diese Datei ist die private Arbeitskopie mit Donalds lokalen Regeln und Pfaden; wenn eine Lektion allgemein ist, fügen Sie sie auch in die öffentliche Fähigkeit ein.

Quelle: Donalds Anweisungen vom 2026-10-07 und die Tool-Umfrage vom selben Tag mit discover_tools.

Wo sich die Dinge befinden (aktualisiert 2026-10-17)

Alles ist im Audit-Repo, C:\Users\donal\projects\sublime-package-audit: data\ (.tested_packages.tsv, .package_skill_test_log.md, .package_skill_baton.md, campaign_tools\), notes\ (die datierten Notizen und Batons, Index notes\MEMORY.md), tools\ (rec.ps1 protokolliert ein Paket; es COMMITTED oder PUSHT NICHT, Donald 2026-10-20: Führen Sie tools\commit_day.ps1 am Ende eines Batches aus: Der erste Lauf nach Mitternacht erstellt den Commit des Tages, jeder weitere Lauf an diesem Tag ändert ihn; der Verlauf wird auf einen Commit pro Tag beschränkt). Älterer Text unten und in den Notizen, der "Repo-Root" oder .claude\memory sagt, meint diese Ordner. Paketlisten sind immer noch in C:\Users\donal\data\st_packages.

Zweck

Das Audit dient dazu, Schwachstellen in sublime-mcp selbst zu finden. Dabei entdeckte Paketfehler sind ein Nebenergebnis. Alles, was eine Lücke im MCP verbirgt, macht das Audit zunichte.

Harte Regeln

  1. Keine Skripte jeglicher Art (Python, PowerShell, Shell, One-Liner, die als Skripte fungieren).
  2. Kein eval_python, für irgendetwas.
  3. Keine HTTP-Aufrufe an die MCP-Bridge-Ports (9510, 9520, 9532...). Wenn ein portabler MCP-Server abstürzt oder hängt, stoppen und melden; nicht umgehen.
  4. Die Installation so, wie ein Benutzer es tut, ist das ZIEL, nicht immer die Realität. Für die Package Control-Veröffentlichung verwenden Sie die Befehlspalette: "Package Control: Install Package", Namen eingeben, Enter. Der Repository-Master (der neueste Code) kann nicht über die Auswahl kommen, also wird er kopiert (siehe "Erlaubt" unten). Testen Sie beide und geben Sie an, welches welches Ergebnis zeigt.
  5. Wenn sublime-mcp einen Schritt nicht ausführen kann, den ein Benutzer kann, arbeiten Sie NICHT darum herum. Dokumentieren Sie es als sublime-mcp-Schwäche und informieren Sie Donald.
  6. INSTALLATIONEN (seine Reihenfolge, 2026-10-24; ersetzt die älteren "kostenlose Voraussetzungen installieren und testen"-Notizen): Installieren Sie nichts Großes oder Unmögliches zu Deinstallieren (seine Formulierung, 2026-10-31; die ältere "nur Auswahl, kein winget, pip, npm -g, gem, go, cargo, apt, Installer, nichts mit Administratorrechten"-Liste war ungültig und wurde nie befolgt). Kleine entfernbare Installationen sind in Ordnung. (Die alte "nichts, was Administratorrechte benötigt"-Klausel wurde von Donald am 2026-10-31 entfernt: sie war ungültig und wurde nie befolgt.) Ein Paket, dessen Voraussetzung fehlt, wird in finish.ps1 als "Voraussetzung nicht installiert" protokolliert und übersprungen. Wenn er eine Installation in einem Zug erlaubt, schreiben Sie zuerst ihre Zeile in data\installs_ledger.md. Entfernen Sie nach jedem Test, was installiert wurde, und ÜBERPRÜFEN SIE, dass es weg ist (Test-Path, Konsole "Removed package", Registrierung), bevor Sie das Paket protokollieren. Details: notes\feedback_install_policy_2026_10_24.md.

Erlaubt, Donald bestätigt: Kopieren einer Paketkopie (z. B. Repository-Master) in einen Packages-Ordner zum Testen; das sublime-mcp run_command-Tool, das die Menüklicks eines Benutzers nachahmt. Das Ausführen eines Befehls innerhalb von eval_python ist nicht erlaubt.

Nur Haupt-Sublime, er ist an derselben Tastatur (Donald, 2026-10-20; ersetzt jeden portablen Schritt unten)

Die Portablen sind weg. Das Audit läuft in seinem Haupt-Sublime, einem Fenster, wo er tippt, Tabs anklickt und Dialoge schließt, während ich arbeite. Der MCP-Code bleibt wie er ist; diese Regeln sind die Lösung (seine Entscheidung: Lösungen gehören in Fähigkeiten).

  1. ERSETZT 00 UND DIE FORK/PR-VERBOTE (Donald, 2026-10-21, nachdem ich Lösungen aufgeschrieben und aufgehört hatte: "Wenn du denkst, es wird jemandem helfen, mach weiter. Hin und her, verschwende keine Zeit mehr"): Bei einem echten, reproduzierten Defekt erledigen Sie den Job: Schreiben Sie den Fix, TESTEN Sie ihn in seinem Sublime, posten Sie dann den Beweis plus den getesteten Fix als Kommentar zum Issue des Pakets (oder ein neues kurzes Issue), beginnend mit "Claude reports:", und protokollieren Sie es. Keine zweite Erlaubnis für jeden. Archivierte Repos überspringen (seine Regel, am selben Tag: GitHub verweigert Kommentare dort). Führen Sie findings\ als Aufzeichnung (setzen Sie seine Statuszeile auf POSTED mit dem Link). Pull Requests nur, wenn ein Kommentar den Fix nicht transportieren kann; sein Pausieren von PRs am 2026-10-14 und die No-Forks-Regel muss er selbst wieder aufheben, also eröffnen Sie keine PRs oder Forks ohne einmal nachzufragen.
  2. (Älter, ersetzt durch 000) POSTEN SIE NICHTS NACH AUSSEN ohne sein Ja (seine Angst, 2026-10-20: Ein falscher öffentlicher Bericht bringt ihn vor Softwareentwicklern in Verlegenheit; drei falsche gingen an diesem Tag raus). Kein GitHub-Issue, Kommentar, PR oder E-Mail jeglicher Art. Jeder Fund wird als VOLLSTÄNDIGES Issue (Titel, Text, Beweise, was die Dokumentation sagt) in einer eigenen Datei in findings\ im Repo-Root geschrieben (<paket>-<kurzes-thema>.md, erste Zeile Status: not filed), genau wie es eingereicht worden wäre. Seine Worte: "lege vollständige Issues hinein, reiche sie nicht ein"; das Repo ist öffentlich, sodass Autoren dort nach ihrem eigenen Paket suchen können, und es wird verfolgt und gesichert (notes\ ist git-ignoriert). Bereinigen Sie lokale Pfade und Namen. Dokumentieren Sie es in RESULTS.tsv als "written up in findings\ (not filed)". Posten Sie nur, wenn er es später für ein bestimmtes sagt, und lesen Sie den Text zuerst zurück. Dies ersetzt jede ältere "Reichen Sie es ein"-Anweisung in dieser Fähigkeit und den Notizen, bis er sie aufhebt.
  3. Vor der ersten Verwendung lesen (seine Regel, 2026-10-20: Ein solcher Fehler bedeutet, dass die Dokumente nicht gelesen wurden). Lesen Sie vor der ersten Verwendung in einer Sitzung eines Tools, das schließt, löscht, tippt, sendet oder etwas ändert, seine eigene Beschreibung mit discover_tools (Abfrage = der Toolname) und sagen Sie die eine Zeile, die wichtig ist ("close_file ohne name schließt den aktiven Tab"). Vor jedem externen Senden (E-Mail, GitHub-Post) lesen Sie die passende Regel in seinen Notizen erneut und zeigen oder überprüfen Sie das Original, auf das sie sich bezieht; wenn das Original nicht gefunden werden kann, senden Sie nichts.
  4. Jeden Tab benennen. close_file IMMER mit name (der Name eines unbenannten Tabs ist seine erste Textzeile; ein falscher Name gibt open_views zurück). Niemals close_file ohne name: Es schließt den AKTIVEN Tab, und er entscheidet, welcher Tab aktiv ist, nicht ich (2026-10-20 schloss es meinen eigenen Claude-Tab, während er /rc tippte). 1b. Destruktive Aufrufe fragen zuerst Donald (2026-10-27, sublime-mcp Commit 1a71fa6). close_file mit discard, delete_file, delete_folder, revert_file, revert, close_window, close_workspace, remove_folder, exit, eval_python und run_command dieser Befehle (auch innerhalb eines Batches) zeigen eine Annehmen / Ablehnen-Eingabeaufforderung in seinem Claude Code-Terminal. Sagen Sie eine Zeile vor einem solchen Aufruf ("Schließe den Test-Tab 'x' mit discard, eine Eingabeaufforderung erscheint"), nennen Sie den genauen Tab, und wiederholen Sie keinen Aufruf, den er abgelehnt hat ("Abgelehnt, nichts wurde geändert" ist eine endgültige Antwort; gehen Sie niemals mit einem anderen Tool darum herum). Das Portable (C:\Users\donal\tools\st_portable) führt dasselbe Plugin mit "require_consent_for_destructive": false in seiner User\MCP Commander.sublime-settings, weil seine Verbindung die alte Art ist und nicht gefragt werden kann; ohne diese Zeile werden diese Aufrufe dort abgelehnt. Lassen Sie es nur dort auf false, niemals in seinem Haupt-Sublime. Ein Name, der zu mehreren Tabs passt, wird jetzt von close_file und revert_file abgelehnt: Verwenden Sie index von get_sheets.
  5. Verlassen Sie sich niemals darauf, was vor ein paar Aufrufen aktiv war. Vor einem Aufruf, der auf "den aktiven Tab" wirkt (insert, run_command mit Gültigkeitsbereich Text, get_active_file, ui_press_key, ui_type_text), schauen Sie auf den Fenstertitel oder get_open_files im SELBEN Batch, unmittelbar zuvor. Wenn der aktive Tab nicht der ist, den ich meine, tun Sie nichts und sagen Sie es in einer Zeile.
  6. Weniger, kürzere Schübe. Machen Sie zuerst Lese-, gh- und Dateiarbeit; setzen Sie die Schritte, die das Fenster berühren, zusammen; kein Warten dazwischen, das einen halbfertigen Picker oder einen schmutzigen Tab offen lässt. 3b. EIN PICKER ODER EIN DIALOG, DER AUF DEM BILDSCHIRM GELASSEN WURDE, BEDEUTET, DASS DER TEST NICHT DURCHGEFÜHRT WURDE (Donald, 2026-11-05, nachdem er mich mit einem CP New Picker auf dem Bildschirm angeschrien hatte: "Wenn etwas einen Dialog oder einen Picker aufpoppt, MUSST DU MUSST DU MUSST DU es erkennen und behandeln. Sonst lässt du es einfach offen, es offen zu lassen bedeutet, dass das Plugin auf eine ANTWORT wartet. Du hast das Paket nicht richtig getestet, wenn du nicht einmal einen Picker bemerkt hast."). Eine Eingabeaufforderung, die noch offen ist, ist eine unbeantwortete Frage: Das Paket ist nicht fertig, der Editor ist unbrauchbar, und das Fenster gehört dem Paket, nicht mir. Also:
  • Nach JEDEM Befehlsversand und erneut vor dem Schreiben einer Zeile: ui_screenshot des Testfensters (ein Bild ist der einzige Detektor, der ST4-Eingabe-Handler-Picker sieht — get_quick_panel kann sie nicht sehen, wenn das Paket im 3.14-Host geladen wird, und der Barrierefreiheitsbaum zeigt sie auch nicht) plus list_native_windows (das findet native Modaldialoge).
  • Beantworten Sie es oder brechen Sie es bewusst ab und sagen Sie es in der Zeile. Lassen Sie es niemals offen und schreiben Sie niemals eine Zeile aus einem Fenster, das noch ein offenes hat.
  • Geposteter Text + Return, in dieser Reihenfolge: ui_type_text → Screenshot (der Text ist wirklich angekommen) → ui_press_key Return → Screenshot (der Schritt ist wirklich vorangekommen). Ein geposteter Return tut nichts, wenn das Fenster nicht im Vordergrund ist, und braucht oft einen zweiten Druck. ui_press_key/ui_type_text nehmen hwnd; die Editor-hwnd des Portablen kommt von list_native_windows.
  • Native Modaldialoge (ok_cancel_dialog, error_message) BLOCKIEREN Sublimes Hauptthread: Jede andere Route antwortet mit "main-thread timeout after 5s ... A native window blocks Sublime's main thread". list_native_windows und dismiss_native_window {"hwnd":…, "action":"button", "button":"Yes"} antworten trotzdem, während blockiert, und schließen es, ohne den Fokus zu berühren — verwenden Sie sie, nicht AX-Klicks (ein AX-Druck auf einen Dialog-Button kann stillschweigend nichts tun).
  • Das Testfenster in den Vordergrund zu bringen, nimmt Donalds Tastatur: Kündigen Sie "Hände weg vom Portable für ~60 s" im selben Zug an, machen Sie die Vordergrund + Tasten + Screenshots als einen Schub und bringen Sie sein eigenes Fenster am Ende wieder in den Vordergrund (front.ps1 -Hwnd <seine hwnd>). Am 2026-11-05 landete sein Enter, das für eine Genehmigungsaufforderung gedacht war, im Picker des Portablen und beantwortete meinen Test für mich.

3c. DIE DREI PRÜFUNGEN NACH JEDEM VERSAND — Dialoge, Picker, KONSOLE (Donald, 2026-11-05: "sei sorgfältiger mit Dialogen und Pickern... Es ist sehr wahrscheinlich, dass Tests ungenau sind, wenn Sie nicht nach solchen Dingen Ausschau halten. Und die Python-Konsole, wo Fehler erscheinen."). Jeder Versand bedeutet jedes run_command, jedes eval_python, das einen Befehl ausführt, jede Installation, jeder Build, jeder run_syntax_tests. Vier Aufrufe, in dieser Reihenfolge, und die vier Antworten gehen in die Zeile:

  1. list_native_windows — ein kind:"dialog"-Eintrag ist ein Modaldialog, der Sublime eingefroren hat. Lesen Sie seine messages und buttons, beantworten Sie ihn mit dismiss_native_window (kein Fokus, kein AX-Klick), dann listen Sie erneut, um zu beweisen, dass er weg ist. Ein Dialog, den niemand beantwortet, ist der Grund, warum ein "abgestürzter" Editor wirklich ein wartender ist.

  2. get_quick_panel — ein nicht-leeres items bedeutet, dass ein Panel geöffnet wurde (es kann auch eine veraltete Antwort für ein geschlossenes sein, also bestätigen Sie mit Schritt 4). Steuern Sie es mit pick_quick_panel {index}; Eingabe-Panels (show_input_panel, ST4-Eingabe-Handler) erscheinen hier nie, also ist ein Bild ihr einziger Detektor.

  3. get_console — nehmen Sie die total-Anzahl der Einträge VOR dem Versand und lesen Sie nur die neuen Einträge danach (tail = nachher − vorher). Durchsuchen Sie diesen Ausschnitt nach Traceback, Error, error:, ImportError, ModuleNotFoundError, SyntaxWarning und nach den eigenen Statuszeilen des Pakets. Ein Plugin, das nicht importiert werden kann, druckt überhaupt nichts (Uxntal, 2026-11-05), also ist ein leerer Ausschnitt nach der Installation eines Pakets mit Plugin-Code selbst ein zu verfolgender Fund: importlib.import_module('<Pkg>.<module>'), um die eigentliche Ausnahme sichtbar zu machen.

  4. ui_screenshot des Testfensters — das Einzige, was ein Eingabe-Panel, ein Auto-Vervollständigungs-Popup oder eine übrig gebliebene Überlagerung zeigt, und die Möglichkeit, einen Live-Picker von einem veralteten Datensatz zu unterscheiden. Machen Sie es einmal nach dem Versand und einmal vor dem Schreiben der Zeile. Jeder Restzustand (ein Panel, ein Popup, ein Ordner, ein schmutziger Tab) wird vor der Zeile gelöscht: run_command hide_overlay, hide_panel für output.exec, set_project_data {"folders": []}, und Ansichten werden nach Namen geschlossen, nachdem set_scratch(True) gesetzt wurde, wenn die Datei wegwerfbar ist.

  5. Seine Nachricht oder eine Unterbrechung stoppt mich sofort. Wenn ein Tool-Ergebnis abgelehnt wird oder er mittendrin schreibt, stoppen Sie das Ausgeben von Fensteraufrufen, antworten Sie ihm und fahren Sie nur fort, wenn er es sagt. Beenden Sie nicht "nur diesen einen Schritt".

  6. Lesen Sie nicht meinen eigenen Tab. get_active_file auf einem großen Tab gibt bis zu 28 KB aus; get_sheets ohne Argumente gibt 7 KB Einstellungen aus. Verwenden Sie get_sheets mit settings=false für die Tab-Liste und den Fokus, get_open_files für Namen, get_view_size / get_view_chars mit name für eine begrenzte Lektüre, einen Screenshot für das Aussehen. 5b. Zielen Sie immer mit Namen an. run_command (Gültigkeitsbereich Text, mit name), send_to_view, get_view_content, get_view_chars, get_view_size und close_file nehmen einen Tab-Namen oder -Index. Verwenden Sie sie anstelle der "aktiver Tab"-Formen (insert, get_active_file, ui_press_key in den Editor), wo immer ein Tool einen Namen anbietet.

  7. Hinterlassen Sie das Fenster so, wie ich es vorgefunden habe: Test-Tabs nach Namen geschlossen, Picker geschlossen, kein Dialog, Einstellungs-Hashes gleich den Backups (Notizblock *.backup). 6a. Bevor Sie eine NEUE ART von Fund einreichen (eine, die ich zuvor in diesem Audit nicht eingereicht habe), lesen Sie, was Sublimes eigene Dokumentation (sublimetext.com/docs, discover_tools/get_help für sublime-mcp) über diese Funktion sagt, und zitieren Sie es im Issue. Ein Fund, der auf einer Beobachtung und keiner Dokumentation beruht, ist eine Vermutung. 6b. Doppelte tabTriggers sind KEIN Defekt in Build 4215 (geprüft 2026-10-20 mit Haml doctype): Tab zeigt eine Popup-Liste an...

Verwandte Skills