Install
openclaw skills install pocket-bookRecord, query, complete, correct, and undo personal bookkeeping entries through short natural-language conversation, with local JSONL and Markdown persistenc...
openclaw skills install pocket-bookUse this skill to operate a personal ledger in a low-friction conversational flow. Prefer fast capture, local persistence, and safe correction over perfect upfront completeness.
Keep the ledger append-only. Persist the source utterance, support incomplete entries, and recover a current view by replaying events.
Trigger this skill only when the user is acting on a personal ledger.
Trigger immediately for:
记账, 记一笔, 入账, 查账, 汇总, 统计, 补全上一笔, 改上一笔, 撤销上一笔午饭28, 地铁4元, 工资到账12000, 退款80, 招行转支付宝500今天花了多少, 本月餐饮多少, 最近三笔, 按类别统计, Top 支出Ask one brief confirmation before triggering when confidence is only medium, for example:
28块Do not trigger for:
记一下明天开会帮我做个记账系统If the user is designing or debugging bookkeeping software instead of using the ledger, stay in normal coding or discussion mode and do not use this skill.
When trigger confidence is unclear, read references/intent-examples.md.
Treat the ledger as an event stream, not as mutable rows.
Use these event types:
create for new entriesupdate for corrections or completionrevert for undoPersist all facts in ledger.jsonl. Treat personal_finance.md as a derived human-readable view that can be regenerated at any time.
Pick a stable local directory on persistent storage. If the user does not provide one, default to ~/.openclaw/pocketbook/default.
Keep these files in the same data root:
ledger.jsonlpersonal_finance.mdprofile.json for user defaults and aliasesUse the same --data-dir for every script invocation in the session.
Extract as many of these fields as possible from the user utterance:
entry_type: expense, income, refund, or transferamountoccurred_atcategorypayment_methodaccountmerchantnoteRequire amount. If it is missing, ask for it.
Default the date or time to now in Asia/Shanghai when the user does not specify it, and add the inferred field name to inferred_fields.
If profile.json exists, use its defaults and aliases before falling back to unknown. This is the preferred place for normalizing terms such as 微信 -> wechat or 招行 -> cmb.
Allow category, payment_method, and account to be missing. Persist them as unknown, mark the entry incomplete, and continue without extra questions unless the user explicitly wants a precise record right now.
Set needs_review when:
After capture, reply briefly with what was stored and what remains to be completed.
Use the query script to answer questions like:
Apply these semantics consistently:
花了多少 means expense total only净流出 means expense - refundtransfer does not count as spending unless the user explicitly asks for transfersWhen the user asks to fill in missing details, list pending entries first if needed, then update the target entry. Prefer 上一笔 or 最近 N 笔 resolution over guessing.
Treat an entry as pending when any of these are true:
status is incompleteneeds_review is truecategory, payment_method, or account is unknownNever rewrite or delete existing lines in ledger.jsonl.
Use update events to modify the current state of an entry. Use revert events to undo an entry.
If 上一笔 could refer to more than one plausible entry, show the recent candidates and ask the user to choose. Do not silently edit the wrong entry.
Read references/schema.md before changing the JSON payload shape.
Use these scripts:
python scripts/append_ledger.py create --data-dir <dir> --payload <json-file-or->python scripts/append_ledger.py update --data-dir <dir> --payload <json-file-or->python scripts/append_ledger.py revert --data-dir <dir> --payload <json-file-or->python scripts/query_ledger.py recent --data-dir <dir> --limit 5python scripts/query_ledger.py summary --data-dir <dir> --period todaypython scripts/query_ledger.py pending --data-dir <dir> --limit 10python scripts/edit_recent.py update-last --data-dir <dir> --payload <json-file-or->python scripts/edit_recent.py revert-last --data-dir <dir> --payload <json-file-or->python scripts/render_finance_md.py --data-dir <dir>python scripts/profile_manager.py show --data-dir <dir>python scripts/profile_manager.py set-default --data-dir <dir> --field payment_method --value wechatpython scripts/profile_manager.py set-alias --data-dir <dir> --field account --alias 招行 --value cmbPass structured payloads to scripts. Do not ask the scripts to interpret free-form language.
Keep replies short and ledger-oriented.
Good confirmation style:
已记:今天午饭 28.00 元,分类餐饮,支付方式待补充。已撤销最近一笔:地铁 4.00 元。今天支出 86.00 元,其中餐饮 58.00 元。If the scripts surface duplicate candidates, warn briefly and let the user decide whether this is a second entry or a duplicate.