Nebula: giao diện terminal để chạy nhiều coding agent song song

Cody Seibert đi qua Nebula, TUI anh tự viết để chạy nhiều coding agent song song trong git worktree, xử lý PR, issue và điều hướng bằng hotkey.

Đã duyệt độc lập · cập nhật 18/10/2026 · 18 min

1. Nebula là gì, và vì sao nó ép bạn dùng worktree

Cody mở đầu bằng một buổi walkthrough về Nebula, công cụ mà anh tự viết. Nebula là một TUI (terminal user interface, tức giao diện chạy ngay trong terminal) mà anh dùng cả ở chỗ làm lẫn trên mọi side project của mình. Theo anh, nó giúp anh làm việc năng suất hơn, và nhất là quản lý chuyện chuyển ngữ cảnh (context switch) tốt hơn nhiều so với khi dùng một thứ như VS Code, hay thậm chí Cursor.

Anh nói thẳng mục đích chính của Nebula: ép người dùng phải làm việc bằng git worktree. Anh cho rằng đó là con đường duy nhất để thật sự làm việc năng suất hơn với agentic coding, tức kiểu lập trình mà bạn giao việc cho nhiều coding agent cùng lúc. Mỗi agent làm trong một worktree riêng, một thư mục checkout riêng của cùng một repo, nên các agent không giẫm lên thay đổi của nhau.

Màn hình splash của Nebula với chữ NEBULA và dòng your agents keep running, even when you leave
Màn hình splash của Nebula: dòng chữ "your agents keep running, even when you leave", bên dưới là ba lựa chọn mở project của bạn, mở một thư mục khác hoặc xem help. Thanh trạng thái dưới cùng cho thấy bản đang chạy là v0.40.1 và đã có bản v0.41.0.

2. Cài đặt và mở Nebula từ command line

Trước khi đi vào cách dùng, Cody chỉ chỗ lấy công cụ: vào repo Git của Nebula, ở đó có sẵn một lệnh để cài lên máy. Bạn chỉ cần copy lệnh đó, chạy nó, rồi sau đó gõ nebula trong command line để khởi động ứng dụng. Anh làm luôn trước camera: gõ nebula trong terminal, và màn hình splash hiện ra.

Lệnh cài trong README của repo (tính đến 10/2026, áp dụng cho macOS và Linux) là:

curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/nebula/main/install.sh | sh

Ý tưởng của TUI này, như Cody tóm lại, là để bạn làm việc trên các project của mình và khởi chạy (kick off) nhiều agent đồng thời, mỗi agent làm việc trong một worktree tách biệt.

repo (project) main (root worktree)agent: commit and push worktree Aagent: ý tưởng kẻ địch mới worktree Bagent: làm feature, mở PR
Hình 2.1Mô hình Cody muốn ép người dùng theo: một project có root worktree (thường là main) và nhiều worktree phụ, mỗi worktree có agent riêng nên công việc không đụng nhau.

3. Mở project đầu tiên: root worktree, đổi branch, di chuyển bằng bàn phím

Việc đầu tiên Cody làm là mở project "Survive the Night", một game bắn súng góc nhìn thứ nhất (first person shooter) về zombie mà anh đang dần build bằng Opus. Khi một project được nạp, bạn sẽ thấy một đường kẻ ngang: nó đại diện cho root worktree, trong trường hợp này là branch main. Muốn chuyển root worktree sang một branch khác, bạn bấm C và chọn bất kỳ branch nào bạn đang có. Anh giữ nguyên ở main.

Tiếp theo, anh muốn khởi chạy một session Claude Code. Khi root worktree main đang được chọn, anh chỉ việc click vào nó. Anh nhấn mạnh: mọi thứ trong app này đều click được bằng chuột, nhưng bạn cũng có thể điều hướng hoàn toàn bằng bàn phím:

  • J và K để đi xuống và đi lên.
  • Bấm K hai lần khi đang ở trên cùng sẽ đưa bạn lên thanh project (project bar) ở đỉnh màn hình.
  • Bấm J hai lần sẽ đưa bạn xuống dưới.
  • Phím mũi tên lên và xuống làm đúng việc tương tự.
