ynab-review — for Claude Code ynab-review, bank-statement-wrangler, community, for Claude Code, ide skills, **DuckDB for reads** — query, utils:ynab__updateTransactions, call_tool_destructive, ynab-dump --since <window>, ynab__

v1.0.0

关于此技能

适用场景: Ideal for AI agents that need ynab transaction review skill. 本地化技能摘要: Utility script to help wrangle some bank statements into format imported to YNAB. This AI agent skill supports Claude Code, Cursor, and Windsurf workflows.

功能特性

YNAB Transaction Review Skill
ynab-dump CLI → staging/transactions.json → DuckDB queries (READ)
classify + present
YNAB MCP (WRITE only)
Staging data: user runs ynab-dump --since <window before invoking this skill

# 核心主题

luutuankiet luutuankiet
[0]
[0]
更新于: 4/5/2026

Killer-Skills Review

Decision support comes first. Repository text comes second.

Reference-Only Page Review Score: 10/11

This page remains useful for teams, but Killer-Skills treats it as reference material instead of a primary organic landing page.

Original recommendation layer Concrete use-case guidance Explicit limitations and caution Quality floor passed for review
Review Score
10/11
Quality Score
70
Canonical Locale
en
Detected Body Locale
en

适用场景: Ideal for AI agents that need ynab transaction review skill. 本地化技能摘要: Utility script to help wrangle some bank statements into format imported to YNAB. This AI agent skill supports Claude Code, Cursor, and Windsurf workflows.

核心价值

推荐说明: ynab-review helps agents ynab transaction review skill. Utility script to help wrangle some bank statements into format imported to YNAB. This AI agent skill supports Claude Code, Cursor, and Windsurf workflows.

适用 Agent 类型

适用场景: Ideal for AI agents that need ynab transaction review skill.

赋予的主要能力 · ynab-review

适用任务: Applying YNAB Transaction Review Skill
适用任务: Applying ynab-dump CLI → staging/transactions.json → DuckDB queries (READ)
适用任务: Applying classify + present

! 使用限制与门槛

  • 限制说明: YNAB MCP (WRITE only)
  • 限制说明: Requires repository-specific context from the skill documentation
  • 限制说明: Works best when the underlying tools and dependencies are already configured

Why this page is reference-only

  • - Current locale does not satisfy the locale-governance contract.

Source Boundary

The section below is imported from the upstream repository and should be treated as secondary evidence. Use the Killer-Skills review above as the primary layer for fit, risk, and installation decisions.

评审后的下一步

先决定动作,再继续看上游仓库材料

Killer-Skills 的主价值不应该停在“帮你打开仓库说明”,而是先帮你判断这项技能是否值得安装、是否应该回到可信集合复核,以及是否已经进入工作流落地阶段。

实验室 Demo

Browser Sandbox Environment

⚡️ Ready to unleash?

Experience this Agent in a zero-setup browser environment powered by WebContainers. No installation required.

Boot Container Sandbox

常见问题与安装步骤

以下问题与步骤与页面结构化数据保持一致,便于搜索引擎理解页面内容。

? FAQ

ynab-review 是什么?

适用场景: Ideal for AI agents that need ynab transaction review skill. 本地化技能摘要: Utility script to help wrangle some bank statements into format imported to YNAB. This AI agent skill supports Claude Code, Cursor, and Windsurf workflows.

如何安装 ynab-review?

运行命令:npx killer-skills add luutuankiet/bank-statement-wrangler/ynab-review。支持 Cursor、Windsurf、VS Code、Claude Code 等 19+ IDE/Agent。

ynab-review 适用于哪些场景?

典型场景包括:适用任务: Applying YNAB Transaction Review Skill、适用任务: Applying ynab-dump CLI → staging/transactions.json → DuckDB queries (READ)、适用任务: Applying classify + present。

ynab-review 支持哪些 IDE 或 Agent?

该技能兼容 Cursor, Windsurf, VS Code, Trae, Claude Code, OpenClaw, Aider, Codex, OpenCode, Goose, Cline, Roo Code, Kiro, Augment Code, Continue, GitHub Copilot, Sourcegraph Cody, and Amazon Q Developer。可使用 Killer-Skills CLI 一条命令通用安装。

ynab-review 有哪些限制?

限制说明: YNAB MCP (WRITE only);限制说明: Requires repository-specific context from the skill documentation;限制说明: Works best when the underlying tools and dependencies are already configured。

安装步骤

  1. 1. 打开终端

    在你的项目目录中打开终端或命令行。

  2. 2. 执行安装命令

    运行:npx killer-skills add luutuankiet/bank-statement-wrangler/ynab-review。CLI 会自动识别 IDE 或 AI Agent 并完成配置。

  3. 3. 开始使用技能

    ynab-review 已启用,可立即在当前项目中调用。

! 参考页模式

此页面仍可作为安装与查阅参考,但 Killer-Skills 不再把它视为主要可索引落地页。请优先阅读上方评审结论,再决定是否继续查看上游仓库说明。

Upstream Repository Material

The section below is imported from the upstream repository and should be treated as secondary evidence. Use the Killer-Skills review above as the primary layer for fit, risk, and installation decisions.

Upstream Source

ynab-review

Utility script to help wrangle some bank statements into format imported to YNAB. This AI agent skill supports Claude Code, Cursor, and Windsurf workflows.

SKILL.md
Readonly
Upstream Repository Material
The section below is imported from the upstream repository and should be treated as secondary evidence. Use the Killer-Skills review above as the primary layer for fit, risk, and installation decisions.
Supporting Evidence

YNAB Transaction Review Skill

Purpose

Batch-review unapproved YNAB transactions: auto-approve matched, detect cross-account duplicates, classify by memo patterns, and present ambiguous items for user decision. Designed for Vietnamese bank statements (TCB, SCB, MoMo) imported via bank-statement-wrangler pipeline.

Architecture

ynab-dump CLI → staging/transactions.json → DuckDB queries (READ)
                                                    ↓
                                          classify + present
                                                    ↓
                                          YNAB MCP (WRITE only)

DuckDB for reads — query staging/transactions.json via fs:query_duckdb tool. Full SQL: JOINs, GROUP BY, window functions, CTEs. No 80KB truncation, no narrow date windows.

YNAB MCP for writesutils:ynab__updateTransactions via call_tool_destructive for approvals, categorization, memo updates, transfer conversion.

Prerequisites

  • Staging data: user runs ynab-dump --since <window> before invoking this skill
  • YNAB MCP tools on utils server, prefix ynab__, use call_tool_destructive
  • DuckDB query tool on fs server: fs:query_duckdb via call_tool_read
  • Discover tools with: retrieve_tools("ynab budget transactions") and retrieve_tools("duckdb query")

Staging JSON Path

scripts/bank-statement-wrangler/staging/transactions.json

All DuckDB queries use this path. Shorthand in examples below: TXN_JSON.


Execution Protocol

Phase 0: Verify Staging Data

Before anything, confirm staging data exists and is fresh:

sql
1SELECT 2 COUNT(*) AS total, 3 MIN(date) AS earliest, 4 MAX(date) AS latest, 5 SUM(CASE WHEN approved = false THEN 1 ELSE 0 END) AS unapproved, 6 SUM(CASE WHEN approved = false AND matched_transaction_id IS NOT NULL THEN 1 ELSE 0 END) AS matched_unapproved 7FROM read_json_auto('scripts/bank-statement-wrangler/staging/transactions.json') 8WHERE deleted = false

If no data or stale dates → ask user to run ynab-dump --since <window>.

Phase 1: Auto-Resolve (no user input needed)

Step 1.1: Bulk approve matched transactions

Matched = matched_transaction_id IS NOT NULL and approved = false. These are bank-imported transactions that YNAB already paired with manual entries. Approve immediately, zero review needed.

sql
1SELECT id, account_name, date, memo, amount/1000 AS amount_vnd 2FROM read_json_auto('TXN_JSON') 3WHERE deleted = false 4 AND approved = false 5 AND matched_transaction_id IS NOT NULL 6ORDER BY account_name, date

Collect all IDs → batch updateTransactions with {id, approved: true} (max 50 per call).

Step 1.2: Detect cross-account duplicates/transfers

Find transaction pairs across different accounts with same |amount| within ±3 days, where at least one side is unapproved:

sql
1WITH txns AS ( 2 SELECT *, amount/1000 AS amount_vnd 3 FROM read_json_auto('TXN_JSON') 4 WHERE deleted = false 5) 6SELECT 7 a.id AS id_a, a.account_name AS acct_a, 8 b.id AS id_b, b.account_name AS acct_b, 9 a.date AS date_a, b.date AS date_b, 10 a.amount_vnd AS amt_a, b.amount_vnd AS amt_b, 11 a.memo AS memo_a, b.memo AS memo_b, 12 a.approved AS appr_a, b.approved AS appr_b 13FROM txns a 14JOIN txns b 15 ON ABS(a.amount) = ABS(b.amount) 16 AND a.account_id != b.account_id 17 AND a.amount != 0 18 AND ABS(DATE_DIFF('day', a.date::DATE, b.date::DATE)) <= 3 19 AND a.id < b.id 20WHERE NOT (a.approved AND b.approved) 21ORDER BY a.date DESC, ABS(a.amount) DESC

Present to user as table. Possible actions per pair:

  • Confirmed transfer → convert both sides: set payee_id to destination account's transfer payee
  • Confirmed duplicate → delete the imported copy
  • Not related → proceed to classify individually (coincidental amount match)

Phase 2: Classify Unmatched (subagent-parallelizable)

⚠️ BLOCKING: Phase 1.2 (duplicates) must COMPLETE before spawning Phase 2 subagents. Running them in parallel caused SCB "CIA CASH IN" records to be classified as MoMo transfers when they were actually duplicates of approved TCB records. The duplicates agent identifies which transactions to EXCLUDE from classification.

After Phase 1, query remaining unmatched unapproved per account:

sql
1SELECT id, date, amount/1000 AS amount_vnd, memo, 2 category_name, payee_name, account_name 3FROM read_json_auto('TXN_JSON') 4WHERE deleted = false 5 AND approved = false 6 AND matched_transaction_id IS NULL 7 AND account_name LIKE '%tcb%' -- or '%scb%' for SCB subagent 8ORDER BY date

Subagent strategy: Spawn parallel subagents per account, each with:

  • This skill's pattern rules (copy the Auto-Categorization Rules section)
  • The DuckDB query tool access
  • Account filter in their query
  • Category/account ID tables
  • Instructions to return a JSON array of {id, category_id, approved: true, memo?} objects

Classification tiers:

  1. Auto-categorize — high-confidence pattern match → include in batch
  2. Ambiguous — return to main agent for user presentation

Phase 3: Present & Execute

Step 3.1: Present ambiguous items

DO NOT use AskUserQuestion for multi-item reviews. Present as inline markdown table:

| # | Account | Date | Memo | Amount | Proposed |
|---|---------|------|------|--------|----------|

Let user respond naturally in chat with decisions.

Step 3.2: Execute updates

Batch all confirmed categorizations into updateTransactions calls (max 50 per call):

javascript
1call_tool('utils', 'ynab__updateTransactions', { 2 plan_id: 'last-used', 3 transactions: [ 4 {id: 'uuid', category_id: 'cat-uuid', approved: true}, 5 {id: 'uuid', category_id: 'cat-uuid', memo: 'Human-readable memo', approved: true}, 6 {id: 'uuid', payee_id: 'transfer-payee-uuid', approved: true} 7 ] 8});

Memo updates: When original memo is cryptic (e.g., QR S624260M, MCCVMAYBIHYPKNP 464728034) and user identifies it, include a memo field with human-readable description.

Step 3.3: Verify

User re-runs ynab-dump → check counts drop to zero. Or query staging directly if user hasn't re-dumped:

sql
1SELECT account_name, COUNT(*) AS remaining 2FROM read_json_auto('TXN_JSON') 3WHERE deleted = false AND approved = false 4GROUP BY 1 ORDER BY 2 DESC

Note: staging data is a snapshot — approvals via MCP won't reflect until next dump. Use this query only as pre-dump sanity check against the user's in-session notes.


Auto-Categorization Rules

TCB Memo Patterns

Memo PatternCategoryAction
OP*XanhSM or XanhSMBiz travelcategory_id
Grab*Biz travelcategory_id
CASHIN \d+ 0903194808Transfer → MoMopayee_id = MoMo transfer
LUU TUAN KIET chuyen⚠️ AMBIGUOUSCould be wallet transfer, biz travel, or sis allowance — ASK
T.Toan QR - taiLikely foodAsk if unsure
GD THE TREN INTERNET...TAI {merchant}Parse merchant nameMap to category
GD THE QUA POS...TAI {merchant}Parse merchant nameMap to category
Credit Int from Another AccIncome / FU moneyAsk user
{person} chuyen tienIncoming transferCheck personal context
PAYMENT FOR SALARYIncomeApprove without category → Ready to Assign
TRO CAP TETIncome (Tet bonus)Approve without category → Ready to Assign
Interest amount❗️Stuff I forgot to budget forBank interest
PHARMACITY❗️Stuff I forgot to budget forPharmacy
GITHUB, INC.🧐WIG toolsDev subscription

TCB Food Keywords (in memo → 🛒 food & drinks)

cafe, coffee, pho, mi, bun, com, banh, hu tiu, caztus, doner, kebab, bap rang, bap, bot chien, matcha, cookie, com tam, tra sua, sinh to, tau hu, oc, lau, nem, nui, taco, pizza, breakfast, snack, snacks, groceries, bluish, hadilao, bon chon, spicy box

TCB Merchant Keywords (in POS/Internet memo → 🛒 food & drinks)

HIGHLANDS, 7-ELEVEN, MINISTOP, CARL JR, METRO HCM, PAYOO, FAMIMA, CIRCLE K, GS25, THUC COFFEE, QUAY NFK

SCB Memo Patterns

Memo PatternCategoryNotes
...THE 422151XXXXXX9444...Grab*Biz travelInternational card
...THE 422151XXXXXX9444...IFTTT📊 BI
...THE 422151XXXXXX9444...YOU NEED A BUDGET🌳 YNAB subscription
...THE 422151XXXXXX9444...CLAUDE.AILLMClaude subscription
...THE 422151XXXXXX9444...OPENAILLMChatGPT subscription
...THE 422151XXXXXX9444...HETZNER📊 BIHosting
...THE 422151XXXXXX9444...GOOGLE*CLOUD📊 BIGCP
...THE 422151XXXXXX9444...BACKBLAZEB2 cloud storageCloud backup
...THE 422151XXXXXX9444...GITHUB🧐WIG toolsDev subscription
...THE 422151XXXXXX9444...GS25🛒 food & drinksConvenience store
CR{date}-ANTHROPICLLMAnthropic refund/credit (inflow)
MM\d+ CIA CASH IN-0903194808Transfer → MoMo OR duplicate⚠️ PRE-CHECK: extract txn ID from memo, query TCB for matching Nạp tiền...{same txn ID}. If TCB match exists AND approved → SCB is a DUPLICATE, delete it. If no TCB match → genuine SCB→MoMo transfer.
PHI T\d+/\d+-Bank fee❗️Stuff I forgot to budget for
CHI LAI TK TIEN GUIRefund/interest❗️Stuff I forgot to budget for
Same memo + 10,000₫ feeSame category as main chargeSCB adds separate fee row for foreign charges

MoMo Memo Patterns

Memo PatternCategoryAction
Gói xem phim Netflix📺 netflixcategory_id
Điện lực Hồ Chí Minhelectric & watercategory_id
Nước Tân Hoàelectric & watercategory_id
Thanh toán Google📊 BIcategory_id
Thanh toán Apple Services📊 BIcategory_id
Nạp tiền điện thoại Mobifone📱 Phonecategory_id
Thanh toán XANH SM / Thanh toán beBiz travelcategory_id
Nạp tiền vào ví từ TechcombankTransfer from TCBpayee_id = TCB transfer
Nạp tiền vào ví từ SacombankTransfer from SCBpayee_id = SCB transfer
Nạp tiền vào Ví để thanh toán dịch vụTransfer from TCBBill auto-debit top-up, default bank
Thanh toán NGUYỄN ĐẶNG BÍCH CHI🛒 food & drinksCafe purchases
Thanh toán Mua vé xem phim🍽️ Date & dineMovie date

Account IDs

