sublime-mcp 패키지 감사
이 방법의 공개 일반 버전은 다른 사람들을 위해: https://github.com/dpc00/sublime-package-audit (.claude/skills/sublime-package-audit/SKILL.md 및 PROCEDURE.md). 이 파일은 Donald의 로컬 규칙과 경로가 포함된 개인 작업 복사본입니다. 교훈이 일반적인 경우 공개 스킬에도 추가하세요.
출처: 2026-10-07의 Donald 지침과 같은 날 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, 셸, 스크립트 역할을 하는 한 줄짜리 명령).
eval_python, 어떤 용도로도 금지.- MCP 브리지 포트(9510, 9520, 9532...)로 HTTP 호출 금지. 이식형의 MCP 서버가 다운되거나 멈추면 중지하고 보고하세요. 우회하지 마십시오.
- 사용자가 하는 방식으로 설치하는 것이 목표이며, 항상 현실과 일치하는 것은 아닙니다. Package Control 릴리스의 경우 명령 팔레트를 사용하세요: "Package Control: Install Package", 이름 입력, Enter. 저장소 마스터(최신 코드)는 선택기에서 가져올 수 없으므로 복사하여 넣습니다(아래 "허용" 참조). 둘 다 테스트하고 각 결과가 어느 것에서 나타나는지 명시하세요.
- 사용자가 할 수 있는 단계를 sublime-mcp가 수행할 수 없으면 우회하지 마십시오. sublime-mcp 취약점으로 기록하고 Donald에게 알리세요.
- 설치 (Donald의 순서, 2026-10-24; 이전의 "무료 전제 조건 설치 및 테스트" 노트를 대체): 크거나 제거하기 어려운 것은 설치하지 마십시오 (Donald의 표현, 2026-10-31; 이전의 "선택기만, winget, pip, npm -g, gem, go, cargo, apt, 설치 프로그램, 관리자 권한이 필요한 것 없음" 목록은 유효하지 않았으며 준수되지 않았습니다). 작고 제거 가능한 설치는 괜찮습니다. (이전의 "관리자 권한이 필요한 것 없음" 조항은 2026-10-31 Donald에 의해 제거되었습니다: 유효하지 않았으며 준수되지 않았습니다). 전제 조건이 누락된 패키지는
finish.ps1에서 "전제 조건이 설치되지 않음"으로 기록되고 건너뜁니다. 한 턴에 하나의 설치를 허용하면 먼저data\installs_ledger.md에 해당 줄을 작성하세요. 각 테스트 후 설치된 것을 제거하고 패키지를 기록하기 전에 제거되었는지 확인하세요(Test-Path, 콘솔 "패키지 제거됨", 레지스트리). 세부 사항: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에서 테스트한 다음, 증거와 테스트된 수정 사항을 패키지의 이슈(또는 새로운 짧은 이슈)에 "Claude reports:"로 시작하는 댓글로 게시하고 기록하세요. 각각에 대해 두 번째 허가가 필요하지 않습니다. 보관된 저장소는 건너뛰세요(그의 규칙, 같은 날: GitHub는 거기서 댓글을 거부합니다).
findings\를 기록으로 유지하세요(Status 줄을 링크와 함께 POSTED로 설정). 수정 사항을 댓글이 전달할 수 없을 때만 풀 리퀘스트; PR 및 포크에 대한 2026-10-14의 중단과 포크 금지 규칙은 그가 다시 해제할 때까지 유효하므로, 한 번 묻지 않고 PR이나 포크를 열지 마십시오. - (이전, 000으로 대체됨) 그의 동의 없이 외부에 아무것도 게시하지 마십시오 (그의 두려움, 2026-10-20: 잘못된 공개 보고서는 소프트웨어 엔지니어들 앞에서 그를 당황하게 합니다; 그날 세 개의 잘못된 보고서가 나갔습니다). 어떤 종류의 GitHub 이슈, 댓글, PR 또는 이메일도 금지. 각 발견 사항은 저장소 루트의
findings\에 있는 자체 파일에 완전한 이슈(제목, 본문, 증거, 문서 내용)로 작성됩니다(<package>-<short-topic>.md, 첫 줄Status: not filed), 정확히 제출되었을 것과 동일하게. 그의 말: "완전한 이슈를 넣되, 제출하지 마세요"; 저장소는 공개이므로 작성자가 자신의 패키지를 찾을 수 있으며 추적되고 백업됩니다(notes\는 git-무시됨). 로컬 경로와 이름을 삭제하세요. RESULTS.tsv에 "findings\에 작성됨 (제출되지 않음)"으로 기록하세요. 그가 나중에 특정 항목에 대해 말할 때만 게시하고, 먼저 텍스트를 다시 읽어주세요. 이것은 그가 해제할 때까지 이 스킬과 노트의 모든 이전 "제출" 지침을 대체합니다. - 첫 사용 전에 읽으세요 (그의 규칙, 2026-10-20: 그런 오류는 문서를 읽지 않았다는 의미입니다). 세션에서 닫거나, 삭제하거나, 입력하거나, 보내거나, 무언가를 변경하는 도구를 처음 사용하기 전에
discover_tools(쿼리 = 도구 이름)로 해당 도구의 설명을 읽고 중요한 한 줄을 말하세요("close_file without name closes the active tab"). 외부 전송(이메일, GitHub 게시) 전에 그의 노트에서 해당 규칙을 다시 읽고 그것이 참조하는 원본을 표시하거나 확인하세요. 원본을 찾을 수 없으면 아무것도 보내지 마십시오. - 모든 탭의 이름을 지정하세요.
close_file은 항상name과 함께 사용하세요(제목 없는 탭의 이름은 첫 번째 텍스트 줄입니다. 잘못된 이름은open_views를 반환합니다).name없이close_file을 사용하지 마십시오: 활성 탭을 닫으며, 활성 탭을 결정하는 것은 내가 아니라 Donald입니다(2026-10-20에 그가/rc를 입력하는 동안 내 Claude 탭이 닫혔습니다). 1b. 파괴적 호출은 먼저 Donald에게 물어보세요 (2026-10-27, sublime-mcp 커밋 1a71fa6).close_filewithdiscard,delete_file,delete_folder,revert_file,revert,close_window,close_workspace,remove_folder,exit,eval_python및 이러한 명령의run_command(배치 내에서도)는 그의 Claude Code 터미널에 수락/거부 프롬프트를 표시합니다. 이러한 호출 전에 한 줄을 말하세요("closing the test tab 'x' with discard, a prompt will appear"), 정확한 탭 이름을 지정하고, 그가 거부한 호출을 반복하지 마십시오("Denied, nothing was changed"는 최종 답변입니다. 다른 도구로 우회하지 마십시오). 이식형(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,scope text가 있는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 입력 핸들러 선택기를 볼 수 있는 유일한 감지기입니다 —get_quick_panel은 패키지가 3.14 호스트에서 로드될 때 이를 볼 수 없고, 접근성 트리도 표시하지 않습니다) 및list_native_windows(네이티브 모달을 찾습니다). - 답변하거나 의도적으로 취소하고 행에서 그렇게 말하세요. 절대 놔두지 말고 여전히 하나가 떠 있는 창에서 행을 작성하지 마십시오.
- 게시된 텍스트 + Return, 이 순서로:
ui_type_text→ 스크린샷(텍스트가 실제로 전달됨) →ui_press_key Return→ 스크린샷(단계가 실제로 진행됨). 게시된 Return은 창이 전면에 있지 않을 때 아무것도 하지 않으며 종종 두 번째 누름이 필요합니다.ui_press_key/ui_type_text는hwnd를 사용합니다. 이식형 편집기의 hwnd는list_native_windows에서 가져옵니다. - 네이티브 모달(
ok_cancel_dialog,error_message)은 Sublime의 메인 스레드를 차단합니다: 다른 모든 경로는 "main-thread timeout after 5s ... A native window blocks Sublime's main thread"로 응답합니다.list_native_windows및dismiss_native_window {"hwnd":…, "action":"button", "button":"Yes"}는 차단된 상태에서도 응답하고 포커스를 건드리지 않고 닫습니다 — 이를 사용하고 AX 클릭은 사용하지 마십시오(대화 상자 버튼에 대한 AX 누름은 조용히 아무것도 하지 않을 수 있습니다). - 테스트 창을 전면으로 가져오는 것은 Donald의 키보드를 차지합니다: 같은 턴에 "~60초 동안 이식형에서 손을 떼세요"라고 알리고, 전면 + 키 + 스크린샷을 하나의 버스트로 수행하고, 마지막에 그의 창을 다시 전면으로 가져옵니다(
front.ps1 -Hwnd <his hwnd>). 2026-11-05에 그의 Enter 키는 승인 프롬프트를 위한 것이었지만 이식형의 선택기에 도달하여 내 테스트를 대신 응답했습니다.
3c. 모든 전달 후 세 가지 검사 — 다이얼로그, 선택기, 콘솔 (Donald, 2026-11-05: "다이얼로그와 선택기에 더 주의하세요... 이러한 유형의 것들을 주시하지 않으면 테스트가 부정확할 가능성이 매우 높습니다. 그리고 오류가 나타나는 파이썬 콘솔도 마찬가지입니다."). 모든 전달은 모든 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은 최대 28KB를 덤프합니다. 인수 없는get_sheets는 7KB의 설정을 덤프합니다. 탭 목록과 포커스에는settings=false와 함께get_sheets를, 이름에는get_open_files를, 제한된 읽기에는name과 함께get_view_size/get_view_chars를, 모양에는 스크린샷을 사용하십시오. 5b. 항상 이름으로 대상을 지정하십시오.run_command(scope text,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)가 해당 기능에 대해 말하는 바를 읽고 이슈에 인용하세요. 하나의 관찰과 문서 없이 근거한 발견 사항은 추측입니다. 6b. 중복 tabTrigger는 빌드 4215에서 결함이 아닙니다 (2026-10-20에 Hamldoctype으로 확인): Tab은 선택기 목록을 표시합니다...