dsh-composer-plus 1.20.0 → 1.21.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.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.20.0`.
32
+ > dsh의 pnpm은 게시된 지 24시간이 지나지 않은 버전을 건너뜁니다. 릴리스 직후에는 버전을 붙여서 설치하세요: `dsh-composer-plus@1.21.0`.
33
33
 
34
34
  ## 기능
35
35
 
@@ -71,9 +71,21 @@ dsh plugin --profile web add dsh-composer-plus
71
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
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
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 채팅의 칸반 보드입니다. 승인, 답변 또는 계획 검토를 기다리는 채팅은 주황색 점과 함께 **검토**에, 실행 중인 채팅은 **진행 중**에, 끝난 채팅은 **완료**에 있습니다(열기 전까지 초록색). 왼쪽에서 프로젝트나 **모든 프로젝트**를 고르세요. 채팅별 브랜치 폴더는 해당 프로젝트로 취급됩니다. 목록 위의 **프로젝트 검색**에 입력하면 이름으로 프로젝트를 찾을 수 있습니다(대소문자와 악센트는 구분하지 않으며, `Esc`를 누르면 입력란이 비워집니다). **최근 2시간 내 활성**을 클릭하면 대기 중이거나 실행 중인 채팅, 확인하지 않은 채 끝난 채팅 또는 최근 2시간 안에 바뀐 채팅이 있는 프로젝트만 표시됩니다(이 설정은 이 기기에 저장됩니다). **새 작업**(또는 `n`)은 보드가 보여 주는 프로젝트에서 dsh 자체의 새 채팅을 엽니다(**모든 프로젝트**일 때는 dsh의 새 세션이 고르는 프로젝트). 그래서 다른 채팅에서처럼 파일을 추가하고, 명령을 쓰고, 모델을 고를 수 있습니다. 첫 메시지를 보내면 자동으로 보드로 돌아옵니다. 그때까지 채팅은 **할 일**에서 **새 작업**으로 기다립니다. 클릭해서 첫 메시지를 쓰세요. **할 일** 열은 이때만 표시됩니다. 응답을 기다리는 채팅이 있는 프로젝트에는 프로젝트 목록에서 주황색 점이 붙습니다. dsh가 채팅 이름을 짓고 채팅의 모델이 그 메시지에서 태그를 최대 3개 씁니다. 카드를 클릭하면 채팅이 열립니다. 주황색 카드에서 **답변**을 클릭하면 보드에서 바로 답할 수 있습니다. 승인 요청에는 **거부** 또는 **한 번 허용**, 계획에는 **승인** 또는 **변경 요청**, 질문에는 선택지와 직접 쓴 텍스트로 답합니다. **끝난 채팅 숨기기**는 이 기기에서 **완료**를 숨깁니다. **진행 중**의 카드를 가리키면(또는 키보드 포커스를 옮기면) 진행 상황을 볼 수 있습니다. 실행된 시간, 할 일 목록의 단계, 지금 실행 중인 도구, 에이전트의 마지막 줄이 표시됩니다. 설정 → Composer Plus → 작업 보드의 **마우스를 올리면 진행 상황 표시**에서 **빠름(AI 없음)**(기본값: 채팅만 읽음) 또는 **AI 요약**(채팅의 모델을 한 번 짧게 호출해 한두 문장도 씀)을 고릅니다. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="스크린샷: 작업 보드"></a> |
74
+ | **작업 보드** | <a id="feature-taskboard"></a>왼쪽 사이드바 → **작업 보드**. dsh 어디서나 `Cmd+Shift+K`(Windows와 Linux에서는 `Ctrl+Shift+K`)를 눌러도 열립니다. 사이드바와 같은 실시간 상태를 보여 주는 dsh 채팅의 칸반 보드입니다. 승인, 답변 또는 계획 검토를 기다리는 채팅은 주황색 점과 함께 **검토**에, 실행 중인 채팅은 **진행 중**에, 아직 열지 않은 끝난 채팅은 **완료**에 있습니다(초록색). 채팅을 열면 그 카드는 **완료**에서 저절로 빠집니다. 초록색 카드 아래의 **최근 완료 (N)**을 클릭하면 읽은 끝난 채팅을 볼 수 있습니다(최신 10개, 그다음 **이전 작업 N개 보기**; 열림/닫힘 상태는 이 기기에 저장됩니다). 보드 뒤에서 열린 채로 끝난 채팅(**새 작업**)은 열 때까지 초록색으로 남습니다. 보드 위쪽의 프로젝트 이름을 클릭하면 프로젝트 목록이 열립니다. 여기서 프로젝트나 **모든 프로젝트**를 고르세요. 채팅별 브랜치 폴더는 해당 프로젝트로 취급됩니다. 목록은 고른 뒤, `Esc`를 누르거나 목록 밖을 클릭하면 닫힙니다. 목록 맨 위의 **프로젝트 검색**에 입력하면 이름으로 프로젝트를 찾을 수 있습니다(대소문자와 악센트는 구분하지 않으며, `Esc`를 누르면 입력란이 비워집니다). `Enter`를 누르면 첫 번째로 일치하는 프로젝트가 선택됩니다. **최근 2시간 내 활성**을 클릭하면 대기 중이거나 실행 중인 채팅, 확인하지 않은 채 끝난 채팅 또는 최근 2시간 안에 바뀐 채팅이 있는 프로젝트만 표시됩니다(이 설정은 이 기기에 저장됩니다). **새 작업**(또는 `n`)은 보드가 보여 주는 프로젝트에서 dsh 자체의 새 채팅을 엽니다(**모든 프로젝트**일 때는 dsh의 새 세션이 고르는 프로젝트). 그래서 다른 채팅에서처럼 파일을 추가하고, 명령을 쓰고, 모델을 고를 수 있습니다. 첫 메시지를 보내면 자동으로 보드로 돌아옵니다. 그때까지 채팅은 **진행 중**의 맨 위에서 **새 작업**으로 기다립니다. 클릭해서 첫 메시지를 쓰세요. 응답을 기다리는 채팅이 있는 프로젝트에는 프로젝트 목록에서 주황색 점이 붙습니다(어느 채팅이든 기다리는 동안에는 위쪽 프로젝트 이름에도 붙습니다). dsh가 채팅 이름을 짓고 채팅의 모델이 그 메시지에서 태그를 최대 3개 씁니다. 카드를 클릭하면 채팅이 열립니다. 주황색 카드(또는 그 카드의 **답변**)를 클릭하면 보드에서 바로 답할 수 있습니다. 채팅 전체는 패널의 **채팅 열기**로 엽니다. 승인 요청에는 **거부** 또는 **한 번 허용**, 계획에는 **승인** 또는 **변경 요청**, 질문에는 선택지와 직접 쓴 텍스트로 답합니다. 끝난 카드에서 **×** 버튼을 클릭하면 그 카드를 보드에서 뺍니다. **최근 완료**를 열고 **완료** 맨 위의 **모두 빼기**를 클릭하면 그 카드들을 보드에서 뺍니다. 먼저 어느 프로젝트의 카드가 몇 개 빠지는지 보여 주며, 읽지 않은(초록색) 카드는 남습니다. 그 뒤 8초 동안 **실행 취소**를 누르면 카드가 돌아옵니다. **완료** 아래의 **뺀 카드 (N)**에는 보드에서 뺀 카드가 나열되고, **보드에 되돌리기**는 그중 하나를 다시 **완료**에 표시합니다. 채팅은 삭제되지 않습니다. 채팅은 dsh의 사이드바에 남고, 보드는 다시 시작한 뒤에도 이를 기억하며(Tether도 같은 보드를 보여 줍니다), 다시 실행되는 채팅은 보드로 돌아옵니다. **진행 중**의 카드를 가리키면(또는 키보드 포커스를 옮기면) 진행 상황을 볼 수 있습니다. 실행된 시간, 할 일 목록의 단계, 지금 실행 중인 도구, 에이전트의 마지막 줄이 표시됩니다. 설정 → Composer Plus → 작업 보드의 **마우스를 올리면 진행 상황 표시**에서 **빠름(AI 없음)**(기본값: 채팅만 읽음) 또는 **AI 요약**(채팅의 모델을 한 번 짧게 호출해 한두 문장도 씀)을 고릅니다. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="스크린샷: 작업 보드"></a> |
75
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> |
76
+ | **메모리 버전 기록** | <a id="feature-memoryhistory"></a>**프로젝트 메모리** 가 켜져 있는 동안 기본으로 켜집니다. 메모리를 저장할 때마다(에이전트, 턴 후 검토, **메모리 열기**) 저장 전 메모의 사본이 보관됩니다. **메모리 열기** 에서 프로젝트나 **전역 메모리** 를 선택한 다음 **기록** 을 누르면 날짜별 버전과 각 버전 뒤에 메모리를 바꾼 주체가 표시됩니다. 버전을 선택하면 복원 시 바뀌는 내용을 diff로 보고 **복원** 할 수 있습니다. 복원 전의 메모도 보관되므로 복원을 되돌릴 수 있습니다. 메모리마다 최신 50개 버전이 남습니다. Tether에서는: 채팅 제목 메뉴 → Project memory → History. | <a href="assets/features/memoryHistory.webp"><img src="assets/features/memoryHistory.webp" width="160" alt="스크린샷: 메모리 버전 기록"></a> |
77
+ | **메모리를 AGENTS.md로 내보내기** | <a id="feature-memoryexport"></a>**메모리 열기** 에서 프로젝트를 선택한 다음 **AGENTS.md로 내보내기** 를 누르면 그 프로젝트의 메모가 폴더의 `AGENTS.md` 에 있는 표시된 섹션에 기록됩니다. 커밋해서 팀이나 다른 에이전트 도구와 공유할 수 있습니다. 먼저 변경 내용을 diff로 보고, **AGENTS.md 쓰기** 를 눌러야만 저장됩니다. 다음 내보내기는 이 섹션만 바꿉니다. 전역 메모리, 출처, 날짜는 넣지 않습니다. Tether에서는: 채팅 제목 메뉴 → Project memory → Export to AGENTS.md. | <a href="assets/features/memoryExport.webp"><img src="assets/features/memoryExport.webp" width="160" alt="스크린샷: 메모리를 AGENTS.md로 내보내기"></a> |
78
+ | **메모리 메모 출처 링크** | <a id="feature-memorysource"></a>**메모리 열기** 에서 채팅에서 온 메모(에이전트가 저장했거나, 턴 후 검토가 남겼거나, 내가 수락한 제안) 옆에는 **출처** 가 있습니다. 누르면 그 채팅이 해당 메시지 위치에서 열리므로, 메모를 바꾸거나 지우기 전에 왜 있는지 확인할 수 있습니다. 이전 버전의 메모는 채팅만 엽니다. Tether에서는: 채팅 제목 메뉴 → Project memory → Source. | <a href="assets/features/memorySource.webp"><img src="assets/features/memorySource.webp" width="160" alt="스크린샷: 메모리 메모 출처 링크"></a> |
79
+ | **메모리를 다른 프로젝트로 복사** | <a id="feature-memorycopy"></a>**메모리 열기** 에서 프로젝트나 **전역 메모리** 를 선택한 다음 **프로젝트로 복사** 를 누르세요. 메모를 선택하고 dsh 프로젝트를 검색해 하나를 클릭하면, 선택한 메모가 모두(주제와 출처 포함) 그 프로젝트의 메모리로 복사되거나 하나도 복사되지 않습니다. 하나라도 들어가지 않으면 아무것도 복사하지 않고 이유를 보여 줍니다. 프로젝트에 이미 있는 메모는 건너뜁니다. Tether에서는: 채팅 제목 메뉴 → Project memory → Copy to project. | <a href="assets/features/memoryCopy.webp"><img src="assets/features/memoryCopy.webp" width="160" alt="스크린샷: 메모리를 다른 프로젝트로 복사"></a> |
80
+ | **오래된 메모리 메모 찾기** | <a id="feature-memorystale"></a>**메모리 열기** 에서 프로젝트를 선택하면, 메모에 적힌 파일 경로(`코드` 안), npm 스크립트, 브랜치 이름을 현재 프로젝트와 대조합니다. 프로젝트에 더 이상 없는 것을 적은 메모에는 ⚠ 와 없는 항목이 표시되므로, 모델이 그것으로 작업하기 전에 고치거나 지울 수 있습니다. 프로젝트 폴더 안의 일반 파일과 git 브랜치 목록 하나만 읽으며, 아무것도 바꾸지 않고 모델도 호출하지 않습니다. Tether에서는: 채팅 제목 메뉴 → Project memory. | <a href="assets/features/memoryStale.webp"><img src="assets/features/memoryStale.webp" width="160" alt="스크린샷: 오래된 메모리 메모 찾기"></a> |
81
+ | **이 채팅에서는 메모리 사용 안 함** | <a id="feature-memoryperchat"></a>**프로젝트 메모리** 가 켜져 있으면 채팅 헤더에 **메모리 켬** 이 표시됩니다. 누르면 그 채팅에서만 메모리가 꺼집니다(**메모리 끔**). 그러면 그 채팅의 모델은 메모리 섹션과 메모리 도구를 받지 않고, 턴 후 검토도 그 채팅을 읽지 않습니다. dsh 0.2.1 이상에서는 새 채팅 화면에도 같은 버튼이 있어 테스트 채팅을 메모리 없이 시작할 수 있습니다. 다른 채팅은 바뀌지 않습니다. Tether에서는: 채팅 제목 메뉴 → Use project memory. | <a href="assets/features/memoryPerChat.webp"><img src="assets/features/memoryPerChat.webp" width="160" alt="스크린샷: 이 채팅에서는 메모리 사용 안 함"></a> |
82
+ | **채팅에서 메모리 메모 제안** | <a id="feature-memorysuggest"></a>**프로젝트 메모리** 가 켜져 있으면 채팅 헤더에 **메모리에 제안** 이 있습니다. 누르면 이 채팅에서 다음 채팅을 위해 남길 만한 규칙과 결정을 채팅의 모델에 묻습니다. 제안마다 이유가 표시되며, **수락** 은 원래 채팅과 메시지 링크와 함께 저장하고 **거부** 는 버립니다. 수락하기 전에는 아무것도 저장되지 않으며 모델은 클릭할 때만 호출됩니다. 롤백으로 철회된 메시지는 보내지 않습니다. Tether에서는: 채팅 제목 메뉴 → Suggest for memory. | <a href="assets/features/memorySuggest.webp"><img src="assets/features/memorySuggest.webp" width="160" alt="스크린샷: 채팅에서 메모리 메모 제안"></a> |
76
83
  | **이 채팅에서 허용** | <a id="feature-allowforchat"></a>자동 검토가 확인을 요청하면 승인 카드에 **이 채팅에서 허용**이 추가됩니다. 이후 같은 채팅의 같은 도구는 인수와 관계없이 시간 제한이 끝날 때까지 허용됩니다(기본값 1시간. **설정 → Composer Plus → 이 채팅에서 허용**에서 고릅니다). 그 후에는 에이전트가 다시 묻습니다. 헤더 칩에서 허용 목록과 종료 시각을 보고 취소할 수 있습니다. 허용은 재시작 후에도 유지됩니다. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="스크린샷: 이 채팅에서 허용"></a> |
84
+ | **메모와 함께 거부** | <a id="feature-rejectnote"></a>승인 카드의 **거부** 옆에 **메모와 함께 거부…**가 나타납니다. 클릭하고 이유나 대신 할 일을 쓴 다음 **거부**를 클릭하세요(또는 `Enter`, `Shift+Enter`는 줄 바꿈, `Esc`는 입력란 닫기). 메모가 먼저 대기 중인 턴에 메시지로 에이전트에게 전달된 뒤 요청이 거부되므로, 모델은 같은 턴에서 거부와 메모를 함께 읽습니다. 메시지를 따로 보낼 필요가 없습니다. 메모를 보내지 못하면 아무것도 거부되지 않고 입력란은 열린 채로 남습니다. Tether에서는: 승인 시트 → Reject with note. | <a href="assets/features/rejectNote.webp"><img src="assets/features/rejectNote.webp" width="160" alt="스크린샷: 메모와 함께 거부"></a> |
85
+ | **비밀 값 입력** | <a id="feature-secretinput"></a>에이전트는 `request_secret` 도구를 받습니다. 비밀번호, 토큰, API 키가 필요하면 채팅에서 묻는 대신 이 도구로 요청합니다. 도구 행에 이름, 값이 필요한 이유, 비밀번호 입력란, **저장**과 **거부**가 있는 카드가 표시됩니다. **저장**하면 값은 이 Mac에서 본인만 읽을 수 있는 파일에 쓰이고, 에이전트는 파일 경로만 받아 명령의 입력으로 사용합니다(예: `"$(cat <path>)"`). 이후 도구 결과에 값이 나타나면 모델이 보기 전에 `[secret]`으로 바뀝니다. 파일은 턴이 끝나면 삭제됩니다. **거부**하면 에이전트에게 값을 주지 않았다고 알립니다. 도구를 없애려면 **설정 → Composer Plus**에서 끄세요. Tether에서는 입력란 위의 "Secret: …" 막대 → Enter. | <a href="assets/features/secretInput.webp"><img src="assets/features/secretInput.webp" width="160" alt="스크린샷: 비밀 값 입력"></a> |
86
+ | **답장에 인용** | <a id="feature-quotereply"></a>답변의 일부를 선택하면 선택 영역 위에 **인용** 버튼이 나타납니다. 클릭하면 그 부분이 Markdown 인용(`> …`)으로 입력란의 커서 위치에 들어가고 뒤에 빈 줄이 추가되며, 입력란에 포커스가 가므로 그 아래에 답장을 쓰면 됩니다. 답변 본문만 해당되며 생각 과정, 도구 행, 본인 메시지는 해당되지 않습니다. 인용은 최대 2,000자입니다. `Cmd+Z`(`Ctrl+Z`)로 되돌릴 수 있습니다. Tether에서는 답변을 길게 누름 → Quote(답변 전체). | <a href="assets/features/quoteReply.webp"><img src="assets/features/quoteReply.webp" width="160" alt="스크린샷: 답장에 인용"></a> |
87
+ | **사이드 채팅** | <a id="feature-sidechat"></a>입력란에 사이드 질문을 입력하고 말풍선 버튼(**사이드 채팅에서 질문**)을 클릭하세요. 채팅의 복사본이 열리고 dsh의 읽기 전용 모드로 답하며, 원래 채팅은 계속 작업합니다. 복사본은 지금까지의 채팅을 알지만 대기열에서 아직 기다리는 메시지는 모르며, 같은 모델을 사용합니다. 복사본 입력란 위의 막대에 **가져오기**가 있습니다. 누르면 원래 채팅이 열리고 그 입력란에 질문(`> ` 인용)과 답변이 들어갑니다. **채팅으로 돌아가기**는 원래 채팅만 엽니다. 사이드 채팅은 사이드바에 "↳ <질문>"으로 남으니 거기서 보관하세요. Tether에서: 채팅 제목 메뉴 → Side chat…. | <a href="assets/features/sideChat.webp"><img src="assets/features/sideChat.webp" width="160" alt="스크린샷: 사이드 채팅"></a> |
88
+ | **diff 메모** | <a id="feature-diffcomments"></a>**변경 사항 패널**에서 파일의 diff를 열고 줄의 **+**를 클릭하세요(범위는 같은 블록의 두 번째 줄을 Shift+클릭). 메모를 쓰고 **메모 저장**을 클릭합니다. 채팅의 메모는 패널 위쪽 막대에서 기다리며, **입력란으로 보내기**를 누르면 입력란의 커서 위치에 Markdown으로 들어갑니다: `path:12-14`, `diff` 블록으로 된 줄, 메모. **지우기**는 메모를 버립니다. 메모는 보내거나 지울 때까지 이 브라우저에 남습니다. **변경 사항 패널**이 필요합니다. Tether에서: 파일의 diff → 줄을 길게 누르기 → Add note…. | <a href="assets/features/diffComments.webp"><img src="assets/features/diffComments.webp" width="160" alt="스크린샷: diff 메모"></a> |
77
89
  | **프로젝트 상태** | <a id="feature-projectstatus"></a>사이드바의 프로젝트 행에 그 채팅과 같은 실행 중 / 대기 중 / 완료 표시가 나타납니다. 그래서 접힌 프로젝트도 안의 채팅이 작업 중인지, 사용자의 조치가 필요한지 알려 줍니다. 사용자의 조치를 기다리는 채팅이 먼저 표시되고, 그다음 아직 열지 않은 완료된 채팅(초록색 점, 다른 채팅이 아직 실행 중일 때도 표시), 마지막으로 실행 중 표시가 나타납니다. 포인터를 올리면 자세한 내용이 보입니다. **작업 공간 트리**에서는 상위 폴더의 행에도 그 안에 있는 각 프로젝트(예: `.worktrees/` 안의 각 브랜치 폴더)의 채팅 상태가 표시되며, 폴더가 접혀 있을 때도 마찬가지입니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="스크린샷: 프로젝트 상태"></a> |
78
90
  | **채팅 행의 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> |
79
91
  | **모두 읽음으로 표시** | <a id="feature-markprojectread"></a>사이드바에서 프로젝트의 **…** 버튼 → **모두 읽음으로 표시**를 클릭하세요. 그 프로젝트의 모든 채팅에서 초록색 읽지 않음 점이 한 번에 사라집니다. 다른 프로젝트의 점은 그대로 남습니다. 프로젝트에 읽지 않은 채팅이 없으면 이 항목은 회색으로 표시됩니다(**읽지 않은 채팅 없음**). | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="스크린샷: 모두 읽음으로 표시"></a> |
@@ -83,8 +95,11 @@ dsh plugin --profile web add dsh-composer-plus
83
95
  | **상태별 정렬** | <a id="feature-statusorder"></a>사이드바 → 보기 옵션 → **정렬 기준** → **상태별**(**하나의 목록**과 함께 사용). 완료된 채팅이 먼저 옵니다(dsh의 “완료” 점. 오류로 끝난 턴에도 이 점이 붙습니다). 그다음 실행 중이거나 대기 중인 채팅, 활성 자동화(예약)가 있는 채팅, 나머지 채팅이 dsh 순서대로 옵니다. 완료된 채팅을 열면 아래로 이동합니다. 보기만 바뀝니다. 원래대로 돌아가려면 **수동** 또는 **마지막 업데이트**를 선택하세요. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="스크린샷: 상태별 정렬"></a> |
84
96
  | **백그라운드 알림** | <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> |
85
97
  | **유휴 상태일 때 대기 중인 채팅 열기** | <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> |
98
+ | **다음 대기 중인 채팅** | <a id="feature-nextwaiting"></a>사이드바 헤더의 버튼에 나를 기다리는 다른 채팅 수와 다음 채팅의 색 점이 표시됩니다. 질문을 하거나 승인 또는 계획 검토를 기다리면 주황색, 아직 읽지 않은 턴을 마쳤으면 초록색입니다. 버튼을 클릭하거나 Cmd+Shift+E(Windows와 Linux에서는 Ctrl+Shift+E)를 누르면 그 채팅이 열립니다. 주황색 채팅이 초록색 채팅보다 먼저이고, 각 그룹에서는 가장 오래 기다린 채팅이 먼저입니다. 화면에 열린 채팅은 세지 않습니다. 기다리는 다른 채팅이 없으면 버튼이 표시되지 않고 키도 아무 동작을 하지 않습니다. 키는 dsh의 키보드 단축키 페이지(다음 대기 중인 채팅)에서 바꿀 수 있습니다. | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="스크린샷: 다음 대기 중인 채팅"></a> |
99
+ | **선택지 버튼** | <a id="feature-optionpicks"></a>답변이 선택지 목록("선택지" 제목 또는 굵은 "선택지" 줄 아래의 1~9개 번호 목록, "다음 단계"와 앱 언어의 같은 단어도 포함)으로 끝나면 답변 아래에 선택지마다 버튼이 표시됩니다. 클릭하면 선택지 전체가 담긴 "Option N: …"이 직접 입력한 것처럼 내 메시지로 전송됩니다. "(권장)" 표시가 있는 선택지는 강조됩니다. 버튼은 최신 답변 아래에만, 채팅이 대기 중이고 입력란이 비어 있을 때 표시되며, 이미 선택한 답변과 롤백으로 철회된 답변에는 표시되지 않습니다. 버튼이 표시되는 동안 다음 메시지 예측은 추측을 보여 주지 않습니다. 에이전트의 질문 카드에서는 1–9 키가 클릭과 같이 해당 선택지를 고릅니다(답변 입력란 안과 질문이 나타난 뒤 처음 0.8초 동안은 제외). | <a href="assets/features/optionPicks.webp"><img src="assets/features/optionPicks.webp" width="160" alt="스크린샷: 선택지 버튼"></a> |
86
100
  | **애플리케이션 언어** | <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> |
87
101
  | **모바일 연결(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> |
102
+ | **원격 컴퓨터** | <a id="feature-remotecomputers"></a>[Tailscale](https://tailscale.com)을 통해 다른 Mac의 dsh를 열고, 그 채팅을 여기서 이어 가세요. 각 Mac의 **설정 → Composer Plus**에서 켜세요(네트워크 포트를 열기 때문에 기본적으로 꺼져 있습니다). 열려는 Mac에서 **다른 컴퓨터에서 이 Mac 열기 허용**을 켜고, **페어링 링크 만들기**를 클릭한 뒤 링크를 복사하세요. 이 Mac에서는 채팅 제목 왼쪽의 컴퓨터 선택 메뉴에서 **컴퓨터 추가…** 항목을 고르고, 링크를 붙여 넣은 뒤 **연결**을 클릭하세요. 그다음 다른 Mac에서 **승인**을 클릭하세요. 이제 선택 메뉴에 **이 Mac**과 내 컴퓨터들이 표시됩니다. 하나를 고르면 그 컴퓨터의 dsh가 오른쪽 사이드바의 브라우저 탭(또는 브라우저 창)에서 열리며, 그 컴퓨터의 채팅, 도구, 파일을 그대로 쓸 수 있습니다. 설정 패널에서 컴퓨터의 이름을 바꾸거나 제거할 수 있고, 이 Mac을 열 수 있는 컴퓨터 목록도 볼 수 있습니다(**제거**를 누르면 그 컴퓨터의 연결이 즉시 끊깁니다). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="스크린샷: 원격 컴퓨터"></a> |
88
103
  | **자동 업데이트** | <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> |
89
104
  | **백업** | <a id="feature-backup"></a>설정 → Composer Plus → **백업** → **지금 백업**은 dsh 홈 전체(채팅, 설정, 플러그인, MCP, 스킬)를 체크섬과 함께 `~/Desktop/dsh-backups`의 아카이브 하나에 씁니다. 아카이브에서 비밀 값은 마스킹됩니다. 자격 증명 파일, 키 파일(`.pem`, `.key`), yml 설정의 token, secret, password 값은 이 컴퓨터에만, 폴더의 `vault`에 남습니다. `cache/`, `dsh-runtimes/`, `node_modules`는 아카이브에 들어가지 않습니다(dsh가 다시 만듭니다). 목록의 각 백업에는 **검사**(끝까지 읽음), **다른 컴퓨터용**(새 컴퓨터로 복사할 폴더, 복구 콘솔 포함), **삭제**가 있습니다. 같은 폴더에 있는 dsh-backup의 아카이브도 표시되고 사용할 수 있습니다. 복원하려면 dsh를 종료하고 복구 콘솔을 사용하세요. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="스크린샷: 백업"></a> |
90
105
  | **자동 백업** | <a id="feature-autobackup"></a>**자동 백업**을 켜세요(기본적으로 꺼져 있습니다. 각 사본은 캐시를 뺀 dsh 홈과 크기가 거의 같습니다). 얼마나 자주 백업할지(**간격**: 6시간에서 7일, 기본값 24시간)와 백업을 몇 개 남길지(**보관**: 3에서 14, 기본값 7)를 고르세요. 다음 백업 시각은 스위치 아래에 표시됩니다. 실패한 백업도 그곳에 표시되고, 30분 뒤에 다시 시도합니다. dsh나 Composer Plus가 새 버전으로 시작하면, 시작 직후 새 버전이 데이터를 오래 쓰기 전에 스냅샷을 만듭니다(가장 최신 두 개가 남고, **업그레이드 전**으로 표시됩니다). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="스크린샷: 자동 백업"></a> |
@@ -137,6 +152,9 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
137
152
  | Mac에서는 `Cmd+F`, Windows와 Linux에서는 `Ctrl+F` | 열린 채팅 | **채팅에서 찾기** 열기 |
138
153
  | `Enter` / `Shift+Enter`, `↓` / `↑` | **채팅에서 찾기** 상자 | 다음 / 이전 일치 항목 |
139
154
  | `Esc` | **채팅에서 찾기** 상자 | 상자 닫기 |
155
+ | Mac에서는 `Cmd+Shift+E`, Windows와 Linux에서는 `Ctrl+Shift+E` | dsh 어디서나 | **다음 대기 중인 채팅** 열기(dsh의 키보드 단축키 페이지에서 변경 가능) |
156
+ | Mac에서는 `Cmd+Shift+K`, Windows와 Linux에서는 `Ctrl+Shift+K` | dsh 어디서나 | **작업 보드** 열기(dsh의 키보드 단축키 페이지에서 변경 가능) |
157
+ | `1`–`9` | dsh의 질문 카드(답변 입력란 안 제외) | 해당 선택지 고르기(**선택지 버튼**) |
140
158
 
141
159
  `/` 또는 `@` 메뉴가 열려 있으면 이 키는 메뉴가 사용합니다.
142
160
 
@@ -162,17 +180,20 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
162
180
  - **이 채팅에서 허용:** 허용 항목은 허용한 시각과 함께 `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json`(소유자 전용 권한)에 저장됩니다. 허용 하나는 한 채팅의 정확히 한 도구에만 적용되며, 시간 제한이 끝날 때까지 유효합니다(기본값 1시간). 그 도구가 쓰기를 할 수 있다면, 허용은 모든 쓰기에도 적용됩니다. 헤더 칩에서 취소하세요.
163
181
  - 자동 검토는 여전히 모든 호출에서 실행됩니다. 검토가 실패한 호출은 절대 자동으로 허용되지 않습니다.
164
182
  - **모바일 연결:** 켜기 전까지 꺼져 있습니다. 켜져 있는 동안 Host 쪽이 Tether 게이트웨이를 실행합니다. 게이트웨이는 두 부분입니다. 포트 19390의 HTTPS는 Wi-Fi 서브넷과 tailnet(100.64.0.0/10)의 연결만 받고, `127.0.0.1:19391`의 페어링 페이지는 이 Mac에서만 열립니다. 휴대폰을 연결하려면 QR 코드의 일회용 코드(5분 유효)와 Mac에서의 **Approve**가 필요합니다. 휴대폰은 게이트웨이 인증서를 고정(pinning)합니다. Mac은 각 휴대폰 토큰의 해시만 보관합니다(30일, 사용하는 동안 갱신). **Remove**를 누르면 그 휴대폰의 연결이 즉시 끊깁니다. 휴대폰은 허용 목록에 있는 dsh 메서드(채팅, 프롬프트, 첨부 파일, 슬래시 명령, 승인, 질문, 모델, 에이전트, 목표)만 호출할 수 있습니다. 설정, 자격 증명, 파일 브라우저, 터미널은 호출할 수 없습니다. "Tailscale only"는 로컬 네트워크에서 오는 모든 연결을 거부하며, 이미 열린 연결도 끊습니다. 액세스 로그는 가장 최근의 연결 시도 200개(시각, IP 주소, 기기 이름, 허용 또는 거부, 그 이유)를 `access.json`에 보관합니다. 토큰이나 페어링 코드는 절대 보관하지 않습니다. 데이터: `$DSH_HOME/storages/dsh-composer-plus/mobile/`(소유자 전용 파일). 자세한 내용: [tether/README.md](tether/README.md).
183
+ - **원격 컴퓨터:** 각 Mac에서 켜기 전까지 꺼져 있습니다. **다른 컴퓨터에서 이 Mac 열기 허용**은 두 번째 HTTPS 포트(19392)를 이 Mac의 Tailscale 주소에서만 엽니다(Wi-Fi에서는 열지 않고, Bonjour로 알리지도 않습니다). 다른 Mac이 연결하려면 일회용 페어링 링크(5분 유효), 일치하는 인증서(고정), 그리고 내가 누르는 **승인**이 필요합니다. 이 Mac은 그 토큰의 해시만 보관합니다. 페어링된 컴퓨터는 이 Mac의 dsh를 여기서 쓰는 것처럼 완전히 제어합니다. 채팅, 모델, 도구, 파일, 터미널도 포함됩니다. 설정 패널에서 그 컴퓨터를 제거하면 연결이 즉시 끊깁니다. 다른 Mac을 여는 Mac은 그 컴퓨터의 토큰을 `$DSH_HOME/storages/dsh-composer-plus/computers.json`(소유자 전용)에 보관합니다. 고른 컴퓨터마다 `127.0.0.1`에 릴레이를 엽니다. 페이지는 일회용 링크(60초 유효)를 받고, 릴레이는 자기 페이지(자기 주소)만 받으며 다른 사이트는 받지 않습니다. 다른 Mac이 연 페이지에는 컴퓨터 선택 메뉴가 표시되지 않으며, 그 페이지는 이 Mac의 컴퓨터 목록을 바꿀 수 없습니다.
165
184
  - **업데이트:** Host 쪽은 `api.github.com`에 최신 릴리스를 묻고, `registry.npmjs.org`에 그 정확한 버전을 묻습니다. 사용자나 채팅에 관한 정보는 보내지 않습니다. 설치는 dsh의 플러그인 관리자(`pnpm add dsh-composer-plus@<version>`. 이미 설치된 플러그인에 대해 dsh 0.2.1이 이를 거부하면 `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`를 쓰며, 그 후 프로필에는 그 URL이 플러그인의 소스로 표시됩니다)를 쓰므로, dsh 자체의 레지스트리, 스크립트, 버전 호환성 검사가 적용됩니다. 사전 릴리스 태그와 더 오래된 버전은 절대 설치하지 않습니다.
185
+ - **사용 수 집계:** Host 쪽은 하루에 한 번 GitHub에 설치된 버전의 릴리스에 있는 작은 파일 `active.txt`(`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/active.txt`)를 요청합니다. GitHub는 이 요청을 파일별로 세므로, 작성자는 그날 각 버전의 사본 몇 개가 요청했는지만 봅니다. 요청에는 ID, 쿠키, 사용자나 채팅에 관한 데이터가 없습니다. 업데이트 확인 때와 마찬가지로 GitHub는 IP 주소를 봅니다. 마지막 요청 날짜는 `$DSH_HOME/storages/dsh-composer-plus/active.json`에 저장됩니다. 이 저장소의 git 체크아웃과 이름을 바꾼 사본은 아무것도 보내지 않습니다. 이 기능에는 스위치가 없습니다.
166
186
  - **다음 메시지 예측:** 기본적으로 켜져 있습니다. 이 모델 호출을 막으려면 **설정 → Composer Plus**에서 끄세요. 턴이 끝날 때마다 Host 쪽은 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론 제외)을 최대 약 6,000자(가장 최근 부분)까지 고른 모델(다른 모델을 고르지 않으면 dsh의 기본 모델)에 보냅니다. dsh 자체 제공자 설정을 거쳐 요청 한 번으로 전달됩니다. 채팅에는 아무것도 저장되지 않으며, 예측은 채팅 기록에 추가되지 않습니다. 스위치와 고른 모델은 `$DSH_HOME/storages/dsh-composer-plus/predict.json`(소유자 전용 파일)에 보관됩니다.
167
187
  - **입력 중 자동 완성:** 켜기 전까지 꺼져 있습니다. 켜져 있는 동안 입력을 멈출 때마다 Host 쪽은 지금까지 입력한 텍스트와, 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론 제외)을 채팅 기준 최대 약 3,000자까지 **입력 중 자동 완성**에서 고른 모델(기본값: **다음 메시지 예측**의 모델)에 보냅니다. 입력을 다시 멈추면 이전 요청은 중지됩니다. 채팅에는 아무것도 저장되지 않습니다. 스위치는 `$DSH_HOME/storages/dsh-composer-plus/complete.json`(소유자 전용 파일)에 보관됩니다.
168
188
  - **프롬프트 개선:** 요술봉을 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽은 초안, 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론, 되돌린 메시지 제외. 최대 약 6,000자, 가장 최근 부분), **기능 아이디어**와 같은 프로젝트 요약(파일 규칙도 같음: `.env*`나 키 파일 없음, 폴더 밖을 가리키는 심볼릭 링크 없음, FIFO 없음), `git status`가 변경됨으로 표시하는 경로, 이름에 초안과 같은 단어가 들어 있는 추적되거나 추적되지 않는(무시되지 않은) 경로 최대 30개를 **프롬프트 개선**에서 고른 모델(기본값: 채팅 자체의 모델)에 요청 한 번으로 보냅니다. 이 요약 외의 파일 내용은 보내지 않습니다. 채팅과 프로젝트에는 아무것도 쓰지 않습니다. 답변은 입력란의 초안을 바꿀 뿐이며, 보낼지는 사용자가 정합니다. 고른 모델은 `$DSH_HOME/storages/dsh-composer-plus/improve.json`(소유자 전용 파일)에 보관됩니다.
169
189
  - **목표 확인:** 에이전트가 자동 라운드에서 `/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개)에 보관됩니다.
