DSH 플러그인 부트스트랩
새 머신에서 DeepSeek Harness (DSH) 플러그인 세트를 복원합니다.
진실 공급원은 plugins.json입니다. 모든 플러그인은 정확한 버전으로 고정되어 있으며, 노트와 선택적 사후 설치 설정이 포함됩니다. 스크립트는 사용자가 패키지 이름을 기억하지 않아도 설정을 재현합니다.
사용자 스토리
저는 새 머신에 있습니다. 다른 머신에서 사용하던 모든 DSH 플러그인을 동일한 버전과 핵심 동작으로 설치하고 싶습니다.
새 머신에 이 스킬 설치하기
공개 저장소 위치는 다음과 같습니다:
https://github.com/GGGengXXX/make-dsh-better
새 머신에서:
git clone https://github.com/GGGengXXX/make-dsh-better.git
mkdir -p ~/.agents/skills
cp -R make-dsh-better/skills/dsh-plugin-bootstrap ~/.agents/skills/
이미 저장소를 클론한 경우, 스킬 디렉토리만 복사하면 됩니다. 그런 다음 새 DSH 세션을 시작하세요. DSH는 ~/.agents/skills/<이름>/SKILL.md 아래에서 스킬을 발견하며, 스킬은 dsh-plugin-bootstrap으로 나타납니다. 이미 해당 디렉토리에 스킬이 있다면 복사를 건너뛰세요.
작업 사본이 진실 공급원이므로, 변경 후에는 다시 복사하세요.
이 스킬이 하는 일
plugins.json(버전 고정 플러그인 목록)을 읽습니다.- 적절한 DSH CLI를 감지합니다.
desktop프로필은 Desktop 앱에서 예약되어 있으므로, 스킬은 일반적인PATH상의dsh보다 앱 번들 CLI 래퍼를 선호합니다. - DSH 버전을 매니페스트와 비교하여 불일치 시 경고 또는 차단합니다.
- 설치/업데이트/건너뛰기 계획을 보여주고, 확인을 요청한 후 각 플러그인을
dsh plugin --profile <profile> add <name>@<version>으로 설치합니다. - 선택적으로 프로필 수준의
dsh-browser-cdp설정 (Chrome 경로 +--headless)을cordis.patch.yml에 적용합니다. - 각 플러그인이 의존성과 선택된 번들 모두에 있는지 확인합니다.
- 선택적으로 두 가지 버전 고정 로컬 패치를 적용합니다:
[email protected]:optimizeComposerKeys기본값 true.[email protected]: Enter=새 줄, Cmd/Ctrl+Enter=전송.
비밀키, API 키, 세션, 작업 공간 파일 또는 전체 ~/.dsh 디렉토리는 복사하지 않습니다.
사용자가 이 스킬을 호출할 때의 워크플로우
스킬 디렉토리 (이 SKILL.md가 있는 디렉토리)에서 작업합니다.
1. 아무것도 건드리기 전에 검사
node scripts/install.mjs --profile desktop --dry-run
계획을 사용자에게 보여줍니다. 계획에 설치 또는 업데이트가 포함된 경우, --dry-run 없이 실행하기 전에 명시적 확인을 요청하세요.
사용자의 대상이 Desktop 앱이 아닌 경우, 실제 프로필을 전달하세요 (예: --profile web 또는 --profile tui). Desktop이 아닌 프로필의 경우 PATH 상의 일반 dsh로 충분하며, 스크립트가 처리합니다.
2. 설치
node scripts/install.mjs --profile desktop --yes
유용한 플래그:
| 플래그 | 의미 |
|---|---|
--dry-run | 계획만 출력; 아무것도 변경하지 않음 |
--yes / -y | 비대화형 확인 |
--json | stdout에 머신이 읽을 수 있는 요약 (로그는 stderr로) |
--no-config | cordis.patch.yml을 건드리지 않음 |
--skip <pkg> | 하나의 플러그인 건너뛰기 (반복 가능) |
--strict | 정확한 DSH 버전 일치 요구 |
--allow-dsh-mismatch | major.minor가 달라도 계속 진행 |
--dsh-cli <path> | 명시적 CLI 경로 |
--manifest <path> | 다른 매니페스트 사용 |
스크립트는 멱등적입니다: 이미 고정된 버전으로 설치되고 번들로 선택된 플러그인은 건너뜁니다.
3. 선택적 로컬 패치 적용
사용자가 소스 머신의 정확한 핵심 동작을 원하는 경우에만:
node scripts/apply-patches.mjs --profile desktop --dry-run
node scripts/apply-patches.mjs --profile desktop --yes
이것은 node_modules/ 아래 설치된 타사 파일을 수정합니다. 버전 불일치 시 --force가 없으면 거부하며, .bak-<타임스탬프> 복사본을 유지합니다. 사용자에게 이것이 로컬 패치이며, 향후 플러그인 업데이트 시 덮어쓸 수 있음을 알리세요. 업데이트 후 패치 스크립트를 다시 실행하거나 플러그인 설정에서 동작을 설정하세요.
--only keyboard와 --only markdown은 패치 범위를 제한합니다.
4. 재시작 / 새로고침
플러그인 설치 후, 사용자에게 DeepSeek Harness를 재시작 (또는 Web UI에서 Cmd+Shift+R로 하드 새로고침)하라고 알리세요. 클라이언트 번들은 페이지 로드마다 캐시되므로 일반 새로고침으로는 충분하지 않을 수 있습니다.
5. 확인
설치 프로그램은 확인 테이블을 출력합니다. 플러그인이 FAIL을 표시하면 다음을 확인하세요:
- 프로필의
package.json의존성과dsh.profile.bundles; - 패키지 버전이 실행 중인 DSH 버전과 호환되는지;
~/.dsh/profiles/<profile>/.plugin-manager/logs/의 플러그인 관리자 로그.
매니페스트 업데이트 (소스 머신에서 캡처)
사용자가 주 머신에서 플러그인을 설치/제거할 때 매니페스트를 새로고침합니다:
node scripts/capture.mjs --profile desktop --dry-run # 미리보기
node scripts/capture.mjs --profile desktop # plugins.json 쓰기
이것은 프로필의 선택된 번들을 읽고, 각각의 설치된 버전을 기록하며, 기존 note 필드를 유지합니다. 그 후 스킬 디렉토리를 커밋/푸시 (또는 새 머신으로 복사)하세요.
Desktop 프로필 규칙
일반 DSH CLI는 --profile desktop을 의도적으로 거부합니다:
error: profile "desktop" is managed exclusively by the Electron application
대신 Desktop 앱의 CLI 래퍼를 사용하세요:
/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh
install.mjs는 macOS에서 자동으로 이를 찾습니다. 다른 플랫폼 또는 앱이 다른 위치에 있는 경우 DSH_CLI를 설정하거나 --dsh-cli를 전달하세요.
매니페스트 형식
plugins.json:
{
"schemaVersion": 1,
"targetProfile": "desktop",
"dshVersion": "0.2.1-rc.2",
"plugins": [
{ "name": "@scope/plugin", "version": "1.2.3", "note": "이 플러그인이 여기 있는 이유" }
],
"config": {
"dsh-browser-cdp": {
"chromePath": "auto",
"runtimeArgs": "--headless"
}
},
"localPatches": [
{ "package": "dsh-keyboard-shortcut", "version": "0.2.0", "description": "..." }
]
}
dshVersion은 매니페스트가 캡처된 버전입니다. 동일한 major.minor는 경고와 함께 허용됩니다. 다른 major.minor는--allow-dsh-mismatch가 필요합니다.targetProfile은 기본값일 뿐이며,--profile로 재정의됩니다.config.dsh-browser-cdp.chromePath: "auto"는 설치 프로그램이 일반적인 Chrome/Chromium/Edge/Brave 위치를 검색하게 합니다. 검색이 실패하면 명시적 경로를 설정하세요.localPatches는 사람을 위한 문서입니다. 설치 프로그램이 자동으로 적용하지는 않습니다.apply-patches.mjs를 명시적으로 실행하세요.
포함된 플러그인 세트 (2026-10-24에 캡처됨)
| 플러그인 | 버전 | 역할 |
|---|---|---|
@flyer103/dsh-side-chat | 0.6.0 | 오른쪽 사이드바 네이티브 사이드 대화 |
dsh-browser-cdp | 1.6.0 | Chrome/CDP를 통한 에이전트 브라우저; 헤드리스 감시 패널 |
dsh-keyboard-shortcut | 0.2.0 | Enter=새 줄, Cmd/Ctrl+Enter=전송 |
dsh-markdown-bubble | 0.1.5 | Markdown으로 렌더링된 사용자 메시지 |
dsh-markdown-input | 0.2.0-alpha.20 | 실시간 Markdown 컴포저 (알파) |
dsh-better-sidebar | 0.28.0 | 파일 트리 + 편집 가능한 CodeMirror + Git/작업/터미널 (무거움) |
참고:
dsh-markdown-input은 알파 버전입니다. 컴포저 점유가 잘못 동작하면 설정 → 플러그인에서 비활성화하세요.dsh-better-sidebar는 무겁고 자체 사이드 채팅을 포함합니다.@flyer103/dsh-side-chat과 공존할 수 있지만, 사용자에게 두 개의 사이드 채팅 진입점이 보입니다. 하나를 유지할지 결정하세요.- 내장 파일 및 문서 미리보기는 DSH 자체의 일부입니다. 이 매니페스트에 포함되지 않으며 설치가 필요 없습니다.
안전
- 타사 DSH 플러그인은 인-프로세스로 실행되며 사용자의 권한으로 실행될 수 있습니다. 사용자가 신뢰하는 매니페스트에서만 설치하세요.
- 정확한 버전이 고정되어 있습니다.
latest로 조용히 교체하지 마세요. - 로컬 패치는
node_modules를 수정합니다. 선택 사항이며, 버전이 고정되어 있고, 백업되며, 되돌릴 수 있습니다 (.bak 파일을 복원하거나 플러그인을 재설치하세요). - "플러그인 설치"의 일부로
~/.dsh/.credentials.yaml, 세션 로그 또는 작업 공간 파일을 복사하지 마세요.
문제 해결
| 증상 | 해결 방법 |
|---|---|
profile "desktop" is managed exclusively… | Desktop 앱 CLI 래퍼 또는 DSH_CLI 사용; 위 참조 |
Could not find a dsh CLI | DSH Desktop 설치, 또는 --dsh-cli /path/to/dsh 전달 |
profile "desktop" is not initialized | DSH Desktop을 한 번 열어 ~/.dsh/profiles/desktop 생성 |
ECONNRESET / fetch failed | 재시도; 설치 프로그램이 자동으로 한 번 재시도함; 네트워크/프록시/레지스트리 확인 |
| 플러그인 설치되었지만 UI 변경 없음 | DSH 재시작 또는 하드 새로고침 (Cmd+Shift+R); 클라이언트 번들이 캐시됨 |
| 플러그인 설치되었지만 활성화되지 않음 | dsh.profile.bundles에 있는지 확인; 플러그인 관리자의 add가 일반적으로 추가함 |
dsh-markdown-input 컴포저 없음 | 설정 → 플러그인 확인; 알파 플러그인; 하드 새로고침; 콘솔에서 슬롯/컴포저 오류 확인 |
dsh-better-sidebar/사이드 채팅 충돌 | 둘 다 부팅 가능; 하나의 사이드 채팅 진입점을 선택하거나 한 플러그인 제거 |
패치가 already-patched 표시 | 예상됨; 파일에 이미 대상 동작이 있음 |
패치가 skipped — version … 표시 | 매니페스트/플러그인 버전 변경됨; --force 사용 전 새 버전 검토 |
파일
| 파일 | 목적 |
|---|---|
SKILL.md | 이 워크플로우 |
plugins.json | 버전 고정 플러그인 매니페스트 |
scripts/install.mjs | Dry-run/설치/확인 |
scripts/capture.mjs | 라이브 프로필에서 매니페스트 새로고침 |
scripts/apply-patches.mjs | 선택적 로컬 핵심 동작 패치 |
patches/README.md | 패치 근거 및 수동 대체 방법 |