dsh-web-ui: DSH 공식 웹 GUI를 수정하지 않고 태스크 보드와 모바일 원격을 더하는 플러그인 모음

dsh-web-ui 소개

터미널 코딩 에이전트에 웹 화면이 제공되기 시작한 뒤로 브라우저에서 에이전트와 대화하는 일 자체는 익숙해졌습니다. 그런데 대화창 하나로 하루 작업이 끝나지는 않습니다. 매일 밤 같은 점검 작업을 예약해 두고 싶을 때, 방금 에이전트가 만든 커밋이 어느 브랜치에 올라갔는지 확인하고 싶을 때, 자리를 비운 사이 휴대폰으로 진행 상황을 이어받고 싶을 때는 브라우저를 떠나 다른 도구로 옮겨야 합니다. 이런 기능을 직접 추가하려면 보통 웹 UI를 포크해서 고치게 되는데, 그러면 본체가 새 버전으로 갱신될 때마다 같은 수정을 되풀이해야 합니다.

이번에 소개할 dsh-web-ui는 DeepSeek Harness (:pytorch::kr: DeepSeek Harness: 에이전트 루프까지 설정으로 교체하는 플러그인 구조의 코딩 에이전트)(이하 DSH)의 웹 GUI(dsh web)에 그런 기능을 플러그인(Plugin)으로 더하는 저장소입니다. 이름만 보면 웹 GUI 자체를 갈아 끼우는 대체 UI처럼 읽히지만, dsh-web-ui는 공식 프로필(Profile) 메커니즘으로 기존 dsh web 에 마운트되며 DSH 소스는 건드리지 않습니다. 태스크 보드, Git 그래프, 모바일 원격, SSH 운영, 이미지 이해, 캐릭터 펫, 스킨 센터가 각각 독립 패키지로 나뉘어 있어서 전체를 한 번에 설치할 수도 있고 필요한 하나만 골라 기존 화면에 추가할 수도 있습니다.

저장소는 zhu1090093659가 TypeScript로 개발하고 있으며, 플러그인들은 npm의 @linxin666 스코프로 배포됩니다. 그래서 저장소를 클론하지 않고도 dsh plugin 명령 한 줄로 설치가 끝나고, 개별 플러그인만 골라 넣는 것도 같은 방식입니다. 저장소를 직접 클론해 빌드하는 경로는 개발용으로만 안내되어 있고 Node.js 22 이상과 pnpm이 필요합니다.

기본 dsh web과 dsh-web-ui의 차이

dsh-web-ui가 무엇을 더하는지는 저장소가 README 상단에 정리해 둔 비교 표가 가장 빠릅니다. 아래는 그 표를 원문 순서대로 옮긴 것입니다:

기능 기본 dsh web dsh-web-ui 적용
에이전트 프리셋 공식 프리셋(Standard, Minimal 등) Liang Shen Mode: DeepSeek V4 Pro에 맞춘 2단계 궤적 고정
태스크 보드 없음 다중 컬럼 보드와 cron 예약 실행
Git 시각화 없음 브랜치 레인과 커밋 히스토리 그래프
파일 미리보기와 변경 확인 없음 오른쪽 패널(탐색기, 편집기, 터미널, Git, 브라우저)
모바일 원격 없음 QR 페어링과 SSE 실시간 동기화, 같은 링크로 PC 브라우저도 페어링
원격 서버 운영 없음 SSH 패널(터미널, 전송, 터널, 클러스터)
이미지 이해 없음 describe_image 비전 도구
테마와 스킨 기본 테마 스킨 센터, 적용 전 미리 입어보기

이 비교는 저장소가 직접 작성한 것이고, "없음" 칸은 기본 dsh web 에 그 기능이 없다는 개발자의 설명입니다. 각 기능의 상세 설명과 제약은 패키지별 README로 나뉘어 있으며, 오른쪽 패널처럼 외부 플러그인이 맡는 항목은 그 출처 저장소까지 밝혀져 있습니다.

DSH 생태계에서 웹 화면을 손대는 시도가 dsh-web-ui만은 아닙니다. DSH Desktop은 Node.js 설치 없이 DSH를 실행하는 별도 데스크톱 애플리케이션이고, dsh-TUI는 웹이 아니라 터미널 전체 화면 UI를 채웁니다. dsh-web-ui는 이 둘과 달리 실행 환경을 바꾸지 않고 이미 쓰고 있는 공식 웹 GUI 안에서 기능을 늘리는 쪽을 골랐습니다.