170
190
  - **새 채팅에서 계속:** 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽은 채팅(목표 확인이 읽는 방식과 같음: 추론과 되돌린 단계 제외)을 채팅 자체의 모델에 보내고 인계 메모를 보여 줍니다. 새 채팅을 만드는 것은 **새 채팅 시작**뿐입니다. 프로젝트에는 아무것도 쓰지 않습니다.
171
191
  - **컨텍스트 구성:** Host에서 채팅 로그만 읽습니다. 모델 호출도 프로젝트 파일도 없습니다.
172
- - **작업 보드:** 보드는 이 창에 있는 dsh 자체 목록에서 dsh 자체 채팅을 보여 주며, 자체 채팅 데이터를 추가하지 않습니다. **새 작업**은 dsh 자체의 새 채팅을 열고, 첫 메시지는 사용자가 dsh의 입력란에 씁니다. 그래서 승인, 샌드박스, 채팅의 모델이 평소처럼 적용됩니다. Host 쪽은 그 채팅의 첫 메시지를 카드의 프롬프트로 보관하고, 태그를 최대 3개 얻기 위해 그 메시지(처음 4,000자만, 다른 것은 없음)를 도구 없이 요청 한 번으로 그 채팅의 모델에 더 보냅니다. 각 작업의 프롬프트, 태그, 시작 시각은 `$DSH_HOME/storages/dsh-composer-plus/board-chats.json`(소유자 전용 파일, 최신 2,000개)에 보관됩니다. 스위치는 그 옆의 `board-switch.json`에 있습니다. 프로젝트 폴더에는 아무것도 쓰지 않습니다. **답변**은 채팅 자체의 카드와 같은 방식으로 dsh 자체의 대기 중인 요청에 답변을 보냅니다. 이전 버전의 예전 작업 목록(`board.json`)은 디스크에 그대로 남으며 읽지 않습니다. **마우스를 올리면 진행 상황 표시**는 이 Mac에서 채팅 로그를 읽습니다. **빠름(AI 없음)**(기본값)에서는 아무것도 보내지 않습니다. **AI 요약**에서는 실행 중인 카드의 진행 상황 상자가 보이는 동안(또는 Tether의 보드가 열려 있는 동안, 실행 중인 카드 최대 8개에 대해) Host 쪽이 그 채팅의 가장 최근 부분(최대 약 6,000자: 사용자 메시지, 에이전트의 텍스트 답변, 도구 호출과 그 결과의 끝부분. 추론과 되돌린 메시지는 제외)을 도구 없는 요청 한 번으로 채팅의 모델에 보냅니다. 채팅이 진행된 뒤에만 다시 보내며, 채팅마다 최대 20초에 한 번입니다. 메모는 메모리에만 보관됩니다. 설정은 `$DSH_HOME/storages/dsh-composer-plus/board-progress.json`(소유자 전용 파일)에 있습니다.
192
+ - **작업 보드:** 보드는 이 창에 있는 dsh 자체 목록에서 dsh 자체 채팅을 보여 주며, 자체 채팅 데이터를 추가하지 않습니다. **새 작업**은 dsh 자체의 새 채팅을 열고, 첫 메시지는 사용자가 dsh의 입력란에 씁니다. 그래서 승인, 샌드박스, 채팅의 모델이 평소처럼 적용됩니다. Host 쪽은 그 채팅의 첫 메시지를 카드의 프롬프트로 보관하고, 태그를 최대 3개 얻기 위해 그 메시지(처음 4,000자만, 다른 것은 없음)를 도구 없이 요청 한 번으로 그 채팅의 모델에 더 보냅니다. 각 작업의 프롬프트, 태그, 시작 시각은 `$DSH_HOME/storages/dsh-composer-plus/board-chats.json`(소유자 전용 파일, 최신 2,000개)에 보관됩니다. **×** 버튼이나 **모두 빼기**로 보드에서 뺀 채팅의 ID(최신 5,000개)도 이 파일에 보관됩니다. 스위치는 그 옆의 `board-switch.json`에 있습니다. 프로젝트 폴더에는 아무것도 쓰지 않습니다. **답변**은 채팅 자체의 카드와 같은 방식으로 dsh 자체의 대기 중인 요청에 답변을 보냅니다. 이전 버전의 예전 작업 목록(`board.json`)은 디스크에 그대로 남으며 읽지 않습니다. **마우스를 올리면 진행 상황 표시**는 이 Mac에서 채팅 로그를 읽습니다. **빠름(AI 없음)**(기본값)에서는 아무것도 보내지 않습니다. **AI 요약**에서는 실행 중인 카드의 진행 상황 상자가 보이는 동안(또는 Tether의 보드가 열려 있는 동안, 실행 중인 카드 최대 8개에 대해) Host 쪽이 그 채팅의 가장 최근 부분(최대 약 6,000자: 사용자 메시지, 에이전트의 텍스트 답변, 도구 호출과 그 결과의 끝부분. 추론과 되돌린 메시지는 제외)을 도구 없는 요청 한 번으로 채팅의 모델에 보냅니다. 채팅이 진행된 뒤에만 다시 보내며, 채팅마다 최대 20초에 한 번입니다. 메모는 메모리에만 보관됩니다. 설정은 `$DSH_HOME/storages/dsh-composer-plus/board-progress.json`(소유자 전용 파일)에 있습니다.
173
193
  - **보호된 파일:** 목록과 스위치는 `$DSH_HOME/storages/dsh-composer-plus/protected-files.json`(소유자 전용 파일)에 있습니다. 확인은 각 파일 도구 호출의 경로(와 실제 경로)만 읽으며, 파일 자체는 읽지 않습니다.