AccountIDTransfer Payee ID
🔴tcb59c7a8a2-2242-4fab-95d9-d6a24bdee35c962ff7c0-725c-410b-a2ff-f8edd3264abb
🔵scb4a6175f8-ba3e-4dee-a3db-8ccd3d087d6900bfefa1-1b3a-4398-945e-69dd0fac037c
🎟️momof0014267-18eb-4ca4-a01a-d1f1350c37688ec03915-4081-418c-8958-414d0fcb5b97
💸walleta837e9a3-a651-40ec-9640-74ad72ac7667e4d53712-a633-4edb-acea-f04026806f2a
🟢vcb29496fb1-75b0-435b-941f-aa09c1fa2136573d1e4b-c5c1-40ee-8a62-c2189367d513

Category IDs

CategoryID
🛒 food & drinkse0113187-1adb-411e-b335-5e172088c757
🍽️ Date & dine4453f8e7-eabc-40c5-bf4f-9edd825e96bf
Biz travel6e11f0d6-f55d-4036-8430-a1ac8cd42f03
📊 BI55bd34da-dce1-4ff2-834d-869085086d97
📱 Phone79c74407-a2e2-481f-b914-558df817ffa6
📺 netflixd02b4646-65e7-494c-9f1e-77720a218a71
electric & water336c5a02-6065-4a59-86fb-b2151d9b2d37
🌳 YNAB subscriptiondd32f3e7-787c-448c-8352-db62c572f4d4
🧐WIG tools79131af0-ff3b-47dd-9b8c-2c7601627fc4
⛽️ Gas38ce93cd-417c-45f8-afaa-6fa8aab36a21
Sis allowancea5348013-eae0-4406-89f9-1625c3cfffe1
FU moneyce164a88-8d4c-42fb-bbfe-aafc46964ad5
🍿 Entertainment17ee52cf-5245-4cb4-b56c-28916e9084d2
❗️Stuff I forgot to budget for7e257345-66c5-484f-a5aa-3ccbae0992ad
Uncategorizeda9bc5299-4cd3-4734-8a99-5294d81d4239
LLM5cbbe75e-88c5-4a2d-a917-f476a4affc89
🎁 family support292d5dd0-23e2-4563-9d85-95eb05c95093
B2 cloud storage90cac504-ee08-4e30-a1f7-9dbb04183e1d
cloudfare domain780d23b5-b7b6-4fc4-870c-cb062e060b2a
🎊 Celebrationsget from API if needed

Personal Context (CRITICAL — DO NOT LOSE)

Name / PatternWhoDefault Category
NGUYỄN ĐẶNG BÍCH CHIAcquaintance🛒 food & drinks (cafe)
QUANG BOI KHAGirlfriend🍽️ Date & dine
DO NGUYEN LAM GIANGWork colleagueBiz travel
LUU TUAN KIETUser's own name⚠️ AMBIGUOUS — could be wallet transfer, biz expense, or sis allowance. ASK.
0903194808User's MoMo phoneUsed in CASHIN patterns
NGUYEN HOANG LONGFood vendor (QR)🛒 food & drinks
NGUYEN THI THANHVietQR merchant🛒 food & drinks (small amounts)
NGUYEN LE MINH NGOCVietQR merchant🛒 food & drinks
NGUYEN THI BICH HANGUnknown — reimbursement🛒 food & drinks
CDJOONEmployerIncome → Ready to Assign

Vietnamese Memo Decoder

Vietnamese PatternEnglish Meaning
GD THE TREN INTERNET SO THE...NGAY...TAIOnline card payment on [date] at [merchant]
GD THE QUA POS SO THE...NGAY...TAIPOS card payment on [date] at [merchant]
T.Toan QR - taiQR code payment at [location]
CASHIN {id} {phone}MoMo wallet top-up
{name} chuyen tien / {name} chuyenPerson-to-person transfer
Credit Int from Another AccInterest or transfer from savings account
Nạp tiền vào Ví để thanh toán dịch vụMoMo auto-debit from bank to pay bill
Nạp tiền vào ví từ {bank}Manual MoMo top-up from specific bank
Nạp tiền điện thoạiPhone credit top-up
Thanh toán {merchant}MoMo payment to merchant
Tái tục Bảo hiểmInsurance renewal
MM{id} CIA CASH INSCB-side memo for MoMo top-up
Điện lựcElectricity
NướcWater

