跳转到主要内容

Beancount CLI 参考

查找 bea 命令、选项、报表行为、JSON 输出、退出代码,以及常见本地账本错误的修复方法。

用这份参考来查阅 bea 命令及其行为。如果你是第一次使用账本,请先阅读 CLI 快速上手。要端到端地完成一个完整月份的结账,请按 用 bea 度过你的第一个月 操作。处理银行文件时,请使用 导入操作指引。

命令一览​

命令用途
bea init [DIRECTORY]创建一个带常用账户的账本
bea add TYPE添加一条带日期的指令
bea add transactions --from FILE.json添加一批交易
bea import SOURCE预览一次导出;加上 --apply 才会写入
bea list TYPE列出并筛选指令
bea check校验完整账本
bea format PATH对齐一个文件或递归格式化一个目录
bea query [BQL]运行查询或打开交互式查询 shell
bea report TYPE生成财务报表
bea balance [ACCOUNT...]打印匹配账户的余额
bea ask [QUESTION]配合本地账本使用可选的托管 AI 辅助
bea cloud …登录并管理托管账本
bea doctor COMMAND检查账本上下文和诊断信息
bea example [OPTIONS]生成一份示例账本
bea treeify [INPUT]将账户名称渲染为文本树
bea ingest COMMAND使用 Beangulp 配置进行识别、提取或归档
bea price [OPTIONS]检查、刷新或导出托管价格;否则通过可选的 Beanprice 获取报价
bea engine COMMAND检查托管引擎或启用可选功能
bea upgrade [--check]使用所属包管理器升级,或检查是否有更新

全局选项和路径​

全局选项要放在命令之前:

bea --file ~/my-books/main.bean check
bea --json list transaction --limit 100
选项行为
--file / -f PATH选择根账本;覆盖 BEA_FILE 和 ./main.bean
--json结构化输出;同时禁用 CLI 提示
--no-input禁用提示;缺少必需输入时以 2 退出
--yes / -y确认云删除等操作;不会授予 AI 写入权限
--debug包含异常堆栈跟踪
--offline仅从本地缓存解析托管价格,不进行网络获取
--strict-prices当托管来源过期或不可用时让加载失败
--strict即使在终端中也拒绝部分结果;命令的 --allow-errors 可以重新允许
--version显示已安装的版本,不发起网络请求
--help / -h显示帮助;子命令也可用
--show-completion打印 shell 补全脚本
--install-completion安装 shell 补全
--shell NAME指定 bash、zsh、fish、powershell 或 pwsh,而不自动检测 shell

init 会创建自己的目录/文件目标并忽略 BEA_FILE。它接受全局 --file,而不接受目录参数。format 使用自己的位置目标。请提供文件名或目录。全局 --file 不会选择格式化目标。

创建账本​

bea init [DIRECTORY] 默认使用当前目录。传入目录会创建 main.bean;传入 .bean 或 .beancount 路径则会直接命名新文件。

选项行为
--currency / -c SYMBOL记账本位币;无人值守时必填,交互式默认值为 USD
--date YYYY-MM-DD最早的历史/建账日期;否则会提示或使用今天
--opening-balance "ACCOUNT NUMBER"对模板中的资产/负债账户重复使用;金额使用本位币

模板会创建 Assets:Checking、Assets:Savings、Assets:Cash、Liabilities:CreditCard、Income:Salary、Income:Interest、Expenses:Groceries、Expenses:Dining、Expenses:Rent、Expenses:Transport、Expenses:Utilities、Expenses:Fees、Expenses:Uncategorized 和 Equity:OpeningBalances。

期初余额会与 Equity:OpeningBalances 对冲。债务为负数。输入的货币会自动转为大写。允许自定义符号;如果某个符号不是三个大写字母,会触发拼写错误警告。这并不是 ISO 货币注册表校验。

现有文件绝不会被覆盖。新文件使用仅所有者权限,在 POSIX 上为 0600 模式。后续的添加和导入写入会保留权限,并尊重只读目标。原地格式化使用原生格式化器,并报告其自身的文件系统错误。

添加交易​

bea add transaction -n "Groceries" --payee "Corner Market" \
  -p "Expenses:Groceries 30" -p "Assets:Checking" \
  --flag '!' --tag household --link receipt-42 --meta 'receipt:IMG_42.jpg'