174
194
  - **차단된 명령:** 규칙과 스위치는 `$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도 같은 경로로 메모를 읽고 바꿉니다.
195
+ - **비밀 값 입력:** 값은 답변 요청 안에서만 카드에서(또는 요청 본문을 기록하지 않는 게이트웨이를 거쳐 Tether에서) Host로 갑니다. Host는 값을 `$DSH_HOME/storages/dsh-composer-plus/secrets/<임의 이름>`에 씁니다(폴더 0700, 파일 0600). 프로젝트, 채팅 기록, 도구 결과에는 아무것도 들어가지 않습니다. Host는 그 채팅의 이후 도구 결과에서 값을 `[secret]`으로 바꾸기 위해 값을 메모리에 보관합니다. 파일과 이 사본은 그 채팅의 턴이 끝날 때와 dsh가 시작될 때 삭제됩니다. 스위치는 같은 위치의 `secrets.json`에 있습니다. 에이전트가 이 파일로 실행하는 명령은 그 명령이 보내는 곳으로 값을 보낼 수 있습니다. 그것이 이 기능의 목적입니다.
196
+ - **프로젝트 메모리:** 직접 켜기 전까지는 꺼져 있습니다. 켜져 있는 동안 최상위 채팅의 턴이 끝날 때마다 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도 같은 경로로 메모를 읽고 바꿉니다. **메모리 버전 기록**(기본으로 켜짐)은 저장할 때마다 저장 전 메모리 파일의 사본을 옆의 `memory/history/`에 보관합니다(소유자 전용 파일, 메모리마다 최신 50개). 모델에는 아무것도 보내지 않습니다. **메모리를 AGENTS.md로 내보내기** 는 모델에 아무것도 보내지 않으며, **AGENTS.md 쓰기** 를 클릭할 때만 씁니다. 그 메모리의 프로젝트 폴더에 있는 `AGENTS.md` 만 읽고 쓰며(폴더 안의 일반 파일만, 폴더 밖으로 나가는 심볼릭 링크는 절대 따라가지 않음), 표시된 섹션만 바꿉니다. **오래된 메모리 메모 찾기** 는 모델에 아무것도 보내지 않고 아무것도 쓰지 않습니다. 프로젝트 폴더 안의 경로를 realpath로 확인하고(파일 내용은 읽지 않음), `package.json` 은 폴더 안의 일반 파일일 때만 읽으며, 그곳에서 `git for-each-ref` 를 한 번 실행합니다. **이 채팅에서는 메모리 사용 안 함** 은 끈 채팅을 옆의 `memory-chats.json` 에 저장합니다(소유자 전용 파일, 최신 500개). 그런 채팅은 모델에 메모리를 보내지 않습니다. **채팅에서 메모리 메모 제안** 은 **메모리에 제안** 을 누르기 전에는 아무것도 보내지 않습니다. 누르면 채팅의 프로젝트에 저장된 메모와 전역 메모, 그리고 채팅 자체의 메시지와 텍스트 답변(도구 출력과 롤백된 메시지 제외, 포크의 부모 복사본 제외, 최대 약 24,000자)을 도구 없는 요청 한 번으로 채팅 자체의 모델에 보냅니다. 제안은 **수락** 할 때만 저장됩니다.
176
197
  - **백업:** 아무것도 컴퓨터 밖으로 나가지 않습니다. 아카이브는 `~/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 프로세스를 나타냅니다(복구 콘솔은 이 파일들을 읽고 복원을 거부합니다).