thanh project: survive-the-night-fps · nebula · agent-office main (root worktree)card sessioncard session worktree phụcard session pane: terminal của sessionđang được chọn J/K lên xuống · KK lên thanh project · JJ xuống
Hình 3.1Bố cục Cody đi qua trong video: các project nằm thành tab ở trên, mỗi worktree là một dải chứa các card session, và bên phải là terminal sống của session đang được chọn.

4. Bảng New session: worktree toggle, model, harness, project

Khi đã chọn root worktree, bạn bấm P để tạo một session mới. Đây là bảng session chính, nơi bạn gõ việc muốn agent làm, chẳng hạn sửa một bug hay làm thêm một phần việc nào đó.

Điều quan trọng nhất Cody muốn chỉ ra là công tắc new worktree. Nếu công tắc này bật, prompt bạn gõ ở đây sẽ được chạy trong một worktree mới tạo trên máy local. Nếu tắt, nó sẽ chạy ngay trong thứ bạn đang chọn ở bên trái. Trong trường hợp của anh, trên main đang có một loạt thay đổi mà anh muốn commit và push, nên anh gõ:

commit and push

Trên cùng một bảng, bạn đổi được mọi thông số của lần chạy này:

  • Ctrl+O để đổi model: Opus, Fable, Sonnet, hay model nào khác.
  • Tab để đổi harness, tức CLI agent sẽ chạy. Cody đọc danh sách: Claude, Codex, Cursor, Pi, Muse, Grok Build, OpenCode. Anh nghĩ còn một cái nữa vừa được thêm vào qua một pull request.
  • Ctrl+T để đổi worktree: nếu bạn đã có sẵn nhiều worktree, bạn có thể chuyển sang bất kỳ cái nào.
  • Và tất nhiên đổi được cả project. Anh thấy điều này hữu ích: khi đang làm project này mà chợt nảy ra một ý tưởng cho project khác, bạn khởi chạy nó ngay từ đây.

Với lệnh commit and push, anh không muốn nó chạy trong worktree mới, vì chính main đang có 42 file thay đổi cần được commit.

Bảng New session của Nebula với dòng project, worktree, harness claude, model opus xhigh và công tắc new worktree
Bảng New session: dòng trên ghi project survive-the-night-fps ^P, worktree ^T, harness claude Tab, model opus xhigh ^O; góc phải là công tắc [✓] new worktree ^N. Phía sau, card "Commit And Push Changes" đang chạy trên main, và pane bên phải cho thấy Claude Code với Opus 5.5 ở mức effort xhigh.

5. Mỗi worktree một Git diff riêng

Từ 42 file thay đổi đó, Cody chuyển sang tính năng kế tiếp: mỗi worktree đều có Git diff riêng để bạn xem. Bấm G là mở trình xem diff. Bạn cuộn qua tất cả các file, và lọc được: chẳng hạn muốn xem game.js, bạn chỉ cần gõ game.js. Bạn click qua lại giữa các file, và bấm Backspace để quay lại.

Bạn cũng có thể đi qua từng file một để review. Ctrl+R đánh dấu một file là đã review. Nếu muốn duyệt hết các file theo kiểu cây thư mục trong lúc review, bạn chuyển sang tree view cũng được. Theo Cody, nó giống hệt một Git diff bình thường, chỉ khác là bạn không phải mở một IDE hay bất cứ thứ gì khác. Xem xong, anh thoát ra.

Trình xem diff của Nebula: danh sách file đã lọc theo chữ game bên trái, diff của server/game.js bên phải
Trình xem diff: ô lọc đã gõ "game" nên danh sách còn 3 trong 42 file (server/game.js, client/game/game.js, client/game/entities.js); bên phải là diff của server/game.js. Dưới cùng là gợi ý ^t: tree và ^r: toggle reviewed.

6. Nhiều worktree, nhiều session chạy song song

Tiếp theo, Cody minh họa một kiểu việc rất hay gặp: khởi chạy việc mới trong một worktree mới. Anh bấm Ctrl+N để bật new worktree, vì anh muốn thử thêm một feature mới cho game zombie và muốn nó nằm ở worktree riêng. Lý do: anh làm theo workflow tạo pull request, để sau đó có thể cho review rồi merge vào. Prompt anh gõ:

Help me ideate of a new enemy or a new item we can add into this game.

Khi công tắc new worktree đang bật, bạn sẽ thấy worktree mới hiện ra bên dưới, và bạn chuyển qua lại giữa chúng được. Bạn có thể cứ thế tạo tiếp worktree mới: anh gõ "hi" cho một cái, tạo thêm một cái nữa với "hello", và giờ có cả một loạt worktree.

Bên trong mỗi worktree, bạn lại khởi chạy được nhiều session mới. Anh gõ "hi" thêm vài lần trong cùng một worktree, và có bốn card session cùng làm việc trên branch main. Anh cũng đi xuống worktree calm-sparrow-prowls (Nebula tự đặt tên worktree bằng ba từ ngẫu nhiên kiểu này) và khởi chạy thêm một session ở đó.

Khi có quá nhiều session, chuyện xảy ra với Cody khá thường xuyên, có lúc tám hay mười session, anh bấm Tab để thu gọn (collapse) tất cả, rồi lần lượt duyệt qua chúng.

Nhiều worktree với các card session, bên phải là câu trả lời của agent về các kẻ địch và vật phẩm mới
Một project với nhiều worktree cùng lúc: nimble-sparrow-leaps chạy session "Ideate New Enemy Item", calm-sparrow-prowls có hai session, electric-panda-sails một session. Bên phải, agent đề xuất các kẻ địch mới (The Shade, The Screamer, The Mimic) và vật phẩm (Snare Trap...).

7. Terminal ngay trong worktree, và từ ý tưởng tới pull request

Một thứ bạn thường xuyên cần khi làm agentic development là một terminal. Bấm T trong bất kỳ worktree nào là có terminal cho worktree đó. Ví dụ, muốn chạy thử worktree này, Cody bấm T rồi gõ npm run dev. Thế là worktree đó chạy ngay trong terminal kia; hoặc bạn dùng terminal đó cho bất cứ lệnh nào bạn vẫn thường chạy. Bấm Ctrl+Q để thoát ra khỏi terminal, rồi xóa nó bằng D và Enter. Đó cũng là cách xóa session và xóa terminal nói chung.

Card terminal term-1 với nhãn shell trong worktree nimble-sparrow-leaps, pane bên phải đang khởi động
Sau khi bấm T: worktree nimble-sparrow-leaps có thêm card term-1 (shell), terminal là một card rộng gấp đôi. Pane bên phải đang "starting session…"; thanh trạng thái ghi phím để quay lại card.

Quay lại câu trả lời của agent: có vài ý tưởng về zombie. Một con tên là The Shade, về cơ bản sẽ đứng đơ lại khi bạn rọi đèn pin hay một chùm sáng vào nó. Cody copy nguyên đoạn đó, tạo một worktree mới, dán vào và thêm một câu:

implement this make a PR when done

Một lần nữa, anh khởi chạy việc này trong worktree mới. Anh chỉ ra cách nhận biết cái gì đang chạy: dòng chữ chuyển động (animated text) trên card. Lúc này có quá nhiều worktree, nên anh đi xóa bớt: xóa từng worktree, xóa cả loạt session "hi", "hello" không còn cần nữa. Session commit and push cũng đã xong, nên anh đóng nó và xóa luôn worktree đó.

8. Dọn dẹp, list view, delete empty worktrees và nhảy giữa các project

Nebula có một số settings. Cody kể đã nhận được feedback rằng nhiều người không thích giao diện dạng card. Nếu bạn cũng vậy, bạn đổi card sang list view; như vậy dễ nhìn hơn vì mỗi dòng hiện ít thông tin hơn.

Ngoài ra, trong mục Sessions của settings có tùy chọn xóa worktree rỗng (trên màn hình settings ghi "Delete emptied worktree"). Khi bật, nếu bạn tạo một worktree mới, gõ "hi", rồi xóa session vừa tạo, thì worktree đó cũng phải bị xóa theo. Anh thử và thấy có vẻ có bug ở đây.

Để sửa, anh mở chính project Nebula bằng dấu gạch chéo: gõ / (phím có dấu hỏi chấm), gõ nebula, Enter, và bạn được đưa thẳng tới project đó. Anh lưu ý thêm: mọi session đang chạy đều có hiệu ứng chuyển động và nằm ở đầu danh sách "Jump to" này, nên anh có thể quay lại ngay session vừa nãy, hoặc sang project Nebula.

Anh vẫn thích card hơn, nên bật lại card. Anh xác nhận tùy chọn delete empty worktrees có vẻ không hoạt động thật, rồi quay sang project Nebula, vào ngay main, và gõ prompt:

It seems like when I have the delete empty work tree set to true it doesn't actually delete it from Nebula when I remove the last terminal or session that's part of that work tree. Please fix this.

Anh giải thích thói quen của mình: với side project, anh thường làm thẳng trên branch main, còn mọi thứ ở chỗ làm thì khác. Để chuyển giữa các project, anh bấm [ và ]. Anh quay lại Survive the Night; nếu muốn xóa cái worktree kia thì làm ở đây. Anh không hiểu vì sao project này bị chuyển sang một branch khác, nên đổi lại về main.

9. Danh sách pull request: merge, review, mở trên trình duyệt

Đến đây, Cody hy vọng người xem đã hiểu cách mọi thứ vận hành, nhưng Nebula còn nhiều tính năng nữa. Muốn xem các pull request đang mở của project, bạn bấm V. Lúc này có hai pull request: "Add car alarm zombie ambush" và "Add zombie dog packs that den in the forest".

Danh sách pull request của survive-the-night-fps với hai PR số 27 và 26, bên phải là chi tiết PR 27
Bấm V: danh sách "Pull requests - survive-the-night-fps (2)" với #27 "Add car alarm zombie ambush" và #26 "Add zombie dog packs that den in the forest". Bên phải là chi tiết PR #27: ready for review, +64 -0, 3 file, chưa có mô tả.

Anh chọn PR chó zombie, bấm Enter và gõ "merge this". Việc này sẽ tạo một worktree, đưa pull request đó vào merge. Nếu có conflict, agent sẽ sửa rồi merge.

Anh có thể làm y hệt với PR car alarm, nhưng lần này anh muốn mở nó ra xem trước. Anh chọn "open in browser" để xem có gì thật sự trong đó, rồi quyết định cho review. Bấm Enter trên PR và gõ:

please do a review on this and make sure that the code seems accurate and if it's good merge it if not fix the issues and then merge it

Anh khởi chạy việc này. Quay lại xem thì PR này đang có conflict. Muốn xem chính pull request đó, anh bấm Shift+V để mở nó thẳng trên trình duyệt. Nếu session gắn với một GitHub issue, Shift+I sẽ mở issue đó.

Có vẻ PR chó zombie đã merge xong, nên anh xóa luôn worktree đó. Một session khác báo mất kết nối, anh gõ "continue" để nó chạy tiếp.

Session Merge Zombie Dogs PR báo PR 26 đã được squash merge vào main
Session "Merge Zombie Dogs PR" chạy gh pr merge 26 --squash và báo PR #26 đã merge vào main dưới dạng một squash commit, không có conflict; repo chưa cấu hình CI check. Bên trái, worktree feature/car-alarm-zombie-spawn hiện nhãn "conflicts" cho PR #27 cùng session "Review Car Alarm PR".

10. Từ GitHub issue tới một worktree đang làm việc

Cody xem lại danh sách ý tưởng để chọn thêm thứ để làm, và chọn cái nỏ (crossbow), nghe khá hay. Anh xóa ô nhập, dán đoạn mô tả vào và gõ "please add the crossbow, make a pull request when you're done", rồi khởi chạy. Giờ có ba worktree đang làm việc: một số đang sửa conflict trên một pull request, số khác lát nữa sẽ tạo pull request.

Ở chỗ làm, nhóm của anh làm việc rất nhiều với GitHub issue. Bấm I sẽ nạp bảng issue; lúc này project chưa có issue nào. Nên anh tạo một cái: bấm Shift+G để mở thẳng repo trên trình duyệt, vào mục Issues, tạo issue mới tên "tin can of tuna" với nội dung đại ý "thêm một món ăn là cá ngừ mà người chơi có thể ăn".