dsh-web-ui의 계층 구조

위 그림은 dsh-web-ui가 어느 계층에 올라가는지 보여줍니다. 모든 플러그인은 DSH의 공식 프로필 구조로 dsh web 호스트에 마운트되고, 화면을 바꾸는 일과 기능을 더하는 일이 서로 다른 계층으로 나뉘어 있습니다. 플러그인은 로직을, 스킨은 외형을 담당한다는 것이 저장소가 설명하는 경계입니다.

스킨 쪽 구조는 v2 재작업을 거치며 한 번 바뀌었습니다. 예전에는 스킨 하나가 공식 DSH에 결합된 npm 패키지였는데, 지금은 skin.json 명세와 스타일, 이미지, 선택적 효과 스크립트가 들어 있는 순수 에셋 디렉토리입니다. 스킨 센터라는 단일 로더가 이 디렉토리를 즉시 읽어 들이므로, 스킨을 새로 추가하려면 디렉토리 하나를 넣으면 되고 배포나 설치 절차가 필요하지 않습니다. 공식 본체가 갱신되어도 스킨은 영향을 받지 않습니다.

dsh-web-ui의 주요 플러그인

Liang Shen Mode: 첫 턴만 도구를 줄이는 2단계 프리셋

DeepSeek V4 Pro는 첫 턴에 보이는 도구 목록에 민감하다는 것이 이 플러그인의 출발점입니다. 저장소는 커뮤니티 평가(xiaobright/modeltest)에서 공식 Standard 프리셋과 PTC 프리셋이 91점과 92점을 받은 반면 Minimal 프리셋은 99점과 96점을 받았다고 인용하는데, Minimal에는 도구가 두 개뿐이라는 대가가 따릅니다.

Liang Shen Mode(梁神模式)는 이 두 프리셋을 한 세션 안에서 순서대로 사용합니다. 새 세션을 열 때 프리셋 선택기에서 이 모드를 고르면 첫 턴은 Minimal처럼 동작해 지속 bash 와 str_replace_editor 만 노출하고 사용자 메시지만 통과시킵니다. 궤적이 고정된 뒤에는 PTC Mode로 자동 전환되어 전체 도구 레지스트리와 워크스페이스 지시문, 스킬 디렉토리가 복원됩니다. 개발자가 Windows 환경에서 DeepSeek V4 Pro로 측정한 값은 98점과 99점, 평균 98.5점입니다. 원리와 안정화 제어, 한계는 dsh-liangshen 패키지 README에 따로 정리되어 있습니다.

태스크 보드: cron으로 예약 실행까지 하는 작업 보드

태스크는 계획 전, 할 일, 진행 중, 완료, 실패의 다섯 컬럼으로 놓입니다. 카드의 실행 버튼을 누르면 그 작업이 실제 DSH 에이전트 세션으로 넘어가고, 끝나면 카드 상태가 자동으로 갱신됩니다. 무슨 일이 있었는지 확인하려면 실행 세션으로 되돌아가 전체 기록을 볼 수 있습니다.

예약 실행은 상세 화면에서 cron 표현식으로 지정합니다. 매일 23시에 DSH를 자동 업그레이드하거나 월요일 9시에 주간 보고서를 만드는 식이고, 스케줄은 브라우저 탭이 아니라 dsh web 호스트에서 실행되기 때문에 브라우저를 닫아도 계속됩니다.

모바일 원격: QR 코드로 연결하는 두 번째 화면

사이드바 아래쪽 휴대폰 아이콘이 페어링 패널을 엽니다. QR 코드를 찍거나 링크를 복사해 페어링하면 휴대폰에 전용 모바일 화면이 열려서 현재 작업 공간의 세션 목록을 보고, 새 세션을 만들고, 메시지를 주고받고, 모델과 추론 노력(reasoning effort), 권한 프리셋까지 데스크톱과 같은 상태로 조작할 수 있습니다. 같은 페어링 링크의 데스크톱 URL 형태를 다른 컴퓨터에서 열면 그 컴퓨터에서 전체 웹 GUI가 실행됩니다.

보안 관련 설명도 함께 정리되어 있습니다. 트래픽은 페어링 게이트를 통과한 /remote/api 채널로만 흐르고, 페어링하지 않은 기기는 안내 배너만 볼 수 있습니다. 페어링 토큰은 일회용이고 유효 시간이 있으며, 중지 버튼으로 모든 기기의 권한을 언제든 회수합니다. 저장소는 터널 도메인에 --trusted-host 를 설정하는 방식은 권장하지 않는다고 밝히고 있습니다. 그 플래그를 켜면 SDK의 /api 가 페어링 게이트를 우회하기 때문입니다.