177
198
  - **복구 콘솔:** 터미널 메뉴이며, 네트워크 포트를 열지 않습니다. 복원은 dsh 홈 옆의 새 폴더에만 씁니다(파일은 `O_EXCL | O_NOFOLLOW`로 쓰고, 심볼릭 링크는 마지막에 만들며 따라가지 않음). 안전하지 않은 이름(`..`, 절대 경로), 장치나 FIFO, 둘 이상의 최상위 폴더, 링크 아래의 항목이 있는 아카이브는 거부합니다.
178
199
 
@@ -194,7 +215,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
194
215
  - **채팅 행에 브랜치 배지가 없음:** 사이드바가 “하나의 목록” 보기가 아니거나(“작업 공간”과 “작업 공간 트리”에서는 어떤 채팅 행에도 배지가 없음), 이 버전을 설치한 뒤 그 채팅에 턴이 없었거나, 폴더가 git 저장소가 아니거나, **채팅 행의 Git 브랜치**가 꺼져 있습니다. 업데이트한 뒤에는 dsh를 다시 시작하세요(브랜치는 Host 쪽이 기록합니다).
195
216
  - **목표 확인에 테스트가 종료 코드 127 또는 "not found"로 끝났다고 표시됨:** Finder나 Dock에서 시작한 dsh는 터미널보다 PATH가 짧을 수 있어서 `npm`, `pnpm`, `cargo`를 찾지 못합니다. 터미널에서 dsh를 시작하거나, **목표 확인** → **편집**에서 전체 경로를 쓴 테스트 명령을 직접 정하세요. **지금 실행**을 누르면 결과가 바로 표시됩니다.
196
217
  - **목표가 닫히지 않고 에이전트가 계속 작업함:** **목표 확인**이 실패한 테스트나 남은 작업을 찾았습니다. 목표 아래의 행에 이유가 표시됩니다(자세한 내용은 결과에 포인터를 올려 보세요). 원인이나 테스트 명령을 고치거나, `/goal` 또는 목표 바로 목표를 직접 완료하세요(이 완료는 확인하지 않습니다).
197
- - **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.20.0`). 위의 설치 안내를 참고하세요.
218
+ - **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.21.0`). 위의 설치 안내를 참고하세요.
198
219
  - **지금 백업에서 "다른 백업 작업이 실행 중입니다"라고 표시됨:** 다른 dsh 창이나 복구 콘솔에서 작업이 실행 중입니다(둘은 백업 폴더의 잠금 파일 `.composer-plus.lock`을 함께 씁니다). 작업이 끝날 때까지 기다리세요. 실행 중인 작업이 없으면, 다음에 클릭할 때 종료된 프로세스의 잠금을 넘겨받습니다.
199
220
  - **복구 콘솔에 "dsh is running"이라고 표시됨:** 먼저 dsh를 종료하세요. dsh가 정말 닫혀 있다면, 메시지에 나온 파일은 비정상 종료로 남은 것입니다. 그 파일을 삭제하고 다시 시도하세요.
200
221
  - **복원 후 dsh가 시작되지 않거나 플러그인이 없음:** 프로필의 플러그인 패키지를 다시 설치해야 합니다. 복구 콘솔이 복원 후에 이를 제안합니다. 또는 콘솔이 나열하는 `$DSH_HOME/profiles/` 아래의 각 폴더에서 `pnpm install`을 실행하세요. vault에 없던 비밀 값(다른 컴퓨터)은 다시 입력해야 합니다. 콘솔이 그 목록을 보여 줍니다.
