dsh-composer-plus 1.22.0 → 1.24.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
@@ -14,7 +14,7 @@
14
14
 
15
15
  <p align="center"><img src="docs/images/hero.webp" width="820" alt="Composer Plus를 사용하는 DeepSeek Harness: 실행 중인 프로젝트는 사이드바에 회전 표시가 나타나고, 변경 사항 패널은 git diff를 보여 줍니다"></p>
16
16
 
17
- 비공식 커뮤니티 플러그인입니다. 네트워크 호출은 업데이트 확인(GitHub 릴리스와 npm 레지스트리)뿐입니다. 시작할 때 이 호출을 막으려면 **자동 업데이트**를 끄세요. **기능 아이디어**는 **기능 제안**을 클릭할 때만 채팅 자체의 모델을 호출합니다. **다음 메시지 예측**(기본값: 켜짐)은 턴이 끝날 때마다 설정에서 고른 모델(다른 모델을 고르지 않으면 dsh의 기본 모델)을 클릭 없이 한 번 호출합니다. 이 호출을 막으려면 **설정 → Composer Plus**에서 끄세요. **입력 중 자동 완성**(기본값: 꺼짐)은 사용자가 켠 뒤에 입력을 멈출 때마다 이 기능에서 고른 모델(기본값: 예측의 모델)을 호출합니다. **프롬프트 개선**은 요술봉을 클릭할 때만 모델을 호출합니다. **작업 보드**는 보드에서 시작한 각 작업의 태그를 만들 때 새 채팅의 모델을 한 번 호출합니다. **AI 요약** 설정에서는(기본값은 **빠름(AI 없음)**) 보드나 Tether에서 실행 중인 작업의 진행 상황을 볼 때 짧은 진행 메모를 위해 그 채팅의 모델도 호출합니다. **목표 확인**(기본값: 켜짐)은 에이전트가 자동 라운드에서 `/goal`을 완료로 표시할 때마다 모델을 한 번 호출합니다. **모바일 연결**(기본값: 꺼짐)은 사용자가 켠 뒤에만 로컬 네트워크나 tailnet에서 오는 iPhone 연결을 받습니다.
17
+ 비공식 커뮤니티 플러그인입니다. 업데이트 확인은 네트워크를 호출합니다(GitHub 릴리스와 npm 레지스트리). 시작할 때 이 호출을 막으려면 **자동 업데이트**를 끄세요. **터키어 스킬 팩**(기본값은 켜짐)은 **애플리케이션 언어**가 Türkçe일 때만 GitHub에서 turkish-anti-ai-skill을 내려받고 하루에 한 번 새 버전을 확인합니다. 이 호출을 멈추려면 **설정 → Composer Plus**에서 끄세요. **기능 아이디어**는 **기능 제안**을 클릭할 때만 채팅 자체의 모델을 호출합니다. **다음 메시지 예측**(기본값: 켜짐)은 턴이 끝날 때마다 설정에서 고른 모델(다른 모델을 고르지 않으면 dsh의 기본 모델)을 클릭 없이 한 번 호출합니다. 이 호출을 막으려면 **설정 → Composer Plus**에서 끄세요. **입력 중 자동 완성**(기본값: 꺼짐)은 사용자가 켠 뒤에 입력을 멈출 때마다 이 기능에서 고른 모델(기본값: 예측의 모델)을 호출합니다. **프롬프트 개선**은 요술봉을 클릭할 때만 모델을 호출합니다. **작업 보드**는 보드에서 시작한 각 작업의 태그를 만들 때 새 채팅의 모델을 한 번 호출합니다. **AI 요약** 설정에서는(기본값은 **빠름(AI 없음)**) 보드나 Tether에서 실행 중인 작업의 진행 상황을 볼 때 짧은 진행 메모를 위해 그 채팅의 모델도 호출합니다. **목표 확인**(기본값: 켜짐)은 에이전트가 자동 라운드에서 `/goal`을 완료로 표시할 때마다 모델을 한 번 호출합니다. **모바일 연결**(기본값: 꺼짐)은 사용자가 켠 뒤에만 로컬 네트워크나 tailnet에서 오는 iPhone 연결을 받습니다.
18
18
 
19
19
  ## 설치
20
20
 
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  그런 다음 dsh를 다시 시작하세요. (CLI는 데스크톱 프로필에 설치할 수 없습니다. 데스크톱 프로필은 앱이 관리합니다.)
31
31
 
32
- > dsh의 pnpm은 게시된 지 24시간이 지나지 않은 버전을 건너뜁니다. 릴리스 직후에는 버전을 붙여서 설치하세요: `dsh-composer-plus@1.22.0`.
32
+ > dsh의 pnpm은 게시된 지 24시간이 지나지 않은 버전을 건너뜁니다. 릴리스 직후에는 버전을 붙여서 설치하세요: `dsh-composer-plus@1.24.0`.
33
33
 
34
34
  ## 기능
35
35
 
@@ -48,6 +48,7 @@ dsh plugin --profile web add dsh-composer-plus
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
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> |
51
+ | **창 크기 기억하기** | <a id="feature-windowsize"></a>dsh 데스크톱 앱은 시작할 때마다 창을 1280 × 820으로 엽니다. 이 기능을 사용하면 마지막으로 사용한 창 크기와 위치로 열립니다. 창 크기를 바꾸거나 창을 옮길 때마다 저장되고, 다음 시작 때 플러그인이 로드되면 복원됩니다. 전체 화면이나 최소화된 창은 저장되지 않으며, 지금 연결되지 않은 디스플레이의 위치는 기본 디스플레이로 돌아옵니다. 데스크톱 앱에서만 작동합니다. 브라우저 탭은 자기 창 크기를 바꿀 수 없습니다. | <a href="assets/features/windowSize.webp"><img src="assets/features/windowSize.webp" width="160" alt="스크린샷: 창 크기 기억하기"></a> |
51
52
  | **원클릭 계속** | <a id="feature-continuebutton"></a>턴이 중지되거나, 실패하거나, 중간에 끊긴 뒤에는 빈 입력란에 **▶**가 표시됩니다. 한 번 클릭하면 입력란에 아무것도 쓰지 않고, 보이는 채팅 메시지도 추가하지 않은 채 기존 대화를 이어 갑니다(모델은 “멈춘 곳에서 계속하라”는 짧은 숨은 메모를 받습니다. Claude 같은 일부 제공자는 어시스턴트 답변으로 끝나는 요청을 거부하기 때문입니다). 대기열의 메시지는 그대로 남습니다. ▶는 중지된 작업만 이어 가고, 그다음에 대기열이 실행됩니다. 완료된 턴 뒤에는 일반 보내기 버튼이 그대로 있습니다. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="스크린샷: 원클릭 계속"></a> |
52
53
  | **재시작 후 이어서 실행** | <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> |
53
54
  | **대기열 끌어서 놓기** | <a id="feature-queuereorder"></a>대기 중인 메시지에 핸들(⠿)이 생깁니다. 끌어서 순서를 바꾸거나, 핸들에 포커스를 두고 `↑` / `↓`를 누르세요. `Esc`는 이동을 취소합니다. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="스크린샷: 대기열 끌어서 놓기"></a> |
@@ -69,9 +70,12 @@ dsh plugin --profile web add dsh-composer-plus
69
70
  | **새 채팅에서 계속** | <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
71
  | **컨텍스트 구성** | <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
72
  | **계획된 단계** | <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> |