选项行为
--posting / -p POSTING必填;每条分录重复一次
--date YYYY-MM-DD默认今天
--flag CHARACTER默认 *;使用 ! 将交易标记为待复核
--payee TEXT可选交易对方
--narration / -n TEXT可选用途;省略的文本在列出时显示为 (no narration)
--tag TAG、--link LINK可重复;接受可选的前导 # 或 ^
--meta KEY:VALUE可重复的交易元数据
--into FILE在验证根账本的同时写入一个被包含的文件
--allow-errors明确允许语义校验错误;语法仍必须能被解析

一条分录可以省略其金额。编号分录在账户只有一个允许货币,或账本只有一个兼容的本位币时,可以省略货币。否则请提供货币符号。

原生分录语法支持诸如 84/2 EUR 的算术、诸如 {100 USD} 的成本、总成本 {{1000 USD}},以及价格 @ 或 @@。请使用 1000 这样的十进制金额,而不是 1e3 这样的指数记法。

货币兑换需要其实际交易汇率。例如,向一个以 EUR 开立的账户分录 100 EUR @ 1.08 USD,并向支票账户分录 -108 USD。投资购买可以向一个以 AAPL 开立的账户分录 2 AAPL {100 USD},并向支票账户分录 -200 USD。当报表需要市场估值时,请添加带日期的 price 报价。

元数据接受诸如 --meta 'receipt:IMG_42.jpg' 的裸字符串。原生数字、布尔值、日期和金额会保留其类型。示例包括 --meta 'reviewed:TRUE'、--meta 'received:2026-08-03' 和 --meta 'fee:2.50 USD'。内部引号会强制为字符串:--meta 'code:"1234"'。键必须各不相同;filename 和 lineno 是保留键。

单条添加、批量添加和导入会将交易对方、摘要和字符串元数据中的换行替换为空格。引号和反斜杠会保留其内容。

添加其他指令​

所有这些命令都要求 --date YYYY-MM-DD。它们也接受 --into FILE 和 --allow-errors。

类型必填字段附加选项
open--account / -a重复 --currency / -c 以限制货币
close--account / -a—
balance--account / -a、--amount "NUMBER CURRENCY"--pad-from ACCOUNT、--pad-date YYYY-MM-DD
pad--account / -a、--source / -s—
note--account / -a、--comment / --message / -m—
event--type / -t、--description / -d—
price--currency / --commodity / -c、--amount "NUMBER CURRENCY"货币即被定价的商品
commodity--currency / --commodity / -c—
document--account / -a、--filename / --path重复的 --tag 和 --link
custom--type / -t重复的 --value / -v KIND:VALUE

账户名称有一个大写的根,以及以冒号分隔的层级。每个子账户以大写字母或数字开头。Beancount 支持 Unicode 字母和配置的根名称。

余额检查该账户在其日期开始时的状态。支持容差语法,例如 --amount "1538 ~ 1 EUR"。容差必须非负。

使用 add balance --pad-from Equity:OpeningBalances 可以同时写入一个 pad 及其余额断言。pad 默认是前一天;--pad-date 可以选择另一个更早的日期。两个账户都必须处于活跃状态。单独的 pad 需要后续的余额来消耗它。--allow-errors 可以暂存这种中间状态,但不能绕过无效的 pad 账户。

add price 会在根账本及其包含文件中跳过完全相同的日期/商品/价格重复项。它会以 0 退出并指出已有位置。不同的日期或价格则是新增项。

文档路径会在包含该指令的文件旁边解析。使用 --into years/2026.bean 时,--filename receipt.pdf 表示 years/receipt.pdf,而不是你 shell 工作目录旁边的文件。

自定义值的种类有 text、number、amount、account、bool 和 date。例如,预算可以使用 --value "text:travel" --value "amount:500 USD"。

批量 JSON 输入​

bea add transactions --from transactions.json 接受一个 JSON 数组:

[
  {
    "date": "2026-08-04",
    "narration": "Groceries",
    "postings": [
      { "account": "Expenses:Groceries", "amount": "45.00 USD" },
      { "account": "Assets:Checking" }
    ],
    "meta": { "receipt": "R-43", "reviewed": true }
  }
]

每笔交易都要求 date 和 postings。可选字段有 flag、payee、narration、tags、links 和 meta。