@@ -215,11 +236,17 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
215
236
  - dsh의 대기열에는 `move` 동작이 없습니다. 그래서 플러그인의 Host 쪽이 dsh의 대기열 안에서 대기 중인 메시지 자체를 옮깁니다(한 번의 변경, 같은 메시지). 이미지나 파일이 있는 메시지도 이동할 수 있습니다. 내 메시지만 이동할 수 있습니다. 대기열에 있는 목표 라운드나 질문에 대한 답변은 제자리에 남습니다. 끄는 중에 메시지 전송이 시작되면 아무것도 이동하지 않고, 알림으로 이를 알려 줍니다.
216
237
  - 새 버전이 dsh 설정을 하나도 바꾸지 않으면 dsh 0.2.1은 업데이트를 바로 로드합니다. 그 밖의 경우와 dsh 0.2.0에서는 업데이트를 로드하려면 dsh를 다시 시작하세요. 플러그인은 dsh를 대신 재시작하지 않습니다. dsh 플러그인 관리자가 없는 웹/CLI 프로필은 새 버전을 알리기만 합니다.
217
238
  - **Composer Plus N의 새로운 기능**은 **애플리케이션 언어**의 언어로 노트를 보여 줍니다. 다른 지역이 붙은 UI 언어는 기본 언어의 노트를 받습니다(`en-GB`는 영어 노트, `zh-TW`는 `zh`의 중국어 노트). 노트가 없는 언어(다른 언어 팩이 추가한 언어, 또는 `pt-BR`이 아닌 `pt-PT`)에서는 영어 노트를 보여 줍니다. 노트는 새 버전에 함께 들어 있습니다. 실행 중인 사본에 읽을 수 있는 노트 파일(`release-notes.json`)이 없으면 GitHub의 영어 노트를 보여 줍니다.
239
+ - **메모와 함께 거부**는 메모를 대기 중인 턴에 메시지로 보낸 다음 요청을 거부합니다. dsh는 메모를 채팅에 사용자의 메시지로 표시합니다. 메모 입력란이 열려 있는 동안 카드에는 **취소**와 **거부**만 표시되므로, 실수로 클릭해도 요청이 허용되지 않습니다. `Esc` 또는 **취소**를 누르면 dsh의 버튼이 다시 나타납니다. 빈 메모는 아무것도 보내지 않습니다(dsh 자체의 **거부**를 쓰세요). 메모를 보낸 뒤 거부가 실패하면(예를 들어 그사이에 요청이 다른 곳에서 응답된 경우) 메모는 채팅에 남고, 모델은 다음 단계에서 메모를 읽습니다. dsh에는 카드 동작용 슬롯이 없어서 버튼을 dsh의 승인 카드 마크업(`data-approval-key`)에 넣습니다. dsh 업데이트로 그 마크업이 바뀌면 버튼은 표시되지 않고, dsh 자체의 **거부**는 전과 같이 동작합니다. 메모는 최대 4,000자까지 쓸 수 있습니다.
240
+ - **비밀 값 입력**은 값의 정확한 문자열만 숨깁니다. 같은 채팅의 이후 도구 결과에서는 값이 `[secret]`으로 바뀝니다. 하지만 에이전트는 셸 명령으로 파일을 읽고 값을 다른 형태(base64, 일부분, 공백을 넣은 형태)로 출력할 수 있으며, 그 형태는 모델에 전달됩니다. 에이전트 자체의 파일 도구(read, grep, write, edit)는 비밀 값 폴더를 열 수 없습니다. 값이 흔한 단어이기도 하면 그 채팅의 다른 결과에도 `[secret]`이 표시됩니다. 파일은 턴이 끝날 때까지 남습니다. 턴 도중 dsh가 종료되면 다음 시작 시 삭제됩니다. 한 채팅에는 한 번에 하나의 요청만 열려 있을 수 있습니다. 이 도구는 모델 요청마다 약 870자(추정 약 220토큰)를 더합니다. 사용하지 않을 때는 끄세요.
241
+ - **답장에 인용**은 페이지에 보이는 그대로 텍스트를 인용합니다. 코드 블록, 표, 목록은 Markdown 기호 없이 일반 줄로 들어갑니다. 선택이 한 답변에서 시작해 다른 답변에서 끝나거나 생각 과정, 도구 행, 본인 메시지에 걸치면 버튼이 나타나지 않습니다. 한 답변 안에서 선택하세요. dsh에는 텍스트 선택용 슬롯이 없어서 버튼은 dsh의 채팅 구조로 답변을 찾습니다. dsh 업데이트로 이 구조가 바뀌면 버튼이 나타나지 않습니다. 인용이 입력란 끝에 들어가면 다음에 입력하는 줄이 그 아래에서 시작하도록 빈 줄이 하나 더 들어갑니다. dsh는 보낼 때 끝의 빈 줄을 지웁니다.
242
+ - **사이드 채팅**의 읽기 전용은 dsh 자체의 읽기 전용 모드에 의한 것입니다. 파일 도구는 쓸 수 없고, 셸 명령은 쓰기가 없는 dsh 샌드박스에서 실행됩니다(샌드박스를 시작할 수 없으면 실행되지 않습니다). 그래도 에이전트는 dsh 승인 카드로 더 많은 권한을 요청할 수 있고, 네트워크 호출(예: API 요청)은 컴퓨터 밖의 무언가를 바꿀 수 있습니다. 복사본은 대기열에 기다리는 메시지가 없던 가장 최근 시점에 만들어집니다. 그래서 대기열에 메시지가 기다리는 동안 한 질문은 그 뒤에 일어난 일을 보지 못합니다. 채팅에서 실행 중인 단계는 복사본에서 닫히므로, 사이드 채팅은 그 단계의 시작은 알지만 결과는 모릅니다. 사이드 채팅은 일반 채팅입니다. 사이드바에 남고 모델 사용량에 포함되니 거기서 보관하세요. 가져오기는 사이드 채팅 자신의 메시지만(최대 12,000자), 각 질문의 마지막 답변만 가져옵니다. 도구 호출 사이의 에이전트 메모는 포함되지 않습니다. dsh는 플러그인이 오른쪽 사이드바에 채팅을 표시할 슬롯을 제공하지 않으므로 사이드 채팅은 메인 화면에서 열립니다.
243
+ - **diff 메모**는 변경 사항 패널에서만 동작하며 dsh 자체의 마지막 턴 보기에서는 동작하지 않습니다. 범위는 diff의 한 블록(한 `@@` 부분) 안에 있어야 합니다. 메모는 이 브라우저의 저장소에 보관되므로 다른 브라우저나 다른 컴퓨터의 dsh에서는 보이지 않습니다. Tether는 자체 메모를 메모리에 보관합니다. 메모는 클릭할 때의 줄을 그대로 보관하므로, 에이전트가 나중에 파일을 바꿔도 메모에는 이전 줄과 번호가 남습니다. 채팅당 최대 50개, 메모당 최대 2,000자, 40줄입니다(넘으면 `…` 줄).
218
244
  - **이 채팅에서 허용**은 허용한 순간부터 시간 제한을 셉니다. 새 시간 제한은 유효한 허용에 즉시 적용되므로, 더 짧은 시간 제한은 허용을 즉시 끝낼 수 있습니다. 버전 1.12 이하의 허용에는 시간 정보가 없습니다. 업데이트 후 에이전트가 그 도구들에 대해 한 번 더 묻습니다.
219
245
  - **입력란 포커스 유지**는 `/` 명령이나 스킬을 보낸 뒤에만 포커스를 돌려줍니다. dsh가 명령을 처리하는 몇 밀리초 동안 입력란이 읽기 전용이므로, 그동안 누른 키는 사라집니다. dsh의 `/` 메뉴가 아직 열려 있으면 `Enter`는 강조된 행을 선택하고 메시지를 보내지 않습니다.
220
246
  - **질문 카드를 창에 맞추기**는 dsh의 질문 카드만 바꾸고 계획 검토 카드는 바꾸지 않습니다. 카드는 dsh의 마크업(`data-question-key`, `data-question-scroll`)으로 찾습니다. dsh 업데이트로 이 마크업이 바뀌면 카드는 dsh가 그리는 대로 보입니다. 카드 높이는 채팅이 아니라 창을 따릅니다. 좁은 사이드 패널 안의 채팅에서는 높은 카드가 채팅 위로 넘칠 수 있습니다.
221
247
  - **채팅 헤더를 창에 맞추기**는 dsh가 생성한 클래스 이름(`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`)으로 채팅 헤더를 찾습니다. dsh에 헤더 레이아웃용 훅이 없기 때문입니다. dsh 업데이트로 이 이름이 바뀌면 헤더는 dsh가 그리는 그대로 보입니다. 아주 좁은 채팅 열에서는 헤더가 두세 줄을 차지할 수 있어 메시지 위의 공간이 줄어듭니다.
222
- - **모바일 연결**은 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에서 그 채팅을 열 때까지 남습니다.
248
+ - **모바일 연결**은 macOS에서만 작동합니다(`en0`, `openssl`, `swift`, `dns-sd` 사용). 고정 포트 19390과 19391을 쓰므로, Mac마다 한 번에 dsh 하나에서만 실행할 수 있습니다(각 Mac은 휴대폰의 Mac 목록에서 항목 하나입니다). 휴대폰은 Tether가 열려 있거나 막 백그라운드로 간 동안에만 알림을 받습니다(푸시 서비스 없음). Tether에서 "Settings → Notifications → Send notifications"를 켜기 전에는 Tether가 알림을 보내지 않습니다. Tether는 이 설정과 시간대를 페어링된 Mac마다 따로 저장합니다. 이 설정은 Mac마다 기본적으로 꺼져 있으며, 켤 때 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에서 그 채팅을 열 때까지 남습니다.
249
+ - **원격 컴퓨터**를 쓰려면 두 Mac 모두에 Tailscale이 있어야 하고, 여는 대상 Mac에 이 기능을 켠 Composer Plus가 있어야 합니다. 그 Mac은 잠자기 상태가 아니어야 하며 dsh가 실행 중이어야 합니다. 다른 컴퓨터는 화면에 있는 채팅의 오른쪽 사이드바 브라우저 탭에서 열립니다. 이 탭은 그 채팅에 속하므로, 다른 채팅에서는 그 채팅의 사이드바가 표시됩니다. 채팅이 없으면(또는 브라우저 탭이 없는 dsh web에서는) 컴퓨터가 브라우저 창에서 열립니다. 선택 메뉴는 기본 영역에 채팅이나 새 채팅 화면이 있을 때만 표시되며, 작업 보드에서는 표시되지 않습니다. 포트 19392를 씁니다(Mac마다 다른 컴퓨터를 받아들일 수 있는 dsh는 하나뿐입니다). 다른 컴퓨터의 페이지 안에서 연 컴퓨터에는 선택 메뉴가 없으므로, 거기서 세 번째 Mac을 열 수 없습니다.
223
250
  - 세션 링크는 채팅 안에서 작동하지만, 클릭해도 채팅이 열리지는 않습니다. **메시지 링크 복사**로 만든 링크는 dsh 0.2.1 이상에서만, 그리고 채팅 안의 메시지에서만 그 메시지를 엽니다(dsh 0.2.0에는 사용자 텍스트 규칙이 없으므로, 링크는 복사되지만 일반 텍스트로 보입니다). 되돌리기로 빠진 메시지나, 압축으로 dsh가 불러오는 기록에서 빠진 메시지는 보여 줄 수 없습니다. 이때 링크가 그렇다고 알려 줍니다. 🔗 버튼은 dsh의 메시지 행에 붙습니다. dsh 업데이트로 그 마크업이 바뀌면 버튼이 표시되지 않습니다.
224
251
  - **모두 읽음으로 표시**는 공개 API가 아닌 dsh의 일부(dsh 세션 상태의 `completionUnread` 목록)를 통해 dsh 자체의 읽지 않음 점을 바꿉니다. dsh 업데이트로 이 이름이 바뀌면 항목이 표시되지 않습니다. 이 항목은 dsh의 프로젝트 "…" 메뉴에 들어가는데, 이 메뉴에는 플러그인용 슬롯이 없습니다. dsh가 이 메뉴를 바꾸면 이 항목도 표시되지 않습니다.
225
252
  - **대기 중인 메시지 제자리 편집**은 그사이 전송이 시작된 메시지를 바꾸지 않고, 그사이 바뀐 메시지(예: iPhone의 Tether에서 바꾼 메시지)를 덮어쓰지 않으며, 알림으로 이를 알려 줍니다. 새 이미지에는 이미지를 받는 모델이 필요하고(dsh 자체의 이미지 제한이 적용됩니다), 새 파일은 업로드가 끝나야 저장할 수 있습니다. 내 대기 중인 메시지만 편집할 수 있고, 대기열의 목표 라운드나 질문에 대한 답변은 편집할 수 없습니다. 플러그인을 업데이트한 뒤에는 텍스트만 바꾸는 편집만 바로 되며, 이미지나 파일이 있는 메시지를 저장하려면 먼저 dsh를 다시 시작해야 합니다(Host 쪽은 시작할 때 로드됩니다).