73
+ | **터키어 스킬 팩** | <a id="feature-turkishskill"></a>**애플리케이션 언어**가 Türkçe일 때만 동작합니다(기본값은 켜짐, **설정 → Composer Plus**에서 끌 수 있음). Composer Plus는 오픈 소스 [turkish-anti-ai-skill](https://github.com/yucezerey/turkish-anti-ai-skill)(MIT, 작성자 Yüce Zerey)을 GitHub에서 내려받아 dsh의 스킬에 추가합니다. 에이전트에게 터키어 글을 자연스럽게 다듬거나, 다시 쓰거나, 써 달라고 요청하세요. dsh가 스킬을 불러오고, 그 규칙이 AI 티가 나지 않는 자연스러운 터키어를 쓰도록 돕습니다. 팩의 Markdown 파일만 남기며, 각 파일은 GitHub 파일 목록과 일치해야 하고 팩의 스크립트는 실행하지 않습니다. 플러그인은 하루에 한 번 GitHub에 새 버전을 묻고 설치합니다. 행에는 설치된 버전이나 설치되지 않은 이유가 표시됩니다. 다른 언어에서는 스킬이 설치되지 않으며, 언어를 Türkçe로 되돌리면 다시 설치됩니다. | <a href="assets/features/turkishSkill.webp"><img src="assets/features/turkishSkill.webp" width="160" alt="스크린샷: 터키어 스킬 팩"></a> |
74
+ | **코드베이스 정리** | <a id="feature-untanglecodebase"></a>기본적으로 켜져 있습니다. **설정 → Composer Plus**에서 끌 수 있습니다. [caldoai/skills](https://github.com/caldoai/skills)의 스킬 `/untangle-codebase`(MIT, © 2026 Maze)를 dsh의 스킬 목록에 추가합니다. 채팅에 `/untangle-codebase`를 입력하고(`/` 메뉴에도 표시됩니다), 원하면 집중할 영역을 덧붙여(예: `/untangle-codebase src/api`) 보내세요. 에이전트는 먼저 코드를 다시 말할 뿐인 주석과 실제 버그를 잡을 수 없는 테스트도 지울지 묻습니다. 그다음 모든 복사된 코드, 숨은 결합, 불필요한 결합, 호출만 넘기는 래퍼, 죽은 코드, 일회성 특수 처리를 나열하고, 기본 원칙에서 출발해 수정을 계획하고, 목표로 수정한 뒤, 고칠 가치가 있는 것이 남지 않을 때까지 하위 에이전트로 다시 확인합니다. 사용자만 시작할 수 있습니다. 모델의 스킬 목록에는 보이지 않으므로 다른 채팅에서 토큰을 쓰지 않습니다. 프로젝트나 `~/.dsh/skills`에 같은 이름의 스킬이 있으면 그 스킬이 우선합니다. **채팅별 브랜치** 채팅에서 시작하고 결과는 **변경 사항 패널**에서 확인하세요. Tether에서는 메시지 입력란에 `/untangle-codebase`를 입력하세요. | <a href="assets/features/untangleCodebase.webp"><img src="assets/features/untangleCodebase.webp" width="160" alt="스크린샷: 코드베이스 정리"></a> |
72
75
  | **보호된 파일** | <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
76
  | **차단된 명령** | <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
77
  | **작업 보드** | <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> |
78
+ | **어시스턴트** | <a id="feature-assistant"></a>기본적으로 꺼져 있습니다. **설정 → Composer Plus**에서 켜세요. 그다음 왼쪽 사이드바에서 **어시스턴트**(**작업 보드** 바로 아래)를 클릭하세요. ChatGPT나 Grok 채팅처럼 개인 어시스턴트로 쓰는, 오래 유지되는 채팅 하나가 열립니다. 첫 클릭은 `~/Assistant` 폴더를 만들고, 이를 “Assistant” 프로젝트로 추가하고, workspace-write 권한 모드와 dsh의 기본 모델로 채팅을 시작합니다. 이후의 클릭은 매번 같은 채팅을 엽니다(보관된 채팅은 돌아오고, 삭제된 채팅은 다시 만들어집니다). 미리 알림을 부탁하면(“2분 뒤에 물 마시라고 알려 줘”) dsh의 예약 작업을 사용합니다. 그래서 그 시각에 미리 알림이 채팅을 실행하고, 모바일 연결이 켜져 있으면 Tether가 “Turn finished” 알림을 보냅니다. 웹 검색을 부탁하거나 다른 채팅에 대해 물어볼 수도 있습니다. 모든 프로젝트의 채팅(실행 중, 사용자를 기다림, 유휴)을 나열하고 한 채팅의 최신 메시지를 읽을 수 있습니다. 또한 채팅에 메시지를 보내고, 프로젝트에서 새 채팅을 시작하고, 실행 중인 채팅을 중지하거나 채팅을 보관할 수 있습니다. 이 네 가지 작업은 각각 먼저 dsh의 승인 카드를 보여 주며(Tether에서도), **한 번 허용**을 클릭하기 전에는 아무 일도 일어나지 않습니다. 삭제 도구는 없습니다. 이 도구와 짧은 지침은 이 채팅에만 있습니다. 웹 페이지나 다른 채팅에서 읽은 텍스트는 명령이 아니라 데이터로 취급됩니다. 매번 알려 주는 대신 프로필을 이 프로젝트의 메모리(**프로젝트 메모리**, 주제 “profil”)에 저장해 두세요. | <a href="assets/features/assistant.webp"><img src="assets/features/assistant.webp" width="160" alt="스크린샷: 어시스턴트"></a> |
75
79
  | **프로젝트 메모리** | <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
80
  | **메모리 버전 기록** | <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
81
  | **메모리를 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> |
@@ -84,6 +88,7 @@ dsh plugin --profile web add dsh-composer-plus
84
88
  | **메모와 함께 거부** | <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
89
  | **비밀 값 입력** | <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
90
  | **답장에 인용** | <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> |
91
+ | **파일 미리 보기에서 인용** | <a id="feature-previewquote"></a>오른쪽 사이드바에서 파일(**작업 공간 파일** 또는 채팅이 연 파일)을 열고 그 안의 줄을 선택하면 선택 영역 위에 **인용** 버튼이 나타납니다. 클릭하면 파일 경로, 줄 번호, 그 줄이 입력란의 커서 위치에 들어가고 입력란에 포커스가 가므로, 에이전트가 어느 부분을 말하는지 알 수 있습니다. 코드와 텍스트 파일은 `src/login.js:2-3`과 코드 블록으로 된 줄이, Markdown과 PDF 파일은 경로(PDF는 페이지도, `docs/spec.pdf#page=3`)와 `> …` 인용이 들어갑니다. 채팅 폴더 안의 경로는 상대 경로입니다. 최대 2,000자입니다. `Cmd+Z`(`Ctrl+Z`)로 되돌릴 수 있습니다. Tether에는 없습니다. | <a href="assets/features/previewQuote.webp"><img src="assets/features/previewQuote.webp" width="160" alt="스크린샷: 파일 미리 보기에서 인용"></a> |
87
92
  | **사이드 채팅** | <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
93
  | **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> |
89
94
  | **프로젝트 상태** | <a id="feature-projectstatus"></a>사이드바의 프로젝트 행에 그 채팅과 같은 실행 중 / 대기 중 / 완료 표시가 나타납니다. 그래서 접힌 프로젝트도 안의 채팅이 작업 중인지, 사용자의 조치가 필요한지 알려 줍니다. 사용자의 조치를 기다리는 채팅이 먼저 표시되고, 그다음 아직 열지 않은 완료된 채팅(초록색 점, 다른 채팅이 아직 실행 중일 때도 표시), 마지막으로 실행 중 표시가 나타납니다. 포인터를 올리면 자세한 내용이 보입니다. **작업 공간 트리**에서는 상위 폴더의 행에도 그 안에 있는 각 프로젝트(예: `.worktrees/` 안의 각 브랜치 폴더)의 채팅 상태가 표시되며, 폴더가 접혀 있을 때도 마찬가지입니다. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="스크린샷: 프로젝트 상태"></a> |
@@ -95,12 +100,14 @@ dsh plugin --profile web add dsh-composer-plus
95
100
  | **상태별 정렬** | <a id="feature-statusorder"></a>사이드바 → 보기 옵션 → **정렬 기준** → **상태별**(**하나의 목록**과 함께 사용). 완료된 채팅이 먼저 옵니다(dsh의 “완료” 점. 오류로 끝난 턴에도 이 점이 붙습니다). 그다음 실행 중이거나 대기 중인 채팅, 활성 자동화(예약)가 있는 채팅, 나머지 채팅이 dsh 순서대로 옵니다. 완료된 채팅을 열면 아래로 이동합니다. 보기만 바뀝니다. 원래대로 돌아가려면 **수동** 또는 **마지막 업데이트**를 선택하세요. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="스크린샷: 상태별 정렬"></a> |
96
101
  | **백그라운드 알림** | <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> |
97
102
  | **유휴 상태일 때 대기 중인 채팅 열기** | <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> |
103
+ | **다음 대기 중인 채팅** | <a id="feature-nextwaiting"></a>사이드바 헤더의 버튼에 나를 기다리는 다른 채팅 수와 다음 채팅의 색 점이 표시됩니다. 질문을 하거나 승인 또는 계획 검토를 기다리면 주황색, 아직 읽지 않은 턴을 마쳤으면 초록색입니다. 버튼을 클릭하거나 Cmd+Shift+E(Windows와 Linux에서는 Ctrl+Shift+E)를 누르면 그 채팅이 열립니다. 버튼을 클릭하면 사이드바에서도 그 채팅을 찾아 줍니다. 접힌 프로젝트가 열리고, 목록이 채팅까지 스크롤되며, 채팅이 5초 동안 깜박입니다. 주황색 채팅이 초록색 채팅보다 먼저이고, 각 그룹에서는 가장 오래 기다린 채팅이 먼저입니다. 화면에 열린 채팅은 세지 않습니다. 기다리는 다른 채팅이 없으면 버튼이 표시되지 않고 키도 아무 동작을 하지 않습니다. 키는 dsh의 키보드 단축키 페이지(다음 대기 중인 채팅)에서 바꿀 수 있습니다. | <a href="assets/features/nextWaiting.webp"><img src="assets/features/nextWaiting.webp" width="160" alt="스크린샷: 다음 대기 중인 채팅"></a> |
99
104
  | **선택지 버튼** | <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> |
100
105
  | **애플리케이션 언어** | <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> |
101
106
  | **모바일 연결(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> |
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`로 닫습니다. 설정 → 플러그인 이나 복사한 폴더로 업데이트한 뒤에도 새 버전마다 한 번 이 창이 표시됩니다. 처음 설치할 때는 표시되지 않습니다. 업데이트 행의 **이 버전의 새로운 기능** 으로 다시 열 수 있습니다. 실행 중인 버전보다 새 버전이 디스크에 있으면 행에 dsh를 다시 시작하라고 표시됩니다. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="스크린샷: 자동 업데이트"></a> |
107
+ | **원격 컴퓨터** | <a id="feature-remotecomputers"></a>[Tailscale](https://tailscale.com)을 통해 다른 Mac의 dsh를 열고, 이 dsh 창에서 사용하세요. 각 Mac의 **설정 → Composer Plus**에서 켜세요(네트워크 포트를 열기 때문에 기본적으로 꺼져 있습니다). 열려는 Mac에서 **다른 컴퓨터에서 이 Mac 열기 허용**을 켜고, **페어링 링크 만들기**를 클릭한 뒤 링크를 복사하세요. 이 Mac에서는 왼쪽 사이드바의 컴퓨터 선택 메뉴(브랜드 이름 오른쪽, **새 세션** 위)에서 **컴퓨터 추가…** 항목을 고르고, 링크를 붙여 넣은 뒤 **이름**을 입력하고(이 Mac이나 다른 컴퓨터와 같은 이름은 쓸 수 없습니다) **연결**을 클릭하세요. 그다음 다른 Mac에서 **승인**을 클릭하세요. 이제 선택 메뉴에 **이 Mac**과 내 컴퓨터들이 표시됩니다. 하나를 고르면 그 컴퓨터의 dsh가 이 창을 채우며, 그 컴퓨터의 채팅, 사이드바, 도구, 파일을 그대로 쓸 수 있습니다. 그동안 이 Mac은 뒤에서 계속 실행됩니다. 선택 메뉴는 같은 위치에 있고 **이 Mac으로 돌아가기**로 표시됩니다. 클릭하면 돌아옵니다. 컴퓨터가 두 대 이상이면 클릭할 때 메뉴가 열리고, 거기서 **이 Mac**이나 다른 컴퓨터를 고릅니다. 설정 패널에서 컴퓨터의 이름을 바꾸거나 제거할 수 있고, 이 Mac을 열 수 있는 컴퓨터 목록도 볼 수 있습니다(**제거**를 누르면 그 컴퓨터의 연결이 즉시 끊깁니다). | <a href="assets/features/remoteComputers.webp"><img src="assets/features/remoteComputers.webp" width="160" alt="스크린샷: 원격 컴퓨터"></a> |
108
+ | **자동 업데이트** | <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`로 닫습니다. 노트 아래에 GitHub 별표를 부탁하는 한 줄이 30일에 한 번까지 표시됩니다(네트워크 호출 없음). **GitHub에서 별표 주기** 또는 **다시 묻지 않기**를 누르면 다시 표시되지 않습니다. 설정 → 플러그인 이나 복사한 폴더로 업데이트한 뒤에도 새 버전마다 한 번 이 창이 표시됩니다. 처음 설치할 때는 표시되지 않습니다. 업데이트 행의 **이 버전의 새로운 기능** 으로 다시 열 수 있습니다. 실행 중인 버전보다 새 버전이 디스크에 있으면 행에 dsh를 다시 시작하라고 표시됩니다. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="스크린샷: 자동 업데이트"></a> |
109
+ | **켬/끔 필터** | <a id="feature-featurefilter"></a>**설정 → Composer Plus**의 **기능 검색** 옆에 있습니다. **전체**는 모든 기능을, **켬**은 스위치가 켜진 기능만, **끔**은 스위치가 꺼진 기능만 보여 줍니다. 기준은 각 행의 스위치이며, dsh Host가 저장하는 스위치(예: **모바일 연결**)도 포함됩니다. 검색과 함께 작동합니다. 단어를 입력하고 **끔**을 고르면 꺼 둔 기능을 찾을 수 있습니다. **켬** 또는 **끔**을 고른 상태에서 전환한 행은 필터를 다시 고를 때까지 남아 있으므로 포커스가 그 스위치에 머뭅니다. **켬**과 **끔**에서는 **애플리케이션 언어**와 **Composer Plus 업데이트** 행이 숨겨집니다(스위치가 없기 때문입니다). 설정은 매번 **전체**로 열립니다. | <a href="assets/features/featureFilter.webp"><img src="assets/features/featureFilter.webp" width="160" alt="스크린샷: 켬/끔 필터"></a> |
110
+ | **이슈 보고** | <a id="feature-issuereport"></a>설정 → Composer Plus → **이슈 보고…**(소개 문구 아래), 또는 사이드바에서 채팅을 마우스 오른쪽 버튼으로 클릭(또는 채팅의 **…** 메뉴 열기) → **Composer Plus 이슈 보고…**. 유형을 고르세요: **버그**, **기능 요청**, **개선**, **번역** 또는 **질문**. 자신의 말과 언어로 설명한 뒤 **초안 쓰기**를 클릭하세요(또는 `Cmd/Ctrl+Enter`). dsh의 기본 모델을 한 번 호출해 영어 이슈를 씁니다. 이슈에는 유형의 접두어가 붙은 제목(예: `[Bug]`)과 그 유형의 섹션(버그의 경우: What happened, Steps to reproduce, Expected, Actual), 그리고 Composer Plus, dsh, 시스템 버전이 적힌 줄 하나가 들어갑니다. 제목과 설명을 읽고 편집하세요. **다시 쓰기**는 새 초안을 씁니다. **이슈 열기**는 GitHub CLI(`gh`) 로그인으로 Composer Plus GitHub 저장소에 이슈를 열고 그 링크를 보여 줍니다. 이슈는 공개됩니다. 키나 비밀번호처럼 보이는 텍스트는 거부됩니다. `gh`로 열 수 없으면 **GitHub에서 대신 열기**가 초안이 채워진 GitHub 자체 페이지를 엽니다. | <a href="assets/features/issueReport.webp"><img src="assets/features/issueReport.webp" width="160" alt="스크린샷: 이슈 보고"></a> |
104
111
  | **백업** | <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> |
105
112
  | **자동 백업** | <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> |
106
113
  | **세션 로그 점검** | <a id="feature-sessiondoctor"></a>**세션 로그 검사**는 모든 채팅의 로그를 읽고, dsh가 열 수 없는 로그를 나열합니다(깨진 프레임, 잘린 레코드, 잘못된 시퀀스 번호). 마지막 부분만 덜 쓰인 로그는 나열되지 않습니다. dsh가 직접 고칩니다. **백업에서 복구**는 정상 사본이 있는 가장 최신 백업에서 사본을 되돌려 놓고, 손상된 파일은 그 옆에 보관합니다(`.corrupt-<시각>`). 그 백업 이후에 작성된 메시지는 사본에 없습니다. 이 dsh에서 열려 있는 채팅은 여기서 복구되지 않습니다. dsh를 종료하고 복구 콘솔에서 복구하세요. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="스크린샷: 세션 로그 점검"></a> |
@@ -112,7 +119,7 @@ dsh plugin --profile web add dsh-composer-plus
112
119
 
113
120
  ## 설정
114
121
 
115
- 모든 기능은 dsh **설정 → Composer Plus**에서 하나씩 켜거나 끌 수 있습니다. 각 행에는 작은 스크린샷이 있습니다. 포인터를 올리면 크게 미리 보고, 클릭하면 원래 크기로 엽니다(`Esc`로 닫기). 맨 위의 **기능 검색** 상자는 이름이나 설명으로 페이지를 걸러 냅니다(모든 언어, 대소문자와 악센트 구분 없음). `Esc`를 누르면 검색어가 지워집니다. 각 행에는 스위치와 짧은 설명이 있습니다. 행 이름 뒤의 작은 **?**는 그 기능을 설명하는 README 부분을 dsh 인터페이스 언어의 README에서 엽니다. 변경 사항은 재시작 없이 바로 적용되고 그 기기에 저장됩니다. **모바일 연결**, **재시작 후 이어서 실행**, **입력 중 자동 완성**을 빼고 모든 기능이 기본적으로 켜져 있습니다. 이 세 기능과 **내용 검색**, **턴 되돌리기**, **다음 메시지 예측**, **목표 확인**의 스위치는 dsh의 Host가 보관합니다. 그래서 모든 창에 적용되고 재시작 후에도 유지됩니다. **다음 메시지 예측**에서 고른 **모델**, **입력 중 자동 완성**에서 고른 모델(기본값 **다음 메시지 예측과 같음**), **프롬프트 개선**과 **목표 확인**에서 고른 모델(둘 다 기본값 **채팅의 모델과 같음**), **이 채팅에서 허용**의 **시간 제한**(기본값 1시간)도 Host가 보관합니다. **내용 검색**은 dsh를 다시 시작한 뒤에만 바뀝니다(dsh가 시작할 때 이 값을 읽기 때문입니다). 그 전까지 해당 행에 **이 변경 사항을 적용하려면 dsh를 다시 시작하세요.**가 표시됩니다.
122
+ 모든 기능은 dsh **설정 → Composer Plus**에서 하나씩 켜거나 끌 수 있습니다. 각 행에는 작은 스크린샷이 있습니다. 포인터를 올리면 크게 미리 보고, 클릭하면 원래 크기로 엽니다(`Esc`로 닫기). 맨 위의 **기능 검색** 상자는 이름이나 설명으로 페이지를 걸러 냅니다(모든 언어, 대소문자와 악센트 구분 없음). `Esc`를 누르면 검색어가 지워집니다. 그 옆의 **전체**, **켬**, **끔**은 모든 기능, 켜진 기능만, 또는 꺼진 기능만 보여 줍니다(**켬/끔 필터**를 끄면 숨겨집니다). 각 행에는 스위치와 짧은 설명이 있습니다. 행 이름 뒤의 작은 **?**는 그 기능을 설명하는 README 부분을 dsh 인터페이스 언어의 README에서 엽니다. 변경 사항은 재시작 없이 바로 적용되고 그 기기에 저장됩니다. **모바일 연결**, **재시작 후 이어서 실행**, **입력 중 자동 완성**을 빼고 모든 기능이 기본적으로 켜져 있습니다. 이 세 기능과 **내용 검색**, **턴 되돌리기**, **다음 메시지 예측**, **목표 확인**의 스위치는 dsh의 Host가 보관합니다. 그래서 모든 창에 적용되고 재시작 후에도 유지됩니다. **다음 메시지 예측**에서 고른 **모델**, **입력 중 자동 완성**에서 고른 모델(기본값 **다음 메시지 예측과 같음**), **프롬프트 개선**과 **목표 확인**에서 고른 모델(둘 다 기본값 **채팅의 모델과 같음**), **이 채팅에서 허용**의 **시간 제한**(기본값 1시간)도 Host가 보관합니다. **내용 검색**은 dsh를 다시 시작한 뒤에만 바뀝니다(dsh가 시작할 때 이 값을 읽기 때문입니다). 그 전까지 해당 행에 **이 변경 사항을 적용하려면 dsh를 다시 시작하세요.**가 표시됩니다.
116
123
 
117
124
  <p align="center"><img src="docs/images/settings.webp" width="720" alt="설정 → Composer Plus: 기능 검색, 언어 선택, 업데이트 행, 기능별 스위치, 포인터를 올리면 나타나는 스크린샷 미리 보기"></p>
118
125
 
@@ -172,6 +179,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
172
179
  - **내용 검색:** 채팅을 검색하는 새 코드는 없습니다. 플러그인은 dsh 자체 메시지 색인(SQLite FTS5, `dsh-session-query-sqlite`)을 켜고, 그 색인에 `$DSH_HOME/cache/composer-plus/session-search.db` 파일(소유자 전용 파일과 폴더)을 지정할 뿐입니다. 이 파일에는 사용자와 어시스턴트 메시지의 텍스트가 들어 있으므로, `$DSH_HOME/sessions`의 채팅 로그만큼 민감합니다. 아무것도 컴퓨터 밖으로 나가지 않습니다. 이 파일은 dsh가 다시 만들 수 있는 사본이므로, dsh가 닫혀 있을 때 삭제해도 됩니다. 스위치 값은 `$DSH_HOME/storages/dsh-composer-plus/content-search.json`에 있습니다.
173
180
  - **턴 되돌리기:** 내 메시지마다, 보내기 전에 Host가 채팅 폴더의 git 스냅샷을 자체 저장소 `$DSH_HOME/cache/composer-plus/rollback/<chat>.git`(소유자 전용 폴더)에 만듭니다. 이 저장소에는 그 폴더에서 git이 보는 파일(무시된 파일 제외)의 사본이 있으므로, 프로젝트만큼 민감합니다. 내 저장소의 객체를 읽기만 하고(git에 이미 있는 것은 복사하지 않음), 내 저장소의 인덱스, `HEAD`, 브랜치, 태그, stash, 설정에는 절대 쓰지 않습니다. git이 그곳에서 바꾸는 것은 재사용한 객체 파일의 타임스탬프를 새로 고치는 것뿐입니다(그래서 `git gc`의 정리가 늦어집니다). 파일까지 되돌릴 때는 채팅 폴더 안의 일반 파일에만 씁니다. 심볼릭 링크, 파이프, 폴더 밖의 모든 것은 건너뜁니다. 아무것도 컴퓨터 밖으로 나가지 않습니다. dsh가 닫혀 있을 때 이 저장소를 삭제해도 됩니다(그러면 새 메시지를 보낼 때까지 채팅만 되돌릴 수 있습니다). **채팅 삭제**는 채팅의 저장소도 함께 삭제합니다. 스위치 값은 `$DSH_HOME/storages/dsh-composer-plus/rollback.json`에 있습니다. 파일까지 되돌릴 때는 **다시 실행**을 위해 되돌리기 직전의 파일도 보관합니다(같은 저장소의 `refs/r/…`). 다시 실행한 되돌리기 목록은 `$DSH_HOME/storages/dsh-composer-plus/redone.json`(소유자 전용)에 있습니다.
174
181
  - **GitHub 이슈 열기**(기능 아이디어 → **나중에** 목록): 클릭할 때만 실행됩니다. Host 쪽은 채팅 폴더에서 사용자의 GitHub CLI(`gh issue create`)를 아이디어의 저장된 제목과 요약(그리고 중요한 이유)으로 실행합니다. `gh`는 자체 로그인과 폴더의 GitHub 원격 저장소를 쓰므로, 이슈는 사용자 계정으로 그 저장소에 만들어지고, GitHub는 그 저장소를 볼 수 있는 모든 사람에게 이슈를 보여 줍니다. dsh는 자신이 시작하는 명령에서 토큰처럼 보이는 이름의 변수를 제거합니다. `GH_TOKEN` 또는 `GITHUB_TOKEN`으로 `gh`에 토큰을 주었다면, 플러그인은 이 두 변수만 `gh`에 전달합니다. 이슈 링크는 아이디어와 함께 `later.json`에 보관됩니다.
182
+ - **이슈 보고**(설정 → Composer Plus → **이슈 보고…**, 또는 채팅의 **…** 메뉴 → **Composer Plus 이슈 보고…**): 클릭하기 전에는 아무것도 실행되지 않습니다. **초안 쓰기**는 유형과 사용자가 입력한 텍스트만(채팅과 프로젝트는 보내지 않음) dsh의 기본 모델에 요청 한 번으로 보냅니다. Host 쪽은 Composer Plus, dsh, 운영 체제 버전이 적힌 줄 하나를 추가하고, 홈 폴더 경로를 `~`로 바꿉니다. **이슈 열기**는 사용자 자신의 GitHub CLI(`gh issue create --repo furkancak1r/dsh-composer-plus`)를 사용자의 `gh` 로그인으로 실행하므로, 이슈는 공개되며 사용자의 GitHub 계정이 표시됩니다. 키, 토큰, 비밀번호처럼 보이는 텍스트는 거부되며 Mac 밖으로 나가지 않습니다.
175
183
  - **이 파일을 변경한 채팅**(변경 사항, 파일의 "…" 메뉴): Host 쪽은 폴더가 같은 저장소에 있는 채팅의 로그를 dsh가 보관한 그대로 읽고, 각 채팅의 제목, 시간, 요청의 첫 줄을 응답합니다. 파일 자체는 절대 열지 않습니다.
176
184
  - **채팅 행의 Git 브랜치:** Host 쪽은 턴이 시작될 때와 끝날 때 채팅 폴더에서 `git branch --show-current`(읽기 전용)를 실행하고, 채팅 ID, 브랜치 이름, 시간만 `$DSH_HOME/storages/dsh-composer-plus/session-branches.json`(소유자 전용 파일, 최신 채팅 2000개)에 보관합니다. 스위치 값은 그 옆의 `branches.json`에 있습니다.
177
185
  - **채팅에서 찾기**는 페이지 안에서만 실행됩니다. 페이지가 보여 주는 텍스트를 읽고, 아무것도 보내지 않습니다.
@@ -180,9 +188,10 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
180
188
  - **이 채팅에서 허용:** 허용 항목은 허용한 시각과 함께 `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json`(소유자 전용 권한)에 저장됩니다. 허용 하나는 한 채팅의 정확히 한 도구에만 적용되며, 시간 제한이 끝날 때까지 유효합니다(기본값 1시간). 그 도구가 쓰기를 할 수 있다면, 허용은 모든 쓰기에도 적용됩니다. 헤더 칩에서 취소하세요.
181
189
  - 자동 검토는 여전히 모든 호출에서 실행됩니다. 검토가 실패한 호출은 절대 자동으로 허용되지 않습니다.
182
190
  - **모바일 연결:** 켜기 전까지 꺼져 있습니다. 켜져 있는 동안 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의 컴퓨터 목록을 바꿀 수 없습니다.
191
+ - **원격 컴퓨터:** 각 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에 있는 컴퓨터의 이름과 상태를 읽을 수 있고(주소와 토큰은 읽을 수 없습니다), 이 창을 그 컴퓨터들 사이에서 전환할 수 있습니다. 컴퓨터를 추가하거나, 이름을 바꾸거나, 제거할 수 없고, 이 Mac의 설정도 바꿀 수 없습니다.
184
192
  - **업데이트:** 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 체크아웃과 이름을 바꾼 사본은 아무것도 보내지 않습니다. 이 기능에는 스위치가 없습니다.
193
+ - **터키어 스킬 팩:** 기본값은 켜짐이며, 앱 언어가 Türkçe일 때만 동작합니다. 브라우저가 dsh의 UI 언어를 Host 쪽에 알려 줍니다. 그러면 Host 쪽은 하루에 많아야 한 번 `api.github.com`에 `yucezerey/turkish-anti-ai-skill`의 최신 커밋과 파일 목록을 묻고, 바뀐 Markdown 파일을 `raw.githubusercontent.com`에서 내려받습니다. 업데이트 확인 때처럼 GitHub는 IP 주소를 볼 수 있지만, 사용자나 채팅에 대한 정보는 보내지 않습니다. `skills/turkish-anti-ai-skill/` 폴더의 일반 `.md` 파일만 남기며(최대 20개, 1 MB), 각 파일은 GitHub 파일 목록의 ID와 일치해야 합니다. 사본은 `$DSH_HOME/cache/composer-plus/turkish-skill/<commit>`(소유자만 접근)에 있고 dsh의 스킬 목록에 들어갑니다. 팩의 스크립트는 실행하지 않습니다. 스위치와 마지막으로 알린 언어는 `$DSH_HOME/storages/dsh-composer-plus/turkish-skill.json`에 있습니다. 끄면 스킬이 제거되고 사본이 삭제됩니다.
194
+ - **사용 수 집계:** Host 쪽은 GitHub에 설치된 버전의 릴리스에 있는 작은 파일 두 개(`github.com/furkancak1r/dsh-composer-plus/releases/download/v<version>/<file>`)를 요청합니다. `active.txt`는 하루에 한 번, `installed.txt`는 dsh 홈마다 단 한 번 요청합니다. GitHub는 이 요청을 파일별로 세므로, 작성자는 그날 각 버전의 사본 몇 개가 `active.txt`를 요청했는지와 모두 몇 개의 사본이 `installed.txt`를 요청했는지(사본 수)만 봅니다. 요청에는 ID, 쿠키, 사용자나 채팅에 관한 데이터가 없습니다. 업데이트 확인 때와 마찬가지로 GitHub는 IP 주소를 봅니다. 마지막 `active.txt` 요청 날짜는 `$DSH_HOME/storages/dsh-composer-plus/active.json`에, `installed.txt`가 집계되었다는 표시는 `$DSH_HOME/storages/dsh-composer-plus/installed.json`에 저장됩니다. 이 저장소의 git 체크아웃과 이름을 바꾼 사본은 아무것도 보내지 않습니다. 이 기능에는 스위치가 없습니다.
186
195
  - **다음 메시지 예측:** 기본적으로 켜져 있습니다. 이 모델 호출을 막으려면 **설정 → Composer Plus**에서 끄세요. 턴이 끝날 때마다 Host 쪽은 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론 제외)을 최대 약 6,000자(가장 최근 부분)까지 고른 모델(다른 모델을 고르지 않으면 dsh의 기본 모델)에 보냅니다. dsh 자체 제공자 설정을 거쳐 요청 한 번으로 전달됩니다. 채팅에는 아무것도 저장되지 않으며, 예측은 채팅 기록에 추가되지 않습니다. 스위치와 고른 모델은 `$DSH_HOME/storages/dsh-composer-plus/predict.json`(소유자 전용 파일)에 보관됩니다.
187
196
  - **입력 중 자동 완성:** 켜기 전까지 꺼져 있습니다. 켜져 있는 동안 입력을 멈출 때마다 Host 쪽은 지금까지 입력한 텍스트와, 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론 제외)을 채팅 기준 최대 약 3,000자까지 **입력 중 자동 완성**에서 고른 모델(기본값: **다음 메시지 예측**의 모델)에 보냅니다. 입력을 다시 멈추면 이전 요청은 중지됩니다. 채팅에는 아무것도 저장되지 않습니다. 스위치는 `$DSH_HOME/storages/dsh-composer-plus/complete.json`(소유자 전용 파일)에 보관됩니다.
188
197
  - **프롬프트 개선:** 요술봉을 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽은 초안, 그 채팅에서 사용자가 직접 보낸 메시지와 에이전트의 텍스트 답변(도구 출력, 숨은 컨텍스트, 추론, 되돌린 메시지 제외. 최대 약 6,000자, 가장 최근 부분), **기능 아이디어**와 같은 프로젝트 요약(파일 규칙도 같음: `.env*`나 키 파일 없음, 폴더 밖을 가리키는 심볼릭 링크 없음, FIFO 없음), `git status`가 변경됨으로 표시하는 경로, 이름에 초안과 같은 단어가 들어 있는 추적되거나 추적되지 않는(무시되지 않은) 경로 최대 30개를 **프롬프트 개선**에서 고른 모델(기본값: 채팅 자체의 모델)에 요청 한 번으로 보냅니다. 이 요약 외의 파일 내용은 보내지 않습니다. 채팅과 프로젝트에는 아무것도 쓰지 않습니다. 답변은 입력란의 초안을 바꿀 뿐이며, 보낼지는 사용자가 정합니다. 고른 모델은 `$DSH_HOME/storages/dsh-composer-plus/improve.json`(소유자 전용 파일)에 보관됩니다.
@@ -190,6 +199,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
190
199
  - **새 채팅에서 계속:** 클릭하기 전에는 아무것도 실행되지 않습니다. 클릭하면 Host 쪽은 채팅(목표 확인이 읽는 방식과 같음: 추론과 되돌린 단계 제외)을 채팅 자체의 모델에 보내고 인계 메모를 보여 줍니다. 새 채팅을 만드는 것은 **새 채팅 시작**뿐입니다. 프로젝트에는 아무것도 쓰지 않습니다.
191
200
  - **컨텍스트 구성:** Host에서 채팅 로그만 읽습니다. 모델 호출도 프로젝트 파일도 없습니다.
192
201
  - **작업 보드:** 보드는 이 창에 있는 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`(소유자 전용 파일)에 있습니다.
202
+ - **어시스턴트:** 어시스턴트 채팅은 `~/Assistant`에 있는 일반 dsh 채팅입니다. 모델 호출은 다른 채팅처럼 dsh의 기본 모델로 갑니다. 도구는 이 Mac에서 다른 채팅의 로그(제목, 프로젝트, 상태, 그리고 chat_read로는 최신 메시지)를 읽고, 모델이 도구를 호출할 때만 그 내용을 모델에 넘깁니다. 채팅에 보내기, 시작, 중지, 보관은 각각 사용자의 승인을 기다립니다. 채팅 ID는 `$DSH_HOME/storages/dsh-composer-plus/assistant.json`에, 스위치는 `assistant-switch.json`에 보관됩니다(소유자 전용 파일). 미리 알림과 자동화는 dsh 자체의 예약 작업입니다. 이 채팅이 보내는 모델 요청과 웹 검색 말고는 아무것도 이 Mac 밖으로 나가지 않습니다.
193
203
  - **보호된 파일:** 목록과 스위치는 `$DSH_HOME/storages/dsh-composer-plus/protected-files.json`(소유자 전용 파일)에 있습니다. 확인은 각 파일 도구 호출의 경로(와 실제 경로)만 읽으며, 파일 자체는 읽지 않습니다.
194
204
  - **차단된 명령:** 규칙과 스위치는 `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json`(소유자 전용 파일)에 있습니다. 확인은 각 `bash`와 `pwsh` 호출의 명령 텍스트만 읽으며, 아무것도 실행하거나 보내지 않습니다.
195
205
  - **비밀 값 입력:** 값은 답변 요청 안에서만 카드에서(또는 요청 본문을 기록하지 않는 게이트웨이를 거쳐 Tether에서) Host로 갑니다. Host는 값을 `$DSH_HOME/storages/dsh-composer-plus/secrets/<임의 이름>`에 씁니다(폴더 0700, 파일 0600). 프로젝트, 채팅 기록, 도구 결과에는 아무것도 들어가지 않습니다. Host는 그 채팅의 이후 도구 결과에서 값을 `[secret]`으로 바꾸기 위해 값을 메모리에 보관합니다. 파일과 이 사본은 그 채팅의 턴이 끝날 때와 dsh가 시작될 때 삭제됩니다. 스위치는 같은 위치의 `secrets.json`에 있습니다. 에이전트가 이 파일로 실행하는 명령은 그 명령이 보내는 곳으로 값을 보낼 수 있습니다. 그것이 이 기능의 목적입니다.
@@ -212,10 +222,11 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
212
222
  - **재시작 후 채팅이 이어지지 않음:** dsh를 종료할 때 재시작 후 이어서 실행이 꺼져 있었거나, 그 턴을 직접 중지했거나, 턴이 이미 끝났거나(완료 또는 실패), 채팅이 보관되었거나, 실행 중인 채팅이 20개보다 많았습니다(가장 최근 채팅 20개만 이어짐).
213
223
  - **재시작 후 대기열이 비어 있음:** 대기열을 비우는 것은 dsh 자체의 종료입니다. 재시작 후 이어서 실행은 이어서 실행하는 채팅에서만 대기열을 되돌립니다. 다른 채팅에서는 메시지를 다시 보내세요. 종료 직전에 삭제한 메시지가 돌아올 수 있습니다. 그때는 다시 삭제하세요.
214
224
  - **GitHub 이슈 열기에 "gh could not open the issue"가 표시됨:** 이 메시지는 `gh` 자체 출력의 첫 줄입니다. 터미널에서 `gh auth status`를 실행하고 `gh auth login`으로 로그인하세요. 채팅 폴더에 GitHub 원격 저장소가 있어야 합니다(`git remote -v`). "not installed or not on the PATH of dsh"는 dsh가 `gh`를 찾지 못했다는 뜻입니다. 설치하거나, `gh`가 작동하는 터미널에서 dsh를 시작하세요.
225
+ - **이슈 보고에 "gh could not open the issue"가 표시됨:** 이 메시지는 `gh` 자체 출력의 첫 줄입니다. 터미널에서 `gh auth status`를 실행하고 `gh auth login`으로 로그인하세요. 또는 **GitHub에서 대신 열기**를 클릭하세요. 초안이 채워진 GitHub 자체의 새 이슈 페이지가 열리고, 그곳에서 이슈를 제출하면 됩니다.
215
226
  - **채팅 행에 브랜치 배지가 없음:** 사이드바가 “하나의 목록” 보기가 아니거나(“작업 공간”과 “작업 공간 트리”에서는 어떤 채팅 행에도 배지가 없음), 이 버전을 설치한 뒤 그 채팅에 턴이 없었거나, 폴더가 git 저장소가 아니거나, **채팅 행의 Git 브랜치**가 꺼져 있습니다. 업데이트한 뒤에는 dsh를 다시 시작하세요(브랜치는 Host 쪽이 기록합니다).
216
227
  - **목표 확인에 테스트가 종료 코드 127 또는 "not found"로 끝났다고 표시됨:** Finder나 Dock에서 시작한 dsh는 터미널보다 PATH가 짧을 수 있어서 `npm`, `pnpm`, `cargo`를 찾지 못합니다. 터미널에서 dsh를 시작하거나, **목표 확인** → **편집**에서 전체 경로를 쓴 테스트 명령을 직접 정하세요. **지금 실행**을 누르면 결과가 바로 표시됩니다.
217
228
  - **목표가 닫히지 않고 에이전트가 계속 작업함:** **목표 확인**이 실패한 테스트나 남은 작업을 찾았습니다. 목표 아래의 행에 이유가 표시됩니다(자세한 내용은 결과에 포인터를 올려 보세요). 원인이나 테스트 명령을 고치거나, `/goal` 또는 목표 바로 목표를 직접 완료하세요(이 완료는 확인하지 않습니다).
218
- - **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.22.0`). 위의 설치 안내를 참고하세요.
229
+ - **릴리스 직후 설치 실패:** 버전을 붙여서 설치하세요(`dsh-composer-plus@1.24.0`). 위의 설치 안내를 참고하세요.
219
230
  - **지금 백업에서 "다른 백업 작업이 실행 중입니다"라고 표시됨:** 다른 dsh 창이나 복구 콘솔에서 작업이 실행 중입니다(둘은 백업 폴더의 잠금 파일 `.composer-plus.lock`을 함께 씁니다). 작업이 끝날 때까지 기다리세요. 실행 중인 작업이 없으면, 다음에 클릭할 때 종료된 프로세스의 잠금을 넘겨받습니다.