SSH 운영과 이미지 이해

SSH 패널은 키 인증과 비밀번호 인증을 지원하고 ~/.ssh/config 에서 호스트를 한 번에 가져옵니다. 설정된 호스트에는 xterm.js 기반 웹 터미널, 진행률이 표시되는 SFTP 업로드와 다운로드, 127.0.0.1에만 바인딩되는 포트 포워딩, 별칭이나 태그로 걸러 여러 대에 한 번에 명령을 실행하는 클러스터 기능이 제공됩니다. 에이전트도 같은 호스트 설정을 공유하므로 대화 중에 원격 명령을 실행하게 할 수 있습니다.

이미지 이해는 텍스트 전용 모델에 시각 입력을 더해 주는 도구입니다. 대화에서 이미지가 언급되면 describe_image 가 미리 설정한 OpenAI 호환 비전 엔드포인트로 그 이미지를 보내고 답변을 받아 옵니다. 이때 세션 기록에 들어가는 것은 돌아온 텍스트뿐이고 이미지 자체는 들어가지 않습니다. prompt 인자로 OCR이나 UI 진단, 번역 같은 지시를 따로 줄 수도 있습니다.

오른쪽 패널은 dsh-web-ui가 직접 만든 것이 아니라 외부 플러그인 dsh-better-sidebar가 담당하며, 집합 패키지에 통합되어 기본 활성 상태로 들어갑니다. 이전에 쓰였던 aionui-panel 패널은 지원이 종료되어 기본 비활성이고 이후 버전에서 집합 패키지에서 빠질 예정입니다.

dsh-web-ui의 스킨 센터

스킨 센터의 모든 스킨은 적용 전에 미리 입어볼 수 있습니다. 미리보기는 즉시 반영되고 화면을 벗어나면 원래 상태로 완전히 되돌아가며, 마음에 들 때 적용 버튼을 눌러야 저장됩니다. Windows XP의 Luna 인터페이스를 재현한 스킨처럼 성격이 뚜렷한 것부터 반투명 패널 아래에 일러스트를 배치하는 스킨까지 들어 있습니다.

Wallpaper Engine 라이브러리를 GUI 배경으로 사용하는 기능도 있습니다. 동영상과 웹 배경은 동적으로 재생되고 씬 배경은 정지 프레임으로 들어가며, 어떤 종류든 애니메이션이 없는 정지 이미지로 고정할 수 있습니다. Wallpaper Engine이 설치되지 않은 환경(macOS 등)에서는 .mp4 나 .webm 이 들어 있는 폴더를 수동으로 라이브러리로 지정합니다. 배경으로 쓰는 파일은 로컬에 있는 사용자 소유 파일이며 업로드나 재배포는 하지 않는다고 저장소가 밝히고 있습니다.

dsh-web-ui 설치 및 사용법

전제 조건은 DSH가 설치되어 있고 dsh web 이 정상적으로 실행되는 상태입니다. npm 설치 경로에는 그 밖의 준비물이 필요하지 않습니다. 집합 패키지 하나로 전체를 넣는 명령은 다음과 같습니다:

dsh plugin --profile web add @linxin666/dsh-web-ui-all@latest

설치 후 dsh web 을 재시작하면 사이드바에 플러그인 항목들이 나타납니다. 페이지 새로 고침만으로는 부족하고 dsh web 프로세스를 다시 띄워야 합니다. 이후 설정 화면의 플러그인 설정에서 개별 플러그인을 켜고 끄거나 스킨 센터에서 스킨을 시험해 봅니다.

필요한 것만 고르려면 패키지 이름으로 하나씩 설치합니다:

dsh plugin --profile web add @linxin666/dsh-liangshen@latest             # Liang Shen Mode
dsh plugin --profile web add @linxin666/dsh-client-ui-task-board@latest  # 태스크 보드
dsh plugin --profile web add @linxin666/dsh-ssh@latest                   # SSH 원격 운영
dsh plugin --profile web add @linxin666/dsh-tool-describe-image@latest   # 이미지 이해 도구
dsh plugin --profile web add @linxin666/dsh-client-ui-skin-center        # 스킨만

설치가 반영됐는지 확인하려면 dsh --profile web --dump-config 로 마운트된 설정 계층을 봅니다. 사이드바에 아무것도 없다면 대부분 dsh web 재시작을 빠뜨린 경우입니다. 제거는 dsh plugin --profile web remove @linxin666/dsh-web-ui-all 뒤에 재시작입니다.

