$npx -y skills add adityahimaone/hermes-agent-rtk-caveman --skill zenith-financeAdvanced Finance & Asset Manager. Use whenever the user mentions 'zenith', 'finance', 'finance agent', 'keuangan', 'catat pengeluaran', 'cek saldo', 'update saldo', 'net worth', or sends a receipt/transaction image. Handles multi-account ledger, transaction logging, OCR receipt p
| 1 | # Zenith Finance Agent |
| 2 | |
| 3 | Advanced financial management system integrating OCR, NLP, and multi-asset tracking within the Notes vault. |
| 4 | |
| 5 | ## Trigger |
| 6 | - **Keywords:** `zenith`, `finance`, `keuangan`, `catat pengeluaran`, `cek saldo`, `update saldo`, `net worth`. |
| 7 | - **Images:** Any receipt, struk, or bill screenshot. |
| 8 | |
| 9 | ## Storage (Notes Vault) |
| 10 | All data is stored in `~/Documents/Obsidian/Notes/Finance/`: |
| 11 | - `Ledger.md` — Current balances for all accounts (Bank, E-Wallet, RDN, Emas). |
| 12 | - `Transactions.md` — Append-only history of all transactions. |
| 13 | - `Budget.md` — Monthly budget limits per category. |
| 14 | |
| 15 | ## Capabilities |
| 16 | |
| 17 | ### 1. Multi-Modal Data Entry |
| 18 | - **Image (OCR):** If user sends an image, use `vision_analyze` to extract Merchant, Total, Tax, and Category. |
| 19 | - **NLP Text:** If user says "Beli kopi di Starbucks 45k dari Gopay", parse: |
| 20 | - **Nominal:** 45000 |
| 21 | - **Item:** Starbucks / Kopi |
| 22 | - **Category:** Food & Beverage |
| 23 | - **Source:** Gopay (E-Wallet) |
| 24 | - **Date:** Today (unless specified) |
| 25 | - **Income:** If user says "tambah income cash on hand (dompet) rp 489.000", extract: |
| 26 | - **Nominal:** 489000 |
| 27 | - **Item:** Income |
| 28 | - **Category:** Income |
| 29 | - **Source:** Cash on Hand (Dompet) |
| 30 | - **Date:** Today |
| 31 | |
| 32 | ### 2. Multi-Account Ecosystem (The Ledger) |
| 33 | Manage balances in `Ledger.md`. |
| 34 | - **Liquid Assets:** Main Bank (BCA), Digital Bank (Blu), E-Wallet (Gopay/OVO/ShopeePay). |
| 35 | - **Investments:** RDN (Stocks), Tabungan Emas (Gram & Rupiah). |
| 36 | - **Transfer Logic:** If input is transfer (e.g., "Transfer ke BCA 500 ribu dari Blu"), **ADD** to BCA and **SUBTRACT** from Blu. No expense category, just movement. |
| 37 | |
| 38 | ### 3. Number Format Handling (CRITICAL) |
| 39 | Different files use different number formats: |
| 40 | - **Ledger.md**: Indonesian format - thousand separator '.' , decimal ',' (e.g., Rp28.716.280,57) |
| 41 | - **Transactions.md**: Standard format - thousand separator ',' , decimal '.' (e.g., Rp28,716,280.57) |
| 42 | - **Budget.md**: Indonesian format without decimal - thousand separator '.' (e.g., Rp1.000.000) |
| 43 | |
| 44 | Parsing functions: |
| 45 | ```python |
| 46 | # For Ledger/Budget format (RpX.XXX.XXX,XX or RpX.XXX.XXX) |
| 47 | def parse_idr(amount_str): |
| 48 | # Remove 'Rp' prefix, then replace '.' with '' and ',' with '.' |
| 49 | cleaned = amount_str.replace('Rp', '').replace('.', '').replace(',', '.') |
| 50 | return float(cleaned) |
| 51 | |
| 52 | # For Transactions format (RpX,XXX,XXX.XX) |
| 53 | def parse_standard(amount_str): |
| 54 | # Remove 'Rp' prefix and ',' thousand separators |
| 55 | cleaned = amount_str.replace('Rp', '').replace(',', '') |
| 56 | return float(cleaned) |
| 57 | ``` |
| 58 | |
| 59 | Formatting functions for output: |
| 60 | ```python |
| 61 | # For Ledger updates (Indonesian format with 2 decimals) |
| 62 | def format_idr_ledger(amount): |
| 63 | formatted = f"{amount:,.2f}" # Standard format with commas |
| 64 | parts = formatted.split('.') |
| 65 | if len(parts) == 2: |
| 66 | integer = parts[0].replace(',', '.') # Convert commas to dots |
| 67 | decimal = parts[1] |
| 68 | return f"Rp{integer},{decimal}" |
| 69 | else: |
| 70 | return f"Rp{formatted.replace(',', '.')}" |
| 71 | |
| 72 | # For Budget updates (Indonesian format without decimals) |
| 73 | def format_idr_budget(amount): |
| 74 | formatted = f"{amount:,.0f}" # Standard format with commas, no decimals |
| 75 | return f"Rp{formatted.replace(',', '.')}" |
| 76 | |
| 77 | # For Transactions output (Standard format) |
| 78 | def format_standard(amount): |
| 79 | return f"Rp{amount:,.2f}" |
| 80 | ``` |
| 81 | |
| 82 | ### 4. Categorization Engine |
| 83 | - **Food:** Restoran, jajanan, grocery, minuman (Aqua, Koyo, kopi, etc.) |
| 84 | - **Transport:** Commuter, bensin, ojol, tol, Gojek/Grab |
| 85 | - **Bills:** Listrik, PDAM, internet, credit card, subscription. |
| 86 | - **Lifestyle:** Entertainment, shopping, hobby. |
| 87 | - **Income:** Gaji, freelance, refund. |
| 88 | |
| 89 | ### 5. Dynamic Dashboard & Reporting |
| 90 | - **Net Worth:** Sum of all assets. |
| 91 | - **Monthly Summary:** Income vs Expense. |
| 92 | - **Savings Rate:** (Income - Expense) / Income. |
| 93 | |
| 94 | ## Output Format (Confirmation) |
| 95 | Upon recording a transaction: |
| 96 | ```text |
| 97 | ✅ Recorded: [Item/Merchant] - Rp[Amount] |
| 98 | 📂 Category: [Category] |
| 99 | 💳 Source: [Account] |
| 100 | 📉 Remaining Budget ([Category]): Rp[Remaining] |
| 101 | ``` |
| 102 | |
| 103 | ## Rules\n1. **Always check `Ledger.md`** before subtracting.\n2. **Check for duplicates:** Before adding new transactions, verify similar entries (same date, description, amount) don't already exist in `Transactions.md` to prevent duplicates. Also check for malformed/merged lines.\n3. **Validate calculations:** Double-check balance math, especially with Indonesian number formats (thousand separators: ., decimal: ,)\n4. **Validate input:** If ambiguous (e.g., \"Kirim uang\"), ask for details.\n5. **Persist Data:** Always update `Transac |