untangle-codebase – skill Agent & Tự động hóa cho agent AI
Gỡ rối toàn bộ codebase trong một lượt, để các agent làm việc trên đó đọc ít hơn cho mỗi thay đổi, ít phá vỡ mà không hay biết, và gỡ lỗi nhanh hơn.
Cài skill untangle-codebase bằng một lệnh
Chọn công cụ bạn đang dùng, copy lệnh và dán vào terminal. Skill sẽ nằm trong thư mục skills của công cụ đó và sẵn sàng dùng ở phiên làm việc tiếp theo.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/untangle-codebase-564d1.tgz | tar xz -C ~/.claude/skills
Gọi trong Claude Code: /untangle-codebase – rồi mô tả công việc bạn muốn làm.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/untangle-codebase-564d1.tgz | tar xz -C ~/.codex/skills
Gọi trong Codex: $untangle-codebase – rồi mô tả công việc bạn muốn làm.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/untangle-codebase-564d1.tgz | tar xz -C ~/.hermes/skills
Gọi trong Hermes Agent: /untangle-codebase – rồi mô tả công việc bạn muốn làm.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/untangle-codebase-564d1.tgz | tar xz -C ~/.deepcode/skills
Gọi trong DeepSeek: /untangle-codebase – rồi mô tả công việc bạn muốn làm.
Nội dung SKILL.md
Nội dung SKILL.md gốc bằng tiếng Anh.
Untangle Codebase
When to Use
Use for an explicitly requested codebase-wide structural refactor. For a single defect, use systematic debugging; for a bounded cleanup, prefer code-refactoring-refactor-clean.
Safety and scope
Work only within the user-authorized repository and scope. Preserve unrelated work and establish baseline behavior with existing checks. Refactoring writes files; never publish, deploy, push, or delete user data without authorization. Optional comment/test removal requires the selection requested below. Do not remove tests merely to make failures disappear. Use subagents only when available and authorized; otherwise perform the review passes yourself. Do not upload private source to external services without permission.
Workflow
Start a thorough refactor of this codebase and complete it to the end.
Treat this as a goal.
Why do this at all?
- Better output: agents write better code in a well-structured codebase.
- Cheaper & faster changes: agents spend fewer tokens searching and more on the problem.
- Fewer silent breaks: agents break less without noticing.
- Faster debugging: agents find root causes faster.
1. Ask
Besides untangling the codebase, there are two other things you may do:
| Addition | What it does |
| --- | --- |
| Comments | Remove comments that only restate the code. |
| Tests | Remove tests that wouldn't catch a real bug, and fix the ones that fail without one. |
List these (with their exact descriptions) for the user and ask which ones to do. Then do only those.
2. List every problem
Don't change anything yet.
Go through the codebase asking one thing: should these pieces change together? Write down every place the code gets the answer wrong, as in the [decision log example](#decision-log-example). There are only three ways to get it wrong.
Hidden links: pieces that must change together, where the code doesn't show it.
- Copies of logic or values: change one and the others must change too, but nothing says so.
- A module that reads a global or file set by another module: change that module and this one breaks, but nothing shows it (self-contained code).
- A feature split across folders by layer, or related code in different folders: one change needs all of them, but the layout hides that (domain-driven code, colocation).
- A call order or convention callers just have to know: change it and callers break, but nothing warns them (explicit over implicit).
Needless links: pieces tied together that change for different reasons.
- Callers that depend on internals: the internals change for their own reasons, and the callers break anyway (encapsulation).
- Stable code that imports something more volatile: the stable code has to change whenever the volatile code does (dependency direction).
- A general function with a parameter only one workflow understands: the function has to change whenever that workflow does (caller vocabulary).
- A shallow module: its interface changes whenever its internals do, so its callers change with it (deep modules).
Surplus: pieces with no reason of their own to change.
- Wrappers: they only change when the thing they wrap does (pass-through wrappers).
- Extension points and config for things that never vary: nothing will ever change them (speculative generality).
- Dead code: nothing uses it, so nothing will ever need it to change.
Also write down every special case: code that exists for one situation instead of following from how the system works. Each one is a requirement the design never accounted for, so use them to work out what the system needs to be.
- An
iffor one value - A parameter for a specific caller
- A swallowed exception
- A retry or sleep
- A disabled test
3. Redesign from first principles
Work out the fixes as if the system had known today's requirements from the start. Look for the one fix behind several problems, which often looks nothing like them. Don't fix special cases one by one.
Ask the same thing of every fix, even one that looks better in the code: pieces that change together end up together, pieces that don't aren't tied, and everything depends on what changes less.
Write each fix above the problems it solves, as in the [decision log example](#decision-log-example).
4. Fix everything on the list
Remove the special cases the redesign makes unnecessary, and keep the ones the system still needs. Don't go looking for bugs separately. A structural fix may fix some along the way, which is fine.
If the user chose Comments:
- Comments that restate the implementation, like
// sort first so the binary search works, only change when it does, so they have no reason of their own to change. Remove them, even if they're phrased as a why. - Comments about something outside the code, like
// the proxy drops websockets, so we poll, change when that does, and the code can't show it. Keep them. - Comments that explain a workaround om the codebase, like
// wait 100ms because the cache isn't ready yet, only change when the problem behind the workaround does. They go when the redesign removes that problem.
If the user chose Tests, do this last, because tests are your regression safety net. A test should fail on a regression, and only then:
- Tests that repeat the implementation only change when it does, so they have no reason of their own to change. They check the same interpretation against itself, so remove them.
- Tests tied to internals break when the code changes but behavior doesn't, so they change for the wrong reason. Rewrite them to depend on behavior, which changes less.
- Tests that can't fail pass whatever the code does, so no change ever affects them. They aren't checking anything, so remove them.
5. Check, and repeat until done
Have subagents search for special cases, hidden links, needless links and surplus. Do not stop until there is nothing worth fixing left.
You're done when:
- As few special cases are left in the system as possible. How many remain is the best measure of how close you are.
- A typical change lands in one place.
- Every import is reasonable, and nothing imports anything more volatile than itself.
- Subagents have no issues left that are worth fixing.
- Intended behavior is the same as when you started, apart from bugs the refactor fixed. Test this at the end.
Tips
- Start from a skeleton: script away the function bodies, so the whole codebase fits in context.
- Summarize with subagents: have them summarize parts of the codebase, so you can reason across all of it at once.
- Check the dependency graph often: script one that shows what imports what, and rerun it as you go.
- Enter where leverage is highest: start looking there first.
- Keep a decision log: compaction is less of a problem that way.
- Use Git as evidence: for how often pieces change, and what changes together.
<a id="decision-log-example"></a>Decision log example
The list of problems:
- `ui/LogoutDialog.tsx:30` waits 100ms after closing and hopes the message input can take focus by then.
- `ui/Toolbar.tsx:40` and `ui/Menu.tsx:22` call the same actions, each with its own check for when they're disabled.
- `checkout/submit.ts:9` depends directly on `payments/stripe.ts`.
- `shortcuts/keymap.ts:18` has a switch with one case per action, separate from the menu's list.
- `ui/CommandPalette.tsx:55` keeps its own list of actions, and it's missing the newer ones.
- `ui/SettingsDialog.tsx:61` sets a global `skipRefocus` flag to stop the logout dialog it opens from sending focus to the message input.
- `history/undo.ts:30` has a special case for every action that can be undone.
- `refunds/refund.ts:22` wraps every Stripe call in `if (order.provider === "paypal")`.
- Every action handler has to call `track()` by hand, and some don't.
- `ui/Toolbar.test.tsx` and `ui/Menu.test.tsx` test the same actions separately.Then with the fixes:
- Make the general `Dialog` give focus back to whatever had it before it opened, so the wait and the flag can both go.
- `ui/LogoutDialog.tsx:30` waits 100ms after closing and hopes the message input can take focus by then.
- `ui/SettingsDialog.tsx:61` sets a global `skipRefocus` flag to stop the logout dialog it opens from sending focus to the message input.
- Define a `PaymentProvider` interface that Stripe and PayPal both implement, so checkout and refunds no longer know which one they're using.
- `checkout/submit.ts:9` depends directly on `payments/stripe.ts`.
- `refunds/refund.ts:22` wraps every Stripe call in `if (order.provider === "paypal")`.
- Make every user action a command with a name, a handler and an undo, so the toolbar, menu, shortcuts, palette and undo history all run from one list.
- `ui/Toolbar.tsx:40` and `ui/Menu.tsx:22` call the same actions, each with its own check for when they're disabled.
- `shortcuts/keymap.ts:18` has a switch … (nội dung đầy đủ có trong gói tải về)
Skill liên quan
- user-thoughts – Lưu các quyết định của người dùng và ràng buộc dự án vào mdbase qua các phiên làm việc…
- using-agent-skills – Meta-skill để khám phá và gọi đúng agent skill cho công việc hiện tại, áp dụng ngay khi…
- using-lwc – Dùng khi các quyết định dự án, cấu trúc code, nghiên cứu, sự cố hoặc ngữ cảnh đã xác…
- using-n8n-mcp-skills – Định tuyến các tác vụ n8n MCP (thiết kế, chỉnh sửa, xác thực, kiểm thử, triển khai…
- using-superpowers – Dùng khi chọn các skill phù hợp cho tác vụ và thiết lập quy trình chọn skill.
- vercel-automation – Tự động hóa các tác vụ Vercel qua Rube MCP (Composio): quản lý deployment, domain, DNS…
- voice-agents – Voice agent là mặt tiền tiên tiến nhất của tương tác AI — con người nói chuyện tự nhiên…
- voice-ai-development – Chuyên gia xây dựng ứng dụng voice AI — từ voice agent thời gian thực đến ứng dụng có…