220
231
  - **복구 콘솔에 "dsh is running"이라고 표시됨:** 먼저 dsh를 종료하세요. dsh가 정말 닫혀 있다면, 메시지에 나온 파일은 비정상 종료로 남은 것입니다. 그 파일을 삭제하고 다시 시도하세요.
221
232
  - **복원 후 dsh가 시작되지 않거나 플러그인이 없음:** 프로필의 플러그인 패키지를 다시 설치해야 합니다. 복구 콘솔이 복원 후에 이를 제안합니다. 또는 콘솔이 나열하는 `$DSH_HOME/profiles/` 아래의 각 폴더에서 `pnpm install`을 실행하세요. vault에 없던 비밀 값(다른 컴퓨터)은 다시 입력해야 합니다. 콘솔이 그 목록을 보여 줍니다.
@@ -237,9 +248,11 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
237
248
  - 새 버전이 dsh 설정을 하나도 바꾸지 않으면 dsh 0.2.1은 업데이트를 바로 로드합니다. 그 밖의 경우와 dsh 0.2.0에서는 업데이트를 로드하려면 dsh를 다시 시작하세요. 플러그인은 dsh를 대신 재시작하지 않습니다. dsh 플러그인 관리자가 없는 웹/CLI 프로필은 새 버전을 알리기만 합니다.