一条分录使用 amount 或 units,例如 {"number":"45.00","currency":"USD"}。平衡分录则两者都省略。分录字段还包括 cost、price、flag 和 meta。成本包含 number 和 currency,以及可选的 date 和 label。价格包含 number 和 currency。

小数请使用字符串。元数据使用普通字符串和布尔值,或带标签的值,例如 {"kind":"number","value":"1.125"}、{"kind":"date","value":"2026-08-04"} 和 {"kind":"amount","number":"2.50","currency":"USD"}。可选的交易 source 位置绝不会写入为元数据。

默认是原子批处理:任何被拒绝的行都会让账本保持不变,并以 1 退出。--partial 会写入有效子集,但只要有任何行被拒绝,仍以 1 退出。JSON 错误会在 error.result 中描述结果;其中的行索引从零开始。人类可读的行号从一开始。

批量添加接受 --into 和 --allow-errors。它不会去重。银行导出复核请使用 bea import。

拆分分类账和写入安全​

让 --file 始终指向根账本。添加 --into 来选择已有的被包含文件:

bea --file ~/my-books/main.bean add transaction --into 2026.bean \
  --date 2026-08-02 -n "Groceries" \
  -p "Expenses:Groceries 30" -p "Assets:Checking"

目标路径相对于根目录。它必须已经被包含;指定一个不相关的文件会被拒绝。添加命令、导入和交互式 AI 写入都支持这种分离。

写入会校验完整的候选账本,包括插件和成本批次簿记。对根账本或其包含图的并发更改会以 4 退出。只读目标会以 3 退出。成功添加只会对齐新行。现有字节保持不变。当你想重新对齐整个文件时,请使用 bea format -i PATH。

列出指令​

bea list TYPE 支持十一种类型:transaction、open、close、balance、pad、note、event、price、commodity、document 和 custom。

选项适用于行为
--limit / -l N所有类型正数上限;默认 50
--from-date、--to-date所有类型包含端点的 YYYY-MM-DD 边界
--allow-errors所有类型尽管有加载器错误也允许部分数据
--account / -a TEXTTransaction、open、close、balance、pad、note、document不区分大小写的账户子串
--currency / -c SYMBOLPrice、commodity不区分大小写的精确符号;price 筛选其基础商品
--sort newest/oldestTransaction默认最新;在应用上限之前生效
--flag CHARACTERTransaction在上限之前筛选诸如 ! 的条目
--detailsTransaction渲染 Beancount 语法、每条分录、元数据和来源位置

其他指令类型保持时间顺序。按账户筛选的交易表会将其金额列标记为 MATCHING POSTING AMOUNTS。详情和 JSON 仍会包含每笔所选交易的所有分录。详情渲染的是已加载的条目,包括推断出的金额;它们不是原始源片段。

检查、格式化与查询​

bea check 会校验根账本及其包含文件。成功时静默以 0 退出,账本错误时以 1 退出。全局 --json 会返回校验信封。check 没有 --allow-errors 选项。

在交互式终端中,查询、列表和报表会发出警告并返回部分结果。全局 --strict、--json、--no-input、真值 CI,或非终端 stdin 会让读取变为严格模式。它们的 --allow-errors 选项明确允许部分结果。

格式化接受文件,或递归搜索一个目录。在已发布的 0.2.0 包中,尽管帮助中显示默认为 stdin,路径仍是必需的。全局 --file 不会选择格式化目标。

格式化模式是否写入?退出行为
bea format PATH格式化文本输出到 stdout;源文件不变成功后以 0 退出
bea format -i PATH重写源文件成功后以 0 退出
bea format PATH -o formatted.bean写入指定的输出文件成功后以 0 退出
bea format PATH --dry-run不更改文件即使需要格式化也以 0 退出
bea format PATH --check不更改文件需要格式化时以 1 退出;干净时以 0 退出

格式化只对齐文本;它不会校验账本语法或会计。请单独运行 bea check。使用全局 --json 时,请选择 -i、-o FILE、--check 或 --dry-run,以便 stdout 承载信封。不要用 stdout 重定向覆盖输入文件:请使用 -i 重写它。

bea query "BQL" 运行 Beancount 查询。省略 BQL 时会从 stdin 读取查询,或在 stdin 为终端时打开 shell。使用 .exit、exit 或 quit 关闭 shell。BQL 的默认表每条分录一行。查询表保留精度。