@@ -234,6 +261,8 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
234
261
  - **작업 공간 트리의 브랜치**은(는) 클릭 없이 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의 사이드바 행에서 이를 읽습니다). 그 외에는 브랜치 프로젝트에 있습니다.
235
262
  - **채팅에서 찾기**는 페이지가 보여 주는 것만 검색합니다. 불러온 메시지와 답변이 대상이며(이전 것은 위로 스크롤하거나 **이전 기록 로드**를 클릭하세요), 닫힌 도구 단계와 도구 출력 안의 접힌 텍스트는 검색하지 않습니다. 일치 항목은 최대 2,000개까지 셉니다(그 뒤에는 "2000+"). 브라우저의 하이라이트 API를 씁니다(Chromium 105 이상, 데스크톱 앱에는 있습니다). 더 오래된 브라우저에서는 개수와 이동은 작동하지만 색은 표시되지 않습니다. Mac에서는 `Cmd+F`(Windows와 Linux에서는 `Ctrl+F`)가 화면에 채팅이 있을 때만 이것을 엽니다. 다른 곳에서는 브라우저 자체의 찾기가 전처럼 작동합니다. Mac에서 `Ctrl+F`는 텍스트 필드에서 macOS 기능(커서를 한 글자 앞으로 이동)을 그대로 유지합니다.
236
263
  - **유휴 상태일 때 대기 중인 채팅 열기**는 dsh 창이 보는 동작만 압니다. 다른 앱에서 하는 작업은 세지 않으므로, dsh가 백그라운드에 있으면 30초 뒤에 대기 중인 채팅을 열 수 있습니다. dsh를 앞으로 가져오지는 않습니다. 키 입력, 클릭, 마우스 이동 없이 읽기만 하면 유휴 상태로 봅니다. dsh의 주황색 점(질문, 승인, 계획 검토) 또는 초록색 점(아직 열지 않은 완료된 턴)이 있는 채팅만 봅니다. 주황색 채팅이 먼저 열립니다. 초록색 채팅을 열면 그 점이 사라지므로, 다음 초록색 채팅의 30초는 다음 키 입력, 클릭, 마우스 이동, 스크롤 휠, 터치 뒤에 시작됩니다. 돌아왔을 때 다른 초록색 점은 그대로 있습니다. 서브에이전트의 요청은 부모 채팅에 표시됩니다. 기다리는 채팅이 화면에 있는 동안에는 다른 채팅을 열지 않습니다. 답하지 않고 떠난 채팅은 다음에 30초 동안 사용하지 않으면 다시 열릴 수 있습니다. 30초는 바꿀 수 없습니다.
264
+ - **다음 대기 중인 채팅** 은 **유휴 상태일 때 대기 중인 채팅 열기** 와 같은 채팅을 셉니다. dsh의 주황색 점(여기서 답할 수 있는 질문, 승인 또는 계획 검토)과 초록색 점(아직 열지 않은 완료된 턴)입니다. 하위 에이전트의 요청은 상위 채팅에 표시됩니다. dsh는 채팅이 기다리기 시작한 시각을 기록하지 않으므로, 순서는 이 창이 그 채팅을 본 순간부터 셉니다. 새로고침한 뒤에는 이미 기다리던 채팅이 dsh의 순서를 유지합니다. 이 키는 dsh 단축키입니다. Linux의 브라우저에서는 dsh의 키보드 단축키 페이지에서 지정하기 전까지 키가 없으며, 브라우저 확장 프로그램이나 다른 앱이 `Cmd+Shift+E`를 먼저 가져갈 수 있습니다. dsh의 사이드바 헤더에는 확장 슬롯이 없어서 버튼을 헤더 구조에 넣습니다. dsh 업데이트로 그 구조가 바뀌면 버튼은 표시되지 않지만 키는 계속 동작합니다. 좁은 사이드바에는 버튼이 없습니다.
265
+ - **선택지 버튼** 은 선택지 목록으로 끝나는 답변만 읽습니다. 이 목록은 1부터 번호가 매겨진 1~9개 항목의 번호 목록이며, 답변의 마지막 부분에 있고, "선택지" 또는 "다음 단계"라는 제목이나 굵은 줄 바로 아래에 있습니다(영어 "Options", "Choices", "Next steps"와 앱의 다른 언어에 있는 같은 단어도 포함). 답변 중간의 목록, 코드 블록 안의 목록, 다른 제목 아래의 목록에는 버튼이 표시되지 않습니다. Composer Plus는 에이전트에게 이런 목록을 쓰라고 요청하지 않습니다. 버튼은 최신 답변 아래에만, 채팅이 대기 중이고 입력란이 비어 있을 때 표시되며, 롤백으로 철회된 답변이 무엇인지 Composer Plus가 알게 된 뒤에만 표시됩니다. dsh의 질문 카드에서는 질문이 나타난 뒤 처음 0.8초 동안 1–9 키가 아무 일도 하지 않습니다. 그래서 다른 일을 하려고 누른 키가 아직 읽지 않은 선택지를 고르지 않습니다. dsh의 질문 카드에는 키 API가 없어서, 키는 dsh의 마크업에서 카드의 버튼을 찾습니다. dsh 업데이트로 이 마크업이 바뀌면 키는 아무 일도 하지 않습니다.
237
266
  - 재시작 전에 보낸 알림을 클릭하면 dsh를 앞으로 가져오기만 합니다.
238
267
  - 활성 프로젝트는 dsh에 저장되는 프로젝트 순서로 이동하므로, 새 순서는 재시작 후에도 유지됩니다. 어느 프로젝트에도 속하지 않은 채팅("그룹 없음")은 이동할 수 없습니다. dsh는 이 채팅을 항상 맨 마지막에 나열합니다.
239
268
  - dsh의 사이드바 보기 옵션 메뉴에는 확장 지점이 없습니다. 그래서 최근 프로젝트 옵션은 dsh 자체 메뉴에 추가됩니다. dsh 업데이트로 이 메뉴가 바뀌면 옵션이 표시되지 않고 모든 프로젝트가 계속 보입니다. 필터는 프로젝트 행에 적용되므로 **하나의 목록**은 걸러지지 않습니다. **작업 공간 트리**에서는 안에 있는 프로젝트가 활성인 동안 상위 폴더도 계속 보이고, 최근 2시간 동안 활성이 아니었던 채팅 행도 숨겨집니다. **작업 공간**에서는 프로젝트 행만 걸러집니다. 필터는 dsh가 저장한 보기 설정(공개 API가 아님)에서 지금 어떤 보기인지 읽습니다. dsh 업데이트로 그 이름이 바뀌면 **작업 공간 트리**는 **작업 공간**처럼 걸러집니다. 프로젝트 상태도 같은 설정을 읽습니다. **작업 공간 트리**에서는 상위 폴더 행이 그 안에 있는 프로젝트의 채팅도 셉니다. dsh가 이 설정의 이름을 바꾸면 각 행은 자기 채팅만 표시합니다. **상태별**에도 같은 종류의 제한이 있습니다. dsh에는 정렬 슬롯이 없으므로, 항목과 행 순서가 dsh의 메뉴와 목록 마크업에 붙습니다.
@@ -249,9 +278,16 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
249
278
  - **새 채팅에서 계속**은 채팅(메시지, 도구 호출, 각 도구 결과의 끝부분. 최대 약 60,000자, 가장 최근 부분)을 채팅 자체의 모델에 보냅니다. 인계 메모는 결정이나 파일을 빠뜨릴 수 있으므로, 시작하기 전에 읽어 보세요. 새 채팅은 메모와 링크된 채팅만 압니다(dsh는 이전 채팅을 읽기 전용 컨텍스트로 첨부합니다). 새 채팅의 모델 컨텍스트는 작게 시작하고, 이전 채팅은 그대로 남습니다. 채팅마다 한 번에 메모 작성이나 시작 하나만 실행됩니다.
250
279
  - **컨텍스트 구성**은 dsh 자체의 규칙(토큰당 약 4자)으로 추정값을 보여 줍니다. dsh의 컨텍스트 링과 같은 규칙이며, 모델 자체의 계산과 다를 수 있습니다. 도구 정의는 가장 최근 요청의 것입니다. 채팅 로그에 있는 그대로의 컨텍스트를 보여 주며, 지금 실행 중인 턴은 다음 단계 뒤에 나타납니다.
251
280
  - **계획된 단계**는 모델이 실제로 계획할 때만 토큰을 절약합니다. 켜져 있는 동안에는 모델이 계획하지 않는 채팅에서도 모든 요청에 `plan_next_steps` 도구와 짧은 지침(약 500토큰)이 포함됩니다. 조건은 적힌 내용만 증명합니다(예: 빌드 종료 코드가 0이었음). 작업이 올바르다는 것은 증명하지 않습니다. `ok`는 dsh 자체의 결과 표시(`[exit code: N]`, 시간 초과, 샌드박스 거부)를 읽습니다. 0이 아닌 종료 코드 없이 실패한 명령은 통과로 처리됩니다. 단계는 한 번에 하나씩 실행되며, 동시에 준비된 두 단계는 모델에게 돌아갑니다. 단계의 메시지는 채팅 모델의 어시스턴트 메시지로 저장됩니다(dsh에는 플러그인이 쓴 메시지를 나타내는 표시가 없습니다). 그래서 그 텍스트에 Composer Plus가 실행했다고 적혀 있습니다. Tether에는 없습니다.
252
- - **작업 보드**는 dsh가 이 창에 나열하는 채팅을 보여 줍니다. 프로젝트 밖의 채팅은 **모든 프로젝트**에만 표시되고, 채팅별 브랜치 폴더(`<project>/.worktrees/<name>`)는 해당 프로젝트로 취급됩니다. 카드의 열은 채팅의 실시간 상태이므로 카드를 끌어 옮길 수 없습니다. 채팅은 턴이 끝나면(오류나 중지 후에도) **완료**로 가고, 다시 실행되면 **진행 중**으로 돌아갑니다. 초록색 점은 dsh 자체의 완료 점이며, dsh는 이 점을 이 창에만 보관합니다. 페이지를 다시 불러오면 끝난 채팅이 이 점 없이 표시됩니다. **완료**에는 최신 채팅 50개가 표시됩니다(나머지는 **이전 작업 N개 보기**로 볼 수 있습니다). **프로젝트 검색**은 프로젝트를 이름으로만 찾고, 폴더 경로로는 찾지 않습니다. **최근 2시간 내 활성**은 프로젝트의 모든 채팅이 2시간보다 오래되었고 유휴 상태이며 읽은 상태일 때 그 프로젝트를 숨깁니다. 선택한 프로젝트는 보드에 계속 표시됩니다. **새 작업**은 이 창의 가장 최근 새 채팅만 기억합니다. 첫 메시지 전에 다른 채팅을 열면, 그 채팅은 사용자가 거기에 쓸 때까지 **할 일**에 **새 작업**으로 남지만, 자동으로 보드로 돌아오는 것은 가장 최근 채팅뿐입니다. 페이지를 다시 불러오면 메시지가 없는 새 채팅은 보드에 없습니다(dsh는 그 채팅을 빈 새 세션으로 보관합니다). 태그는 작업마다 그 첫 메시지를 바탕으로 한 모델 호출 한 번으로 만들어지므로 틀릴 수 있으며, 보드에서 시작하지 않은 채팅에는 태그가 없습니다. 제목은 dsh 자체의 채팅 제목입니다(dsh의 제목 서비스가 채팅의 모델로 만듭니다). 제목이 오기 전까지 카드에는 첫 메시지의 첫 줄이 표시됩니다. **답변**은 채팅의 가장 최근 요청에만 답합니다. 그 요청이 다른 곳(다른 창, Tether, 자동 검토)에서 이미 답변되었거나 채팅이 새로운 것을 물으면, 패널이 그렇게 알려 주고 아무것도 보내지 않습니다. 이전 버전에는 댓글과 에이전트 도구가 있는 작업 목록이 있었지만 이제 없어졌으며, 예전 `board.json`은 표시되지 않습니다. 아이디어와 디자인은 emanuele-em의 [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0)에서 왔습니다. Composer Plus는 그 코드를 쓰지 않습니다.
281
+ - **작업 보드**는 dsh가 이 창에 나열하는 채팅을 보여 줍니다. 프로젝트 밖의 채팅은 **모든 프로젝트**에만 표시되고, 채팅별 브랜치 폴더(`<project>/.worktrees/<name>`)는 해당 프로젝트로 취급됩니다. 카드의 열은 채팅의 실시간 상태이므로 카드를 끌어 옮길 수 없습니다. 채팅은 턴이 끝나면(오류나 중지 후에도) **완료**로 가고, 다시 실행되면 **진행 중**으로 돌아갑니다. 초록색 점은 dsh 자체의 완료 점이며, dsh는 이 점을 이 창에만 보관합니다. 페이지를 다시 불러오면 끝난 채팅이 이 점 없이 표시됩니다. **완료**에는 최신 채팅 50개가 표시됩니다(나머지는 **이전 작업 N개 보기**로 볼 수 있습니다). **프로젝트 검색**은 프로젝트를 이름으로만 찾고, 폴더 경로로는 찾지 않습니다. **최근 2시간 내 활성**은 프로젝트의 모든 채팅이 2시간보다 오래되었고 유휴 상태이며 읽은 상태일 때 그 프로젝트를 숨깁니다. 선택한 프로젝트는 보드에 계속 표시됩니다. **새 작업**은 이 창의 가장 최근 새 채팅만 기억합니다. 첫 메시지 전에 다른 채팅을 열면, 그 채팅은 사용자가 거기에 쓸 때까지 **진행 중**의 맨 위에 **새 작업**으로 남지만, 자동으로 보드로 돌아오는 것은 가장 최근 채팅뿐입니다. 페이지를 다시 불러오면 메시지가 없는 새 채팅은 보드에 없습니다(dsh는 그 채팅을 빈 새 세션으로 보관합니다). 태그는 작업마다 그 첫 메시지를 바탕으로 한 모델 호출 한 번으로 만들어지므로 틀릴 수 있으며, 보드에서 시작하지 않은 채팅에는 태그가 없습니다. 제목은 dsh 자체의 채팅 제목입니다(dsh의 제목 서비스가 채팅의 모델로 만듭니다). 제목이 오기 전까지 카드에는 첫 메시지의 첫 줄이 표시됩니다. **×** 버튼과 **모두 빼기**는 카드를 보드에서 빼기만 합니다. 채팅은 삭제되지 않습니다. **실행 취소**는 이 창에서 8초 동안만 표시됩니다. 그 뒤에는 **뺀 카드 (N)** → **보드에 되돌리기**로 카드를 되돌릴 수 있고, 다시 실행되는 채팅은 자동으로 돌아옵니다. **모두 빼기**는 먼저 확인을 묻고, 표시된 프로젝트에서 읽은 끝난 카드를 뺍니다(**모든 프로젝트**에서는 모든 프로젝트의 카드). **이전 작업 N개 보기** 뒤에 있는 카드도 뺍니다. 읽지 않은(초록색) 카드는 남습니다. dsh는 초록색 점을 이 창에만 보관하므로, 페이지를 다시 불러온 뒤에는 모두 빼기가 아직 답변을 읽지 않은 카드도 뺄 수 있습니다. 이 목록은 이 Mac에 보관되며 모든 창과 Tether에 적용됩니다. 목록이 채팅 5,000개에 이르면 가장 오래된 채팅이 돌아옵니다. **답변**은 채팅의 가장 최근 요청에만 답합니다. 그 요청이 다른 곳(다른 창, Tether, 자동 검토)에서 이미 답변되었거나 채팅이 새로운 것을 물으면, 패널이 그렇게 알려 주고 아무것도 보내지 않습니다. 이전 버전에는 댓글과 에이전트 도구가 있는 작업 목록이 있었지만 이제 없어졌으며, 예전 `board.json`은 표시되지 않습니다. 아이디어와 디자인은 emanuele-em의 [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0)에서 왔습니다. Composer Plus는 그 코드를 쓰지 않습니다. `Cmd+Shift+K`는 dsh 단축키입니다. Linux의 브라우저에서는 기본 키가 없으므로 dsh의 키보드 단축키 페이지에서 설정하세요. 브라우저 확장 프로그램이나 다른 앱이 이 키를 먼저 사용할 수도 있습니다. 카드는 dsh 자체의 초록색 점이 사라질 때(채팅을 열었을 때) **완료**에서 빠집니다. 보드 뒤에서 열린 채팅으로 끝난 채팅은 그 채팅이 위에 패널 없이 보일 때 빠집니다. 이 읽음 상태는 dsh 자체의 점처럼 이 dsh 창 안에만 있습니다. 다시 불러오거나 다른 창에서는 끝난 채팅이 모두 읽은 것으로 보이므로 **최근 완료**에 있습니다.
253
282
  - **중지 후 보낸 메시지 먼저 실행**은 채팅을 중지한 뒤에만 동작합니다(또는 실패한 턴 뒤, 아직 대기열이 있는 채팅을 열 때). 턴이 실행되는 중에 보낸 메시지는 여전히 대기열 끝에서 기다립니다. 내가 대기열에 넣은 메시지만 앞지릅니다. 대기열에 목표 라운드나 질문 답변이 기다리고 있으면 dsh 자체 순서가 유지됩니다. 공개 API가 아닌 dsh의 일부(중지된 턴이 아직 끝나는 중인지)를 읽습니다. dsh 업데이트로 그 이름이 바뀌면, 메시지는 그 턴이 끝난 뒤에만 앞으로 옮겨집니다. 서브에이전트 채팅은 dsh 자체 순서를 유지합니다.