238
249
  - **Composer Plus N의 새로운 기능**은 **애플리케이션 언어**의 언어로 노트를 보여 줍니다. 다른 지역이 붙은 UI 언어는 기본 언어의 노트를 받습니다(`en-GB`는 영어 노트, `zh-TW`는 `zh`의 중국어 노트). 노트가 없는 언어(다른 언어 팩이 추가한 언어, 또는 `pt-BR`이 아닌 `pt-PT`)에서는 영어 노트를 보여 줍니다. 노트는 새 버전에 함께 들어 있습니다. 실행 중인 사본에 읽을 수 있는 노트 파일(`release-notes.json`)이 없으면 GitHub의 영어 노트를 보여 줍니다.
239
250
  - dsh가 실행 중일 때 설치된 버전(설정 → 플러그인 이나 복사한 폴더로 한 업데이트)은 dsh를 다시 시작해야 로드됩니다. 그때까지 **Composer Plus 업데이트** 는 실행 중인 버전을 보여 주고 다시 시작하라고 합니다. 그 버전의 **Composer Plus N의 새로운 기능** 창은 그 버전의 첫 시작 때 한 번 표시됩니다. 이 플러그인을 처음 설치한 뒤의 첫 시작에는 창이 표시되지 않습니다. **이 버전의 새로운 기능** 은 실행 중인 버전의 노트를 엽니다.