查询选项行为
--format / -f csv导出 CSV 而非文本表
--output / -o FILE将结果写入文件
--numberify / -m将文本或 CSV 的库存值按货币拆分为数值列
--no-errors / -q隐藏加载器诊断;不会启用部分结果
--source URI使用原生 Beanquery 源 URI

请在命令之前选择账本,例如 bea --file main.bean query -f csv -o balances.csv "SELECT account, sum(position) GROUP BY account"。全局 --json 使用带 data.rows 和 data.columns 的产品信封;它与 CSV 渲染不同。在已发布的 0.2.0 版本中,请使用 shell 重定向来保存 JSON,例如 bea --json query "SELECT account, sum(position) GROUP BY account" > result.json:在该版本中,查询的 -o 和 -m 不适用于 JSON。

本机工具和可选功能​

bea doctor context main.bean 42 显示第 42 行处的交易上下文。bea doctor --help 列出其他诊断命令。bea example -o example.bean 创建一份示例历史。bea treeify accounts.txt 从文本文件渲染层级名称;省略文件则读取 stdin。这些命令会转发原生参数。以上示例明确写明了这些参数。

使用 bea engine enable beanprice 启用报价获取,或使用 bea engine enable beangulp 启用导入器工作流,即可一次性启用可选工具。启用需要网络访问;Beangulp 还需要系统 libmagic 库。使用 bea engine status 检查可用性。bea price --help 和 bea ingest --help 描述了它们的接口。bea import --csv 和 bea add price 不需要这两个可选功能中的任何一个。

托管价格包含​

实时价格 是一种单独的托管包含工作流。托管账本会解析支持的报价 URL;兼容的 bea 版本也支持托管包含和本地价格导出。如果你安装的版本无法识别这些命令,请查看特定版本的托管价格指南。

命令用途
bea price status检查每个来源的新鲜度、修订、观测时间和错误
bea price refresh立即解析数据源并报告哪些来源发生了变化
bea --offline balance仅从本地缓存读取托管价格
bea --strict-prices check拒绝加载过期或不可用的托管价格
bea price export --output audit导出一份自包含账本,带本地价格文件,供上游工具使用

CLI 会在不发送凭据的情况下解析允许列表中的托管 URL,并拒绝重定向。因此,重定向到托管登录页的数据源无法被全新的本地获取使用;登录网站并不会让 CLI 价格请求通过认证。请检查 price status 中的来源错误。请在适当情况下使用缓存数据、可访问的支持数据源,或本地带日期价格。

price export 会将数据源文件写入 prices/ 下,并将包含重写为本地相对路径。上游 Beancount、Fava 和 Beanquery 可以加载该导出副本。不可用的来源会拒绝导出,除非使用 --allow-errors,这可能让其来源标记没有价格。

你自己的带日期价格会覆盖同一日期和货币对的托管价格。数据源条目是只读的。失败的刷新会保留先前已验证的修订,而该修订可能已过期。bea price 的其他参数仍会转发给 Beanprice;如果某个报价任务文件名为 status,请传入 ./status 以区别于该子命令。

Homebrew 会同时安装 CLI 及其托管引擎。使用 PyPI 时,第一个由引擎支持的命令会下载固定版本的依赖;请将 uv 保留在 PATH 中,并允许该首次运行访问网络。之后的本地命令会离线复用该引擎。客户只需安装 beancount-io,无需管理单独的 Beancount 包或原生控制台脚本。

财务报告​

报表输出
bea report overview资产、负债、收入、支出、净资产,以及区间序列
bea report income-statement收入/支出树、净利润,以及期间行
bea report balance-sheet资产/负债/权益树,以及派生的对账
bea report trial-balance账户余额

所有报表都接受 --conversion / -x、--time / -t、--account / -a 和 --allow-errors。除试算表外,其他所有报表还接受 --interval / -i:默认 monthly,或 quarterly、yearly、weekly 或 daily。

bea balance [ACCOUNT...] 会打印匹配不区分大小写子串的账户余额子树;如果你不指定任何账户,则打印整个账本。它接受 --conversion / -x、--time / -t 和 --allow-errors,不接受区间或账户选项。