dsh-web-ui를 쓸 때 알아둘 제약

저장소가 README에 따로 정리해 둔 제약이 있고, 그중 둘은 설치 전에 알고 있어야 하는 종류입니다.

  • SSH 자격증명은 평문으로 저장됩니다: 비밀번호와 키 패스프레이즈가 ~/.dsh/dsh-ssh.json 에 평문으로 들어가며 파일 권한만 0600으로 제한됩니다. 재연결 시 멱등하지 않은 명령이 다시 실행될 수 있고, 원격 출력은 가려지지 않은 상태로 돌아옵니다.
  • 예약 실행은 놓친 시점을 되돌려 주지 않습니다: 호스트가 멈춰 있거나 컴퓨터가 잠든 사이에 지나간 실행 시점은 건너뛰고 다시 실행하지 않습니다. 선택 항목인 절전 보호는 기본 비활성이고, 켜도 유휴 상태의 시스템 절전만 막습니다. 덮개를 닫거나 수동으로 절전에 들어가는 경우는 대상이 아닙니다.
  • 모바일 실시간 푸시는 터널 종류에 따라 늦어집니다: 모바일 원격은 SSE(Server-Sent Events)로 실시간 메시지를 받는데, Cloudflare quick tunnel(trycloudflare.com)과 Tailscale Serve는 SSE를 통과시키지 않습니다. 이런 네트워크에서는 플러그인이 폴링으로 전환되어 메시지는 오가지만 새 메시지가 몇 초 늦게 도착합니다.
  • 저장소 설치는 개발용입니다: npm 설치는 해당하지 않지만, 저장소를 클론해 설치하는 경로는 Node.js 22 이상과 pnpm을 요구하며 개발 목적으로만 안내됩니다.

pnpm 쪽 함정도 하나 기록되어 있습니다. pnpm 11의 minimumReleaseAge 기본값이 24시간이라 새로 나온 버전을 조용히 건너뛰고 이전 버전을 설치하는데, 구버전 스킨 센터는 스킨을 적용한 뒤 재시작할 때 모듈을 찾지 못해 실행이 중단됩니다. 프로필의 pnpm-workspace.yaml 에서 @linxin666/* 를 minimumReleaseAgeExclude 에 넣어 두는 것이 저장소가 안내하는 해결책입니다.

dsh-web-ui는 누구에게 유용한가

이미 DSH를 웹 GUI로 쓰고 있고 예약 작업이나 원격 접속을 다른 도구로 나눠서 처리하고 있다면 얻는 것이 분명합니다. 설치가 명령 한 줄이고 프로필 계층에만 적용되므로 마음에 안 들면 제거도 한 줄이라, 시험해 보는 비용이 낮은 편입니다. 반대로 DSH를 터미널에서만 쓰거나 dsh web 을 띄우지 않는 환경이라면 이 저장소가 더하는 것이 없습니다. SSH 자격증명을 평문으로 두는 설계가 조직 정책과 맞지 않는 경우에는 SSH 플러그인만 빼고 나머지를 개별 설치하는 편이 낫습니다. UI 문서와 커뮤니티 안내가 중국어 위주라는 점도 감안할 부분이며, README는 영문판이 함께 관리되고 있습니다.

dsh-web-ui의 라이선스

dsh-web-ui는 Apache-2.0으로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.

단, 스킨 하나는 조건이 다릅니다. Maid Atelier 스킨은 CC BY-NC-SA 4.0으로 별도 배포되어 비상업적 용도로만 쓸 수 있으므로, 업무 환경에 적용하기 전에 이 스킨을 쓰고 있는지 확인해야 합니다. 오른쪽 패널을 담당하는 dsh-better-sidebar는 외부 플러그인으로 MIT 라이선스이며, 저장소는 반영된 서드파티 코드가 각자의 LICENSE와 저작자 표시를 유지한다고 밝히고 있습니다.

:house: DeepSeek Harness Gallery (dsh-web-ui 스킨을 모아 둔 갤러리 사이트)

:github: dsh-web-ui 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 초안을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 댓글로 알려주시기를 부탁드립니다. :hugs:

이 도구를 직접 설치해 사용해보셨다면, :pytorch:파이토치 한국 사용자 모임:south_korea: 회원들을 위해 경험이나 팁을 댓글로 남겨주세요! :folded_hands: