用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Demerzels-lab/elsamultiskillagent --skill treeline命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
The philosophical layer for AI agents.
Agents can sign plugins, rotate credentials without losing identity, and publicly attest to behavior.
A relaxing resource-gathering RPG where AI agents collect resources, trade with NPCs, and manage and build their world at their own pace.
基于 SOC 职业分类
正在显示 SKILL.md
| name | treeline |
| description | Chat with your finances from Treeline Money. Query balances, spending, budgets, and transactions. |
| version | 0.0.6 |
| user-invocable | true |
| homepage | https://treeline.money |
| metadata | {"clawdbot":{"emoji":"🌲"}} |
Chat with your finances. Ask questions like "What's my net worth?", "How much did I spend on groceries?", or "Am I over budget?" and get instant answers from your own financial data.
# 1. Install the CLI
curl -fsSL https://treeline.money/install.sh | sh
source ~/.zshrc # or restart terminal
# 2. Enable demo mode (sample data)
tl demo on
# 3. Try it out
tl status
For agents: If
tlcommands fail with "command not found", guide the user through installation. Start with demo mode so they can try queries immediately.
Mac/Linux:
curl -fsSL https://treeline.money/install.sh | sh
Windows (PowerShell):
irm https://treeline.money/install.ps1 | iex
Verify with tl --version.
Optional: Download the desktop app for CSV import and visual exploration.
Demo mode loads sample data so users can try queries without connecting a bank:
tl demo on
To switch to real data later:
tl demo off
Demo data is separate from real data.
tl demo on prints a success message — if it seems to hang, wait a few seconds (first run initializes the database)tl demo status to verify demo mode is enabledtl demo on againSimpleFIN ($1.50/month, US & Canada)
tl setup simplefin <setup-token>tl syncLunch Flow (~$3/month, global: US, Canada, Brazil, EU, UK, Asia)
tl setup lunchflow <api-key>tl syncCSV Import (free, requires desktop app)
Treeline Money is a local-first personal finance app. All your data stays on your device in a local DuckDB database. No cloud accounts, no subscriptions required (sync services are optional), full SQL access to your financial data.
Encrypted databases not supported. If the user has enabled database encryption in Treeline, CLI commands will fail. They'll need to either:
If you see "database is encrypted" errors, explain this limitation.
Format all responses for mobile/chat:
Example good response:
Your net worth is $125k
Assets: $180k
- Retirement: $85k
- Savings: $25k
- Checking: $10k
- Home equity: $60k
Liabilities: $55k
- Mortgage: $52k
- Credit cards: $3k
Example bad response:
| Account | Type | Balance |
|---------|------|---------|
| My 401k Account | asset | 85234.56 |
...
The tl CLI can do more than just queries:
tl status # Quick account summary with balances
tl status --json # Same, but JSON output
tl query "SQL" --json # Run any SQL query
tl sync # Sync accounts/transactions from bank integrations
tl sync --dry-run # Preview what would sync
tl backup create # Create a backup
tl backup list # List available backups
tl backup restore NAME # Restore a backup
tl doctor # Check database health
tl compact # Compact database (reclaim space, optimize)
tl tag "groceries" --ids ID1,ID2 # Apply tags to transactions
tl demo on|off # Toggle demo mode (sample data)
Use tl status for quick balance checks — it's faster than a SQL query.
Use tl compact if the user mentions slow queries — it optimizes the database.
Before answering finance questions, check for CONTEXT.md in this skill directory.
If it exists, read it first — it contains user-specific knowledge:
Learning new context: When you discover something about the user's setup:
See the User Context Pattern section at the end for the template.
tl query "
WITH latest AS (
SELECT DISTINCT ON (account_id) account_id, balance
FROM sys_balance_snapshots
ORDER BY account_id, snapshot_time DESC
)
SELECT
SUM(CASE WHEN a.classification = 'asset' THEN s.balance ELSE 0 END) as assets,
SUM(CASE WHEN a.classification = 'liability' THEN ABS(s.balance) ELSE 0 END) as liabilities,
SUM(CASE WHEN a.classification = 'asset' THEN s.balance ELSE -ABS(s.balance) END) as net_worth
FROM accounts a
JOIN latest s ON a.account_id = s.account_id
" --json
tl query "
WITH latest AS (
SELECT DISTINCT ON (account_id) account_id, balance
FROM sys_balance_snapshots
ORDER BY account_id, snapshot_time DESC
)
SELECT a.name, a.classification, a.institution_name, s.balance
FROM accounts a
JOIN latest s ON a.account_id = s.account_id
ORDER BY s.balance DESC
" --json
Check CONTEXT.md for internal_transfer_tags. Default pattern:
tl query "
SELECT SUM(ABS(amount)) as total_spent
FROM transactions
WHERE amount < 0
AND transaction_date >= date_trunc('month', current_date)
AND NOT (tags && ARRAY['transfer', 'savings', 'investment'])
" --json
tl query "
SELECT tags, SUM(ABS(amount)) as spent
FROM transactions
WHERE amount < 0
AND transaction_date >= '2026-01-01' AND transaction_date < '2026-02-01'
AND tags IS NOT NULL AND tags != '[]'
GROUP BY tags
ORDER BY spent DESC
" --json
tl query "
SELECT t.description, t.amount, t.transaction_date, a.name as account
FROM transactions t
JOIN accounts a ON t.account_id = a.account_id
ORDER BY t.transaction_date DESC
LIMIT 10
" --json
accounts
| Column | Description |
|---|---|
account_id | UUID primary key |
name | Account display name |
classification | asset or liability |
account_type | credit, investment, Loan, other, or null |
institution_name | Bank/institution name |
currency | Currency code (e.g., USD) |
is_manual | Boolean — manually added vs synced |
sys_balance_snapshots — Source of truth for balances
| Column | Description |
|---|---|
snapshot_id | UUID primary key |
account_id | FK to accounts |
balance | Balance at snapshot time |
snapshot_time | When recorded |
source | sync, manual, etc. |
transactions
| Column | Description |
|---|---|
transaction_id | UUID primary key |
account_id | FK to accounts |
amount | Signed (negative = expense) |
description | Transaction description |
transaction_date | When it occurred |
posted_date | When it cleared |
tags | Array of tags |
Tags are the primary concept in Treeline — transactions can have multiple tags.
Categories come from the budget plugin (plugin_budget), which maps tags to budget categories. Not all users have this plugin.
Plugins have their own DuckDB schemas: plugin_<name>.*
tl query "
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name LIKE 'plugin_%'
" --json
plugin_budget.categories — Budget categories
| Column | Description |
|---|---|
category_id | UUID primary key |
month | YYYY-MM format |
type | income or expense |
name | Category name |
expected | Budgeted amount |
tags | Array of tags to match |
plugin_goals.goals — Savings goals
| Column | Description |
|---|---|
id | UUID primary key |
name | Goal name |
target_amount | Target amount |
target_date | Target date |
completed | Boolean |
active | Boolean |
plugin_subscriptions — Detected recurring charges
plugin_cashflow — Cash flow projections
plugin_emergency_fund — Emergency fund tracking
Check CONTEXT.md for which plugins the user has and cares about.
Always use latest snapshot:
WITH latest AS (
SELECT DISTINCT ON (account_id) account_id, balance
FROM sys_balance_snapshots
ORDER BY account_id, snapshot_time DESC
)
SELECT a.name, s.balance
FROM accounts a
JOIN latest s ON a.account_id = s.account_id
Tags are arrays:
-- Contains a specific tag
WHERE tags @> ARRAY['groceries']
-- Contains any of these tags
WHERE tags && ARRAY['food', 'dining']
-- Note: UNNEST doesn't work in all contexts in DuckDB
-- Instead, GROUP BY tags directly
-- This month
WHERE transaction_date >= date_trunc('month', current_date)
-- Specific month
WHERE transaction_date >= '2026-01-01'
AND transaction_date < '2026-02-01'
SELECT
c.name,
c.expected,
COALESCE(SUM(ABS(t.amount)), 0) as actual,
c.expected - COALESCE(SUM(ABS(t.amount)), 0) as remaining
FROM plugin_budget.categories c
LEFT JOIN transactions t ON t.tags && c.tags
AND t.amount < 0
AND t.transaction_date >= (c.month || '-01')::DATE
AND t.transaction_date < (c.month || '-01')::DATE + INTERVAL '1 month'
WHERE c.month = strftime(current_date, '%Y-%m')
AND c.type = 'expense'
GROUP BY c.category_id, c.name, c.expected
| User asks | Approach |
|---|---|
| "Net worth?" | Net worth query |
| "Balances?" | Account balances query |
| "How much in [X]?" | Filter by name ILIKE '%X%' |
| "How much did I spend?" | True spending query (exclude internal moves) |
| "Spending on [tag]?" | Filter by tag |
| "Am I over budget?" | Budget vs actual (requires budget plugin) |
| "Recent transactions" | Order by date DESC, limit |
| "Savings?" | Filter accounts by name/type |
| "Retirement?" | Filter by 401k, IRA, retirement keywords |
--json for parseable outputclassification for asset/liabilityWhen this skill is installed, create CONTEXT.md alongside it to store user-specific knowledge. This keeps the skill generic/shareable while personalizing behavior.
Template for CONTEXT.md:
# Treeline User Context
*Auto-updated by your assistant as it learns your setup*
## Account Notes
<!-- What specific accounts mean, e.g.: -->
<!-- - "Company 401k" = retirement account -->
<!-- - "Home Equity" = home value estimate (manual) -->
## Tag Conventions
<!-- How the user uses tags -->
## Cash Flow Rules
<!-- Tags to exclude from "true spending" calculations -->
internal_transfer_tags: [transfer, savings, investment]
## Income Sources
<!-- Known income sources for better reporting -->
## Active Plugins
<!-- Which plugins are installed and relevant -->
## Preferences
<!-- Reporting style, rounding, spouse-friendly mode, etc. -->
## Learned Facts
<!-- Anything else discovered about the user's financial setup -->
Maintenance:
All data is local (~/.treeline/treeline.duckdb). Never share transaction descriptions or account details outside the conversation unless explicitly asked.