dsh-composer-plus 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +236 -0
- package/README.es.md +236 -0
- package/README.fr.md +236 -0
- package/README.hi.md +236 -0
- package/README.id.md +236 -0
- package/README.ja.md +236 -0
- package/README.ko.md +236 -0
- package/README.md +20 -14
- package/README.pt-BR.md +236 -0
- package/README.ru.md +236 -0
- package/README.tr.md +236 -0
- package/README.vi.md +236 -0
- package/README.zh.md +236 -0
- package/assets/features/featureIdeas.webp +0 -0
- package/assets/features/projectName.webp +0 -0
- package/assets/features/turnRollback.webp +0 -0
- package/client.js +259 -47
- package/index.js +122 -33
- package/package.json +2 -2
package/README.ko.md
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# dsh-composer-plus — DeepSeek Harness용 Composer Plus
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/dsh-composer-plus)
|
|
4
|
+
[](https://github.com/furkancak1r/dsh-composer-plus/actions/workflows/test.yml)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
[English](README.md) · [中文](README.zh.md) · [Türkçe](README.tr.md) · [Español](README.es.md) · [Português (Brasil)](README.pt-BR.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Русский](README.ru.md) · [日本語](README.ja.md) · **한국어** · [Bahasa Indonesia](README.id.md) · [Tiếng Việt](README.vi.md) · [हिन्दी](README.hi.md)
|
|
8
|
+
|
|
9
|
+
이 문서는 번역본입니다. 기준 문서는 영어 [README.md](README.md)입니다.
|
|
10
|
+
|
|
11
|
+
[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(dsh) 데스크톱 앱과 웹 UI를 위한 Codex 스타일 편의 기능 모음입니다. 변경 사항 패널, 스와이프 카드로 보는 기능 아이디어, 메시지 본문까지 찾는 사이드바 검색, 파일 복원을 포함한 턴 되돌리기, 휴지통으로 보내는 채팅 삭제, 입력란 아래의 프로젝트 이름, 사이드바의 프로젝트 상태, 입력 기록, 계획 모드 단축키, 원클릭 계속, 재시작 후 실행 중이던 채팅 이어서 실행, 대기열 끌어서 놓기, 세션 딥링크, 채팅별 자동 검토 허용, 백그라운드 알림, Tether 앱을 통한 iPhone 접속, 자동 업데이트를 제공합니다.
|
|
12
|
+
|
|
13
|
+
**한 줄 요약:** DeepSeek Harness 플러그인 하나(npm `dsh-composer-plus`, 설정 → 플러그인에서 **Composer Plus**로 표시)로 다음 기능을 추가합니다. git 변경 사항 패널, Tinder 스타일 기능 아이디어 카드, 메시지 속 단어도 찾는 사이드바 검색, ↶ 턴 되돌리기(채팅만 또는 채팅과 파일), 채팅 삭제, 입력란 아래의 프로젝트 이름, ↑/↓ 입력 기록, Shift+Tab `/plan` 전환, 원클릭 ▶ 계속, 재시작 후 이어서 실행, 끌어서 놓는 대기열 순서 변경, 세션 링크 복사, 자동 검토의 “이 채팅에서 허용”, 백그라운드 알림, iPhone 접속(모바일 연결, Tether 앱), 11개 추가 인터페이스 언어, 자동 업데이트.
|
|
14
|
+
|
|
15
|
+
<p align="center"><img src="docs/images/hero.webp" width="820" alt="Composer Plus를 사용하는 DeepSeek Harness: 실행 중인 프로젝트는 사이드바에 회전 표시가 나타나고, 변경 사항 패널은 git diff를 보여 줍니다"></p>
|
|
16
|
+
|
|
17
|
+
비공식 커뮤니티 플러그인입니다. 네트워크 호출은 업데이트 확인(GitHub 릴리스와 npm 레지스트리)뿐입니다. 시작할 때 이 호출을 막으려면 **자동 업데이트**를 끄세요. **기능 아이디어**는 **기능 제안**을 클릭할 때만 채팅 자체의 모델을 호출합니다. **모바일 연결**(기본값: 꺼짐)은 사용자가 켠 뒤에만 로컬 네트워크나 tailnet에서 오는 iPhone 연결을 받습니다.
|
|
18
|
+
|
|
19
|
+
## 설치
|
|
20
|
+
|
|
21
|
+
**데스크톱 앱:** 설정 → 플러그인 → **플러그인 추가** → `dsh-composer-plus` 입력 → **지금 활성화**.
|
|
22
|
+
npm 이름 대신 `https://github.com/furkancak1r/dsh-composer-plus`를 붙여 넣어도 됩니다.
|
|
23
|
+
|
|
24
|
+
**웹 / CLI 프로필:**
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
dsh plugin --profile web add dsh-composer-plus
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
그런 다음 dsh를 다시 시작하세요. (CLI는 데스크톱 프로필에 설치할 수 없습니다. 데스크톱 프로필은 앱이 관리합니다.)
|
|
31
|
+
|
|
32
|
+
> dsh의 pnpm은 게시된 지 24시간이 지나지 않은 버전을 건너뜁니다. 릴리스 직후에는 버전을 붙여서 설치하세요: `dsh-composer-plus@1.10.0`.
|
|
33
|
+
|
|
34
|
+
## 기능
|
|
35
|
+
|
|
36
|
+
| 기능 | 사용 방법 | 스크린샷 |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| **변경 사항 패널** | 오른쪽 사이드바 → `+` → **변경 사항**. **커밋 안 됨**, **스테이징 안 됨**, **스테이징됨**, **브랜치** 중 하나를 고르면 변경된 파일이 `+/-` 개수와 함께 표시됩니다. 파일을 클릭하면 diff를 볼 수 있습니다. **마지막 턴**은 최근 턴에 대한 dsh 자체 검토 화면을 엽니다. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="변경 사항 패널 스크린샷"></a> |
|
|
39
|
+
| **기능 아이디어** | 오른쪽 사이드바 → `+` → **기능 아이디어** → **기능 제안**. 채팅 자체의 모델이 채팅 프로젝트의 짧은 요약(최상위 파일, README와 매니페스트의 앞부분, 최근 커밋 15개)을 읽고 기능을 최대 8개 제안합니다. 제안은 dsh UI 언어로 된 카드 묶음으로 표시됩니다. 카드를 오른쪽으로 스와이프하면(또는 **✓** 클릭, `→` 누르기. 어느 방법이든 카드가 그쪽으로 날아갑니다) 같은 프로젝트에서 새 채팅이 시작됩니다. 새 채팅은 그 아이디어를 요청으로 삼아 계획 모드로 시작하므로, 계획을 승인하기 전에는 아무것도 바뀌지 않습니다. 계획을 건너뛰려면 **▶ 바로 구현**을 클릭하세요(또는 `↑` 누르기. 카드가 위로 날아갑니다). 새 채팅이 그 아이디어를 일반 요청으로 삼아 바로 시작하고, 모델이 변경을 적용한 뒤 검사를 실행합니다(승인은 평소대로 적용됩니다). 건너뛰려면 왼쪽으로 스와이프하세요(또는 **✕**, `←`). **실행 취소**(또는 `Z`)는 건너뛴 카드를 되돌립니다. 좋은 아이디어를 나중을 위해 저장하려면 **↓**를 클릭하세요(또는 `↓` 누르기). 아이디어는 프로젝트의 **나중에** 목록에 들어갑니다. 같은 프로젝트 폴더의 모든 채팅에서 이 목록이 보입니다(재시작 후에도). **나중에(N)** 버튼은 목록을 엽니다. **계획하기**는 그 아이디어로 같은 계획 모드 채팅을 시작하고, **바로 구현**은 계획 없는 채팅을 시작합니다. 둘 다 아이디어를 목록에서 뺍니다. **모두 함께 계획 (N)** 버튼은 목록의 모든 아이디어로 계획 모드 채팅 하나를 시작하므로, 공통 부분은 한 번만 계획됩니다. **목록에서 제거**는 아이디어를 삭제합니다. **아이디어 더 받기**는 카드를 추가합니다. 한 프로젝트에서 같은 아이디어는 두 번 제안되지 않습니다. 제안된 모든 아이디어(건너뛴 것, 저장한 것, 시작한 것)는 프로젝트의 **기록**에 들어갑니다. 모델에는 그 아이디어를 다시 제안하지 말라는 지시가 전달되고, 제목이 반복된 아이디어는 버려집니다. **기록**은 아이디어를 **시작됨** 또는 **제안됨**으로 표시해 보여 줍니다. **잊기**(또는 **모두 잊기**)를 누르면 그 아이디어가 다시 나올 수 있지만, 아직 **나중에** 목록에 있는 아이디어는 그 목록에서 제거할 때까지 제안에 나오지 않습니다. 모델은 클릭할 때만 실행됩니다. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="기능 아이디어 스크린샷"></a> |
|
|
40
|
+
| **내용 검색** | dsh 자체 사이드바 검색(**작업 공간** 옆의 돋보기. 데스크톱 앱에서는 `Cmd+K`, 브라우저에서는 `Cmd+Alt+K`)이 제목뿐 아니라 내 메시지와 답변 속 단어로도 채팅을 찾고, 일치하는 텍스트를 채팅 아래에 보여 줍니다. 이 검색은 dsh에 이미 있지만 꺼진 상태로 제공됩니다. 이 기능은 컴퓨터에 검색 색인 파일을 두고 그 검색을 켭니다. 색인은 dsh 시작 후 첫 검색 때 만들어지며(채팅 250개에 약 15초, 제한 사항 참고) 다음 시작 때도 그대로 쓰입니다. 기본적으로 켜져 있습니다. 변경 사항은 dsh를 다시 시작한 뒤 적용됩니다. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="내용 검색 스크린샷"></a> |
|
|
41
|
+
| **턴 되돌리기** | 내 메시지 위에 포인터를 올리고 **↶** 버튼(복사 옆)을 클릭하세요. **채팅만**은 그 메시지와 이후의 모든 내용(답변, 도구 호출)을 채팅과 모델 컨텍스트에서 빼고, 메시지를 입력란에 다시 넣습니다. 메시지를 고친 뒤 다시 보내세요. **채팅과 파일**은 먼저 그 메시지 이후 바뀐 프로젝트 파일 목록을 보여 주고, 그 파일도 이전 상태로 되돌립니다. dsh 편집 도구가 바꾼 내용뿐 아니라 명령(`bash`)이 바꾼 내용도 되돌립니다. 실행 중인 턴은 먼저 멈춥니다. 채팅 로그는 다시 쓰지 않습니다. 숨겨진 표시 하나가 철회된 부분을 가립니다. dsh 자체의 `/compact`가 오래된 메시지를 가리는 방식과 같습니다. [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin)이 설치되어 있으면 이 일은 그 플러그인이 맡고, Composer Plus는 두 번째 버튼을 보여 주지 않습니다. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="턴 되돌리기 스크린샷"></a> |
|
|
42
|
+
| **채팅 삭제** | 사이드바 → 채팅의 **…** 메뉴(또는 마우스 오른쪽 클릭) → **삭제…** → **삭제**. dsh 자체는 보관만 할 수 있습니다. 채팅은 멈추고(dsh 자체 보관처럼 턴, 작업, 하위 에이전트, 예약도 멈춤), 저장된 기록은 하위 에이전트 채팅과 함께 macOS 휴지통으로 이동합니다(다른 시스템에서는 `$DSH_HOME/trash`). 되살리려면 폴더를 원래 위치에 다시 넣고 dsh를 다시 시작하세요. 채팅은 사이드바의 **보관된 항목만** 보기에 나타납니다. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="채팅 삭제 스크린샷"></a> |
|
|
43
|
+
| **입력창에 프로젝트 이름** | 입력란 아래 줄(턴, 토큰, 캐시 적중, 컨텍스트)이 채팅의 프로젝트 이름으로 시작합니다. 그래서 채팅이 어느 프로젝트에서 작업하는지 항상 알 수 있습니다. 이 이름은 dsh 자체의 프로젝트 제목이며, 프로젝트에 제목이 없으면 폴더 이름입니다. 포인터를 올리면 전체 폴더 경로가 보입니다. 클릭하면 사이드바에서 그 채팅을 찾아 줍니다(목록 보기와 프로젝트 보기 모두 해당). 사이드바와 프로젝트가 열리고(접힌 프로젝트와 그 **더 보기**도 열립니다), 목록이 채팅까지 스크롤되며, 채팅이 5초 동안 깜박입니다. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="입력창에 프로젝트 이름 스크린샷"></a> |
|
|
44
|
+
| **입력 기록** | 빈 입력란에서 `↑` / `↓`를 누르면 터미널처럼 보낸 메시지를 차례로 불러옵니다. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="입력 기록 스크린샷"></a> |
|
|
45
|
+
| **계획 모드 단축키** | `Shift+Tab`은 초안 맨 앞에 `/plan `을 붙입니다(다시 누르면 제거). 채팅이 이미 계획 모드이면 `Shift+Tab`으로 계획 모드를 종료합니다. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="계획 모드 단축키 스크린샷"></a> |
|
|
46
|
+
| **입력란 포커스 유지** | `/` 명령이나 스킬을 보낸 뒤에도 커서가 입력란에 남아 바로 다시 입력할 수 있습니다. 명령을 입력하고 `Enter`를 누르는 키보드 매크로에서도 작동합니다. dsh는 명령을 처리하는 동안 입력란을 읽기 전용으로 만들고, 그때 브라우저가 포커스를 해제합니다. 이 기능은 포커스를 입력란으로 돌려놓습니다. 단, 메뉴, 대화 상자, 다른 입력 필드에 포커스가 있으면 돌려놓지 않습니다. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="입력란 포커스 유지 스크린샷"></a> |
|
|
47
|
+
| **원클릭 계속** | 턴이 중지되거나, 실패하거나, 중간에 끊긴 뒤에는 빈 입력란에 **▶**가 표시됩니다. 한 번 클릭하면 입력란에 아무것도 쓰지 않고, 보이는 채팅 메시지도 추가하지 않은 채 기존 대화를 이어 갑니다(모델은 “멈춘 곳에서 계속하라”는 짧은 숨은 메모를 받습니다. Claude 같은 일부 제공자는 어시스턴트 답변으로 끝나는 요청을 거부하기 때문입니다). 완료된 턴 뒤에는 일반 보내기 버튼이 그대로 있습니다. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="원클릭 계속 스크린샷"></a> |
|
|
48
|
+
| **재시작 후 이어서 실행** | 기본적으로 꺼져 있습니다. **설정 → Composer Plus**에서 켜세요. 채팅이 작업하는 중에 dsh를 종료하면(또는 dsh가 닫히면), dsh를 다시 열 때 그 채팅이 자동으로 이어집니다. 이때 원클릭 계속과 같은 숨은 메모를 씁니다. 목표 라운드(`/goal`)가 실행 중이었다면 목표는 다음 라운드로 계속됩니다(dsh는 시작할 때마다 목표를 일시 중지하고, 사용자가 재개할 때까지 기다립니다). 직접 중지한 채팅, 완료된 채팅, 실패한 채팅은 이어지지 않습니다. dsh 자체에는 이 설정이 없습니다. dsh는 이런 턴을 중단됨으로 표시할 뿐입니다. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="재시작 후 이어서 실행 스크린샷"></a> |
|
|
49
|
+
| **대기열 끌어서 놓기** | 대기 중인 메시지에 핸들(⠿)이 생깁니다. 끌어서 순서를 바꾸거나, 핸들에 포커스를 두고 `↑` / `↓`를 누르세요. `Esc`는 이동을 취소합니다. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="대기열 끌어서 놓기 스크린샷"></a> |
|
|
50
|
+
| **세션 링크 복사** | 사이드바에서 채팅을 마우스 오른쪽 버튼으로 클릭 → **세션 링크 복사**. `dsh-session:…` 링크를 다른 채팅에 붙여 넣으면 그 채팅이 읽기 전용 컨텍스트로 첨부됩니다. dsh 0.2.1에는 자체 **세션 ID 복사**가 있지만, 이 메뉴는 ID만 복사합니다. 이 항목은 그 바로 다음에 표시됩니다. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="세션 링크 복사 스크린샷"></a> |
|
|
51
|
+
| **프로젝트 경로 복사** | 사이드바에서 프로젝트를 마우스 오른쪽 버튼으로 클릭 → **경로 복사**를 선택하면 폴더의 전체 경로가 복사됩니다. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="프로젝트 경로 복사 스크린샷"></a> |
|
|
52
|
+
| **이 채팅에서 허용** | 자동 검토가 확인을 요청하면 승인 카드에 **이 채팅에서 허용**이 추가됩니다. 이후 같은 채팅의 같은 도구는 인수와 관계없이 허용됩니다. 헤더 칩에서 허용 목록을 보고 취소할 수 있습니다. 허용은 재시작 후에도 유지됩니다. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="이 채팅에서 허용 스크린샷"></a> |
|
|
53
|
+
| **프로젝트 상태** | 사이드바의 프로젝트 행에 그 채팅과 같은 실행 중 / 대기 중 / 완료 표시가 나타납니다. 그래서 접힌 프로젝트도 안의 채팅이 작업 중인지, 사용자의 조치가 필요한지 알려 줍니다. 사용자의 조치를 기다리는 채팅이 먼저 표시되고, 그다음 아직 열지 않은 완료된 채팅(초록색 점, 다른 채팅이 아직 실행 중일 때도 표시), 마지막으로 실행 중 표시가 나타납니다. 포인터를 올리면 자세한 내용이 보입니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="프로젝트 상태 스크린샷"></a> |
|
|
54
|
+
| **활성 프로젝트 우선** | 채팅이 실행을 시작하거나 사용자의 조치가 필요해지면, 그 프로젝트가 dsh 자체 행 애니메이션으로 사이드바 맨 위로 이동합니다(직접 끌어 올릴 때와 같은 움직임). 완료된 프로젝트는 제자리에 남으며, 평소처럼 원하는 곳으로 끌어 옮길 수 있습니다. 이동은 dsh의 프로젝트 순서에 저장되므로, 이 기능을 꺼도 현재 순서가 유지됩니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="활성 프로젝트 우선 스크린샷"></a> |
|
|
55
|
+
| **최근 프로젝트 필터** | 사이드바 → 보기 옵션(슬라이더 아이콘) → **최근 2시간 내 활성**. 이 옵션을 선택하면 사이드바에는 최근 2시간 안에 활성 채팅이 있었던 프로젝트만 표시됩니다. 활성 채팅은 그 시간 안에 업데이트된 채팅, 실행 중이거나 대기 중인 채팅, 열려 있는 채팅, 아직 열지 않은 완료된 채팅(dsh의 초록색 “완료” 점)입니다. 마지막 경우는 2시간이 지나도 해당됩니다. 이런 채팅이 없는 프로젝트는 숨겨지며, 새 프로젝트와 빈 프로젝트도 숨겨집니다. 모든 프로젝트를 다시 보려면 옵션을 다시 선택하세요. 선택은 이 기기에 저장됩니다. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="최근 프로젝트 필터 스크린샷"></a> |
|
|
56
|
+
| **모든 프로젝트 접기** | 사이드바에 열린 프로젝트가 있으면 보기 옵션(슬라이더 아이콘) 옆에 버튼이 나타납니다. 클릭하면 열린 프로젝트를 한 번에 모두 닫습니다. 예를 들어 프로젝트 5개 중 열린 3개를 한 번에 닫습니다. 열린 프로젝트가 없으면 버튼이 다시 숨겨집니다. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="모든 프로젝트 접기 스크린샷"></a> |
|
|
57
|
+
| **상태별 정렬** | 사이드바 → 보기 옵션 → **정렬 기준** → **상태별**(**하나의 목록**과 함께 사용). 완료된 채팅이 먼저 옵니다(dsh의 “완료” 점. 오류로 끝난 턴에도 이 점이 붙습니다). 그다음 실행 중이거나 대기 중인 채팅, 활성 자동화(예약)가 있는 채팅, 나머지 채팅이 dsh 순서대로 옵니다. 완료된 채팅을 열면 아래로 이동합니다. 보기만 바뀝니다. 원래대로 돌아가려면 **수동** 또는 **마지막 업데이트**를 선택하세요. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="상태별 정렬 스크린샷"></a> |
|
|
58
|
+
| **백그라운드 알림** | dsh가 백그라운드에 있을 때 턴이 끝나면(답변의 첫 줄과 함께) 알림을 받습니다. 채팅이 정말로 사용자를 기다릴 때도 알림을 받습니다. 기다리는 이유는 승인(도구 이름), 답변(질문), 계획 검토입니다. 요청이 1.5초 뒤에도 열려 있어야 알림이 갑니다. 그래서 자동으로 처리된 승인(자동 검토 허용, 다른 플러그인)은 알림을 보내지 않습니다. 요청에 답하면 알림도 바로 사라집니다. Dock/작업 표시줄 배지는 기다리는 채팅 수를 보여 줍니다. 알림을 클릭하면 그 채팅이 열립니다. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="백그라운드 알림 스크린샷"></a> |
|
|
59
|
+
| **11개 추가 UI 언어** | 설정 → Composer Plus → **애플리케이션 언어**에서 dsh 인터페이스 전체를 Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt, हिन्दी 중 하나로 바꿉니다(아래 참고). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="11개 추가 UI 언어 스크린샷"></a> |
|
|
60
|
+
| **모바일 연결(iPhone)** | [Tether](tether/) 앱으로 iPhone에서 dsh를 사용하세요. 같은 Wi-Fi나 [Tailscale](https://tailscale.com)을 통해 연결합니다. **설정 → Composer Plus**에서 켜세요(이 Mac에서 네트워크 포트를 열기 때문에 기본적으로 꺼져 있습니다). 그다음 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하세요. Tether에서 QR 코드를 스캔한 뒤 **Approve**를 클릭하세요. 휴대폰에서 채팅을 보고, 메시지를 보내고, 승인과 질문에 답하고, 모델과 에이전트를 바꿀 수 있습니다. Mac은 원하는 만큼 페어링할 수 있으며, 앱 왼쪽 위의 Mac 이름으로 Mac을 전환합니다. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="모바일 연결 스크린샷"></a> |
|
|
61
|
+
| **자동 업데이트** | dsh가 시작되면 플러그인이 [최신 GitHub 릴리스](https://github.com/furkancak1r/dsh-composer-plus/releases/latest)를 확인합니다. 더 새로운 버전이고 npm에도 올라와 있으면, dsh 자체 플러그인 관리자(설정 → 플러그인과 같은 경로)로 정확히 그 버전을 설치하고 알려 줍니다. 새 버전을 로드하려면 **dsh를 다시 시작**하세요. **설정 → Composer Plus → Composer Plus 업데이트**에서 버전을 볼 수 있고, **업데이트 확인** / **지금 업데이트** 버튼도 있습니다. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="자동 업데이트 스크린샷"></a> |
|
|
62
|
+
|
|
63
|
+
버튼, 툴팁, 안내 메시지, 알림은 선택한 dsh 언어를 따릅니다(아래 애플리케이션 언어 참고).
|
|
64
|
+
|
|
65
|
+
## 설정
|
|
66
|
+
|
|
67
|
+
모든 기능은 dsh **설정 → Composer Plus**에서 하나씩 켜거나 끌 수 있습니다. 각 행에는 작은 스크린샷이 있습니다. 포인터를 올리면 크게 미리 보고, 클릭하면 원래 크기로 엽니다(`Esc`로 닫기). 맨 위의 **기능 검색** 상자는 이름이나 설명으로 페이지를 걸러 냅니다(모든 언어, 대소문자와 악센트 구분 없음). `Esc`를 누르면 검색어가 지워집니다. 각 행에는 스위치와 짧은 설명이 있습니다. 변경 사항은 재시작 없이 바로 적용되고 그 기기에 저장됩니다. **모바일 연결**과 **재시작 후 이어서 실행**을 빼고 모든 기능이 기본적으로 켜져 있습니다. 이 두 기능과 **내용 검색**, **턴 되돌리기**의 스위치는 dsh의 Host가 보관합니다. 그래서 모든 창에 적용되고 재시작 후에도 유지됩니다. **내용 검색**은 dsh를 다시 시작한 뒤에만 바뀝니다(dsh가 시작할 때 이 값을 읽기 때문입니다). 그 전까지 해당 행에 **이 변경 사항을 적용하려면 dsh를 다시 시작하세요.**가 표시됩니다.
|
|
68
|
+
|
|
69
|
+
<p align="center"><img src="docs/images/settings.webp" width="720" alt="설정 → Composer Plus: 기능 검색, 언어 선택, 업데이트 행, 기능별 스위치, 포인터를 올리면 나타나는 스크린샷 미리 보기"></p>
|
|
70
|
+
|
|
71
|
+
### 애플리케이션 언어
|
|
72
|
+
|
|
73
|
+
**설정 → Composer Plus → 애플리케이션 언어**를 열고 **시스템 언어** 또는 13개 언어 중 하나를 선택하세요.
|
|
74
|
+
|
|
75
|
+
English · 中文 · Türkçe · Español · Português (Brasil) · Français · Deutsch · Русский · 日本語 · 한국어 · Bahasa Indonesia · Tiếng Việt · हिन्दी
|
|
76
|
+
|
|
77
|
+
<p align="center"><img src="docs/images/language-tr.webp" width="720" alt="Türkçe(터키어)로 바뀐 DeepSeek Harness 인터페이스"></p>
|
|
78
|
+
|
|
79
|
+
앱 전체가 바로 바뀝니다. 이 선택은 dsh 자체에 저장되는 `locale.preference`(일반 → 언어와 같은 설정)이므로 재시작 후에도 유지됩니다. **시스템 언어**는 이 선택을 지웁니다. 그러면 데스크톱 앱은 OS 언어를, 웹 UI는 브라우저 언어를 따릅니다. 지원하지 않는 언어이면 영어로 표시됩니다. 플러그인을 설치해도 이미 고른 언어는 절대 바뀌지 않습니다.
|
|
80
|
+
|
|
81
|
+
각 언어 팩에는 텍스트 3,143개가 있습니다. dsh `0.2.0-rc.2`와 `0.2.1-rc.2`의 모든 UI 텍스트(채팅, 사이드바, 설정, 승인, 예약, 파일 미리 보기, 플러그인 관리자, 플러그인 마켓), 플러그인 자체의 컨트롤, 인기 있는 [dsh-rewind](https://github.com/SiriLee/dsh-rewind) 플러그인의 텍스트가 포함됩니다. 번역하지 않는 것: 내 메시지, 모델 출력, 코드, 슬래시 명령 이름(`/plan`, `/compact`), `High` 추론 강도처럼 제공자가 정한 레이블, 다른 플러그인의 텍스트, 데스크톱 앱의 네이티브 메뉴와 업데이트 대화 상자(dsh가 영어/중국어로만 제공). 더 새로운 dsh가 추가한 문자열은 팩이 업데이트될 때까지 영어로 표시됩니다. 다른 플러그인이 이미 어떤 언어를 제공하면, 그 언어는 해당 플러그인의 것이 유지됩니다.
|
|
82
|
+
|
|
83
|
+
## 키보드 단축키
|
|
84
|
+
|
|
85
|
+
| 키 | 위치 | 동작 |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `↑` / `↓` | 빈 입력란 | 이전 / 다음 보낸 메시지 |
|
|
88
|
+
| `Shift+Tab` | 입력란 | `/plan ` 추가/제거 또는 계획 모드 종료 |
|
|
89
|
+
| `↑` / `↓` | 포커스된 대기열 핸들 | 대기 중인 메시지 이동 |
|
|
90
|
+
| `Esc` | 드래그하는 중 | 이동 취소 |
|
|
91
|
+
| `→` / `←` | 기능 아이디어 페이지 | 맨 위 카드 구현 / 건너뛰기 |
|
|
92
|
+
| `↓` | 기능 아이디어 페이지 | 맨 위 카드를 프로젝트의 나중에 목록에 저장 |
|
|
93
|
+
| `↑` | 기능 아이디어 페이지 | 맨 위 카드를 계획 없이 바로 구현 |
|
|
94
|
+
| `Z` | 기능 아이디어 페이지 | 마지막으로 건너뛴 카드 되돌리기 |
|
|
95
|
+
|
|
96
|
+
`/` 또는 `@` 메뉴가 열려 있으면 이 키는 메뉴가 사용합니다.
|
|
97
|
+
|
|
98
|
+
## 호환성
|
|
99
|
+
|
|
100
|
+
dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습니다. CI는 푸시할 때마다 테스트를 실행합니다.
|
|
101
|
+
|
|
102
|
+
## 개인정보 보호와 보안
|
|
103
|
+
|
|
104
|
+
- **계속:** 인증된 로컬 엔드포인트는 마지막으로 중단된 턴만 재개합니다. 오래되었거나 중복된 요청은 거부하고, 기존 승인 훅은 그대로 유지합니다. 새 사용자 메시지는 보내지 않습니다.
|
|
105
|
+
- **재시작 후 이어서 실행:** 켜기 전까지 꺼져 있습니다. Host 쪽은 채팅 ID와 시작 시각만 `$DSH_HOME/storages/dsh-composer-plus/resume.json`(소유자 전용 권한)에 보관합니다. 아무것도 컴퓨터 밖으로 나가지 않습니다. 마지막 턴을 사용자가 아니라 dsh가 멈췄다고 dsh 자체 로그에 기록된 경우에만 채팅을 이어 갑니다. 이어지는 턴에도 승인과 자동 검토가 평소대로 적용됩니다.
|
|
106
|
+
|
|
107
|
+
- **변경 사항 패널:** git은 dsh의 인증된 `/api` 채널을 거쳐, 내 컴퓨터의 채팅 폴더 안에서 읽기 전용으로 실행됩니다. 커밋, 스테이징, fetch는 절대 하지 않으며, git 자체가 나열한 경로만 보여 줍니다.
|
|
108
|
+
- **기능 아이디어:** **기능 제안**을 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽이 채팅 자체의 폴더만 읽습니다(브라우저는 경로를 보내지 않습니다). 읽는 내용은 최상위 항목 이름, README·AGENTS.md·매니페스트(`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …)의 처음 6 kB, `git log --oneline -15`이며, 합계 최대 16 kB입니다. `.env*`, 키 파일, `node_modules` 같은 폴더는 건너뜁니다. 폴더 안에 있는 일반 파일만 읽으며, 폴더 밖을 가리키는 심볼릭 링크, FIFO, 장치는 건너뜁니다. 이 요약은 dsh 자체 제공자 설정을 거쳐 채팅이 쓰는 모델에 요청 한 번으로 전달됩니다. 어떤 채팅에도 추가되지 않습니다. 프로젝트에는 아무것도 쓰지 않습니다. 오른쪽으로 스와이프한 아이디어는 계획 모드로 새 채팅을 시작하므로, 승인과 계획 검토가 평소대로 적용됩니다. **바로 구현**은 계획 모드 없이 채팅을 시작합니다. 모델이 바로 파일을 바꿀 수 있으며, 채팅의 평소 승인과 자동 검토가 적용됩니다. 나중을 위해 저장한 아이디어(제목, 요약, 이유, 작업량)는 프로젝트 폴더 경로와 함께 dsh 홈 아래 `storages/dsh-composer-plus/later.json`(소유자 전용 파일)에 보관됩니다. 프로젝트에는 아무것도 들어가지 않습니다. 제안된 아이디어의 기록(제목, 요약, 이유, 작업량, 날짜, 시작 여부)도 같은 방식으로 `storages/dsh-composer-plus/idea-history.json`에 보관되며, 프로젝트당 최대 200개입니다(가장 오래된 것부터 지워집니다). 그 제목들은 그 프로젝트에서 다음에 **기능 제안**을 누를 때 모델에 전달됩니다.
|
|
109
|
+
- **내용 검색:** 채팅을 검색하는 새 코드는 없습니다. 플러그인은 dsh 자체 메시지 색인(SQLite FTS5, `dsh-session-query-sqlite`)을 켜고, 그 색인에 `$DSH_HOME/cache/composer-plus/session-search.db` 파일(소유자 전용 파일과 폴더)을 지정할 뿐입니다. 이 파일에는 사용자와 어시스턴트 메시지의 텍스트가 들어 있으므로, `$DSH_HOME/sessions`의 채팅 로그만큼 민감합니다. 아무것도 컴퓨터 밖으로 나가지 않습니다. 이 파일은 dsh가 다시 만들 수 있는 사본이므로, dsh가 닫혀 있을 때 삭제해도 됩니다. 스위치 값은 `$DSH_HOME/storages/dsh-composer-plus/content-search.json`에 있습니다.
|
|
110
|
+
- **턴 되돌리기:** 내 메시지마다, 보내기 전에 Host가 채팅 폴더의 git 스냅샷을 자체 저장소 `$DSH_HOME/cache/composer-plus/rollback/<chat>.git`(소유자 전용 폴더)에 만듭니다. 이 저장소에는 그 폴더에서 git이 보는 파일(무시된 파일 제외)의 사본이 있으므로, 프로젝트만큼 민감합니다. 내 저장소의 객체를 읽기만 하고(git에 이미 있는 것은 복사하지 않음), 내 저장소의 인덱스, `HEAD`, 브랜치, 태그, stash, 설정에는 절대 쓰지 않습니다. git이 그곳에서 바꾸는 것은 재사용한 객체 파일의 타임스탬프를 새로 고치는 것뿐입니다(그래서 `git gc`의 정리가 늦어집니다). 파일까지 되돌릴 때는 채팅 폴더 안의 일반 파일에만 씁니다. 심볼릭 링크, 파이프, 폴더 밖의 모든 것은 건너뜁니다. 아무것도 컴퓨터 밖으로 나가지 않습니다. dsh가 닫혀 있을 때 이 저장소를 삭제해도 됩니다(그러면 새 메시지를 보낼 때까지 채팅만 되돌릴 수 있습니다). **채팅 삭제**는 채팅의 저장소도 함께 삭제합니다. 스위치 값은 `$DSH_HOME/storages/dsh-composer-plus/rollback.json`에 있습니다.
|
|
111
|
+
- **채팅 삭제:** 채팅 자체의 로그 폴더(`$DSH_HOME/sessions/<project>/<chat>`)를 휴지통으로 옮깁니다. 프로젝트 폴더는 건드리지 않습니다.
|
|
112
|
+
- **이 채팅에서 허용:** 허용 항목은 `$DSH_HOME/storages/dsh-composer-plus/grants.json`(소유자 전용 권한)에 저장됩니다. 허용 하나는 **한 채팅의 정확히 한 도구**에만 적용됩니다. 그 도구가 쓰기를 할 수 있다면, 허용은 모든 쓰기에도 적용됩니다. 헤더 칩에서 취소하세요.
|
|
113
|
+
- 자동 검토는 여전히 모든 호출에서 실행됩니다. 검토가 실패한 호출은 절대 자동으로 허용되지 않습니다.
|
|
114
|
+
- **모바일 연결:** 켜기 전까지 꺼져 있습니다. 켜져 있는 동안 Host 쪽이 Tether 게이트웨이를 실행합니다. 게이트웨이는 두 부분입니다. 포트 19390의 HTTPS는 Wi-Fi 서브넷과 tailnet(100.64.0.0/10)의 연결만 받고, `127.0.0.1:19391`의 페어링 페이지는 이 Mac에서만 열립니다. 휴대폰을 연결하려면 QR 코드의 일회용 코드(5분 유효)와 Mac에서의 **Approve**가 필요합니다. 휴대폰은 게이트웨이 인증서를 고정(pinning)합니다. Mac은 각 휴대폰 토큰의 해시만 보관합니다(30일, 사용하는 동안 갱신). **Revoke**를 누르면 그 휴대폰의 연결이 즉시 끊깁니다. 휴대폰은 허용 목록에 있는 dsh 메서드(채팅, 프롬프트, 첨부 파일, 슬래시 명령, 승인, 질문, 모델, 에이전트, 목표)만 호출할 수 있습니다. 설정, 자격 증명, 파일 브라우저, 터미널은 호출할 수 없습니다. 데이터: `$DSH_HOME/storages/dsh-composer-plus/mobile/`. 자세한 내용: [tether/README.md](tether/README.md).
|
|
115
|
+
- **업데이트:** Host 쪽은 `api.github.com`에 최신 릴리스를 묻고, `registry.npmjs.org`에 그 정확한 버전을 묻습니다. 사용자나 채팅에 관한 정보는 보내지 않습니다. 설치는 dsh의 플러그인 관리자(`pnpm add dsh-composer-plus@<version>`. 이미 설치된 플러그인에 대해 dsh 0.2.1이 이를 거부하면 `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`를 쓰며, 그 후 프로필에는 그 URL이 플러그인의 소스로 표시됩니다)를 쓰므로, dsh 자체의 레지스트리, 스크립트, 버전 호환성 검사가 적용됩니다. 사전 릴리스 태그와 더 오래된 버전은 절대 설치하지 않습니다.
|
|
116
|
+
|
|
117
|
+
## 문제 해결
|
|
118
|
+
|
|
119
|
+
- **macOS에서 알림이 오지 않음:** 시스템 설정 → 알림 → DeepSeek Harness → 알림을 허용하세요. 알림을 화면에 계속 두려면 알림 스타일에서 **알림**을 선택하세요.
|
|
120
|
+
- **dsh 업데이트 후 ▶, 대기열 핸들, 프로젝트 상태, 최근 프로젝트 옵션, 모든 프로젝트 접기, 경로 복사, 이 채팅에서 허용 또는 오른쪽 클릭 메뉴가 보이지 않음:** 이 요소들은 dsh에 아직 전용 슬롯이 없어서 dsh의 현재 HTML에 붙습니다. dsh가 그 마크업을 바꾸면 이 요소들은 스스로 숨겨지며, 다른 기능은 망가지지 않습니다. [issue](https://github.com/furkancak1r/dsh-composer-plus/issues)를 열어 주세요.
|
|
121
|
+
- **"업데이트 실패" 또는 "npm에서 설치되지 않았으므로" 메시지:** 로컬 폴더에서 링크했거나 이름을 바꾼 사본은 스스로 업데이트할 수 없습니다. 설정 → 플러그인에서 `dsh-composer-plus`를 다시 설치하세요. 그 밖의 경우에는 메시지에 pnpm 오류의 첫 줄이 표시됩니다. **업데이트 확인**을 누르면 다시 시도합니다.
|
|
122
|
+
- **모바일 연결에 게이트웨이가 실행되고 있지 않다고 표시됨:** "no IPv4 address on en0"은 이 Mac에 Wi-Fi/이더넷 주소가 없다는 뜻입니다. "EADDRINUSE"는 다른 dsh(또는 앱)가 포트 19390 또는 19391을 쓰고 있다는 뜻입니다. 모바일 연결은 한 번에 dsh 하나에서만 실행할 수 있습니다.
|
|
123
|
+
- **모바일 연결, 재시작 후 이어서 실행, 내용 검색에 "dsh를 다시 시작하세요"가 표시됨:** dsh가 실행 중일 때 플러그인이 업데이트되었습니다(내용 검색은 스위치를 바꾼 경우에도 표시됩니다). 새 상태는 재시작 후 로드됩니다.
|
|
124
|
+
- **검색이 제목만 찾음:** 내용 검색이 꺼져 있거나, 켜거나 플러그인을 설치한 뒤 dsh를 다시 시작하지 않았거나, 그 단어가 도구 출력에만 있습니다(제한 사항 참고).
|
|
125
|
+
- **내 메시지에 ↶ 버튼이 없음:** 턴 되돌리기가 꺼져 있거나, 하위 에이전트 채팅이거나, dsh-rewind-plugin이 설치되어 있습니다(그 플러그인의 ↶ 버튼을 쓰세요). 업데이트한 뒤에는 dsh를 다시 시작하세요.
|
|
126
|
+
- **채팅과 파일이 회색으로 비활성화됨:** 프로젝트가 git 저장소가 아니거나, 그 메시지 이전 스냅샷이 없거나(메시지가 플러그인보다 오래되었거나, 최신 스냅샷 50개가 그 스냅샷을 대체함), 바뀐 파일이 없습니다.
|
|
127
|
+
- **삭제할 때 다른 dsh가 이 채팅을 열고 있다고 표시됨:** 같은 dsh 홈을 쓰는 두 번째 dsh가 채팅 잠금을 잡고 있습니다. 그 창이나 dsh를 닫은 뒤 다시 삭제하세요. 그동안 채팅은 보관된 상태로 남습니다.
|
|
128
|
+
- **재시작 후 채팅이 이어지지 않음:** dsh를 종료할 때 재시작 후 이어서 실행이 꺼져 있었거나, 그 턴을 직접 중지했거나, 턴이 이미 끝났거나(완료 또는 실패), 채팅이 보관되었거나, 실행 중인 채팅이 20개보다 많았습니다(가장 최근 채팅 20개만 이어짐).
|
|
129
|
+
- **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.10.0`). 위의 설치 안내를 참고하세요.
|
|
130
|
+
|
|
131
|
+
## 제한 사항
|
|
132
|
+
|
|
133
|
+
- 메시지 없는 계속은 dsh의 `agent/pre-step` → `agent/request` 수명 주기에 의존합니다. dsh를 업그레이드할 때 호환성을 다시 확인하세요.
|
|
134
|
+
- **기능 아이디어**는 dsh나 페이지를 다시 로드할 때까지 채팅마다 카드를 메모리에 둡니다. 그 뒤 **기능 제안**은 모델에 다시 묻습니다. 카드는 클릭한 시점의 dsh UI 언어로 나옵니다. 언어를 바꿔도 이미 쌓인 카드는 원래 언어를 유지하고, **아이디어 더 받기**는 새 언어를 씁니다. 모델은 코드가 아니라 짧은 프로젝트 요약만 봅니다. 그래서 프로젝트에 이미 있는 기능을 제안할 수도 있습니다. 그럴 때는 건너뛰세요. 새 채팅은 프로필에 dsh의 `/plan` 명령이 있을 때만 계획 모드로 실행됩니다. 없으면 아이디어가 일반 첫 메시지로 전달됩니다. **나중에** 목록은 채팅의 폴더 경로에 속합니다. 같은 폴더를 심볼릭 링크로 열면 별도 목록이 생깁니다. 프로젝트당 최대 50개 아이디어를 보관하며(더 추가하려면 하나를 제거하세요), 같은 제목은 한 번만 보관합니다. 카드를 끌면 왼쪽 또는 오른쪽만 결정됩니다. 저장하려면 **↓**를, 바로 구현하려면 **▶**를 쓰세요. 반복은 제목으로만 찾습니다. 그래서 모델이 이전 아이디어를 새 이름으로 다시 제안할 수 있습니다. 그럴 때는 건너뛰세요. 모델이 이전 아이디어만 답하면 새로 보이는 것이 없습니다. 다시 클릭하세요.
|
|
135
|
+
- **재시작 후 이어서 실행**은 턴을 이어 갈 뿐, 처음부터 다시 실행하지 않습니다. 종료 시점에 실행 중이던 도구 호출은 dsh의 “결과 알 수 없음” 결과로 끝납니다. 모델에게는 끝난 작업을 반복하지 말라고 알리지만, 두 번 실행하면 안전하지 않은 명령이 다시 실행될 수 있습니다. 열려 있던 하위 에이전트, 승인, 질문은 복원되지 않습니다. 대신 부모 채팅이 이어지면서 다시 묻습니다. 한 번 시작할 때 최대 20개 채팅만 이어집니다.
|
|
136
|
+
|
|
137
|
+
- **내용 검색**은 dsh 자체 검색이므로 dsh의 제한을 그대로 가집니다. 사용자와 어시스턴트 메시지만 검색합니다. 도구 출력(명령, 파일 내용, 결과)과 추론은 검색하지 않으며, 사용자, 어시스턴트, 도구 메시지를 고르는 필터도 없습니다. 단어 일부가 아니라 단어 전체가 일치해야 합니다(`deploy`로는 `deployment`를 찾을 수 없음). 악센트가 있는 글자는 악센트 없이도 일치합니다(`seker`로 `şeker`를 찾음). 채팅마다 한 행에 dsh의 240자 발췌가 표시되며, 최대 20행입니다.
|
|
138
|
+
- **내용 검색**의 비용은 실제 채팅 로그 247개의 사본으로 측정했습니다(159 MB, dsh 0.2.1-rc.2, Apple Silicon, 32 GB). 시작 후 첫 검색에서 약 15초 동안 색인을 만듭니다. 그중 약 7초 동안 dsh의 Host가 아무 응답도 하지 않으므로, 다른 채팅의 스트리밍이 그 순간 멈춥니다(페이지 자체는 멈추지 않습니다). Host의 메모리는 최고 약 1.1 GB 늘어납니다. 1분 뒤에도 시작 때보다 약 0.5–0.6 GB 많은 상태가 dsh를 종료할 때까지 유지됩니다. 색인 파일은 약 165 MB입니다. 이후 검색은 약 0.5초 걸립니다. 재시작 후 첫 검색은 약 1초 걸리고(새 채팅이나 바뀐 채팅만 추가) 메모리가 약 70 MB 늘어납니다. 컴퓨터 메모리가 적다면 이 기능을 끄세요.
|
|
139
|
+
- **내용 검색**은 dsh를 다시 시작한 뒤에만 적용됩니다. 같은 dsh 홈을 쓰는 모든 dsh가 색인 파일을 함께 쓰므로, 이런 dsh는 한 번에 하나만 실행하세요(dsh는 색인 파일 하나에 소유자 하나만 허용합니다).
|
|
140
|
+
- **턴 되돌리기**는 git 저장소에서만, 그리고 채팅 폴더 안에서만 파일을 되돌립니다. 채팅마다 최신 스냅샷 50개를 보관합니다. 무시된 파일(`.gitignore`, `info/exclude`, 전역 ignore 파일), 빈 폴더, 심볼릭 링크, 서브모듈은 되돌리지 않습니다. 스냅샷을 만들 때 무시되던 파일은 턴이 ignore 규칙을 바꾸었더라도 절대 삭제하지 않습니다. git이 읽을 수 없는 파일은 스냅샷에서 빠집니다. 메시지를 보낼 때마다 채팅 폴더에 `git add --all`을 한 번 실행해 비공개 저장소에 넣습니다. 추적되지 않는 파일이 많은 아주 큰 폴더에서는 몇 초 걸릴 수 있고, 다음 도구 호출이 이를 기다립니다(최대 10초. 그 뒤 스냅샷은 백그라운드에서 마무리됩니다). 내 저장소의 `git gc`가 오래된 스냅샷에 필요한 객체를 지우면, 그 파일은 되돌리지 못한 파일로 표시됩니다. 입력란에는 메시지의 텍스트만 돌아옵니다. 이미지나 파일은 다시 추가하세요. 하위 에이전트 채팅에는 ↶가 없습니다(하위 에이전트의 파일 변경은 그 하위 에이전트를 시작한 채팅의 변경으로 칩니다). 내보낸 채팅(`/export`)에는 철회한 메시지가 그대로 남아 있습니다. 숨겨진 표시 하나로 채팅 일부를 철회하는 아이디어는 SiriLee의 [dsh-rewind-plugin](https://github.com/SiriLee/dsh-rewind)(MIT)에서 가져왔습니다. Composer Plus는 그 코드를 전혀 쓰지 않습니다.
|
|
141
|
+
- **채팅 삭제**에는 dsh의 보관 기능(dsh 0.2.0 이상)이 필요합니다. 15초 안에 멈추지 않거나 다른 dsh가 잡고 있는 채팅(또는 그 하위 에이전트 채팅 중 하나)은 보관된 상태로 남고, 아무것도 이동하지 않습니다. macOS가 아닌 시스템에서는 휴지통 폴더가 채팅 기록과 같은 디스크에 있어야 합니다. 열려 있는 채팅을 삭제하면, 그 채팅은 dsh를 다시 시작할 때까지 dsh 메모리에 보관되고 숨겨진 상태로 남습니다. 휴지통은 직접 비우세요. dsh는 휴지통을 비우지 않습니다.
|
|
142
|
+
- dsh의 대기열에는 `move` 동작이 없습니다. 그래서 순서를 바꾸면 영향을 받는 행의 텍스트를 다시 씁니다. 이동 중에 에이전트가 행을 가져가면 이동은 취소되고, 잃는 것은 없습니다. 이미지나 파일이 있는 메시지는 이동할 수 없습니다.
|
|
143
|
+
- 새 버전이 dsh 설정을 하나도 바꾸지 않으면 dsh 0.2.1은 업데이트를 바로 로드합니다. 그 밖의 경우와 dsh 0.2.0에서는 업데이트를 로드하려면 dsh를 다시 시작하세요. 플러그인은 dsh를 대신 재시작하지 않습니다. dsh 플러그인 관리자가 없는 웹/CLI 프로필은 새 버전을 알리기만 합니다.
|
|
144
|
+
- **입력란 포커스 유지**는 `/` 명령이나 스킬을 보낸 뒤에만 포커스를 돌려줍니다. dsh가 명령을 처리하는 몇 밀리초 동안 입력란이 읽기 전용이므로, 그동안 누른 키는 사라집니다. dsh의 `/` 메뉴가 아직 열려 있으면 `Enter`는 강조된 행을 선택하고 메시지를 보내지 않습니다.
|
|
145
|
+
- **모바일 연결**은 macOS에서만 작동합니다(`en0`, `openssl`, `swift`, `dns-sd` 사용). 고정 포트 19390과 19391을 쓰므로, Mac마다 한 번에 dsh 하나에서만 실행할 수 있습니다(각 Mac은 휴대폰의 Mac 목록에서 항목 하나입니다). 휴대폰은 Tether가 열려 있거나 막 백그라운드로 간 동안에만 알림을 받습니다(푸시 서비스 없음). iOS 앱은 아직 App Store에 없습니다. Xcode로 `tether/ios`에서 빌드하세요.
|
|
146
|
+
- 세션 링크는 채팅 안에서 작동하지만, 클릭해도 채팅이 열리지는 않습니다.
|
|
147
|
+
- 재시작 전에 보낸 알림을 클릭하면 dsh를 앞으로 가져오기만 합니다.
|
|
148
|
+
- 활성 프로젝트는 dsh에 저장되는 프로젝트 순서로 이동하므로, 새 순서는 재시작 후에도 유지됩니다. 어느 프로젝트에도 속하지 않은 채팅("그룹 없음")은 이동할 수 없습니다. dsh는 이 채팅을 항상 맨 마지막에 나열합니다.
|
|
149
|
+
- dsh의 사이드바 보기 옵션 메뉴에는 확장 지점이 없습니다. 그래서 최근 프로젝트 옵션은 dsh 자체 메뉴에 추가됩니다. dsh 업데이트로 이 메뉴가 바뀌면 옵션이 표시되지 않고 모든 프로젝트가 계속 보입니다. 필터는 프로젝트 행에 적용되므로 **하나의 목록**은 걸러지지 않습니다. **작업 공간**과 함께 쓰세요. **작업 공간 트리**에서는 숨겨진 상위 폴더가 그 안의 활성 프로젝트도 숨깁니다. **상태별**에도 같은 종류의 제한이 있습니다. dsh에는 정렬 슬롯이 없으므로, 항목과 행 순서가 dsh의 메뉴와 목록 마크업에 붙습니다.
|
|
150
|
+
- dsh에는 프로젝트 행 메뉴나 작업 공간 헤더 슬롯도 없습니다. **경로 복사**는 dsh의 행 마크업으로 프로젝트 행을 찾습니다. **모든 프로젝트 접기**는 dsh 헤더에 들어가서, 프로젝트 행을 클릭하는 것과 같은 방식으로 열린 프로젝트를 하나씩 닫습니다. dsh 업데이트로 이 마크업이 바뀌면 오른쪽 클릭 시 브라우저 메뉴가 나오고 버튼은 표시되지 않습니다.
|
|
151
|
+
- 기본 지원은 업스트림에 요청해 두었습니다: 대기열 `move`는 [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773), 계속 상태는 [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269).
|
|
152
|
+
|
|
153
|
+
## 자주 묻는 질문
|
|
154
|
+
|
|
155
|
+
**DeepSeek Harness에 변경 사항 / git diff 패널을 추가하려면 어떻게 하나요?** `dsh-composer-plus`를 설치한 뒤 오른쪽 사이드바 → `+` → **변경 사항**을 여세요.
|
|
156
|
+
|
|
157
|
+
**dsh가 Tinder 카드를 넘기듯 내 프로젝트에 맞는 기능을 제안할 수 있나요?** 네. 오른쪽 사이드바 → `+` → **기능 아이디어** → **기능 제안**. 오른쪽으로 스와이프하면 그 기능을 계획하는 새 채팅이 시작되고, **▶ 바로 구현**을 클릭하면 계획 없이 그 기능을 바로 구현하는 채팅이 시작되며, 왼쪽으로 스와이프하면 건너뜁니다.
|
|
158
|
+
|
|
159
|
+
**dsh 사이드바 검색이 제목뿐 아니라 메시지 속 단어로도 채팅을 찾을 수 있나요?** 네, **내용 검색**(기본적으로 켜짐)으로 가능합니다. 플러그인을 설치한 뒤 dsh를 한 번 다시 시작하고, **작업 공간** 옆의 돋보기를 쓰세요. 일치하는 채팅에는 그 단어 주변의 텍스트가 표시됩니다.
|
|
160
|
+
|
|
161
|
+
**OpenCode나 Claude Code처럼 턴을 되돌리고 프롬프트를 고칠 수 있나요?** 네, **턴 되돌리기**로 가능합니다. 메시지의 **↶** 버튼을 클릭하고 **채팅과 파일**을 선택하세요. 그다음 입력란에 돌아온 텍스트를 고쳐서 보내세요.
|
|
162
|
+
|
|
163
|
+
**채팅을 보관하는 대신 삭제할 수 있나요?** 네, **채팅 삭제**로 가능합니다: **…** → **삭제…**. 기록은 휴지통으로 가므로 실수해도 되돌릴 수 있습니다.
|
|
164
|
+
|
|
165
|
+
**채팅이 어느 프로젝트에 속하는지 어떻게 알 수 있나요?** 입력란 아래 줄을 보세요. **입력창에 프로젝트 이름**(기본적으로 켜짐)이 켜져 있으면 그 줄이 프로젝트 이름으로 시작합니다. 포인터를 올리면 폴더 경로가 보입니다.
|
|
166
|
+
|
|
167
|
+
**dsh 입력란에서 ↑/↓ 메시지 기록을 쓰려면 어떻게 하나요?** 이 플러그인을 설치하세요. 빈 입력란에서 `↑` / `↓`로 보낸 메시지를 차례로 불러옵니다.
|
|
168
|
+
|
|
169
|
+
**"continue"를 입력하지 않고 중지되거나 실패한 dsh 턴을 이어 가려면 어떻게 하나요?** 이 플러그인을 쓰면 턴이 중지되거나, 실패하거나, 중간에 끊긴 뒤 보내기 버튼이 **▶**로 바뀝니다. 한 번 클릭하면 턴이 이어집니다.
|
|
170
|
+
|
|
171
|
+
**dsh를 종료했다가 다시 열면 실행 중이던 채팅이 이어지나요?** 저절로 이어지지는 않습니다. dsh는 이런 턴을 중단됨으로 표시하고 기다립니다(목표도 `/goal resume`을 기다립니다). **설정 → Composer Plus → 재시작 후 이어서 실행**을 켜세요. 그러면 dsh를 종료할 때 작업 중이던 채팅이 다음 시작 때 자동으로 이어집니다.
|
|
172
|
+
|
|
173
|
+
**dsh에서 대기 중인 메시지의 순서를 바꾸려면 어떻게 하나요?** 대기 중인 메시지의 ⠿ 핸들을 끌거나, 핸들에 포커스를 두고 `↑` / `↓`를 누르세요.
|
|
174
|
+
|
|
175
|
+
**한 채팅에서 자동 검토가 같은 도구를 계속 묻지 않게 하려면 어떻게 하나요?** 승인 카드에서 **이 채팅에서 허용**을 클릭하세요. 이 허용은 그 채팅의 그 도구에만 적용됩니다. 헤더 칩에서 취소할 수 있습니다.
|
|
176
|
+
|
|
177
|
+
**dsh 사이드바에 오늘 사용한 프로젝트만 표시하려면 어떻게 하나요?** 사이드바 → 보기 옵션(슬라이더 아이콘) → **최근 2시간 내 활성**. 모든 프로젝트를 다시 보려면 이 옵션을 다시 선택하세요.
|
|
178
|
+
|
|
179
|
+
**dsh에서 프로젝트 폴더 경로를 복사하려면 어떻게 하나요?** 사이드바에서 프로젝트를 마우스 오른쪽 버튼으로 클릭 → **경로 복사**.
|
|
180
|
+
|
|
181
|
+
**dsh 사이드바의 모든 프로젝트를 한 번에 접으려면 어떻게 하나요?** 보기 옵션(슬라이더 아이콘) 옆의 접기 버튼을 클릭하세요. 이 버튼은 열린 프로젝트가 하나 이상 있을 때 표시됩니다.
|
|
182
|
+
|
|
183
|
+
**dsh 작업이 끝나거나 승인이 필요할 때 macOS / Windows 알림을 받으려면 어떻게 하나요?** **백그라운드 알림**을 켜 두세요(기본값). 그리고 OS 설정에서 DeepSeek Harness의 알림을 허용하세요.
|
|
184
|
+
|
|
185
|
+
**DeepSeek Harness 인터페이스를 터키어, 스페인어, 일본어 등으로 바꾸려면 어떻게 하나요?** 설정 → Composer Plus → **애플리케이션 언어**.
|
|
186
|
+
|
|
187
|
+
**iPhone에서 dsh를 쓰려면 어떻게 하나요?** `tether/ios`에서 Tether 앱을 빌드하세요(Xcode). **설정 → Composer Plus → 모바일 연결(iPhone)**을 켜고, 왼쪽 아래의 **모바일 연결**을 클릭하세요. Tether에서 QR 코드를 스캔한 뒤 **Approve**를 클릭하세요. 집 밖에서는 두 기기 모두에서 Tailscale을 쓰세요.
|
|
188
|
+
|
|
189
|
+
**데스크톱 앱에서도 작동하나요?** 네. 설정 → 플러그인 → **플러그인 추가** → `dsh-composer-plus`. dsh 0.2.0-rc.2(데스크톱과 웹)와 0.2.1-rc.2(웹)에서 테스트했습니다.
|
|
190
|
+
|
|
191
|
+
## 개발
|
|
192
|
+
|
|
193
|
+
스크린샷은 가짜 모델과 지어낸 데모 프로젝트(`acme-web`, `weather-cli`, `docs-site`)를 쓰는 일회용 dsh에서 다시 만듭니다. 그래서 실제 데이터가 들어 있지 않습니다. 기능 썸네일은 `assets/features/`에 둡니다(패키지에 포함되며 설정에 표시됨). README에서만 쓰는 그림은 `docs/images/`에 둡니다(npm 패키지에 포함되지 않음):
|
|
194
|
+
|
|
195
|
+
```sh
|
|
196
|
+
PLAYWRIGHT=/path/to/playwright node scripts/capture-screenshots.mjs /path/to/dsh/lib/bin.js
|
|
197
|
+
# sidebar project features (recent filter, Copy path, Collapse all): real-app test + their thumbnails
|
|
198
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /path/to/dsh/lib/bin.js
|
|
199
|
+
# recent filter + a finished chat older than 2 hours (fake model): the project stays until you open the chat
|
|
200
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
|
|
201
|
+
# Order by status (fake model + Schedule): real-app test + its thumbnail
|
|
202
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
|
|
203
|
+
# every Settings feature row shows a loading screenshot
|
|
204
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
|
|
205
|
+
# Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
|
|
206
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
|
|
207
|
+
# Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
|
|
208
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
|
|
209
|
+
# Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
|
|
210
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-resume-restart.mjs /path/to/dsh/lib/bin.js
|
|
211
|
+
# Feature ideas (fake model, made-up project): suggest, drag left, Undo, ✓ starts a new chat in plan mode, ▶ Build now one without, Plan all one for the Later list + its thumbnail
|
|
212
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-feature-ideas.mjs /path/to/dsh/lib/bin.js
|
|
213
|
+
# Content search (fake model, made-up chats): a message-only word finds its chat with the snippet, switch off + restart = titles only + its thumbnail
|
|
214
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path/to/dsh/lib/bin.js
|
|
215
|
+
# Turn rollback + Delete chat (fake model, made-up git project): bash edit → ↶ Chat and files → files back, .git unchanged; Delete… → Trash + its thumbnails
|
|
216
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
```sh
|
|
220
|
+
npm run build:locales # after editing locales/<id>.json
|
|
221
|
+
npm test
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**새 기능 규칙:** 설정 → Composer Plus의 모든 기능 행에는 스크린샷이 표시됩니다. 기능 ID를 `client.js`의 `SHOT_OF`와 `index.js`의 `SHOTS`에 추가하세요. 그리고 `assets/features/<id>.webp`를 함께 배포하세요(일회용 데모 dsh에서 영어 UI로 찍은 약 60 kB 이하 이미지). 같은 이미지로 README 표에 기능을 추가하세요. `README.md`와 번역된 각 `README.<id>.md` 모두에 추가해야 합니다. 기능에 스크린샷이 없으면 `test/shots.test.mjs`가 실패합니다. `test/browser-settings-shots.mjs`는 실제 설정 페이지를 확인합니다. 모든 변경에 대한 전체 체크리스트는 [AGENTS.md](AGENTS.md)에 있습니다.
|
|
225
|
+
|
|
226
|
+
테스트는 실제 `client.js`를 가짜 React/DOM에서, 실제 `index.js`(Host 쪽)를 임시 git 저장소에서 실행합니다. Tether 게이트웨이 테스트(`test/tether-gateway.test.mjs`)는 모의 dsh 호스트와 실제 TLS 게이트웨이를 사용합니다. iPhone 앱은 `tether/ios`에 있습니다([tether/README.md](tether/README.md)와 [tether/AGENTS.md](tether/AGENTS.md) 참고). `node test/browser-history.mjs '<dsh web URL with ?token=…>'`는 실제 브라우저에서 입력 기록을 확인합니다. 이 확인은 자체 `DSH_HOME`을 쓰는 일회용 `dsh web`을 대상으로 실행됩니다.
|
|
227
|
+
|
|
228
|
+
언어 팩은 `locales/<id>.json`에 있는 데이터 전용 JSON입니다. `npm run build:locales`가 이 파일들을 단일 클라이언트 엔트리에 포함합니다(번역 서비스나 런타임 다운로드 없음). `npm test`는 모든 팩에서 전체 키 포함 여부, 자리 표시자와 줄바꿈 일치, 시스템 언어/직접 선택 동작을 확인합니다. 로컬에 설치한 Playwright로 격리된 실제 앱을 확인하려면:
|
|
229
|
+
|
|
230
|
+
```sh
|
|
231
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-language.mjs /path/to/dsh/lib/bin.js
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## License
|
|
235
|
+
|
|
236
|
+
MIT
|
package/README.md
CHANGED
|
@@ -4,9 +4,11 @@
|
|
|
4
4
|
[](https://github.com/furkancak1r/dsh-composer-plus/actions/workflows/test.yml)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**English** · [中文](README.zh.md) · [Türkçe](README.tr.md) · [Español](README.es.md) · [Português (Brasil)](README.pt-BR.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Русский](README.ru.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Bahasa Indonesia](README.id.md) · [Tiếng Việt](README.vi.md) · [हिन्दी](README.hi.md)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Codex-style quality-of-life features for the [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh) desktop and web UI: a Changes panel, swipe-card feature ideas, sidebar search in message text, turn rollback with file restore, chat deletion to the Trash, the project name under the composer, project status in the sidebar, input history, a plan-mode shortcut, one-click Continue, resume running chats after a restart, queue drag-and-drop, session deeplinks, per-chat Auto Review grants, background notifications, iPhone access with the Tether app and automatic updates.
|
|
10
|
+
|
|
11
|
+
**In one line:** a single DeepSeek Harness plugin (npm `dsh-composer-plus`, shown as **Composer Plus** in Settings → Plugins) that adds a git Changes panel, Tinder-style feature idea cards, sidebar search that also finds words in messages, ↶ turn rollback (chat only, or chat and files), Delete chat, the project name under the composer, ↑/↓ input history, a Shift+Tab `/plan` toggle, one-click ▶ Continue, Resume after restart, drag-and-drop queue reordering, Copy session link, Auto Review “Allow for this chat”, background notifications, iPhone access (Mobile connect, Tether app), 11 extra interface languages and automatic updates.
|
|
10
12
|
|
|
11
13
|
<p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness with Composer Plus: the running project shows a spinner in the sidebar and the Changes panel shows a git diff"></p>
|
|
12
14
|
|
|
@@ -25,17 +27,18 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
25
27
|
|
|
26
28
|
Then restart dsh. (The CLI can't install into the desktop profile; the app manages it.)
|
|
27
29
|
|
|
28
|
-
> dsh's pnpm skips versions younger than 24 hours. Right after a release, add the version: `dsh-composer-plus@1.
|
|
30
|
+
> dsh's pnpm skips versions younger than 24 hours. Right after a release, add the version: `dsh-composer-plus@1.10.0`.
|
|
29
31
|
|
|
30
32
|
## Features
|
|
31
33
|
|
|
32
34
|
| Feature | How to use it | Screenshot |
|
|
33
35
|
|---|---|---|
|
|
34
36
|
| **Changes panel** | Right sidebar → `+` → **Changes**. Pick **Uncommitted**, **Unstaged**, **Staged** or **Branch** to see changed files with `+/-` counts; click a file for its diff. **Last Turn** opens dsh's own review of the latest turn. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Changes panel screenshot"></a> |
|
|
35
|
-
| **Feature ideas** | Right sidebar → `+` → **Feature ideas** → **Suggest features**. The chat's own model reads a short summary of the chat's project (top-level files, the README and manifest heads, the last 15 commits) and suggests up to 8 features, shown as a stack of cards in dsh's UI language. Swipe a card right (or click **✓**, or press `→`; the card flies off to its side in each case) to start a new chat in the same project: it starts in plan mode with the idea as the request, so nothing changes before you approve the plan. Swipe left (or **✕**, or `←`) to skip; **Undo** (or `Z`) brings a skipped card back. Click **↓** (or press `↓`) to save a good idea for later: it goes to the project's **Later** list, which every chat in the same project folder shows (also after a restart). **Later (N)** opens the list; **Plan** starts the same plan-mode chat for the idea and
|
|
37
|
+
| **Feature ideas** | Right sidebar → `+` → **Feature ideas** → **Suggest features**. The chat's own model reads a short summary of the chat's project (top-level files, the README and manifest heads, the last 15 commits) and suggests up to 8 features, shown as a stack of cards in dsh's UI language. Swipe a card right (or click **✓**, or press `→`; the card flies off to its side in each case) to start a new chat in the same project: it starts in plan mode with the idea as the request, so nothing changes before you approve the plan. To skip the plan, click **▶ Build now** (or press `↑`; the card flies up): the new chat starts at once with the idea as an ordinary request, and the model makes the change and runs its checks (approvals apply as usual). Swipe left (or **✕**, or `←`) to skip; **Undo** (or `Z`) brings a skipped card back. Click **↓** (or press `↓`) to save a good idea for later: it goes to the project's **Later** list, which every chat in the same project folder shows (also after a restart). **Later (N)** opens the list; **Plan** starts the same plan-mode chat for the idea and **Build now** the chat without a plan, both take it off the list; **Plan all (N)** starts one plan-mode chat for every idea in the list, so shared parts are planned once; **Remove from the list** deletes it. **More ideas** adds cards. Ideas are not suggested twice in a project: every suggested idea (skipped, saved or started) goes to the project's **History**, the model is told not to suggest those again, and a repeated title is dropped. **History** lists them with **Started** or **Suggested**; **Forget** (or **Forget all**) lets one come again; an idea that is still in the Later list stays out of the suggestions until you remove it there. The model runs only when you click. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Feature ideas screenshot"></a> |
|
|
36
38
|
| **Content search** | dsh's own sidebar search (the magnifier next to **Workspaces**; `Cmd+K` in the desktop app, `Cmd+Alt+K` in a browser) also finds chats by the words in your messages and in the replies, not only by title, and shows the matching text under the chat. dsh already has this search, but ships it switched off; this feature switches it on with a search index file on your computer. The index is made at the first search after a start (about 15 s for 250 chats, see Limits) and is kept for the next starts. On by default; a change applies after you restart dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Content search screenshot"></a> |
|
|
37
39
|
| **Turn rollback** | Hover one of your messages and click **↶** (next to Copy). **Chat only** takes that message and everything after it (replies, tool calls) out of the chat and out of the model's context, and puts the message back in the composer: change it and send it again. **Chat and files** first lists the project files that changed since that message, then also puts them back as they were, including changes made by commands (`bash`), not only by dsh's edit tools. A running turn stops first. The chat log is never rewritten: one hidden marker hides the withdrawn part, the same way dsh's own `/compact` hides old messages. When [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) is installed, it does this job and Composer Plus shows no second button. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Turn rollback screenshot"></a> |
|
|
38
40
|
| **Delete chat** | Sidebar → a chat's **…** menu (or right-click) → **Delete…** → **Delete**. dsh itself can only archive. The chat stops (its turn, jobs, subagents and schedules, like dsh's own archive) and its saved history, with its subagent chats, moves to the macOS Trash (on other systems: `$DSH_HOME/trash`). To get it back, put the folder back and restart dsh: it shows in the sidebar's **Archived only** view. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Delete chat screenshot"></a> |
|
|
41
|
+
| **Project name in the composer** | The row under the composer (turns, tokens, cache hit, context) starts with the chat's project name, so you always see which project a chat works in. It is dsh's own project title, or the folder name when the project has no title. Hover it to see the full folder path. Click it to find the chat in the sidebar, in the list or project view: the sidebar and the project open (also a collapsed project and its **Show more**), the list scrolls to the chat and the chat blinks for 5 seconds. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Project name in the composer screenshot"></a> |
|
|
39
42
|
| **Input history** | In an empty composer, press `↑` / `↓` to walk through messages you sent, like a terminal. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Input history screenshot"></a> |
|
|
40
43
|
| **Plan mode shortcut** | `Shift+Tab` adds `/plan ` to the start of the draft (press again to remove it). If the chat is already in plan mode, `Shift+Tab` leaves it. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Plan mode shortcut screenshot"></a> |
|
|
41
44
|
| **Keep composer focus** | After you send a `/` command or skill, the cursor stays in the composer, and you can type again at once. This also works for keyboard macros that type a command and press `Enter`. dsh makes the composer read-only while it resolves the command, and the browser then removes the focus. This feature puts the focus back, unless a menu, a dialog or another field has it. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Keep composer focus screenshot"></a> |
|
|
@@ -45,7 +48,7 @@ Then restart dsh. (The CLI can't install into the desktop profile; the app manag
|
|
|
45
48
|
| **Copy session link** | Right-click a chat in the sidebar → **Copy session link**. Paste the `dsh-session:…` link into another chat to attach that chat as read-only context. dsh 0.2.1 has its own **Copy Session ID**, which copies only the plain id; this item comes right after it. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Copy session link screenshot"></a> |
|
|
46
49
|
| **Copy project path** | Right-click a project in the sidebar → **Copy path** copies the full path of its folder. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Copy project path screenshot"></a> |
|
|
47
50
|
| **Allow for this chat** | When Auto Review asks you, the approval card gets **Allow for this chat**: the same tool in the same chat is allowed from then on, with any arguments. A header chip lists the grants and revokes them. Grants survive a restart. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Allow for this chat screenshot"></a> |
|
|
48
|
-
| **Project status** | A project row in the sidebar shows the same spinner / waiting / done marker as its chats, so a collapsed project still tells you a chat inside is working or needs you. Hover it for details. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Project status screenshot"></a> |
|
|
51
|
+
| **Project status** | A project row in the sidebar shows the same spinner / waiting / done marker as its chats, so a collapsed project still tells you a chat inside is working or needs you. A chat waiting for you shows first, then a finished chat you have not opened yet (the green dot, also while another chat still runs), then the spinner. Hover it for details. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Project status screenshot"></a> |
|
|
49
52
|
| **Active projects first** | When a chat starts running or needs you, its project moves to the top of the sidebar with dsh's own row animation (the same move as dragging it there). Finished projects stay where they are; drag them anywhere as usual. Moves are saved to dsh's project order, so turning this off keeps the current order. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Active projects first screenshot"></a> |
|
|
50
53
|
| **Recent projects filter** | Sidebar → view options (sliders icon) → **Active in the last 2 hours**. While it is selected, the sidebar shows only projects with a chat that was active in the last 2 hours: a chat updated in that time, a running or waiting chat, the open chat, or a finished chat that you did not open yet (dsh's green “done” dot), also after the 2 hours. Projects without such a chat are hidden, also new and empty ones. Select it again to show all projects. The choice is kept on this device. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Recent projects filter screenshot"></a> |
|
|
51
54
|
| **Collapse all projects** | While a project is open in the sidebar, a button appears next to the view options (sliders icon). Click it to close every open project at once, for example 3 open projects out of 5. The button hides again when no project is open. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Collapse all projects screenshot"></a> |
|
|
@@ -73,7 +76,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
73
76
|
|
|
74
77
|
The whole app switches immediately. The choice is dsh’s own saved `locale.preference` (the same one as General → Language), so it survives restarts. **System language** clears that choice: the desktop app follows the OS language, the web UI the browser language, and an unsupported language falls back to English. Installing the plugin never overrides a language you already picked.
|
|
75
78
|
|
|
76
|
-
Each pack
|
|
79
|
+
Each pack has 3,143 texts: every UI text of dsh `0.2.0-rc.2` and `0.2.1-rc.2` (chats, sidebar, settings, approvals, schedules, file previews, plugin manager, plugin market), the plugin’s own controls, and the popular [dsh-rewind](https://github.com/SiriLee/dsh-rewind) plugin. Not translated: your messages, model output, code, slash-command names (`/plan`, `/compact`), provider-owned labels such as the `High` reasoning effort, other plugins’ texts, and the desktop app’s native menus/update dialogs (dsh ships those in English/Chinese only). Strings added by a newer dsh show in English until the packs are updated. If another plugin already provides a language, that plugin keeps it.
|
|
77
80
|
|
|
78
81
|
## Keyboard shortcuts
|
|
79
82
|
|
|
@@ -85,6 +88,7 @@ Each pack covers all 3,069 UI strings of dsh `0.2.0-rc.2` and `0.2.1-rc.2` (chat
|
|
|
85
88
|
| `Esc` | while dragging | cancel the move |
|
|
86
89
|
| `→` / `←` | Feature ideas page | build / skip the top card |
|
|
87
90
|
| `↓` | Feature ideas page | save the top card in the project's Later list |
|
|
91
|
+
| `↑` | Feature ideas page | build the top card now, without a plan |
|
|
88
92
|
| `Z` | Feature ideas page | bring back the last skipped card |
|
|
89
93
|
|
|
90
94
|
An open `/` or `@` menu keeps these keys for itself.
|
|
@@ -99,14 +103,14 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
99
103
|
- **Resume after restart:** off until you switch it on. The Host half keeps only chat ids and start times in `$DSH_HOME/storages/dsh-composer-plus/resume.json` (owner-only permissions), and nothing leaves your machine. It continues a chat only when dsh's own log says that dsh (not you) stopped its last turn. Approvals and Auto Review apply to the continued turn as usual.
|
|
100
104
|
|
|
101
105
|
- **Changes panel:** git runs read-only on your machine, in the chat's own folder, through dsh's authenticated `/api` channel. It never commits, stages or fetches, and only shows paths git itself listed.
|
|
102
|
-
- **Feature ideas:** nothing runs until you click **Suggest features**. Then the Host half reads only the chat's own folder (the browser never sends a path): the names of the top-level entries, the first 6 kB of the README, AGENTS.md and the manifest (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) and `git log --oneline -15`, at most 16 kB in total. It skips `.env*`, key files and folders such as `node_modules`, and it reads only regular files that stay inside the folder: a symlink that points out of the folder, a FIFO or a device is skipped. This summary goes to the model that the chat uses, through dsh's own provider settings, as one request; it is not added to any chat. Nothing in the project is written. A swiped-right idea starts a new chat in plan mode, so approvals and plan review apply as usual. Ideas saved for later (title, summary, why, effort) are kept with the project's folder path in `storages/dsh-composer-plus/later.json` under the dsh home (owner-only file); nothing goes into the project.
|
|
106
|
+
- **Feature ideas:** nothing runs until you click **Suggest features**. Then the Host half reads only the chat's own folder (the browser never sends a path): the names of the top-level entries, the first 6 kB of the README, AGENTS.md and the manifest (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) and `git log --oneline -15`, at most 16 kB in total. It skips `.env*`, key files and folders such as `node_modules`, and it reads only regular files that stay inside the folder: a symlink that points out of the folder, a FIFO or a device is skipped. This summary goes to the model that the chat uses, through dsh's own provider settings, as one request; it is not added to any chat. Nothing in the project is written. A swiped-right idea starts a new chat in plan mode, so approvals and plan review apply as usual. **Build now** starts the chat without plan mode: the model can change files at once, with the chat's usual approvals and Auto Review. Ideas saved for later (title, summary, why, effort) are kept with the project's folder path in `storages/dsh-composer-plus/later.json` under the dsh home (owner-only file); nothing goes into the project. The history of suggested ideas (title, summary, why, effort, date, started) is kept the same way in `storages/dsh-composer-plus/idea-history.json`, at most 200 per project (the oldest leave first); its titles go to the model with the next **Suggest features** of that project.
|
|
103
107
|
- **Content search:** no new code searches your chats: the plugin only switches on dsh's own message index (SQLite FTS5, `dsh-session-query-sqlite`) and gives it a file, `$DSH_HOME/cache/composer-plus/session-search.db` (owner-only file and folder). The file holds the text of your user and assistant messages, so it is as private as the chat logs in `$DSH_HOME/sessions`. Nothing leaves your machine. It is a copy that dsh can make again: you can delete it while dsh is closed. The switch is in `$DSH_HOME/storages/dsh-composer-plus/content-search.json`.
|
|
104
108
|
- **Turn rollback:** before each of your messages, the Host takes a git snapshot of the chat's folder in its own store, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (owner-only folder). It holds copies of the files in that folder that git sees (not ignored files), so it is as private as the project. It reads your repository's objects (no copy of what git already has) and never writes your repository's index, `HEAD`, branches, tags, stash or config; the only change git makes there is a newer time stamp on object files it reuses (this delays their cleanup by `git gc`). A rollback with files writes only regular files inside the chat's folder; it skips symlinks, pipes and anything outside the folder. Nothing leaves your machine. You can delete the store while dsh is closed (rollback then works for the chat only, until new messages). **Delete chat** deletes a chat's store too. The switch is in `$DSH_HOME/storages/dsh-composer-plus/rollback.json`.
|
|
105
109
|
- **Delete chat:** moves the chat's own log folders (`$DSH_HOME/sessions/<project>/<chat>`) to the Trash. It does not touch the project folder.
|
|
106
110
|
- **Allow for this chat:** grants are stored in `$DSH_HOME/storages/dsh-composer-plus/grants.json` (owner-only permissions). A grant covers **one exact tool in one chat**. If that tool can write, the grant covers any write too. Revoke it from the header chip.
|
|
107
111
|
- Auto Review still runs on every call; review failures are never auto-allowed.
|
|
108
112
|
- **Mobile connect:** off until you switch it on. While it is on, the Host half runs the Tether gateway: HTTPS on port 19390 that accepts only your Wi-Fi subnet and your tailnet (100.64.0.0/10), and a pairing page on `127.0.0.1:19391` (this Mac only). A phone needs a one-time code from the QR code (5 minutes) and your **Approve** on the Mac. The phone pins the gateway's certificate. The Mac keeps only a hash of each phone's token (30 days, renewed while used); **Revoke** closes that phone's connections at once. Phones can call only an allowlist of dsh methods (chats, prompts, attachments, slash commands, approvals, questions, models, agents, goals), not settings, credentials, the file browser or the terminal. Data: `$DSH_HOME/storages/dsh-composer-plus/mobile/`. Details: [tether/README.md](tether/README.md).
|
|
109
|
-
- **Updates:** the Host half asks `api.github.com` for the latest release and `registry.npmjs.org` for that exact version; nothing about you or your chats is sent. Installation uses dsh's plugin manager (`pnpm add dsh-composer-plus@<version
|
|
113
|
+
- **Updates:** the Host half asks `api.github.com` for the latest release and `registry.npmjs.org` for that exact version; nothing about you or your chats is sent. Installation uses dsh's plugin manager (`pnpm add dsh-composer-plus@<version>`; when dsh 0.2.1 refuses that for an installed plugin, `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, and the profile then lists that URL as the plugin's source), so dsh's own registry, script and version-compatibility checks apply. Pre-release tags and older versions are never installed.
|
|
110
114
|
|
|
111
115
|
## Troubleshooting
|
|
112
116
|
|
|
@@ -120,12 +124,12 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
120
124
|
- **Chat and files is greyed out:** the project is not a git repository, there is no snapshot from before that message (the message is older than the plugin, or one of the 50 newest snapshots replaced it), or no file changed.
|
|
121
125
|
- **Delete says another dsh has this chat open:** a second dsh on the same dsh home holds the chat's lock. Close that window or dsh, then delete again. The chat stays archived meanwhile.
|
|
122
126
|
- **A chat did not continue after a restart:** Resume after restart was off when dsh quit, you stopped that turn yourself, the turn had ended (done or failed), the chat was archived, or more than 20 chats were running (the newest 20 continue).
|
|
123
|
-
- **Install fails right after a release:** add the version (`dsh-composer-plus@1.
|
|
127
|
+
- **Install fails right after a release:** add the version (`dsh-composer-plus@1.10.0`), see the install note above.
|
|
124
128
|
|
|
125
129
|
## Limits
|
|
126
130
|
|
|
127
131
|
- Message-free Continue relies on dsh’s `agent/pre-step` → `agent/request` lifecycle. Recheck compatibility when upgrading dsh.
|
|
128
|
-
- **Feature ideas** keeps the cards in memory for each chat until dsh or the page reloads; then **Suggest features** asks the model again. The cards come in the UI language that dsh has when you click; after you change the language, cards already on the stack keep theirs and **More ideas** uses the new one. The model sees only the short project summary, not the code, so an idea can repeat something the project already has: skip it. The new chat runs in plan mode only when the profile has dsh's `/plan` command; otherwise the idea goes as an ordinary first message. The **Later** list belongs to the chat's folder path: the same folder opened through a symlink has its own list. It keeps at most 50 ideas per project (remove one to add more) and the same title only once. Dragging a card decides left or right only; use **↓** to save it.
|
|
132
|
+
- **Feature ideas** keeps the cards in memory for each chat until dsh or the page reloads; then **Suggest features** asks the model again. The cards come in the UI language that dsh has when you click; after you change the language, cards already on the stack keep theirs and **More ideas** uses the new one. The model sees only the short project summary, not the code, so an idea can repeat something the project already has: skip it. The new chat runs in plan mode only when the profile has dsh's `/plan` command; otherwise the idea goes as an ordinary first message. The **Later** list belongs to the chat's folder path: the same folder opened through a symlink has its own list. It keeps at most 50 ideas per project (remove one to add more) and the same title only once. Dragging a card decides left or right only; use **↓** to save it and **▶** to build it now. A repeat is found by its title only: the model can still suggest an earlier idea under a new name; skip it. When the model answers only earlier ideas, nothing new shows: click again.
|
|
129
133
|
- **Resume after restart** continues the turn; it does not replay it. A tool call that was running at the quit ends with dsh's “outcome unknown” result, and the model is told not to repeat finished work, but a command that is not safe to run twice can run again. Subagents, approvals and questions that were open are not restored: their parent chat continues and asks again. At most 20 chats continue at one start.
|
|
130
134
|
|
|
131
135
|
- **Content search** is dsh's own search, so it has dsh's limits. It searches only user and assistant messages: not tool output (commands, file contents, results), not reasoning, and it has no filter for user, assistant or tool messages. It matches whole words, not parts of a word (`deploy` does not find `deployment`); letters with accents match without them (`seker` finds `şeker`). One row per chat, with dsh's 240-character snippet, at most 20 rows.
|
|
@@ -134,7 +138,7 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
134
138
|
- **Turn rollback** puts files back only in a git repository, and only in the chat's folder. It keeps the 50 newest snapshots per chat. Ignored files (`.gitignore`, `info/exclude`, your global ignore file), empty folders, symlinks and submodules are not put back; a file that was ignored when the snapshot was taken is never deleted, even when the turn changed the ignore rules. A file that git cannot read is left out of the snapshot. Each of your messages runs one `git add --all` of the chat's folder into the private store: in a very large folder with many untracked files this can take a few seconds, and the next tool call waits for it (at most 10 s; the snapshot then finishes in the background). If your repository's `git gc` removes an object that an old snapshot needs, that file is listed as not put back. Only the text of the message comes back into the composer: add its images or files again. Subagent chats have no ↶ (a subagent's file changes count as changes of the chat that started it). The exported chat (`/export`) still has the withdrawn messages. The idea of one hidden marker that withdraws part of a chat comes from [dsh-rewind-plugin](https://github.com/SiriLee/dsh-rewind) by SiriLee (MIT); Composer Plus uses no code from it.
|
|
135
139
|
- **Delete chat** needs dsh's archive (dsh 0.2.0 and later). A chat (or one of its subagent chats) that does not stop within 15 s, or that another dsh holds, stays archived and nothing moves. On other systems than macOS the trash folder must be on the same disk as the chat history. An open chat that you delete stays in dsh's memory, archived and hidden, until dsh restarts. Empty the Trash yourself; dsh does not.
|
|
136
140
|
- dsh's queue has no `move` action, so a reorder rewrites the affected rows' text. If the agent picks up a row mid-move, the move is undone and nothing is lost. Messages with images or files can't be moved.
|
|
137
|
-
-
|
|
141
|
+
- dsh 0.2.1 loads an update at once when the new version changes no dsh settings; otherwise, and on dsh 0.2.0, restart dsh to load it. The plugin never restarts dsh for you. Web/CLI profiles without dsh's plugin manager only report a new version.
|
|
138
142
|
- **Keep composer focus** gives the focus back only after a `/` command or skill. While dsh resolves the command, the composer stays read-only for a few milliseconds, so keys pressed in that time are lost. If dsh's `/` menu is still open, `Enter` picks the highlighted row and does not send.
|
|
139
143
|
- **Mobile connect** works on macOS only (it uses `en0`, `openssl`, `swift` and `dns-sd`). It uses fixed ports 19390 and 19391, so only one dsh on each Mac can run it at a time (each Mac is one entry in the phone's Mac list). The phone gets notifications only while Tether is open or just went to the background (no push service). The iOS app is not on the App Store yet: build it from `tether/ios` with Xcode.
|
|
140
144
|
- A session link works inside chats; clicking it does not open the chat.
|
|
@@ -148,7 +152,7 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
148
152
|
|
|
149
153
|
**How do I add a Changes / git diff panel to DeepSeek Harness?** Install `dsh-composer-plus`, then right sidebar → `+` → **Changes**.
|
|
150
154
|
|
|
151
|
-
**Can dsh suggest features for my project, like swiping Tinder cards?** Yes: right sidebar → `+` → **Feature ideas** → **Suggest features**. Swipe right to start a new chat that plans the feature, swipe left to skip.
|
|
155
|
+
**Can dsh suggest features for my project, like swiping Tinder cards?** Yes: right sidebar → `+` → **Feature ideas** → **Suggest features**. Swipe right to start a new chat that plans the feature, click **▶ Build now** to start a chat that builds it at once without a plan, swipe left to skip.
|
|
152
156
|
|
|
153
157
|
**Can the dsh sidebar search find a chat by a word in its messages, not only its title?** Yes, with **Content search** (on by default): restart dsh once after you install the plugin, then use the magnifier next to **Workspaces**. Matching chats show the text around the word.
|
|
154
158
|
|
|
@@ -156,6 +160,8 @@ Tested on dsh `0.2.0-rc.2` (desktop and web) and `0.2.1-rc.2` (web). CI runs the
|
|
|
156
160
|
|
|
157
161
|
**Can I delete a chat instead of archiving it?** Yes, with **Delete chat**: **…** → **Delete…**. The history goes to the Trash, so a mistake can be undone.
|
|
158
162
|
|
|
163
|
+
**How do I see which project a chat belongs to?** Look at the row under the composer: with **Project name in the composer** (on by default) it starts with the project name. Hover it for the folder path.
|
|
164
|
+
|
|
159
165
|
**How do I get ↑/↓ message history in the dsh composer?** Install this plugin; in an empty composer `↑` / `↓` walk through messages you sent.
|
|
160
166
|
|
|
161
167
|
**How do I continue a stopped or failed dsh turn without typing "continue"?** With this plugin the Send button becomes **▶** after a stopped, failed or cut-off turn; one click resumes it.
|
|
@@ -200,7 +206,7 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/
|
|
|
200
206
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
|
|
201
207
|
# Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
|
|
202
208
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-resume-restart.mjs /path/to/dsh/lib/bin.js
|
|
203
|
-
# Feature ideas (fake model, made-up project): suggest, drag left, Undo, ✓ starts a new chat in plan mode + its thumbnail
|
|
209
|
+
# Feature ideas (fake model, made-up project): suggest, drag left, Undo, ✓ starts a new chat in plan mode, ▶ Build now one without, Plan all one for the Later list + its thumbnail
|
|
204
210
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-feature-ideas.mjs /path/to/dsh/lib/bin.js
|
|
205
211
|
# Content search (fake model, made-up chats): a message-only word finds its chat with the snippet, switch off + restart = titles only + its thumbnail
|
|
206
212
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path/to/dsh/lib/bin.js
|
|
@@ -213,7 +219,7 @@ npm run build:locales # after editing locales/<id>.json
|
|
|
213
219
|
npm test
|
|
214
220
|
```
|
|
215
221
|
|
|
216
|
-
**Rule for new features:** every feature row in Settings → Composer Plus shows a screenshot. Add the feature id to `SHOT_OF` in `client.js` and to `SHOTS` in `index.js`, and ship `assets/features/<id>.webp` (taken from the throwaway demo dsh, English UI, about 60 kB or less). Add the feature to the README table with the same image. `test/shots.test.mjs` fails when a feature has no screenshot, and `test/browser-settings-shots.mjs` checks the real Settings page. The full checklist for every change is in [AGENTS.md](AGENTS.md).
|
|
222
|
+
**Rule for new features:** every feature row in Settings → Composer Plus shows a screenshot. Add the feature id to `SHOT_OF` in `client.js` and to `SHOTS` in `index.js`, and ship `assets/features/<id>.webp` (taken from the throwaway demo dsh, English UI, about 60 kB or less). Add the feature to the README table with the same image, in `README.md` and in each translated `README.<id>.md`. `test/shots.test.mjs` fails when a feature has no screenshot, and `test/browser-settings-shots.mjs` checks the real Settings page. The full checklist for every change is in [AGENTS.md](AGENTS.md).
|
|
217
223
|
|
|
218
224
|
The tests run the real `client.js` against a fake React/DOM and the real `index.js` (Host half) against a temporary git repository. The Tether gateway tests (`test/tether-gateway.test.mjs`) use a mock dsh host and a real TLS gateway. The iPhone app is in `tether/ios` (see [tether/README.md](tether/README.md) and [tether/AGENTS.md](tether/AGENTS.md)). `node test/browser-history.mjs '<dsh web URL with ?token=…>'` checks input history in a real browser against a throwaway `dsh web` with its own `DSH_HOME`.
|
|
219
225
|
|