dsh-composer-plus 1.13.0 → 1.15.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 +65 -11
- package/README.es.md +65 -11
- package/README.fr.md +65 -11
- package/README.hi.md +65 -11
- package/README.id.md +65 -11
- package/README.ja.md +65 -11
- package/README.ko.md +65 -11
- package/README.md +65 -11
- package/README.pt-BR.md +65 -11
- package/README.ru.md +65 -11
- package/README.tr.md +65 -11
- package/README.vi.md +65 -11
- package/README.zh.md +65 -11
- package/assets/features/changesPanel.webp +0 -0
- package/assets/features/defaultWorkspace.webp +0 -0
- package/assets/features/findInChat.webp +0 -0
- package/assets/features/goalCheck.webp +0 -0
- package/assets/features/sessionBranch.webp +0 -0
- package/assets/features/worktreeChats.webp +0 -0
- package/client.js +1275 -222
- package/index.js +1442 -52
- package/package.json +2 -2
- package/tether/gateway/server.mjs +3 -2
package/README.ko.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
<p align="center"><img src="docs/images/hero.webp" width="820" alt="Composer Plus를 사용하는 DeepSeek Harness: 실행 중인 프로젝트는 사이드바에 회전 표시가 나타나고, 변경 사항 패널은 git diff를 보여 줍니다"></p>
|
|
16
16
|
|
|
17
|
-
비공식 커뮤니티 플러그인입니다. 네트워크 호출은 업데이트 확인(GitHub 릴리스와 npm 레지스트리)뿐입니다. 시작할 때 이 호출을 막으려면 **자동 업데이트**를 끄세요. **기능 아이디어**는 **기능 제안**을 클릭할 때만 채팅 자체의 모델을 호출합니다. **다음 메시지 예측**(기본값: 켜짐)은 턴이 끝날 때마다 설정에서 고른 모델(다른 모델을 고르지 않으면 dsh의 기본 모델)을 클릭 없이 한 번 호출합니다. 이 호출을 막으려면 **설정 → Composer Plus**에서 끄세요. **입력 중 자동 완성**(기본값: 꺼짐)은 사용자가 켠 뒤에 입력을 멈출 때마다 이 기능에서 고른 모델(기본값: 예측의 모델)을 호출합니다. **프롬프트 개선**은 요술봉을 클릭할 때만 모델을 호출합니다. **모바일 연결**(기본값: 꺼짐)은 사용자가 켠 뒤에만 로컬 네트워크나 tailnet에서 오는 iPhone 연결을 받습니다.
|
|
17
|
+
비공식 커뮤니티 플러그인입니다. 네트워크 호출은 업데이트 확인(GitHub 릴리스와 npm 레지스트리)뿐입니다. 시작할 때 이 호출을 막으려면 **자동 업데이트**를 끄세요. **기능 아이디어**는 **기능 제안**을 클릭할 때만 채팅 자체의 모델을 호출합니다. **다음 메시지 예측**(기본값: 켜짐)은 턴이 끝날 때마다 설정에서 고른 모델(다른 모델을 고르지 않으면 dsh의 기본 모델)을 클릭 없이 한 번 호출합니다. 이 호출을 막으려면 **설정 → Composer Plus**에서 끄세요. **입력 중 자동 완성**(기본값: 꺼짐)은 사용자가 켠 뒤에 입력을 멈출 때마다 이 기능에서 고른 모델(기본값: 예측의 모델)을 호출합니다. **프롬프트 개선**은 요술봉을 클릭할 때만 모델을 호출합니다. **목표 확인**(기본값: 켜짐)은 에이전트가 자동 라운드에서 `/goal`을 완료로 표시할 때마다 모델을 한 번 호출합니다. **모바일 연결**(기본값: 꺼짐)은 사용자가 켠 뒤에만 로컬 네트워크나 tailnet에서 오는 iPhone 연결을 받습니다.
|
|
18
18
|
|
|
19
19
|
## 설치
|
|
20
20
|
|
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
그런 다음 dsh를 다시 시작하세요. (CLI는 데스크톱 프로필에 설치할 수 없습니다. 데스크톱 프로필은 앱이 관리합니다.)
|
|
31
31
|
|
|
32
|
-
> dsh의 pnpm은 게시된 지 24시간이 지나지 않은 버전을 건너뜁니다. 릴리스 직후에는 버전을 붙여서 설치하세요: `dsh-composer-plus@1.
|
|
32
|
+
> dsh의 pnpm은 게시된 지 24시간이 지나지 않은 버전을 건너뜁니다. 릴리스 직후에는 버전을 붙여서 설치하세요: `dsh-composer-plus@1.15.0`.
|
|
33
33
|
|
|
34
34
|
## 기능
|
|
35
35
|
|
|
@@ -37,8 +37,8 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
37
37
|
|
|
38
38
|
| 기능 | 사용 방법 | 스크린샷 |
|
|
39
39
|
|---|---|---|
|
|
40
|
-
| **변경 사항 패널** | <a id="feature-changespanel"></a>오른쪽 사이드바 → `+` → **변경 사항**. **커밋 안 됨**, **스테이징 안 됨**, **스테이징됨**, **브랜치** 중 하나를 고르면 변경된 파일이 `+/-` 개수와 함께 표시됩니다. 파일을 클릭하면 diff를 볼 수 있습니다. **마지막 턴**은 최근 턴에 대한 dsh 자체 검토 화면을 엽니다. 브랜치 이름을 클릭하면(또는 **트리** 선택) 브랜치 트리를 볼 수 있습니다. 위쪽의 브랜치를 클릭하면 그 브랜치로 이동하고, 커밋을 클릭하면 그 파일과 diff를 볼 수 있습니다. **이 채팅**은 열린 채팅의 파일 도구(write, edit)가 모든 턴에서 쓴 파일만 보여 주고, 첫 메시지 이후의 전체 diff도 보여 줍니다. **␣** 버튼은 공백 변경을 숨깁니다(`git diff -w`). 들여쓰기나 줄 끝만 바뀐 줄은 표시되지 않습니다. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="스크린샷: 변경 사항 패널"></a> |
|
|
41
|
-
| **기능 아이디어** | <a id="feature-featureideas"></a>오른쪽 사이드바 → `+` → **기능 아이디어** → **기능 제안**. 채팅 자체의 모델이 채팅 프로젝트의 짧은 요약(최상위 파일, README와 매니페스트의 앞부분, 최근 커밋
|
|
40
|
+
| **변경 사항 패널** | <a id="feature-changespanel"></a>오른쪽 사이드바 → `+` → **변경 사항**. **커밋 안 됨**, **스테이징 안 됨**, **스테이징됨**, **브랜치** 중 하나를 고르면 변경된 파일이 `+/-` 개수와 함께 표시됩니다. 파일을 클릭하면 diff를 볼 수 있습니다. **마지막 턴**은 최근 턴에 대한 dsh 자체 검토 화면을 엽니다. 브랜치 이름을 클릭하면(또는 **트리** 선택) 브랜치 트리를 볼 수 있습니다. 위쪽의 브랜치를 클릭하면 그 브랜치로 이동하고, 커밋을 클릭하면 그 파일과 diff를 볼 수 있습니다. **이 채팅**은 열린 채팅의 파일 도구(write, edit)가 모든 턴에서 쓴 파일만 보여 주고, 첫 메시지 이후의 전체 diff도 보여 줍니다. **␣** 버튼은 공백 변경을 숨깁니다(`git diff -w`). 들여쓰기나 줄 끝만 바뀐 줄은 표시되지 않습니다. 파일의 **…** 메뉴 → **이 파일을 변경한 채팅**은 같은 저장소에서 쓰기 또는 편집 도구로 그 파일을 변경한 채팅을 변경한 요청과 함께 최신순으로 보여 줍니다. 클릭하면 그 요청 위치에서 채팅이 열립니다. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="스크린샷: 변경 사항 패널"></a> |
|
|
41
|
+
| **기능 아이디어** | <a id="feature-featureideas"></a>오른쪽 사이드바 → `+` → **기능 아이디어** → **기능 제안**. 채팅 자체의 모델이 채팅 프로젝트의 짧은 요약(최상위 파일, README와 매니페스트의 앞부분, README 나머지 부분의 개요, 최근 커밋 제목)을 읽고 기능을 최대 8개 제안합니다. 제안은 dsh UI 언어로 된 카드 묶음으로 표시됩니다. 카드를 오른쪽으로 스와이프하면(또는 **✓** 클릭, `→` 누르기. 어느 방법이든 카드가 그쪽으로 날아갑니다) 같은 프로젝트에서 새 채팅이 시작됩니다. 새 채팅은 그 아이디어를 요청으로 삼아 계획 모드로 시작하므로, 계획을 승인하기 전에는 아무것도 바뀌지 않습니다. 계획을 건너뛰려면 **▶ 바로 구현**을 클릭하세요(또는 `↑` 누르기. 카드가 위로 날아갑니다). 새 채팅이 그 아이디어를 일반 요청으로 삼아 바로 시작하고, 모델이 변경을 적용한 뒤 검사를 실행합니다(승인은 평소대로 적용됩니다). 건너뛰려면 왼쪽으로 스와이프하세요(또는 **✕**, `←`). **실행 취소**(또는 `Z`)는 건너뛴 카드를 되돌립니다. 좋은 아이디어를 나중을 위해 저장하려면 **↓**를 클릭하세요(또는 `↓` 누르기). 아이디어는 프로젝트의 **나중에** 목록에 들어갑니다. 같은 프로젝트 폴더의 모든 채팅에서 이 목록이 보입니다(재시작 후에도). **나중에(N)** 버튼은 목록을 엽니다. **계획하기**는 그 아이디어로 같은 계획 모드 채팅을 시작하고, **바로 구현**은 계획 없는 채팅을 시작합니다. 둘 다 아이디어를 목록에서 뺍니다. **모두 함께 계획 (N)** 버튼은 목록의 모든 아이디어로 계획 모드 채팅 하나를 시작하므로, 공통 부분은 한 번만 계획됩니다. **목록에서 제거**는 아이디어를 삭제합니다. **체크리스트로 복사**는 목록 전체를 Markdown 체크리스트(`- [ ] Title — Summary`, 아이디어마다 한 줄)로 클립보드에 복사합니다. 이슈 트래커나 TODO 파일에 쓸 수 있으며, 네트워크 요청은 하지 않습니다. 아이디어의 **GitHub 이슈 열기**는 사용자의 GitHub CLI(`gh`) 로그인으로 프로젝트의 GitHub 저장소에 아이디어의 제목과 요약(그리고 중요한 이유)으로 이슈를 엽니다. 그러면 아이디어 옆에 **이슈 #N** 링크가 표시되고, 이 링크로 이슈를 열 수 있습니다. **아이디어 더 받기**는 카드를 추가합니다. 한 분야에 대한 아이디어만 받으려면 **기능 제안** 옆 입력란에 짧은 **집중 주제**를 입력하거나(최대 80자, `Enter`로도 제안합니다), 그 아래의 고정 주제 **성능**, **접근성**, **테스트**, **보안**, **사용성**, **문서** 중 하나를 클릭하세요(다시 클릭하면 지워집니다). 그러면 모델은 그 주제에 관한 기능만 제안합니다. 입력란이 비어 있으면 어떤 기능이든 제안합니다. 한 프로젝트에서 같은 아이디어는 두 번 제안되지 않습니다. 제안된 모든 아이디어(건너뛴 것, 저장한 것, 시작한 것)는 프로젝트의 **기록**에 들어갑니다. 모델에는 그 아이디어를 다시 제안하지 말라는 지시가 전달되고, 제목이 반복된 아이디어는 버려집니다. **기록**은 아이디어를 **시작됨** 또는 **제안됨**으로 표시해 보여 줍니다. **잊기**(또는 **모두 잊기**)를 누르면 그 아이디어가 다시 나올 수 있지만, 아직 **나중에** 목록에 있는 아이디어는 그 목록에서 제거할 때까지 제안에 나오지 않습니다. 모델은 클릭할 때만 실행됩니다. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="스크린샷: 기능 아이디어"></a> |
|
|
42
42
|
| **내용 검색** | <a id="feature-contentsearch"></a>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> |
|
|
43
43
|
| **턴 되돌리기** | <a id="feature-turnrollback"></a>내 메시지 위에 포인터를 올리고 **↶** 버튼(복사 옆)을 클릭하세요. **채팅만**은 그 메시지와 이후의 모든 내용(답변, 도구 호출)을 채팅과 모델 컨텍스트에서 빼고, 메시지를 입력란에 다시 넣습니다. 메시지를 고친 뒤 다시 보내세요. **채팅과 파일**은 먼저 그 메시지 이후 바뀐 프로젝트 파일 목록을 보여 주고, 그 파일도 이전 상태로 되돌립니다. 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> |
|
|
44
44
|
| **채팅 삭제** | <a id="feature-deletechat"></a>사이드바 → 채팅의 **…** 메뉴(또는 마우스 오른쪽 클릭) → **삭제…** → **삭제**. dsh 자체는 보관만 할 수 있습니다. 채팅은 멈추고(dsh 자체 보관처럼 턴, 작업, 하위 에이전트, 예약도 멈춤), 저장된 기록은 하위 에이전트 채팅과 함께 macOS 휴지통으로 이동합니다(다른 시스템에서는 `$DSH_HOME/trash`). 되살리려면 폴더를 원래 위치에 다시 넣고 dsh를 다시 시작하세요. 채팅은 사이드바의 **보관된 항목만** 보기에 나타납니다. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="스크린샷: 채팅 삭제"></a> |
|
|
@@ -55,11 +55,16 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
55
55
|
| **채팅을 Markdown으로 내보내기** | <a id="feature-exportmarkdown"></a>사이드바에서 채팅을 마우스 오른쪽 버튼으로 클릭(또는 채팅의 **…** 메뉴 열기) → **Markdown으로 내보내기…**. 대화 상자에 채팅의 메시지 수가 표시됩니다. **클립보드에 복사**는 채팅을 Markdown으로 복사하고, **.md 파일 저장**은 브라우저 다운로드로 `<chat title>.md` 파일을 저장합니다(dsh 데스크톱: 시스템 설정에 따라 다운로드 폴더에 저장되거나 저장 대화 상자가 열립니다). 파일에는 채팅 제목, 프로젝트 이름, 날짜가 들어가고, 그 뒤에 메시지마다 `## 나` 또는 `## 어시스턴트` 섹션이 하나씩 이어집니다. 코드 블록은 그대로 유지됩니다. 메시지가 닫지 않은 코드 블록은 닫힙니다. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="스크린샷: 채팅을 Markdown으로 내보내기"></a> |
|
|
56
56
|
| **프로젝트 경로 복사** | <a id="feature-copyprojectpath"></a>사이드바에서 프로젝트를 마우스 오른쪽 버튼으로 클릭 → **경로 복사**를 선택하면 폴더의 전체 경로가 복사됩니다. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="스크린샷: 프로젝트 경로 복사"></a> |
|
|
57
57
|
| **새 채팅의 프로젝트 검색** | <a id="feature-projectpicker"></a>새 채팅 → 입력란 위의 프로젝트 버튼. 프로젝트가 A–Z 순서로 표시되고, 맨 위에 **프로젝트 검색** 상자가 있습니다. 이름의 일부를 입력하고(대소문자와 악센트 구분 없음) `Enter`를 누르면 첫 번째로 일치하는 프로젝트가 선택됩니다. 일치하는 것이 없으면 **일치하는 프로젝트 없음**이 표시됩니다. 사이드바에 저장된 dsh의 프로젝트 순서는 바뀌지 않습니다. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="스크린샷: 새 채팅의 프로젝트 검색"></a> |
|
|
58
|
+
| **새 세션의 기본 작업 공간** | <a id="feature-defaultworkspace"></a>설정 → Composer Plus → **새 세션의 기본 작업 공간** → **새 세션을 열 위치**: 프로젝트나 **일반 폴더(default-workspace)** 중 하나를 고르세요(기본값: dsh 자체 폴더 `Documents/deepseek-harness/default-workspace`, 처음 사용할 때 만들어집니다). 그러면 사이드바 맨 위의 **새 세션**(과 그 단축키)은 다른 프로젝트의 채팅이 열려 있을 때도 항상 그곳에서 새 채팅을 엽니다. 프로젝트 옆의 `+`는 여전히 그 프로젝트를 열고, 새 채팅의 입력란 위에 있는 프로젝트 버튼으로도 여전히 프로젝트를 바꿀 수 있습니다. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="스크린샷: 새 세션의 기본 작업 공간"></a> |
|
|
59
|
+
| **채팅에서 찾기** | <a id="feature-findinchat"></a>채팅에서 Mac에서는 `Cmd+F`(Windows와 Linux에서는 `Ctrl+F`)를 누르면 채팅 위에 찾기 상자가 열립니다. 단어를 입력하면 화면에 있는 메시지와 답변의 일치 항목이 모두 강조 표시되고, 현재 항목은 더 진한 색으로 표시되며, 상자에 n / 전체가 표시됩니다. `Enter` 또는 `↓`는 다음 일치 항목으로, `Shift+Enter` 또는 `↑`는 이전 일치 항목으로 이동합니다(화살표 버튼도 같습니다). 채팅은 일치 항목을 가운데로 스크롤합니다. 대소문자, 악센트, 튀르키예어의 점 없는 ı는 구분하지 않습니다. `Esc`는 상자를 닫고 커서를 원래 자리로 되돌립니다. 답변이 스트리밍되는 동안에도 찾기가 채팅을 따라갑니다. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="스크린샷: 채팅에서 찾기"></a> |
|
|
60
|
+
| **채팅별 브랜치** | <a id="feature-worktreechats"></a>새 채팅 → 프로젝트 버튼과 모드 버튼 사이의 main 버튼(브랜치 아이콘) → **새 브랜치**를 고른 뒤 첫 메시지를 입력해 보내세요. 첫 메시지에 이미지와 파일을 첨부할 수 있습니다. AI가 그 메시지를 보고 브랜치 이름(`feat/…`, `fix/…`)을 짓고, Composer Plus가 `<project>/.worktrees/`에 그 브랜치의 git worktree를 만들고, `.worktreeinclude`에 나열된 무시된 파일(예: `.env`, `node_modules/`)을 복사한 뒤, 거기서 메시지와 함께 새 채팅을 엽니다. 열린 채팅의 헤더에는 ⑂ 브랜치 · 변경 N개 · ↑ ↓(또는 **푸시 안 됨**)가 표시됩니다. 클릭하면 **변경 사항**이 열립니다. 같은 메뉴에 열린 worktree도 나열됩니다. 하나를 고르면 거기서 채팅을 시작합니다. 사이드바에서 브랜치 폴더를 프로젝트 안에 표시하려면 dsh의 **보기 옵션** → **작업 공간 트리**를 고르세요. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="스크린샷: 채팅별 브랜치"></a> |
|
|
58
61
|
| **다음 메시지 예측** | <a id="feature-nextprediction"></a>기본적으로 켜져 있습니다. **설정 → Composer Plus**에서 끌 수 있습니다. 에이전트가 턴을 마치면(중지되거나 실패한 턴 제외) 빈 입력란에 다음 메시지의 예측이 회색으로 표시되고, **Tab으로 수락** 힌트가 함께 나옵니다. `Tab`을 누르면 텍스트가 입력란에 들어가지만 보내지는 않습니다. `Esc`를 누르면 그 턴 동안 예측이 숨겨집니다. 입력을 시작해도 숨겨지고, 새 턴이 오면 새 예측으로 바뀝니다. 스위치 아래의 **모델** 메뉴에는 dsh 자체의 모델 목록이 나옵니다(dsh 모델 메뉴와 같은 목록). 기본으로 **dsh 기본값**이 선택되어 있으며, dsh의 기본 모델을 따릅니다. 턴이 끝날 때마다 짧은 모델 호출이 한 번 일어납니다. Tether에서는 예측이 빈 입력란 위에 표시됩니다. 탭하면 입력란에 들어갑니다. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="스크린샷: 다음 메시지 예측"></a> |
|
|
59
62
|
| **입력 중 자동 완성** | <a id="feature-typingcompletion"></a>기본적으로 꺼져 있습니다. **설정 → Composer Plus**에서 켤 수 있습니다. 입력하는 동안 커서 바로 뒤의 회색 텍스트가 메시지가 이어질 수 있는 내용을 보여 줍니다. `Tab`을 누르면 메시지에 추가되지만 보내지는 않습니다. `Esc`를 누르면 숨겨집니다. 사용자가 직접 이어서 쓸 말만 제안합니다. 사용자에게 하는 답변이나 지어낸 오류 문구, 이름은 제안하지 않습니다. 메시지가 끝난 것처럼 보이거나 모델이 확신하지 못하면 아무것도 표시되지 않습니다. 회색 텍스트의 다음 글자를 그대로 입력하면 텍스트가 유지되고, 새 모델 호출은 없습니다. 스위치 아래에 이 기능 전용 **모델** 메뉴가 있습니다. 첫 항목인 **다음 메시지 예측과 같음**은 **다음 메시지 예측**의 모델을 사용합니다(기본값). 기능마다 다른 모델을 쓰려면 다른 모델을 고르세요. 예를 들어 자동 완성에는 더 빠른 모델을 고를 수 있습니다. 입력을 멈출 때마다 모델을 한 번 호출하므로 예측보다 토큰을 훨씬 많이 사용합니다. 빠르고 비용이 낮은 모델을 고르세요. 슬래시 명령, 파일 칩이 있는 메시지, 커서가 끝에 있지 않을 때는 실행되지 않습니다. Tether에서는 입력하는 동안 나머지 텍스트가 입력란 위에 표시됩니다. 탭하면 추가됩니다. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="스크린샷: 입력 중 자동 완성"></a> |
|
|
60
63
|
| **프롬프트 개선** | <a id="feature-promptimprove"></a>대략적인 요청을 입력한 뒤 모델 메뉴 옆의 요술봉(**프롬프트 개선**)을 클릭하세요. 모델 호출 한 번으로 요청을 더 명확한 프롬프트로 다시 씁니다. 목표를 먼저 쓰고, 여러 부분이 있으면 짧은 번호 단계로 나누고, 실행할 검사를 적습니다. 이 채팅(되돌린 메시지 제외), 프로젝트의 README, AGENTS.md, 매니페스트, 변경된 파일, 이름이 입력한 단어와 일치하는 파일을 읽고, 사용 언어를 유지합니다. 파일 이름을 지어내지 않습니다. 새 텍스트가 초안을 대신하지만 보내지는 않습니다. 읽고 고친 뒤 `Enter`를 누르세요. `Cmd/Ctrl+Z`를 누르면 한 번에 원래 텍스트로 돌아오며, 버튼(**개선 실행 취소**)도 같습니다. 작업 중에 입력하면 새로 입력한 텍스트가 유지됩니다. `Esc`를 누르거나 한 번 더 클릭하면 취소됩니다. 설정에 전용 **모델** 메뉴가 있습니다(기본값: **채팅의 모델과 같음**). 슬래시 명령이나 파일 칩이 있는 메시지에는 쓸 수 없습니다. Tether에서는 요술봉이 입력란 옆에 있습니다. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="스크린샷: 프롬프트 개선"></a> |
|
|
64
|
+
| **목표 확인** | <a id="feature-goalcheck"></a>`/goal`로 목표를 시작하세요. 에이전트가 자동 라운드에서 목표를 완료로 표시하면, 목표는 두 가지 확인을 통과해야만 닫힙니다. 먼저 프로젝트의 테스트 명령이 채팅 폴더에서 채팅의 샌드박스 모드로 실행됩니다. 명령은 직접 정한 명령이거나 `package.json`, `Makefile`, `Cargo.toml`, `go.mod` 또는 pytest에서 찾은 명령입니다. 에이전트 자신의 최신 단계가 그 테스트의 성공한 실행이었다면 다시 실행하지 않습니다. 그다음 도구가 없는 독립적인 모델 호출 한 번이 목표, 이 채팅, `git status`, 테스트 결과를 읽습니다. 확인에 실패하면 목표는 진행 중으로 남고, 에이전트가 이유를 읽은 뒤 다음 라운드가 이어집니다. 목표 바 아래의 행(**목표 확인**)에 테스트와 마지막 결과가 표시됩니다. **편집**에서 직접 테스트 명령과 시간 또는 토큰 제한을 정합니다. 제한을 넘으면 목표가 차단됩니다. **지금 실행**은 목표를 닫지 않고 확인을 실행합니다. 설정에 전용 **모델** 메뉴가 있습니다(기본값: **채팅의 모델과 같음**). 목표를 직접 완료하면 아무것도 확인하지 않습니다. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="스크린샷: 목표 확인"></a> |
|
|
61
65
|
| **이 채팅에서 허용** | <a id="feature-allowforchat"></a>자동 검토가 확인을 요청하면 승인 카드에 **이 채팅에서 허용**이 추가됩니다. 이후 같은 채팅의 같은 도구는 인수와 관계없이 시간 제한이 끝날 때까지 허용됩니다(기본값 1시간. **설정 → Composer Plus → 이 채팅에서 허용**에서 고릅니다). 그 후에는 에이전트가 다시 묻습니다. 헤더 칩에서 허용 목록과 종료 시각을 보고 취소할 수 있습니다. 허용은 재시작 후에도 유지됩니다. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="스크린샷: 이 채팅에서 허용"></a> |
|
|
62
66
|
| **프로젝트 상태** | <a id="feature-projectstatus"></a>사이드바의 프로젝트 행에 그 채팅과 같은 실행 중 / 대기 중 / 완료 표시가 나타납니다. 그래서 접힌 프로젝트도 안의 채팅이 작업 중인지, 사용자의 조치가 필요한지 알려 줍니다. 사용자의 조치를 기다리는 채팅이 먼저 표시되고, 그다음 아직 열지 않은 완료된 채팅(초록색 점, 다른 채팅이 아직 실행 중일 때도 표시), 마지막으로 실행 중 표시가 나타납니다. 포인터를 올리면 자세한 내용이 보입니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="스크린샷: 프로젝트 상태"></a> |
|
|
67
|
+
| **채팅 행의 Git 브랜치** | <a id="feature-sessionbranch"></a>사이드바의 각 채팅 행에 작은 회색 배지로, 채팅의 마지막 턴 때 채팅 프로젝트 폴더가 있던 git 브랜치가 표시됩니다(예: `main` 또는 `feature/login`. 분리된 HEAD는 짧은 커밋 ID를 괄호 안에 표시합니다). 한 프로젝트에서 서로 다른 브랜치에 있는 두 채팅이 더 이상 똑같아 보이지 않으며, 잘못된 브랜치에서 채팅을 이어 가려 할 때 바로 알 수 있습니다. 배지에 포인터를 올리면 전체 이름이 보입니다. Host 쪽은 턴이 시작될 때와 끝날 때 브랜치를 읽습니다(`git branch --show-current`, 읽기 전용). 이 기능을 설치한 뒤 턴이 없는 채팅이나 git 저장소가 아닌 폴더에는 배지가 표시되지 않습니다. 채팅 위의 프로젝트 행 이름이 브랜치와 같으면(예: “채팅별 브랜치” 폴더) 채팅 행에 배지가 표시되지 않지만, “하나의 목록”에서는 계속 표시됩니다. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="스크린샷: 채팅 행의 Git 브랜치"></a> |
|
|
63
68
|
| **모두 읽음으로 표시** | <a id="feature-markprojectread"></a>사이드바에서 프로젝트의 **…** 버튼 → **모두 읽음으로 표시**를 클릭하세요. 그 프로젝트의 모든 채팅에서 초록색 읽지 않음 점이 한 번에 사라집니다. 다른 프로젝트의 점은 그대로 남습니다. 프로젝트에 읽지 않은 채팅이 없으면 이 항목은 회색으로 표시됩니다(**읽지 않은 채팅 없음**). | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="스크린샷: 모두 읽음으로 표시"></a> |
|
|
64
69
|
| **활성 프로젝트 우선** | <a id="feature-activeprojectsfirst"></a>채팅이 실행을 시작하거나 사용자의 조치가 필요해지면, 그 프로젝트가 dsh 자체 행 애니메이션으로 사이드바 맨 위로 이동합니다(직접 끌어 올릴 때와 같은 움직임). 완료된 프로젝트는 제자리에 남으며, 평소처럼 원하는 곳으로 끌어 옮길 수 있습니다. 이동은 dsh의 프로젝트 순서에 저장되므로, 이 기능을 꺼도 현재 순서가 유지됩니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="스크린샷: 활성 프로젝트 우선"></a> |
|
|
65
70
|
| **최근 프로젝트 필터** | <a id="feature-recentprojects"></a>사이드바 → 보기 옵션(슬라이더 아이콘) → **최근 2시간 내 활성**. 이 옵션을 선택하면 사이드바에는 최근 2시간 안에 활성 채팅이 있었던 프로젝트만 표시됩니다. 활성 채팅은 그 시간 안에 업데이트된 채팅, 실행 중이거나 대기 중인 채팅, 열려 있는 채팅, 아직 열지 않은 완료된 채팅(dsh의 초록색 “완료” 점)입니다. 마지막 경우는 2시간이 지나도 해당됩니다. 이런 채팅이 없는 프로젝트는 숨겨지며, 새 프로젝트와 빈 프로젝트도 숨겨집니다. 모든 프로젝트를 다시 보려면 옵션을 다시 선택하세요. 선택은 이 기기에 저장됩니다. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="스크린샷: 최근 프로젝트 필터"></a> |
|
|
@@ -67,7 +72,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
67
72
|
| **상태별 정렬** | <a id="feature-statusorder"></a>사이드바 → 보기 옵션 → **정렬 기준** → **상태별**(**하나의 목록**과 함께 사용). 완료된 채팅이 먼저 옵니다(dsh의 “완료” 점. 오류로 끝난 턴에도 이 점이 붙습니다). 그다음 실행 중이거나 대기 중인 채팅, 활성 자동화(예약)가 있는 채팅, 나머지 채팅이 dsh 순서대로 옵니다. 완료된 채팅을 열면 아래로 이동합니다. 보기만 바뀝니다. 원래대로 돌아가려면 **수동** 또는 **마지막 업데이트**를 선택하세요. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="스크린샷: 상태별 정렬"></a> |
|
|
68
73
|
| **백그라운드 알림** | <a id="feature-notifications"></a>dsh가 백그라운드에 있을 때 턴이 끝나면(답변의 첫 줄과 함께) 알림을 받습니다. 채팅이 정말로 사용자를 기다릴 때도 알림을 받습니다. 기다리는 이유는 승인(도구 이름), 답변(질문), 계획 검토입니다. 요청이 1.5초 뒤에도 열려 있어야 알림이 갑니다. 그래서 자동으로 처리된 승인(자동 검토 허용, 다른 플러그인)은 알림을 보내지 않습니다. 요청에 답하면 알림도 바로 사라집니다. Dock/작업 표시줄 배지는 기다리는 채팅 수를 보여 줍니다. 알림을 클릭하면 그 채팅이 열립니다. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="스크린샷: 백그라운드 알림"></a> |
|
|
69
74
|
| **애플리케이션 언어** | <a id="feature-language"></a>설정 → 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="스크린샷: 애플리케이션 언어"></a> |
|
|
70
|
-
| **모바일 연결(iPhone)** | <a id="feature-mobileconnect"></a>[Tether](tether/) 앱으로 iPhone에서 dsh를 사용하세요. 같은 Wi-Fi나 [Tailscale](https://tailscale.com)을 통해 연결합니다. **설정 → Composer Plus**에서 켜세요(이 Mac에서 네트워크 포트를 열기 때문에 기본적으로 꺼져 있습니다). 그다음 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하세요. iPhone 카메라(**Open in Tether**를 탭)나 Tether의 **Scan code**로 QR 코드를 스캔하고, **Connect**를 탭한 뒤 **Approve**를 클릭하세요. 먼저 Tether를 설치하세요. Tether가 없으면 카메라가 이 코드를 열 수 없습니다. 휴대폰에서 채팅을 보고, 메시지를
|
|
75
|
+
| **모바일 연결(iPhone)** | <a id="feature-mobileconnect"></a>[Tether](tether/) 앱으로 iPhone에서 dsh를 사용하세요. 같은 Wi-Fi나 [Tailscale](https://tailscale.com)을 통해 연결합니다. **설정 → Composer Plus**에서 켜세요(이 Mac에서 네트워크 포트를 열기 때문에 기본적으로 꺼져 있습니다). 그다음 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하세요. iPhone 카메라(**Open in Tether**를 탭)나 Tether의 **Scan code**로 QR 코드를 스캔하고, **Connect**를 탭한 뒤 **Approve**를 클릭하세요. 먼저 Tether를 설치하세요. Tether가 없으면 카메라가 이 코드를 열 수 없습니다. 휴대폰에서 채팅을 보고, 메시지를 보내고(사진 포함: 입력란의 **+** → Camera, Photos 또는 Paste image), 승인과 질문에 답하고, 모델과 에이전트를 바꿀 수 있습니다. Mac은 원하는 만큼 페어링할 수 있으며, 앱 왼쪽 위의 Mac 이름으로 Mac을 전환합니다. **모바일 연결** 패널에는 페어링된 iPhone이 마지막 연결 시각과 함께 표시되며, **Remove**를 누르면 그 iPhone의 연결이 즉시 끊깁니다. “Tailscale only”는 로컬 네트워크의 연결을 거부하고(공유 Wi-Fi용), 액세스 로그는 누가 연결을 시도했는지 보여 줍니다. Tether에서는 “Settings → Privacy”에서 Face ID로 앱을 잠급니다. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="스크린샷: 모바일 연결(iPhone)"></a> |
|
|
71
76
|
| **자동 업데이트** | <a id="feature-autoupdate"></a>dsh가 시작되면 플러그인이 [최신 GitHub 릴리스](https://github.com/furkancak1r/dsh-composer-plus/releases/latest)를 확인합니다. 더 새로운 버전이고 npm에도 올라와 있으면, dsh 자체 플러그인 관리자(설정 → 플러그인과 같은 경로)로 정확히 그 버전을 설치하고 알려 줍니다. 새 버전을 로드하려면 dsh를 다시 시작하세요. **설정 → Composer Plus → Composer Plus 업데이트**에서 버전을 볼 수 있고, **업데이트 확인** / **지금 업데이트** 버튼도 있습니다. 새 버전으로 dsh를 처음 시작하면 **Composer Plus N의 새로운 기능** 창이 그 버전의 릴리스 노트를 한 번 보여 줍니다(같은 업데이트 확인에서 받은 내용이며 추가 네트워크 호출은 없습니다). **닫기** 또는 `Esc`로 닫습니다. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="스크린샷: 자동 업데이트"></a> |
|
|
72
77
|
|
|
73
78
|
<!-- END GENERATED FEATURES -->
|
|
@@ -76,7 +81,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
76
81
|
|
|
77
82
|
## 설정
|
|
78
83
|
|
|
79
|
-
모든 기능은 dsh **설정 → Composer Plus**에서 하나씩 켜거나 끌 수 있습니다. 각 행에는 작은 스크린샷이 있습니다. 포인터를 올리면 크게 미리 보고, 클릭하면 원래 크기로 엽니다(`Esc`로 닫기). 맨 위의 **기능 검색** 상자는 이름이나 설명으로 페이지를 걸러 냅니다(모든 언어, 대소문자와 악센트 구분 없음). `Esc`를 누르면 검색어가 지워집니다. 각 행에는 스위치와 짧은 설명이 있습니다. 행 이름 뒤의 작은 **?**는 그 기능을 설명하는 README 부분을 dsh 인터페이스 언어의 README에서 엽니다. 변경 사항은 재시작 없이 바로 적용되고 그 기기에 저장됩니다. **모바일 연결**, **재시작 후 이어서 실행**, **입력 중 자동 완성**을 빼고 모든 기능이 기본적으로 켜져 있습니다. 이 세 기능과 **내용 검색**, **턴 되돌리기**, **다음 메시지
|
|
84
|
+
모든 기능은 dsh **설정 → Composer Plus**에서 하나씩 켜거나 끌 수 있습니다. 각 행에는 작은 스크린샷이 있습니다. 포인터를 올리면 크게 미리 보고, 클릭하면 원래 크기로 엽니다(`Esc`로 닫기). 맨 위의 **기능 검색** 상자는 이름이나 설명으로 페이지를 걸러 냅니다(모든 언어, 대소문자와 악센트 구분 없음). `Esc`를 누르면 검색어가 지워집니다. 각 행에는 스위치와 짧은 설명이 있습니다. 행 이름 뒤의 작은 **?**는 그 기능을 설명하는 README 부분을 dsh 인터페이스 언어의 README에서 엽니다. 변경 사항은 재시작 없이 바로 적용되고 그 기기에 저장됩니다. **모바일 연결**, **재시작 후 이어서 실행**, **입력 중 자동 완성**을 빼고 모든 기능이 기본적으로 켜져 있습니다. 이 세 기능과 **내용 검색**, **턴 되돌리기**, **다음 메시지 예측**, **목표 확인**의 스위치는 dsh의 Host가 보관합니다. 그래서 모든 창에 적용되고 재시작 후에도 유지됩니다. **다음 메시지 예측**에서 고른 **모델**, **입력 중 자동 완성**에서 고른 모델(기본값 **다음 메시지 예측과 같음**), **프롬프트 개선**과 **목표 확인**에서 고른 모델(둘 다 기본값 **채팅의 모델과 같음**), **이 채팅에서 허용**의 **시간 제한**(기본값 1시간)도 Host가 보관합니다. **내용 검색**은 dsh를 다시 시작한 뒤에만 바뀝니다(dsh가 시작할 때 이 값을 읽기 때문입니다). 그 전까지 해당 행에 **이 변경 사항을 적용하려면 dsh를 다시 시작하세요.**가 표시됩니다.
|
|
80
85
|
|
|
81
86
|
<p align="center"><img src="docs/images/settings.webp" width="720" alt="설정 → Composer Plus: 기능 검색, 언어 선택, 업데이트 행, 기능별 스위치, 포인터를 올리면 나타나는 스크린샷 미리 보기"></p>
|
|
82
87
|
|
|
@@ -90,7 +95,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
90
95
|
|
|
91
96
|
앱 전체가 바로 바뀝니다. 이 선택은 dsh 자체에 저장되는 `locale.preference`(일반 → 언어와 같은 설정)이므로 재시작 후에도 유지됩니다. **시스템 언어**는 이 선택을 지웁니다. 그러면 데스크톱 앱은 OS 언어를, 웹 UI는 브라우저 언어를 따릅니다. 지원하지 않는 언어이면 영어로 표시됩니다. 플러그인을 설치해도 이미 고른 언어는 절대 바뀌지 않습니다.
|
|
92
97
|
|
|
93
|
-
각 언어 팩에는 텍스트 3,
|
|
98
|
+
각 언어 팩에는 텍스트 3,280개가 있습니다. 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가 추가한 문자열은 팩이 업데이트될 때까지 영어로 표시됩니다. 다른 플러그인이 이미 어떤 언어를 제공하면, 그 언어는 해당 플러그인의 것이 유지됩니다.
|
|
94
99
|
|
|
95
100
|
## 키보드 단축키
|
|
96
101
|
|
|
@@ -110,6 +115,12 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
110
115
|
| `Tab` | 예측이 표시된 빈 입력란 | 예측을 입력란에 넣기 |
|
|
111
116
|
| `Tab` | 커서 뒤의 회색 완성 텍스트 | 완성 텍스트를 메시지에 추가하기 |
|
|
112
117
|
| `Esc` | 예측이 표시된 빈 입력란 | 예측 숨기기 |
|
|
118
|
+
| `Cmd/Ctrl+Z` | **프롬프트 개선**을 사용한 뒤의 입력란 | 입력한 텍스트 되돌리기 |
|
|
119
|
+
| `Esc` | **프롬프트 개선**이 실행 중인 입력란 | 개선 취소 |
|
|
120
|
+
| `Enter` / `Esc` | 더블클릭한 대기 중인 메시지 | 편집 저장 / 취소 |
|
|
121
|
+
| Mac에서는 `Cmd+F`, Windows와 Linux에서는 `Ctrl+F` | 열린 채팅 | **채팅에서 찾기** 열기 |
|
|
122
|
+
| `Enter` / `Shift+Enter`, `↓` / `↑` | **채팅에서 찾기** 상자 | 다음 / 이전 일치 항목 |
|
|
123
|
+
| `Esc` | **채팅에서 찾기** 상자 | 상자 닫기 |
|
|
113
124
|
|
|
114
125
|
`/` 또는 `@` 메뉴가 열려 있으면 이 키는 메뉴가 사용합니다.
|
|
115
126
|
|
|
@@ -122,10 +133,14 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
122
133
|
- **계속:** 인증된 로컬 엔드포인트는 마지막으로 중단된 턴만 재개합니다. 오래되었거나 중복된 요청은 거부하고, 기존 승인 훅은 그대로 유지합니다. 새 사용자 메시지는 보내지 않습니다.
|
|
123
134
|
- **재시작 후 이어서 실행:** 켜기 전까지 꺼져 있습니다. Host 쪽은 채팅 ID와 시작 시각만 `$DSH_HOME/storages/dsh-composer-plus/resume.json`(소유자 전용 권한)에 보관합니다. 아무것도 컴퓨터 밖으로 나가지 않습니다. 마지막 턴을 사용자가 아니라 dsh가 멈췄다고 dsh 자체 로그에 기록된 경우에만 채팅을 이어 갑니다. 이어지는 턴에도 승인과 자동 검토가 평소대로 적용됩니다.
|
|
124
135
|
|
|
125
|
-
- **변경 사항 패널:** git은 dsh의 인증된 `/api` 채널을 거쳐, 내 컴퓨터의 채팅 폴더 안에서 읽기 전용으로 실행됩니다. 커밋, 스테이징, fetch는 절대 하지 않으며, git 자체가 나열한 경로만 보여 줍니다. 트리는 로컬 및 원격 브랜치의 최신 커밋 300개를 보여
|
|
126
|
-
- **기능 아이디어:** **기능 제안**을 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽이 채팅 자체의 폴더만 읽습니다(브라우저는 경로를 보내지 않습니다). 읽는 내용은 최상위 항목 이름, README·AGENTS.md·매니페스트(`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …)의 처음 6 kB, `git log --
|
|
136
|
+
- **변경 사항 패널:** git은 dsh의 인증된 `/api` 채널을 거쳐, 내 컴퓨터의 채팅 폴더 안에서 읽기 전용으로 실행됩니다. 커밋, 스테이징, fetch는 절대 하지 않으며, git 자체가 나열한 경로만 보여 줍니다. 트리는 로컬 및 원격 브랜치를 최대 1000개까지 나열하고, 한 브랜치의 최신 커밋 300개를 보여 줍니다. 첫 번째 부모 줄기만 따라가므로 병합 커밋이 그 커밋이 가져온 커밋들을 대신합니다. 브랜치를 전환(checkout)하지 않습니다. **이 채팅**은 채팅 자체의 로그에서 파일 도구가 쓴 파일을 찾고, 곧바로 삭제되는 임시 폴더에서 그 파일을 채팅의 턴 되돌리기 스냅샷과 비교합니다. 내 저장소나 스냅샷 저장소에는 아무것도 쓰지 않습니다.
|
|
137
|
+
- **기능 아이디어:** **기능 제안**을 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽이 채팅 자체의 폴더만 읽습니다(브라우저는 경로를 보내지 않습니다). 읽는 내용은 최상위 항목 이름, README·AGENTS.md·매니페스트(`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …)의 처음 6 kB, README 나머지 부분의 개요(제목, 표의 행, 목록 항목, 최대 6 kB), 최근 커밋 제목(`git log --format=%s`, 최대 6 kB)이며, 합계 최대 28 kB입니다. `.env*`, 키 파일, `node_modules` 같은 폴더는 건너뜁니다. 폴더 안에 있는 일반 파일만 읽으며, 폴더 밖을 가리키는 심볼릭 링크, FIFO, 장치는 건너뜁니다. 이 요약은 dsh 자체 제공자 설정을 거쳐 채팅이 쓰는 모델에 요청 한 번으로 전달됩니다. 어떤 채팅에도 추가되지 않습니다. 프로젝트에는 아무것도 쓰지 않습니다. 오른쪽으로 스와이프한 아이디어는 계획 모드로 새 채팅을 시작하므로, 승인과 계획 검토가 평소대로 적용됩니다. **바로 구현**은 계획 모드 없이 채팅을 시작합니다. 모델이 바로 파일을 바꿀 수 있으며, 채팅의 평소 승인과 자동 검토가 적용됩니다. 나중을 위해 저장한 아이디어(제목, 요약, 이유, 작업량)는 프로젝트 폴더 경로와 함께 dsh 홈 아래 `storages/dsh-composer-plus/later.json`(소유자 전용 파일)에 보관됩니다. 프로젝트에는 아무것도 들어가지 않습니다. 제안된 아이디어의 기록(제목, 요약, 이유, 작업량, 날짜, 시작 여부)도 같은 방식으로 `storages/dsh-composer-plus/idea-history.json`에 보관되며, 프로젝트당 최대 200개입니다(가장 오래된 것부터 지워집니다). 그 제목들은 그 프로젝트에서 다음에 **기능 제안**을 누를 때 모델에 전달됩니다.
|
|
127
138
|
- **내용 검색:** 채팅을 검색하는 새 코드는 없습니다. 플러그인은 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`에 있습니다.
|
|
128
139
|
- **턴 되돌리기:** 내 메시지마다, 보내기 전에 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`에 있습니다. 파일까지 되돌릴 때는 **다시 실행**을 위해 되돌리기 직전의 파일도 보관합니다(같은 저장소의 `refs/r/…`). 다시 실행한 되돌리기 목록은 `$DSH_HOME/storages/dsh-composer-plus/redone.json`(소유자 전용)에 있습니다.
|
|
140
|
+
- **GitHub 이슈 열기**(기능 아이디어 → **나중에** 목록): 클릭할 때만 실행됩니다. Host 쪽은 채팅 폴더에서 사용자의 GitHub CLI(`gh issue create`)를 아이디어의 저장된 제목과 요약(그리고 중요한 이유)으로 실행합니다. `gh`는 자체 로그인과 폴더의 GitHub 원격 저장소를 쓰므로, 이슈는 사용자 계정으로 그 저장소에 만들어지고, GitHub는 그 저장소를 볼 수 있는 모든 사람에게 이슈를 보여 줍니다. dsh는 자신이 시작하는 명령에서 토큰처럼 보이는 이름의 변수를 제거합니다. `GH_TOKEN` 또는 `GITHUB_TOKEN`으로 `gh`에 토큰을 주었다면, 플러그인은 이 두 변수만 `gh`에 전달합니다. 이슈 링크는 아이디어와 함께 `later.json`에 보관됩니다.
|
|
141
|
+
- **이 파일을 변경한 채팅**(변경 사항, 파일의 "…" 메뉴): Host 쪽은 폴더가 같은 저장소에 있는 채팅의 로그를 dsh가 보관한 그대로 읽고, 각 채팅의 제목, 시간, 요청의 첫 줄을 응답합니다. 파일 자체는 절대 열지 않습니다.
|
|
142
|
+
- **채팅 행의 Git 브랜치:** Host 쪽은 턴이 시작될 때와 끝날 때 채팅 폴더에서 `git branch --show-current`(읽기 전용)를 실행하고, 채팅 ID, 브랜치 이름, 시간만 `$DSH_HOME/storages/dsh-composer-plus/session-branches.json`(소유자 전용 파일, 최신 채팅 2000개)에 보관합니다. 스위치 값은 그 옆의 `branches.json`에 있습니다.
|
|
143
|
+
- **채팅에서 찾기**는 페이지 안에서만 실행됩니다. 페이지가 보여 주는 텍스트를 읽고, 아무것도 보내지 않습니다.
|
|
129
144
|
- **채팅을 Markdown으로 내보내기:** 호스트 쪽은 채팅 자체의 로그(dsh가 보여 주는 것과 같은 메시지)만 읽어 페이지에 넘깁니다. 프로젝트 파일은 읽지 않고, 네트워크로 아무것도 보내지 않습니다. Markdown은 클립보드나 사용자가 저장하는 파일로만 갑니다.
|
|
130
145
|
- **채팅 삭제:** 채팅 자체의 로그 폴더(`$DSH_HOME/sessions/<project>/<chat>`)를 휴지통으로 옮깁니다. 프로젝트 폴더는 건드리지 않습니다.
|
|
131
146
|
- **이 채팅에서 허용:** 허용 항목은 허용한 시각과 함께 `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json`(소유자 전용 권한)에 저장됩니다. 허용 하나는 한 채팅의 정확히 한 도구에만 적용되며, 시간 제한이 끝날 때까지 유효합니다(기본값 1시간). 그 도구가 쓰기를 할 수 있다면, 허용은 모든 쓰기에도 적용됩니다. 헤더 칩에서 취소하세요.
|
|
@@ -135,6 +150,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
135
150
|
- **다음 메시지 예측:** 기본적으로 켜져 있습니다. 이 모델 호출을 막으려면 **설정 → Composer Plus**에서 끄세요. 턴이 끝날 때마다 Host 쪽은 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론 제외)을 최대 약 6,000자(가장 최근 부분)까지 고른 모델(다른 모델을 고르지 않으면 dsh의 기본 모델)에 보냅니다. dsh 자체 제공자 설정을 거쳐 요청 한 번으로 전달됩니다. 채팅에는 아무것도 저장되지 않으며, 예측은 채팅 기록에 추가되지 않습니다. 스위치와 고른 모델은 `$DSH_HOME/storages/dsh-composer-plus/predict.json`(소유자 전용 파일)에 보관됩니다.
|
|
136
151
|
- **입력 중 자동 완성:** 켜기 전까지 꺼져 있습니다. 켜져 있는 동안 입력을 멈출 때마다 Host 쪽은 지금까지 입력한 텍스트와, 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론 제외)을 채팅 기준 최대 약 3,000자까지 **입력 중 자동 완성**에서 고른 모델(기본값: **다음 메시지 예측**의 모델)에 보냅니다. 입력을 다시 멈추면 이전 요청은 중지됩니다. 채팅에는 아무것도 저장되지 않습니다. 스위치는 `$DSH_HOME/storages/dsh-composer-plus/complete.json`(소유자 전용 파일)에 보관됩니다.
|
|
137
152
|
- **프롬프트 개선:** 요술봉을 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽은 초안, 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론, 되돌린 메시지 제외. 최대 약 6,000자, 가장 최근 부분), **기능 아이디어**와 같은 프로젝트 요약(파일 규칙도 같음: `.env*`나 키 파일 없음, 폴더 밖을 가리키는 심볼릭 링크 없음, FIFO 없음), `git status`가 변경됨으로 표시하는 경로, 이름에 초안과 같은 단어가 들어 있는 추적되거나 추적되지 않는(무시되지 않은) 경로 최대 30개를 **프롬프트 개선**에서 고른 모델(기본값: 채팅 자체의 모델)에 요청 한 번으로 보냅니다. 이 요약 외의 파일 내용은 보내지 않습니다. 채팅과 프로젝트에는 아무것도 쓰지 않습니다. 답변은 입력란의 초안을 바꿀 뿐이며, 보낼지는 사용자가 정합니다. 고른 모델은 `$DSH_HOME/storages/dsh-composer-plus/improve.json`(소유자 전용 파일)에 보관됩니다.
|
|
153
|
+
- **목표 확인:** 에이전트가 자동 라운드에서 `/goal`을 완료로 표시할 때(또는 **지금 실행**을 클릭할 때)만 실행됩니다. Host 쪽은 테스트 명령을 채팅 폴더에서 채팅의 샌드박스 모드로 실행합니다(dsh 자체의 `bash` 도구와 같음: 같은 파일 접근 정책. 그 샌드박스를 시작할 수 없으면 테스트를 실행하지 않고 확인은 실패합니다). 명령을 찾으려고 `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml`, `pytest.ini`만 폴더 안의 일반 파일로 읽습니다(폴더 밖을 가리키는 심볼릭 링크 없음, FIFO 없음). 그다음 목표, 목표가 시작된 뒤의 채팅(사용자의 메시지, 에이전트의 답변, 1,000자로 자른 도구 호출, 각 도구 결과의 마지막 2,000자. 추론과 되돌린 단계 제외. 최대 약 60,000자, 가장 최근 부분), `git status --short`, 테스트 출력의 끝부분을 **목표 확인**에서 고른 모델(기본값: 채팅 자체의 모델)에 도구 없는 요청 한 번으로 보냅니다. 도구 출력에는 에이전트가 읽은 내용이 들어 있을 수 있으므로, 채팅 자체와 마찬가지로 이 요청에 파일의 일부가 들어갈 수 있습니다. 채팅과 프로젝트에는 아무것도 쓰지 않습니다. 직접 정한 테스트 명령, 제한, 마지막 결과(출력의 끝부분 포함), 고른 모델은 `$DSH_HOME/storages/dsh-composer-plus/goal-check.json`(소유자 전용 파일, 최신 채팅 500개)에 보관됩니다.
|
|
138
154
|
|
|
139
155
|
## 문제 해결
|
|
140
156
|
|
|
@@ -149,7 +165,11 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
149
165
|
- **삭제할 때 다른 dsh가 이 채팅을 열고 있다고 표시됨:** 같은 dsh 홈을 쓰는 두 번째 dsh가 채팅 잠금을 잡고 있습니다. 그 창이나 dsh를 닫은 뒤 다시 삭제하세요. 그동안 채팅은 보관된 상태로 남습니다.
|
|
150
166
|
- **"Tailscale only"를 켠 뒤 iPhone이 연결되지 않음:** Mac과 iPhone 모두에서 Tailscale이 켜져 있어야 합니다. Mac에서 꺼져 있으면 모바일 연결 패널에 경고가 표시됩니다. 액세스 로그에서 거부된 각 시도와 그 이유를 볼 수 있습니다.
|
|
151
167
|
- **재시작 후 채팅이 이어지지 않음:** dsh를 종료할 때 재시작 후 이어서 실행이 꺼져 있었거나, 그 턴을 직접 중지했거나, 턴이 이미 끝났거나(완료 또는 실패), 채팅이 보관되었거나, 실행 중인 채팅이 20개보다 많았습니다(가장 최근 채팅 20개만 이어짐).
|
|
152
|
-
-
|
|
168
|
+
- **GitHub 이슈 열기에 "gh could not open the issue"가 표시됨:** 이 메시지는 `gh` 자체 출력의 첫 줄입니다. 터미널에서 `gh auth status`를 실행하고 `gh auth login`으로 로그인하세요. 채팅 폴더에 GitHub 원격 저장소가 있어야 합니다(`git remote -v`). "not installed or not on the PATH of dsh"는 dsh가 `gh`를 찾지 못했다는 뜻입니다. 설치하거나, `gh`가 작동하는 터미널에서 dsh를 시작하세요.
|
|
169
|
+
- **채팅 행에 브랜치 배지가 없음:** 이 버전을 설치한 뒤 그 채팅에 턴이 없었거나, 폴더가 git 저장소가 아니거나, **채팅 행의 Git 브랜치**가 꺼져 있습니다. 업데이트한 뒤에는 dsh를 다시 시작하세요(브랜치는 Host 쪽이 기록합니다).
|
|
170
|
+
- **목표 확인에 테스트가 종료 코드 127 또는 "not found"로 끝났다고 표시됨:** Finder나 Dock에서 시작한 dsh는 터미널보다 PATH가 짧을 수 있어서 `npm`, `pnpm`, `cargo`를 찾지 못합니다. 터미널에서 dsh를 시작하거나, **목표 확인** → **편집**에서 전체 경로를 쓴 테스트 명령을 직접 정하세요. **지금 실행**을 누르면 결과가 바로 표시됩니다.
|
|
171
|
+
- **목표가 닫히지 않고 에이전트가 계속 작업함:** **목표 확인**이 실패한 테스트나 남은 작업을 찾았습니다. 목표 아래의 행에 이유가 표시됩니다(자세한 내용은 결과에 포인터를 올려 보세요). 원인이나 테스트 명령을 고치거나, `/goal` 또는 목표 바로 목표를 직접 완료하세요(이 완료는 확인하지 않습니다).
|
|
172
|
+
- **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.15.0`). 위의 설치 안내를 참고하세요.
|
|
153
173
|
|
|
154
174
|
## 제한 사항
|
|
155
175
|
|
|
@@ -173,14 +193,20 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
173
193
|
- **대기 중인 메시지 제자리 편집**은 dsh 자체의 대기열 편집기를 열므로 그 제한도 따릅니다. 이미지나 파일이 있는 메시지는 편집할 수 없고, 그사이 전송이 시작된 메시지는 바뀌지 않습니다(dsh가 자체 오류를 표시합니다).
|
|
174
194
|
- **다시 실행**은 되돌린 채팅을 절대 바꾸지 않습니다. 되돌리기 직전 시점부터 새 채팅을 시작하므로(dsh 자체 포크, 같은 모델 컨텍스트), 새 채팅은 새 ID와 제목을 가집니다. 채팅의 가장 최근 되돌리기만, 한 번만, 그리고 그 뒤에 아무것도 없을 때만 다시 실행할 수 있습니다(새 메시지를 보내면 이 선택지가 사라집니다). 되돌린 뒤 내가 바꾼 파일은 덮어쓰기 상자를 체크하지 않는 한 유지됩니다. 다시 실행에는 되돌리기가 보관한 스냅샷이 필요합니다(같은 50개 범위). 이 버전 이전에 한 되돌리기나 **채팅만**으로 한 되돌리기는 메시지만 다시 가져옵니다.
|
|
175
195
|
- **이 채팅**은 dsh의 파일 도구(`write`, `edit`, `str_replace_editor`)가 쓴 파일만 셉니다. 명령(`bash`)이 바꾼 파일은 이 보기에 없고, **커밋 안 됨**에 표시됩니다. 채팅의 턴 되돌리기 스냅샷이 없으면(턴 되돌리기 꺼짐, dsh-rewind-plugin 설치됨, 또는 플러그인보다 오래된 채팅) 보기는 마지막 커밋과 비교하고 그렇다고 알려 줍니다. 턴 되돌리기는 채팅마다 최신 스냅샷 50개를 보관합니다. 더 긴 채팅에서는 보기가 보관된 가장 오래된 스냅샷과 비교하고, 어느 메시지부터인지 알려 주며, 그 이전의 변경은 세지 않습니다. **공백 변경 숨기기**는 `git diff -w`입니다. 줄 안의 공백만 바뀐 줄도 숨겨집니다.
|
|
196
|
+
- **GitHub 이슈 열기**에는 dsh의 PATH에 있는 GitHub CLI(`gh`)와 채팅 폴더의 GitHub 원격 저장소가 필요합니다. 최대 60초 동안 실행됩니다. `gh`가 더 오래 걸리면, 이슈가 GitHub에는 만들어졌지만 목록에는 링크가 없을 수 있습니다(다시 클릭하기 전에 GitHub를 확인하세요. 목록은 끝난 실행에서만 링크를 읽으므로, 다시 클릭하면 두 번째 이슈가 열릴 수 있습니다). GitHub 원격 저장소가 둘 이상인 폴더는 `gh` 자체의 기본값(`gh repo set-default`)을 씁니다.
|
|
197
|
+
- **이 파일을 변경한 채팅**은 **이 채팅**처럼 dsh의 파일 도구(`write`, `edit`, `str_replace_editor`)만 압니다. 명령(`bash`)으로 만든 변경은 목록에 나오지 않습니다. 저장소의 최신 채팅 300개(만든 시점 기준)를 읽고, 더 있으면 그렇다고 알려 줍니다. 최대 100행을 보여 줍니다. 이름이 바뀐 파일은 도구가 쓴 이름으로 표시됩니다. 폴더가 저장소 밖에 있는 채팅(같은 파일로 가는 다른 경로를 통한 경우도 포함)은 세지 않습니다. dsh를 시작한 뒤 처음 열 때는 저장소의 모든 채팅 로그를 읽습니다(채팅 275개에 약 4초). 그 뒤로 열 때는 그 이후에 바뀐 채팅만 읽습니다.
|
|
198
|
+
- **채팅 행의 Git 브랜치**는 현재 브랜치가 아니라, 마지막 턴이 시작되거나 끝날 때 채팅 폴더가 있던 브랜치를 보여 줍니다. 턴 밖에서 브랜치를 바꾸면 다음 턴 뒤에 표시됩니다. 이 버전 이전의 채팅에는 다음 턴까지 배지가 표시되지 않습니다. 배지는 dsh의 채팅 행 마크업 안에 들어갑니다(dsh에는 그곳에 슬롯이 없습니다). dsh 업데이트로 그 마크업이 바뀌면 배지가 표시되지 않습니다. 채팅 위의 프로젝트 행 이름이 브랜치와 같으면(예: “채팅별 브랜치” 폴더) 채팅 행에 배지가 표시되지 않지만, “하나의 목록”에서는 계속 표시됩니다.
|
|
199
|
+
- **채팅에서 찾기**는 페이지가 보여 주는 것만 검색합니다. 불러온 메시지와 답변이 대상이며(이전 것은 위로 스크롤하거나 **이전 기록 로드**를 클릭하세요), 닫힌 도구 단계와 도구 출력 안의 접힌 텍스트는 검색하지 않습니다. 일치 항목은 최대 2,000개까지 셉니다(그 뒤에는 "2000+"). 브라우저의 하이라이트 API를 씁니다(Chromium 105 이상, 데스크톱 앱에는 있습니다). 더 오래된 브라우저에서는 개수와 이동은 작동하지만 색은 표시되지 않습니다. Mac에서는 `Cmd+F`(Windows와 Linux에서는 `Ctrl+F`)가 화면에 채팅이 있을 때만 이것을 엽니다. 다른 곳에서는 브라우저 자체의 찾기가 전처럼 작동합니다. Mac에서 `Ctrl+F`는 텍스트 필드에서 macOS 기능(커서를 한 글자 앞으로 이동)을 그대로 유지합니다.
|
|
176
200
|
- 재시작 전에 보낸 알림을 클릭하면 dsh를 앞으로 가져오기만 합니다.
|
|
177
201
|
- 활성 프로젝트는 dsh에 저장되는 프로젝트 순서로 이동하므로, 새 순서는 재시작 후에도 유지됩니다. 어느 프로젝트에도 속하지 않은 채팅("그룹 없음")은 이동할 수 없습니다. dsh는 이 채팅을 항상 맨 마지막에 나열합니다.
|
|
178
202
|
- dsh의 사이드바 보기 옵션 메뉴에는 확장 지점이 없습니다. 그래서 최근 프로젝트 옵션은 dsh 자체 메뉴에 추가됩니다. dsh 업데이트로 이 메뉴가 바뀌면 옵션이 표시되지 않고 모든 프로젝트가 계속 보입니다. 필터는 프로젝트 행에 적용되므로 **하나의 목록**은 걸러지지 않습니다. **작업 공간**과 함께 쓰세요. **작업 공간 트리**에서는 숨겨진 상위 폴더가 그 안의 활성 프로젝트도 숨깁니다. **상태별**에도 같은 종류의 제한이 있습니다. dsh에는 정렬 슬롯이 없으므로, 항목과 행 순서가 dsh의 메뉴와 목록 마크업에 붙습니다.
|
|
179
203
|
- dsh에는 프로젝트 행 메뉴나 작업 공간 헤더 슬롯도 없습니다. **경로 복사**는 dsh의 행 마크업으로 프로젝트 행을 찾습니다. **모든 프로젝트 접기**는 dsh 헤더에 들어가서, 프로젝트 행을 클릭하는 것과 같은 방식으로 열린 프로젝트를 하나씩 닫습니다. dsh 업데이트로 이 마크업이 바뀌면 오른쪽 클릭 시 브라우저 메뉴가 나오고 버튼은 표시되지 않습니다.
|
|
180
204
|
- dsh에는 새 채팅의 프로젝트 메뉴에도 확장 지점이 없습니다. 그래서 **프로젝트 검색** 상자와 A–Z 순서는 dsh의 메뉴 마크업에 붙습니다. dsh 업데이트로 이 마크업이 바뀌면 메뉴는 dsh가 그리는 그대로 표시됩니다. 즉, 저장된 순서로 표시되고 검색 상자는 없습니다. A–Z 순서는 보기일 뿐이며, dsh에 저장된 프로젝트 순서를 바꾸지 않습니다.
|
|
205
|
+
- dsh에는 **새 세션**를 열 위치를 고르는 확장 지점도 없습니다. **새 세션의 기본 작업 공간**은 공개 API가 아닌 dsh 메서드(dsh 작업 공간 서비스의 `startSession`)를 감쌉니다. dsh 업데이트로 이 이름이 바뀌면 **새 세션**는 dsh가 고른 위치(열린 프로젝트 또는 최근 프로젝트)에서 열립니다. 프로젝트를 지정하지 않는 모든 호출이 기본값을 사용합니다: 사이드바 버튼, 그 단축키, 로고, 그리고 **자동화 작업** 페이지의 **새로 만들기**도 마찬가지입니다. dsh는 시작할 때 여전히 마지막 채팅을 엽니다. 일반 폴더는 처음 사용할 때 만들어지고 프로젝트에 추가됩니다. Windows나 Linux에서 Documents 폴더를 옮겼다면 dsh 자체 폴더와 다른 폴더일 수 있습니다.
|
|
181
206
|
- dsh에는 입력란 힌트를 위한 확장 지점도 없습니다. 그래서 **다음 메시지 예측** 텍스트는 dsh 자체의 플레이스홀더(`[data-composer-placeholder]`) 위에 겹쳐 표시됩니다. dsh 업데이트로 이 마크업이 바뀌면 예측이 표시되지 않습니다. 켜져 있는 동안에는 턴이 끝날 때마다 짧은 모델 호출이 한 번 일어납니다.
|
|
182
207
|
- **입력 중 자동 완성**은 dsh 자체의 입력란 힌트(dsh가 슬래시 명령의 인수 힌트에 쓰는 `--dsh-composer-hint` 스타일)로 텍스트를 표시합니다. 슬래시 명령, 파일 칩이나 기호 칩이 있는 메시지, 커서가 메시지 끝에 있지 않을 때는 실행되지 않습니다. dsh 업데이트로 이 스타일이 바뀌면 완성 텍스트가 표시되지 않습니다. 입력을 멈출 때마다 모델 호출이 한 번 일어납니다.
|
|
183
208
|
- **프롬프트 개선**은 짧은 프로젝트 요약, 변경된 경로, 이름이 입력한 단어와 일치하는 경로만 보며, 코드 자체는 보지 않습니다. 그래서 맞는 파일을 놓칠 수 있고, 전달받은 경로만 언급합니다. 보내기 전에 새 텍스트를 읽어 보세요. 슬래시 명령이나 파일 칩이나 기호 칩이 있는 메시지에서는 실행되지 않습니다(새 텍스트는 일반 텍스트라서 칩이 사라지기 때문입니다). 메시지는 최대 8,000자까지 가능합니다. 이미지는 그대로 첨부되어 있고, 텍스트만 바뀝니다. 클릭할 때마다 모델 호출이 한 번 일어나며, 성능이 높은 모델은 1분쯤 걸릴 수 있습니다(`Esc`로 취소).
|
|
209
|
+
- **목표 확인**은 에이전트가 자동 목표 라운드에서 한 완료만 확인합니다. 채팅에서 사용자가 요청한 완료, `/goal`, 목표 바는 확인하지 않습니다. 에이전트는 테스트나 테스트 명령의 파일을 스스로 바꿀 수 있습니다. 검증 모델은 채팅을 읽으므로 이를 알아챌 수 있지만, 양쪽 방향으로 틀릴 수 있습니다(잘못된 "완료되지 않음"은 라운드를 한 번 더 쓰고, 잘못된 "완료"는 목표를 닫습니다). 검증 모델은 채팅과 `git status`를 보며, 코드 자체는 보지 않습니다. 테스트 실행은 파일을 바꿀 수 있는 에이전트의 최신 단계가 같은 폴더에서 정확히 같은 명령을 성공적으로 실행한 에이전트 자신의 `bash` 실행일 때만 재사용합니다. 파이프(`| tail`)나 `&&`가 있는 명령은 재사용하지 않습니다. 예산은 턴이 끝날 때 측정하므로, 한 턴이 예산을 넘을 수 있습니다. 채팅 자체의 모델 호출만 셉니다(하위 에이전트의 호출은 세지 않음). 확인이 실행되는 동안 `update_goal`은 기다립니다(테스트는 최대 15분, 검증은 최대 3분). 포크한 채팅은 새 채팅 ID를 받으므로, 부모 채팅 자체의 테스트 명령과 제한 없이 시작합니다. 검증까지 간 완료마다 모델 호출이 한 번 일어납니다.
|
|
184
210
|
- 기본 지원은 업스트림에 요청해 두었습니다: 대기열 `move`는 [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773), 계속 상태는 [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269).
|
|
185
211
|
|
|
186
212
|
## 자주 묻는 질문
|
|
@@ -207,6 +233,8 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
207
233
|
|
|
208
234
|
**Roo Code나 Augment의 Enhance prompt 버튼처럼, 보내기 전에 dsh가 프롬프트를 개선할 수 있나요?** 네, **프롬프트 개선**(기본적으로 켜짐)으로 가능합니다. 대략적인 요청을 입력하고 모델 메뉴 옆의 요술봉을 클릭하세요. 이 채팅과 프로젝트를 컨텍스트로 삼아 사용 언어 그대로 텍스트를 다시 쓰며, 보내지는 않습니다. `Cmd/Ctrl+Z` 또는 **개선 실행 취소**로 원래 텍스트를 되돌립니다. 모델은 **설정 → Composer Plus → 프롬프트 개선 → 모델**에서 고르세요.
|
|
209
235
|
|
|
236
|
+
**loop engineering의 검증 루프처럼, 에이전트가 자기 작업을 스스로 완료로 표시하지 못하게 할 수 있나요?** 네, **목표 확인**(기본적으로 켜짐)으로 가능합니다. `/goal`로 목표를 시작하세요. 에이전트가 목표를 완료했다고 하면 프로젝트의 테스트가 실행되고, 독립적인 모델 호출이 채팅과 비교해 목표를 확인합니다. 둘 중 하나라도 실패하면 목표는 열린 상태로 남고 에이전트가 이유를 읽습니다. 목표 아래의 **목표 확인** 행에 있는 **편집**으로 직접 테스트 명령, 시간 제한, 토큰 제한을 정하세요.
|
|
237
|
+
|
|
210
238
|
**dsh에서 대기 중인 메시지의 순서를 바꾸려면 어떻게 하나요?** 대기 중인 메시지의 ⠿ 핸들을 끌거나, 핸들에 포커스를 두고 `↑` / `↓`를 누르세요.
|
|
211
239
|
|
|
212
240
|
**대기 중인 메시지의 오타를 고치려면 어떻게 하나요?** 대기열에서 메시지를 두 번 클릭하고, 텍스트를 고친 뒤 `Enter`를 누르세요(`Esc`는 취소). 메시지는 대기열에서 제자리를 유지합니다.
|
|
@@ -217,6 +245,10 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
217
245
|
|
|
218
246
|
**실수로 턴을 되돌렸습니다. 다시 살릴 수 있나요?** 네. 되돌린 직후 입력란 위의 **다시 실행**을 쓰세요. 되돌리기 직전 시점부터 같은 메시지로 새 채팅을 시작하고, **채팅과 파일**로 되돌렸다면 파일도 다시 돌려놓습니다.
|
|
219
247
|
|
|
248
|
+
**어떤 채팅이 이 파일을 변경했나요?** 오른쪽 사이드바 → **변경 사항** → 파일의 **…** → **이 파일을 변경한 채팅**. 행을 클릭하면 변경을 만든 요청 위치에서 그 채팅이 열립니다.
|
|
249
|
+
|
|
250
|
+
**긴 채팅 하나 안에서 검색할 수 있나요?** 네. 채팅에서 Mac에서는 `Cmd+F`(Windows와 Linux에서는 `Ctrl+F`)를 누르세요. **채팅에서 찾기**가 모든 일치 항목을 강조 표시하고, `Enter`와 `Shift+Enter`로 그 사이를 이동합니다.
|
|
251
|
+
|
|
220
252
|
**한 채팅이 바꾼 파일만 보려면 어떻게 하나요?** 오른쪽 사이드바 → **변경 사항** → **이 채팅**. 공백만 바뀐 변경을 숨기려면 **␣**를 클릭하세요.
|
|
221
253
|
|
|
222
254
|
**한 채팅에서 자동 검토가 같은 도구를 계속 묻지 않게 하려면 어떻게 하나요?** 승인 카드에서 **이 채팅에서 허용**을 클릭하세요. 이 허용은 그 채팅의 그 도구에만 적용되며, 기본값은 1시간입니다. 헤더 칩에서 취소할 수 있습니다. 시간은 **설정 → Composer Plus → 이 채팅에서 허용**에서 바꿉니다.
|
|
@@ -237,6 +269,12 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
237
269
|
|
|
238
270
|
**iPhone에서 dsh를 쓰려면 어떻게 하나요?** `tether/ios`에서 Tether 앱을 빌드하세요(Xcode). **설정 → Composer Plus → 모바일 연결(iPhone)**을 켜고, 왼쪽 아래의 **모바일 연결**을 클릭하세요. QR 코드를 스캔하고(iPhone 카메라 또는 Tether의 **Scan code**), **Connect**를 탭한 뒤 **Approve**를 클릭하세요. 집 밖에서는 두 기기 모두에서 Tailscale을 쓰세요.
|
|
239
271
|
|
|
272
|
+
**새 세션를 항상 같은 프로젝트에서 열려면 어떻게 하나요?** 설정 → Composer Plus → **새 세션의 기본 작업 공간** → **새 세션을 열 위치** → 프로젝트를 선택합니다. 다른 프로젝트 옆의 `+`는 계속 그 프로젝트를 엽니다.
|
|
273
|
+
|
|
274
|
+
**한 프로젝트의 여러 기능을 각각 자기 브랜치에서 동시에 진행하려면 어떻게 하나요?** **채팅별 브랜치**를 쓰세요. 새 채팅 → 브랜치 아이콘이 있는 main 버튼 → **새 브랜치**를 고른 뒤 첫 메시지를 보내세요. 채팅마다 자체 브랜치와 worktree 폴더가 생기고, `.worktreeinclude`에 나열되어 있으면 `.env`와 `node_modules`도 함께 복사됩니다. 채팅 헤더에 현재 브랜치가 표시됩니다.
|
|
275
|
+
|
|
276
|
+
**iPhone에서 사진을 보낼 수 있나요?** 네. Tether 채팅에서 메시지 입력란 옆의 **+** → Camera, Photos(최대 4장) 또는 Paste image를 탭하세요. 사진은 메시지의 첨부 파일로 Mac의 채팅에 전달되므로 모델이 볼 수 있습니다.
|
|
277
|
+
|
|
240
278
|
**데스크톱 앱에서도 작동하나요?** 네. 설정 → 플러그인 → **플러그인 추가** → `dsh-composer-plus`. dsh 0.2.0-rc.2(데스크톱과 웹)와 0.2.1-rc.2(웹)에서 테스트했습니다.
|
|
241
279
|
|
|
242
280
|
## 개발
|
|
@@ -273,6 +311,22 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path
|
|
|
273
311
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
|
|
274
312
|
# Improve prompt (fake model, made-up git project): the wand sends the draft with the chat and the project, the answer replaces the draft, Cmd+Z and Undo bring it back + its thumbnail
|
|
275
313
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path/to/dsh/lib/bin.js
|
|
314
|
+
# Goal check (fake model, made-up project): a failing test and a verifier "not done" keep the goal open, the agent's own test run is reused, a pass closes it, a token budget blocks it + its thumbnail
|
|
315
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-goal-check.mjs /path/to/dsh/lib/bin.js
|
|
316
|
+
# Mark all as read, Copy message link, Edit queued message in place, Redo, Changes → This chat and Hide whitespace (fake model, made-up git projects) + their thumbnails
|
|
317
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-six-features.mjs /path/to/dsh/lib/bin.js
|
|
318
|
+
# Changes Tree (fake model, made-up git history): branch list, a branch's commits, commit files and diffs, back marks the row + its thumbnail
|
|
319
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-changes-tree.mjs /path/to/dsh/lib/bin.js
|
|
320
|
+
# Allow for this chat with a time limit (fake model that is also the Auto Review reviewer): the grant ends after 1 hour
|
|
321
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-grant-ttl.mjs /path/to/dsh/lib/bin.js
|
|
322
|
+
# Next message prediction and Complete while typing (fake models): calls, Tab, Esc, model choice + their thumbnails
|
|
323
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-predict.mjs /path/to/dsh/lib/bin.js
|
|
324
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-complete.mjs /path/to/dsh/lib/bin.js
|
|
325
|
+
# Project search in a new chat: A–Z order, filter, Enter + its thumbnail
|
|
326
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-project-picker.mjs /path/to/dsh/lib/bin.js
|
|
327
|
+
# Queue drag-and-drop and Continue with a queued message (slow fake model)
|
|
328
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-queue-drag.mjs /path/to/dsh/lib/bin.js
|
|
329
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh/lib/bin.js
|
|
276
330
|
```
|
|
277
331
|
|
|
278
332
|
```sh
|
|
@@ -283,7 +337,7 @@ npm test
|
|
|
283
337
|
|
|
284
338
|
**새 기능 규칙:** 설정 → Composer Plus의 모든 기능 행에는 스크린샷이 표시됩니다. 기능 ID를 `client.js`의 `SHOT_OF`와 `index.js`의 `SHOTS`에 추가하세요. 그리고 `assets/features/<id>.webp`를 함께 배포하세요(일회용 데모 dsh에서 영어 UI로 찍은 약 60 kB 이하 이미지). 같은 이미지로 기능을 `docs/features.json`에 추가하고 `npm run build:readme`를 실행하세요. 이 명령이 `README.md`와 번역된 각 `README.<id>.md`의 기능 표, 그리고 `llms.txt`의 목록을 씁니다. 기능에 스크린샷이 없으면 `test/shots.test.mjs`가 실패합니다. `test/browser-settings-shots.mjs`는 실제 설정 페이지를 확인합니다. 모든 변경에 대한 전체 체크리스트는 [AGENTS.md](AGENTS.md)에 있습니다.
|
|
285
339
|
|
|
286
|
-
테스트는 실제 `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`을 대상으로 실행됩니다.
|
|
340
|
+
테스트는 실제 `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) 참고). 각 Host 경로와 그 요청, Tether가 그 경로를 호출할 수 있는지는 [docs/ROUTES.md](docs/ROUTES.md)에 정리되어 있습니다. `node test/browser-history.mjs '<dsh web URL with ?token=…>'`는 실제 브라우저에서 입력 기록을 확인합니다. 이 확인은 자체 `DSH_HOME`을 쓰는 일회용 `dsh web`을 대상으로 실행됩니다.
|
|
287
341
|
|
|
288
342
|
언어 팩은 `locales/<id>.json`에 있는 데이터 전용 JSON입니다. `npm run build:locales`가 이 파일들을 단일 클라이언트 엔트리에 포함합니다(번역 서비스나 런타임 다운로드 없음). `npm test`는 모든 팩에서 전체 키 포함 여부, 자리 표시자와 줄바꿈 일치, 시스템 언어/직접 선택 동작을 확인합니다. 로컬에 설치한 Playwright로 격리된 실제 앱을 확인하려면:
|
|
289
343
|
|