Workflow Efficiency Rules

  1. DuckDB for reads, MCP for writes. Never use YNAB MCP for reading transactions.
  2. Matched = auto-approve. Zero user input. Execute first.
  3. ⚠️ Duplicates BLOCK categorization. Phase 1.2 must COMPLETE before spawning Phase 2 subagents. Running them in parallel causes SCB CIA CASH IN records to be misclassified as transfers when they're actually duplicates of TCB records.
  4. Subagents per account with >0 unapproved. Skip accounts with 0 unapproved for classification (e.g., MoMo). But ALL accounts (including 0-unapproved ones) must be in Phase 1.2 duplicate scan — approved MoMo/wallet txns are counterparts to unapproved SCB/TCB records.
  5. Batch updates ≤ 50 per updateTransactions call.
  6. No AskUserQuestion for reviews. Use inline markdown tables with account column.
  7. Execute in rounds: matched → duplicates → auto-patterns → present ambiguous → user confirms → execute.
  8. SCB fee pairing: Foreign charge + identical memo at -10,000₫ → categorize both the same.
  9. MoMo bill pairs: Outflow (payment) + inflow (top-up) come together. Categorize outflow, convert inflow to transfer.
  10. Memo updates: When user identifies a cryptic memo, include human-readable memo field in the update.
  11. Verify via re-dump. User runs ynab-dump again after each round to confirm counts.
  12. Salary/income inflows. Approve without setting category_id — YNAB routes uncategorized inflows to "Ready to Assign" automatically.
  13. SCB CIA CASH IN dedup. Before classifying as MoMo transfer, extract txn ID from memo and check if TCB has a matching approved Nạp tiền...{txn ID}. If match → SCB is a duplicate, delete it. This is the #1 source of double-counting.

Subagent Prompt Template

When spawning per-account classification subagents, inject:

## Task: Classify {ACCOUNT} unapproved transactions

Query staging data via DuckDB, classify each transaction, return results.

### Tool Access
- `fs:query_duckdb` via `mcp__proxy__call_tool_read` — SQL on staging JSON
- Staging path: scripts/bank-statement-wrangler/staging/transactions.json

### Your Query
SELECT id, date, amount/1000 AS amount_vnd, memo, category_name, payee_name
FROM read_json_auto('scripts/bank-statement-wrangler/staging/transactions.json')
WHERE deleted = false AND approved = false AND matched_transaction_id IS NULL
  AND account_name LIKE '%{ACCOUNT_FILTER}%'
ORDER BY date

### Classification Rules
{PASTE AUTO-CATEGORIZATION RULES FOR THIS ACCOUNT}
{PASTE FOOD KEYWORDS}
{PASTE PERSONAL CONTEXT}
{PASTE VIETNAMESE MEMO DECODER}

### Category IDs
{PASTE CATEGORY ID TABLE}

### Output Format
Return TWO lists:
1. **auto_categorize** — JSON array, one object per line. Main agent will paste directly into `updateTransactions`:
   ```json
   {"id": "full-uuid", "category_id": "full-uuid", "approved": true}
   {"id": "full-uuid", "payee_id": "full-uuid", "approved": true}
   {"id": "full-uuid", "category_id": "full-uuid", "memo": "human-readable", "approved": true}

CRITICAL: Use full UUIDs from the query results — no placeholders, no abbreviations.

  1. ambiguous — markdown table with full IDs so main agent can execute without re-querying: | # | ID | Date | Memo | Amount | Proposed | Why ambiguous |

相关技能

寻找 ynab-review 的替代方案 (Alternative) 或可搭配使用的同类 community Skill?探索以下相关开源技能。

查看全部

openclaw-release-maintainer

Logo of openclaw
openclaw

Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

333.8k
0
AI

widget-generator

Logo of f
f

Generate customizable widget plugins for the prompts.chat feed system

149.6k
0
AI

flags

Logo of vercel
vercel

The React Framework

138.4k
0
浏览器

pr-review

Logo of pytorch
pytorch

Tensors and Dynamic neural networks in Python with strong GPU acceleration

98.6k
0
开发者工具