Quay lại Nebula, bấm I, và sau một giây issue đó hiện ra. Để triển khai nó, anh bấm Enter, bật new worktree và gõ:

Please implement this issue and make a pull request when you're done.

Khởi chạy xong, giờ có bốn luồng việc (anh gọi là bốn pull request) cùng chạy đồng thời trên môi trường local của anh.

GitHub issuebấm I Enterviết prompt worktree mớiCtrl+N agent làm việcsong song pull requestV để xem tên worktree theo issue, ví dụ issue-28-tin-can-of-tuna
Hình 10.1Luồng Cody vừa làm: issue trên GitHub hiện trong Nebula, một phím để giao cho agent trong worktree mới, kết quả quay lại dưới dạng pull request.

11. Session chạy trên Claude Cloud, và dùng Nebula để sửa chính Nebula

Đôi khi bạn muốn khởi chạy một session trên cloud, ở một remote session. Cody mở Ctrl+O, chọn chế độ Claude Cloud, bấm Enter và hỏi một câu thật nhanh: "What is the purpose of this game?". Việc này sẽ nạp và chạy một instance Claude trên cloud. Anh thừa nhận chưa thử tính năng này nhiều, vì chủ yếu anh vẫn làm local. Nhưng bạn có thể click vào nó để đi thẳng tới session Claude Code trên cloud; ở đó agent có quyền truy cập game của bạn, có thể chạy nó, v.v. Anh không dùng nhiều, nhưng đây cũng là một lựa chọn.

Bảng New session với menu Claude model đang chọn Claude cloud, bên phải ghi This session runs in Claude Cloud
Menu "Claude model" trong bảng New session có các mục default, fable, Claude · cloud, sonnet, haiku. Phía sau, card "Game purpose" đã chạy ở chế độ cloud, và pane bên phải ghi "This session runs in Claude Cloud": agent làm việc trong một cloud sandbox, kết quả nằm trên trang của session.

Nếu muốn chạy agent theo cách đó, bạn cũng có thể bấm Tab để vào cloud mode. Thật ra trước đây Nebula có hiện dòng nhắc rằng bạn bấm Tab được, nhưng giờ dòng đó đã biến mất. Thế là Cody làm đúng việc mà công cụ được thiết kế cho: chụp màn hình, quay lại Nebula, mở một prompt mới, dán ảnh vào và viết (ý nguyên văn): trước đây có một nhãn ghi "press tab to go to cloud mode" cho Claude, giờ có vẻ nó bị xóa hoặc bị ẩn; hãy thêm lại nó vào modal chọn model khi đang chọn Claude. Anh chạy việc này thẳng trên main để khỏi phải đi qua cả quy trình pull request.

Anh xóa thêm vài session. Session sửa lỗi delete empty worktree đã xong nên chuyển sang màu xanh dương, và có vẻ nó đã sửa được.

Session Fix Empty Worktree Delete báo đã sửa và giải thích nguyên nhân
Kết quả session "Fix Empty Worktree Delete" trong project Nebula: agent báo đã sửa (khi bật Delete emptied worktree, xóa session cuối sẽ xóa luôn worktree), giải thích nguyên nhân, cập nhật docs/configuration.md và docs/sessions.md, thêm ba test mới, và nhắc rằng cần make install rồi khởi động lại TUI mới thấy bản sửa. Bên trái là card "Restore Cloud Mode Hint" với ảnh chụp màn hình đính kèm.

12. Archive và workflow hằng ngày của Cody

Những session đã xong mà bạn vẫn muốn giữ lại, Cody archive chúng: bấm A để archive, session sẽ vào archive list. Shift+A mở archive list, khi bạn muốn xem nhanh mọi thứ đã archive.

Nhưng ý chính, anh nhắc lại, là chuyển thật nhanh giữa các project. Thường anh chỉ để hai hay ba project ở dạng tab hoặc ghim cùng lúc và làm song song cả ba, rồi khởi chạy một loạt session đồng thời. Thông thường mỗi worktree có một session. Đôi khi anh quay lại với một agent khác, ví dụ Codex, và bảo nó làm một adversarial review (review theo kiểu cố tìm lỗi) trên các thay đổi đó. Khi đó Codex chạy với một model cụ thể để kiểm chứng rằng thay đổi thật sự tốt. Trong video anh không chạy thật bước này, chỉ minh họa cách làm.

