看板 i18n 字典独立于业务代码,翻译只需碰一个小文件:
- 复制底本:以
crates/usagebook-cli/src/i18n/en-US.js为底本(语义可参照zh-CN.js),复制为<语言标记>.js(如ja-JP.js),文件名须与内部I18N['xx-YY']声明一致 - 翻译:按行翻译 value(保持
'key': 'value',一行一项的排版与{0}占位符,撇号用排版撇号 ’) - 登记:
crates/usagebook-cli/src/serve.rs的concat!拼接处加一行include_str!;dashboard.html 脚本区SUPPORTED数组与normLang前缀规则各登记;语言切换控件的母语显示名(当前两种语言为常显按钮,第三种语言起由维护者改为下拉,你只需在 issue/PR 中注明母语名) - 校验:
cargo test -p usagebook-cli—— 六道 i18n 闸门会检查 key 完整性/占位符一致性/排版,失败信息列出具体缺的 key,按提示补齐即可
没有本地 Rust 环境? 直接提 PR,CI 会以同样的可读失败信息指引补齐,无需本地装工具链。
- 用量数字为 0 或明显错误:先跑
usagebook doctor,把输出 + 对应数据源的目录结构(一层即可)+ 文件样本首行(脱敏后)附到 issue——适配器只解析已验证的格式,新格式需要样本才能支持。
本项目纪律:先档案、后代码——适配器只实现档案中已验证的行为,不猜测解析。
- 立档案:
docs/数据源档案/NN-<源名>.md(套用既有档案结构:发现规则/文件格式/字段映射/去重/口径),格式证据需可复核(真实安装样本、上游源码 文件:行号、或官方文档) - 写 fixture:
crates/usagebook-core/tests/,按档案构造最小合成样本 - 实现适配器:
crates/usagebook-core/src/sources/<id>.rs,实现UsageSource协议(model.rs:discover_roots + scan_roots → Vec) - 注册:
crates/usagebook-core/src/lib.rs的SOURCE_CATALOG与registered_sources()各加一行(顺序一致,单元测试会校验)。另有两处按需登记:JSONL 大源要启用文件级尾读增量,需在common.rs的增量档位名单(matches!(source.id(), …))加该源 id(漏加只损性能、不损正确性);doctor 的环境变量展示表(climain.rs的ENV_OVERRIDES)同步加上该源认的变量 - 验收:
cargo test全绿;有条件时用真实安装数据跑usagebook --source <id>与手工复算逐位对账
cargo fmt --all -- --check、cargo test --workspace --locked与cargo clippy --workspace --all-targets --locked -- -D warnings均须通过。CI 还会检查声明的 Rust 最低版本;本机通过不替代 Windows 实机验收。- 修改
Cargo.lock后运行python3 scripts/collect_licenses.py,提交更新后的THIRD_PARTY_LICENSES.md。它保留锁定版本 crates.io 原包中的许可文件,并包含内嵌图表库的对应版本许可;生成器需 Python 3,用户运行程序无需 Python。 - 更换内嵌 JS 时同步更新
src/vendor对应版权头、许可文件和生成器中的版本/来源。借鉴实现时保留适用的来源与许可义务,改名不能代替许可核对。 - 在隔离
--prefix中验证install.sh安装、更新、卸载;不覆盖日常使用的安装,不用真实日志测试安装步骤。 - 发布工作流先构建、检查并打包,再创建 Release。手动运行工作流只产出检查用附件,不发布;推送版本标签才走发布。实际成功前不要把工作流配置称为已通过验收。
- 参与本项目即同意遵守 CODE_OF_CONDUCT.md
- 终端输出与面向用户的错误信息使用中文(与 README 的语言声明一致);HTTP/JSON 接口的错误串用英文;公开 API 的文档注释(
///)推荐英文,行内实现注释中英文均可 - 五桶语义与 inclusive/exclusive 归一见
docs/数据源档案/00-总览.md§一/§五 - 全零 usage 跳过、未知行类型跳过并计数、禁止静默吞错(ScanStats.notes)
- SQLite 一律只读打开(WAL 安全);路径发现用 homedir 相对 + 环境变量覆盖