dsh-composer-plus 1.16.1 → 1.18.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 +43 -14
- package/README.es.md +43 -14
- package/README.fr.md +43 -14
- package/README.hi.md +43 -14
- package/README.id.md +43 -14
- package/README.ja.md +43 -14
- package/README.ko.md +43 -14
- package/README.md +43 -14
- package/README.pt-BR.md +43 -14
- package/README.ru.md +43 -14
- package/README.tr.md +43 -14
- package/README.vi.md +43 -14
- package/README.zh.md +43 -14
- package/assets/features/blockedCommands.webp +0 -0
- package/assets/features/contextBreakdown.webp +0 -0
- package/assets/features/handoffChat.webp +0 -0
- package/assets/features/headerFit.webp +0 -0
- package/assets/features/plannedSteps.webp +0 -0
- package/assets/features/projectMemory.webp +0 -0
- package/assets/features/protectedFiles.webp +0 -0
- package/assets/features/taskBoard.webp +0 -0
- package/client.js +1569 -50
- package/index.js +1766 -41
- package/package.json +2 -2
- package/tether/gateway/server.mjs +2 -1
package/README.ko.md
CHANGED
|
@@ -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.18.0`.
|
|
33
33
|
|
|
34
34
|
## 기능
|
|
35
35
|
|
|
@@ -47,6 +47,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
47
47
|
| **Shift+Tab 계획 모드** | <a id="feature-plantoggle"></a>`Shift+Tab`은 초안 맨 앞에 `/plan `을 붙입니다(다시 누르면 제거). 채팅이 이미 계획 모드이면 `Shift+Tab`으로 계획 모드를 종료합니다. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="스크린샷: Shift+Tab 계획 모드"></a> |
|
|
48
48
|
| **입력란 포커스 유지** | <a id="feature-keepfocus"></a>`/` 명령이나 스킬을 보낸 뒤에도 커서가 입력란에 남아 바로 다시 입력할 수 있습니다. 명령을 입력하고 `Enter`를 누르는 키보드 매크로에서도 작동합니다. dsh는 명령을 처리하는 동안 입력란을 읽기 전용으로 만들고, 그때 브라우저가 포커스를 해제합니다. 이 기능은 포커스를 입력란으로 돌려놓습니다. 단, 메뉴, 대화 상자, 다른 입력 필드에 포커스가 있으면 돌려놓지 않습니다. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="스크린샷: 입력란 포커스 유지"></a> |
|
|
49
49
|
| **질문 카드를 창에 맞추기** | <a id="feature-questionfit"></a>에이전트가 질문하면 질문과 답변이 카드 안에서 함께 스크롤되고, **건너뛰기**와 **제출**은 아래쪽에 계속 보입니다. 카드는 창 높이(채팅 헤더와 채팅 일부를 위해 200 px를 뺀 높이)를 사용하므로 창에 따라 커지고 작아집니다. 이 기능이 없으면 dsh는 카드를 창의 60%(최대 520 px)로 제한하고 답변만 스크롤합니다. 질문이 길면 질문의 끝, 답변, 버튼이 카드 밖으로 밀려날 수 있습니다. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="스크린샷: 질문 카드를 창에 맞추기"></a> |
|
|
50
|
+
| **채팅 헤더를 창에 맞추기** | <a id="feature-headerfit"></a>좁은 창에서 dsh 채팅 헤더의 버튼(모드, 서브에이전트, 백그라운드 작업, 다음에서 열기, 브랜치 표시, 허용 표시)이 더 이상 서로 겹치지 않습니다. 채팅 제목은 최소 120 px를 유지하고, 들어가지 않는 버튼은 오른쪽의 두 번째 줄로 이동하며 모두 클릭할 수 있습니다. 모든 것이 한 줄에 들어가면(넓은 창) 헤더는 dsh의 것과 똑같습니다. 이 기능이 없으면 dsh는 제목만 줄입니다. 서브에이전트와 백그라운드 작업이 있으면 좁은 채팅 열에서 버튼이 서로 겹칩니다. 브랜치 표시(**채팅별 브랜치**)와 허용 표시(**이 채팅에서 허용**)는 이 스위치가 꺼져 있어도 헤더에 맞춰집니다. | <a href="assets/features/headerFit.webp"><img src="assets/features/headerFit.webp" width="160" alt="스크린샷: 채팅 헤더를 창에 맞추기"></a> |
|
|
50
51
|
| **원클릭 계속** | <a id="feature-continuebutton"></a>턴이 중지되거나, 실패하거나, 중간에 끊긴 뒤에는 빈 입력란에 **▶**가 표시됩니다. 한 번 클릭하면 입력란에 아무것도 쓰지 않고, 보이는 채팅 메시지도 추가하지 않은 채 기존 대화를 이어 갑니다(모델은 “멈춘 곳에서 계속하라”는 짧은 숨은 메모를 받습니다. Claude 같은 일부 제공자는 어시스턴트 답변으로 끝나는 요청을 거부하기 때문입니다). 대기열의 메시지는 그대로 남습니다. ▶는 중지된 작업만 이어 가고, 그다음에 대기열이 실행됩니다. 완료된 턴 뒤에는 일반 보내기 버튼이 그대로 있습니다. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="스크린샷: 원클릭 계속"></a> |
|
|
51
52
|
| **재시작 후 이어서 실행** | <a id="feature-resumeafterrestart"></a>기본적으로 꺼져 있습니다. **설정 → 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> |
|
|
52
53
|
| **대기열 끌어서 놓기** | <a id="feature-queuereorder"></a>대기 중인 메시지에 핸들(⠿)이 생깁니다. 끌어서 순서를 바꾸거나, 핸들에 포커스를 두고 `↑` / `↓`를 누르세요. `Esc`는 이동을 취소합니다. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="스크린샷: 대기열 끌어서 놓기"></a> |
|
|
@@ -63,19 +64,25 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
63
64
|
| **작업 공간 트리의 브랜치** | <a id="feature-branchtree"></a>설정 → Composer Plus → **작업 공간 트리의 브랜치**(기본값은 꺼짐). 켜면 `<project>/.worktrees/`에 worktree 폴더가 있는 각 브랜치가 해당 프로젝트 안의 프로젝트로 표시됩니다. 중첩해서 보려면 dsh의 **보기 옵션** → **작업 공간 트리**를 선택하세요. 폴더가 삭제된 브랜치는 목록에서 사라지고, dsh는 그 채팅을 **그룹 없음** 아래에 표시합니다. 프로젝트 폴더에 있는 채팅의 에이전트가 브랜치를 만들고 그 브랜치로 전환하면(`git switch -c`, `git checkout -b`), 폴더에 커밋되지 않은 변경이 없을 때 프로젝트 폴더는 이전 브랜치로 돌아가고, 브랜치는 자체 폴더를 받으며, 채팅은 그곳으로 이동합니다. 복사본이 브랜치 프로젝트에서 열려 작업을 계속하고, 이전 채팅은 보관됩니다. 목록은 시작할 때, 30초마다, 각 턴이 끝난 뒤, 창으로 돌아올 때 확인됩니다. | <a href="assets/features/branchTree.webp"><img src="assets/features/branchTree.webp" width="160" alt="스크린샷: 작업 공간 트리의 브랜치"></a> |
|
|
64
65
|
| **다음 메시지 예측** | <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> |
|
|
65
66
|
| **입력 중 자동 완성** | <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> |
|
|
66
|
-
| **프롬프트 개선** | <a id="feature-promptimprove"></a>대략적인 요청을 입력한 뒤 모델 메뉴 옆의 요술봉(**프롬프트 개선**)을 클릭하세요. 모델 호출 한 번으로 요청을 더 명확한 프롬프트로 다시 씁니다. 목표를 먼저 쓰고, 여러 부분이 있으면 짧은 번호 단계로 나누고, 실행할 검사를 적습니다. 이 채팅(되돌린 메시지 제외), 프로젝트의 README, AGENTS.md, 매니페스트, 변경된 파일, 이름이 입력한 단어와 일치하는 파일을 읽고, 사용 언어를 유지합니다. 파일 이름을 지어내지 않습니다. 새 텍스트가 초안을 대신하지만 보내지는 않습니다. 읽고 고친 뒤 `Enter`를 누르세요. `Cmd/Ctrl+Z`를 누르면 한 번에 원래 텍스트로 돌아오며, 버튼(**개선 실행 취소**)도 같습니다. 작업 중에 입력하면 새로 입력한 텍스트가 유지됩니다. `Esc`를 누르거나 한 번 더 클릭하면 취소됩니다. 설정에 전용 **모델** 메뉴가 있습니다(기본값: **채팅의 모델과 같음**). 슬래시
|
|
67
|
-
| **목표 확인** | <a id="feature-goalcheck"></a>`/goal`로 목표를 시작하세요. 에이전트가 자동 라운드에서 목표를 완료로 표시하면, 목표는 두 가지 확인을 통과해야만 닫힙니다. 먼저 프로젝트의 테스트 명령이 채팅 폴더에서 채팅의 샌드박스 모드로 실행됩니다. 명령은 직접 정한 명령이거나 `package.json`, `Makefile`, `Cargo.toml`, `go.mod` 또는 pytest에서 찾은 명령입니다. 에이전트 자신의 최신 단계가 그 테스트의 성공한 실행이었다면 다시 실행하지 않습니다. 그다음 도구가 없는 독립적인 모델 호출 한 번이 목표, 이 채팅, `git status`, 테스트 결과를 읽습니다. 확인에 실패하면 목표는 진행 중으로 남고, 에이전트가
|
|
68
|
-
|
|
|
67
|
+
| **프롬프트 개선** | <a id="feature-promptimprove"></a>대략적인 요청을 입력한 뒤 모델 메뉴 옆의 요술봉(**프롬프트 개선**)을 클릭하세요. 모델 호출 한 번으로 요청을 더 명확한 프롬프트로 다시 씁니다. 목표를 먼저 쓰고, 여러 부분이 있으면 짧은 번호 단계로 나누고, 실행할 검사를 적습니다. 이 채팅(되돌린 메시지 제외), 프로젝트의 README, AGENTS.md, 매니페스트, 변경된 파일, 이름이 입력한 단어와 일치하는 파일을 읽고, 사용 언어를 유지합니다. 파일 이름을 지어내지 않습니다. 새 텍스트가 초안을 대신하지만 보내지는 않습니다. 읽고 고친 뒤 `Enter`를 누르세요. `Cmd/Ctrl+Z`를 누르면 한 번에 원래 텍스트로 돌아오며, 버튼(**개선 실행 취소**)도 같습니다. 작업 중에 입력하면 새로 입력한 텍스트가 유지됩니다. `Esc`를 누르거나 한 번 더 클릭하면 취소됩니다. 설정에 전용 **모델** 메뉴가 있습니다(기본값: **채팅의 모델과 같음**). `/goal <objective>` 메시지에서는 목표만 **목표 확인**이 검증할 수 있는 완료 조건으로 다시 씁니다. 산출물, 통과해야 하는 검사, 채팅에 보여 줄 증거, 할 수 없는 부분의 미해결 표시, 같은 장애가 계속될 때의 중지가 들어갑니다. `/goal` 명령은 그대로 남습니다. 다른 슬래시 명령, `/goal` 제어어(`clear`, `pause`, `resume`), 파일 칩이 있는 메시지에는 쓸 수 없습니다. Tether에서는 요술봉이 입력란 옆에 있습니다. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="스크린샷: 프롬프트 개선"></a> |
|
|
68
|
+
| **목표 확인** | <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> |
|
|
69
|
+
| **새 채팅에서 계속** | <a id="feature-handoffchat"></a>사이드바에서 채팅을 마우스 오른쪽 버튼으로 클릭(또는 채팅의 **…** 메뉴 열기) → **새 채팅에서 계속…**. 채팅 자체의 모델을 한 번 호출해, 채팅에 보이는 내용으로 인계 메모를 씁니다. 항목은 작업, 산출물, 완료한 일, 결정 사항, 미해결 문제, 다음 작업입니다(도구 호출과 그 결과가 증거이며, 되돌린 단계는 빠집니다). 메모는 대화 상자에 열립니다. 읽고 편집하세요. **다시 쓰기**는 새 메모를 씁니다. **새 채팅 시작**(또는 `Cmd/Ctrl+Enter`)은 같은 프로젝트에서 새 채팅을 열고, 메모와 이전 채팅 링크를 첫 메시지로 보냅니다. 이전 채팅은 그대로 남습니다. 긴 채팅이 가득 차거나 느려졌을 때, 또는 다음 날 이어서 할 때 쓰세요. 프로젝트에는 아무것도 쓰지 않습니다. | <a href="assets/features/handoffChat.webp"><img src="assets/features/handoffChat.webp" width="160" alt="스크린샷: 새 채팅에서 계속"></a> |
|
|
70
|
+
| **컨텍스트 구성** | <a id="feature-contextbreakdown"></a>오른쪽 사이드바 → `+` → **컨텍스트**. 페이지는 열린 채팅의 모델 컨텍스트를 지금 무엇이 채우고 있는지, 그리고 컨텍스트 창을 얼마나 쓰는지 보여 줍니다. 시스템 프롬프트, 프로젝트 지침(AGENTS.md), 스킬, 내 메시지, 에이전트 답변과 도구 호출, 도구 결과(도구별), MCP 결과(서버별), 도구 정의, 압축 요약, 기타 컨텍스트 메모를 각각의 토큰 수와 비율과 함께 보여 줍니다. 항목을 클릭하면 그 도구나 서버를 볼 수 있습니다. 채팅 로그만 읽으며(`/compact`와 되돌리기 이후), 모델을 호출하지 않습니다. 각 턴이 끝난 뒤와 **새로 고침**을 누르면 다시 읽습니다. 채팅이 느리거나 가득 찬 이유를 볼 때 쓰세요. 예를 들어 큰 MCP 도구 결과나 많은 도구 정의가 원인일 수 있습니다. | <a href="assets/features/contextBreakdown.webp"><img src="assets/features/contextBreakdown.webp" width="160" alt="스크린샷: 컨텍스트 구성"></a> |
|
|
71
|
+
| **계획된 단계** | <a id="feature-plannedsteps"></a>기본적으로 꺼져 있습니다. **설정 → Composer Plus**에서 켜세요. 에이전트는 `plan_next_steps` 도구를 받습니다. 명령과 같은 메시지에서 다음 명령을 정확한 인수와 조건과 함께 계획할 수 있습니다(예: “빌드가 통과하면 `npm test` 실행”). 결과가 조건을 충족하면 Composer Plus가 새 모델 호출 없이 다음 단계를 직접 실행하므로 긴 채팅의 토큰 사용량이 줄어듭니다. 단계는 채팅에 “Composer Plus · Planned steps: ran `test` … without a model call”이라는 짧은 줄로 표시되고, 그 뒤에 도구 호출과 결과가 이어집니다. `bash`, `read`, `grep`, `glob` 단계만 해당되며 승인, 샌드박스, 보호된 파일은 각 단계에 평소처럼 적용됩니다. 조건이 맞지 않을 때, 두 단계가 동시에 준비될 때, 마지막 단계 뒤, 그리고 메시지를 보낼 때 모델이 다시 답합니다. 이 아이디어는 HarnessMM(arXiv 2610.32813)에서 왔습니다. | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="스크린샷: 계획된 단계"></a> |
|
|
72
|
+
| **보호된 파일** | <a id="feature-protectedfiles"></a>기본적으로 켜져 있습니다. 에이전트 자체의 파일 도구는 지정한 패턴과 일치하는 파일을 읽거나 바꿀 수 없습니다. **읽기와 쓰기** 패턴에서는 파일에 대한 `read`, `read_image`, `grep`이 거부되고, 두 종류 모두에서 `write`, `edit`, `str_replace_editor`가 거부됩니다. 에이전트는 이유를 읽고 사용자에게 물어보라는 안내를 받습니다. 기본 패턴은 `.env*`, `*.pem`, `*.key`입니다. 설정 → Composer Plus → **보호된 파일**: 패턴을 추가하고(예: `published/**` 또는 `config/*.yml`), 종류를 클릭해 **읽기와 쓰기**와 **쓰기만** 사이에서 전환하고, ✕로 삭제하거나 **기본값 사용**을 클릭하세요. `/`가 없는 패턴은 모든 폴더의 파일 이름과 일치합니다. 이것은 가드레일이며 샌드박스가 아닙니다. 셸 명령(`cat .env`), 스크립트, MCP 도구는 여전히 파일에 접근할 수 있습니다(제한 사항 참고). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="스크린샷: 보호된 파일"></a> |
|
|
73
|
+
| **차단된 명령** | <a id="feature-blockedcommands"></a>기본적으로 켜져 있으며, 목록은 비어 있습니다. 에이전트의 셸 명령(`bash`, `pwsh`)은 지정한 규칙과 일치하는 명령을 실행할 수 없습니다. **차단** 규칙은 호출을 거부하고(에이전트는 이유를 읽고 사용자에게 물어보라는 안내를 받습니다), **먼저 묻기** 규칙은 dsh의 승인 카드를 표시하며, 명령은 사용자가 허용할 때만 실행됩니다. 설정 → Composer Plus → **차단된 명령**: 규칙을 입력하고(예: `npm publish`, `git push --force` 또는 `ssh *192.168.2.19`), 종류를 클릭해 **차단**과 **먼저 묻기** 사이에서 전환한 뒤 **추가**를 클릭하세요. 규칙의 종류를 클릭하면 바꿀 수 있고, ✕로 삭제할 수 있습니다. 규칙은 명령 이름과 그 뒤에 이 순서로 와야 하는 단어입니다. `*`는 모든 텍스트와 일치합니다. `&&`, `;`, `\|` 뒤, `$(…)`, `bash -c "…"` 또는 `eval` 안, `sudo`나 `env` 뒤에 있는 명령도 찾습니다. 이것은 가드레일이며 샌드박스가 아닙니다. 변수(`$CMD`), 스크립트 파일, 다른 프로그램은 여전히 명령을 실행할 수 있습니다(제한 사항 참고). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="스크린샷: 차단된 명령"></a> |
|
|
74
|
+
| **작업 보드** | <a id="feature-taskboard"></a>왼쪽 사이드바 → **작업 보드**. 사용자와 에이전트가 함께 쓰는 dsh 프로젝트의 칸반 보드입니다. 열은 **할 일**, **진행 중**, **검토**, **완료**입니다(**백로그**도 있습니다. 아래 참고). 왼쪽에서 프로젝트나 **모든 프로젝트**를 고르세요. **새 작업**(또는 `n`)을 누르면 새 카드가 열립니다. 제목을 입력하고 `Enter`를 누르세요. 카드를 다른 열이나 두 카드 사이로 끌어다 놓을 수 있습니다. 카드를 클릭하면 **상태**, **태그**, **수동**(에이전트가 건너뜀), 설명(Markdown), 댓글을 보고 바꿀 수 있습니다. `/`는 모든 프로젝트를 검색하고, `h`는 수동 작업만 보여 주며, 내보내기 버튼은 보드를 Markdown이나 JSON으로 저장합니다. 에이전트는 보드 도구를 받습니다. 채팅에서 "보드에서 다음 작업을 가져와"라고 하면 에이전트가 **할 일**의 맨 위 카드를 **진행 중**으로 옮기고, 한 일을 댓글로 남긴 뒤 **검토**로 옮깁니다. **완료**로 옮기는 것은 사용자입니다. 열린 작업이 있는 프로젝트에서는 각 채팅이 이 규칙을 자동으로 받습니다. 설정 → Composer Plus → **작업 보드**에 **백로그** 열 스위치가 있습니다. 이 열의 카드는 에이전트가 사용자에게 맡깁니다. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="스크린샷: 작업 보드"></a> |
|
|
75
|
+
| **프로젝트 메모리** | <a id="feature-projectmemory"></a>기본적으로 꺼져 있습니다. **설정 → Composer Plus**에서 켜세요. 프로젝트 폴더마다 자체 메모리가 있으며, 그 프로젝트의 이후 채팅이 읽습니다. DS Bot이 Bot마다 메모리를 두는 것과 같습니다. 턴이 끝날 때마다 채팅의 모델을 한 번 호출해 새 메시지(되돌린 메시지 제외)를 읽고, 오래 유지되는 선호, 결정, 사실을 짧은 메모로 저장하며, 오래된 메모를 바꾸거나 지웁니다. 에이전트도 직접 메모를 저장, 삭제, 검색할 수 있습니다(`memory_remember`, `memory_forget`, `memory_recall`). 메모는 전역일 수도 있으며, 이때는 모든 프로젝트가 읽습니다. 새 채팅은 시스템 프롬프트에서 메모를 받습니다. 나중에 저장한 메모는 다음 채팅부터 보입니다. 파일은 dsh 홈 폴더의 Markdown(`storages/dsh-composer-plus/memory/`)이며 프로젝트 폴더에는 절대 저장되지 않습니다. 같은 줄의 **메모리 열기**는 저장된 모든 메모를 프로젝트별(및 전역 메모리)로 묶어 보여 주며 필터도 있습니다. 바꿀 내용을 자신의 말로 적고(예: "yarn 대신 pnpm을 써") **변경 미리 보기**를 누르세요. dsh의 기본 모델이 변경을 제안하고, **적용**을 눌러야만 저장됩니다. Tether에서는: 채팅 제목 메뉴 → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="스크린샷: 프로젝트 메모리"></a> |
|
|
69
76
|
| **이 채팅에서 허용** | <a id="feature-allowforchat"></a>자동 검토가 확인을 요청하면 승인 카드에 **이 채팅에서 허용**이 추가됩니다. 이후 같은 채팅의 같은 도구는 인수와 관계없이 시간 제한이 끝날 때까지 허용됩니다(기본값 1시간. **설정 → Composer Plus → 이 채팅에서 허용**에서 고릅니다). 그 후에는 에이전트가 다시 묻습니다. 헤더 칩에서 허용 목록과 종료 시각을 보고 취소할 수 있습니다. 허용은 재시작 후에도 유지됩니다. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="스크린샷: 이 채팅에서 허용"></a> |
|
|
70
77
|
| **프로젝트 상태** | <a id="feature-projectstatus"></a>사이드바의 프로젝트 행에 그 채팅과 같은 실행 중 / 대기 중 / 완료 표시가 나타납니다. 그래서 접힌 프로젝트도 안의 채팅이 작업 중인지, 사용자의 조치가 필요한지 알려 줍니다. 사용자의 조치를 기다리는 채팅이 먼저 표시되고, 그다음 아직 열지 않은 완료된 채팅(초록색 점, 다른 채팅이 아직 실행 중일 때도 표시), 마지막으로 실행 중 표시가 나타납니다. 포인터를 올리면 자세한 내용이 보입니다. **작업 공간 트리**에서는 상위 폴더의 행에도 그 안에 있는 각 프로젝트(예: `.worktrees/` 안의 각 브랜치 폴더)의 채팅 상태가 표시되며, 폴더가 접혀 있을 때도 마찬가지입니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="스크린샷: 프로젝트 상태"></a> |
|
|
71
|
-
| **채팅 행의 Git 브랜치** | <a id="feature-sessionbranch"></a>사이드바의 각 채팅 행에 작은 회색 배지로, 채팅의 마지막 턴 때 채팅 프로젝트 폴더가 있던 git 브랜치가 표시됩니다(예: `main` 또는 `feature/login`. 분리된 HEAD는
|
|
78
|
+
| **채팅 행의 Git 브랜치** | <a id="feature-sessionbranch"></a>사이드바의 각 채팅 행에 작은 회색 배지로, 채팅의 마지막 턴 때 채팅 프로젝트 폴더가 있던 git 브랜치가 표시됩니다(예: `main` 또는 `feature/login`. 분리된 HEAD는 브랜치가 없으므로 배지가 표시되지 않습니다). 한 프로젝트에서 서로 다른 브랜치에 있는 두 채팅이 더 이상 똑같아 보이지 않으며, 잘못된 브랜치에서 채팅을 이어 가려 할 때 바로 알 수 있습니다. 배지에 포인터를 올리면 전체 이름이 보입니다. Host 쪽은 턴이 시작될 때와 끝날 때 브랜치를 읽습니다(`git branch --show-current`, 읽기 전용). 이 기능을 설치한 뒤 턴이 없는 채팅이나 git 저장소가 아닌 폴더에는 배지가 표시되지 않습니다. 채팅 위의 프로젝트 행 이름이 브랜치와 같으면(예: “채팅별 브랜치” 폴더) 채팅 행에 배지가 표시되지 않지만, “하나의 목록”에서는 계속 표시됩니다. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="스크린샷: 채팅 행의 Git 브랜치"></a> |
|
|
72
79
|
| **모두 읽음으로 표시** | <a id="feature-markprojectread"></a>사이드바에서 프로젝트의 **…** 버튼 → **모두 읽음으로 표시**를 클릭하세요. 그 프로젝트의 모든 채팅에서 초록색 읽지 않음 점이 한 번에 사라집니다. 다른 프로젝트의 점은 그대로 남습니다. 프로젝트에 읽지 않은 채팅이 없으면 이 항목은 회색으로 표시됩니다(**읽지 않은 채팅 없음**). | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="스크린샷: 모두 읽음으로 표시"></a> |
|
|
73
80
|
| **활성 프로젝트 우선** | <a id="feature-activeprojectsfirst"></a>채팅이 실행을 시작하거나 사용자의 조치가 필요해지면, 그 프로젝트가 dsh 자체 행 애니메이션으로 사이드바 맨 위로 이동합니다(직접 끌어 올릴 때와 같은 움직임). 완료된 프로젝트는 제자리에 남으며, 평소처럼 원하는 곳으로 끌어 옮길 수 있습니다. 이동은 dsh의 프로젝트 순서에 저장되므로, 이 기능을 꺼도 현재 순서가 유지됩니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="스크린샷: 활성 프로젝트 우선"></a> |
|
|
74
81
|
| **최근 프로젝트 필터** | <a id="feature-recentprojects"></a>사이드바 → 보기 옵션(슬라이더 아이콘) → **최근 2시간 내 활성**. 이 옵션을 선택하면 사이드바에는 최근 2시간 안에 활성 채팅이 있었던 프로젝트만 표시됩니다. 활성 채팅은 그 시간 안에 업데이트된 채팅, 실행 중이거나 대기 중인 채팅, 열려 있는 채팅, 아직 열지 않은 완료된 채팅(dsh의 초록색 “완료” 점)입니다. 마지막 경우는 2시간이 지나도 해당됩니다. 이런 채팅이 없는 프로젝트는 숨겨지며, 새 프로젝트와 빈 프로젝트도 숨겨집니다. **작업 공간 트리**에서는 안에 있는 프로젝트가 활성인 동안 상위 폴더가 계속 표시되고, 최근 2시간 안에 활성 상태가 아니었던 채팅도 숨겨지므로 최근 채팅만 표시됩니다. 모든 프로젝트를 다시 보려면 옵션을 다시 선택하세요. 선택은 이 기기에 저장됩니다. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="스크린샷: 최근 프로젝트 필터"></a> |
|
|
75
82
|
| **모든 프로젝트 접기** | <a id="feature-collapseprojects"></a>사이드바에 열린 프로젝트가 있으면 보기 옵션(슬라이더 아이콘) 옆에 버튼이 나타납니다. 클릭하면 열린 프로젝트를 한 번에 모두 닫습니다. 예를 들어 프로젝트 5개 중 열린 3개를 한 번에 닫습니다. 열린 프로젝트가 없으면 버튼이 다시 숨겨집니다. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="스크린샷: 모든 프로젝트 접기"></a> |
|
|
76
83
|
| **상태별 정렬** | <a id="feature-statusorder"></a>사이드바 → 보기 옵션 → **정렬 기준** → **상태별**(**하나의 목록**과 함께 사용). 완료된 채팅이 먼저 옵니다(dsh의 “완료” 점. 오류로 끝난 턴에도 이 점이 붙습니다). 그다음 실행 중이거나 대기 중인 채팅, 활성 자동화(예약)가 있는 채팅, 나머지 채팅이 dsh 순서대로 옵니다. 완료된 채팅을 열면 아래로 이동합니다. 보기만 바뀝니다. 원래대로 돌아가려면 **수동** 또는 **마지막 업데이트**를 선택하세요. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="스크린샷: 상태별 정렬"></a> |
|
|
77
84
|
| **백그라운드 알림** | <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> |
|
|
78
|
-
| **유휴 상태일 때 대기 중인 채팅 열기** | <a id="feature-idleswitch"></a>채팅이 질문을 하거나 승인 또는 계획 검토를 기다리고 있을 때(주황색 점) 30초 동안 dsh를 사용하지 않으면 dsh가 그 채팅을 엽니다.
|
|
85
|
+
| **유휴 상태일 때 대기 중인 채팅 열기** | <a id="feature-idleswitch"></a>채팅이 질문을 하거나 승인 또는 계획 검토를 기다리고 있을 때(주황색 점), 또는 아직 읽지 않은 턴을 마쳤을 때(초록색 점) 30초 동안 dsh를 사용하지 않으면 dsh가 그 채팅을 엽니다. 주황색 채팅이 초록색 채팅보다 먼저 열립니다. 각 그룹에서는 가장 오래 기다린 채팅이 먼저 열리고, 다음 채팅은 다시 30초 동안 사용하지 않으면 열립니다. 키 입력, 클릭, 마우스 이동, 스크롤 휠, 터치가 있으면 30초를 다시 셉니다. 포커스가 있는 입력란에 텍스트가 있거나, 텍스트를 선택했거나, 메뉴나 대화 상자가 열려 있어도 전환하지 않습니다. 기다리는 채팅이 화면에 있는 동안에는 아무것도 바뀌지 않습니다. 답하지 않고 기다리는 채팅을 떠나면, 다음에 30초 동안 사용하지 않을 때 그 채팅이 다시 열릴 수 있습니다. 초록색 채팅이 열리면 그 점은 사라집니다. 다음 초록색 채팅은 dsh를 다시 사용한 뒤 30초 동안 사용하지 않을 때 열립니다. dsh가 백그라운드에 있을 때도 작동하지만, dsh가 앞으로 나오지는 않습니다. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="스크린샷: 유휴 상태일 때 대기 중인 채팅 열기"></a> |
|
|
79
86
|
| **애플리케이션 언어** | <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> |
|
|
80
87
|
| **모바일 연결(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> |
|
|
81
88
|
| **자동 업데이트** | <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> |
|
|
@@ -160,7 +167,12 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
160
167
|
- **입력 중 자동 완성:** 켜기 전까지 꺼져 있습니다. 켜져 있는 동안 입력을 멈출 때마다 Host 쪽은 지금까지 입력한 텍스트와, 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론 제외)을 채팅 기준 최대 약 3,000자까지 **입력 중 자동 완성**에서 고른 모델(기본값: **다음 메시지 예측**의 모델)에 보냅니다. 입력을 다시 멈추면 이전 요청은 중지됩니다. 채팅에는 아무것도 저장되지 않습니다. 스위치는 `$DSH_HOME/storages/dsh-composer-plus/complete.json`(소유자 전용 파일)에 보관됩니다.
|
|
161
168
|
- **프롬프트 개선:** 요술봉을 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽은 초안, 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론, 되돌린 메시지 제외. 최대 약 6,000자, 가장 최근 부분), **기능 아이디어**와 같은 프로젝트 요약(파일 규칙도 같음: `.env*`나 키 파일 없음, 폴더 밖을 가리키는 심볼릭 링크 없음, FIFO 없음), `git status`가 변경됨으로 표시하는 경로, 이름에 초안과 같은 단어가 들어 있는 추적되거나 추적되지 않는(무시되지 않은) 경로 최대 30개를 **프롬프트 개선**에서 고른 모델(기본값: 채팅 자체의 모델)에 요청 한 번으로 보냅니다. 이 요약 외의 파일 내용은 보내지 않습니다. 채팅과 프로젝트에는 아무것도 쓰지 않습니다. 답변은 입력란의 초안을 바꿀 뿐이며, 보낼지는 사용자가 정합니다. 고른 모델은 `$DSH_HOME/storages/dsh-composer-plus/improve.json`(소유자 전용 파일)에 보관됩니다.
|
|
162
169
|
- **목표 확인:** 에이전트가 자동 라운드에서 `/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개)에 보관됩니다.
|
|
163
|
-
-
|
|
170
|
+
- **새 채팅에서 계속:** 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽은 채팅(목표 확인이 읽는 방식과 같음: 추론과 되돌린 단계 제외)을 채팅 자체의 모델에 보내고 인계 메모를 보여 줍니다. 새 채팅을 만드는 것은 **새 채팅 시작**뿐입니다. 프로젝트에는 아무것도 쓰지 않습니다.
|
|
171
|
+
- **컨텍스트 구성:** Host에서 채팅 로그만 읽습니다. 모델 호출도 프로젝트 파일도 없습니다.
|
|
172
|
+
- **작업 보드:** 보드(작업의 제목, 설명, 태그, 댓글, 프로젝트 폴더 경로와 그 짧은 ID)는 `$DSH_HOME/storages/dsh-composer-plus/board.json`(소유자 전용 파일)에 있습니다. 스위치는 그 옆의 `board-switch.json`에 있습니다. 아무것도 컴퓨터 밖으로 나가지 않으며, 프로젝트 폴더에는 아무것도 쓰지 않습니다. 보드 도구는 사용자가 보드에 쓴 내용을 에이전트에게 주므로, 에이전트가 작업을 읽으면 그 텍스트가 채팅의 모델에 전달됩니다. 손상된 보드 파일은 `board.json.broken-<time>`으로 보관되고, 보드는 빈 상태로 시작합니다.
|
|
173
|
+
- **보호된 파일:** 목록과 스위치는 `$DSH_HOME/storages/dsh-composer-plus/protected-files.json`(소유자 전용 파일)에 있습니다. 확인은 각 파일 도구 호출의 경로(와 실제 경로)만 읽으며, 파일 자체는 읽지 않습니다.
|
|
174
|
+
- **차단된 명령:** 규칙과 스위치는 `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json`(소유자 전용 파일)에 있습니다. 확인은 각 `bash`와 `pwsh` 호출의 명령 텍스트만 읽으며, 아무것도 실행하거나 보내지 않습니다.
|
|
175
|
+
- **프로젝트 메모리:** 직접 켜기 전까지는 꺼져 있습니다. 켜져 있는 동안 최상위 채팅의 턴이 끝날 때마다 Host 쪽이 지난 검토 이후 그 채팅의 새 메시지(사용자 메시지와 에이전트의 텍스트 답변. 도구 출력, 추론, 숨은 컨텍스트, 되돌린 메시지는 제외. 분기한 채팅에서는 부모 채팅의 복사본 제외. 최대 약 16,000자)와 저장된 메모를, 도구 없는 요청 한 번으로 채팅 자체의 모델에 보냅니다. 메모는 `$DSH_HOME/storages/dsh-composer-plus/memory/` 아래의 Markdown 파일(소유자만 읽고 쓸 수 있음)입니다. 프로젝트 폴더마다 `projects/<id>/`(`<id>`는 폴더 실제 경로의 해시이며, `project.json`에 폴더가 적힙니다), `global/`, `journal.jsonl`(각 변경과 변경 전후의 줄), `reviewed.json`(각 채팅을 어디까지 읽었는지)이 있습니다. 프로젝트 폴더에는 아무것도 쓰지 않습니다. 키, 토큰, 비밀번호, 신분증 번호처럼 보이는 메모는 거부합니다. 프로젝트의 메모는 그 폴더의 새 채팅마다 시스템 프롬프트에 들어가므로, 그 채팅의 모든 요청과 함께 모델에 전달됩니다. 스위치는 같은 위치의 `memory.json`에 있습니다. **메모리 열기**는 **변경 미리 보기**를 누르기 전에는 아무것도 보내지 않습니다. 누르면 보이는 메모와 사용자의 글을 도구 없는 한 번의 요청으로 dsh의 기본 모델에 보냅니다. 변경은 **적용**을 눌러야만 기록되며 저널에는 `editor`로 남습니다. Tether도 같은 경로로 메모를 읽고 바꿉니다.
|
|
164
176
|
- **백업:** 아무것도 컴퓨터 밖으로 나가지 않습니다. 아카이브는 `~/Desktop/dsh-backups`에 저장됩니다(소유자 전용 파일). 비밀 값은 아카이브에 들어가지 않습니다. 자격 증명 파일(`.credentials.yaml`, `.env`), 키 파일(`.pem`, `.key`, `.p12`, `.pfx`), yml 파일의 token, secret, password, API 키 설정 값은 마스킹되고, 실제 사본은 같은 폴더의 `composer-plus-vault/<archive>/`(소유자 전용)에, 이 컴퓨터에만 남습니다. **다른 컴퓨터용**은 vault를 복사하지 않습니다. 그 비밀 값은 새 컴퓨터에서 다시 입력하세요. 채팅 로그, 설정, dsh 홈의 나머지 내용은 그대로 아카이브에 들어갑니다. `$DSH_HOME` 자체처럼 이 폴더를 비공개로 두세요. 백업은 `O_NOFOLLOW | O_NONBLOCK`으로 파일을 읽습니다. 심볼릭 링크는 링크로 저장하고(따라가지 않음), FIFO나 장치는 건너뜁니다. 자동 백업 스위치와 설정은 `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`에, 복구 콘솔 스위치는 `rescue-console.json`에 있습니다. dsh가 실행되는 동안에는 `running/host-<pid>.json`이 각 dsh 프로세스를 나타냅니다(복구 콘솔은 이 파일들을 읽고 복원을 거부합니다).
|
|
165
177
|
- **복구 콘솔:** 터미널 메뉴이며, 네트워크 포트를 열지 않습니다. 복원은 dsh 홈 옆의 새 폴더에만 씁니다(파일은 `O_EXCL | O_NOFOLLOW`로 쓰고, 심볼릭 링크는 마지막에 만들며 따라가지 않음). 안전하지 않은 이름(`..`, 절대 경로), 장치나 FIFO, 둘 이상의 최상위 폴더, 링크 아래의 항목이 있는 아카이브는 거부합니다.
|
|
166
178
|
|
|
@@ -182,7 +194,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
182
194
|
- **채팅 행에 브랜치 배지가 없음:** 이 버전을 설치한 뒤 그 채팅에 턴이 없었거나, 폴더가 git 저장소가 아니거나, **채팅 행의 Git 브랜치**가 꺼져 있습니다. 업데이트한 뒤에는 dsh를 다시 시작하세요(브랜치는 Host 쪽이 기록합니다).
|
|
183
195
|
- **목표 확인에 테스트가 종료 코드 127 또는 "not found"로 끝났다고 표시됨:** Finder나 Dock에서 시작한 dsh는 터미널보다 PATH가 짧을 수 있어서 `npm`, `pnpm`, `cargo`를 찾지 못합니다. 터미널에서 dsh를 시작하거나, **목표 확인** → **편집**에서 전체 경로를 쓴 테스트 명령을 직접 정하세요. **지금 실행**을 누르면 결과가 바로 표시됩니다.
|
|
184
196
|
- **목표가 닫히지 않고 에이전트가 계속 작업함:** **목표 확인**이 실패한 테스트나 남은 작업을 찾았습니다. 목표 아래의 행에 이유가 표시됩니다(자세한 내용은 결과에 포인터를 올려 보세요). 원인이나 테스트 명령을 고치거나, `/goal` 또는 목표 바로 목표를 직접 완료하세요(이 완료는 확인하지 않습니다).
|
|
185
|
-
- **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.
|
|
197
|
+
- **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.18.0`). 위의 설치 안내를 참고하세요.
|
|
186
198
|
- **지금 백업에서 "다른 백업 작업이 실행 중입니다"라고 표시됨:** 다른 dsh 창이나 복구 콘솔에서 작업이 실행 중입니다(둘은 백업 폴더의 잠금 파일 `.composer-plus.lock`을 함께 씁니다). 작업이 끝날 때까지 기다리세요. 실행 중인 작업이 없으면, 다음에 클릭할 때 종료된 프로세스의 잠금을 넘겨받습니다.
|
|
187
199
|
- **복구 콘솔에 "dsh is running"이라고 표시됨:** 먼저 dsh를 종료하세요. dsh가 정말 닫혀 있다면, 메시지에 나온 파일은 비정상 종료로 남은 것입니다. 그 파일을 삭제하고 다시 시도하세요.
|
|
188
200
|
- **복원 후 dsh가 시작되지 않거나 플러그인이 없음:** 프로필의 플러그인 패키지를 다시 설치해야 합니다. 복구 콘솔이 복원 후에 이를 제안합니다. 또는 콘솔이 나열하는 `$DSH_HOME/profiles/` 아래의 각 폴더에서 `pnpm install`을 실행하세요. vault에 없던 비밀 값(다른 컴퓨터)은 다시 입력해야 합니다. 콘솔이 그 목록을 보여 줍니다.
|
|
@@ -205,6 +217,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
205
217
|
- **이 채팅에서 허용**은 허용한 순간부터 시간 제한을 셉니다. 새 시간 제한은 유효한 허용에 즉시 적용되므로, 더 짧은 시간 제한은 허용을 즉시 끝낼 수 있습니다. 버전 1.12 이하의 허용에는 시간 정보가 없습니다. 업데이트 후 에이전트가 그 도구들에 대해 한 번 더 묻습니다.
|
|
206
218
|
- **입력란 포커스 유지**는 `/` 명령이나 스킬을 보낸 뒤에만 포커스를 돌려줍니다. dsh가 명령을 처리하는 몇 밀리초 동안 입력란이 읽기 전용이므로, 그동안 누른 키는 사라집니다. dsh의 `/` 메뉴가 아직 열려 있으면 `Enter`는 강조된 행을 선택하고 메시지를 보내지 않습니다.
|
|
207
219
|
- **질문 카드를 창에 맞추기**는 dsh의 질문 카드만 바꾸고 계획 검토 카드는 바꾸지 않습니다. 카드는 dsh의 마크업(`data-question-key`, `data-question-scroll`)으로 찾습니다. dsh 업데이트로 이 마크업이 바뀌면 카드는 dsh가 그리는 대로 보입니다. 카드 높이는 채팅이 아니라 창을 따릅니다. 좁은 사이드 패널 안의 채팅에서는 높은 카드가 채팅 위로 넘칠 수 있습니다.
|
|
220
|
+
- **채팅 헤더를 창에 맞추기**는 dsh가 생성한 클래스 이름(`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`)으로 채팅 헤더를 찾습니다. dsh에 헤더 레이아웃용 훅이 없기 때문입니다. dsh 업데이트로 이 이름이 바뀌면 헤더는 dsh가 그리는 그대로 보입니다. 아주 좁은 채팅 열에서는 헤더가 두세 줄을 차지할 수 있어 메시지 위의 공간이 줄어듭니다.
|
|
208
221
|
- **모바일 연결**은 macOS에서만 작동합니다(`en0`, `openssl`, `swift`, `dns-sd` 사용). 고정 포트 19390과 19391을 쓰므로, Mac마다 한 번에 dsh 하나에서만 실행할 수 있습니다(각 Mac은 휴대폰의 Mac 목록에서 항목 하나입니다). 휴대폰은 Tether가 열려 있거나 막 백그라운드로 간 동안에만 알림을 받습니다(푸시 서비스 없음). Tether에서 "Settings → Notifications → Send notifications"를 켜기 전에는 Tether가 알림을 보내지 않습니다. 이 설정은 기본적으로 꺼져 있으며, 켤 때 iOS가 권한을 요청합니다. iOS 앱은 아직 App Store에 없습니다. Xcode로 `tether/ios`에서 빌드하세요. "Tailscale only"를 켜도 Mac에 Wi-Fi 또는 이더넷 주소가 있어야 합니다(게이트웨이는 그런 주소가 있을 때만 시작됩니다). 액세스 로그는 Mac마다 따로 있으며, 가장 최근의 시도 200개만 보관합니다. 1분 안에 반복된 시도는 새 행을 만들지 않고 같은 행의 횟수를 하나 늘립니다. Tether의 앱 잠금은 iPhone 잠금 화면의 알림 미리보기를 숨기지 않습니다. iOS 설정에서 끄세요. Tether의 초록 점은 Mac을 따릅니다. dsh에서 연 채팅은 휴대폰에서도 점이 사라집니다. Tether에서 연 채팅은 휴대폰에서만 점이 사라집니다. Mac에 있는 dsh 자체의 점은 Mac에서 그 채팅을 열 때까지 남습니다.
|
|
209
222
|
- 세션 링크는 채팅 안에서 작동하지만, 클릭해도 채팅이 열리지는 않습니다. **메시지 링크 복사**로 만든 링크는 dsh 0.2.1 이상에서만, 그리고 채팅 안의 메시지에서만 그 메시지를 엽니다(dsh 0.2.0에는 사용자 텍스트 규칙이 없으므로, 링크는 복사되지만 일반 텍스트로 보입니다). 되돌리기로 빠진 메시지나, 압축으로 dsh가 불러오는 기록에서 빠진 메시지는 보여 줄 수 없습니다. 이때 링크가 그렇다고 알려 줍니다. 🔗 버튼은 dsh의 메시지 행에 붙습니다. dsh 업데이트로 그 마크업이 바뀌면 버튼이 표시되지 않습니다.
|
|
210
223
|
- **모두 읽음으로 표시**는 공개 API가 아닌 dsh의 일부(dsh 세션 상태의 `completionUnread` 목록)를 통해 dsh 자체의 읽지 않음 점을 바꿉니다. dsh 업데이트로 이 이름이 바뀌면 항목이 표시되지 않습니다. 이 항목은 dsh의 프로젝트 "…" 메뉴에 들어가는데, 이 메뉴에는 플러그인용 슬롯이 없습니다. dsh가 이 메뉴를 바꾸면 이 항목도 표시되지 않습니다.
|
|
@@ -219,7 +232,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
219
232
|
- **채팅별 브랜치**: 채팅의 브랜치 폴더(`<project>/.worktrees/<name>`)가 삭제되면(예: 채팅 자신의 에이전트가 worktree를 제거하고 브랜치를 삭제할 때) 채팅의 다음 단계에서 채팅이 그 폴더 밖으로 옮겨집니다. 브랜치 폴더의 프로젝트는 사이드바에서 사라지고, 채팅은 그룹 없음 아래에 표시되며 열린 상태로 유지됩니다. dsh 0.2.1 이상에서는 채팅이 프로젝트의 기본 폴더에서 계속되고, 모델은 새 폴더에 대한 안내를 받습니다. dsh 0.2.0에서는 채팅이 삭제된 폴더를 그대로 사용합니다. 그곳에서 실행하는 명령은 새 채팅을 시작할 때까지 실패합니다. 어떤 채팅도 사용하지 않는 삭제된 브랜치의 프로젝트도 사이드바에서 사라집니다. Composer Plus는 시작할 때와 30초마다 브랜치 폴더를 확인하며, 사이드바 필터가 없어도 됩니다. 채팅이 옮겨지는 동안 같은 저장소의 **새 브랜치**는 "다시 시도하세요"라고 답합니다. 스위치를 끄면 dsh 자체 오류("working-directory: directory does not exist")가 다시 표시됩니다.
|
|
220
233
|
- **작업 공간 트리의 브랜치**은(는) 클릭 없이 git에 씁니다. 채팅을 옮길 때 프로젝트 폴더를 이전 브랜치로 되돌리고(`git switch`) worktree를 추가합니다(`git worktree add`). 브랜치, worktree, 파일은 절대 삭제하지 않습니다. dsh는 채팅의 폴더를 바꿀 수 없으므로, 옮겨진 채팅은 복사본(새 id를 가진 dsh 자체 포크)이고 이전 채팅은 보관됩니다. 복사본은 멈춘 작업을 이어서 합니다. 브랜치가 생겼을 때 실행 중이던 도구 호출은 거부로 끝나고, 에이전트는 새 폴더에서 그것을 다시 실행합니다. 이전 채팅의 목표는 함께 옮겨지지 않습니다. 폴더가 저장소의 메인 폴더인 채팅만 옮겨지며, 그 턴에서 만들고 전환한 브랜치(`git switch -c`, `git checkout -b`)일 때만 옮겨집니다. `git branch`만으로 만든 브랜치, 커밋되지 않은 변경이 있는 폴더, 연결된 worktree, 하위 폴더는 아무것도 옮기지 않습니다. 트리에는 `<project>/.worktrees/` 바로 아래에 있고 브랜치가 있는 worktree만 표시됩니다. 분리된(detached) worktree나 다른 위치의 worktree는 표시되지 않습니다. 복사본은 원래 채팅이 열려 있던 채팅일 때만 저절로 열립니다(플러그인은 dsh의 사이드바 행에서 이를 읽습니다). 그 외에는 브랜치 프로젝트에 있습니다.
|
|
221
234
|
- **채팅에서 찾기**는 페이지가 보여 주는 것만 검색합니다. 불러온 메시지와 답변이 대상이며(이전 것은 위로 스크롤하거나 **이전 기록 로드**를 클릭하세요), 닫힌 도구 단계와 도구 출력 안의 접힌 텍스트는 검색하지 않습니다. 일치 항목은 최대 2,000개까지 셉니다(그 뒤에는 "2000+"). 브라우저의 하이라이트 API를 씁니다(Chromium 105 이상, 데스크톱 앱에는 있습니다). 더 오래된 브라우저에서는 개수와 이동은 작동하지만 색은 표시되지 않습니다. Mac에서는 `Cmd+F`(Windows와 Linux에서는 `Ctrl+F`)가 화면에 채팅이 있을 때만 이것을 엽니다. 다른 곳에서는 브라우저 자체의 찾기가 전처럼 작동합니다. Mac에서 `Ctrl+F`는 텍스트 필드에서 macOS 기능(커서를 한 글자 앞으로 이동)을 그대로 유지합니다.
|
|
222
|
-
- **유휴 상태일 때 대기 중인 채팅 열기**는 dsh 창이 보는 동작만 압니다. 다른 앱에서 하는 작업은 세지 않으므로, dsh가 백그라운드에 있으면 30초 뒤에 대기 중인 채팅을 열 수 있습니다. dsh를 앞으로 가져오지는 않습니다. 키 입력, 클릭, 마우스 이동 없이 읽기만 하면 유휴 상태로 봅니다. dsh의 주황색
|
|
235
|
+
- **유휴 상태일 때 대기 중인 채팅 열기**는 dsh 창이 보는 동작만 압니다. 다른 앱에서 하는 작업은 세지 않으므로, dsh가 백그라운드에 있으면 30초 뒤에 대기 중인 채팅을 열 수 있습니다. dsh를 앞으로 가져오지는 않습니다. 키 입력, 클릭, 마우스 이동 없이 읽기만 하면 유휴 상태로 봅니다. dsh의 주황색 점(질문, 승인, 계획 검토) 또는 초록색 점(아직 열지 않은 완료된 턴)이 있는 채팅만 봅니다. 주황색 채팅이 먼저 열립니다. 초록색 채팅을 열면 그 점이 사라지므로, 다음 초록색 채팅의 30초는 다음 키 입력, 클릭, 마우스 이동, 스크롤 휠, 터치 뒤에 시작됩니다. 돌아왔을 때 다른 초록색 점은 그대로 있습니다. 서브에이전트의 요청은 부모 채팅에 표시됩니다. 기다리는 채팅이 화면에 있는 동안에는 다른 채팅을 열지 않습니다. 답하지 않고 떠난 채팅은 다음에 30초 동안 사용하지 않으면 다시 열릴 수 있습니다. 30초는 바꿀 수 없습니다.
|
|
223
236
|
- 재시작 전에 보낸 알림을 클릭하면 dsh를 앞으로 가져오기만 합니다.
|
|
224
237
|
- 활성 프로젝트는 dsh에 저장되는 프로젝트 순서로 이동하므로, 새 순서는 재시작 후에도 유지됩니다. 어느 프로젝트에도 속하지 않은 채팅("그룹 없음")은 이동할 수 없습니다. dsh는 이 채팅을 항상 맨 마지막에 나열합니다.
|
|
225
238
|
- dsh의 사이드바 보기 옵션 메뉴에는 확장 지점이 없습니다. 그래서 최근 프로젝트 옵션은 dsh 자체 메뉴에 추가됩니다. dsh 업데이트로 이 메뉴가 바뀌면 옵션이 표시되지 않고 모든 프로젝트가 계속 보입니다. 필터는 프로젝트 행에 적용되므로 **하나의 목록**은 걸러지지 않습니다. **작업 공간 트리**에서는 안에 있는 프로젝트가 활성인 동안 상위 폴더도 계속 보이고, 최근 2시간 동안 활성이 아니었던 채팅 행도 숨겨집니다. **작업 공간**에서는 프로젝트 행만 걸러집니다. 필터는 dsh가 저장한 보기 설정(공개 API가 아님)에서 지금 어떤 보기인지 읽습니다. dsh 업데이트로 그 이름이 바뀌면 **작업 공간 트리**는 **작업 공간**처럼 걸러집니다. 프로젝트 상태도 같은 설정을 읽습니다. **작업 공간 트리**에서는 상위 폴더 행이 그 안에 있는 프로젝트의 채팅도 셉니다. dsh가 이 설정의 이름을 바꾸면 각 행은 자기 채팅만 표시합니다. **상태별**에도 같은 종류의 제한이 있습니다. dsh에는 정렬 슬롯이 없으므로, 항목과 행 순서가 dsh의 메뉴와 목록 마크업에 붙습니다.
|
|
@@ -228,10 +241,16 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
228
241
|
- dsh에는 **새 세션**를 열 위치를 고르는 확장 지점도 없습니다. **새 세션의 기본 작업 공간**은 공개 API가 아닌 dsh 메서드(dsh 작업 공간 서비스의 `startSession`)를 감쌉니다. dsh 업데이트로 이 이름이 바뀌면 **새 세션**는 dsh가 고른 위치(열린 프로젝트 또는 최근 프로젝트)에서 열립니다. 프로젝트를 지정하지 않는 모든 호출이 기본값을 사용합니다: 사이드바 버튼, 그 단축키, 로고, 그리고 **자동화 작업** 페이지의 **새로 만들기**도 마찬가지입니다. dsh는 시작할 때 여전히 마지막 채팅을 엽니다. 일반 폴더는 처음 사용할 때 만들어지고 프로젝트에 추가됩니다. Windows나 Linux에서 Documents 폴더를 옮겼다면 dsh 자체 폴더와 다른 폴더일 수 있습니다.
|
|
229
242
|
- dsh에는 입력란 힌트를 위한 확장 지점도 없습니다. 그래서 **다음 메시지 예측** 텍스트는 dsh 자체의 플레이스홀더(`[data-composer-placeholder]`) 위에 겹쳐 표시됩니다. dsh 업데이트로 이 마크업이 바뀌면 예측이 표시되지 않습니다. 켜져 있는 동안에는 턴이 끝날 때마다 짧은 모델 호출이 한 번 일어납니다.
|
|
230
243
|
- **입력 중 자동 완성**은 dsh 자체의 입력란 힌트(dsh가 슬래시 명령의 인수 힌트에 쓰는 `--dsh-composer-hint` 스타일)로 텍스트를 표시합니다. 슬래시 명령, 파일 칩이나 기호 칩이 있는 메시지, 커서가 메시지 끝에 있지 않을 때는 실행되지 않습니다. dsh 업데이트로 이 스타일이 바뀌면 완성 텍스트가 표시되지 않습니다. 입력을 멈출 때마다 모델 호출이 한 번 일어납니다.
|
|
231
|
-
- **프롬프트 개선**은 짧은 프로젝트 요약, 변경된 경로, 이름이 입력한 단어와 일치하는 경로만 보며, 코드 자체는 보지 않습니다. 그래서 맞는 파일을 놓칠 수 있고, 전달받은 경로만 언급합니다. 보내기 전에 새 텍스트를 읽어 보세요. 슬래시
|
|
232
|
-
- **목표 확인**은 에이전트가 자동 목표 라운드에서 한 완료만 확인합니다. 채팅에서 사용자가 요청한 완료, `/goal`, 목표 바는 확인하지 않습니다. 에이전트는 테스트나 테스트 명령의 파일을 스스로 바꿀 수 있습니다. 검증 모델은 채팅을 읽으므로 이를 알아챌 수 있지만, 양쪽 방향으로 틀릴 수 있습니다(잘못된 "완료되지 않음"은 라운드를 한 번 더 쓰고, 잘못된 "완료"는 목표를 닫습니다). 검증 모델은 채팅과 `git status`를 보며, 코드 자체는 보지 않습니다. 테스트 실행은 파일을 바꿀 수 있는 에이전트의 최신 단계가 같은 폴더에서 정확히 같은 명령을 성공적으로 실행한 에이전트 자신의 `bash` 실행일 때만 재사용합니다. 파이프(`| tail`)나 `&&`가 있는 명령은 재사용하지 않습니다. 예산은 턴이 끝날 때 측정하므로, 한 턴이 예산을 넘을 수 있습니다.
|
|
244
|
+
- **프롬프트 개선**은 짧은 프로젝트 요약, 변경된 경로, 이름이 입력한 단어와 일치하는 경로만 보며, 코드 자체는 보지 않습니다. 그래서 맞는 파일을 놓칠 수 있고, 전달받은 경로만 언급합니다. 보내기 전에 새 텍스트를 읽어 보세요. `/goal <목표>` 외의 슬래시 명령, `/goal` 제어어(`clear`, `pause`, `resume`), 파일 칩이나 기호 칩이 있는 메시지에서는 실행되지 않습니다(새 텍스트는 일반 텍스트라서 칩이 사라지기 때문입니다). `/goal` 목표에서는 초안과 컨텍스트만으로 조건을 씁니다. 너무 엄격한 조건은 목표 라운드를 더 쓰게 할 수 있으므로, 보내기 전에 읽어 보세요. 메시지는 최대 8,000자까지 가능합니다. 이미지는 그대로 첨부되어 있고, 텍스트만 바뀝니다. 클릭할 때마다 모델 호출이 한 번 일어나며, 성능이 높은 모델은 1분쯤 걸릴 수 있습니다(`Esc`로 취소).
|
|
245
|
+
- **목표 확인**은 에이전트가 자동 목표 라운드에서 한 완료만 확인합니다. 채팅에서 사용자가 요청한 완료, `/goal`, 목표 바는 확인하지 않습니다. 에이전트는 테스트나 테스트 명령의 파일을 스스로 바꿀 수 있습니다. 검증 모델은 채팅을 읽으므로 이를 알아챌 수 있지만, 양쪽 방향으로 틀릴 수 있습니다(잘못된 "완료되지 않음"은 라운드를 한 번 더 쓰고, 잘못된 "완료"는 목표를 닫습니다). 검증 모델은 채팅과 `git status`를 보며, 코드 자체는 보지 않습니다. 테스트 실행은 파일을 바꿀 수 있는 에이전트의 최신 단계가 같은 폴더에서 정확히 같은 명령을 성공적으로 실행한 에이전트 자신의 `bash` 실행일 때만 재사용합니다. 파이프(`| tail`)나 `&&`가 있는 명령은 재사용하지 않습니다. 예산은 턴이 끝날 때 측정하므로, 한 턴이 예산을 넘을 수 있습니다. 토큰 예산은 그 채팅의 하위 에이전트 채팅의 호출도 셉니다(턴이 끝날 때마다 저장된 로그에서 읽으므로, 하위 에이전트가 많은 채팅은 확인이 조금 더 오래 걸립니다). 근거 표는 검증 모델이 채팅을 직접 읽은 결과입니다. 검증됨이라고 한 부분도 중요하다면 직접 확인하세요. 확인이 실행되는 동안 `update_goal`은 기다립니다(테스트는 최대 15분, 검증은 최대 3분). 포크한 채팅은 새 채팅 ID를 받으므로, 부모 채팅 자체의 테스트 명령과 제한 없이 시작합니다. 검증까지 간 완료마다 모델 호출이 한 번 일어납니다.
|
|
246
|
+
- **보호된 파일**은 가드레일이며 샌드박스가 아닙니다. dsh 자체의 파일 도구(`read`, `read_image`, 파일에 대한 `grep`, `write`, `edit`, `str_replace_editor`)만 다룹니다. 셸 명령(`cat .env`), 에이전트가 쓴 스크립트, 하위 에이전트의 셸, MCP 도구, `glob` 목록, 폴더 전체에 대한 `grep`은 여전히 보호된 파일에 접근할 수 있습니다. 실제로 제한하려면 dsh의 샌드박스 모드를 쓰거나 비밀 값을 프로젝트 폴더 밖에 두세요. 패턴은 `*`, `**`, `?`를 알지만 `{a,b}`나 `[ab]`는 모르며, 대소문자를 구분하지 않습니다.
|
|
247
|
+
- **차단된 명령**은 가드레일이며 샌드박스가 아닙니다. dsh의 `bash`와 `pwsh` 도구의 명령 텍스트만 읽습니다. 명령을 가리키는 변수나 별칭(`CMD=npm; $CMD publish`), 셸 함수, 에이전트가 쓴 스크립트 파일, 다른 프로그램(`python -c`, `node -e`, `make`), MCP 도구, 사용자 자신의 터미널은 여전히 그 명령을 실행할 수 있습니다. 규칙은 원하는 것보다 더 많이 일치할 수 있습니다. 명령의 어느 단어든 명령 이름이 될 수 있고(`echo npm publish`는 `npm publish`와 일치), 규칙의 단어 사이에 다른 단어가 와도 됩니다(`git push --force`는 `git push origin main --force`와도 일치). 너무 많이 일치하면 규칙을 더 길게 만드세요. **먼저 묻기** 규칙에는 물어볼 수 있는 채팅이 필요합니다. 승인 정책이 never인 채팅(예: 위임된 하위 에이전트)에서는 dsh가 카드를 표시할 수 없으므로 호출이 이유와 함께 거부됩니다. 승인 카드는 이유를 영어로 표시합니다. **이 채팅에서 허용**으로는 **먼저 묻기** 카드에 답할 수 없습니다.
|
|
248
|
+
- **새 채팅에서 계속**은 채팅(메시지, 도구 호출, 각 도구 결과의 끝부분. 최대 약 60,000자, 가장 최근 부분)을 채팅 자체의 모델에 보냅니다. 인계 메모는 결정이나 파일을 빠뜨릴 수 있으므로, 시작하기 전에 읽어 보세요. 새 채팅은 메모와 링크된 채팅만 압니다(dsh는 이전 채팅을 읽기 전용 컨텍스트로 첨부합니다). 새 채팅의 모델 컨텍스트는 작게 시작하고, 이전 채팅은 그대로 남습니다. 채팅마다 한 번에 메모 작성이나 시작 하나만 실행됩니다.
|
|
249
|
+
- **컨텍스트 구성**은 dsh 자체의 규칙(토큰당 약 4자)으로 추정값을 보여 줍니다. dsh의 컨텍스트 링과 같은 규칙이며, 모델 자체의 계산과 다를 수 있습니다. 도구 정의는 가장 최근 요청의 것입니다. 채팅 로그에 있는 그대로의 컨텍스트를 보여 주며, 지금 실행 중인 턴은 다음 단계 뒤에 나타납니다.
|
|
250
|
+
- **계획된 단계**는 모델이 실제로 계획할 때만 토큰을 절약합니다. 켜져 있는 동안에는 모델이 계획하지 않는 채팅에서도 모든 요청에 `plan_next_steps` 도구와 짧은 지침(약 500토큰)이 포함됩니다. 조건은 적힌 내용만 증명합니다(예: 빌드 종료 코드가 0이었음). 작업이 올바르다는 것은 증명하지 않습니다. `ok`는 dsh 자체의 결과 표시(`[exit code: N]`, 시간 초과, 샌드박스 거부)를 읽습니다. 0이 아닌 종료 코드 없이 실패한 명령은 통과로 처리됩니다. 단계는 한 번에 하나씩 실행되며, 동시에 준비된 두 단계는 모델에게 돌아갑니다. 단계의 메시지는 채팅 모델의 어시스턴트 메시지로 저장됩니다(dsh에는 플러그인이 쓴 메시지를 나타내는 표시가 없습니다). 그래서 그 텍스트에 Composer Plus가 실행했다고 적혀 있습니다. Tether에는 없습니다.
|
|
251
|
+
- **작업 보드**는 dsh의 프로젝트만 압니다. 프로젝트 밖의 채팅에서는 **모든 프로젝트**가 표시되고, 채팅별 브랜치 폴더(`<project>/.worktrees/<name>`)는 해당 프로젝트로 취급됩니다. 프로젝트 ID(`acme#12`)는 폴더 이름에서 오며, dsh에서 프로젝트 이름을 바꿔도 그대로입니다. "보드를 최신 상태로 유지" 규칙은 그 프로젝트에 열린 작업이 있을 때만 채팅에 들어갑니다. 한 번 받은 채팅은 규칙을 유지합니다. 에이전트에게는 **완료**, **백로그**, 수동 작업을 사용자에게 맡기라고 알리지만, 도구가 이를 거부하지는 않습니다. 에이전트가 그런 카드를 옮길 수도 있습니다. 기능이 켜져 있는 동안 보드 도구는 모든 채팅의 도구 목록에 들어갑니다(요청마다 약 1,000 토큰). 보드를 쓰지 않으면 끄세요. 페이지가 보이는 동안 2초마다 보드를 읽으므로, 에이전트의 변경은 그 시간 안에 표시됩니다. 에이전트가 같은 필드를 바꾸는 동안 사용자가 편집한 텍스트는 저장되지 않습니다. 패널에 새 텍스트와 이유가 표시됩니다. 이미지, 컴퓨터 간 git 동기화, 네트워크 공유는 없습니다(Kanzo에는 있습니다). 아이디어와 디자인은 emanuele-em의 [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0)에서 왔습니다. Composer Plus는 그 코드를 쓰지 않습니다.
|
|
233
252
|
- **중지 후 보낸 메시지 먼저 실행**은 채팅을 중지한 뒤에만 동작합니다(또는 실패한 턴 뒤, 아직 대기열이 있는 채팅을 열 때). 턴이 실행되는 중에 보낸 메시지는 여전히 대기열 끝에서 기다립니다. 내가 대기열에 넣은 메시지만 앞지릅니다. 대기열에 목표 라운드나 질문 답변이 기다리고 있으면 dsh 자체 순서가 유지됩니다. 공개 API가 아닌 dsh의 일부(중지된 턴이 아직 끝나는 중인지)를 읽습니다. dsh 업데이트로 그 이름이 바뀌면, 메시지는 그 턴이 끝난 뒤에만 앞으로 옮겨집니다. 서브에이전트 채팅은 dsh 자체 순서를 유지합니다.
|
|
234
|
-
- **프로젝트 메모리**는 채팅의 첫 폴더(dsh의 프로젝트 폴더)에 속합니다. `cd`로 폴더를 바꾼 채팅은 첫 프로젝트의 메모리를 계속 씁니다. 같은 파일로 가는 다른 경로로 연 같은 폴더는 메모리를 공유합니다. 채팅은 시작할 때 메모리 섹션을 고정하므로, 나중에 저장한 메모는 다음 채팅부터 보입니다(`memory_recall`은 바로 찾습니다). 검토는 모델이 남기기로 정한 것만 남깁니다. 사실을 놓치거나 틀린 것을 남길 수 있으니,
|
|
253
|
+
- **프로젝트 메모리**는 채팅의 첫 폴더(dsh의 프로젝트 폴더)에 속합니다. `cd`로 폴더를 바꾼 채팅은 첫 프로젝트의 메모리를 계속 씁니다. 같은 파일로 가는 다른 경로로 연 같은 폴더는 메모리를 공유합니다. 채팅은 시작할 때 메모리 섹션을 고정하므로, 나중에 저장한 메모는 다음 채팅부터 보입니다(`memory_recall`은 바로 찾습니다). 검토는 모델이 남기기로 정한 것만 남깁니다. 사실을 놓치거나 틀린 것을 남길 수 있으니, **메모리 열기**에서 확인하고 그곳에서 바꾸거나, dsh가 닫혀 있을 때 파일을 직접 고치세요. **메모리 열기**는 선택한 프로젝트의 메모와 전역 메모(모든 메모를 선택하면 모든 프로젝트, 최대 약 60,000자이며 나머지는 개수만 표시되고 그 요청에서는 바꿀 수 없음)와 사용자의 글을 채팅의 모델이 아니라 dsh의 기본 모델로 보냅니다. 미리 보기는 Mac에 30분 동안, dsh를 다시 시작할 때까지 보관됩니다. 그사이 검토나 에이전트가 메모를 바꾸면 **적용**이 거부되므로 다시 미리 보기를 하세요. **적용**은 미리 보기의 변경을 모두 저장하거나 하나도 저장하지 않습니다. 저장할 수 없는 변경이 하나라도 있으면(예: MEMORY.md가 가득 찬 경우) 메모는 그대로 남고 이유가 표시됩니다. 사용자 메시지가 있는 턴이 끝날 때마다 모델 호출이 한 번 듭니다. 호출이 실패하면 다음 턴 뒤에 같은 메시지를 다시 읽습니다. 서브에이전트 채팅은 검토하지 않습니다. 아이디어와 파일 형식은 [DS Bot](https://github.com/Fei2411/DS-Bot)(Apache-2.0)에서 왔습니다. Composer Plus는 그 코드를 쓰지 않으며, DS Bot 자체의 메모리를 읽거나 쓰지 않습니다.
|
|
235
254
|
- **백업**은 고정된 폴더 하나, `~/Desktop/dsh-backups`만 씁니다(dsh-backup의 기본 폴더이므로 그 아카이브도 계속 쓸 수 있습니다). 다른 폴더를 고르는 설정은 없습니다. 아카이브 크기는 `cache/`와 `dsh-runtimes/`를 뺀 dsh 홈과 거의 같습니다(측정: Apple Silicon에서 1.6 GB의 파일이 약 30초 만에 830 MB 아카이브가 되었고, 그동안 dsh는 계속 응답했습니다). 읽는 동안 바뀐 파일은 백업이 그 파일을 열었을 때의 상태로 저장됩니다. 그래서 열려 있는 채팅의 로그가 잘린 레코드로 끝날 수 있으며, dsh가 다음에 쓸 때 이를 복구합니다. 마스킹은 yml 파일의 비밀 값을 한 줄에 있는 키 이름(`token:`, `apiKey:`, …)으로 찾습니다. 플로 맵(`{token: x}`) 안, 그런 키 아래의 목록 안, JSON 파일 안(예: `.json` 파일에 있는 MCP 서버의 `apiKey`), 또는 다른 이름 아래에 있는 비밀 값은 아카이브에 남습니다. dsh-backup의 유형별 아카이브(`dsh-t-…`)는 목록에 나오지 않습니다. **다른 컴퓨터용**은 아카이브를 복사합니다(APFS에서는 클론이므로 추가 공간이 들지 않음). vault는 함께 복사되지 않습니다. **지금 백업**은 어떤 백업도 삭제하지 않습니다. 자동 백업은 Composer Plus가 만든 최신 백업을 보관하고(**자동 백업**의 **보관** 설정), 자신이 만든 더 오래된 백업을 삭제합니다. 업그레이드 전 스냅샷은 따로 셉니다(최신 2개가 남음). dsh-backup의 아카이브는 삭제되지 않습니다. **삭제**로 지우세요. dsh-backup이 아직 설치되어 있으면, dsh-backup은 Composer Plus 아카이브를 자기 보관 개수에 포함하며 그 아카이브를 삭제할 수 있습니다.
|
|
236
255
|
- **복원**은 dsh가 닫혀 있을 때 복구 콘솔에서만 실행되며, dsh 홈 전체를 바꿉니다. 기존 홈은 직접 삭제할 때까지 옆에 `.dsh.pre-restore-<time>`으로 남으므로, 디스크에 둘 다 들어갈 공간이 필요합니다. 채팅은 프로젝트 경로를 그대로 유지합니다. 다른 컴퓨터에서 다른 경로에 있는 프로젝트는 다시 추가할 때까지 없는 것으로 표시됩니다. dsh 홈 밖을 가리키는 심볼릭 링크(예: 다른 폴더에서 링크한 스킬)는 링크로 돌아오며, 그 대상은 그 컴퓨터에 있어야 합니다.
|
|
237
256
|
- **세션 로그 점검**은 무엇이 열리는지에 대한 dsh 자체 규칙으로 각 채팅의 최신 로그를 읽습니다. JSON이 아니거나 순서가 어긋난 행은 그 뒤에 턴 종료가 있을 때만 손상으로 칩니다(그렇지 않으면 dsh는 그 행부터의 내용을 빼고 채팅을 열기 때문에 목록에 나오지 않습니다). 로그의 이벤트를 dsh 자체의 이벤트 규칙과 비교하지는 않으므로, 정상으로 판정한 로그도 dsh 업그레이드 후에 열리지 않을 수 있습니다. 복구는 백업에서 사본을 가져옵니다. 그 백업 이후의 메시지는 그 채팅에서 사라집니다(손상된 파일은 옆에 남음). 이 dsh에서 열려 있는 채팅은 설정에서 복구되지 않습니다. dsh가 그 채팅을 잡고 있기 때문입니다.
|
|
@@ -264,7 +283,9 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
264
283
|
|
|
265
284
|
**loop engineering의 검증 루프처럼, 에이전트가 자기 작업을 스스로 완료로 표시하지 못하게 할 수 있나요?** 네, **목표 확인**(기본적으로 켜짐)으로 가능합니다. `/goal`로 목표를 시작하세요. 에이전트가 목표를 완료했다고 하면 프로젝트의 테스트가 실행되고, 독립적인 모델 호출이 채팅과 비교해 목표를 확인합니다. 둘 중 하나라도 실패하면 목표는 열린 상태로 남고 에이전트가 이유를 읽습니다. 목표 아래의 **목표 확인** 행에 있는 **편집**으로 직접 테스트 명령, 시간 제한, 토큰 제한을 정하세요.
|
|
266
285
|
|
|
267
|
-
**DS Bot의 메모리처럼 에이전트가 채팅이 바뀌어도 내 선호를 기억할 수 있나요?** 네, **프로젝트 메모리**(기본적으로 꺼짐)로 가능합니다. **설정 → Composer Plus**에서 켜세요. 턴이 끝날 때마다 오래 유지되는 선호와 결정이 채팅 프로젝트의 짧은 메모로 저장되고, 그 프로젝트의 새 채팅마다 이를 읽습니다. 에이전트에게 무언가를 기억하라고 하면 바로 저장합니다.
|
|
286
|
+
**DS Bot의 메모리처럼 에이전트가 채팅이 바뀌어도 내 선호를 기억할 수 있나요?** 네, **프로젝트 메모리**(기본적으로 꺼짐)로 가능합니다. **설정 → Composer Plus**에서 켜세요. 턴이 끝날 때마다 오래 유지되는 선호와 결정이 채팅 프로젝트의 짧은 메모로 저장되고, 그 프로젝트의 새 채팅마다 이를 읽습니다. 에이전트에게 무언가를 기억하라고 하면 바로 저장합니다. 메모를 보거나 바꾸려면 같은 줄의 **메모리 열기**를 누르고 바꿀 내용을 적으세요.
|
|
287
|
+
|
|
288
|
+
**Kanzo처럼 에이전트와 하나의 작업 보드를 함께 쓸 수 있나요?** 네, **작업 보드**(기본적으로 켜짐)로 가능합니다. 왼쪽 사이드바에서 열고 **새 작업**으로 작업을 추가하세요. 채팅에서 에이전트에게 "보드에서 다음 작업을 가져와"라고 하면, 에이전트가 카드를 **진행 중**으로 옮기고, 한 일을 댓글로 남긴 뒤 **검토**로 옮깁니다. 직접 할 작업은 **수동**으로 표시하세요.
|
|
268
289
|
|
|
269
290
|
**dsh-backup처럼 dsh에서 채팅과 설정을 백업할 수 있나요?** 네. **설정 → Composer Plus → 백업 → 지금 백업**을 사용하세요. 같은 아카이브 형식으로 같은 폴더(`~/Desktop/dsh-backups`)에 쓰므로, dsh-backup의 아카이브도 표시되고 복원할 수 있으며, dsh-backup은 삭제해도 됩니다. 정해진 일정으로 백업하려면 **자동 백업**을 켜세요.
|
|
270
291
|
|
|
@@ -290,6 +311,8 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
290
311
|
|
|
291
312
|
**한 채팅이 바꾼 파일만 보려면 어떻게 하나요?** 오른쪽 사이드바 → **변경 사항** → **이 채팅**. 공백만 바뀐 변경을 숨기려면 **␣**를 클릭하세요.
|
|
292
313
|
|
|
314
|
+
**에이전트가 `npm publish`나 `git push --force`를 실행하지 못하게 하려면 어떻게 하나요?** **설정 → Composer Plus → 차단된 명령**에서 `npm publish`를 입력하고 **차단** 또는 **먼저 묻기**를 고른 뒤 **추가**를 클릭하세요. **차단**은 명령을 거부하고 에이전트가 사용자에게 묻습니다. **먼저 묻기**는 매번 승인 카드를 표시합니다. 보호된 파일은 에이전트의 파일 도구를, 차단된 명령은 셸 명령을 다룹니다.
|
|
315
|
+
|
|
293
316
|
**한 채팅에서 자동 검토가 같은 도구를 계속 묻지 않게 하려면 어떻게 하나요?** 승인 카드에서 **이 채팅에서 허용**을 클릭하세요. 이 허용은 그 채팅의 그 도구에만 적용되며, 기본값은 1시간입니다. 헤더 칩에서 취소할 수 있습니다. 시간은 **설정 → Composer Plus → 이 채팅에서 허용**에서 바꿉니다.
|
|
294
317
|
|
|
295
318
|
**iPhone을 잃어버렸습니다. 그 iPhone이 Mac에 접속하지 못하게 하려면 어떻게 하나요?** 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하고, 그 iPhone 옆의 **Remove**를 클릭하세요. 그 iPhone의 키는 즉시 작동을 멈춥니다. 다시 연결하려면 Mac에서 승인하는 새 페어링이 필요합니다.
|
|
@@ -304,7 +327,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
304
327
|
|
|
305
328
|
**dsh 작업이 끝나거나 승인이 필요할 때 macOS / Windows 알림을 받으려면 어떻게 하나요?** **백그라운드 알림**을 켜 두세요(기본값). 그리고 OS 설정에서 DeepSeek Harness의 알림을 허용하세요.
|
|
306
329
|
|
|
307
|
-
**dsh가 질문하는 채팅을 스스로 열 수 있나요?** 네, **유휴 상태일 때 대기 중인 채팅 열기**(기본으로 켜짐)를 사용하세요. 채팅이 답변, 승인, 계획 검토를 기다리고 있을 때 30초 동안 dsh를 사용하지 않으면 dsh가 그 채팅을 엽니다. 입력하거나 스크롤하거나 마우스를 움직이는 동안에는 기다립니다.
|
|
330
|
+
**dsh가 질문하는 채팅을 스스로 열 수 있나요?** 네, **유휴 상태일 때 대기 중인 채팅 열기**(기본으로 켜짐)를 사용하세요. 채팅이 답변, 승인, 계획 검토를 기다리고 있을 때 30초 동안 dsh를 사용하지 않으면 dsh가 그 채팅을 엽니다. 아직 읽지 않은 턴을 마친 채팅(초록색 점)도 주황색 채팅 다음에 같은 방식으로 열립니다. 입력하거나 스크롤하거나 마우스를 움직이는 동안에는 기다립니다.
|
|
308
331
|
|
|
309
332
|
**DeepSeek Harness 인터페이스를 터키어, 스페인어, 일본어 등으로 바꾸려면 어떻게 하나요?** 설정 → Composer Plus → **애플리케이션 언어**.
|
|
310
333
|
|
|
@@ -318,6 +341,8 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
|
|
|
318
341
|
|
|
319
342
|
**iPhone에서 사진을 보낼 수 있나요?** 네. Tether 채팅에서 메시지 입력란 옆의 **+** → Camera, Photos(최대 4장) 또는 Paste image를 탭하세요. 사진은 메시지의 첨부 파일로 Mac의 채팅에 전달되므로 모델이 볼 수 있습니다.
|
|
320
343
|
|
|
344
|
+
**dsh가 모델에 다시 묻지 않고 다음 명령을 실행할 수 있나요?** 네, **계획된 단계**(기본적으로 꺼짐)를 사용하세요. 설정 → Composer Plus에서 켜세요. 그러면 모델이 조건과 함께 다음 명령을 계획할 수 있고(예: “빌드가 통과하면 테스트 실행”), 결과가 조건을 충족하면 Composer Plus가 새 모델 호출 없이 그 단계를 실행합니다. 승인과 샌드박스는 그대로입니다.
|
|
345
|
+
|
|
321
346
|
**데스크톱 앱에서도 작동하나요?** 네. 설정 → 플러그인 → **플러그인 추가** → `dsh-composer-plus`. dsh 0.2.0-rc.2(데스크톱과 웹)와 0.2.1-rc.2(웹)에서 테스트했습니다.
|
|
322
347
|
|
|
323
348
|
## 개발
|
|
@@ -343,6 +368,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
|
|
|
343
368
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
|
|
344
369
|
# Fit question card to window (fake model asks a long question at 1280 × 820): question, answers, Skip and Submit readable, height follows the window + its thumbnail
|
|
345
370
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-question-fit.mjs /path/to/dsh/lib/bin.js
|
|
371
|
+
# Fit chat header to window (fake model, subagent + background jobs, branch pill, grants chip): no overlap from 1280 to 320 px, wide header unchanged + its thumbnail
|
|
372
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-header-fit.mjs /path/to/dsh/lib/bin.js
|
|
346
373
|
# Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
|
|
347
374
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
|
|
348
375
|
# Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
|
|
@@ -380,6 +407,8 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
|
|
|
380
407
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
|
|
381
408
|
# Edit queued message in place with images and files (slow fake model) + its thumbnail
|
|
382
409
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
410
|
+
# Task board: the page, the agent tools (fake model), drag and drop, search, the switch
|
|
411
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
|
|
383
412
|
```
|
|
384
413
|
|
|
385
414
|
```sh
|