254
283
  - **프로젝트 메모리**는 채팅의 첫 폴더(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 자체의 메모리를 읽거나 쓰지 않습니다.
284
+ - **메모리 버전 기록** 은 메모리(각 프로젝트와 전역 메모리)마다 최신 50개 버전을 보관하고, 더 오래된 것은 지웁니다. 한 버전은 메모 하나가 아니라 그 프로젝트의 메모리 전체입니다. **복원** 은 그 버전의 모든 파일(주제 포함)을 되돌리며, 버전을 연 뒤에 메모리가 바뀌었으면 거부합니다. 복원 전의 메모리는 새 버전이 되므로 복원을 되돌릴 수 있습니다. 스위치가 꺼져 있는 동안에는 새 버전을 보관하지 않고 **복원** 도 거부됩니다. 보관된 버전은 남습니다. 이 기능 이전의 버전은 없습니다. 기록은 설치 후 첫 저장부터 시작합니다.
285
+ - **메모리를 AGENTS.md로 내보내기** 는 한 프로젝트 메모리의 메모만 씁니다. 전역 메모, 출처, 날짜는 넣지 않습니다. 다음 내보내기는 표시된 섹션 전체를 바꾸므로, 섹션 안에서 직접 바꾼 내용은 사라집니다(diff가 먼저 보여 줍니다). 표시 밖의 글은 그대로 남습니다. 표시가 깨져 있으면(하나가 없거나 두 번 있으면) 고칠 때까지 내보내기를 거부합니다. 512 kB를 넘는 AGENTS.md, 프로젝트 폴더 밖으로 나가는 심볼릭 링크, 일반 파일이 아닌 것은 모두 거부됩니다. 미리 보기 뒤에 AGENTS.md나 메모가 바뀌면 **AGENTS.md 쓰기** 를 거부하므로 다시 내보내세요.
286
+ - **메모리 메모 출처 링크** 는 이 버전을 설치한 뒤에 저장한 메모에서 동작합니다. 그보다 오래된 메모는 채팅만 가리키거나 아무것도 가리키지 않으므로, **출처** 는 채팅만 열거나 표시되지 않습니다. 메시지가 없으면(롤백으로 철회되었거나 채팅이 삭제됨) 채팅이 열리고 메시지가 없다는 알림이 나옵니다.
287
+ - **메모리를 다른 프로젝트로 복사** 는 한 번에 최대 100개 메모를, dsh 목록에 있는 프로젝트로만 복사합니다(dsh 자체 프로젝트 목록을 읽으며 창에서 경로를 받지 않습니다). 복사본은 각각 독립적이라, 나중에 한 프로젝트의 메모를 바꿔도 복사본은 바뀌지 않습니다. 선택한 메모 하나라도 들어가지 않으면(대상의 MEMORY.md나 주제가 가득 찼거나 주제가 이미 40개) 아무것도 복사하지 않습니다. 대상에 같은 글과 주제의 메모가 있으면 건너뛰고 그 개수를 알려 줍니다.
288
+ - **오래된 메모리 메모 찾기** 는 메모가 아는 형식으로 쓴 것만 찾습니다. 코드 조각 안의 경로(`src/cart.ts`), `npm run` 뒤의 npm 스크립트(또는 `npm test`, `pnpm lint`), "브랜치"라는 단어 옆 코드 조각 안의 브랜치 이름입니다. 프로젝트 폴더 밖으로 나가는 경로는 보고하지 않습니다. 스크립트는 프로젝트에 `package.json` 이 있을 때만, 브랜치는 git 저장소에서만 검사합니다. 한 번에 최대 200개 항목을 검사합니다. 경고는 "틀림"이 아니라 "지금 찾을 수 없음"이라는 뜻입니다. 나중에 빌드가 만드는 파일도 보고됩니다.
289
+ - **이 채팅에서는 메모리 사용 안 함** 은 그 채팅의 다음 모델 요청부터 적용됩니다. 이미 실행 중인 요청은 그대로입니다. 실행 중인 채팅에서 바꾸면 시스템 프롬프트가 한 번 바뀌므로, 그 한 번의 요청은 모델 제공자의 캐시를 쓸 수 없습니다. 하위 에이전트는 루트 채팅을 따릅니다. 메모리가 꺼져 있는 동안 채팅이 받은 메시지는 나중에 다시 켜도 검토가 읽지 않습니다. dsh 0.2.0에서는 새 채팅 화면에 버튼을 둘 자리가 없어, 첫 메시지 뒤에 채팅 헤더에 나타납니다.
290
+ - **채팅에서 메모리 메모 제안** 은 제안을 최대 10개 보여 주며 30분 동안, 그리고 dsh가 다시 시작될 때까지만 보관합니다. 그 뒤에 수락하면 다시 제안을 받으라고 안내합니다. 긴 채팅은 최신 메시지를 보내며, 가장 오래된 에이전트 답변부터 뺍니다. 제안은 틀릴 수 있으니 수락 전에 읽고, 나중에 메모를 바꾸려면 **메모리 열기** 를 사용하세요. 거부한 제안은 다음 클릭에서 다시 나올 수 있습니다.
255
291
  - **백업**은 고정된 폴더 하나, `~/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 아카이브를 자기 보관 개수에 포함하며 그 아카이브를 삭제할 수 있습니다.
256
292
  - **복원**은 dsh가 닫혀 있을 때 복구 콘솔에서만 실행되며, dsh 홈 전체를 바꿉니다. 기존 홈은 직접 삭제할 때까지 옆에 `.dsh.pre-restore-<time>`으로 남으므로, 디스크에 둘 다 들어갈 공간이 필요합니다. 채팅은 프로젝트 경로를 그대로 유지합니다. 다른 컴퓨터에서 다른 경로에 있는 프로젝트는 다시 추가할 때까지 없는 것으로 표시됩니다. dsh 홈 밖을 가리키는 심볼릭 링크(예: 다른 폴더에서 링크한 스킬)는 링크로 돌아오며, 그 대상은 그 컴퓨터에 있어야 합니다.
257
293
  - **세션 로그 점검**은 무엇이 열리는지에 대한 dsh 자체 규칙으로 각 채팅의 최신 로그를 읽습니다. JSON이 아니거나 순서가 어긋난 행은 그 뒤에 턴 종료가 있을 때만 손상으로 칩니다(그렇지 않으면 dsh는 그 행부터의 내용을 빼고 채팅을 열기 때문에 목록에 나오지 않습니다). 로그의 이벤트를 dsh 자체의 이벤트 규칙과 비교하지는 않으므로, 정상으로 판정한 로그도 dsh 업그레이드 후에 열리지 않을 수 있습니다. 복구는 백업에서 사본을 가져옵니다. 그 백업 이후의 메시지는 그 채팅에서 사라집니다(손상된 파일은 옆에 남음). 이 dsh에서 열려 있는 채팅은 설정에서 복구되지 않습니다. dsh가 그 채팅을 잡고 있기 때문입니다.
@@ -286,7 +322,13 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
286
322
 
287
323
  **DS Bot의 메모리처럼 에이전트가 채팅이 바뀌어도 내 선호를 기억할 수 있나요?** 네, **프로젝트 메모리**(기본적으로 꺼짐)로 가능합니다. **설정 → Composer Plus**에서 켜세요. 턴이 끝날 때마다 오래 유지되는 선호와 결정이 채팅 프로젝트의 짧은 메모로 저장되고, 그 프로젝트의 새 채팅마다 이를 읽습니다. 에이전트에게 무언가를 기억하라고 하면 바로 저장합니다. 메모를 보거나 바꾸려면 같은 줄의 **메모리 열기**를 누르고 바꿀 내용을 적으세요.
288
324
 
289
- **모든 채팅을 칸반 보드로 보고 거기서 새 채팅을 시작할 수 있나요?** 네, **작업 보드**(기본적으로 켜짐)로 가능합니다. 왼쪽 사이드바에서 여세요. 각 채팅은 **진행 중**, **검토**(사용자를 기다림) 또는 **완료**에 있는 카드입니다. **새 작업**은 프로젝트에서 dsh의 새 채팅을 열고, 첫 메시지를 보내면 보드로 돌아옵니다. 주황색 카드에서 **답변**을 클릭하면 채팅을 열지 않고 답할 수 있습니다.
325
+ **제가 또는 AI가 메모리를 잘못 바꿨습니다. 이전 메모를 되돌릴 수 있나요?** 네, **메모리 버전 기록**(기본으로 켜짐)으로 할 수 있습니다. **메모리 열기** 에서 프로젝트를 선택한 다음 **기록** 을 누르세요. 변경 전 버전을 선택해 무엇이 돌아오는지 확인한 뒤 **복원** 을 누르세요.
326
+
327
+ **프로젝트 메모리를 팀이나 다른 에이전트 도구와 공유할 수 있나요?** 네, **메모리를 AGENTS.md로 내보내기**(기본으로 켜짐)로 할 수 있습니다. **메모리 열기** 에서 프로젝트를 선택한 다음 **AGENTS.md로 내보내기** 를 누르세요. diff를 확인하고 **AGENTS.md 쓰기** 를 누른 뒤 파일을 커밋하세요.
328
+
329
+ **AI가 긴 채팅에서 무엇을 남길지 제안할 수 있나요?** 네, **채팅에서 메모리 메모 제안**(**프로젝트 메모리** 가 켜져 있으면 기본으로 켜짐)으로 할 수 있습니다. 채팅 헤더에서 **메모리에 제안** 을 누른 뒤 남길 만한 메모를 **수락** 하세요.
330
+
331
+ **모든 채팅을 칸반 보드로 보고 거기서 새 채팅을 시작할 수 있나요?** 네, **작업 보드**(기본적으로 켜짐)로 가능합니다. 왼쪽 사이드바에서 여세요. 각 채팅은 **진행 중**, **검토**(사용자를 기다림) 또는 **완료**에 있는 카드입니다. **새 작업**은 프로젝트에서 dsh의 새 채팅을 열고, 첫 메시지를 보내면 보드로 돌아옵니다. 주황색 카드에서 **답변**을 클릭하면 채팅을 열지 않고 답할 수 있습니다. **완료**의 **모두 빼기**는 먼저 확인을 묻고, 읽은 끝난 카드를 보드에서 뺍니다. **실행 취소**와 **뺀 카드 (N)**로 카드를 되돌릴 수 있으며, 채팅은 dsh에 남습니다.
290
332
 
291
333
  **dsh-backup처럼 dsh에서 채팅과 설정을 백업할 수 있나요?** 네. **설정 → Composer Plus → 백업 → 지금 백업**을 사용하세요. 같은 아카이브 형식으로 같은 폴더(`~/Desktop/dsh-backups`)에 쓰므로, dsh-backup의 아카이브도 표시되고 복원할 수 있으며, dsh-backup은 삭제해도 됩니다. 정해진 일정으로 백업하려면 **자동 백업**을 켜세요.
292
334
 
@@ -314,10 +356,22 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
314
356
 
315
357
  **에이전트가 `npm publish`나 `git push --force`를 실행하지 못하게 하려면 어떻게 하나요?** **설정 → Composer Plus → 차단된 명령**에서 `npm publish`를 입력하고 **차단** 또는 **먼저 묻기**를 고른 뒤 **추가**를 클릭하세요. **차단**은 명령을 거부하고 에이전트가 사용자에게 묻습니다. **먼저 묻기**는 매번 승인 카드를 표시합니다. 보호된 파일은 에이전트의 파일 도구를, 차단된 명령은 셸 명령을 다룹니다.
316
358
 
359
+ **도구 호출을 거부한 이유를 에이전트에게 알려 줄 수 있나요?** 네, **메모와 함께 거부**(기본적으로 켜짐)로 가능합니다. 승인 카드에서 **메모와 함께 거부…**를 클릭하고, 이유나 대신 할 일을 쓴 다음 **거부**를 클릭하세요. 에이전트는 같은 턴에서 거부와 메모를 함께 읽습니다.
360
+
361
+ **채팅에 쓰지 않고 비밀번호나 토큰을 에이전트에게 주려면?** **비밀 값 입력**(기본적으로 켜짐)을 사용하세요. 에이전트에게 `request_secret`을 사용하라고 하거나 에이전트가 요청할 때까지 기다리세요. 도구 행의 카드에 값을 입력하고 **저장**을 클릭하세요. 에이전트는 값이 담긴 파일의 경로만 받고, 파일은 턴이 끝나면 삭제됩니다.
362
+
363
+ **긴 답변의 일부에만 답하려면?** 그 부분을 선택하고 선택 영역 위의 **인용**을 클릭하세요(**답장에 인용**, 기본적으로 켜짐). 그 부분이 `> …` 인용으로 입력란에 들어가고, 그 아래에 답장을 쓰면 됩니다.
364
+
365
+ **에이전트를 멈추지 않고 작업 중에 질문할 수 있나요?** 질문을 입력하고 입력란의 **사이드 채팅에서 질문**을 클릭하세요(**사이드 채팅**, 기본적으로 켜짐). 채팅의 읽기 전용 복사본이 답하고, 채팅은 계속 작업합니다. 사이드 채팅에서 **가져오기**를 누르면 답변이 채팅 입력란에 들어갑니다.
366
+
367
+ **에이전트에게 diff에서 무엇을 바꿀지 알려 주려면?** **변경 사항 패널**에서 파일의 diff를 열고 줄의 **+**를 클릭해 메모를 쓰세요(**diff 메모**, 기본적으로 켜짐). 그런 다음 **입력란으로 보내기**를 클릭하면 메모가 파일, 줄 번호, 줄과 함께 입력란에 들어갑니다.
368
+
317
369
  **한 채팅에서 자동 검토가 같은 도구를 계속 묻지 않게 하려면 어떻게 하나요?** 승인 카드에서 **이 채팅에서 허용**을 클릭하세요. 이 허용은 그 채팅의 그 도구에만 적용되며, 기본값은 1시간입니다. 헤더 칩에서 취소할 수 있습니다. 시간은 **설정 → Composer Plus → 이 채팅에서 허용**에서 바꿉니다.
318
370
 
319
371
  **iPhone을 잃어버렸습니다. 그 iPhone이 Mac에 접속하지 못하게 하려면 어떻게 하나요?** 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하고, 그 iPhone 옆의 **Remove**를 클릭하세요. 그 iPhone의 키는 즉시 작동을 멈춥니다. 다시 연결하려면 Mac에서 승인하는 새 페어링이 필요합니다.
320
372
 
373
+ **다른 Mac의 채팅을 이 Mac에서 이어 가려면 어떻게 하나요?** 다른 Mac에서 **설정 → Composer Plus → 원격 컴퓨터**와 **다른 컴퓨터에서 이 Mac 열기 허용**을 켜고, **페어링 링크 만들기**를 클릭한 뒤 링크를 복사하세요(예: AirDrop이나 메모로 나에게 보내세요). 이 Mac에서도 **원격 컴퓨터**를 켜고, 채팅 제목 왼쪽에서 **컴퓨터 추가…** 항목을 고른 뒤 링크를 붙여 넣고 **연결**을 클릭하세요. 그다음 다른 Mac에서 **승인**을 클릭하세요. 이후에는 같은 메뉴에서 그 컴퓨터를 고르면 됩니다.
374
+
321
375
  **Face ID로 Tether를 잠글 수 있나요?** 네. Tether에서 "Settings → Privacy → Lock with Face ID"를 켜세요. 그러면 Tether를 열 때와 Tether로 돌아올 때 Face ID(또는 암호)를 요구합니다.
322
376
 
323
377
  **dsh 사이드바에 오늘 사용한 프로젝트만 표시하려면 어떻게 하나요?** 사이드바 → 보기 옵션(슬라이더 아이콘) → **최근 2시간 내 활성**. 모든 프로젝트를 다시 보려면 이 옵션을 다시 선택하세요.
@@ -330,6 +384,10 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
330
384
 
331
385
  **dsh가 질문하는 채팅을 스스로 열 수 있나요?** 네, **유휴 상태일 때 대기 중인 채팅 열기**(기본으로 켜짐)를 사용하세요. 채팅이 답변, 승인, 계획 검토를 기다리고 있을 때 30초 동안 dsh를 사용하지 않으면 dsh가 그 채팅을 엽니다. 아직 읽지 않은 턴을 마친 채팅(초록색 점)도 주황색 채팅 다음에 같은 방식으로 열립니다. 입력하거나 스크롤하거나 마우스를 움직이는 동안에는 기다립니다.
332
386
 
387
+ **나를 기다리는 다음 채팅으로 바로 이동할 수 있나요?** 네, **다음 대기 중인 채팅**(기본값 켜짐)을 사용하세요. `Cmd+Shift+E`(Windows와 Linux에서는 `Ctrl+Shift+E`)를 누르거나 사이드바 헤더에 있는 숫자 버튼을 클릭합니다. 질문을 하거나 승인을 기다리는 채팅이 먼저이고, 그다음은 아직 읽지 않은 턴을 마친 채팅입니다.
388
+
389
+ **에이전트의 선택지에 클릭 한 번으로 답할 수 있나요?** 네, **선택지 버튼**(기본값 켜짐)을 사용하세요. 답변이 "선택지" 목록으로 끝나면 그 아래의 버튼을 클릭하세요. 버튼은 "Option N: …"을 내 메시지로 보냅니다. 에이전트의 질문 카드에서는 1–9 키를 누르세요.
390
+
333
391
  **DeepSeek Harness 인터페이스를 터키어, 스페인어, 일본어 등으로 바꾸려면 어떻게 하나요?** 설정 → Composer Plus → **애플리케이션 언어**.
334
392
 
335
393
  **iPhone에서 dsh를 쓰려면 어떻게 하나요?** `tether/ios`에서 Tether 앱을 빌드하세요(Xcode). **설정 → Composer Plus → 모바일 연결(iPhone)**을 켜고, 왼쪽 아래의 **모바일 연결**을 클릭하세요. QR 코드를 스캔하고(iPhone 카메라 또는 Tether의 **Scan code**), **Connect**를 탭한 뒤 **Approve**를 클릭하세요. 집 밖에서는 두 기기 모두에서 Tailscale을 쓰세요.
@@ -359,6 +417,10 @@ PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/ds
359
417
  PLAYWRIGHT=/path/to/playwright node test/browser-recent-tree.mjs /path/to/dsh/lib/bin.js
360
418
  # Order by status (fake model + Schedule): real-app test + its thumbnail
361
419
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
420
+ # Next waiting chat and Option buttons (fake model): the sidebar button and Cmd+Shift+E open the waiting chats in order, the Keyboard shortcuts row, the option buttons and the question card keys, switch off + their thumbnails
421
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-agentbox-ideas.mjs /path/to/dsh/lib/bin.js
422
+ # Reject with note, Secret input, Quote in reply, Side chat and Diff notes (fake model + a test-only approval gate): the button on dsh's card, the note after the rejection in the next request, Esc; the secret card, Save, the value in no request, file or page, Decline, Stop; a selected part of an answer → Quote → the sent message; a side question while the chat waits on a card (read-only, no queued message in it), Bring back; notes on a diff line and range → Send to composer → the sent message; switch off + their thumbnails
423
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-t3code-ideas.mjs /path/to/dsh/lib/bin.js
362
424
  # every Settings feature row shows a loading screenshot and a ? link to its README row
363
425
  PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
364
426
  # What's new after an update: the release notes show once, Esc and Close close them
@@ -408,7 +470,7 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
408
470
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
409
471
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
410
472
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
411
- # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, Hide finished, the switch
473
+ # Task board: New task opens dsh's new chat and comes back after the first message, AI tags, live columns, Answer on the board, × with Undo, Clear all with its question (unread cards stay), Removed and Put back (kept after a restart), the switch
412
474
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
413
475
  ```
414
476