251
+ - 노트 아래의 GitHub 별표 줄은 저장소에 별표를 주었는지 알 수 없습니다. 플러그인은 이를 위해 네트워크를 호출하지 않습니다. 브라우저(와 데스크톱 앱)마다 기록을 따로 저장하므로, 다른 브라우저에서는 이 줄이 한 번 더 표시될 수 있습니다.
240
252
  - **메모와 함께 거부**는 메모를 대기 중인 턴에 메시지로 보낸 다음 요청을 거부합니다. dsh는 메모를 채팅에 사용자의 메시지로 표시합니다. 메모 입력란이 열려 있는 동안 카드에는 **취소**와 **거부**만 표시되므로, 실수로 클릭해도 요청이 허용되지 않습니다. `Esc` 또는 **취소**를 누르면 dsh의 버튼이 다시 나타납니다. 빈 메모는 아무것도 보내지 않습니다(dsh 자체의 **거부**를 쓰세요). 메모를 보낸 뒤 거부가 실패하면(예를 들어 그사이에 요청이 다른 곳에서 응답된 경우) 메모는 채팅에 남고, 모델은 다음 단계에서 메모를 읽습니다. dsh에는 카드 동작용 슬롯이 없어서 버튼을 dsh의 승인 카드 마크업(`data-approval-key`)에 넣습니다. dsh 업데이트로 그 마크업이 바뀌면 버튼은 표시되지 않고, dsh 자체의 **거부**는 전과 같이 동작합니다. 메모는 최대 4,000자까지 쓸 수 있습니다.
241
253
  - **비밀 값 입력**은 값의 정확한 문자열만 숨깁니다. 같은 채팅의 이후 도구 결과에서는 값이 `[secret]`으로 바뀝니다. 하지만 에이전트는 셸 명령으로 파일을 읽고 값을 다른 형태(base64, 일부분, 공백을 넣은 형태)로 출력할 수 있으며, 그 형태는 모델에 전달됩니다. 에이전트 자체의 파일 도구(read, grep, write, edit)는 비밀 값 폴더를 열 수 없습니다. 값이 흔한 단어이기도 하면 그 채팅의 다른 결과에도 `[secret]`이 표시됩니다. 파일은 턴이 끝날 때까지 남습니다. 턴 도중 dsh가 종료되면 다음 시작 시 삭제됩니다. 한 채팅에는 한 번에 하나의 요청만 열려 있을 수 있습니다. 이 도구는 모델 요청마다 약 870자(추정 약 220토큰)를 더합니다. 사용하지 않을 때는 끄세요.
242
254
  - **답장에 인용**은 페이지에 보이는 그대로 텍스트를 인용합니다. 코드 블록, 표, 목록은 Markdown 기호 없이 일반 줄로 들어갑니다. 선택이 한 답변에서 시작해 다른 답변에서 끝나거나 생각 과정, 도구 행, 본인 메시지에 걸치면 버튼이 나타나지 않습니다. 한 답변 안에서 선택하세요. dsh에는 텍스트 선택용 슬롯이 없어서 버튼은 dsh의 채팅 구조로 답변을 찾습니다. dsh 업데이트로 이 구조가 바뀌면 버튼이 나타나지 않습니다. 인용이 입력란 끝에 들어가면 다음에 입력하는 줄이 그 아래에서 시작하도록 빈 줄이 하나 더 들어갑니다. dsh는 보낼 때 끝의 빈 줄을 지웁니다.
255
+ - **파일 미리 보기에서 인용**은 dsh 자체의 파일 미리 보기를 읽습니다. 줄 번호는 미리 보기의 각 줄에서 가져오므로 코드와 텍스트 파일에서는 정확합니다. Markdown 파일은 서식이 적용된 페이지로 보이므로, 그 인용은 Markdown 기호가 없는 텍스트이고 줄 번호도 없습니다. PDF 인용에는 줄이 아니라 페이지가 들어갑니다. 선택이 경로 헤더에 있거나, 다른 뷰어(스프레드시트, Office 파일, 이미지)에 있거나, 열린 두 파일에 걸치면 버튼이 나타나지 않습니다. 오른쪽 사이드바가 전체 화면일 때도 나타나지 않습니다(그때는 입력란이 화면에 없습니다). dsh에는 그곳의 선택용 슬롯이 없어서 버튼은 dsh의 마크업으로 미리 보기를 찾습니다. dsh 업데이트로 이 마크업이 바뀌면 버튼이 나타나지 않습니다. 입력란에는 선택한 텍스트만 들어갑니다. 나중에 파일이 바뀌어도 인용은 바뀌지 않습니다.
243
256
  - **사이드 채팅**의 읽기 전용은 dsh 자체의 읽기 전용 모드에 의한 것입니다. 파일 도구는 쓸 수 없고, 셸 명령은 쓰기가 없는 dsh 샌드박스에서 실행됩니다(샌드박스를 시작할 수 없으면 실행되지 않습니다). 그래도 에이전트는 dsh 승인 카드로 더 많은 권한을 요청할 수 있고, 네트워크 호출(예: API 요청)은 컴퓨터 밖의 무언가를 바꿀 수 있습니다. 복사본은 대기열에 기다리는 메시지가 없던 가장 최근 시점에 만들어집니다. 그래서 대기열에 메시지가 기다리는 동안 한 질문은 그 뒤에 일어난 일을 보지 못합니다. 채팅에서 실행 중인 단계는 복사본에서 닫히므로, 사이드 채팅은 그 단계의 시작은 알지만 결과는 모릅니다. 사이드 채팅은 일반 채팅입니다. 사이드바에 남고 모델 사용량에 포함되니 거기서 보관하세요. 가져오기는 사이드 채팅 자신의 메시지만(최대 12,000자), 각 질문의 마지막 답변만 가져옵니다. 도구 호출 사이의 에이전트 메모는 포함되지 않습니다. dsh는 플러그인이 오른쪽 사이드바에 채팅을 표시할 슬롯을 제공하지 않으므로 사이드 채팅은 메인 화면에서 열립니다.
244
257
  - **diff 메모**는 변경 사항 패널에서만 동작하며 dsh 자체의 마지막 턴 보기에서는 동작하지 않습니다. 범위는 diff의 한 블록(한 `@@` 부분) 안에 있어야 합니다. 메모는 이 브라우저의 저장소에 보관되므로 다른 브라우저나 다른 컴퓨터의 dsh에서는 보이지 않습니다. Tether는 자체 메모를 메모리에 보관합니다. 메모는 클릭할 때의 줄을 그대로 보관하므로, 에이전트가 나중에 파일을 바꿔도 메모에는 이전 줄과 번호가 남습니다. 채팅당 최대 50개, 메모당 최대 2,000자, 40줄입니다(넘으면 `…` 줄).
245
258
  - **이 채팅에서 허용**은 허용한 순간부터 시간 제한을 셉니다. 새 시간 제한은 유효한 허용에 즉시 적용되므로, 더 짧은 시간 제한은 허용을 즉시 끝낼 수 있습니다. 버전 1.12 이하의 허용에는 시간 정보가 없습니다. 업데이트 후 에이전트가 그 도구들에 대해 한 번 더 묻습니다.
@@ -247,7 +260,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
247
260
  - **질문 카드를 창에 맞추기**는 dsh의 질문 카드만 바꾸고 계획 검토 카드는 바꾸지 않습니다. 카드는 dsh의 마크업(`data-question-key`, `data-question-scroll`)으로 찾습니다. dsh 업데이트로 이 마크업이 바뀌면 카드는 dsh가 그리는 대로 보입니다. 카드 높이는 채팅이 아니라 창을 따릅니다. 좁은 사이드 패널 안의 채팅에서는 높은 카드가 채팅 위로 넘칠 수 있습니다.
248
261
  - **채팅 헤더를 창에 맞추기**는 dsh가 생성한 클래스 이름(`_titleRow`, `_titleCluster`, `_crumbs`, `_headerActions`, `_headerUtilities`)으로 채팅 헤더를 찾습니다. dsh에 헤더 레이아웃용 훅이 없기 때문입니다. dsh 업데이트로 이 이름이 바뀌면 헤더는 dsh가 그리는 그대로 보입니다. 아주 좁은 채팅 열에서는 헤더가 두세 줄을 차지할 수 있어 메시지 위의 공간이 줄어듭니다.
