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
- Keine Skripte jeglicher Art (Python, PowerShell, Shell, One-Liner, die als Skripte fungieren).
- Kein
eval_python, für irgendetwas. - 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.
- 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.
- 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.
- 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.ps1als "Voraussetzung nicht installiert" protokolliert und übersprungen. Wenn er eine Installation in einem Zug erlaubt, schreiben Sie zuerst ihre Zeile indata\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).
- 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. - (Ä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 ZeileStatus: 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. - 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. - Jeden Tab benennen.
close_fileIMMER mitname(der Name eines unbenannten Tabs ist seine erste Textzeile; ein falscher Name gibtopen_viewszurück). Niemalsclose_fileohnename: 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/rctippte). 1b. Destruktive Aufrufe fragen zuerst Donald (2026-10-27, sublime-mcp Commit 1a71fa6).close_filemitdiscard,delete_file,delete_folder,revert_file,revert,close_window,close_workspace,remove_folder,exit,eval_pythonundrun_commanddieser 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": falsein seinerUser\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 vonclose_fileundrevert_fileabgelehnt: Verwenden Sieindexvonget_sheets. - Verlassen Sie sich niemals darauf, was vor ein paar Aufrufen aktiv war. Vor einem Aufruf, der auf "den aktiven Tab" wirkt (
insert,run_commandmit Gültigkeitsbereich Text,get_active_file,ui_press_key,ui_type_text), schauen Sie auf den Fenstertitel oderget_open_filesim SELBEN Batch, unmittelbar zuvor. Wenn der aktive Tab nicht der ist, den ich meine, tun Sie nichts und sagen Sie es in einer Zeile. - 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_screenshotdes Testfensters (ein Bild ist der einzige Detektor, der ST4-Eingabe-Handler-Picker sieht —get_quick_panelkann sie nicht sehen, wenn das Paket im 3.14-Host geladen wird, und der Barrierefreiheitsbaum zeigt sie auch nicht) pluslist_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_textnehmenhwnd; die Editor-hwnd des Portablen kommt vonlist_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_windowsunddismiss_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:
-
list_native_windows— einkind:"dialog"-Eintrag ist ein Modaldialog, der Sublime eingefroren hat. Lesen Sie seinemessagesundbuttons, beantworten Sie ihn mitdismiss_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. -
get_quick_panel— ein nicht-leeresitemsbedeutet, 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 mitpick_quick_panel {index}; Eingabe-Panels (show_input_panel, ST4-Eingabe-Handler) erscheinen hier nie, also ist ein Bild ihr einziger Detektor. -
get_console— nehmen Sie dietotal-Anzahl der Einträge VOR dem Versand und lesen Sie nur die neuen Einträge danach (tail= nachher − vorher). Durchsuchen Sie diesen Ausschnitt nachTraceback,Error,error:,ImportError,ModuleNotFoundError,SyntaxWarningund 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. -
ui_screenshotdes 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_panelfüroutput.exec,set_project_data {"folders": []}, und Ansichten werden nach Namen geschlossen, nachdemset_scratch(True)gesetzt wurde, wenn die Datei wegwerfbar ist. -
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".
-
Lesen Sie nicht meinen eigenen Tab.
get_active_fileauf einem großen Tab gibt bis zu 28 KB aus;get_sheetsohne Argumente gibt 7 KB Einstellungen aus. Verwenden Sieget_sheetsmitsettings=falsefür die Tab-Liste und den Fokus,get_open_filesfür Namen,get_view_size/get_view_charsmitnamefür eine begrenzte Lektüre, einen Screenshot für das Aussehen. 5b. Zielen Sie immer mit Namen an.run_command(Gültigkeitsbereich Text, mitname),send_to_view,get_view_content,get_view_chars,get_view_sizeundclose_filenehmen einen Tab-Namen oder -Index. Verwenden Sie sie anstelle der "aktiver Tab"-Formen (insert,get_active_file,ui_press_keyin den Editor), wo immer ein Tool einen Namen anbietet. -
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_helpfü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 Hamldoctype): Tab zeigt eine Popup-Liste an...