Tình huống
Bạn chưa có session nào đang chạy. Bạn gõ claude agents trong terminal, FleetView mở ra với list rỗng. Bạn muốn dispatch một session mới làm việc trong ~/WORK/some-project.
Làm thế nào để session mới đó có cwd = ~/WORK/some-project?
Câu trả lời thường bị nhầm và câu trả lời đúng nằm ở hai chỗ khác nhau. Đi qua từng cái.
Anti-pattern: --cwd flag
Phản xạ đầu tiên là gõ:
claude agents --cwd ~/WORK/some-project
Sai. Đọc help của lệnh:
--cwd <path> Show only background sessions started under <path>
--cwd là filter list view, không phải set cwd cho dispatch. (Flag được thêm vào CC 2.1.141 với mô tả chính thức scope the session list to a directory.) Nếu trong roster chưa có session nào start dưới path đó, FleetView sẽ hiển thị empty (vì filter loại hết), nhưng session bạn dispatch mới sẽ vẫn lấy cwd từ chỗ khác.
Bỏ flag đó. Dùng cách 1 hoặc cách 2 bên dưới.
Cách 1 (recommended): cd trước rồi claude agents
Trong code dispatch của FleetView (binary 2.1.143):
let A = K ?? E_(); // K là cwd argument, E_() là process.cwd()
Nếu dispatch không nhận cwd argument, FleetView lấy process.cwd() của chính nó. Tức là thư mục lúc bạn chạy claude agents.
cd ~/WORK/some-project
claude agents
Sau đó gõ prompt trong UI rồi Enter. Session mới sinh ra sẽ có cwd: ~/WORK/some-project. Có thể verify ngay:
jq '.workers | to_entries[] | select(.value.dispatch.source == "fleet") | {short:.key, cwd:.value.cwd}' \
~/.claude/daemon/roster.json
Workflow này predictable và không phải nhớ cú pháp gì.
Cách 2: @<alias> trong prompt FleetView
Parser prompt của FleetView (hàm on8 trong binary) hỗ trợ cú pháp @<keyword> ngay trong text bạn gõ. Cụ thể logic:
function on8(input, agents, cwdMap, routines) {
// tách @<keyword> ra khỏi input string
// match keyword theo thứ tự ưu tiên:
// 1. tên agent → set agent template
// 2. tên routine → set routine
// 3. key trong cwdMap → set cwd
// còn lại của input là intent prompt
}
Vấn đề: cwdMap không phải là object mà bạn có thể gõ path tùy ý. Nó là một map có sẵn được FleetView khởi tạo từ:
- Agent definitions có field
cwdtrong frontmatter (~/.claude/agents/*.md) - Routines (scheduled agents) có cwd config
- Một số recent / pinned dirs (chưa kiểm chứng đầy đủ)
Tức là @my-project chỉ work nếu trước đó bạn đã định nghĩa một agent hoặc routine với cwd cho project đó. Default không có gì cả.
Khi mở FleetView, gõ @ rồi xem UI có suggest gì không. Nếu UI hiện autocomplete list các keyword với cwd kèm theo, đó chính là cwdMap của bạn. Nếu không suggest gì, map đang rỗng và bạn phải dùng cách 1.
Shell alias để mượt
Nếu bạn thường xuyên mở claude agents cho nhiều project khác nhau, lưu một function vào shell rc:
# ~/.zshrc (hoặc ~/.bashrc)
ccagents() {
if [ -z "$1" ]; then
claude agents
else
cd "$1" && claude agents
fi
}
Dùng:
ccagents ~/WORK/some-project
# hoặc không tham số = dispatch tại cwd hiện tại
ccagents
Với tab completion cho path, gõ rất nhanh. Đây là cách mình recommend cho ai làm việc nhiều project song song.
Verify session đã đúng cwd
Sau khi dispatch, có hai cách kiểm tra:
Trong UI FleetView: cột “cwd” của session sẽ hiển thị path. Nhìn lướt là ra.
Từ terminal khác:
# Liệt kê tất cả worker đang chạy với cwd của chúng
jq '.workers | to_entries[] | {short:.key, cwd:.value.cwd, source:.value.dispatch.source}' \
~/.claude/daemon/roster.json
Hoặc đọc file state của session vừa dispatch:
cat ~/.claude/jobs/<short>/state.json | jq '.cwd, .originCwd'
originCwd ghi nhớ cwd lúc dispatch (không đổi). cwd có thể thay đổi nếu session dùng worktree (sẽ thành path worktree thay vì path gốc).
TL;DR
| Mục đích | Cách làm |
|---|---|
| Dispatch session với cwd cụ thể | cd <folder> && claude agents |
| Quick switch giữa nhiều project | Shell function ccagents <path> |
| Filter list chỉ session start dưới một path | claude agents --cwd <path> (chú ý: filter, không phải set) |
| Dispatch với cwd preset đã định nghĩa | @<alias> trong prompt FleetView (cần agent/routine có cwd field) |
Mặc định luôn cách 1. Hai cách còn lại là cho use-case advanced hoặc nhằm mục đích khác.
Liên quan
Bài này bổ sung cho hai bài khác cùng chủ đề kiến trúc daemon + FleetView + session lifecycle:
- Một vài session không phải là không xuất hiện, mà là xuất hiện trễ. Giải thích vì sao session foreground gõ
claudetrong terminal lại có độ trễ trước khi xuất hiện trongclaude agents(cơ chế orphan adoption của FleetView, filter spare worker). - Background session và worktree: setting
worktree.bgIsolationtừ 2.1.143. Giải thích vì saocwdcó thể khácoriginCwd(đề cập ở phần “Verify” bên trên): khi session bị isolation thành worktree riêng,cwdruntime sẽ là path worktree thay vì path gốc.