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>

--cwdfilter 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.

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 cwd trong 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 đíchCách làm
Dispatch session với cwd cụ thểcd <folder> && claude agents
Quick switch giữa nhiều projectShell function ccagents <path>
Filter list chỉ session start dưới một pathclaude 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: