Claude Code là công cụ AI làm việc trực tiếp với mã nguồn và file dự án. Mỗi skill xử lý một việc cụ thể; JTBD là cách mô tả hoàn cảnh, việc cần làm và kết quả mong muốn. Token là đơn vị dung lượng văn bản AI xử lý. Bấm từng tab để xem chi tiết.
Ngày làm việc của mình có vài bước lặp lại. Xong một đầu việc, mình cập nhật sổ và tạo commit (lưu một mốc thay đổi vào Git) — cùng lúc đó một dấu phiên làm việc cũng được lưu lại. Sáng hôm sau mình xem lại việc hôm qua rồi lập kế hoạch hôm nay. Tới một cột mốc dự án, mình ghi lại lý do đằng sau các quyết định. Khi cần đọc trên điện thoại hay chia sẻ, mình gửi tài liệu qua Telegram. Ba skill đầu nối nhau qua hai kho chung: task-log (sổ việc code trong dự án) và vibe-history (kho các phiên làm việc); còn telegram-send là kênh đưa kết quả ra ngoài.
done ghi kết quả vào hai kho chung: task-log (việc code) và vibe-history (phiên làm việc). daily-report đọc task-log; retrospective đọc cả task-log lẫn vibe-history. telegram-send không đụng kho nào — nó đưa chính các báo cáo/tài liệu đó ra Telegram.
Hai kho chung viền đậm xanh: task-log (việc code theo dự án) và vibe-history (phiên làm việc). Obsidian vault (viền nét đứt) là nguồn việc non-code chỉ của daily-report. Đường nét đứt xanh dương = telegram-send gửi output ra ngoài (quan hệ theo luồng, không qua kho chung).
Khi xong một đầu việc, done chốt phần đã làm và thời gian đã dùng. Nó là bên GHI cho cả hai kho chung: cập nhật task-log rồi commit, và lưu một dấu phiên vào vibe-history.
done cập nhật đúng mục trong plans/task-log.md (chuyển done, thêm giờ kết thúc
+ thời gian) rồi đưa dòng đó vào cùng commit với mã nguồn. Ngay sau commit, nó bắn một checkpoint qua
vibe-history-capture.cjs (gói JSON gồm mã phiên, thư mục, đường dẫn bản ghi).
Bước vibe-history chỉ chạy khi $CK_SESSION_ID có giá trị và luôn trả mã thành công, nên lỗi
lưu lịch sử không chặn việc chốt task.
Một lần done nuôi HAI đường hồi cứu khác nhau: task-log cho daily-report, và task-log + vibe-history cho retrospective. Đổi lại, dự án phải có task-log và phiên phải được theo dõi thì kho vibe-history mới có dữ liệu.
task-log là sổ việc code của từng dự án. Mỗi mục ghi việc, lý do chọn cách làm, kết quả và thời gian. done ghi; daily-report và retrospective đọc lại; telegram-send không dùng.
Các mục khớp nhau trước hết bằng ngày theo múi giờ Sài Gòn. Registry (bảng ánh xạ thư mục mã nguồn → tên mảng dự án, dùng longest-prefix) giúp daily-report gọi cùng một dự án bằng cùng một tên.
task-log chỉ giữ việc trong mã nguồn. Việc ngoài mã nguồn và kế hoạch tương lai nằm ở Obsidian vault (nguồn riêng của daily-report).
Một nguồn ghi chung giảm tình trạng báo cáo và lịch sử dự án kể khác nhau. Chất lượng đầu ra vẫn phụ thuộc vào việc mình ghi đủ ngày, quyết định và kết quả.
Obsidian vault là kho ghi chú cá nhân, giữ các việc ngoài mã nguồn (support, họp, onboarding, tư vấn, ops) và kế hoạch tương lai. Đây là nguồn thứ hai của daily-report bên cạnh task-log — task-log chỉ có việc code.
extract-vault-tasks.py đọc tasks/*.md trong vault, lọc theo ngày và trạng thái;
cờ --overdue lấy việc quá hạn cho mục Vướng mắc. daily-report cũng GHI NGƯỢC vào đây: báo cáo
lưu ở journal/reports/, việc mới tạo thành task note.
done, retrospective và telegram-send KHÔNG đụng vault — nên nó là nguồn riêng của daily-report, không phải kho chung.
task-log (máy ghi, việc code) + vault (người ghi, việc non-code) bù nhau để báo cáo ngày đủ cả hai mảng. Đổi lại việc non-code chỉ vào báo cáo nếu mình đã kịp tạo note — nên daily-report vẫn phải hỏi thêm.
vibe-history lưu lại các phiên làm việc với AI. done bắn một dấu phiên vào đây; hook cũng tự lưu khi phiên kết thúc hoặc bị nén. retrospective đọc lại kho này để tìm lý do từng chỉ nằm trong hội thoại.
Script capture ghi mỗi phiên thành một file .md theo dự án. Skill
vibe-history-search bọc công cụ qmd (tìm BM25 / vector / hybrid) trên kho này.
retrospective gọi search đó ở nguồn số 2 trong bốn nguồn.
daily-report KHÔNG đọc kho vibe-history — nó chỉ dùng task-log và Obsidian vault.
task-log giữ quyết định đã chốt; vibe-history giữ cả quá trình thử–sai và lý do chưa vào sổ. Đây là hub thứ hai nối done với retrospective, song song với task-log.
Mỗi sáng, daily-report lấy việc đã chốt hôm qua từ task-log để dựng phần “Hôm qua”, kết hợp việc non-code trong Obsidian vault và kế hoạch, rồi cho mình xem trước khi ghi.
extract.py đọc các mục task-log khớp ngày (việc code); extract-vault-tasks.py
đọc việc non-code trong vault; registry đổi đường dẫn thư mục thành tên mảng. daily-report KHÔNG sửa
task-log và KHÔNG đọc vibe-history.
Sau khi mình xác nhận, báo cáo lưu vào journal/reports/ và việc mới ghi ngược vào vault —
không ghi vào task-log.
Báo cáo bám vào việc đã ghi nhận, nhưng mục thiếu ngày sẽ bị bỏ. Bản tóm tắt do AI soạn vẫn cần mình duyệt trước khi ghi.
Tới cột mốc hoặc bàn giao, retrospective dựng tài liệu tri thức từ BỐN nguồn: bản ghi phiên đang mở, kho vibe-history, task-log và lịch sử Git. Hai trong số đó — task-log và vibe-history — chính là hai kho done đã ghi.
collect_sources.py kiểm bốn nguồn và chấm mức tư liệu High/Medium/Low. Kho vibe-history được
đọc qua skill vibe-history-search; task-log cho bối cảnh quyết định; git cho dòng thời gian
thay đổi.
Retrospective không sửa task-log. Nó tạo docs/project-knowledge.md và gắn nhãn
(Inferred) cho nhận định thiếu bằng chứng.
task-log giữ lý do nghiệp vụ, vibe-history giữ quá trình suy nghĩ — cộng lại cho bức tranh đầy đủ hơn chỉ đọc code/git. Nếu dấu vết mỏng, tài liệu phải hạ mức tin cậy thay vì tự điền.
telegram-send không đọc hay ghi kho chung nào. Vai trò của nó trong nhóm này là ĐƯA kết quả ra ngoài: gửi báo cáo của daily-report hoặc tài liệu của retrospective (hay file bất kỳ) sang Telegram để đọc trên điện thoại / chia sẻ nhóm.
send.sh đọc token + chat id từ ~/.config/telegram-send/config.env (ngoài repo,
chmod 600), rồi dùng curl gọi sendMessage/sendDocument. Nó độc lập
về DỮ LIỆU — không chạm task-log hay vibe-history.
Nhưng theo LUỒNG công việc, nó nằm ở cuối: courier chuyển chính các artefact mà daily-report và retrospective vừa tạo ra.
Khép vòng — việc đã chốt và tài liệu đã dựng tới được điện thoại/nhóm mà không
phải mở máy. Đổi lại text gửi dạng thuần (không định dạng); muốn giữ format thì gửi file .md.
done ghi vào task-log
(trạng thái, giờ, kết quả) rồi commit; ngay sau đó lưu một dấu phiên vào vibe-history. Một lần
chạy, ghi vào cả hai kho.daily-report đọc
task-log (việc code) + Obsidian vault (việc non-code) để dựng “Hôm qua”. Nó không đọc
vibe-history.retrospective đọc cả
hai — task-log (lý do đã chốt) và vibe-history (quá trình suy nghĩ, qua
vibe-history-search) — cộng bản ghi phiên và git.telegram-send đứng cuối
luồng: gửi báo cáo/tài liệu do hai skill trên tạo ra sang Telegram. Không đụng kho chung
nào.Không hẳn. Đầu phiên chỉ có một dấu mốc ghi giờ bắt đầu để đo khoảng nghỉ; đó chưa phải là một đầu việc. Khi mình đưa yêu cầu cụ thể thì mới mở mục công việc. Việc phát sinh dài hơn 5 phút được tách riêng, còn việc ngắn hơn được ghi cùng mục chính.
Ngày là khóa nối chính: task-log, việc trong kho ghi chú, tên file báo cáo và mốc kế
hoạch ngày/tháng đều dùng ngày theo giờ Sài Gòn. Registry và longest-prefix là bảng ánh
xạ thư mục mã nguồn sang tên mảng, trong đó hệ thống chọn đường dẫn cha khớp dài nhất. Nhờ ngày và bảng này,
dữ liệu từ nhiều nơi vẫn được xếp đúng dự án.
skill xem các phần mình vừa sửa để biết đây là tính năng mới, sửa lỗi, đổi tài liệu hay việc bảo trì. Nếu không có thay đổi, nó dừng.
git diff hiển thị phần khác nhau giữa trạng thái hiện tại và mốc Git trước đó. Kết quả
được dùng để đặt conventional commit (quy ước đặt tên commit bằng tiền tố như feat,
fix, docs hoặc chore).
Tự suy loại commit giúp giảm thao tác, nhưng mình vẫn cần kiểm tra khi một lượt thay đổi chứa nhiều mục đích. Không có thay đổi thì không tạo commit rỗng.
skill ghi rằng đầu việc đã xong, kết thúc lúc nào và mất bao lâu. Nó giữ nguyên phần lý do đã ghi từ đầu, rồi thêm kết quả ở cuối.
plans/task-log.md được cập nhật trước commit: mục công việc chuyển sang
done, có giờ kết thúc, thời gian thực hiện và kết quả. Cách này đưa thay đổi của task-log
vào cùng commit với mã nguồn.
Dự án phải có task-log theo đúng cấu trúc. Dữ liệu chỉ được ghi trên máy cho đến khi mình chủ động đẩy lên nơi lưu trữ từ xa.
skill gom các thay đổi đã chọn vào một mốc Git và đặt tên theo nội dung. Nếu bước kiểm tra phát hiện lỗi, nó báo lại và không bỏ qua kiểm tra.
git add chọn thay đổi; git commit lưu mốc. Pre-commit hook (bước kiểm tra
tự chạy trước khi tạo commit) có quyền từ chối. skill không dùng --no-verify để vượt
qua hook và không đưa nhắc đến AI vào nội dung commit.
skill chỉ tạo commit trên máy; nó không push (đẩy commit
lên kho từ xa) và không triển khai sản phẩm.
skill lưu dấu phiên làm việc hiện tại để sau này mình có thể tìm lại cuộc trao đổi và quyết định liên quan. Nếu phiên không được theo dõi, bước này được bỏ qua.
vibe-history là kho lưu lại các phiên làm việc với AI. Khi biến $CK_SESSION_ID có giá
trị, skill gửi một gói JSON (định dạng dữ liệu dạng cặp tên–giá trị) gồm mã phiên, thư mục làm việc
và đường dẫn bản ghi tới vibe-history-capture.cjs. Script là chương trình nhỏ chạy tự
động; script này luôn trả mã thành công để lỗi lưu lịch sử không chặn việc chốt đầu việc.
Bước này không bảo đảm có dữ liệu khi phiên không được theo dõi. Việc ưu tiên không chặn luồng cũng có nghĩa lỗi lưu lịch sử chỉ được ghi nhận riêng.
Sau khi lưu thay đổi, skill hỏi mình có muốn mở hoặc đóng một mục theo dõi trên GitHub không. Nó chỉ thực hiện khi mình đồng ý.
GitHub issue là mục theo dõi công việc trên GitHub. skill hỏi xác nhận trước khi chạy
gh issue create hoặc gh issue close. Tiêu đề, nội dung Vấn đề → Phương án →
Quyết định và nhãn tuân theo quy ước dự án.
Không có kho GitHub từ xa hoặc công cụ gh thì bước này được
bỏ qua; task-log trên máy vẫn là bản ghi chính.
Kết thúc một đầu việc: cập nhật task-log, tạo commit theo quy ước, lưu một mốc vào vibe-history, rồi hỏi mình có muốn tạo hoặc đóng GitHub issue hay không.
--no-verify.skill đọc sổ việc của các dự án, lấy đúng những mục thuộc ngày cần báo cáo và cộng thời gian đã dùng. Mục thiếu ngày được báo riêng để mình sửa.
extract.py quét các file task-log.md dưới ~/Documents/EGANY,
tách từng mục ### Task và lọc ngày từ dòng - Time:. Nếu dòng này không có
ngày, script dùng ngày ở tiêu đề ## Session.
Script đọc cả dạng 2h30 và 15', cộng trường thời gian rồi xuất JSON đã nhóm
theo dự án. Phần trình bày dùng trực tiếp kết quả đó thay vì tự tính lại.
Mục thiếu ngày ở cả hai vị trí bị bỏ khỏi báo cáo và tăng bộ đếm
skipped_no_date. Mình cần sửa những mục này nếu không muốn mất dữ liệu.
skill đọc các việc ngoài mã nguồn trong Obsidian theo ngày. Việc chưa xong và đã quá hạn có thể được đưa vào phần vướng mắc.
extract-vault-tasks.py đọc tasks/*.md trong Obsidian vault. Frontmatter là
khối thông tin ở đầu file; script lấy các trường date, done,
project và spent_time từ đó bằng bộ đọc có sẵn, không cần PyYAML.
Cờ --overdue lấy các việc có done: false và quá hạn trong 7 ngày để bổ sung
cho mục Vướng mắc.
Việc cá nhân được loại khỏi báo cáo nhóm trừ khi bật
--include-personal. Số mục bị loại vẫn được ghi ở personal_skipped để mình
kiểm tra.
skill tra mỗi thư mục mã nguồn thuộc mảng dự án nào để tên hiển thị không thay đổi giữa các báo cáo.
Registry đọc trường repo: trong các ghi chú projects/*.md. Cách
longest-prefix chọn đường dẫn đã khai dài nhất khớp với đường dẫn hiện tại, vì vậy thư mục con vẫn
thuộc dự án cha phù hợp.
Thư mục chưa khai báo rơi vào “chưa phân loại”. skill tạm dùng tên thư
mục cuối và nhắc mình bổ sung trường repo:; cảnh báo kỹ thuật không được đưa vào báo cáo
nhóm.
AI gộp nhiều việc nhỏ cùng mục tiêu thành vài đầu việc lớn và viết lại để người không làm kỹ thuật vẫn theo được. Script chỉ lấy dữ liệu, không thực hiện bước này.
Mô hình ngôn ngữ nhóm các mục cùng hướng, giới hạn 2–3 ý cho mỗi mảng và trình bày theo vấn đề → kết quả. Thuật ngữ nghiệp vụ cần thiết như CRO hoặc checkout được giữ lại; chi tiết lập trình như tên biến, bảng dữ liệu hoặc webhook (địa chỉ nhận thông báo tự động từ hệ thống khác) được bỏ khi không giúp người đọc hiểu kết quả.
Việc nhóm và diễn đạt do AI thực hiện nên có thể gộp sai ý. Bước xác nhận ngay sau đó là bắt buộc.
skill dừng ở bản nháp để mình đọc, sửa hoặc từ chối trước khi nó ghi bất kỳ file nào.
Confirmation gate là bước bắt buộc phải có xác nhận của người dùng. Ngay cả khi đã có việc trong kho ghi chú, yêu cầu “chạy daily report” vẫn không được hiểu là cho phép ghi ngay.
Việc dừng để xác nhận làm quy trình dài thêm một bước. Khi dựng lại báo cáo ngày cũ, skill bỏ bước này và xuất Markdown thường vì không có kế hoạch “Hôm nay” cần xác nhận.
Sau khi mình xác nhận, skill lưu báo cáo theo ngày và cập nhật các việc vừa khai vào Obsidian. Nó không sửa task-log.
Báo cáo được ghi vào journal/reports/<hôm-nay>.md. BBCode là cú pháp định dạng của
Bitrix24; file có ba mục HÔM QUA, HÔM NAY, VƯỚNG MẮC và có frontmatter để tra cứu. Nếu file của ngày
đó đã tồn tại, skill hỏi trước khi ghi đè.
Việc ngoài mã nguồn đã xong được ghi vào tasks/*.md với done: true; kế
hoạch mã nguồn và ngoài mã nguồn dùng done: false. Mục trùng tên được cập nhật thay vì
tạo bản thứ hai. Task-log chỉ được đọc.
Kế hoạch không có ngày/tháng rõ ràng sẽ không tạo thành mục việc. Điều này có thể bỏ sót một ý định mơ hồ, nhưng tránh gắn sai hạn.
Tổng hợp task-log thành báo cáo ngắn bằng tiếng Việt, nhóm các việc cùng mục tiêu, đối chiếu việc chưa xong và hỏi thêm việc chưa được ghi.
Time để mục việc không bị bỏ sót.Bản ghi phiên cho biết mình và AI đã trao đổi gì, thử cách nào và thống nhất quyết định nào. Phiên đang diễn ra thường có nhiều bối cảnh nhất.
Session transcript là bản ghi tuần tự của một phiên làm việc. Các phiên cũ nằm ở
~/.claude/projects/<đường-dẫn-mã-hoá>/*.jsonl; nếu retrospective chạy ngay trong
phiên vừa xây dựng dự án, nó dùng trực tiếp phiên hiện tại.
Nguồn này chứa nhiều lý do nhưng có thể dài và có thể không còn nếu phiên đã bị xóa.
Kho này giúp mình tìm lại các phiên cũ bằng nội dung cần nhớ, kể cả khi không nhớ đúng câu chữ đã dùng.
Semantic search là tìm theo ý nghĩa thay vì chỉ khớp từ giống hệt. skill kiểm tra công cụ
qmd bằng shutil.which, rồi cho biết có thể gọi
vibe-history-search để tìm trong chỉ mục hay không.
Tìm theo ý nghĩa giúp truy lại nhiều phiên, nhưng chỉ hoạt động khi kho dữ liệu và chỉ mục đã tồn tại.
Sổ công việc ghi vấn đề, các cách đã cân nhắc, quyết định cuối cùng và kết quả. Nó giúp mình biết không chỉ việc gì xảy ra mà còn vì sao.
Mỗi mục trong task-log có bối cảnh Vấn đề → Phương án → Quyết định và mốc thời gian. Retrospective dùng dữ liệu này cho phần dòng thời gian và phần lý do quyết định trong tài liệu.
Nguồn này phản ánh lý do nghiệp vụ do mình ghi, nên giá trị giảm rõ nếu mục việc chỉ có tiêu đề hoặc thiếu kết quả.
Lịch sử Git cho biết thay đổi nào được lưu ở thời điểm nào. Nếu nội dung commit và phần trao đổi đi kèm được viết rõ, chúng còn cho biết lý do thay đổi.
skill đọc commit message (mô tả của một mốc Git), pull request hay PR (đề nghị đưa một nhánh thay
đổi vào nhánh chính) và issue khi có công cụ gh. Với dự án cũ, đây có thể là nguồn duy
nhất còn lại để xác định thứ tự thay đổi.
Lịch sử Git thường còn lâu dài, nhưng commit message quá ngắn chỉ cho biết thay đổi mà không giải thích được quyết định.
skill kiểm tra bốn nguồn có đủ để kể lại lịch sử dự án hay không. Khi bằng chứng ít, tài liệu chỉ nêu điều xác nhận được.
collect_sources.py kiểm tra bốn nguồn và trả mức High, Medium hoặc Low. Mức này giới hạn
phần nội dung có thể dựng lại. Đường dẫn phiên được chuyển thành dạng an toàn bằng biểu thức
re.sub([^A-Za-z0-9] → -).
Giới hạn theo bằng chứng có thể làm tài liệu ngắn hơn mong muốn, nhưng tránh tạo ra phần diễn tiến hoặc bài học không có nguồn xác nhận.
skill sắp xếp các bằng chứng thành một tài liệu giải thích bối cảnh, diễn tiến và lý do quyết định. Nội dung suy ra nhưng chưa được xác nhận có nhãn riêng.
Tài liệu theo cấu trúc 12 mục trong references/template.md và quy tắc ở
authoring-rules.md. ADR là bản ghi một quyết định kiến trúc; nhận định thiếu bằng chứng
trực tiếp được gắn (Inferred). skill không thêm phương pháp chưa từng được áp dụng.
Tài liệu giữ được lý do dễ thất lạc, nhưng độ chi tiết bị giới hạn bởi lượng dấu vết còn lại.
Tạo một tài liệu tri thức dự án từ đặc tả, task-log, lịch sử Git và các phiên cũ. Tài liệu trình bày bối cảnh, diễn tiến, quyết định kiến trúc, nguyên tắc cần giữ và bài học có bằng chứng.
(Inferred).Thông tin cho phép gửi tin và nơi nhận được lưu ở file riêng ngoài dự án. Mình không phải nhập lại mỗi lần; nếu thiếu file, skill dừng mà không hiện thông tin bí mật.
Bot token là mã bí mật cho phép script dùng bot; chat ID là mã nơi nhận. send.sh đọc hai
giá trị này từ ~/.config/telegram-send/config.env.
File cấu hình nằm ngoài kho mã nguồn và dùng quyền chmod 600, nghĩa là chỉ tài khoản của
mình được đọc và sửa. Thiếu cấu hình thì script trả exit 1 và dừng.
Tách bí mật khỏi dự án giảm nguy cơ đưa nhầm vào commit, nhưng mình phải tự tạo và bảo vệ file cấu hình trên từng máy.
skill phân biệt phần chữ, file, lời chú thích và nơi nhận. Phần chữ phải đứng trước tùy chọn gửi file để không bị hiểu nhầm là tên file.
CLI args là các tham số đặt sau tên lệnh. Vòng lặp đọc --chat để đổi nơi nhận,
-c để thêm chú thích và -f để bắt đầu danh sách file; phần còn lại được ghép
thành nội dung chữ.
Sau -f, mọi tham số không bắt đầu bằng dấu gạch được xem là đường dẫn file. Vì vậy nội
dung chữ phải đặt trước -f.
Cú pháp ngắn và dễ gọi từ dòng lệnh, nhưng thứ tự sai sẽ khiến phần chữ bị hiểu thành tên file và lần gửi thất bại.
skill gửi lần lượt từng file và phần chữ tới Telegram. Phần chữ được giữ nguyên để ký tự đặc biệt không làm hỏng yêu cầu gửi.
Telegram Bot API là giao diện để chương trình gửi yêu cầu tới Telegram. curl gọi
endpoint (địa chỉ dành cho một thao tác của API) tại
https://api.telegram.org/bot<token>.
Mỗi file dùng thao tác sendDocument, còn phần chữ dùng sendMessage. Nội
dung chữ không được phân tích như Markdown nên các ký tự định dạng không gây lỗi.
Mỗi file tối đa 50 MB và phần chữ không có định dạng đậm hoặc nghiêng. Khi
cần giữ định dạng, mình gửi file .md.
Sau mỗi lần gửi, skill đọc câu trả lời của Telegram. Thành công thì báo
ok; thất bại thì hiện lý do để mình biết file hoặc tin nào cần gửi lại.
Script shell tìm "ok":true trong phản hồi JSON; nếu không có, sed lấy
trường "description" để in FAIL: <lý do>.
Exit code là mã kết thúc của lệnh. Bất kỳ lần gửi nào lỗi đều khiến mã khác 0; nếu chỉ một file trong nhiều file lỗi, từng kết quả vẫn được báo riêng.
Khớp chuỗi JSON giúp script không cần thêm trình đọc, nhưng phụ thuộc vào định dạng phản hồi của Telegram không thay đổi.
Gửi phần chữ hoặc file như Markdown, PDF và ảnh tới Telegram qua bot đã cấu hình sẵn.
curl gọi sendMessage cho phần chữ hoặc sendDocument cho
file.-f.-f..md.