时间筛选包括年、月、日期、季度、周或范围,例如 2026、2026-08、2026-08-31、2026-Q3、2026-W32 或 "2026-01 - 2026-08"。相对期间包括 year、quarter、month、week、day,以及诸如 month-1 的偏移。账户筛选会保留匹配交易的所有分录。

转换默认使用账本唯一的本位币。否则默认使用 units,将各商品分开保留。at_cost 使用取得成本。at_value 使用市场价值,并在缺失时回退到成本。

显式货币转换需要在每个估值日期(包括区间日期)当天或之前有价格。缺少价格的错误会指出实际缺口,例如 No EUR → USD price on or before 2026-01-31。较晚的报价无法填补较早的缺口。请添加历史适当的价格,使用 --conversion units,或选择 --allow-errors 来检查部分数值。

部分报表会保留来源货币,并将合并总计标记为不可用。JSON 会包含 valuation: "partial"、missing_prices 和 missing_price_dates。受影响的净利润/净资产总计在请求的货币中为 null。

收入、负债和权益通常使用 Beancount 的负号表示。净利润为 -(income + expenses),盈利时为正。损益表期间行也适用相同约定。资产负债表对账是为报表派生的;它不会写入任何指令。equity_reconciled 表明是否有完整的对账可用。

报表 JSON 还会标明期间、排他结束日期、截至日期、转换、账户筛选,以及账本校验状态。在比较总计之前请检查这些字段。

可选的人工智能辅助​

bea ask 既需要 ask 附加组件,也需要来自 bea cloud login 或 BEA_TOKEN 的 Beancount.io 凭据。默认的 Homebrew 安装不包含 AI 依赖。Homebrew 用户可以运行:

bea cloud login
uvx --from 'beancount-io[ask]' bea ask "What did I spend last month?" --print

对于 uv 安装,请安装 beancount-io[ask] 并直接运行 bea ask。--print / -p 回答一次并退出。否则,终端会话是交互式的,可选的问题会预填其输入。非交互式使用必须提供问题。不支持 JSON 模式。

查询在本地运行。问题、技能上下文和工具结果会发送到托管的 Beancount.io AI 服务。交互式写入会先预览、确认、校验,然后原子地写入。它们接受 --into。全局 --yes 不会授予 AI 写入权限。单次回答模式不会应用提议的写入。

Ask 会从工作目录下的 .agents/skills/ 中,以及用户配置目录下的 skills/ 中读取 NAME/SKILL.md。项目定义按名称优先。每个文件都需要 YAML 的 name 和 description 字段。完整说明会按需加载。有关文件布局和完整示例,请参阅用技能扩展 bea ask。

托管账本​

命令选项与行为
bea cloud login交互式浏览器/设备登录
bea cloud logout尝试远程注销并清除已存储的凭据
bea cloud status账户、凭据来源和过期时间
bea cloud ledger list--page 默认 1;--limit 默认 50,API 上限 100
bea cloud ledger show OWNER/NAME检查一个托管账本
bea cloud ledger create NAME--description / -d、--private / --public;默认私有
bea cloud ledger clone OWNER/NAMESSH 克隆;可选 --dir PATH
bea cloud ledger delete OWNER/NAME永久删除;需要确认或全局 --yes

使用全局 --json 时,bea cloud status、bea cloud ledger list、bea cloud ledger show、bea cloud ledger create 和 bea cloud ledger delete 会输出标准信封。登录需要交互;成功注销和克隆不会返回 JSON 成功对象。

创建还接受 --clone 和 --dir。克隆需要 Git 和 SSH 访问。如果创建后克隆失败,托管账本仍然存在。本地命令不会自动上传你的账本。没有全局 --ledger 选项。

JSON 和退出代码​

全局 --json 会把成功结果放到 stdout:

{
  "bea": "0.2.0",
  "target": { "file": "/home/alice/my-books/main.bean" },
  "data": [],
  "truncated": false,
  "limit": 50
}

bea 是已安装的版本;data 取决于命令。目标会标识一个文件、目录、服务器,或没有目标。被包含的写入还会标识 into。十进制金额和日期使用字符串。有限列表会包含 limit 和 truncated。

失败会把 {"error":{"category":"validation","message":"…","exit_code":1}} 写入 stderr。错误还可以包含 details、result、后端 request_id,以及在使用 --debug 时的 traceback。

