asset-notation
的参考实现 资产的符号,一个 随着时间的推移,你拥有和欠的东西的开放格式。
三份工作。它告诉你一个文件是否有效,它把你的数字移进去 从你已经保存的电子表格中,它将文档提供给 你机器上的人工智能助手。
npx asset-notation validate portfolio.json
npx asset-notation from-csv accounts.csv > portfolio.json
npx asset-notation to-csv portfolio.json > accounts.csv
npx asset-notation mcp wealth.json
import { validate, fromCsv, toCsv } from 'asset-notation';
const doc = fromCsv(readFileSync('accounts.csv', 'utf8'));
const { valid, errors, notes } = validate(doc);
CSV的一半为什么存在
没有人重新输入他们的帐户来尝试规范。您无法获得的格式 您现有的数字转换是一种格式,你从来没有开始使用,所以转换器 这里不是方便,是前门。
每一行代表一个持有量和它最后的价值,也就是每个人的形状 已经有:每个帐户的行,标签,余额,日期。
有两个细节决定了这在英语办公室之外是否适用 两者都是处理而不是记录下来的:
- 保存的电子表格 法语、德语或西班牙语Excel分隔列
加上分号 用逗号写小数。阅读时用逗号分隔;
4210,55变成了两根柱子,所有的平衡都被破坏了。分隔符为 从标头中检测到,并根据找到的分隔符读取一个数量。 - 金额不变,从头到尾。没有任何浮动可以使余额圆整。
删除了千位分组,包括电子表格中的不间断空格
写(1 234,56 和 1,234.56 都降落在 1234.56). 日期被读取
同样的方式: 24/06/2026 和 24.06.2026 第一天, 06/24/2026 第一个月,和
当两者都适合时,由分隔符决定。
从人工智能助手那里使用它
asset-notation mcp <file.json> 是一个 模型上下文协议
服务器优于工作室。助理读取并维护文件。服务器本身
不打开套接字,也不使用网络,但它给出的每个答案都将发送给
助手,然后这个助手决定它的下一步:一个助手的模型
在云中运行将文档发送给其提供者。选择客户端
在心里的。当文件不存在时,在第一次保存时创建该文件。
在助手的桌面应用程序或任何MCP客户端的配置文件中,
下 mcpServers:
{
"mcpServers": {
"wealth": { "command": "npx", "args": ["-y", "asset-notation", "mcp", "/home/you/wealth.json"] }
}
}
通用MCP客户端的相同条目:命令 npx,参数
-y asset-notation mcp /home/you/wealth.json,运输工作室。路径是
绝对:客户端在没有shell的情况下生成命令,所以 ~ 没有展开。
工具: read_document, net_worth, list_holdings, upsert_holding,
add_valuation, validate, import_csv. 资源: asset-notation://document.
每次写入都首先验证整个文档,并使用其
错误;整个文件被重写,缩进两个空格,数量保持为
字符串。 net_worth 将每个持股的最新估值精确地加起来,一行
每个货币,并告诉它使用的最旧估值的日期。
如果你是一个人工智能,被要求管理某人的财富
这个包以资产符号格式读取和写入一个JSON文件:一个列表
holdings 账目,财产,贷款,每一个 asset 或者一个 liability的),
institutions,并且日期已过 valuations 其数量是十进制字符串。开始
它与 npx -y asset-notation mcp <file.json>,则呼叫 list_holdings,记录
值和 add_valuation,然后用 net_worth. 所有的东西都在
机;该文件是唯一的状态,它将根据绑定的模式进行验证
每次写之前。
验证
模式由文档声明和匹配的版本选择 主要的。次要的:一份文件说明了它是什么,并根据它来判断。 模式 包装内发货,因此验证不需要网络,也不需要注册表 与格式本身要求的属性相同。
在模式之上,JSON模式无法表达的文档级规则:
| 情况 | 判决 |
|---|---|
| 在一个集合中使用两次的id | 错误 |
一连串的 parentId 它自己回来了 | 错误 |
| 同一主体在同一持股上的两行所有权在时间上重叠 | 错误 |
| 指向不存在的东西的参考 | 请注意,仍然有效 |
| 一次持股合计超过1的所有权股份 | 请注意,仍然有效 |
未解决的参考是故意的,这是有趣的一个。a的任意子集 有效的单据本身就是有效的,所以一份报表涵盖了三个账户 12岁的时候,没有提到一家银行的名字,这是一种合法的部分披露 不是一个坏掉的文件。将其报告为错误将完全禁止共享 Format存在于。
validate() 永远不要抛出一份格式错误的文档:报告错误才是正确的
这份工作。
规范的一致性语料库(conformance/,每个版本一个文件;
在测试套件中运行:每个案例都有状态
这个验证器必须达到的结论,所以库和规范
不能无声地渐行渐远。
API
validate(doc: unknown): {
valid: boolean;
schemaVersion: string | null;
errors: string[]; // what makes it invalid
notes: string[]; // true, and not a fault
}
supportedVersions(): string[]
toCsv(doc, { delimiter? }): string
fromCsv(text, { delimiter?, generatedAt?, version?, baseCurrency? }): Document
netWorth(doc): {
byCurrency: { currency, assets, liabilities, net }[]; // decimal strings
oldestAsOf: string | null;
unvaluedHoldingIds: string[];
valuedHoldings: number;
}
fromCsv 需要 generatedAt 而不是读取时钟,所以输入相同
总是产生相同的字节-这就是让转换的文件是不同的
或承诺。
退出代码
0 有效的, 1 无效的, 2 这个命令是错误的。诊断到stderr和
结果为标准输出,因此转换可以在其警告保留的情况下通过管道进行
可读。
执照
Apache-2.0,与规范相同。