249
262
  - **모바일 연결**은 macOS에서만 작동합니다(`en0`, `openssl`, `swift`, `dns-sd` 사용). 고정 포트 19390과 19391을 쓰므로, Mac마다 한 번에 dsh 하나에서만 실행할 수 있습니다(각 Mac은 휴대폰의 Mac 목록에서 항목 하나입니다). `apns.json`에 APNs 키가 있으면(`tether/README.md` 참고) Mac이 Apple 푸시 서비스로 알림을 보내므로 Tether가 닫혀 있어도 알림이 옵니다. Mac은 깨어 있고 dsh가 열려 있어야 합니다. 키가 없으면 휴대폰은 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분 안에 반복된 시도는 새 행을 만들지 않고 같은 행의 횟수를 하나 늘립니다. 각 알림에는 Mac과 채팅의 프로젝트(`Studio Mac · recipe-box`), 채팅 제목, 본문이 표시됩니다. Turn finished에는 에이전트의 마지막 답변이 표시됩니다. APNs 키가 있으면 이 본문은 Apple의 푸시 서비스를 거칩니다. Tether의 앱 잠금은 iPhone 잠금 화면의 알림 미리보기를 숨기지 않습니다. iOS 설정에서 끄세요. Tether의 초록 점은 Mac을 따릅니다. dsh에서 연 채팅은 휴대폰에서도 점이 사라집니다. Tether에서 연 채팅은 휴대폰에서만 점이 사라집니다. Mac에 있는 dsh 자체의 점은 Mac에서 그 채팅을 열 때까지 남습니다.
250
- - **원격 컴퓨터**를 쓰려면 두 Mac 모두에 Tailscale이 있어야 하고, 여는 대상 Mac에 이 기능을 켠 Composer Plus가 있어야 합니다. 그 Mac은 잠자기 상태가 아니어야 하며 dsh가 실행 중이어야 합니다. 다른 컴퓨터는 화면에 있는 채팅의 오른쪽 사이드바 브라우저 탭에서 열립니다. 이 탭은 그 채팅에 속하므로, 다른 채팅에서는 그 채팅의 사이드바가 표시됩니다. 채팅이 없으면(또는 브라우저 탭이 없는 dsh web에서는) 컴퓨터가 브라우저 창에서 열립니다. 선택 메뉴는 기본 영역에 채팅이나 새 채팅 화면이 있을 때만 표시되며, 작업 보드에서는 표시되지 않습니다. 포트 19392를 씁니다(Mac마다 다른 컴퓨터를 받아들일 수 있는 dsh는 하나뿐입니다). 다른 컴퓨터의 페이지 안에서 연 컴퓨터에는 선택 메뉴가 없으므로, 거기서 세 번째 Mac을 열 수 없습니다.
263
+ - **원격 컴퓨터**를 쓰려면 두 Mac 모두에 Tailscale이 있어야 하고, 여는 대상 Mac에 이 기능을 켠 Composer Plus가 있어야 합니다. 그 Mac은 잠자기 상태가 아니어야 하며 dsh가 실행 중이어야 합니다. 선택 메뉴는 왼쪽 사이드바가 열려 있을 때만 표시됩니다(아이콘만 보이는 상태에서는 표시되지 않습니다). 다른 Mac의 페이지에 자체 선택 메뉴가 없으면(그쪽 Composer Plus가 1.23.0보다 오래된 경우) 이 Mac의 선택 메뉴가 같은 위치에서 그 페이지 위에 표시됩니다. 그쪽이 1.23.0이면 선택 메뉴에 그 Mac의 이름이 표시됩니다. 돌아오려면 그 메뉴에서 **이 Mac**을 고르세요. 연 컴퓨터마다 그 페이지가 메모리에 남으며, 이 기능을 끄거나 dsh를 다시 시작할 때까지 유지됩니다. 데스크톱 앱에서 다른 Mac의 페이지는 임베드된 페이지입니다. dsh 자체의 키보드 단축키(예: 새 채팅)는 그 안에서 작동하지 않으며, 파일 다운로드, 마이크, 알림도 그곳에서 작동하지 않습니다. 포트 19392를 씁니다(Mac마다 다른 컴퓨터를 받아들일 수 있는 dsh는 하나뿐입니다). 다른 Mac의 페이지에서 선택 메뉴는 이 Mac의 컴퓨터들 사이에서만 전환하므로, 다른 Mac을 거쳐 세 번째 Mac을 열 수 없습니다.
251
264
  - 세션 링크는 채팅 안에서 작동하지만, 클릭해도 채팅이 열리지는 않습니다. **메시지 링크 복사**로 만든 링크는 dsh 0.2.1 이상에서만, 그리고 채팅 안의 메시지에서만 그 메시지를 엽니다(dsh 0.2.0에는 사용자 텍스트 규칙이 없으므로, 링크는 복사되지만 일반 텍스트로 보입니다). 되돌리기로 빠진 메시지나, 압축으로 dsh가 불러오는 기록에서 빠진 메시지는 보여 줄 수 없습니다. 이때 링크가 그렇다고 알려 줍니다. 🔗 버튼은 dsh의 메시지 행에 붙습니다. dsh 업데이트로 그 마크업이 바뀌면 버튼이 표시되지 않습니다.
252
265
  - **모두 읽음으로 표시**는 공개 API가 아닌 dsh의 일부(dsh 세션 상태의 `completionUnread` 목록)를 통해 dsh 자체의 읽지 않음 점을 바꿉니다. dsh 업데이트로 이 이름이 바뀌면 항목이 표시되지 않습니다. 이 항목은 dsh의 프로젝트 "…" 메뉴에 들어가는데, 이 메뉴에는 플러그인용 슬롯이 없습니다. dsh가 이 메뉴를 바꾸면 이 항목도 표시되지 않습니다.
253
266
  - **대기 중인 메시지 제자리 편집**은 그사이 전송이 시작된 메시지를 바꾸지 않고, 그사이 바뀐 메시지(예: iPhone의 Tether에서 바꾼 메시지)를 덮어쓰지 않으며, 알림으로 이를 알려 줍니다. 새 이미지에는 이미지를 받는 모델이 필요하고(dsh 자체의 이미지 제한이 적용됩니다), 새 파일은 업로드가 끝나야 저장할 수 있습니다. 내 대기 중인 메시지만 편집할 수 있고, 대기열의 목표 라운드나 질문에 대한 답변은 편집할 수 없습니다. 플러그인을 업데이트한 뒤에는 텍스트만 바꾸는 편집만 바로 되며, 이미지나 파일이 있는 메시지를 저장하려면 먼저 dsh를 다시 시작해야 합니다(Host 쪽은 시작할 때 로드됩니다).
@@ -255,6 +268,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
255
268
  - **트리** 브랜치 맵은 각 화살표가 어디로 가는지 추측합니다. git은 브랜치가 어느 브랜치로 병합되었는지 저장하지 않기 때문입니다. 병합된 브랜치는 병합 커밋으로 그 브랜치를 처음 받아들인 브랜치를 가리킵니다. 대기 중인 브랜치는 그 브랜치가 시작된 가장 가까운 브랜치(메인 브랜치 우선)를 가리킵니다. 두 브랜치가 같은 커밋에서 시작되었으면 맵이 잘못된 브랜치를 고를 수 있습니다. fast-forward로 앞으로 이동한 브랜치에는 병합 커밋이 없으므로, 그 브랜치의 **병합됨** 라벨을 클릭해도 아무것도 열리지 않습니다. 메인 브랜치는 `origin`의 기본 브랜치이고, 없으면 `main` 또는 `master`, 그것도 없으면 열려 있는 브랜치입니다. 맵은 최신 커밋 20,000개를 읽고 브랜치를 최대 60개까지 보여 줍니다. 기록이 더 길면 일부 화살표가 틀릴 수 있다고 알려 줍니다. squash나 rebase로 병합한 브랜치(예: GitHub에서)는 **대기 중**으로 표시됩니다. git이 그 커밋과의 연결을 저장하지 않기 때문입니다.
256
269
  - **이 채팅**은 dsh의 파일 도구(`write`, `edit`, `str_replace_editor`)가 쓴 파일만 셉니다. 명령(`bash`)이 바꾼 파일은 이 보기에 없고, **커밋 안 됨**에 표시됩니다. 채팅의 턴 되돌리기 스냅샷이 없으면(턴 되돌리기 꺼짐, dsh-rewind-plugin 설치됨, 또는 플러그인보다 오래된 채팅) 보기는 마지막 커밋과 비교하고 그렇다고 알려 줍니다. 턴 되돌리기는 채팅마다 최신 스냅샷 50개를 보관합니다. 더 긴 채팅에서는 보기가 보관된 가장 오래된 스냅샷과 비교하고, 어느 메시지부터인지 알려 주며, 그 이전의 변경은 세지 않습니다. **공백 변경 숨기기**는 `git diff -w`입니다. 줄 안의 공백만 바뀐 줄도 숨겨집니다.
257
270
  - **GitHub 이슈 열기**에는 dsh의 PATH에 있는 GitHub CLI(`gh`)와 채팅 폴더의 GitHub 원격 저장소가 필요합니다. 최대 60초 동안 실행됩니다. `gh`가 더 오래 걸리면, 이슈가 GitHub에는 만들어졌지만 목록에는 링크가 없을 수 있습니다(다시 클릭하기 전에 GitHub를 확인하세요. 목록은 끝난 실행에서만 링크를 읽으므로, 다시 클릭하면 두 번째 이슈가 열릴 수 있습니다). GitHub 원격 저장소가 둘 이상인 폴더는 `gh` 자체의 기본값(`gh repo set-default`)을 씁니다.
271
+ - **이슈 보고**는 Composer Plus 저장소(`furkancak1r/dsh-composer-plus`)에만 이슈를 열며, 사용자의 프로젝트에는 열지 않습니다(프로젝트에 열려면 기능 아이디어의 **나중에** 목록에서 **GitHub 이슈 열기**를 사용하세요). 초안을 쓰려면 dsh에 기본 모델이 있어야 하고, 이슈를 열려면 로그인된 GitHub CLI(`gh`)가 있어야 합니다. 초안은 항상 영어입니다. 모델이 세부 사항을 틀릴 수 있으므로, **이슈 열기**를 클릭하기 전에 초안을 읽어 보세요. 이슈를 여는 작업은 최대 60초 동안 실행됩니다. 한 시간 안에 같은 제목과 텍스트로 다시 열면 복사본 대신 이전 이슈를 보여 줍니다. **GitHub에서 대신 열기**는 링크를 짧게 유지하려고 아주 긴 설명을 자릅니다.
258
272
  - **이 파일을 변경한 채팅**은 **이 채팅**처럼 dsh의 파일 도구(`write`, `edit`, `str_replace_editor`)만 압니다. 명령(`bash`)으로 만든 변경은 목록에 나오지 않습니다. 저장소의 최신 채팅 300개(만든 시점 기준)를 읽고, 더 있으면 그렇다고 알려 줍니다. 최대 100행을 보여 줍니다. 이름이 바뀐 파일은 도구가 쓴 이름으로 표시됩니다. 폴더가 저장소 밖에 있는 채팅(같은 파일로 가는 다른 경로를 통한 경우도 포함)은 세지 않습니다. dsh를 시작한 뒤 처음 열 때는 저장소의 모든 채팅 로그를 읽습니다(채팅 275개에 약 4초). 그 뒤로 열 때는 그 이후에 바뀐 채팅만 읽습니다.