代码类别含义
0—成功,包括预览和有意的重复跳过
1validation账本/schema 错误、格式化检查失败,或其他运行时失败
2usage参数无效、缺少目标/输入,或缺少可选依赖
3auth认证或权限失败
4conflict并发编辑、需要导入复核、init 目标已存在,或远程写入结果不确定

在重试变更之前请检查 error.result。部分批次可能写入已接受的行,递归格式化可能更改有效文件,创建并克隆可能先创建托管账本再以非零退出。有关用 jq 读取此信封并根据这些代码分支的脚本,请参阅用 bea 自动化簿记。

CLI 提示会被 --no-input、JSON 模式、非终端 stdin 或真值 CI 禁用。云删除仍需要显式 --yes。当匹配项需要复核时,导入需要明确的重复处理决定。

输出例外:doctor、example、treeify、转发给 Beanprice 的 price 调用,以及 ingest 会保留原生输出和退出状态,即使使用全局 --json 也一样;上面的信封和退出类别并不描述这些转发结果。Ask 拒绝 JSON;cloud login 需要交互;成功的 cloud logout 和 clone 不返回 JSON 成功对象。帮助、版本和补全会保留文本输出。upgrade 可以将其包管理器的输出流式写入 stderr,在 JSON 模式下也是如此。

设置、更新和存储状态​

环境变量用途
BEA_FILE--file 之后的默认根账本
BEA_CONFIG_DIR覆盖用户配置目录
XDG_CONFIG_HOME否则使用 $XDG_CONFIG_HOME/bea,回退到 ~/.config/bea
XDG_DATA_HOME托管 PyPI 引擎基础目录;否则为 ~/.local/share/bea/engine/
XDG_CACHE_HOME缓存目录基础;否则为 ~/.cache/bea
BEA_TOKEN托管凭据覆盖;优先于已存储凭据,且不会被保存
BEA_API_URLAPI 基础地址;默认 https://api.v3.beancount.io
BEA_DASHBOARD_URL浏览器登录基础地址;默认 https://beancount.io
BEA_NO_UPDATE_NOTIFIER为真值时禁用被动更新提示
MANAGED_PRICE_ORIGINS逗号分隔的允许来源;默认为 https://beancount.io;留空则禁用托管包含
MANAGED_PRICE_OFFLINE为真值时仅使用缓存的托管价格,类似于 --offline
MANAGED_PRICE_STRICT为真值时拒绝过期或不可用的托管来源,类似于 --strict-prices
CI为真值时禁用 CLI 提示和被动更新提示

真值为 1、true、yes 和 on,忽略大小写和周围空白。配置状态包括凭据、Ask 提示历史、用户技能、已记住的导入器路径,以及更新检查缓存。写入锁位于缓存目录的 locks/ 下,在你的账本目录之外。

bea upgrade --check 会报告版本和安装方式,而不进行升级。bea upgrade 会调用 brew upgrade bea、uv tool upgrade beancount-io 或 pipx upgrade beancount-io。可编辑安装会收到手动更新指引。在已安装的交互式副本中,被动检查每天最多运行一次;即使被动通知器被禁用,显式的 upgrade --check 仍会运行。

请使用匹配的管理器卸载:brew uninstall bea、uv tool uninstall beancount-io 或 pipx uninstall beancount-io。你的账本文件和用户配置会保留。

常见修复​

症状下一步
找不到账本选择 --file PATH、进入账本目录,或使用 bea init 创建新账簿
某个全局标志提示“No such option”把它移到命令之前,例如 bea --file main.bean check
账户未知使用 bea add open --date YYYY-MM-DD --account ACCOUNT 打开它
账户处于非活跃状态阅读所引用的开立/关闭日期;修正交易日期或账户历史
pad 未被使用完成其后续的余额断言;使用 add balance --pad-from 生成原子配对
货币转换不完整添加覆盖错误中所述日期的价格,或检查 units
找不到文档在指令所在文件旁边解析其路径,包括 --into 目标
写入期间账本发生了变化检查新内容,然后从新的预览重新开始
shell 检测失败指定一个 shell,例如 bea --shell zsh --show-completion

使用 bea COMMAND --help 检查你安装的版本。源码仓库参考 包含更多示例和精确的指令模型定义。

来源:https://beancount.io/zh/docs/bea-cli-reference