dsh-composer-plus 1.18.0 → 1.19.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.vi.md CHANGED
@@ -14,7 +14,7 @@ Các tính năng tiện ích kiểu Codex cho ứng dụng desktop và giao di
14
14
 
15
15
  <p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness với Composer Plus: dự án đang chạy hiện biểu tượng xoay trên thanh bên và Bảng thay đổi hiện một git diff"></p>
16
16
 
17
- Đây là plugin cộng đồng, không chính thức. Lệnh gọi mạng duy nhất là việc kiểm tra cập nhật (GitHub releases và npm registry). Tắt **Tự động cập nhật** để dừng các lệnh gọi này khi khởi động. **Ý tưởng tính năng** chỉ gọi mô hình của chính cuộc trò chuyện khi bạn nhấp **Đề xuất tính năng**. **Dự đoán tin nhắn tiếp theo** (mặc định bật) gọi mô hình đã chọn trong Cài đặt (mô hình mặc định của dsh, trừ khi bạn chọn mô hình khác) một lần sau mỗi lượt đã xong, không cần nhấp. Tắt tính năng này trong **Cài đặt → Composer Plus** để dừng các lệnh gọi này. **Hoàn thành khi gõ** (mặc định tắt) gọi mô hình đã chọn cho tính năng này (mặc định là mô hình của dự đoán) mỗi lần bạn dừng gõ, sau khi bạn bật tính năng này. **Cải thiện prompt** chỉ gọi mô hình khi bạn nhấp vào đũa thần. **Kiểm tra mục tiêu** (mặc định bật) gọi mô hình một lần mỗi khi tác tử đánh dấu một `/goal` là hoàn tất trong một vòng tự động. **Kết nối di động** (mặc định tắt) chỉ nhận kết nối iPhone từ mạng cục bộ hoặc tailnet của bạn sau khi bạn bật tính năng này.
17
+ Đây là plugin cộng đồng, không chính thức. Lệnh gọi mạng duy nhất là việc kiểm tra cập nhật (GitHub releases và npm registry). Tắt **Tự động cập nhật** để dừng các lệnh gọi này khi khởi động. **Ý tưởng tính năng** chỉ gọi mô hình của chính cuộc trò chuyện khi bạn nhấp **Đề xuất tính năng**. **Dự đoán tin nhắn tiếp theo** (mặc định bật) gọi mô hình đã chọn trong Cài đặt (mô hình mặc định của dsh, trừ khi bạn chọn mô hình khác) một lần sau mỗi lượt đã xong, không cần nhấp. Tắt tính năng này trong **Cài đặt → Composer Plus** để dừng các lệnh gọi này. **Hoàn thành khi gõ** (mặc định tắt) gọi mô hình đã chọn cho tính năng này (mặc định là mô hình của dự đoán) mỗi lần bạn dừng gõ, sau khi bạn bật tính năng này. **Cải thiện prompt** chỉ gọi mô hình khi bạn nhấp vào đũa thần. **Bảng tác vụ** gọi mô hình của cuộc trò chuyện mới một lần để tạo nhãn cho mỗi tác vụ mà bạn bắt đầu trên bảng. **Kiểm tra mục tiêu** (mặc định bật) gọi mô hình một lần mỗi khi tác tử đánh dấu một `/goal` là hoàn tất trong một vòng tự động. **Kết nối di động** (mặc định tắt) chỉ nhận kết nối iPhone từ mạng cục bộ hoặc tailnet của bạn sau khi bạn bật tính năng này.
18
18
 
19
19
  ## Cách cài đặt
20
20
 
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Sau đó khởi động lại dsh. (CLI không cài được vào profile desktop; ứng dụng tự quản lý profile này.)
31
31
 
32
- > pnpm của dsh bỏ qua các phiên bản ra mắt chưa đủ 24 giờ. Ngay sau một bản phát hành, hãy thêm số phiên bản: `dsh-composer-plus@1.18.0`.
32
+ > pnpm của dsh bỏ qua các phiên bản ra mắt chưa đủ 24 giờ. Ngay sau một bản phát hành, hãy thêm số phiên bản: `dsh-composer-plus@1.19.0`.
33
33
 
34
34
  ## Tính năng
35
35
 