Còn khi muốn thử nghiệm các worktree khác nhau, bạn lại bấm T và chạy bất cứ thứ gì, npm run dev hay npm install, cho nó chạy local, mở ra kiểm tra, xong thì quay lại worktree. Đó về cơ bản là workflow của anh. Ngay trong đoạn video ngắn này, anh đã có bốn năm feature đang được thêm vào các project khác nhau.

2-3 projecttab hoặc ghim mỗi worktreemột session agent khác reviewví dụ Codex, adversarial T: chạy thửnpm run dev / install xong thì A để archive, Shift+A xem lại
Hình 12.1Vòng làm việc Cody mô tả: vài project song song, mỗi worktree một agent, một agent khác review, tự chạy thử trong terminal của worktree, rồi archive.

13. Khi agent cần bạn trả lời

Đôi khi một project cần bạn nhập thêm thông tin. Để minh họa, Cody sang một project khác tên "agent office" và gõ prompt "ask me a question using the ask question tool" (hỏi tôi một câu bằng công cụ hỏi câu hỏi). Trong lúc chờ, anh dọn nhanh mấy session merge đã xong, và tắt bớt các terminal.

Lúc này agent đang hỏi anh có muốn làm việc này việc kia không. Anh giải thích: khi bạn làm trên nhiều project, đôi khi ở plan mode, hoặc khi Opus bối rối và cần làm rõ một điều gì đó, session sẽ đổi trạng thái và nhảy lên trên cùng. Trong danh sách "Jump to" nó cũng nằm ở đầu, kèm dấu cho biết nó cần feedback của bạn. Bạn chỉ cần mở Jump to, Enter là tới ngay. Anh trả lời đại một câu kiểu "sửa một bug", rồi hủy và xóa session đó.

Đó về cơ bản là cách mọi thứ vận hành. Anh nhận ra rằng nếu thật sự học thuộc các hotkey và phím tắt này, bạn sẽ di chuyển cực kỳ hiệu quả: khởi chạy agent, làm trên nhiều project khác nhau cùng một lúc.

Jump to cần feedback: agent đang hỏi bạn đang chạy (chữ chuyển động) đã xong, chưa xem
Hình 13.1Cách Cody dùng danh sách Jump to: session đang cần bạn trả lời nằm trên cùng, rồi tới các session đang chạy, nên một lần mở và Enter là tới đúng chỗ.

14. Bộ nhớ: mỗi session tốn bao nhiêu, và idle sau năm phút

Cody chuyển sang vài tính năng anh ít dùng hơn. Shift+M cho xem tất cả các session đang tốn bao nhiêu bộ nhớ. Theo anh, mỗi session Claude Code tốn khoảng 300 đến 400 megabyte, nên càng nhiều session thì càng ăn dần bộ nhớ của máy. Ở góc dưới bên phải, con số tổng lúc đó khoảng bốn gigabyte.

Bảng Memory của Nebula liệt kê từng session cùng PID, số process và dung lượng bộ nhớ
Bảng Memory (Shift+M): 6 session claude tốn 2.0 GB, 6 agent dự phòng khởi động sẵn (warm spares) 1.5 GB, bản thân Nebula 21 MB, tổng 3.6 GB. Từng session như "Add Tin Can Tuna" hay "Review Car Alarm PR" tốn khoảng 240 đến 395 MB.

Nhưng các session này tự hết hạn sau một khoảng thời gian. Trong settings, mục Sessions (anh nghĩ là ở đó), bạn sẽ thấy: sau năm phút, nếu agent không chạy hay không đang làm gì, Nebula sẽ cho session Claude đó vào trạng thái idle (trên màn hình settings là "Idle session timeout [5m]"). Lần sau bạn click vào, bạn sẽ thấy card màu xám, nghĩa là session đã bị timeout, và click vào thì cần một chút thời gian để nạp lại.