259
273
  - **채팅 행의 Git 브랜치**는 현재 브랜치가 아니라, 마지막 턴이 시작되거나 끝날 때 채팅 폴더가 있던 브랜치를 보여 줍니다. 턴 밖에서 브랜치를 바꾸면 다음 턴 뒤에 표시됩니다. 이 버전 이전의 채팅에는 다음 턴까지 배지가 표시되지 않습니다. 배지는 dsh의 채팅 행 마크업 안에 들어갑니다(dsh에는 그곳에 슬롯이 없습니다). dsh 업데이트로 그 마크업이 바뀌면 배지가 표시되지 않습니다. 배지는 “하나의 목록”에서만 표시됩니다.
260
274
  - **채팅별 브랜치**를 계획 모드에서 쓸 때: dsh는 `/plan <메시지>`를 메시지가 아니라 명령으로 보냅니다. 그래서 Composer Plus가 dsh 입력란에서 명령 전송을 가로챕니다(공개 API가 아님). dsh 업데이트로 이것이 바뀌면, **새 브랜치**를 고른 상태의 `/plan <메시지>`는 열린 새 채팅에서 dsh 자체 명령으로 실행됩니다. Host가 새 채팅에서 계획 모드를 켜지 못하면 브랜치 폴더는 남고 메시지는 보내지지 않습니다. 따라서 새 채팅이 기본 모드에서 파일을 바꾸지 않습니다.
@@ -279,7 +293,10 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
279
293
  - **새 채팅에서 계속**은 채팅(메시지, 도구 호출, 각 도구 결과의 끝부분. 최대 약 60,000자, 가장 최근 부분)을 채팅 자체의 모델에 보냅니다. 인계 메모는 결정이나 파일을 빠뜨릴 수 있으므로, 시작하기 전에 읽어 보세요. 새 채팅은 메모와 링크된 채팅만 압니다(dsh는 이전 채팅을 읽기 전용 컨텍스트로 첨부합니다). 새 채팅의 모델 컨텍스트는 작게 시작하고, 이전 채팅은 그대로 남습니다. 채팅마다 한 번에 메모 작성이나 시작 하나만 실행됩니다.
280
294
  - **컨텍스트 구성**은 dsh 자체의 규칙(토큰당 약 4자)으로 추정값을 보여 줍니다. dsh의 컨텍스트 링과 같은 규칙이며, 모델 자체의 계산과 다를 수 있습니다. 도구 정의는 가장 최근 요청의 것입니다. 채팅 로그에 있는 그대로의 컨텍스트를 보여 주며, 지금 실행 중인 턴은 다음 단계 뒤에 나타납니다.
281
295
  - **계획된 단계**는 모델이 실제로 계획할 때만 토큰을 절약합니다. 켜져 있는 동안에는 모델이 계획하지 않는 채팅에서도 모든 요청에 `plan_next_steps` 도구와 짧은 지침(약 500토큰)이 포함됩니다. 조건은 적힌 내용만 증명합니다(예: 빌드 종료 코드가 0이었음). 작업이 올바르다는 것은 증명하지 않습니다. `ok`는 dsh 자체의 결과 표시(`[exit code: N]`, 시간 초과, 샌드박스 거부)를 읽습니다. 0이 아닌 종료 코드 없이 실패한 명령은 통과로 처리됩니다. 단계는 한 번에 하나씩 실행되며, 동시에 준비된 두 단계는 모델에게 돌아갑니다. 단계의 메시지는 채팅 모델의 어시스턴트 메시지로 저장됩니다(dsh에는 플러그인이 쓴 메시지를 나타내는 표시가 없습니다). 그래서 그 텍스트에 Composer Plus가 실행했다고 적혀 있습니다. Tether에는 없습니다.
296
+ - **터키어 스킬 팩**은 서드파티 스킬을 설치합니다. 규칙은 Composer Plus가 아니라 작성자의 GitHub 저장소에서 오며, 새 버전은 우리가 검토하지 않은 채 다음 일일 확인부터 사용됩니다. 확인은 파일이 GitHub가 해당 커밋에 나열한 파일과 같다는 것만 증명하며, 규칙이 좋다는 것을 증명하지는 않습니다. 스킬을 언제 불러올지는 모델이 정합니다(이름으로 직접 부를 수도 있습니다). 규칙은 터키어 글에만 적용됩니다. Host 쪽은 브라우저가 마지막으로 알린 언어를 사용합니다. 두 브라우저가 서로 다른 언어를 쓰면 가장 최근 것이 적용됩니다. GitHub는 로그인 없이 시간당 60회의 API 호출만 허용합니다. 확인이 거부되면 설치된 사본을 유지하고 설정에 이유를 표시합니다.
297
+ - **코드베이스 정리**에는 스킬의 고정된 사본(caldoai/skills, 커밋 f3cf477)이 들어 있습니다. 원본의 변경은 새 Composer Plus 버전으로만 들어옵니다. 이 스킬은 많은 파일을 바꿀 수 있는 긴 목표를 실행하며, 하위 에이전트와 확인 작업이 많은 토큰을 씁니다. 테스트가 없는 부분에서는 모르는 사이에 동작이 바뀔 수 있습니다. 별도 브랜치에서 시작하고 병합 전에 diff를 읽으세요. 프로젝트, 사용자 지정 스킬 폴더 또는 `~/.dsh/skills`에 같은 이름의 스킬이 있으면 그 스킬이 대신 쓰입니다. 스위치가 꺼져 있으면 `/untangle-codebase`는 일반 텍스트로 모델에 전달됩니다.
282
298
  - **작업 보드**는 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 창 안에만 있습니다. 다시 불러오거나 다른 창에서는 끝난 채팅이 모두 읽은 것으로 보이므로 **최근 완료**에 있습니다.
299
+ - **어시스턴트**는 이 Mac의 모든 창에서 채팅 하나를 씁니다. workspace-write 권한 모드로 실행됩니다. 파일은 `~/Assistant` 안에만 쓰고, 그 밖에서 실행하는 명령은 먼저 묻습니다. 채팅을 승인이 없는 모드(전체 액세스)로 바꾸면 dsh가 모든 승인을 거부하므로, 어시스턴트는 채팅에 보내기, 시작, 중지, 보관을 할 수 없습니다. 승인 카드는 이 여섯 도구만 지킵니다. 그 모드의 다른 채팅과 마찬가지로, 어시스턴트의 셸 명령은 여전히 네트워크에 접근할 수 있습니다. dsh 0.2.0과 0.2.1에서 dsh의 예약 도구는 어시스턴트 채팅 자신의 미리 알림만 보고, 다른 채팅의 자동화는 보지 못합니다. dsh 0.2.2부터는 모든 예약 작업을 나열하고 바꿉니다. chats_list는 보관된 채팅, 빈 채팅, 하위 에이전트 채팅과 어시스턴트 채팅 자신을 빼고 보여 줍니다. “사용자를 기다림”은 실행 중인 채팅에 열린 승인, 질문 또는 계획 검토가 있다는 뜻입니다. chat_read는 사용자의 메시지와 에이전트의 답변(도구 출력 제외)을 최대 50개 메시지, 약 24,000자까지 돌려줍니다. chat_archive는 아직 실행 중이거나 활성 미리 알림이 있는 채팅을 거부합니다. 모델은 읽은 텍스트에 여전히 속을 수 있습니다. 승인 카드가 마지막 확인이므로, **한 번 허용**을 클릭하기 전에 읽어 보세요.
283
300
  - **중지 후 보낸 메시지 먼저 실행**은 채팅을 중지한 뒤에만 동작합니다(또는 실패한 턴 뒤, 아직 대기열이 있는 채팅을 열 때). 턴이 실행되는 중에 보낸 메시지는 여전히 대기열 끝에서 기다립니다. 내가 대기열에 넣은 메시지만 앞지릅니다. 대기열에 목표 라운드나 질문 답변이 기다리고 있으면 dsh 자체 순서가 유지됩니다. 공개 API가 아닌 dsh의 일부(중지된 턴이 아직 끝나는 중인지)를 읽습니다. dsh 업데이트로 그 이름이 바뀌면, 메시지는 그 턴이 끝난 뒤에만 앞으로 옮겨집니다. 서브에이전트 채팅은 dsh 자체 순서를 유지합니다.