@@ -71,11 +71,11 @@ Sau đó khởi động lại dsh. (CLI không cài được vào profile deskto
71
71
  | **Các bước đã lên kế hoạch** | <a id="feature-plannedsteps"></a>Mặc định tắt: hãy bật trong **Cài đặt → Composer Plus**. Tác tử nhận công cụ `plan_next_steps`: trong cùng tin nhắn với một lệnh, tác tử có thể lên kế hoạch cho các lệnh tiếp theo với đối số chính xác và một điều kiện, ví dụ “chạy `npm test` khi bản dựng thành công”. Khi kết quả đáp ứng điều kiện, Composer Plus tự chạy bước tiếp theo mà không gọi lại mô hình, nhờ đó cuộc trò chuyện dài tốn ít token hơn. Bước đó hiện trong cuộc trò chuyện thành một dòng ngắn “Composer Plus · Planned steps: ran `test` … without a model call”, sau đó là lời gọi công cụ và kết quả. Chỉ các bước `bash`, `read`, `grep` và `glob`; phê duyệt, sandbox và Tệp được bảo vệ vẫn áp dụng cho từng bước như thường lệ. Mô hình trả lời lại khi điều kiện không đạt, khi hai bước cùng sẵn sàng, sau bước cuối cùng và khi bạn gửi tin nhắn. Ý tưởng đến từ HarnessMM (arXiv 2610.32813). | <a href="assets/features/plannedSteps.webp"><img src="assets/features/plannedSteps.webp" width="160" alt="Ảnh chụp màn hình: Các bước đã lên kế hoạch"></a> |
72
72
  | **Tệp được bảo vệ** | <a id="feature-protectedfiles"></a>Bật theo mặc định. Các công cụ tệp riêng của tác tử không thể đọc hoặc thay đổi các tệp khớp với mẫu của bạn: `read`, `read_image` và `grep` trên một tệp bị từ chối với mẫu **đọc và ghi**, còn `write`, `edit` và `str_replace_editor` bị từ chối với cả hai loại. Tác tử đọc lý do và được yêu cầu hỏi bạn. Mẫu mặc định là `.env*`, `*.pem` và `*.key`. Cài đặt → Composer Plus → **Tệp được bảo vệ**: thêm một mẫu (ví dụ `published/**` hoặc `config/*.yml`), nhấp vào loại của mẫu để chuyển giữa **đọc và ghi** và **chỉ ghi**, xóa mẫu bằng ✕, hoặc nhấp **Dùng giá trị mặc định**. Mẫu không có `/` khớp với tên tệp trong bất kỳ thư mục nào. Đây là rào chắn bảo vệ, không phải sandbox: lệnh shell (`cat .env`), script hoặc công cụ MCP vẫn có thể truy cập tệp (xem Giới hạn). | <a href="assets/features/protectedFiles.webp"><img src="assets/features/protectedFiles.webp" width="160" alt="Ảnh chụp màn hình: Tệp được bảo vệ"></a> |
73
73
  | **Lệnh bị chặn** | <a id="feature-blockedcommands"></a>Bật theo mặc định, với danh sách trống. Các lệnh shell của tác tử (`bash`, `pwsh`) không thể chạy lệnh khớp với quy tắc của bạn: quy tắc **chặn** từ chối lệnh gọi (tác tử đọc lý do và được yêu cầu hỏi bạn), quy tắc **hỏi trước** hiện thẻ phê duyệt của dsh, và lệnh chỉ chạy khi bạn cho phép. Cài đặt → Composer Plus → **Lệnh bị chặn**: nhập một quy tắc (ví dụ `npm publish`, `git push --force` hoặc `ssh *192.168.2.19`), nhấp vào loại để chuyển giữa **chặn** và **hỏi trước**, rồi nhấp **Thêm**; nhấp vào loại của một quy tắc để đổi loại, xóa quy tắc bằng ✕. Một quy tắc là tên lệnh và các từ phải đứng sau nó theo đúng thứ tự này; `*` khớp với mọi văn bản. Tính năng cũng tìm thấy lệnh sau `&&`, `;`, `\|`, bên trong `$(…)`, `bash -c "…"` hoặc `eval`, và sau `sudo` hoặc `env`. Đây là rào chắn bảo vệ, không phải sandbox: một biến (`$CMD`), một tệp script hoặc một chương trình khác vẫn có thể chạy lệnh (xem Giới hạn). | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="Ảnh chụp màn hình: Lệnh bị chặn"></a> |
74
- | **Bảng tác vụ** | <a id="feature-taskboard"></a>Thanh bên trái → **Bảng tác vụ**. Bảng kanban cho các dự án dsh của bạn, dùng chung giữa bạn và các tác tử: **Cần làm**, **Đang làm**, **Đang duyệt** và **Xong** (và **Tồn đọng**, xem bên dưới). Chọn một dự án hoặc **Tất cả dự án** ở bên trái. **Tác vụ mới** (hoặc `n`) mở một thẻ mới: nhập tiêu đề rồi nhấn `Enter`. Kéo thẻ sang cột khác hoặc vào giữa hai thẻ. Nhấp vào thẻ để xem và thay đổi **Trạng thái**, **Nhãn**, **Thủ công** (tác tử bỏ qua), mô tả (Markdown) và bình luận. `/` tìm trong mọi dự án, `h` chỉ hiện tác vụ thủ công, nút xuất lưu bảng dưới dạng Markdown hoặc JSON. Tác tử nhận được các công cụ bảng: hãy bảo một cuộc trò chuyện "lấy tác vụ tiếp theo từ bảng", tác tử sẽ chuyển thẻ trên cùng của **Cần làm** sang **Đang làm**, bình luận về việc đã làm rồi chuyển thẻ sang **Đang duyệt**; bạn là người chuyển thẻ sang **Xong**. Trong dự án có tác vụ đang mở, mỗi cuộc trò chuyện tự nhận quy tắc này. Cài đặt → Composer Plus → **Bảng tác vụ** có công tắc cho cột **Tồn đọng**: tác tử để các thẻ trong cột này lại cho bạn. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Ảnh chụp màn hình: Bảng tác vụ"></a> |
74
+ | **Bảng tác vụ** | <a id="feature-taskboard"></a>Thanh bên trái → **Bảng tác vụ**. Bảng kanban các cuộc trò chuyện dsh của bạn với trạng thái trực tiếp giống thanh bên: cuộc trò chuyện đang chờ bạn phê duyệt, trả lời hoặc xem xét kế hoạch nằm ở **Đang duyệt** với chấm cam, cuộc trò chuyện đang chạy nằm ở **Đang làm**, cuộc trò chuyện đã xong nằm ở **Xong** (màu xanh lá cho đến khi bạn mở). Chọn một dự án hoặc **Tất cả dự án** ở bên trái; thư mục branch riêng của từng cuộc trò chuyện được tính là thuộc dự án của nó. **Tác vụ mới** (hoặc `n`) chỉ cần một prompt: `Enter` bắt đầu một cuộc trò chuyện mới trong dự án, thẻ hiện ở **Cần làm**, dsh đặt tên cho cuộc trò chuyện và mô hình của cuộc trò chuyện viết tối đa 3 nhãn. Nhấp vào thẻ để mở cuộc trò chuyện của nó. Trên thẻ màu cam, nhấp **Trả lời** để trả lời ngay trên bảng: **Từ chối** hoặc **Cho phép một lần**, **Phê duyệt** hoặc **Yêu cầu thay đổi** cho một kế hoạch, hoặc các lựa chọn và văn bản của riêng bạn cho một câu hỏi. **Ẩn mục đã xong** ẩn **Xong** trên thiết bị này. | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="Ảnh chụp màn hình: Bảng tác vụ"></a> |
75
75
  | **Bộ nhớ dự án** | <a id="feature-projectmemory"></a>Mặc định tắt: hãy bật trong **Cài đặt → Composer Plus**. Mỗi thư mục dự án có bộ nhớ riêng, các cuộc trò chuyện sau này của dự án đó sẽ đọc, giống như DS Bot giữ một bộ nhớ cho mỗi Bot. Sau mỗi lượt kết thúc, một lần gọi mô hình của cuộc trò chuyện đọc các tin nhắn mới (không đọc tin nhắn đã hoàn tác), lưu sở thích, quyết định và dữ kiện lâu dài của bạn thành ghi chú ngắn, đồng thời sửa hoặc xóa ghi chú cũ. Tác tử cũng có thể tự lưu, xóa và tìm ghi chú (`memory_remember`, `memory_forget`, `memory_recall`). Ghi chú cũng có thể là ghi chú chung: mọi dự án đều đọc. Cuộc trò chuyện mới nhận các ghi chú trong system prompt; ghi chú lưu sau đó hiện từ cuộc trò chuyện tiếp theo. Các tệp là Markdown trong thư mục home của dsh (`storages/dsh-composer-plus/memory/`), không bao giờ nằm trong thư mục dự án. **Mở bộ nhớ** ở cùng hàng hiển thị mọi ghi chú đã lưu, nhóm theo dự án (và bộ nhớ chung), có bộ lọc. Viết bằng lời của bạn điều cần thay đổi (ví dụ "tôi đã chuyển từ yarn sang pnpm"), rồi bấm **Xem trước thay đổi**: mô hình mặc định của dsh đề xuất các thay đổi, và chỉ **Áp dụng** mới lưu chúng. Trong Tether: menu tiêu đề cuộc trò chuyện → Project memory. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Ảnh chụp màn hình: Bộ nhớ dự án"></a> |
76
76
  | **Cho phép trong cuộc trò chuyện này** | <a id="feature-allowforchat"></a>Khi Đánh giá tự động hỏi bạn, thẻ phê duyệt có thêm nút **Cho phép trong cuộc trò chuyện này**: từ đó trở đi, cùng công cụ đó trong cùng cuộc trò chuyện được cho phép, với mọi đối số, cho đến khi hết giới hạn thời gian (mặc định 1 giờ; chọn trong **Cài đặt → Composer Plus → Cho phép trong cuộc trò chuyện này**). Sau đó, agent sẽ hỏi lại. Một nhãn nhỏ ở phần đầu liệt kê các quyền đã cấp kèm thời điểm kết thúc và cho phép thu hồi. Quyền vẫn còn sau khi khởi động lại. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Ảnh chụp màn hình: Cho phép trong cuộc trò chuyện này"></a> |
77
77
  | **Trạng thái dự án** | <a id="feature-projectstatus"></a>Dòng dự án trên thanh bên hiện cùng dấu đang chạy / đang chờ / xong như các cuộc trò chuyện của nó. Vì vậy, dự án đã thu gọn vẫn cho bạn biết có cuộc trò chuyện bên trong đang làm việc hoặc cần bạn. Cuộc trò chuyện đang chờ bạn được hiện trước, sau đó là cuộc trò chuyện đã xong mà bạn chưa mở (chấm xanh, kể cả khi một cuộc trò chuyện khác vẫn đang chạy), rồi đến dấu đang chạy. Di chuột lên để xem chi tiết. Trong **Cây không gian làm việc**, dòng của thư mục cha cũng hiện các cuộc trò chuyện của từng dự án bên trong (ví dụ mỗi thư mục nhánh trong `.worktrees/`), kể cả khi thư mục đã thu gọn. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Ảnh chụp màn hình: Trạng thái dự án"></a> |
78
- | **Branch Git trên dòng cuộc trò chuyện** | <a id="feature-sessionbranch"></a>Mỗi dòng cuộc trò chuyện ở thanh bên hiển thị một nhãn nhỏ màu xám với branch git mà thư mục dự án của cuộc trò chuyện đang ở trong lượt cuối của cuộc trò chuyện đó (ví dụ `main` hoặc `feature/login`; HEAD tách rời không có branch nên không hiển thị nhãn). Hai cuộc trò chuyện của cùng một dự án trên các branch khác nhau không còn trông giống nhau, và bạn thấy ngay khi sắp tiếp tục một cuộc trò chuyện trên sai branch. Di chuột lên nhãn để xem tên đầy đủ. Phần Host đọc branch (`git branch --show-current`, chỉ đọc) khi một lượt bắt đầu và khi kết thúc; cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài tính năng này, hoặc thư mục không phải repository git, sẽ không có nhãn. Nếu dòng dự án phía trên cuộc trò chuyện có cùng tên với branch (ví dụ thư mục của “Branch riêng cho từng cuộc trò chuyện”), dòng cuộc trò chuyện không hiển thị nhãn, nhưng “Trong một danh sách” vẫn hiển thị nhãn. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Ảnh chụp màn hình: Branch Git trên dòng cuộc trò chuyện"></a> |
78
+ | **Branch Git trên dòng cuộc trò chuyện** | <a id="feature-sessionbranch"></a>Ở chế độ xem “Trong một danh sách” của thanh bên, mỗi dòng cuộc trò chuyện hiển thị một nhãn nhỏ màu xám với branch git mà thư mục dự án của cuộc trò chuyện đang ở trong lượt cuối của cuộc trò chuyện đó (ví dụ `main` hoặc `feature/login`; HEAD tách rời không có branch nên không hiển thị nhãn). Hai cuộc trò chuyện của cùng một dự án trên các branch khác nhau không còn trông giống nhau, và bạn thấy ngay khi sắp tiếp tục một cuộc trò chuyện trên sai branch. Di chuột lên nhãn để xem tên đầy đủ. Phần Host đọc branch (`git branch --show-current`, chỉ đọc) khi một lượt bắt đầu và khi kết thúc; cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài tính năng này, hoặc thư mục không phải repository git, sẽ không có nhãn. Trong “Không gian làm việc” và “Cây không gian làm việc”, không dòng cuộc trò chuyện nào hiển thị nhãn, vì cuộc trò chuyện đã nằm dưới dòng dự án của nó. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Ảnh chụp màn hình: Branch Git trên dòng cuộc trò chuyện"></a> |
79
79
  | **Đánh dấu tất cả là đã đọc** | <a id="feature-markprojectread"></a>Trên thanh bên, nhấp nút **…** của một dự án → **Đánh dấu tất cả là đã đọc**. Mọi cuộc trò chuyện trong dự án đó mất chấm xanh chưa đọc cùng lúc; các dự án khác vẫn giữ chấm của mình. Mục này hiện màu xám (**Không có cuộc trò chuyện chưa đọc**) khi dự án không có cuộc trò chuyện chưa đọc nào. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Ảnh chụp màn hình: Đánh dấu tất cả là đã đọc"></a> |
80
80
  | **Ưu tiên dự án đang hoạt động** | <a id="feature-activeprojectsfirst"></a>Khi một cuộc trò chuyện bắt đầu chạy hoặc cần bạn, dự án của nó di chuyển lên đầu thanh bên với hiệu ứng dòng của chính dsh (giống như khi bạn kéo dự án lên đó). Dự án đã xong giữ nguyên vị trí; bạn vẫn kéo chúng đến bất kỳ đâu như thường. Các lần di chuyển được lưu vào thứ tự dự án của dsh, nên khi tắt tính năng này, thứ tự hiện tại được giữ nguyên. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Ảnh chụp màn hình: Ưu tiên dự án đang hoạt động"></a> |
81
81
  | **Bộ lọc dự án gần đây** | <a id="feature-recentprojects"></a>Thanh bên → tùy chọn hiển thị (biểu tượng thanh trượt) → **Hoạt động trong 2 giờ qua**. Khi tùy chọn này được chọn, thanh bên chỉ hiện các dự án có cuộc trò chuyện hoạt động trong 2 giờ qua: cuộc trò chuyện được cập nhật trong khoảng thời gian này, cuộc trò chuyện đang chạy hoặc đang chờ, cuộc trò chuyện đang mở, hoặc cuộc trò chuyện đã xong mà bạn chưa mở (chấm xanh “xong” của dsh), kể cả sau 2 giờ. Các dự án không có cuộc trò chuyện như vậy bị ẩn, kể cả dự án mới và trống. Trong **Cây không gian làm việc**, thư mục cha vẫn hiển thị khi có dự án bên trong đang hoạt động, và các cuộc trò chuyện không hoạt động trong 2 giờ qua cũng bị ẩn, nên chỉ hiện các cuộc trò chuyện gần đây. Chọn lại tùy chọn để hiện tất cả dự án. Lựa chọn được lưu trên thiết bị này. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Ảnh chụp màn hình: Bộ lọc dự án gần đây"></a> |
@@ -85,7 +85,7 @@ Sau đó khởi động lại dsh. (CLI không cài được vào profile deskto
85
85
  | **Mở cuộc trò chuyện đang chờ khi không hoạt động** | <a id="feature-idleswitch"></a>Khi một cuộc trò chuyện đặt câu hỏi, đang chờ phê duyệt hay xem xét kế hoạch (chấm cam), hoặc hoàn tất một lượt mà bạn chưa đọc (chấm xanh), và bạn không dùng dsh trong 30 giây, dsh sẽ mở cuộc trò chuyện đó. Cuộc trò chuyện chấm cam được mở trước cuộc trò chuyện chấm xanh. Trong mỗi nhóm, cuộc chờ lâu nhất được mở trước; cuộc tiếp theo mở sau thêm 30 giây không dùng. Một phím, một cú nhấp, di chuột, con lăn hoặc một lần chạm sẽ bắt đầu lại 30 giây. Văn bản trong ô đang có tiêu điểm, văn bản đang chọn, hoặc một menu hay hộp thoại đang mở cũng ngăn việc chuyển. Khi một cuộc trò chuyện đang chờ ở trên màn hình, không có gì thay đổi. Nếu bạn rời một cuộc trò chuyện đang chờ mà chưa trả lời, nó có thể mở lại sau 30 giây không dùng tiếp theo. Khi một cuộc trò chuyện chấm xanh mở ra, chấm của nó biến mất; cuộc trò chuyện chấm xanh tiếp theo chỉ mở sau khi bạn dùng lại dsh rồi không dùng trong 30 giây. Tính năng cũng chạy khi dsh ở chế độ nền, nhưng dsh không được đưa lên trước. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Ảnh chụp màn hình: Mở cuộc trò chuyện đang chờ khi không hoạt động"></a> |
86
86
  | **Ngôn ngữ ứng dụng** | <a id="feature-language"></a>Cài đặt → Composer Plus → **Ngôn ngữ ứng dụng** chuyển toàn bộ giao diện dsh sang Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt hoặc हिन्दी (xem bên dưới). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Ảnh chụp màn hình: Ngôn ngữ ứng dụng"></a> |
87
87
  | **Kết nối di động (iPhone)** | <a id="feature-mobileconnect"></a>Dùng dsh từ iPhone với ứng dụng [Tether](tether/), trong cùng mạng Wi-Fi hoặc qua [Tailscale](https://tailscale.com). Bật tính năng trong **Cài đặt → Composer Plus** (mặc định tắt, vì tính năng này mở một cổng mạng trên máy Mac này). Sau đó nhấp **Kết nối di động** ở góc dưới bên trái thanh bên: quét mã QR bằng Camera của iPhone (chạm vào **Open in Tether**) hoặc bằng **Scan code** trong Tether, chạm vào **Connect** và nhấp **Approve**. Hãy cài đặt Tether trước: nếu không có Tether, Camera không thể mở mã này. Điện thoại hiện các cuộc trò chuyện của bạn, gửi tin nhắn (kèm ảnh: **+** trong khung soạn thảo → Camera, Photos hoặc Paste image), trả lời phê duyệt và câu hỏi, và chuyển đổi mô hình và agent. Bạn có thể ghép nối bao nhiêu máy Mac tùy ý: tên máy Mac ở góc trên bên trái ứng dụng dùng để chuyển giữa các máy. Bảng **Kết nối di động** liệt kê các iPhone đã ghép nối kèm lần kết nối gần nhất: **Remove** ngắt ngay một máy. “Tailscale only” từ chối mạng cục bộ (dành cho Wi-Fi dùng chung), và nhật ký truy cập cho biết ai đã thử kết nối. Trong Tether, “Settings → Privacy” khóa ứng dụng bằng Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Ảnh chụp màn hình: Kết nối di động (iPhone)"></a> |
88
- | **Tự động cập nhật** | <a id="feature-autoupdate"></a>Khi dsh khởi động, plugin kiểm tra [bản phát hành GitHub mới nhất](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Nếu bản đó mới hơn và đã có trên npm, plugin cài đúng phiên bản đó qua trình quản lý plugin của chính dsh (cùng cách với Cài đặt → Plugin) và thông báo cho bạn. Khởi động lại dsh để tải bản mới. **Cài đặt → Composer Plus → Cập nhật Composer Plus** hiện phiên bản và có nút **Kiểm tra cập nhật** / **Cập nhật ngay**. Lần đầu dsh khởi động với phiên bản mới, cửa sổ **Có gì mới trong Composer Plus N** hiện ghi chú phát hành của phiên bản đó một lần (lấy từ chính lần kiểm tra cập nhật, không gọi mạng thêm); **Đóng** hoặc `Esc` đóng nó. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Ảnh chụp màn hình: Tự động cập nhật"></a> |
88
+ | **Tự động cập nhật** | <a id="feature-autoupdate"></a>Khi dsh khởi động, plugin kiểm tra [bản phát hành GitHub mới nhất](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Nếu bản đó mới hơn và đã có trên npm, plugin cài đúng phiên bản đó qua trình quản lý plugin của chính dsh (cùng cách với Cài đặt → Plugin) và thông báo cho bạn. Khởi động lại dsh để tải bản mới. **Cài đặt → Composer Plus → Cập nhật Composer Plus** hiện phiên bản và có nút **Kiểm tra cập nhật** / **Cập nhật ngay**. Lần đầu dsh khởi động với phiên bản mới, cửa sổ **Có gì mới trong Composer Plus N** hiện ghi chú phát hành của phiên bản đó một lần bằng ngôn ngữ trong **Ngôn ngữ ứng dụng** (ghi chú đi kèm phiên bản mới, không gọi mạng thêm; ngôn ngữ không có ghi chú sẽ hiện ghi chú tiếng Anh); **Đóng** hoặc `Esc` đóng nó. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Ảnh chụp màn hình: Tự động cập nhật"></a> |
89
89
  | **Sao lưu** | <a id="feature-backup"></a>Cài đặt → Composer Plus → **Sao lưu** → **Sao lưu ngay** ghi toàn bộ thư mục home của dsh (cuộc trò chuyện, cài đặt, plugin, MCP, skill) vào một tệp lưu trữ duy nhất trong `~/Desktop/dsh-backups`, kèm checksum. Thông tin bí mật được che trong tệp lưu trữ: các tệp thông tin xác thực, tệp khóa (`.pem`, `.key`) và các giá trị token, secret và password trong cài đặt yml chỉ ở lại trên máy tính này, trong `vault` của thư mục. `cache/`, `dsh-runtimes/` và `node_modules` không có trong tệp lưu trữ (dsh tạo lại chúng). Mỗi bản sao lưu trong danh sách có **Kiểm tra** (đọc hết bản sao lưu), **Cho máy tính khác** (một thư mục để sao chép sang máy tính mới, kèm bảng điều khiển cứu hộ) và **Xóa**. Các tệp lưu trữ của dsh-backup trong cùng thư mục cũng hiện ra và dùng được. Để khôi phục, hãy thoát dsh và dùng bảng điều khiển cứu hộ. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Ảnh chụp màn hình: Sao lưu"></a> |
90
90
  | **Tự động sao lưu** | <a id="feature-autobackup"></a>Bật **Tự động sao lưu** (mặc định tắt: mỗi bản sao có dung lượng gần bằng thư mục home của dsh khi không tính bộ nhớ đệm). Chọn tần suất (**Mỗi**: từ 6 giờ đến 7 ngày, mặc định 24 giờ) và số bản sao lưu được giữ (**Giữ**: từ 3 đến 14, mặc định 7). Thời điểm tiếp theo hiện bên dưới công tắc; một lần sao lưu thất bại cũng hiện ở đó và được thử lại sau 30 phút. Khi dsh hoặc Composer Plus khởi động với phiên bản mới, một snapshot được tạo ngay sau khi khởi động, trước khi phiên bản mới dùng dữ liệu của bạn lâu (hai bản mới nhất được giữ, đánh dấu **Trước khi nâng cấp**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Ảnh chụp màn hình: Tự động sao lưu"></a> |
91
91
  | **Kiểm tra sức khỏe nhật ký phiên** | <a id="feature-sessiondoctor"></a>**Kiểm tra nhật ký phiên** đọc nhật ký của mọi cuộc trò chuyện và liệt kê những nhật ký mà dsh không mở được (frame bị hỏng, bản ghi bị cắt, số thứ tự sai). Phần cuối bị dở dang không được liệt kê: dsh tự sửa phần đó. **Sửa từ bản sao lưu** đưa bản sao từ bản sao lưu mới nhất có bản còn tốt trở lại, và giữ tệp bị hỏng ngay bên cạnh (`.corrupt-<thời gian>`). Các tin nhắn viết sau bản sao lưu đó không có trong bản sao. Cuộc trò chuyện đang mở trong dsh này không được sửa ở đây: hãy thoát dsh và sửa nó trong bảng điều khiển cứu hộ. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Ảnh chụp màn hình: Kiểm tra sức khỏe nhật ký phiên"></a> |
@@ -169,7 +169,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
169
169
  - **Kiểm tra mục tiêu:** chỉ chạy khi tác tử đánh dấu một `/goal` là hoàn tất trong một vòng tự động (hoặc khi bạn nhấp **Chạy ngay**). Phần Host chạy lệnh kiểm thử trong thư mục của cuộc trò chuyện theo chế độ sandbox của cuộc trò chuyện (giống công cụ `bash` của chính dsh: cùng chính sách truy cập tệp; khi sandbox đó không khởi động được, bài kiểm thử không chạy và bước kiểm tra thất bại). Để tìm lệnh, phần Host chỉ đọc `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` và `pytest.ini`, dưới dạng tệp thông thường bên trong thư mục (không có symlink trỏ ra ngoài thư mục, không có FIFO). Sau đó phần Host gửi mục tiêu, cuộc trò chuyện kể từ khi mục tiêu bắt đầu (tin nhắn của bạn, câu trả lời của tác tử, các lệnh gọi công cụ cắt còn 1.000 ký tự và 2.000 ký tự cuối của mỗi kết quả công cụ; không có phần suy luận, không có bước đã bị hoàn tác; tối đa khoảng 60.000 ký tự, phần mới nhất), `git status --short` và phần cuối đầu ra kiểm thử đến mô hình đã chọn trong **Kiểm tra mục tiêu** (mặc định là mô hình của chính cuộc trò chuyện), dưới dạng một yêu cầu duy nhất không có công cụ. Đầu ra công cụ có thể chứa những gì tác tử đã đọc, nên yêu cầu này có thể chứa một phần tệp của bạn, giống như chính cuộc trò chuyện. Không có gì được ghi vào cuộc trò chuyện hay dự án. Lệnh kiểm thử của bạn, các giới hạn, kết quả gần nhất (kèm phần cuối đầu ra) và mô hình đã chọn nằm trong `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (tệp chỉ chủ sở hữu truy cập được, 500 cuộc trò chuyện mới nhất).
170
170
  - **Tiếp tục trong cuộc trò chuyện mới:** không có gì chạy cho đến khi bạn nhấp. Sau đó phần Host gửi cuộc trò chuyện (như Kiểm tra mục tiêu đọc: không có phần suy luận, không có bước đã bị hoàn tác) đến mô hình của chính cuộc trò chuyện và hiện ghi chú bàn giao; chỉ **Bắt đầu cuộc trò chuyện mới** mới tạo cuộc trò chuyện mới. Không có gì được ghi vào dự án.
171
171
  - **Phân tích ngữ cảnh:** phần Host chỉ đọc nhật ký cuộc trò chuyện; không gọi mô hình, không đọc tệp dự án.
172
- - **Bảng tác vụ:** bảng (tiêu đề, mô tả, nhãn và bình luận của các tác vụ, đường dẫn thư mục dự án và id ngắn của chúng) nằm trong `$DSH_HOME/storages/dsh-composer-plus/board.json` (tệp chỉ chủ sở hữu truy cập được); công tắc nằm trong `board-switch.json` bên cạnh. Không có gì rời khỏi máy của bạn và không có gì được ghi vào thư mục dự án. Các công cụ bảng đưa cho tác tử những gì bạn viết trên bảng, nên văn bản của một tác vụ đến mô hình của cuộc trò chuyện khi tác tử đọc tác vụ đó. Tệp bảng bị hỏng được giữ lại dưới tên `board.json.broken-<time>` và bảng bắt đầu trống.
172
+ - **Bảng tác vụ:** bảng hiện các cuộc trò chuyện của chính dsh từ các danh sách của chính dsh trong cửa sổ này; bảng không thêm dữ liệu trò chuyện riêng nào. Khi bạn bắt đầu một tác vụ, phần Host tạo một cuộc trò chuyện mới trong dự án bạn đã chọn và gửi prompt của bạn làm tin nhắn đầu tiên của nó, như thể bạn gõ prompt ở đó, nên phê duyệt, sandbox và mô hình của cuộc trò chuyện áp dụng như bình thường. Sau đó phần Host gửi prompt (4.000 ký tự đầu tiên, không gì khác) đến mô hình của cuộc trò chuyện đó trong thêm một yêu cầu, không có công cụ, để lấy tối đa 3 nhãn. Prompt, nhãn và thời điểm bắt đầu của mỗi tác vụ được lưu trong `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` (tệp chỉ chủ sở hữu truy cập được, 2.000 mục mới nhất); công tắc nằm trong `board-switch.json` bên cạnh. Không có gì được ghi vào thư mục dự án. **Trả lời** gửi câu trả lời của bạn đến yêu cầu đang chờ của chính dsh, giống như thẻ của chính cuộc trò chuyện. Danh sách tác vụ cũ của các phiên bản trước (`board.json`) vẫn nằm trên đĩa như cũ và không được đọc.
173
173
  - **Tệp được bảo vệ:** danh sách và công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` (tệp chỉ chủ sở hữu truy cập được). Bước kiểm tra chỉ đọc đường dẫn của mỗi lệnh gọi công cụ tệp (và đường dẫn thật của nó), không bao giờ đọc tệp.
174
174
  - **Lệnh bị chặn:** các quy tắc và công tắc nằm trong `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` (tệp chỉ chủ sở hữu truy cập được). Bước kiểm tra chỉ đọc văn bản lệnh của mỗi lệnh gọi `bash` và `pwsh`; nó không chạy gì và không gửi gì.
175
175
  - **Bộ nhớ dự án:** tắt cho đến khi bạn bật. Khi bật, sau mỗi lượt kết thúc của một cuộc trò chuyện cấp cao nhất, phần Host gửi các tin nhắn mới của chính cuộc trò chuyện đó kể từ lần xem xét trước (tin nhắn của bạn và câu trả lời dạng văn bản của tác tử; không có đầu ra công cụ, suy luận, ngữ cảnh ẩn hay tin nhắn đã hoàn tác; trong cuộc trò chuyện rẽ nhánh, bản sao từ cuộc trò chuyện cha bị bỏ qua; tối đa khoảng 16.000 ký tự) và các ghi chú đã lưu tới mô hình của chính cuộc trò chuyện, trong một yêu cầu không có công cụ. Ghi chú là các tệp Markdown trong `$DSH_HOME/storages/dsh-composer-plus/memory/` (chỉ chủ sở hữu đọc/ghi): `projects/<id>/` cho mỗi thư mục dự án (`<id>` là mã băm của đường dẫn thật của thư mục; `project.json` ghi tên thư mục), `global/`, `journal.jsonl` (mỗi thay đổi kèm dòng trước và sau) và `reviewed.json` (đã đọc mỗi cuộc trò chuyện đến đâu). Không có gì được ghi vào thư mục dự án. Ghi chú trông giống khóa, token, mật khẩu hoặc số giấy tờ tùy thân bị từ chối. Ghi chú của một dự án đi vào system prompt của mỗi cuộc trò chuyện mới trong thư mục đó, nên chúng tới mô hình cùng mọi yêu cầu của cuộc trò chuyện đó. Công tắc nằm trong `memory.json` ở cùng chỗ. **Mở bộ nhớ** không gửi gì cho đến khi bạn bấm **Xem trước thay đổi**; khi đó nó gửi các ghi chú đang hiển thị và văn bản của bạn tới mô hình mặc định của dsh, trong một yêu cầu không có công cụ. Các thay đổi chỉ được ghi khi **Áp dụng**, với `editor` trong nhật ký. Tether đọc và thay đổi ghi chú qua cùng một tuyến.
@@ -191,10 +191,10 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
191
191
  - **Một cuộc trò chuyện không tiếp tục sau khi khởi động lại:** Tiếp tục sau khi khởi động lại đang tắt khi dsh thoát, bạn đã tự dừng lượt đó, lượt đã kết thúc (xong hoặc thất bại), cuộc trò chuyện đã được lưu trữ, hoặc có hơn 20 cuộc trò chuyện đang chạy (20 cuộc trò chuyện mới nhất sẽ tiếp tục).
192
192
  - **Hàng đợi trống sau khi khởi động lại:** chính dsh xóa hàng đợi khi thoát. Tiếp tục sau khi khởi động lại chỉ đặt lại hàng đợi trong cuộc trò chuyện mà nó tiếp tục; ở các cuộc trò chuyện khác, hãy gửi lại tin nhắn. Tin nhắn bạn xóa ngay trước khi thoát có thể quay lại: hãy xóa lại.
193
193
  - **Mở issue trên GitHub báo "gh could not open the issue":** thông báo này là dòng đầu tiên của chính `gh`. Chạy `gh auth status` trong terminal và đăng nhập bằng `gh auth login`; thư mục của cuộc trò chuyện phải có một remote GitHub (`git remote -v`). "not installed or not on the PATH of dsh" nghĩa là dsh không tìm thấy `gh`: hãy cài nó, hoặc khởi động dsh từ một terminal mà ở đó `gh` hoạt động.
194
- - **Dòng cuộc trò chuyện không có nhãn branch:** cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài phiên bản này, thư mục của nó không phải repository git, hoặc **Branch Git trên dòng cuộc trò chuyện** đang tắt. Sau khi cập nhật, hãy khởi động lại dsh (phần Host ghi lại branch).
194
+ - **Dòng cuộc trò chuyện không có nhãn branch:** thanh bên không ở chế độ xem “Trong một danh sách” (trong “Không gian làm việc” và “Cây không gian làm việc”, không dòng cuộc trò chuyện nào hiển thị nhãn), cuộc trò chuyện chưa có lượt nào kể từ khi bạn cài phiên bản này, thư mục của nó không phải repository git, hoặc **Branch Git trên dòng cuộc trò chuyện** đang tắt. Sau khi cập nhật, hãy khởi động lại dsh (phần Host ghi lại branch).
195
195
  - **Kiểm tra mục tiêu báo bài kiểm thử thoát với mã 127 hoặc "not found":** dsh khởi động từ Finder hoặc Dock có thể có PATH ngắn hơn terminal của bạn, nên không tìm thấy `npm`, `pnpm` hoặc `cargo`. Hãy khởi động dsh từ terminal, hoặc đặt lệnh kiểm thử của riêng bạn với đường dẫn đầy đủ trong **Kiểm tra mục tiêu** → **Sửa**. **Chạy ngay** hiện kết quả ngay lập tức.
196
196
  - **Mục tiêu không đóng và tác tử tiếp tục làm việc:** **Kiểm tra mục tiêu** đã tìm thấy một bài kiểm thử thất bại hoặc phần việc còn thiếu; dòng bên dưới mục tiêu cho biết lý do (di chuột lên kết quả để xem chi tiết). Hãy sửa nguyên nhân hoặc lệnh kiểm thử, hoặc tự hoàn tất mục tiêu bằng `/goal` hoặc thanh mục tiêu (việc này không được kiểm tra).
197
- - **Cài đặt thất bại ngay sau một bản phát hành:** thêm số phiên bản (`dsh-composer-plus@1.18.0`), xem ghi chú cài đặt ở trên.
197
+ - **Cài đặt thất bại ngay sau một bản phát hành:** thêm số phiên bản (`dsh-composer-plus@1.19.0`), xem ghi chú cài đặt ở trên.
198
198
  - **Sao lưu ngay báo "Một thao tác sao lưu khác đang chạy":** một thao tác đang chạy trong cửa sổ dsh khác hoặc trong bảng điều khiển cứu hộ (chúng dùng chung tệp khóa `.composer-plus.lock` trong thư mục sao lưu). Hãy chờ thao tác đó xong. Nếu không có thao tác nào đang chạy, khóa của tiến trình đã đóng sẽ được tiếp quản ở lần nhấp tiếp theo.
199
199
  - **Bảng điều khiển cứu hộ báo "dsh is running":** trước tiên hãy thoát dsh. Nếu dsh thật sự đã đóng, tệp được nêu trong thông báo là phần còn sót lại sau một sự cố: hãy xóa tệp đó rồi thử lại.
200
200
  - **Sau khi khôi phục, dsh không khởi động hoặc thiếu một plugin:** cần cài lại các gói plugin của profile. Bảng điều khiển cứu hộ đề nghị việc này sau khi khôi phục; hoặc chạy `pnpm install` trong từng thư mục dưới `$DSH_HOME/profiles/` mà nó liệt kê. Các thông tin bí mật không có trong vault (máy tính khác) phải được nhập lại: bảng điều khiển liệt kê chúng.
@@ -214,6 +214,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
214
214
  - **Xóa cuộc trò chuyện** cần tính năng lưu trữ của dsh (dsh 0.2.0 trở lên). Một cuộc trò chuyện (hoặc một cuộc trò chuyện subagent của nó) không dừng trong vòng 15 giây, hoặc đang bị một dsh khác giữ, sẽ ở trạng thái đã lưu trữ và không có gì bị di chuyển. Trên hệ thống khác macOS, thư mục thùng rác phải nằm cùng ổ đĩa với lịch sử trò chuyện. Một cuộc trò chuyện đang mở mà bạn xóa vẫn ở trong bộ nhớ của dsh, ở trạng thái đã lưu trữ và bị ẩn, cho đến khi dsh khởi động lại. Hãy tự dọn Thùng rác; dsh không làm việc này.
215
215
  - Hàng đợi của dsh không có thao tác `move`, nên phần Host của plugin di chuyển chính tin nhắn đang chờ trong hàng đợi của dsh (một thay đổi, vẫn là tin nhắn đó). Tin nhắn có hình ảnh hoặc tệp cũng di chuyển được. Chỉ tin nhắn của chính bạn mới di chuyển được: một vòng mục tiêu hoặc một câu trả lời cho câu hỏi trong hàng đợi vẫn ở nguyên chỗ. Nếu một tin nhắn bắt đầu được gửi trong lúc bạn kéo, không có gì được di chuyển và một thông báo cho biết điều đó.
216
216
  - dsh 0.2.1 tải bản cập nhật ngay lập tức khi phiên bản mới không thay đổi cài đặt nào của dsh; trong các trường hợp khác và trên dsh 0.2.0, hãy khởi động lại dsh để tải bản cập nhật. Plugin không bao giờ tự khởi động lại dsh thay bạn. Profile web/CLI không có trình quản lý plugin của dsh chỉ báo có phiên bản mới.
217
+ - **Có gì mới trong Composer Plus N** hiện ghi chú bằng ngôn ngữ trong **Ngôn ngữ ứng dụng**. Ngôn ngữ giao diện có vùng khác sẽ nhận ghi chú của ngôn ngữ gốc (`en-GB` nhận ghi chú tiếng Anh, `zh-TW` nhận ghi chú tiếng Trung của `zh`). Ngôn ngữ không có ghi chú (ngôn ngữ do gói ngôn ngữ khác thêm vào, hoặc `pt-PT`, không phải `pt-BR`) sẽ hiện ghi chú tiếng Anh. Ghi chú đi kèm phiên bản mới. Nếu bản đang chạy không có tệp ghi chú đọc được (`release-notes.json`), cửa sổ hiện ghi chú tiếng Anh trên GitHub.
217
218
  - **Cho phép trong cuộc trò chuyện này** tính giới hạn thời gian từ lúc cấp quyền. Giới hạn thời gian mới áp dụng ngay cho các quyền đang có hiệu lực, nên một giới hạn ngắn hơn có thể kết thúc chúng ngay. Quyền từ phiên bản 1.12 trở về trước không có thời gian: sau khi cập nhật, agent sẽ hỏi lại một lần cho các công cụ đó.
218
219
  - **Giữ con trỏ trong khung soạn thảo** chỉ trả lại tiêu điểm sau một lệnh `/` hoặc một skill. Trong lúc dsh xử lý lệnh, khung soạn thảo ở chế độ chỉ đọc trong vài mili giây, nên các phím nhấn trong khoảng đó bị mất. Nếu menu `/` của dsh vẫn đang mở, `Enter` chọn dòng đang được tô sáng và không gửi.
219
220
  - **Vừa thẻ câu hỏi với cửa sổ** chỉ thay đổi thẻ câu hỏi của dsh, không thay đổi thẻ duyệt kế hoạch. Tính năng tìm thẻ qua mã đánh dấu của dsh (`data-question-key`, `data-question-scroll`); nếu một bản cập nhật dsh thay đổi mã đánh dấu đó, thẻ hiển thị như dsh vẽ. Chiều cao của thẻ theo cửa sổ, không theo cuộc trò chuyện: trong một cuộc trò chuyện ở bảng bên hẹp, một thẻ cao vẫn có thể vượt lên trên cuộc trò chuyện.
@@ -227,7 +228,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
227
228
  - **Cuộc trò chuyện này** chỉ tính các tệp mà công cụ tệp của dsh (`write`, `edit`, `str_replace_editor`) đã ghi. Tệp do một lệnh (`bash`) thay đổi không có trong chế độ xem này; chúng hiện trong **Chưa commit**. Khi không có snapshot Hoàn tác lượt của cuộc trò chuyện (Hoàn tác lượt đang tắt, đã cài dsh-rewind-plugin, hoặc cuộc trò chuyện cũ hơn plugin), chế độ xem so sánh với commit gần nhất và báo như vậy. Hoàn tác lượt giữ 50 snapshot mới nhất của một cuộc trò chuyện: trong cuộc trò chuyện dài hơn, chế độ xem so sánh với snapshot cũ nhất còn giữ, cho biết từ tin nhắn nào và không tính các thay đổi trước đó. **Ẩn thay đổi khoảng trắng** là `git diff -w`: một dòng chỉ thay đổi khoảng trắng bên trong cũng bị ẩn.
228
229
  - **Mở issue trên GitHub** cần GitHub CLI (`gh`) trong PATH của dsh và một remote GitHub trong thư mục của cuộc trò chuyện. Tính năng chạy tối đa 60 giây; nếu `gh` mất nhiều thời gian hơn, issue có thể đã có trên GitHub mà không có liên kết trong danh sách (trước khi nhấp lại, hãy xem trên GitHub: danh sách chỉ đọc liên kết từ một lần chạy đã xong, nên một lần nhấp mới có thể mở issue thứ hai). Thư mục có nhiều hơn một remote GitHub dùng mặc định của chính `gh` (`gh repo set-default`).
229
230
  - **Các cuộc trò chuyện đã thay đổi tệp này** chỉ biết các công cụ tệp của dsh (`write`, `edit`, `str_replace_editor`), giống **Cuộc trò chuyện này**: thay đổi do một lệnh (`bash`) tạo ra không được liệt kê. Tính năng đọc 300 cuộc trò chuyện mới nhất của repository (theo thời điểm tạo) và báo khi có nhiều hơn; tính năng hiển thị tối đa 100 dòng. Tệp đã đổi tên được liệt kê theo tên mà công cụ đã ghi. Cuộc trò chuyện có thư mục nằm ngoài repository (kể cả qua một đường dẫn khác tới cùng các tệp) không được tính. Lần mở đầu tiên sau khi khởi động dsh sẽ đọc mọi nhật ký trò chuyện của repository (khoảng 4 giây cho 275 cuộc trò chuyện); các lần mở sau chỉ đọc những cuộc trò chuyện đã thay đổi từ đó.
230
- - **Branch Git trên dòng cuộc trò chuyện** hiển thị branch của thư mục cuộc trò chuyện khi lượt cuối của nó bắt đầu hoặc kết thúc, không phải branch hiện tại: việc chuyển branch bên ngoài một lượt sẽ hiện sau lượt tiếp theo. Các cuộc trò chuyện từ trước phiên bản này không có nhãn cho đến lượt tiếp theo của chúng. Nhãn nằm trong markup dòng cuộc trò chuyện của dsh (dsh không có vị trí dành cho nó ở đó); nếu một bản cập nhật dsh thay đổi markup đó, nhãn không hiện. Nếu dòng dự án phía trên cuộc trò chuyện có cùng tên với branch (ví dụ thư mục của “Branch riêng cho từng cuộc trò chuyện”), dòng cuộc trò chuyện không hiển thị nhãn, nhưng “Trong một danh sách” vẫn hiển thị nhãn.
231
+ - **Branch Git trên dòng cuộc trò chuyện** hiển thị branch của thư mục cuộc trò chuyện khi lượt cuối của nó bắt đầu hoặc kết thúc, không phải branch hiện tại: việc chuyển branch bên ngoài một lượt sẽ hiện sau lượt tiếp theo. Các cuộc trò chuyện từ trước phiên bản này không có nhãn cho đến lượt tiếp theo của chúng. Nhãn nằm trong markup dòng cuộc trò chuyện của dsh (dsh không có vị trí dành cho nó ở đó); nếu một bản cập nhật dsh thay đổi markup đó, nhãn không hiện. Nhãn chỉ hiện trong “Trong một danh sách”.
231
232
  - **Branch riêng cho từng cuộc trò chuyện** ở chế độ kế hoạch: dsh gửi `/plan <tin nhắn>` như một lệnh, không phải một tin nhắn, nên Composer Plus chặn thao tác gửi lệnh đó trong ô nhập của dsh (không phải API công khai). Nếu một bản cập nhật dsh thay đổi điều này, `/plan <tin nhắn>` khi đã chọn **Branch mới** sẽ chạy trong Cuộc trò chuyện mới đang mở như lệnh riêng của dsh. Khi Host không thể bật chế độ kế hoạch trong cuộc trò chuyện mới, thư mục branch vẫn còn và tin nhắn không được gửi, nên cuộc trò chuyện mới không thay đổi tệp ở chế độ mặc định.
232
233
  - **Branch riêng cho từng cuộc trò chuyện**: khi thư mục branch của một cuộc trò chuyện (`<project>/.worktrees/<name>`) bị xóa, ví dụ khi chính agent của cuộc trò chuyện gỡ worktree và xóa branch, bước tiếp theo của cuộc trò chuyện sẽ chuyển cuộc trò chuyện ra khỏi thư mục đó. Dự án của thư mục branch biến mất khỏi thanh bên, còn cuộc trò chuyện hiển thị dưới Chưa nhóm và vẫn mở. Trên dsh 0.2.1 trở lên, cuộc trò chuyện tiếp tục trong thư mục chính của dự án, và mô hình nhận được một ghi chú về thư mục mới. Trên dsh 0.2.0, cuộc trò chuyện vẫn giữ thư mục đã xóa: lệnh chạy ở đó sẽ lỗi cho đến khi bạn bắt đầu cuộc trò chuyện mới. Dự án của một branch đã xóa mà không cuộc trò chuyện nào dùng cũng biến mất khỏi thanh bên: Composer Plus kiểm tra các thư mục branch khi khởi động và mỗi 30 giây, kể cả khi không có bộ lọc thanh bên. Trong lúc một cuộc trò chuyện đang được chuyển, **Branch mới** trong cùng kho mã sẽ trả lời "hãy thử lại". Khi tắt công tắc, lỗi của chính dsh lại hiện ra ("working-directory: directory does not exist").
233
234
  - **Branch trong cây không gian làm việc** ghi vào git mà không cần nhấp: khi chuyển một cuộc trò chuyện, nó đưa thư mục dự án về branch trước đó (`git switch`) và thêm một worktree (`git worktree add`). Nó không bao giờ xóa branch, worktree hay tệp. dsh không thể đổi thư mục của một cuộc trò chuyện, nên cuộc trò chuyện được chuyển là một bản sao (fork của chính dsh, với id mới) và cuộc trò chuyện cũ được lưu trữ. Bản sao tiếp tục công việc đã dừng; lệnh gọi công cụ đang chạy khi branch xuất hiện kết thúc bằng một lời từ chối, và agent chạy lại nó trong thư mục mới. Mục tiêu của cuộc trò chuyện cũ không đi theo. Chỉ cuộc trò chuyện có thư mục là thư mục chính của kho mới được chuyển, và chỉ với branch mà nó đã tạo và chuyển sang trong lượt đó (`git switch -c`, `git checkout -b`): branch chỉ tạo bằng `git branch`, thư mục có thay đổi chưa commit, worktree được liên kết hoặc thư mục con đều không chuyển gì. Trong cây chỉ hiện các worktree nằm trực tiếp trong `<project>/.worktrees/` và có branch; worktree tách rời (detached) hoặc ở nơi khác thì không hiện. Bản sao chỉ tự mở khi cuộc trò chuyện của nó là cuộc trò chuyện đang mở (plugin đọc điều này từ hàng thanh bên của dsh); nếu không, nó nằm trong dự án của branch.
@@ -248,7 +249,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
248
249
  - **Tiếp tục trong cuộc trò chuyện mới** gửi cuộc trò chuyện (tin nhắn, lệnh gọi công cụ và phần cuối của mỗi kết quả công cụ, tối đa khoảng 60.000 ký tự, phần mới nhất) đến mô hình của chính cuộc trò chuyện. Ghi chú bàn giao có thể bỏ sót một quyết định hoặc một tệp: hãy đọc ghi chú trước khi bắt đầu. Cuộc trò chuyện mới chỉ biết ghi chú và cuộc trò chuyện được liên kết (dsh đính kèm cuộc trò chuyện cũ làm ngữ cảnh chỉ đọc); ngữ cảnh mô hình của nó bắt đầu nhỏ, cuộc trò chuyện cũ vẫn giữ nguyên. Mỗi cuộc trò chuyện chỉ có một lần viết ghi chú hoặc bắt đầu tại một thời điểm.
249
250
  - **Phân tích ngữ cảnh** hiện số ước tính theo quy tắc của chính dsh (khoảng 4 ký tự cho mỗi token), cùng quy tắc với vòng ngữ cảnh của dsh; số đếm của chính mô hình có thể khác. Định nghĩa công cụ là định nghĩa của yêu cầu mới nhất. Tính năng hiện ngữ cảnh như nhật ký cuộc trò chuyện ghi lại; một lượt đang chạy xuất hiện sau bước tiếp theo của lượt đó.
250
251
  - **Các bước đã lên kế hoạch** chỉ tiết kiệm token khi mô hình thực sự lên kế hoạch: khi đang bật, mỗi yêu cầu đều mang công cụ `plan_next_steps` và một chỉ dẫn ngắn (khoảng 500 token), kể cả trong những cuộc trò chuyện mà mô hình không bao giờ lên kế hoạch. Một điều kiện chỉ chứng minh đúng điều nó nêu (ví dụ: mã thoát của bản dựng là 0), không chứng minh công việc là đúng. `ok` đọc các dấu kết quả riêng của dsh (`[exit code: N]`, hết thời gian, sandbox từ chối); một lệnh thất bại mà không có mã thoát khác 0 vẫn được tính là đạt. Các bước chạy lần lượt từng bước; hai bước cùng sẵn sàng sẽ được trả lại cho mô hình. Tin nhắn của bước được lưu dưới dạng tin nhắn trợ lý của mô hình trong cuộc trò chuyện (dsh không có dấu cho tin nhắn do plugin viết), nên nội dung của nó ghi rằng Composer Plus đã chạy bước đó. Không có trong Tether.
251
- - **Bảng tác vụ** chỉ biết các dự án của dsh: cuộc trò chuyện nằm ngoài dự án hiện **Tất cả dự án**, và thư mục branch riêng của từng cuộc trò chuyện (`<project>/.worktrees/<name>`) được tính là thuộc dự án của nó. Id dự án (`acme#12`) lấy từ tên thư mục và giữ nguyên khi bạn đổi tên dự án trong dsh. Quy tắc "giữ bảng luôn cập nhật" chỉ được đưa vào cuộc trò chuyện khi dự án của nó có tác vụ đang mở; cuộc trò chuyện đã nhận quy tắc thì giữ lại. Tác tử được dặn để **Xong**, **Tồn đọng** và các tác vụ thủ công lại cho bạn, nhưng công cụ không từ chối: tác tử vẫn có thể chuyển một thẻ như vậy. Khi tính năng bật, các công cụ bảng có trong danh sách công cụ của mọi cuộc trò chuyện (khoảng 1.000 token mỗi yêu cầu); hãy tắt tính năng nếu bạn không dùng bảng. Trang đọc bảng mỗi 2 giây khi đang hiện; thay đổi của tác tử hiện trong khoảng thời gian đó. Văn bản bạn sửa trong lúc tác tử thay đổi cùng trường sẽ không được lưu: khung chi tiết hiện văn bản mới và lý do. Không có hình ảnh, không đồng bộ git giữa các máy và không chia sẻ qua mạng (Kanzo có các tính năng này). Ý tưởng và giao diện lấy từ [Kanzo](https://github.com/emanuele-em/kanzo) của emanuele-em (AGPL-3.0); Composer Plus không dùng mã của nó.
252
+ - **Bảng tác vụ** hiện các cuộc trò chuyện mà dsh liệt kê trong cửa sổ này: cuộc trò chuyện nằm ngoài dự án chỉ hiện trong **Tất cả dự án**, và thư mục branch riêng của từng cuộc trò chuyện (`<project>/.worktrees/<name>`) được tính là thuộc dự án của nó. Cột của một thẻ là trạng thái trực tiếp của cuộc trò chuyện, nên không thể kéo thẻ: cuộc trò chuyện chuyển sang **Xong** khi lượt của nó kết thúc, kể cả sau lỗi hoặc khi bị dừng, và quay lại **Đang làm** khi chạy lại. Chấm xanh lá là chấm hoàn tất của chính dsh, mà dsh chỉ giữ trong cửa sổ này: sau khi trang được tải lại, các cuộc trò chuyện đã xong hiện không có chấm này. **Xong** hiện 50 cuộc trò chuyện mới nhất (**Hiện N tác vụ cũ hơn** hiện phần còn lại). Nhãn đến từ một lệnh gọi mô hình cho mỗi tác vụ đã bắt đầu: nhãn có thể sai, và cuộc trò chuyện mà bạn không bắt đầu trên bảng thì không có nhãn. Tiêu đề là tiêu đề cuộc trò chuyện của chính dsh (dịch vụ đặt tiêu đề của dsh, với mô hình của cuộc trò chuyện); cho đến khi có tiêu đề, thẻ hiện dòng đầu tiên của prompt. Prompt bắt đầu bằng một lệnh `/` mà dsh biết (`/plan`, `/goal`) chạy như lệnh đó. **Trả lời** chỉ trả lời yêu cầu mới nhất của cuộc trò chuyện: khi yêu cầu đó đã được trả lời ở nơi khác (cửa sổ khác, Tether, Đánh giá tự động) hoặc cuộc trò chuyện hỏi điều mới, khung chi tiết báo điều đó và không gửi gì. Các phiên bản trước có danh sách tác vụ với bình luận và công cụ cho tác tử; chúng đã bị bỏ, và `board.json` cũ không được hiển thị. Ý tưởng và giao diện lấy từ [Kanzo](https://github.com/emanuele-em/kanzo) của emanuele-em (AGPL-3.0); Composer Plus không dùng mã của nó.
252
253
  - **Ưu tiên tin nhắn gửi sau khi Dừng** chỉ hoạt động sau khi bạn dừng cuộc trò chuyện (hoặc sau một lượt bị lỗi, hoặc khi bạn mở một cuộc trò chuyện vẫn còn hàng đợi): tin nhắn bạn gửi khi một lượt đang chạy vẫn chờ ở cuối hàng đợi. Nó chỉ vượt lên trước các tin nhắn của chính bạn trong hàng đợi: nếu trong hàng đợi có một vòng mục tiêu hoặc một câu trả lời cho câu hỏi đang chờ, thứ tự của dsh được giữ nguyên. Nó đọc một phần của dsh không phải là API công khai (lượt đã dừng có còn đang kết thúc không); nếu một bản cập nhật dsh đổi tên phần đó, tin nhắn chỉ được đưa lên đầu sau khi lượt đó kết thúc. Cuộc trò chuyện của subagent giữ thứ tự của dsh.
253
254
  - **Bộ nhớ dự án** thuộc về thư mục đầu tiên của cuộc trò chuyện (thư mục dự án của dsh): cuộc trò chuyện đổi thư mục bằng `cd` vẫn giữ bộ nhớ của dự án đầu tiên, và cùng thư mục được mở qua một đường dẫn khác tới cùng các tệp sẽ dùng chung bộ nhớ. Cuộc trò chuyện cố định phần bộ nhớ khi bắt đầu, nên ghi chú lưu sau đó hiện từ cuộc trò chuyện tiếp theo (`memory_recall` tìm thấy ngay). Việc xem xét chỉ giữ những gì mô hình quyết định giữ: có thể bỏ sót một dữ kiện hoặc giữ một dữ kiện sai; hãy kiểm tra trong **Mở bộ nhớ** và sửa ở đó, hoặc sửa các tệp bằng tay khi dsh đã đóng. **Mở bộ nhớ** gửi ghi chú của dự án được chọn và ghi chú chung (mọi dự án khi bạn chọn Tất cả ghi chú; tối đa khoảng 60.000 ký tự, phần còn lại chỉ được đếm và không thể thay đổi trong yêu cầu đó) cùng văn bản của bạn tới mô hình mặc định của dsh, không phải mô hình của cuộc trò chuyện. Bản xem trước được giữ trên Mac trong 30 phút và cho đến khi dsh khởi động lại; nếu việc xem xét hoặc tác tử thay đổi ghi chú trong lúc đó, **Áp dụng** sẽ từ chối và bạn xem trước lại. **Áp dụng** lưu tất cả thay đổi của một bản xem trước hoặc không lưu gì: nếu một thay đổi không lưu được (ví dụ MEMORY.md đã đầy), ghi chú giữ nguyên và lý do được hiển thị. Mỗi lượt kết thúc có tin nhắn của bạn tốn một lần gọi mô hình; lần gọi thất bại sẽ đọc lại cùng các tin nhắn sau lượt tiếp theo. Cuộc trò chuyện của tác tử con không được xem xét. Ý tưởng và định dạng tệp lấy từ [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus không dùng mã của nó và không bao giờ đọc hay ghi bộ nhớ riêng của DS Bot.
254
255
  - **Sao lưu** dùng một thư mục cố định duy nhất, `~/Desktop/dsh-backups` (thư mục mặc định của dsh-backup, nên các tệp lưu trữ của nó vẫn dùng được); không có cài đặt cho thư mục khác. Một tệp lưu trữ lớn gần bằng thư mục home của dsh khi không tính `cache/` và `dsh-runtimes/` (đo thực tế: 1,6 GB tệp tạo ra tệp lưu trữ 830 MB trong khoảng 30 giây trên Apple Silicon; dsh vẫn phản hồi bình thường). Một tệp thay đổi trong lúc được đọc sẽ được lưu ở trạng thái lúc quá trình sao lưu mở nó, nên nhật ký của một cuộc trò chuyện đang mở có thể kết thúc bằng một bản ghi bị cắt, và dsh sửa bản ghi đó ở lần ghi tiếp theo. Việc che tìm thông tin bí mật trong tệp yml theo tên khóa trên một dòng (`token:`, `apiKey:`, …); thông tin bí mật trong flow map (`{token: x}`), trong một danh sách dưới khóa như vậy, trong tệp JSON (ví dụ `apiKey` của một máy chủ MCP trong tệp `.json`) hoặc dưới tên khác vẫn nằm trong tệp lưu trữ. Các tệp lưu trữ theo loại của dsh-backup (`dsh-t-…`) không được liệt kê. **Cho máy tính khác** sao chép tệp lưu trữ (trên APFS là bản clone: không tốn thêm dung lượng); vault không đi kèm. **Sao lưu ngay** không xóa bản sao lưu nào. Một lần sao lưu tự động giữ các bản sao lưu mới nhất do Composer Plus tạo (cài đặt **Giữ** của **Tự động sao lưu**) và xóa các bản cũ hơn do nó tạo; các snapshot trước khi nâng cấp được đếm riêng (giữ lại 2 bản mới nhất). Các tệp lưu trữ của dsh-backup không bao giờ bị xóa: hãy xóa chúng bằng **Xóa**. Khi dsh-backup vẫn còn được cài, nó tính các tệp lưu trữ của Composer Plus vào số bản giữ lại của riêng nó và có thể xóa chúng.
@@ -285,7 +286,7 @@ Khi menu `/` hoặc `@` đang mở, menu đó giữ các phím này cho riêng n
285
286
 
286
287
  **Tác tử có thể nhớ sở thích của tôi giữa các cuộc trò chuyện, như bộ nhớ của DS Bot không?** Có, với **Bộ nhớ dự án** (mặc định tắt): hãy bật trong **Cài đặt → Composer Plus**. Sau mỗi lượt, sở thích và quyết định lâu dài của bạn được lưu thành ghi chú ngắn cho dự án của cuộc trò chuyện, và mọi cuộc trò chuyện mới trong dự án đó đều đọc chúng. Hãy bảo tác tử nhớ một điều, nó sẽ lưu ngay. Để xem hoặc thay đổi ghi chú, bấm **Mở bộ nhớ** ở cùng hàng và viết điều cần thay đổi.
287
288
 
288
- **Tôi và các tác tử có thể dùng chung một bảng tác vụ như Kanzo không?** Có, với **Bảng tác vụ** (mặc định bật): mở nó ở thanh bên trái và thêm tác vụ bằng **Tác vụ mới**. Trong một cuộc trò chuyện, hãy bảo tác tử "lấy tác vụ tiếp theo từ bảng": tác tử chuyển thẻ sang **Đang làm**, bình luận về việc đã làm rồi chuyển thẻ sang **Đang duyệt**. Đánh dấu một tác vụ là **Thủ công** để giữ nó cho chính bạn.
289
+ **Tôi có thể xem tất cả cuộc trò chuyện của mình dưới dạng bảng kanban và bắt đầu cuộc trò chuyện mới từ đó không?** Có, với **Bảng tác vụ** (mặc định bật): mở nó ở thanh bên trái. Mỗi cuộc trò chuyện là một thẻ trong **Đang làm**, **Đang duyệt** (đang chờ bạn) hoặc **Xong**. **Tác vụ mới** chỉ cần một prompt và bắt đầu một cuộc trò chuyện mới với prompt đó; nhấp **Trả lời** trên thẻ màu cam để trả lời mà không cần mở cuộc trò chuyện.
289
290
 
290
291
  **dsh có thể sao lưu các cuộc trò chuyện và cài đặt của tôi như dsh-backup không?** Có: **Cài đặt → Composer Plus → Sao lưu → Sao lưu ngay**. Nó ghi cùng định dạng tệp lưu trữ vào cùng thư mục (`~/Desktop/dsh-backups`), nên các tệp lưu trữ của dsh-backup cũng hiện ra và khôi phục được, và bạn có thể gỡ dsh-backup. Bật **Tự động sao lưu** để sao lưu theo lịch.
291
292
 
@@ -407,7 +408,7 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
407
408
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
408
409
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
409
410
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
410
- # Task board: the page, the agent tools (fake model), drag and drop, search, the switch
411
+ # Task board: a prompt starts a chat, AI tags, live columns, Answer on the board, Hide finished, the switch
411
412
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
412
413
  ```
413
414
 
package/README.zh.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 releases 和 npm registry);关闭 **自动更新** 后,启动时就不再发出这些请求。只有在你点击 **推荐功能** 时,**功能创意** 才会调用对话自己的模型。**下一条消息预测**(默认开启)每完成一个回合都会调用一次在设置中选择的模型(除非你另选,否则为 dsh 的默认模型),不需要点击;在 **设置 → Composer Plus** 中关闭它,即可停止这些调用。**输入时补全**(默认关闭)在你开启后,会在你每次输入停顿时调用为它选择的模型(默认使用预测的模型)。只有在你点击魔法棒时,**优化提示词** 才会调用模型。**目标检查**(默认开启)在智能体每次于自动轮次中把 `/goal` 标记为完成时调用一次模型。**手机连接**(默认关闭)只有在你开启后,才会接受来自本地网络或 tailnet 的 iPhone 连接。
17
+ 这是非官方的社区插件。插件只在检查更新时访问网络(GitHub releases 和 npm registry);关闭 **自动更新** 后,启动时就不再发出这些请求。只有在你点击 **推荐功能** 时,**功能创意** 才会调用对话自己的模型。**下一条消息预测**(默认开启)每完成一个回合都会调用一次在设置中选择的模型(除非你另选,否则为 dsh 的默认模型),不需要点击;在 **设置 → Composer Plus** 中关闭它,即可停止这些调用。**输入时补全**(默认关闭)在你开启后,会在你每次输入停顿时调用为它选择的模型(默认使用预测的模型)。只有在你点击魔法棒时,**优化提示词** 才会调用模型。**任务看板** 会为你在看板上开始的每个任务调用一次新对话的模型,用来生成标签。**目标检查**(默认开启)在智能体每次于自动轮次中把 `/goal` 标记为完成时调用一次模型。**手机连接**(默认关闭)只有在你开启后,才会接受来自本地网络或 tailnet 的 iPhone 连接。
18
18
 
19
19
  ## 安装
20
20
 
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  然后重启 dsh。(CLI 无法安装到桌面版 profile 中;桌面版 profile 由应用自己管理。)
31
31
 
32
- > dsh 使用的 pnpm 会跳过发布不到 24 小时的版本。刚发布新版本时,请加上版本号:`dsh-composer-plus@1.18.0`。
32
+ > dsh 使用的 pnpm 会跳过发布不到 24 小时的版本。刚发布新版本时,请加上版本号:`dsh-composer-plus@1.19.0`。
33
33
 
34
34
  ## 功能
35
35
 
@@ -71,11 +71,11 @@ 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`),点击它的类型可在 **读取和写入** 与 **仅写入** 之间切换,用 ✕ 移除它,或点击 **使用默认值**。不含 `/` 的模式会匹配任意文件夹中的文件名。这是护栏,不是沙箱:shell 命令(`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>默认开启,列表为空。智能体的 shell 命令(`bash`、`pwsh`)不能运行与你的规则匹配的命令:**阻止** 规则会拒绝调用(智能体会看到原因,并被告知要问你),**先询问** 规则会显示 dsh 的审批卡片,只有你允许后命令才会运行。设置 → Composer Plus → **禁止的命令**:输入一条规则(例如 `npm publish`、`git push --force` 或 `ssh *192.168.2.19`),点击类型可在 **阻止** 与 **先询问** 之间切换,然后点击 **添加**;点击规则的类型可以更改它,用 ✕ 移除它。一条规则是一个命令名和必须按此顺序出现在它后面的词;`*` 匹配任意文本。它也能找到 `&&`、`;`、`\|` 之后,`$(…)`、`bash -c "…"` 或 `eval` 之中,以及 `sudo` 或 `env` 之后的命令。这是护栏,不是沙箱:变量(`$CMD`)、脚本文件或其他程序仍能运行该命令(见“限制”)。 | <a href="assets/features/blockedCommands.webp"><img src="assets/features/blockedCommands.webp" width="160" alt="截图:禁止的命令"></a> |
74
- | **任务看板** | <a id="feature-taskboard"></a>左侧边栏 → **任务看板**。供你和智能体共用的 dsh 项目看板:**待办**、**进行中**、**审核**和**已完成**(以及**积压**,见下文)。在左侧选择一个项目或**所有项目**。**新建任务**(或按 `n`)会打开一张新卡片:输入标题后按 `Enter`。把卡片拖到另一列或两张卡片之间。点击卡片可查看并修改**状态**、**标签**、**人工**(智能体会跳过)、描述(Markdown)和评论。`/` 搜索所有项目,`h` 只显示人工任务,导出按钮可把看板保存为 Markdown 或 JSON。智能体会获得看板工具:让对话“从看板领取下一个任务”,它会把**待办**最上面的卡片移到**进行中**,评论所做的工作并移到**审核**;由你移到**已完成**。在有未完成任务的项目中,每个对话都会自动获得这条规则。设置 → Composer Plus → **任务看板**中有**积压**列的开关:智能体不会处理其中的卡片。 | <a href="assets/features/taskBoard.webp"><img src="assets/features/taskBoard.webp" width="160" alt="截图:任务看板"></a> |
74
+ | **任务看板** | <a id="feature-taskboard"></a>左侧边栏 → **任务看板**。dsh 对话的看板,显示与侧边栏相同的实时状态:等待你审批、回答或审阅计划的对话在**审核**中并带橙色圆点,运行中的对话在**进行中**,已完成的对话在**已完成**中(打开前为绿色)。在左侧选择一个项目或**所有项目**;“每个对话一个分支”的文件夹算作它所属的项目。**新建任务**(或按 `n`)只需输入提示:按 `Enter` 会在项目中开始一个新对话,卡片显示在**待办**中,dsh 为对话命名,对话的模型最多写出 3 个标签。点击卡片可打开它的对话。在橙色卡片上点击**回答**,即可直接在看板上回答:**拒绝**或**允许一次**;计划则选**同意执行**或**要求修改**;问题则选择选项或输入你自己的文字。**隐藏已完成**会在此设备上隐藏**已完成**。 | <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
76
  | **本对话内允许** | <a id="feature-allowforchat"></a>当 Auto Review 询问你时,审批卡片上会多出 **本对话内允许**:从此以后,同一对话中的同一工具都会被允许,参数不限,直到时限结束(默认 1 小时;可在 **设置 → Composer Plus → 本对话内允许** 中选择)。之后代理会再次询问。标题栏中的标签会列出这些授权及其结束时间,也可以撤销它们。授权在重启后仍然有效。 | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="截图:本对话内允许"></a> |
77
77
  | **项目状态** | <a id="feature-projectstatus"></a>侧边栏中的项目行会显示与其对话相同的加载图标 / 等待 / 完成标记。因此,即使项目已折叠,你也能知道其中有对话正在运行或需要你处理。等待你处理的对话优先显示,其次是你尚未打开的已完成对话(绿色圆点,即使另一个对话仍在运行也会显示),最后是加载图标。将鼠标悬停在上面可查看详情。在**按工作区树**中,父文件夹的行也会显示其中每个项目(例如 `.worktrees/` 中的每个分支文件夹)的对话状态,折叠时也一样。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="截图:项目状态"></a> |
78
- | **对话行显示 Git 分支** | <a id="feature-sessionbranch"></a>侧边栏中的每个对话行会显示一个小的灰色标签,内容是该对话最后一轮时项目文件夹所在的 git 分支(例如 `main` 或 `feature/login`;分离的 HEAD 没有分支,不显示标签)。同一项目中位于不同分支的两个对话不再看起来一样,你也能立即发现自己是否要在错误的分支上继续对话。将鼠标悬停在标签上可查看完整名称。Host 部分会在每轮开始和结束时读取分支(`git branch --show-current`,只读);安装后还没有新一轮的对话,或不是 git 仓库的文件夹,不会显示标签。当对话上方的项目行与分支同名时(例如“每个对话一个分支”的文件夹),该对话行不显示分支标签,但“列表视图”中仍会显示。 | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="截图:对话行显示 Git 分支"></a> |
78
+ | **对话行显示 Git 分支** | <a id="feature-sessionbranch"></a>在侧边栏的“单列表”视图中,每个对话行会显示一个小的灰色标签,内容是该对话最后一轮时项目文件夹所在的 git 分支(例如 `main` 或 `feature/login`;分离的 HEAD 没有分支,不显示标签)。同一项目中位于不同分支的两个对话不再看起来一样,你也能立即发现自己是否要在错误的分支上继续对话。将鼠标悬停在标签上可查看完整名称。Host 部分会在每轮开始和结束时读取分支(`git branch --show-current`,只读);安装后还没有新一轮的对话,或不是 git 仓库的文件夹,不会显示标签。在“按工作区”和“按工作区树”视图中,对话已位于其项目行下,因此对话行不显示标签。 | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="截图:对话行显示 Git 分支"></a> |
79
79
  | **全部标为已读** | <a id="feature-markprojectread"></a>在侧边栏中,点击项目的 **…** 按钮 → **全部标为已读**。该项目中所有对话的绿色未读圆点会立即消失;其他项目的圆点保持不变。项目中没有未读对话时,此项显示为灰色(**没有未读对话**)。 | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="截图:全部标为已读"></a> |
80
80
  | **活跃项目置顶** | <a id="feature-activeprojectsfirst"></a>当某个对话开始运行或需要你处理时,它所在的项目会移到侧边栏顶部,并使用 dsh 自带的行动画(与把它拖到那里的效果相同)。已完成的项目保持原位;你可以像往常一样把它们拖到任意位置。移动会保存到 dsh 的项目顺序中,因此关闭此功能后会保留当前顺序。 | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="截图:活跃项目置顶"></a> |
81
81
  | **近期项目筛选** | <a id="feature-recentprojects"></a>侧边栏 → 视图选项(滑块图标)→ **最近 2 小时内活跃**。选中后,侧边栏只显示最近 2 小时内有活跃对话的项目。活跃对话包括:这段时间内更新过的对话、正在运行或等待中的对话、当前打开的对话,以及你尚未打开的已完成对话(dsh 的绿色“完成”圆点),超过 2 小时后也一样。没有这类对话的项目会被隐藏,新建的空项目也会被隐藏。在 **按工作区树** 中,只要父文件夹中的某个项目处于活跃状态,父文件夹就会保持显示,最近 2 小时内不活跃的对话也会被隐藏,因此只显示最近的对话。再次选择该项即可显示所有项目。这个选择保存在本设备上。 | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="截图:近期项目筛选"></a> |
@@ -85,7 +85,7 @@ dsh plugin --profile web add dsh-composer-plus
85
85
  | **空闲时打开等待中的对话** | <a id="feature-idleswitch"></a>当某个对话提出问题,或等待审批或计划审阅(橙色圆点),或完成了你尚未查看的一轮(绿色圆点),而你 30 秒没有使用 dsh 时,dsh 会打开该对话。橙色对话先于绿色对话打开。同一组中,等待最久的先打开;下一个会在再次 30 秒没有使用后打开。按键、点击、移动鼠标、滚轮或触摸都会让 30 秒重新计时。有焦点的输入框中有文字、选中了文本,或打开了菜单或对话框时,也不会切换。等待中的对话正在屏幕上时,不会切换。如果你没有回答就离开了等待中的对话,再次 30 秒没有使用后,它会再次打开。绿色对话打开后,它的圆点会消失;下一个绿色对话要等你再次使用 dsh,之后又 30 秒没有使用时才会打开。dsh 在后台时也会生效,但 dsh 不会被带到前台。 | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="截图:空闲时打开等待中的对话"></a> |
86
86
  | **应用语言** | <a id="feature-language"></a>设置 → Composer Plus → **应用语言** 可以把整个 dsh 界面切换为 Türkçe、Español、Português (Brasil)、Français、Deutsch、Русский、日本語、한국어、Bahasa Indonesia、Tiếng Việt 或 हिन्दी(见下文)。 | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="截图:应用语言"></a> |
87
87
  | **手机连接(iPhone)** | <a id="feature-mobileconnect"></a>通过 [Tether](tether/) 应用在 iPhone 上使用 dsh,可以在同一 Wi-Fi 下使用,也可以通过 [Tailscale](https://tailscale.com) 使用。请在 **设置 → Composer Plus** 中开启它(默认关闭,因为它会在这台 Mac 上开放一个网络端口)。然后点击侧边栏左下角的 **手机连接**:用 iPhone 相机扫描二维码(轻点 **Open in Tether**),或用 Tether 中的 **Scan code** 扫描,轻点 **Connect**,然后点击 **Approve**。请先安装 Tether:没有它,相机无法打开这个二维码。手机可以显示你的对话、发送消息(可附照片:输入框的 **+** → Camera、Photos 或 Paste image)、回答审批和问题,以及切换模型和智能体。你可以配对任意多台 Mac:点击应用左上角的 Mac 名称即可在它们之间切换。**手机连接** 面板会列出已配对的 iPhone 及其上次连接时间:点击 **Remove** 可立即断开其中一部。“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> |
88
- | **自动更新** | <a id="feature-autoupdate"></a>dsh 启动时,插件会检查 [最新的 GitHub release](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> |
88
+ | **自动更新** | <a id="feature-autoupdate"></a>dsh 启动时,插件会检查 [最新的 GitHub release](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
89
  | **备份** | <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
90
  | **自动备份** | <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> |
91
91
  | **会话日志检查** | <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> |
@@ -169,7 +169,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
169
169
  - **目标检查:** 只有当智能体在自动轮次中把 `/goal` 标记为完成时(或者你点击 **立即运行** 时)才会运行。Host 端在对话的文件夹中、按对话的沙箱模式运行测试命令(与 dsh 自己的 `bash` 工具相同:同样的文件访问策略;沙箱无法启动时,测试不会运行,检查判为失败)。为了找到命令,它只读取 `package.json`、`Makefile`、`Cargo.toml`、`go.mod`、`pyproject.toml` 和 `pytest.ini`,并且只读取文件夹内的普通文件(不跟随指向文件夹外部的符号链接,不读取 FIFO)。然后,它以一次不带工具的请求,把以下内容发送给在 **目标检查** 下选择的模型(默认为对话自己的模型):目标;从目标开始以来的对话(你的消息、智能体的回复、截断到 1,000 个字符的工具调用以及每个工具结果的最后 2,000 个字符;不含推理内容和已回退的步骤;最多约 60,000 个字符,最新的部分);`git status --short`;以及测试输出的末尾。工具输出可能包含智能体读取过的内容,因此这次请求可能包含你文件的一部分,与对话本身相同。对话和项目中都不会写入任何内容。你的测试命令、上限、上次结果(含其输出的末尾)和模型选择保存在 `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` 中(仅所有者可访问的文件,最新的 500 个对话)。
170
170
  - **在新对话中继续:** 在你点击之前,什么都不会运行。点击后,Host 端会把对话(与目标检查读取的方式相同:不含推理内容和已回退的步骤)发送给对话自己的模型,并显示交接说明;只有 **开始新对话** 才会创建新对话。项目中不会写入任何内容。
171
171
  - **上下文明细:** 只在 Host 上读取对话日志;不调用模型,不读取项目文件。
172
- - **任务看板:** 看板(任务的标题、描述、标签和评论,项目文件夹路径及其简短 ID)保存在 `$DSH_HOME/storages/dsh-composer-plus/board.json` 中(仅所有者可访问的文件);开关保存在旁边的 `board-switch.json` 中。数据不会离开你的电脑,也不会写入任何项目文件夹。看板工具会把你在看板上写的内容交给智能体,因此智能体读取任务时,任务文本会发送给对话所用的模型。损坏的看板文件会另存为 `board.json.broken-<时间>`,看板从空白开始。
172
+ - **任务看板:** 看板显示 dsh 自己的对话,数据来自 dsh 在此窗口中自己的列表;它不会添加自己的对话数据。你开始一个任务时,Host 端会在你选择的项目中新建一个对话,并把你的提示作为第一条消息发送给它,就像你在那里输入的一样,因此审批、沙箱和对话的模型照常适用。然后,它会以另一次不带工具的请求,把提示(只有前 4,000 个字符,没有其他内容)发送给该对话的模型,以获得最多 3 个标签。每个任务的提示、标签和开始时间保存在 `$DSH_HOME/storages/dsh-composer-plus/board-chats.json` 中(仅所有者可访问的文件,保留最新的 2,000 个);开关保存在旁边的 `board-switch.json` 中。不会向任何项目文件夹写入内容。**回答** 会把你的回答发送给 dsh 自己的待处理请求,与对话中自己的卡片做法相同。早期版本的旧任务列表(`board.json`)原样留在磁盘上,不会被读取。
173
173
  - **受保护的文件:** 列表和开关保存在 `$DSH_HOME/storages/dsh-composer-plus/protected-files.json` 中(仅所有者可访问的文件)。检查只读取每次文件工具调用的路径(及其真实路径),从不读取文件本身。
174
174
  - **禁止的命令:** 规则和开关保存在 `$DSH_HOME/storages/dsh-composer-plus/blocked-commands.json` 中(仅所有者可访问的文件)。检查只读取每次 `bash` 和 `pwsh` 调用的命令文本;它不运行任何内容,也不发送任何内容。
175
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 通过同一路由读取和修改笔记。
@@ -191,10 +191,10 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
191
191
  - **重启后对话没有继续:** dsh 退出时“重启后继续”处于关闭状态;或者你自己停止了那个回合;或者回合已经结束(完成或失败);或者对话已被归档;或者当时有超过 20 个对话正在运行(只有最新的 20 个会继续)。
192
192
  - **重启后队列是空的:** 清空队列的是 dsh 自己的退出流程。重启后继续只会在它继续的对话中放回队列;其他对话请重新发送消息。退出前刚删除的消息可能会回来:请再删除一次。
193
193
  - **创建 GitHub issue 提示“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。
194
- - **对话行上没有分支标签:** 安装此版本后,该对话还没有新的一轮;或者它的文件夹不是 git 仓库;或者 **对话行显示 Git 分支** 已关闭。更新后,请重启 dsh(分支由 Host 端记录)。
194
+ - **对话行上没有分支标签:** 侧边栏不是“单列表”视图(在“按工作区”和“按工作区树”中,对话行都不显示标签);或者安装此版本后,该对话还没有新的一轮;或者它的文件夹不是 git 仓库;或者 **对话行显示 Git 分支** 已关闭。更新后,请重启 dsh(分支由 Host 端记录)。
195
195
  - **目标检查显示测试以代码 127 或 “not found” 退出:** 从 Finder 或程序坞启动的 dsh 的 PATH 可能比终端里的短,因此找不到 `npm`、`pnpm` 或 `cargo`。请从终端启动 dsh,或者在 **目标检查** → **编辑** 中用完整路径设置你自己的测试命令。**立即运行** 会马上显示结果。
196
196
  - **目标没有关闭,智能体一直在工作:** **目标检查** 发现了失败的测试或缺少的工作;目标下方的一行会显示原因(将鼠标悬停在结果上可查看详情)。请修正原因或测试命令,或者用 `/goal` 或目标栏自己完成目标(这不会被检查)。
197
- - **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.18.0`),见上文的安装说明。
197
+ - **刚发布新版本时安装失败:** 请加上版本号(`dsh-composer-plus@1.19.0`),见上文的安装说明。
198
198
  - **立即备份显示“另一个备份操作正在进行”:** 另一个 dsh 窗口或救援控制台中正在运行一个操作(它们共用备份文件夹中的锁文件 `.composer-plus.lock`)。请等待它完成。如果没有操作在运行,下次点击时会接管已关闭进程留下的锁。
199
199
  - **救援控制台显示“dsh is running”:** 请先退出 dsh。如果 dsh 确实已关闭,消息中提到的文件是崩溃后留下的:删除它,然后重试。
200
200
  - **恢复后 dsh 无法启动或缺少插件:** 需要重新安装 profile 的插件包。恢复后,救援控制台会提供这一步;你也可以在它列出的 `$DSH_HOME/profiles/` 下的每个文件夹中运行 `pnpm install`。不在 vault 中的机密(另一台电脑)必须重新输入:控制台会列出它们。
@@ -214,6 +214,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
214
214
  - **删除对话** 需要 dsh 的归档功能(dsh 0.2.0 及更高版本)。如果对话(或它的某个子代理对话)在 15 秒内没有停止,或被另一个 dsh 持有,它会保持归档状态,不会移动任何内容。在 macOS 以外的系统上,废纸篓文件夹必须与对话历史位于同一磁盘。你删除的已打开对话会以归档和隐藏的状态留在 dsh 的内存中,直到 dsh 重启。请自行清倒废纸篓;dsh 不会替你清倒。
215
215
  - dsh 的队列没有 `move` 操作,所以由插件的 Host 端在 dsh 的队列中直接移动排队的消息本身(一次改动,还是同一条消息)。带有图片或文件的消息也能移动。只有你自己的消息可以移动:队列中的目标轮次或对问题的回答会留在原处。如果在你拖动时有消息开始发送,则不会移动任何消息,并会显示一条提示说明这一点。
216
216
  - 如果新版本不改动任何 dsh 设置,dsh 0.2.1 会立即加载更新;否则(以及在 dsh 0.2.0 上),请重启 dsh 来加载更新。插件从不替你重启 dsh。没有 dsh 插件管理器的网页版/CLI profile 只会提示有新版本。
217
+ - **Composer Plus N 的新功能** 使用 **应用语言** 中的语言显示说明。带其他地区的界面语言使用其基础语言的说明(`en-GB` 显示英文说明,`zh-TW` 显示 `zh` 的中文说明)。没有说明的语言(由其他语言包添加的语言,或不是 `pt-BR` 的 `pt-PT`)显示英文说明。说明随新版本一起安装。如果运行的副本没有可读的说明文件(`release-notes.json`),窗口会显示 GitHub 上的英文说明。
217
218
  - **本对话内允许** 从授权的那一刻开始计算时限。新的时限会立即应用于仍在生效的授权,因此更短的时限可能会让它们立即结束。1.12 及更早版本的授权没有时间信息:更新后,代理会就这些工具再询问一次。
218
219
  - **保持输入框焦点** 只在发送 `/` 命令或技能后才会把焦点还给输入框。dsh 解析命令时,输入框会有几毫秒处于只读状态,因此这段时间内按下的键会丢失。如果 dsh 的 `/` 菜单仍然打开,`Enter` 会选择高亮的行,而不会发送。
219
220
  - **问题卡片适应窗口** 只改变 dsh 的问题卡片,不改变计划审阅卡片。它通过 dsh 的标记(`data-question-key`、`data-question-scroll`)找到卡片;如果 dsh 更新改变了这些标记,卡片会按 dsh 自己的样子显示。卡片高度跟随窗口,而不是对话:在较窄侧边面板中的对话里,较高的卡片仍可能超出对话上方。
@@ -227,7 +228,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
227
228
  - **本对话** 只统计 dsh 的文件工具(`write`、`edit`、`str_replace_editor`)写入的文件。命令(`bash`)更改的文件不在这个视图中;它们显示在 **未提交** 下。如果没有该对话的回合回退快照(回合回退已关闭、安装了 dsh-rewind-plugin,或对话比插件更早),视图会与最后一次提交比较,并给出提示。回合回退为每个对话保留最新的 50 个快照:在更长的对话中,视图与保留的最早快照比较,说明从哪条消息开始,并且不计入更早的改动。**隐藏空白改动** 就是 `git diff -w`:只在行内空格上有变化的行也会被隐藏。
228
229
  - **创建 GitHub issue** 需要 dsh 的 PATH 中有 GitHub CLI(`gh`),并且对话的文件夹中有 GitHub 远程仓库。它最多运行 60 秒;如果 `gh` 用时更长,issue 可能已经在 GitHub 上创建,但列表中没有它的链接(再次点击之前,请先到 GitHub 上查看:列表只从已完成的运行中读取链接,所以再次点击可能会创建第二个 issue)。有多个 GitHub 远程仓库的文件夹使用 `gh` 自己的默认仓库(`gh repo set-default`)。
229
230
  - **改动此文件的对话** 与 **本对话** 一样,只识别 dsh 的文件工具(`write`、`edit`、`str_replace_editor`):命令(`bash`)做出的改动不会列出。它读取该仓库最新的 300 个对话(按创建时间),对话更多时会给出提示;它最多显示 100 行。重命名的文件按工具写入时的名称列出。文件夹在仓库之外的对话(包括通过另一条路径指向相同文件的情况)不计入。dsh 启动后第一次打开时,会读取该仓库的所有对话日志(275 个对话约需 4 秒);之后再打开时,只读取此后有变化的对话。
230
- - **对话行显示 Git 分支** 显示的是对话最后一轮开始或结束时其文件夹所在的分支,而不是当前的分支:在回合之外切换分支,要到下一轮之后才会显示。此版本之前的对话,在下一轮之前不显示标签。标签放在 dsh 的对话行标记中(dsh 在那里没有插槽);如果 dsh 更新改变了这部分标记,就不会显示标签。当对话上方的项目行与分支同名时(例如“每个对话一个分支”的文件夹),该对话行不显示分支标签,但“列表视图”中仍会显示。
231
+ - **对话行显示 Git 分支** 显示的是对话最后一轮开始或结束时其文件夹所在的分支,而不是当前的分支:在回合之外切换分支,要到下一轮之后才会显示。此版本之前的对话,在下一轮之前不显示标签。标签放在 dsh 的对话行标记中(dsh 在那里没有插槽);如果 dsh 更新改变了这部分标记,就不会显示标签。标签只在“单列表”中显示。
231
232
  - **每个对话一个分支** 在计划模式下:dsh 把 `/plan <消息>` 作为命令而不是消息发送,因此 Composer Plus 会在 dsh 的输入框中接管该命令的提交(不是公开 API)。如果 dsh 更新改变了这一点,选择 **新分支** 时的 `/plan <消息>` 会在已打开的新对话中作为 dsh 自己的命令运行。当 Host 无法在新对话中开启计划模式时,分支文件夹会保留,消息不会发送,因此新对话不会在默认模式下修改文件。
232
233
  - **每个对话一个分支**:当对话的分支文件夹(`<project>/.worktrees/<name>`)被删除时(例如对话自己的智能体移除了 worktree 并删除了分支),对话的下一步会把对话移出该文件夹。它的分支文件夹项目会从侧边栏消失,对话显示在“未分组”下并保持打开。在 dsh 0.2.1 及更高版本中,对话在主项目文件夹中继续,模型会收到一条关于新文件夹的说明。在 dsh 0.2.0 上,对话保留已删除的文件夹:在那里运行的命令会失败,直到你开始一个新对话。没有对话使用的已删除分支的项目也会从侧边栏消失:Composer Plus 在启动时和每 30 秒检查一次分支文件夹,不需要任何侧边栏筛选。对话移动期间,同一仓库中的**新分支**会回答“请重试”。关闭开关后,dsh 自己的错误会再次出现(“working-directory: directory does not exist”)。
233
234
  - **工作区树中的分支** 会在无需点击的情况下写入 git:移动对话时,它把项目文件夹切回原来的分支(`git switch`),并添加一个 worktree(`git worktree add`)。它从不删除分支、worktree 或文件。dsh 不能更改对话的文件夹,所以被移动的对话是一个副本(dsh 自己的分叉,带有新的 id),旧对话会被归档。副本会继续已停止的任务;分支出现时正在运行的工具调用会以拒绝结束,智能体会在新文件夹中再次运行它。旧对话的目标不会随之移动。只有文件夹是仓库主文件夹的对话会移动,而且只针对它在该轮中创建并切换到的分支(`git switch -c`、`git checkout -b`):只用 `git branch` 创建的分支、有未提交改动的文件夹、链接的 worktree 或子文件夹都不会移动。只有直接位于 `<project>/.worktrees/` 中且有分支的 worktree 会显示在树中;分离的 worktree 或位于其他位置的 worktree 不会显示。只有当原对话是正在打开的对话时,副本才会自动打开(插件通过 dsh 的侧边栏行判断);否则它在分支项目中。
@@ -248,7 +249,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
248
249
  - **在新对话中继续** 会把对话(消息、工具调用以及每个工具结果的末尾,最多约 60,000 个字符,最新的部分)发送给对话自己的模型。交接说明可能漏掉某个决定或文件:开始前请先阅读。新对话只知道这份交接说明和链接的对话(dsh 会把旧对话作为只读上下文附加进来);它的模型上下文从很小开始,旧对话保持不变。每个对话同一时间只能进行一次写说明或开始操作。
249
250
  - **上下文明细** 按 dsh 自己的规则显示估算值(每个 token 约 4 个字符),与 dsh 的上下文环使用相同的规则;模型自己的计数可能不同。工具定义取自最新的一次请求。它按对话日志中的样子显示上下文;正在运行的回合会在它的下一步之后出现。
250
251
  - **计划步骤** 只有在模型确实做了计划时才会节省令牌:开启后,每个请求都会带上 `plan_next_steps` 工具和一段简短说明(约 500 个令牌),即使在模型从不做计划的对话中也是如此。条件只证明它所写的内容(例如:构建的退出码为 0),并不证明工作正确。`ok` 读取 dsh 自己的结果标记(`[exit code: N]`、超时、沙箱拒绝);一个失败但退出码不为非零的命令会被视为通过。步骤一次只运行一个;同时就绪的两个步骤会交回给模型。该步骤的消息会作为对话模型的助手消息保存(dsh 没有标记插件所写消息的方式),因此它的文字会说明是 Composer Plus 运行的。Tether 中没有此功能。
251
- - **任务看板** 只认识 dsh 的项目:不在项目中的对话显示**所有项目**,“每个对话一个分支”的文件夹(`<项目>/.worktrees/<名称>`)算作它所属的项目。项目 ID(`acme#12`)来自文件夹名,在 dsh 中重命名项目后保持不变。“保持看板最新”的规则只会加入其项目有未完成任务的对话;已获得该规则的对话会一直保留它。智能体被告知把**已完成**、**积压**和人工任务留给你,但工具不会拒绝:智能体仍可能移动这些卡片。功能开启时,看板工具会出现在每个对话的工具列表中(每次请求约 1,000 个令牌);如果不用看板,请关闭它。页面显示时每 2 秒读取一次看板;智能体的修改会在这段时间内显示。你编辑的文本如果被智能体同时修改,则不会保存:面板会显示新文本和原因。不支持图片、不支持在多台电脑之间通过 git 同步、也不支持网络共享(Kanzo 有这些功能)。创意和外观来自 emanuele-em 的 [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0);Composer Plus 没有使用它的任何代码。
252
+ - **任务看板** 显示 dsh 在此窗口中列出的对话:不在项目中的对话只显示在**所有项目**中,“每个对话一个分支”的文件夹(`<project>/.worktrees/<name>`)算作它所属的项目。卡片所在的列就是对话的实时状态,因此卡片不能拖动:对话的回合结束时(包括出错或停止之后)会移到**已完成**,再次运行时会回到**进行中**。绿色圆点是 dsh 自己的完成圆点,dsh 只在此窗口中保留它:重新加载后,已完成的对话不再显示圆点。**已完成** 显示最新的 50 个对话(**显示更早的 N 个** 显示其余对话)。标签来自每个已开始任务的一次模型调用:它们可能不准确,不是在看板上开始的对话没有标签。标题是 dsh 自己的对话标题(由 dsh 的标题服务使用对话的模型生成);标题出现前,卡片显示提示的第一行。以 dsh 认识的 `/` 命令(`/plan`、`/goal`)开头的提示会作为该命令运行。**回答** 只回答对话最新的请求:如果对话已在别处(另一个窗口、Tether、Auto Review)回答了它,或提出了新的问题,面板会说明这一点,并且不发送任何内容。早期版本有带评论和智能体工具的任务列表;它们已被移除,旧的 `board.json` 不会显示。创意和外观来自 emanuele-em 的 [Kanzo](https://github.com/emanuele-em/kanzo)(AGPL-3.0);Composer Plus 没有使用它的任何代码。
252
253
  - **停止后发送的消息优先** 只在你停止对话后生效(或在某一轮失败后,或打开仍有队列的对话时):对话运行时发送的消息仍会排在队列末尾。它只会越过你自己的排队消息:如果队列中有目标轮次或问题回复,仍保持 dsh 自己的顺序。它会读取 dsh 中一个非公开 API 的部分(被停止的那一轮是否仍在结束中);如果 dsh 更新后改了它的名称,消息要等那一轮结束后才会被移到前面。子代理对话保持 dsh 自己的顺序。
253
254
  - **项目记忆** 属于对话的第一个文件夹(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 自己的记忆。
254
255
  - **备份** 只使用一个固定文件夹 `~/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 仍已安装,它就会把 Composer Plus 的归档计入自己的保留份数,并可能删除它们。
@@ -285,7 +286,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
285
286
 
286
287
  **智能体能像 DS Bot 的记忆那样,在不同对话之间记住我的偏好吗?** 可以,使用 **项目记忆**(默认关闭):在 **设置 → Composer Plus** 中开启。每个回合结束后,你长期的偏好和决定会作为简短笔记保存到该对话的项目中,该项目的每个新对话都会读取。让智能体记住某件事,它会立即保存。要查看或修改笔记,请点同一行的 **打开记忆**,写下要修改的内容。
287
288
 
288
- **我和智能体能像 Kanzo 那样共用一个任务看板吗?** 可以,使用**任务看板**(默认开启):在左侧边栏打开它,用**新建任务**添加任务。在对话中让智能体“从看板领取下一个任务”:它会把卡片移到**进行中**,评论所做的工作,然后移到**审核**。把任务标记为**人工**即可留给自己。
289
+ **我能把所有对话看成一个看板,并从中开始新对话吗?** 可以,使用**任务看板**(默认开启):在左侧边栏打开它。每个对话都是一张卡片,位于**进行中**、**审核**(等待你处理)或**已完成**中。**新建任务**只需输入提示,并用它开始一个新对话;在橙色卡片上点击**回答**,无需打开对话即可回答。
289
290
 
290
291
  **dsh 能像 dsh-backup 那样备份我的对话和设置吗?** 可以:**设置 → Composer Plus → 备份 → 立即备份**。它把相同格式的归档写入同一个文件夹(`~/Desktop/dsh-backups`),因此 dsh-backup 的归档也会显示并可以恢复,你可以卸载 dsh-backup。打开 **自动备份** 即可按计划备份。
291
292
 
@@ -407,7 +408,7 @@ PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh
407
408
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
408
409
  # Edit queued message in place with images and files (slow fake model) + its thumbnail
409
410
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
410
- # Task board: the page, the agent tools (fake model), drag and drop, search, the switch
411
+ # Task board: a prompt starts a chat, AI tags, live columns, Answer on the board, Hide finished, the switch
411
412
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-task-board.mjs /path/to/dsh/lib/bin.js
412
413
  ```
413
414
 
Binary file
Binary file