Anh tự nhận ví dụ vừa chọn không hay, vì đó là một instance chạy trên cloud. Nhưng các session khác thì sẽ timeout, chuyển sang idle, và khi bạn click vào thì nó được làm mới để bạn xem lại được phần scrollback. Lý do của cơ chế này: bạn không muốn Nebula ăn hết bộ nhớ máy, nên nhóm làm Nebula cho những thứ bạn đã lâu không đụng tới vào trạng thái idle.

15. Tìm file, grep cả project, tree browser

Vài tính năng hữu ích khác mà Cody cũng ít dùng. F để tìm file. Ví dụ muốn sửa file music JS, bạn tìm nó, và file được mở thẳng trong Vim. Bạn page down, page up, tìm kiếm như bình thường (anh thử tìm một từ trong file); nó đơn giản là Vim. Muốn thoát ra, bấm Ctrl+Q.

File client/audio/music.js mở trong Vim bên trong Nebula
Bấm F rồi chọn client/audio/music.js: file mở trong Vim ngay trong Nebula (558 dòng, mô tả nhạc nền kinh dị được sinh tự động). Dòng dưới cùng nhắc Ctrl+Q: force close.

Shift+F là grep toàn bộ project trên worktree đang được chọn, để tìm một thứ gì đó. Anh nói lại rằng giờ anh không còn nhìn code nhiều, cũng không cần mở file nhiều nữa, nhưng có sẵn những công cụ đó ngay trong code base để mở nhanh một file nào đó vẫn thật sự hữu ích.

Còn B mở tree browser (B là tree browser). Anh duyệt qua cây thư mục để tìm, hoặc gõ tên, ví dụ input.js, để đi thẳng tới đó và cuộn xem. Anh tưởng không sửa được ở đây, nhưng rồi nhận ra: bấm Enter là vào chế độ sửa, sau đó bấm Escape để thoát chế độ đó và Ctrl+Q để ra hẳn.

16. Thiết kế lại UX, comment và diff pull request của người khác

Đó là phần lớn các tính năng Nebula có ở thời điểm quay video. Cody cho biết anh đã đại tu toàn bộ trải nghiệm người dùng so với lúc mới làm. Nếu bạn từng xem video cũ của anh về công cụ này, có đủ loại flow chart, project, workspace, worktree và session, thì giờ anh đã cắt bớt (pare back) khá nhiều, vì như vậy là quá nhiều. Phần lớn thời gian, thứ bạn cần chính là những gì đang thấy: chuyển nhanh giữa các project, nhảy tới bất cứ thứ gì có thể đã xong. Ví dụ, PR car alarm vừa được merge xong, anh không cần giữ nó nữa nên xóa đi. Đó là cách anh đang làm việc.

Bạn cũng có thể comment thẳng lên pull request. Anh sang project agent office, nơi có một loạt pull request. Anh tin là có cách comment ngay trên đó nhưng không nhớ tổ hợp phím, vì nó không hiện ở thanh gợi ý bên dưới. Anh đoán có lẽ là ở phần issue, và đúng là ở phần issue có thể để comment. Anh thử Ctrl+O thì nó chỉ đưa anh sang GitHub (dưới cùng màn hình issue có ghi ^c: comment và ^o: b…). Anh thừa nhận còn vài thứ đang làm dở: với GitHub issue và pull request, anh vẫn đang tìm trải nghiệm tốt nhất.

Nhưng ý chính là: khi bạn làm một repo open source và mọi người gửi pull request, bạn muốn lướt qua chúng thật nhanh, có lẽ chỉ đọc qua mục đích của từng cái. Bạn cũng bấm được để xem diff của pull request đó; anh nghĩ là Ctrl+G. Màn hình hiện diff pull request của người kia. Nếu muốn review code của họ ngay tại đây mà không phải lên GitHub, bạn cũng làm được, và anh thấy điều đó khá tiện.

Diff của một pull request trong project agent-office, cây file thay đổi bên trái và diff README bên phải
Diff của pull request #222 trong project agent-office, xem ngay trong Nebula: bên trái là cây 19 file thay đổi, bên phải là diff của README.md thêm một dòng vào bảng phím tắt của game.

17. Agent factory nhưng vẫn có con người trong vòng lặp

