# Plugin Claude Code / Codex bắt bạn phải học

[Noah Kim](https://homus.dev/speakers/noah-kim) · [Noah Kim](https://homus.dev/orgs/noah-kim)

> VibeWise, plugin cho Claude Code và Codex, hỏi câu mở để người học tự quyết scope, hành vi và design trước khi AI viết code.

Topics: Plugins, Skills, Coding Agents

Canonical: https://homus.dev/talks/i-made-a-claude-code-codex-plugin-that-forces-you-to-learn

## 1. Người học code giữa hai lựa chọn: output hay nền tảng

Noah mở đầu bằng một nhận xét: ngày nay, người đang học lập trình bị kẹt "giữa đá cứng và chỗ hiểm" (between a rock and a hard place). Họ phải chọn giữa hai thứ. Một bên là dùng AI để tăng raw output, tức tăng năng suất: ship nhiều dòng code hơn, ship nhiều feature hơn. Bên kia là ưu tiên chuyện học của chính mình.

![Noah Kim nói trước camera trong phòng](https://homus.dev/photos/GckkaKEQ3vo-0043.jpg)

Noah Kim nói thẳng vào camera ở phần mở đầu, trước khi chuyển sang màn hình demo.

Anh lấy ví dụ với các bạn junior: mức chuẩn (the bar) đã bị đẩy lên cao tới mức một app to-do, hay bất kỳ ứng dụng đơn giản nào, không còn đủ nữa. Lý do là những thứ đó có thể vibe-code quá dễ dàng, và chẳng có cách nào phân biệt ai thực sự tự làm. Vì vậy, chuẩn cho thế nào là một side project tốt đã tăng lên rất nhiều.

Vấn đề, theo Noah, là các lớp học thì gần như vẫn giữ nguyên, trong khi AI phát triển quá nhanh. Người học không có một con đường tốt nào để xây những nền tảng (foundations) cần thiết, để rồi tự tạo ra được những ứng dụng tốt hơn ấy mà không phải dựa nặng vào AI.

## 2. VibeWise: plugin bắt bạn ở trong vòng lặp

Từ đó, Noah tự build một plugin cho Claude Code tên là **VibeWise** (repo [nykooi1/vibe-wise](https://github.com/nykooi1/vibe-wise), chạy được cả trên Codex). Ý tưởng cốt lõi: plugin này về cơ bản ép bạn phải là một phần của vòng lặp (be part of the loop). Nó không bắt bạn gõ code bằng tay, nhưng nó tận dụng đầu óc của bạn để thực sự nghĩ ra design, nghĩ ra architecture. Nó đặt câu hỏi để đẩy bạn tự nghĩ ra các feature, và giải thích ở mức high level bạn sẽ implement feature đó thế nào.

Ví dụ, nó sẽ không tự tạo hết các bảng database cho bạn. Nó sẽ hỏi: bạn muốn có những bảng nào? Và nếu bạn trả lời "tôi còn không biết nên chọn database nào", nó sẽ hỏi ngược lại: vậy bạn nghĩ mình nên chọn cái nào? Nó cứ tiếp tục đẩy bạn tham gia thật sự vào những quyết định mà ngày trước bạn bắt buộc phải tự đưa ra.

Nó cũng bỏ đi kiểu trải nghiệm trắc nghiệm: A là lựa chọn tốt nhất, rồi B, C, bạn muốn cái nào? Và tất nhiên ai cũng chỉ bấm A rồi đi tiếp.

Khác biệt Noah nhấn mạnh: thay vì một menu trắc nghiệm có sẵn đáp án "Recommended", VibeWise đặt câu hỏi mở để bạn tự lập luận ra quyết định.

## 3. Demo phía Claude bình thường: "I need to make a notion dupe"

Không dài dòng thêm, Noah vào demo. Demo khá đơn giản: anh cho xem hành vi bình thường của Claude đặt cạnh VibeWise. Anh tạo một folder mới, khởi động Claude trong đó, và chỉ gõ đúng một câu: "I need to make a notion dupe" (tôi cần làm một bản sao Notion). Đó là toàn bộ context anh đưa.

Trên màn hình, Claude nạp skill `superpowers:brainstorming` rồi nói đây là project mới nên mang tính kiến trúc: nó sẽ đi qua các câu hỏi, một design, một spec viết ra, rồi một plan trước khi build. Claude hỏi anh ba câu:

- **Bản clone này để làm gì?** Noah trả lời: để tôi học (trên màn hình là "Portfolio / learning").

- **Phiên bản đầu nên bao phần nào của Notion?** Claude đưa một gợi ý để chọn: block editor và pages, gắn nhãn "Recommended".

- **Nên build trên cách tiếp cận nào?** Claude đưa một danh sách stack để chọn, và Noah chỉ việc chọn cái được recommend (React + Tiptap, lưu local storage).

![Terminal Claude Code: ba câu hỏi đã trả lời và phần What you told me, What I'm assuming, Features](https://homus.dev/photos/GckkaKEQ3vo-0129.jpg)

Phiên Claude bình thường: sau câu "i need to make a notion dupe", Claude hỏi ba câu, Noah chọn các đáp án Recommended, rồi Claude bày ra cả design gồm "What you told me", "What I'm assuming" và danh sách Features.

"Nhìn này", Noah nói. Anh đã nói rõ là mình muốn học, vậy mà nó vẫn đưa cho anh lựa chọn được recommend, đưa cho anh stack được recommend, và anh chỉ bấm yes, yes, yes. Không đời nào anh đủ chủ động để tự tìm hiểu từng lựa chọn đó, trừ khi thật sự ép bản thân phải học. Đây là hành vi mặc định của AI: đút cho bạn mọi thứ, làm mọi thứ dễ dàng để bạn xong việc thật nhanh.

Dựa trên mấy câu trả lời đó, Claude tóm lại: đây là những gì bạn nói với tôi, và tôi sẽ giả định tất cả những điều sau. Nó giả định chỉ có một user, không login, không backend, tức về cơ bản chỉ làm frontend. Rồi đây là toàn bộ feature nó sẽ build: cây trang (page tree) lồng nhau không giới hạn, đủ loại block, cách search, cách lưu. Nó tự nghĩ ra data model, storage layer, state, routing, editor, styling.

![Phần Architecture với Data model, Storage layer, State, Routing, Editor, Styling, Error handling, Deployment](https://homus.dev/photos/GckkaKEQ3vo-0243.jpg)

Phần Architecture Claude tự quyết hết: data model của mỗi trang, storage layer trên IndexedDB, Zustand cho state, React Router, Tiptap cho editor, Tailwind cho styling, cả error handling, test và deploy. Cuối cùng là câu "Does this look right?", và Noah gõ "yup lets go".

"Thử nghĩ xem nó đang làm bao nhiêu thứ ở đây mà bạn không hề tham gia", Noah nói. Bạn chỉ lướt qua, thấy ổn, rồi nghĩ: "Okay, tuyệt, thế này là quá đỉnh". Việc duy nhất còn lại là trả lời câu "Does this look right?" bằng một chữ "có". Anh gõ "let's go".

## 4. Kế hoạch 11 bước và một file mấy nghìn dòng

Ngay sau đó, Claude đưa ra hẳn một plan 11 bước cho những gì nó sẽ implement, từ project scaffold cho tới cách làm từng feature nhỏ. Rồi nó bảo: hãy review plan này.

![Danh sách 11 task của implementation plan và câu hỏi chọn cách thực thi](https://homus.dev/photos/GckkaKEQ3vo-0303.jpg)

Plan đã được viết và commit: 11 task, từ "Project scaffold and page-tree logic" tới "README and deployment instructions". Claude còn hỏi nên chạy theo kiểu Subagent-driven hay Native, và recommend Native.

Noah mở file plan ra xem thử nó trông thế nào. Rồi anh hỏi: bạn định nói với tôi rằng một junior engineer, hay một bạn đang học đại học, sẽ thật sự đọc lướt hết file này (bao nhiêu dòng vậy? mấy nghìn dòng) và thật sự hiểu, rồi thốt lên "wow, mình học được quá trời, mình tự nghĩ ra hết những thứ này, mình hiểu hết các lựa chọn"?

![File implementation plan mở trong editor, đang ở dòng hơn 2500 với CSS cho sub-page-link và slash-menu](https://homus.dev/photos/GckkaKEQ3vo-0323.jpg)

File implementation plan của bản clone Notion mở trong editor: đang cuộn ở quanh dòng 2.500, giữa các đoạn CSS cho sub-page link và slash menu, mới chỉ là Task 5.

Tất nhiên là không. Họ không hề tham gia vào việc build. Họ không engineering bất cứ thứ gì.

## 5. Tuyệt cho senior, tệ cho người đang học

Họ chỉ nói ra thứ họ muốn được build, rồi AI làm từ đầu tới cuối. Noah công nhận cách này có thể rất tốt để implement feature hay viết test tự động. Với một senior engineer, nó tuyệt vời, vì họ có thể tự architect mọi thứ và hiểu AI đang làm gì từ đầu tới cuối mà không cần đi qua quá trình học. Nhưng với bất kỳ ai đang cố học, đây là một trải nghiệm tệ hại.

Lý do là bạn bị ngợp. Về cơ bản nó xả vào bạn một "vòi rồng" (fire hose) những gì nó sẽ làm, và làm sao bạn học được từ đó? Bạn định đọc hết bản tài liệu mấy nghìn dòng, hiểu hết, để nó code, rồi đọc tiếp hàng nghìn dòng code nó viết, xong nói rằng mình thật sự đã học được gì đó?

Tất nhiên là không. Noah thừa nhận reverse engineering là quan trọng, nhưng không đời nào bạn reverse engineer được đống này trừ khi bỏ ra một lượng thời gian vô lý, và nó thật sự không phải một cách học trực quan.

Luồng của phiên Claude bình thường trong demo: từ một câu yêu cầu tới design, plan và code, còn người học chỉ góp mấy chữ "yes".

## 6. Demo VibeWise: learn, profile và build checkpoint đầu tiên

Giờ tới VibeWise. Sau khi cài plugin, bạn chạy nó. Noah hỏi đúng câu cũ, chỉ khác là lệnh đầu tiên chỉ có "learn". VibeWise hỏi: bạn đang build gì? Và anh trả lời: "I need to make a notion dupe", y hệt câu anh gõ ở terminal kia.

![VibeWise bật learning mode và hỏi What are you building?](https://homus.dev/photos/GckkaKEQ3vo-0430.jpg)

VibeWise bật learning mode: nó sẽ hỏi cách tiếp cận của bạn trước, góp ý, rồi mới implement những gì hai bên thống nhất, với ghi chú lưu trong thư mục `.vibe-wise/`. Sau đó là câu hỏi "What are you building?", và Noah gõ lại "I need to make a notion dupe".

Theo README của repo, cách cài trong Claude Code là chạy lệnh sau, rồi khởi động lại Claude Code trong project và gọi lệnh learn:

```
/plugin install vibe-wise@anthropic-plugin-directory
```

```
/vibe-wise:learn
```

Với Codex, README hướng dẫn thêm marketplace rồi cài plugin, sau đó gọi `$vibe-wise:learn` trong project:

```
codex plugin marketplace add nykooi1/vibe-wise
codex plugin add vibe-wise@vibe-wise
```

Lần này, thay vì đưa design, nó bắt đầu bằng câu hỏi về chính bạn. Bạn mô tả kinh nghiệm lập trình tổng thể của mình thế nào? Noah chọn: tôi là beginner. Bạn muốn vòng lặp học (learning loop) chạy ra sao? Dùng mặc định, hay hỏi dần trong lúc làm. Anh chọn mặc định.

![VibeWise hỏi kinh nghiệm lập trình và cách chạy learning loop, rồi cập nhật file profile.md](https://homus.dev/photos/GckkaKEQ3vo-0445.jpg)

Hai câu onboarding: kinh nghiệm lập trình (Beginner) và cách chạy learning loop (Use defaults). Ngay sau đó VibeWise ghi lại vào file `.vibe-wise/profile.md`: Learning mode active, onboarding complete.

Rồi nó dựng ra progress, profile và project map để theo dõi bạn trong suốt quá trình. Ví dụ, profile ghi kinh nghiệm là beginner tự khai, mục tiêu mặc định là hiểu project từ đầu tới cuối trong lúc build; còn file progress ghi một quyết định đang chờ: phạm vi của bản clone Notion, đang đợi người học tự mô tả.

![Diff của file profile và progress.md trong thư mục .vibe-wise](https://homus.dev/photos/GckkaKEQ3vo-0423.jpg)

VibeWise cập nhật profile (Overall programming: Beginner, Primary goal: understand the project end to end) và tạo `progress.md` với một "Pending decision" về phạm vi bản đầu. Chưa có design hay stack nào được đề xuất.

Sau đó nó hỏi bạn một **build checkpoint**: khi người dùng mở app, bạn muốn app thực sự làm được gì? Nó đang để bạn tự định nghĩa scope. Nó bắt bạn nghĩ: khi ai đó bấm vào URL và nhìn thấy app lần đầu tiên, mình thật sự muốn ứng dụng làm gì?

![Build checkpoint: What the first version does, và câu trả lời tự do của Noah](https://homus.dev/photos/GckkaKEQ3vo-0503.jpg)

Build checkpoint "What the first version does": hãy hình dung ai đó mở app lần đầu, đi qua từng bước bằng lời thường, và cho biết phần nào của Notion quan trọng với bạn. Không có câu trả lời sai. Bên dưới là câu trả lời Noah tự gõ.

Noah trả lời rằng anh muốn người dùng mở được app, đăng nhập, tạo một note và bắt đầu sửa note đó; trên màn hình anh gõ thêm rằng note phải nằm được bên trong folder. Anh chỉ ra: đây là câu trả lời tự do. Thay vì đưa một checklist gạch đầu dòng, hay một câu trắc nghiệm "bạn muốn làm gì" kèm một chữ "recommended" nho nhỏ bên cạnh, nó bắt bạn tự nghĩ ra một câu trả lời thật về scope của phiên bản một. Rồi nó ghi câu đó lại.

## 7. Lấp các khoảng trống về hành vi: những quyết định nhỏ làm nên một app

Tiếp theo là một build checkpoint khác: lấp đầy phần hành vi (filling in the behaviour). Dựa trên những gì bạn nói, còn rất nhiều khoảng trống. Đăng nhập, tạo note, sửa note, nghe thì hay, nhưng bạn thực sự muốn những việc đó diễn ra thế nào?

![Build checkpoint Filling in the behaviour với ba câu hỏi Coming back later, What editing means, How folders behave](https://homus.dev/photos/GckkaKEQ3vo-0543.jpg)

Build checkpoint "Filling in the behaviour" với ba câu hỏi mở: quay lại sau thì thấy gì, "editing" nghĩa là gì, và folder hoạt động thế nào. Cuối khối, nó dặn bạn trả lời bằng lời của chính bạn, và "I don't know yet" cũng là một câu trả lời hữu ích.

Cụ thể, nó hỏi:

- **Quay lại sau thì sao?** Bạn viết một note, đóng app, rồi mở lại trên một thiết bị khác thì thấy gì? Làm sao để note vẫn còn đó vào ngày mai?

- **"Editing" thực ra nghĩa là gì?** Nó có các loại block khác nhau không? Nó hỏi về heading, bullet list, checkbox, bắt bạn tự đưa ra spec thật sự.

- **Folder hoạt động ra sao?** Bạn nói muốn có folder, tuyệt. Nhưng nó không tự lấp chỗ trống và tự nghĩ ra toàn bộ logic. Nó hỏi: folder có chứa được folder khác không, hay chỉ chứa note? Một note có thể nằm ngoài mọi folder không? Chuyện gì xảy ra khi folder bị xoá?

Nó bắt bạn suy nghĩ về tất cả những quyết định nhỏ đó. Đúng là chúng tương đối đơn giản. Nhưng nếu bạn chưa từng trải qua, vì tất cả những gì bạn làm là vibe coding và về cơ bản là đọc "phao" (cheat sheet) từ AI, thì bạn sẽ không bao giờ phải nghĩ tới những thứ "ngớ ngẩn" nho nhỏ cấu thành nên một ứng dụng thật.

Noah giải thích ngay: "ngớ ngẩn" ở đây không có nghĩa đó là những quyết định ngớ ngẩn. Chỉ là với một senior, hay một người nhiều kinh nghiệm, anh có thể nhìn vào và nói "ừ, đương nhiên rồi", hiểu ngay trong đầu mình muốn nó chạy chính xác thế nào mà không cần viết ra thành spec. Nhưng nếu bạn chưa bao giờ phải tự nghĩ qua vấn đề, thì thật lòng mà nói, có lẽ bạn sẽ không nghĩ tới hết những edge case nhỏ và những hành vi nhỏ đó.

Với Noah, đó mới chính là phần vui của việc build: trong lúc build, bạn đụng phải vô số chuyện nhỏ, vô số vấn đề nhỏ mà bạn phải engineer cách giải. Đó là thứ làm cho software engineering trở thành engineering. Đó là phần vui, hay ít nhất lẽ ra phải là phần vui.

Anh nói thêm, nửa đùa nửa thật: nếu chuyện đó không vui với bạn, có lẽ bạn đang đi nhầm nghề. Thứ làm software engineering thú vị là nghĩ về user experience, nghĩ về backend chạy thế nào, mình sẽ thiết kế các bảng ra sao, mình muốn dùng database nào. Có quá nhiều quyết định nhỏ đang bị AI trừu tượng hoá đi và phá hỏng hoàn toàn, trong khi thật lòng chúng không nên bị như vậy, nhất là khi bạn đang học.

## 8. Ba loại checkpoint, và vibe coding mà bạn vẫn phải nghĩ

Noah mời mọi người dùng thử và cho anh biết cảm nhận. Phần demo về cơ bản là vậy; README còn nhiều thứ để đọc thêm. Điều cuối cùng anh nói tới là các loại checkpoint khác nhau: **build checkpoint**, **design checkpoint** và **implementation**.

![README của repo vibe-wise trên GitHub: Implementation checkpoint và Implementation report cho Folder membership](https://homus.dev/photos/GckkaKEQ3vo-0743.jpg)

README của repo vibe-wise trên GitHub: ví dụ một "Implementation checkpoint" cho Folder membership với hai lựa chọn "Implement this step" hoặc "Discuss", rồi "Implementation report" liệt kê migration, thao tác xoá folder và các test đã chạy.

Implementation là phần nó thật sự viết code, nhưng chỉ sau khi bạn đã tham gia vào quá trình build và chốt design. Design về cơ bản gom tất cả các build checkpoint lại làm một. Theo Noah, đó chính là cách người ta làm feature thật: bạn phải nghĩ qua mọi thứ cấu thành nên một design cuối cùng. Chỉ khi đã có design đó, bạn mới nhìn nó một cách tổng thể, xem mọi thứ, xem các phần chạy cùng nhau thế nào, nghĩ thêm nhiều edge case hơn, nhiều vấn đề hơn. Và chỉ sau khi tất cả đã được làm rõ và quyết định xong, bạn mới bắt tay viết code.

Ba loại checkpoint của VibeWise theo thứ tự Noah mô tả: code chỉ được viết sau khi bạn đã đi qua build và chốt design.

Tóm lại, đó về cơ bản vẫn là vibe coding, nhưng lần này bạn thật sự tham gia. Bạn không phải tự tay gõ từng dòng code, nhưng bạn là người build, người design, và lần này bạn thật sự phải suy nghĩ.

Noah sẽ để link plugin trong phần mô tả video. Anh mời mọi người mở issue hoặc viết feedback ở phần bình luận, vì anh có thể cập nhật plugin rất, rất dễ. Anh cảm ơn mọi người đã xem.

## Nguồn và liên kết

- Tên gốc: I Made a Claude Code / Codex Plugin That Forces You to Learn
- Sự kiện: [YouTube](https://homus.dev/events/youtube)
- Video gốc: [https://www.youtube.com/watch?v=GckkaKEQ3vo](https://www.youtube.com/watch?v=GckkaKEQ3vo)

- Kênh YouTube Noah Kim: [youtube.com/channel/UCekGb_B6CvGKHt1lq27zoZA](https://www.youtube.com/channel/UCekGb_B6CvGKHt1lq27zoZA)

- Repo VibeWise, plugin cho Claude Code và Codex (README có hướng dẫn cài, bảng ba loại checkpoint và cách chỉnh mức hỗ trợ theo kinh nghiệm): [github.com/nykooi1/vibe-wise](https://github.com/nykooi1/vibe-wise)

Nguồn: https://homus.dev/talks/i-made-a-claude-code-codex-plugin-that-forces-you-to-learn · cập nhật 2026-10-09