284
301
  - **프로젝트 메모리**는 채팅의 첫 폴더(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 자체의 메모리를 읽거나 쓰지 않습니다.
285
302
  - **메모리 버전 기록** 은 메모리(각 프로젝트와 전역 메모리)마다 최신 50개 버전을 보관하고, 더 오래된 것은 지웁니다. 한 버전은 메모 하나가 아니라 그 프로젝트의 메모리 전체입니다. **복원** 은 그 버전의 모든 파일(주제 포함)을 되돌리며, 버전을 연 뒤에 메모리가 바뀌었으면 거부합니다. 복원 전의 메모리는 새 버전이 되므로 복원을 되돌릴 수 있습니다. 스위치가 꺼져 있는 동안에는 새 버전을 보관하지 않고 **복원** 도 거부됩니다. 보관된 버전은 남습니다. 이 기능 이전의 버전은 없습니다. 기록은 설치 후 첫 저장부터 시작합니다.
@@ -293,6 +310,8 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
293
310
  - **복원**은 dsh가 닫혀 있을 때 복구 콘솔에서만 실행되며, dsh 홈 전체를 바꿉니다. 기존 홈은 직접 삭제할 때까지 옆에 `.dsh.pre-restore-<time>`으로 남으므로, 디스크에 둘 다 들어갈 공간이 필요합니다. 채팅은 프로젝트 경로를 그대로 유지합니다. 다른 컴퓨터에서 다른 경로에 있는 프로젝트는 다시 추가할 때까지 없는 것으로 표시됩니다. dsh 홈 밖을 가리키는 심볼릭 링크(예: 다른 폴더에서 링크한 스킬)는 링크로 돌아오며, 그 대상은 그 컴퓨터에 있어야 합니다.
294
311
  - **세션 로그 점검**은 무엇이 열리는지에 대한 dsh 자체 규칙으로 각 채팅의 최신 로그를 읽습니다. JSON이 아니거나 순서가 어긋난 행은 그 뒤에 턴 종료가 있을 때만 손상으로 칩니다(그렇지 않으면 dsh는 그 행부터의 내용을 빼고 채팅을 열기 때문에 목록에 나오지 않습니다). 로그의 이벤트를 dsh 자체의 이벤트 규칙과 비교하지는 않으므로, 정상으로 판정한 로그도 dsh 업그레이드 후에 열리지 않을 수 있습니다. 복구는 백업에서 사본을 가져옵니다. 그 백업 이후의 메시지는 그 채팅에서 사라집니다(손상된 파일은 옆에 남음). 이 dsh에서 열려 있는 채팅은 설정에서 복구되지 않습니다. dsh가 그 채팅을 잡고 있기 때문입니다.
295
312
  - **자동 백업**은 dsh가 실행 중일 때만 실행됩니다. dsh가 닫혀 있는 동안 예정되었던 백업은 다음 시작 후 약 45초 뒤에 실행됩니다. 새 버전의 스냅샷은 업데이트 전이 아니라 그 시작 후에 만들어집니다.
313
+ - **창 크기 기억하기** 는 데스크톱 앱에서만 작동합니다. 시작할 때마다 dsh는 먼저 창을 1280 × 820으로 표시하고, 플러그인이 로드되면 창이 저장된 크기로 바뀝니다. 페이지에는 창 이동 이벤트가 없으므로 플러그인은 1초마다 창을 읽습니다. dsh를 종료하기 전 마지막 2초 동안의 변경은 저장되지 않습니다. 크기는 컴퓨터마다 앱 자체 저장소에 보관됩니다.
314
+ - **사용 수 집계:** 사람이 아니라 사본을 셉니다. dsh 홈 하나가 사본 하나입니다. 고유 사본 수(`installed.txt`)에는 이 파일이 있는 첫 버전이나 그보다 새 버전으로 업데이트한 사본만 들어갑니다. 더 오래된 버전에 머문 사본은 세지 않습니다. `storages` 폴더를 지운 사본은 다시 셉니다. GitHub는 같은 IP 주소(예: NAT 라우터 하나 뒤의 여러 컴퓨터)에서 약 10분 안에 온 요청을 한 번으로 셀 수 있습니다.
296
315
  - 기본 지원은 업스트림에 요청해 두었습니다: 대기열 `move`는 [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773), 계속 상태는 [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269).
297
316
 
298
317
  ## 자주 묻는 질문
@@ -331,6 +350,8 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
331
350
 
332
351
  **모든 채팅을 칸반 보드로 보고 거기서 새 채팅을 시작할 수 있나요?** 네, **작업 보드**(기본적으로 켜짐)로 가능합니다. 왼쪽 사이드바에서 여세요. 각 채팅은 **진행 중**, **검토**(사용자를 기다림) 또는 **완료**에 있는 카드입니다. **새 작업**은 프로젝트에서 dsh의 새 채팅을 열고, 첫 메시지를 보내면 보드로 돌아옵니다. 주황색 카드에서 **답변**을 클릭하면 채팅을 열지 않고 답할 수 있습니다. **완료**의 **모두 빼기**는 먼저 확인을 묻고, 읽은 끝난 카드를 보드에서 뺍니다. **실행 취소**와 **뺀 카드 (N)**로 카드를 되돌릴 수 있으며, 채팅은 dsh에 남습니다.
333
352
 
353
+ **알림을 주고 다른 채팅도 관리해 주는 개인 어시스턴트 채팅을 쓸 수 있나요?** 네, **어시스턴트**(기본적으로 꺼짐)로 가능합니다. 설정 → Composer Plus에서 켠 다음, 왼쪽 사이드바에서 **어시스턴트**를 클릭하세요. dsh의 예약 작업으로 미리 알림을 설정하고, 웹을 검색하고, 채팅을 나열하고 읽습니다. 채팅에 메시지를 보내거나 채팅을 시작, 중지, 보관하는 일은 사용자가 승인한 뒤에만 합니다. 프로필은 그 프로젝트 메모리에 “profil” 주제로 저장해 두세요.
354
+
334
355
  **dsh-backup처럼 dsh에서 채팅과 설정을 백업할 수 있나요?** 네. **설정 → Composer Plus → 백업 → 지금 백업**을 사용하세요. 같은 아카이브 형식으로 같은 폴더(`~/Desktop/dsh-backups`)에 쓰므로, dsh-backup의 아카이브도 표시되고 복원할 수 있으며, dsh-backup은 삭제해도 됩니다. 정해진 일정으로 백업하려면 **자동 백업**을 켜세요.
335
356
 
336
357
  **dsh가 더 이상 시작되지 않습니다. 백업을 어떻게 복원하나요?** 백업 폴더(`~/Desktop/dsh-backups`)를 열고 `Composer Plus Rescue.command`를 더블클릭하세요(Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). `3) Restore a backup`을 선택하고, 백업 하나를 고른 뒤 `RESTORE`를 입력하세요. dsh 없이도 작동합니다.
@@ -363,6 +384,8 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
363
384
 
364
385
  **긴 답변의 일부에만 답하려면?** 그 부분을 선택하고 선택 영역 위의 **인용**을 클릭하세요(**답장에 인용**, 기본적으로 켜짐). 그 부분이 `> …` 인용으로 입력란에 들어가고, 그 아래에 답장을 쓰면 됩니다.
365
386
 
387
+ **파일의 정확한 줄을 에이전트에게 보여 주려면?** 오른쪽 사이드바에서 파일을 열고(**작업 공간 파일**) 줄을 선택한 다음 선택 영역 위의 **인용**을 클릭하세요(**파일 미리 보기에서 인용**, 기본적으로 켜짐). 입력란에 경로와 줄 번호(예: `src/login.js:2-3`), 그리고 코드 블록으로 된 줄이 들어갑니다. 그 아래에 질문을 쓰면 됩니다.
388
+
366
389
  **에이전트를 멈추지 않고 작업 중에 질문할 수 있나요?** 질문을 입력하고 입력란의 **사이드 채팅에서 질문**을 클릭하세요(**사이드 채팅**, 기본적으로 켜짐). 채팅의 읽기 전용 복사본이 답하고, 채팅은 계속 작업합니다. 사이드 채팅에서 **가져오기**를 누르면 답변이 채팅 입력란에 들어갑니다.
367
390
 
368
391
  **에이전트에게 diff에서 무엇을 바꿀지 알려 주려면?** **변경 사항 패널**에서 파일의 diff를 열고 줄의 **+**를 클릭해 메모를 쓰세요(**diff 메모**, 기본적으로 켜짐). 그런 다음 **입력란으로 보내기**를 클릭하면 메모가 파일, 줄 번호, 줄과 함께 입력란에 들어갑니다.
@@ -371,7 +394,7 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
371
394
 
372
395
  **iPhone을 잃어버렸습니다. 그 iPhone이 Mac에 접속하지 못하게 하려면 어떻게 하나요?** 사이드바 왼쪽 아래의 **모바일 연결**을 클릭하고, 그 iPhone 옆의 **Remove**를 클릭하세요. 그 iPhone의 키는 즉시 작동을 멈춥니다. 다시 연결하려면 Mac에서 승인하는 새 페어링이 필요합니다.
373
396
 
374
- **다른 Mac의 채팅을 이 Mac에서 이어 가려면 어떻게 하나요?** 다른 Mac에서 **설정 → Composer Plus → 원격 컴퓨터**와 **다른 컴퓨터에서 이 Mac 열기 허용**을 켜고, **페어링 링크 만들기**를 클릭한 뒤 링크를 복사하세요(예: AirDrop이나 메모로 나에게 보내세요). 이 Mac에서도 **원격 컴퓨터**를 켜고, 채팅 제목 왼쪽에서 **컴퓨터 추가…** 항목을 고른 뒤 링크를 붙여 넣고 **연결**을 클릭하세요. 그다음 다른 Mac에서 **승인**을 클릭하세요. 이후에는 같은 메뉴에서 그 컴퓨터를 고르면 됩니다.
397
+ **다른 Mac의 채팅을 이 Mac에서 이어 가려면 어떻게 하나요?** 다른 Mac에서 **설정 → Composer Plus → 원격 컴퓨터**와 **다른 컴퓨터에서 이 Mac 열기 허용**을 켜고, **페어링 링크 만들기**를 클릭한 뒤 링크를 복사하세요(예: AirDrop이나 메모로 나에게 보내세요). 이 Mac에서도 **원격 컴퓨터**를 켜고, 왼쪽 사이드바의 선택 메뉴(브랜드 이름 오른쪽, **새 세션** 위)에서 **컴퓨터 추가…** 항목을 고른 뒤 링크를 붙여 넣고, **이름**을 입력하고 **연결**을 클릭하세요. 그다음 다른 Mac에서 **승인**을 클릭하세요. 이후에는 같은 메뉴에서 그 컴퓨터를 고르면 됩니다. 그 컴퓨터가 이 창을 채웁니다. 돌아오려면 같은 위치에서 **이 Mac으로 돌아가기**를 클릭하세요. 그동안 이 Mac의 채팅은 계속 실행됩니다.
375
398
 
376
399
  **Face ID로 Tether를 잠글 수 있나요?** 네. Tether에서 "Settings → Privacy → Lock with Face ID"를 켜세요. 그러면 Tether를 열 때와 Tether로 돌아올 때 Face ID(또는 암호)를 요구합니다.
377
400
 
@@ -403,6 +426,12 @@ dsh `0.2.0-rc.2`(데스크톱과 웹)와 `0.2.1-rc.2`(웹)에서 테스트했습
403
426
 
404
427
  **dsh가 모델에 다시 묻지 않고 다음 명령을 실행할 수 있나요?** 네, **계획된 단계**(기본적으로 꺼짐)를 사용하세요. 설정 → Composer Plus에서 켜세요. 그러면 모델이 조건과 함께 다음 명령을 계획할 수 있고(예: “빌드가 통과하면 테스트 실행”), 결과가 조건을 충족하면 Composer Plus가 새 모델 호출 없이 그 단계를 실행합니다. 승인과 샌드박스는 그대로입니다.
405
428
 
429
+ **터키어 스킬은 어디에서 오고, 제거할 수 있나요?** GitHub의 [yucezerey/turkish-anti-ai-skill](https://github.com/yucezerey/turkish-anti-ai-skill)(MIT)에서 옵니다. Composer Plus는 **애플리케이션 언어**가 Türkçe일 때만 설치하고, Markdown 파일만 남기며, 스크립트는 실행하지 않습니다. 제거하려면 설정 → Composer Plus에서 **터키어 스킬 팩**을 끄세요. 스킬과 내려받은 사본이 바로 삭제됩니다.
430
+
431
+ **Composer Plus의 버그를 보고하거나 기능을 요청하려면 어떻게 하나요?** 설정 → Composer Plus → **이슈 보고…**(또는 채팅의 **…** 메뉴 → **Composer Plus 이슈 보고…**). 유형을 고르고, 자신의 언어로 설명한 뒤 **초안 쓰기**를 클릭하세요. 영어 초안을 확인한 다음 **이슈 열기**를 클릭하세요.
432
+
433
+ **에이전트가 지저분한 코드베이스를 어떻게 정리하나요?** 채팅에 `/untangle-codebase`를 입력하세요(**코드베이스 정리**, 기본적으로 켜짐). 원하면 영역을 덧붙일 수 있습니다(예: `/untangle-codebase src/api`). 에이전트는 먼저 복사된 코드, 숨은 결합, 불필요한 래퍼, 죽은 코드, 특수 처리를 나열한 뒤, 목표로 수정하고 하위 에이전트로 다시 확인합니다. 작업이 별도 브랜치에 남도록 **채팅별 브랜치** 채팅에서 시작하세요.
434
+
406
435
  **데스크톱 앱에서도 작동하나요?** 네. 설정 → 플러그인 → **플러그인 추가** → `dsh-composer-plus`. dsh 0.2.0-rc.2(데스크톱과 웹)와 0.2.1-rc.2(웹)에서 테스트했습니다.
407
436
 
408
437
  ## 개발
@@ -422,6 +451,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/t
422
451
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-agentbox-ideas.mjs /path/to/dsh/lib/bin.js
423
452
  # 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
424
453
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-t3code-ideas.mjs /path/to/dsh/lib/bin.js
454
+ # Quote from file preview (fake model): lines of a code, text, Markdown and PDF file in the right sidebar → Quote → the path, the line numbers and the lines in the sent message; no button for the path header; switch off + its thumbnail
455
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-preview-quote.mjs /path/to/dsh/lib/bin.js
425
456
  # every Settings feature row shows a loading screenshot and a ? link to its README row
426
457
  PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
427
458
  # What's new after an update: the release notes show once (also after an install through another path), Esc and Close close them; Settings → What’s new in this version opens them again
@@ -473,6 +504,8 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /pat
473
504
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
474
505
  # 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
475
506
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
507
+ # Assistant: off by default, sidebar row under Task board, one chat in ~/Assistant (workspace-write), a reminder that runs the chat, chats_list, chat_send after its approval card, an injected chat_send rejected, no tools in other chats, automations of other chats (dsh 0.2.2+), switch off
508
+ SHOT=1 CHECK_DELAY=20 PLAYWRIGHT=/path/to/playwright node test/browser-assistant.mjs /path/to/dsh/lib/bin.js
476
509
  ```
477
510
 
478
511
  ```sh
@@ -494,3 +527,5 @@ PLAYWRIGHT=/path/to/playwright node test/browser-language.mjs /path/to/dsh/lib/b
494
527
  ## License
495
528
 
496
529
  MIT
530
+
531
+ `assets/skills/untangle-codebase/SKILL.md`는 [caldoai/skills](https://github.com/caldoai/skills)의 `untangle-codebase` 스킬이며, © 2026 Maze, MIT 라이선스입니다([라이선스](assets/skills/untangle-codebase/LICENSE)).