Cody chốt lại chỗ tăng năng suất thật sự: nạp issue thật nhanh, khởi chạy một prompt trong một worktree để làm việc trong worktree đó và giải quyết issue. Thường bạn sẽ có một skill file hoặc một CLAUDE.md quy định rằng việc phải làm trong một pull request. Khi xong, agent tạo pull request, có thể chạy một adversarial review, rồi có một agent khác có thể lo phần phân loại (triage), tự sửa conflict và merge pull request của bạn.

Theo anh, đó là cách bạn có được kiểu "agent factory" trong coding mà mọi người hay nói tới, trong khi vẫn là con người trong vòng lặp (human in the loop). Bạn vẫn cần quyết định issue nào hữu ích. Những issue trong project agent office là do người lạ mở trên project của anh, các pull request cũng vậy. Anh có muốn merge hết không? Có lẽ là không. Nhưng anh vẫn muốn là người trong vòng lặp, quyết định cái nào lấy và cái nào không.

con ngườichọn issue agent trong worktreetheo skill / CLAUDE.md pull requestadversarial review agent triagesửa conflict mergecon người quyết lấy hay bỏ
Hình 17.1Chuỗi Cody mô tả: agent tự làm phần lớn các bước, nhưng con người đứng ở đầu (chọn issue nào đáng làm) và ở cuối (quyết định pull request nào được nhận).

18. Full screen, thoát terminal và lời kết: học thuộc hotkey

Cody nghĩ bạn cũng có thể cho terminal chiếm toàn màn hình. Anh nghĩ là Ctrl+F, và đúng vậy: Ctrl+F để full screen. Khi đang duyệt qua các session và click vào một cái, anh bật full screen, rồi quay lại, quay lại lần nữa.

Để thoát khỏi terminal, bạn cũng có thể dùng Ctrl kèm phím dấu ngã/dấu huyền (phím ~). Một cách khác là Ctrl+Q, hoặc đơn giản là click chuột. Muốn dùng chuột thì cũng hoàn toàn được.

Anh tóm lại những phím tắt anh dùng hằng ngày: nhảy qua lại giữa các project, điều hướng nhanh trong một project, mở một project mới, khởi chạy một prompt, tạo worktree, đổi model, v.v.

PhímViệc
J / Kxuống / lên; bấm hai lần để tới thanh project hoặc xuống dưới
Psession mới; trong bảng: Ctrl+N worktree mới, Ctrl+O model, Tab harness, Ctrl+T worktree
Cđổi branch của root worktree
GGit diff của worktree; Ctrl+R đánh dấu đã review
T / Dmở terminal / xóa session hoặc terminal
/ và [ ]Jump to bất cứ đâu / chuyển project
V, Shift+Vdanh sách pull request / mở PR trên trình duyệt
I, Shift+I, Shift+Gdanh sách issue / mở issue / mở repo trên trình duyệt
A, Shift+Aarchive / xem archive list
Shift+Mbộ nhớ của các session
F, Shift+F, Btìm file (mở trong Vim) / grep cả project / tree browser
Ctrl+F, Ctrl+Qfull screen / thoát ra

Lời khuyên cuối của anh: giỏi các hotkey là bạn sẽ trở nên rất, rất năng suất. Anh chúc mọi người một ngày tốt lành và happy coding.

Nguồn và liên kết 7 nguồn

  1. Tên gốc: I Think I Found the Perfect UI for Coding Agents
  2. Sự kiện: YouTube
  3. Video gốc: https://www.youtube.com/watch?v=ZBPqH36BPgI youtube.com
  4. Kênh YouTube Web Dev Cody (Cody Seibert): youtube.com/channel/UCsrVDPJBYeXItETFHG0qzyw youtube.com
  5. Repo Nebula, "Mission control for your coding agents" (README có lệnh cài, danh sách harness được hỗ trợ và bảng tính năng; tính đến 10/2026 là một binary Rust cho macOS và Linux): github.com/AgentSystemLabs/nebula github.com
  6. Danh sách đầy đủ các phím tắt của Nebula: docs/keys.md github.com
  7. Tài liệu Git về worktree: git-scm.com/docs/git-worktree git-scm.com