remote-access — Playbook (범용 반복작업 매뉴얼)
VS Code 클로드 확장이 이상하다 — 30초 진단 → 처방 (2026-09-23 확립 · [페페] 정상확인)
발동 조건 = 페페가 이런 말을 하면 여기부터 본다. 「새 세션 버튼이 내장 클로드로 간다」 · 「멀티세션이 안 된다」 · 「한 번에 한 세션밖에 안 보인다」 · 「클로드 아이콘이 없어졌다」 · 「기존 창마저 내장으로 로딩된다」.
1) 첫 명령 — 묻지 말고 이것부터
python C:/dev/tools/vscode-claude-doctor/doctor.py
8항목을 사무실PC·미니PC 양쪽에서 실측해 PASS/FAIL 로 찍는다. FAIL 줄이 곧 증상이고 처방이다(자체검사 = --selftest 8/8). 8번째 = 원격 exthost 기동(데스크톱 힙 고갈) — 26.9.30 추가.
⚠설정을 고쳤으면 VS Code 창을 Reload 해야 먹는다 — 안 하면 「또 안 됐다」가 된다.
2) 증상 → 원인 → 처방 (원인이 따로따로다. 섞지 마라 — 26.9.30 처럼 두 개가 겹치기도 한다)
| 증상 | 진짜 원인 | 처방 |
|---|---|---|
| 「접속됐다」는데 클로드(확장 전부)가 없고 열어둔 세션이 로딩만 돈다 · [코디] 26.9.30 | 미니PC Session 0 데스크톱 힙 고갈 — 원격 exthost 가 exited with code: 3221225794(0xC0000142)로 4ms 만에 죽는다. 서버(code-<커밋>.exe)가 하루 가까이 살며 원격 세션들(claude.exe+MCP node+셸)이 힙을 다 먹었다. doctor 8번 줄이 잡는다 |
①원격 창을 닫고 5분 넘게 기다린다(서버가 ServerLifetime: all consumers inactive 로 내려가야 새 힙) — 5분 안에 다시 열면 고갈된 서버에 또 붙는다(26.9.30 페페가 4번 다시 열었는데 전부 같은 서버). 급하면 코디가 el.py "taskkill /F /PID <서버pid>"(pid = ~/.vscode-server/cli/servers/Stable-<커밋>/pid.txt). ②항구 = SharedSection 세 번째 값(26.9.22 768→3072 · 26.9.30 3072→8192, 재부팅 대기) ③⛔이 상태에서 원격 창 «Update» 누르지 마라 — 서명검증도 같은 이유로 실패해 «그래도 설치»로 서버만 올라가고 판 불일치(아래 셋째 줄)가 겹친다 |
| 한 번에 한 세션만 보인다 / 세션이 전부 한 곳에서 열린다 | claudeCode.preferredLocation 이 sidebar — 사이드바는 한 칸뿐이다 |
panel 로. 🔑값은 sidebar·panel 둘뿐이고 panel = enum 설명 Panel (New Tab) = 편집기 탭이다(VS Code 하단 패널 아님 — 26.9.4 에 이걸 오해해 sidebar 로 바꿨던 게 원인) |
| 새 세션 버튼이 내장 Claude 로 간다 | VS Code 1.138 본체 내장 agent host 의 Claude 하네스(확장과 무관하게 VS Code 가 자체 Claude 를 들고 있다) | chat.agentHost.claudeAgent.enabled:false + chat.disableAIFeatures:true. 둘째 줄 빼면 같은 버튼이 이번엔 Copilot 채팅으로 간다 |
| 클로드 아이콘·UI 가 통째로 사라졌다 | 확장 판 불일치(클라이언트 로컬 ↔ ~/.vscode-server/extensions) |
양쪽 같은 판 설치(아래 3-C). 상세 = rules.md 🆕 |
| 모바일 앱에 VS Code 세션이 안 뜬다(RC 꺼짐) · [코디] 26.9.23 · ✅[페페] 「작업 성공」 | remoteControlAtStartup 미설정이면 기본값을 서버 기능플래그(getCcrAutoConnectDefault)가 정한다 → 플래그가 꺼지면 조용히 꺼진다(2.1.280 에서 겪음) |
미니PC C:\Users\delix\.claude\settings.json 최상위 "remoteControlAtStartup": true(user 범위만 유효 — 프로젝트·local 설정의 true 는 무시된다). 재시작 불필요: 떠 있는 세션에 즉시 붙는다. 확인 = C:\Users\delix\.claude\sessions\<pid>.json 에 bridgeSessionId 생김. 서버모드 claude remote-control(poin-local)과는 별개 |
⛒판 불일치로 오진하지 마라 — 26.9.23 에 판을 전부 맞춘 뒤에도 증상이 그대로였다. 판이 같은데 증상이 있으면 위 두 줄(내장 차단 + preferredLocation) 이다.
3) 처방 복붙
A. 내장 채팅 차단 — 사무실PC C:\Users\poinpc\AppData\Roaming\Code\User\settings.json
"chat.agentHost.claudeAgent.enabled": false,
"chat.disableAIFeatures": true
B. 탭 모드 + 단축키 — preferredLocation 은 두 곳 다 고친다(원격 창에선 미니PC Machine 이 사무실PC 사용자 설정을 이긴다)
- 사무실PC C:\Users\poinpc\AppData\Roaming\Code\User\settings.json
- 미니PC C:\Users\delix\.vscode-server\data\Machine\settings.json
"claudeCode.preferredLocation": "panel"
단축키 = 사무실PC C:\Users\poinpc\AppData\Roaming\Code\User\keybindings.json
{ "key": "ctrl+alt+n", "command": "claude-vscode.editor.open" }, // 새 탭
{ "key": "ctrl+alt+shift+n", "command": "claude-vscode.window.open" }, // 새 창
{ "key": "ctrl+alt+s", "command": "claude-vscode.sidebar.open" }
⚠확장 기본 Ctrl+Shift+Esc 는 윈도우가 작업관리자로 먼저 먹어 VS Code 까지 오지 않는다.
⚠preferredLocation 은 확장이 자동으로 덮어쓴다(「updates automatically when you open Claude in a new location」) — 사이드바에서 한 번 열면 도로 sidebar. 탭으로 한 번 열어 주는 게 사실상 모드 전환이다.
C. 판 맞추기(아이콘 실종일 때만)
# 사무실PC 로컬 — PATH 의 code 는 옛 x86 1.32.3 이라 전체 경로로!
ssh poinimos01 "\"%LOCALAPPDATA%\Programs\Microsoft VS Code\bin\code.cmd\" --install-extension anthropic.claude-code@<판> --force"
4) 눈으로 봐야 할 때 — 페페 방해 없이
ssh poinimos01 "schtasks /Run /TN CodyWinShot" # VS Code «창만» PrintWindow (포커스 안 뺏음, 가려져도 찍힌다)
scp poinimos01:C:/cody-shot/vscode.png ./now.png
ssh poinimos01 "schtasks /Run /TN CodyShot" # 전체화면 (페페가 지금 뭘 하는지 볼 때만)
도구 원본 = C:\dev\_work\vscode-office\winshot.ps1·shot.ps1(+ .vbs 숨김 래퍼). 예약작업이 없으면 그 폴더에서 scp 후 schtasks /Create … /IT /RU poinpc.
⛔SendKeys 로 VS Code 에 명령을 쳐 넣지 마라 — 페페가 쓰는 PC 다. 키가 엑셀로 샌다(26.9.23 실측, rules.md 🆕).
5) 설정 ID 는 «설치된 본체»에서 확인한다
공식문서·블로그는 github.copilot.chat.claudeAgent.enabled 라고 쓰는데 1.138 에는 그 문자열이 없다(내장 copilot 확장 package.json 0건). 실제 ID 를 뽑는 법:
$app = "$env:LOCALAPPDATA/Programs/Microsoft VS Code/<커밋10자>/resources/app" # 1.138 부터 커밋 폴더 밑이다
$wb = Get-Content "$app/out/vs/workbench/workbench.desktop.main.js" -Raw
[regex]::Matches($wb, 'chat\.agentHost\.[A-Za-z.]+') | % { $_.Value } | Sort-Object -Unique
확장 쪽 설정·명령·enum 은 …\.vscode-server\extensions\anthropic.claude-code-<판>-win32-x64\package.json 의 contributes.
6) 정상 상태(2026-09-23 [페페] 「정상 작동 된다」 시점 실측)
| 자리 | 값 |
|---|---|
| VS Code 본체(사무실PC·미니PC 서버) | 1.138.0 / 7debcd0e2acdea1c52de81bf9ee1620444407dda |
| 확장(사무실PC 로컬 · 미니PC 서버) | anthropic.claude-code-2.1.280-win32-x64 양쪽 동일 → 26.9.29(화) [코디] 2.1.284 로 세 곳(미니PC 로컬·서버·사무실PC) 동시 갱신. 본체 1.139.1 은 양쪽 다 내려받아 대기(updating_version) — VS Code 완전 종료·재실행 때 적용 → 26.9.30(수) [코디] 사무실PC 로컬·미니PC 서버 = 2.1.285(마켓 최신 안정판 · 서버 사본은 서명검증 없이 깔렸으나 사무실PC 서명검증본과 28파일 해시 동일) · 본체 = 사무실PC·미니PC 서버 모두 1.139.1 04c0d99f(최신) · Remote-SSH 0.126.0 유지(마켓 안정판 최신 = 0.128.0, 0.129.x = 프리릴리스) · 미니PC 로컬 확장 2.1.284(로컬 창 전용이라 불일치 무해 — 로컬 세션 3개가 그 폴더 exe 를 물고 있어 보류) · 노트북 = 오프라인(4일) 미확인 → 26.10.7(수) [코디] 본체 = 미니PC 로컬·사무실PC 모두 1.141.0 2a59476c · 클로드 확장 = 미니PC 로컬·미니PC 서버 사본·사무실PC 로컬 모두 2.1.292 · Remote-SSH 0.126.0 유지 · doctor 8/8 PASS |
| 판 비교 기준(26.9.30 doctor 수정) | 폴더 목록 대신 extensions.json(실제 로드 목록) 의 판을 비교한다 — 폴더엔 .obsolete(다음 기동 때 지울 옛 판)가 섞여 오판했다 |
| doctor 오탐(26.9.29 수정) | 새 판 설치 직후 옛 판 폴더가 재시작 전까지 남는데, 사무실 쪽은 줄바꿈·미니 쪽은 공백으로 이어 비교해 FAIL 이 났다 → 양쪽 정렬·공백 결합으로 통일(C:\dev\tools\vscode-claude-doctor\doctor.py L69) |
| 사무실PC 사용자 설정 | preferredLocation:panel · chat.agentHost.claudeAgent.enabled:false · chat.disableAIFeatures:true · enableNewConversationShortcut:true |
| 미니PC Machine 설정 | preferredLocation:panel |
| 사무실PC 키바인딩 | Ctrl+Alt+N/Ctrl+Alt+Shift+N/Ctrl+Alt+S |
| 되돌리기 | 설정 백업 C:\Users\poinpc\AppData\Roaming\Code\User\settings.json.bak-20260923 |
원격 세션에서 실제 브라우저 GUI 띄우고 코디가 제어하기 (구글/OAuth 로그인 필요 작업)
적용 대상: 어떤 프로젝트든, 페페가 원격(사무실PC→VS Code Remote)으로 미니PC(POIN-MINI)를 쓰는 중에 브라우저 GUI를 페페에게 보여주며 사람 로그인이 필요한 작업(구글/Pinterest/OAuth 로그인, 계정 폼 제출 등)을 할 때. 2026-07-15 Pinterest Standard 승격 폼 제출에서 확립.
왜 어려운가 — 함정 3개 연쇄
- Session 0 격리: Claude Code Bash background 프로세스는 Session 0(비대화형)에서 돈다. 페페가 보는 미니PC 데스크톱은 Session 1(console/delix/Active). Session 0에서 띄운 크롬은 렌더·스크린샷은 되지만 페페 화면·작업표시줄엔 안 뜬다. 확인:
(Get-Process -Id $PID).SessionId=0,Get-Process explorer.SessionId=1. - Playwright가 launch한 크롬은 구글 로그인 차단:
launch_persistent_context(channel='chrome')로 Playwright가 실행한 크롬은 CDP 피제어라 구글이 자동화로 감지→로그인 거부.--no-sandbox배너도 뜬다.ignore_default_args·navigator.webdriver숨김으로도 안 풀림(실측). - → 정답: 순수 크롬을 사람이 로그인 → 코디는 연결(connect)만.
절차 (복붙 가능)
1) 순수 chrome.exe를 전용 프로필 + 디버깅 포트로 Session1 실행 (schtasks /it /ru delix):
schtasks //Delete //TN "gui_chrome_cdp" //F 2>/dev/null
schtasks //Create //TN "gui_chrome_cdp" //TR "\"C:\Program Files\Google\Chrome\Application\chrome.exe\" --user-data-dir=C:\dev\<tool>\.chrome-login --remote-debugging-port=9222 --no-first-run --new-window <URL>" //SC ONCE //ST 23:59 //RL LIMITED //IT //RU delix //F
schtasks //Run //TN "gui_chrome_cdp"
- 전용
--user-data-dir필수: 기본 프로필은 이미 실행중인 크롬 인스턴스가 잡아 새 창이 그 세션으로 가로채임 → Session1에 독립적으로 못 뜬다. - TR엔 chrome.exe 직접 지정(배치의
start ""는 schtasks 컨텍스트에서 세션1에 못 띄우는 경우 있음). - 검증:
curl -s http://127.0.0.1:9222/json/version(Browser 응답) + 크롬 프로세스SessionId==1.
2) 페페가 그 창에서 직접 로그인 (순수 크롬이라 구글/OAuth 정상). 로그인은 .chrome-login 프로필에 저장됨.
3) 코디는 CDP로 "연결"만 — Playwright launch 금지:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp('http://127.0.0.1:9222')
ctx = browser.contexts[0]
page = next((pg for pg in ctx.pages if '<대상URL조각>' in pg.url), ctx.pages[-1])
page.bring_to_front()
# ... 폼 자동작성(el.fill), 파일 업로드(input[type=file].set_input_files(경로)) 등
browser.close() # 연결만 끊음, 크롬 창은 유지됨
- 연결은 자동화 감지에 안 걸린다(로그인은 이미 사람이 함).
4) reCAPTCHA·최종 제출은 페페가 그 창에서 직접(봇 감지라 코디 자동클릭 불가).
요지
원격 세션에서 "사람 로그인 + 코디 자동조작"이 둘 다 필요 → 순수 크롬을 schtasks Session1 + 디버깅 포트로(사람 로그인), 코디는 connect_over_cdp로 붙는다. Playwright가 크롬을 launch하면 로그인이 막히므로 절대 launch하지 말 것. 정리: 끝나면 schtasks //Delete, .chrome-login은 로그인 유지 위해 남겨둘 수 있음(민감하면 삭제).
관련: 코디 메모리 remote-real-chrome-gui-cdp, cody-acad-capture-noninvasive(Session0/DCOM COM 실패), chatgpt-plus-bridge(헤드풀 로그인 브리지).