Files
XStats/AGENTS.md
T

43 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# XStats 仓库规则
## 技术栈(Tech Stack)
- macOS 客户端使用 Swift 6、AppKit 与 SwiftUI,包含 WidgetKit 扩展;目标为 macOS 14+、Apple Silicon(arm64)。
- `project.yml` 由 XcodeGen 生成 Xcode 工程;可测试模块位于 Swift Package `Packages/XStatsKit`,构建任务定义在 `Taskfile.yml`。
- 系统采集使用 IOKit / SMC;特权操作通过 `SMAppService` 注册的 XPC 辅助工具完成。本机历史和 AI 统计使用 SQLite,偏好设置使用 UserDefaults,凭据使用 Keychain。
- 在线更新使用 Sparkle 2.10.0 统一管理检查调度、跳过版本与安装,沿用 XStats 更新界面及系统通知开关;不得并存独立检查定时器或自动下载/安装。固定 XML API 合并安装统计并原样返回已签名清单,旧 JSON 协议继续兼容。发布前必须先部署双区域 XML 入口,验证同团队签名、公证与 Gatekeeper,并先上传已签名的版本 XML 和安装包再发布 JSON 清单。
- 日历使用 Tyme4Swift;更新检查服务位于 `server/api`,使用 Go、Fiber v3、GORM 和 SQLite。依赖版本以 `Packages/XStatsKit/Package.swift` 和 `server/api/go.mod` 为准,构建与发布步骤见 [DEVELOPMENT.md](DEVELOPMENT.md)。
## 架构与代码质量
- macOS 客户端优先使用系统原生框架和现有模块;引入新的运行时、跨平台 UI 层、依赖或抽象前,先说明当前需求为何不能由现有机制满足。此约束不排斥已有的 Go 服务和必要的第三方库。
- 新代码保持直接、可读:优先提前返回、清晰分支和有意义的局部变量,避免深层嵌套与层层转发的控制流。
- 尽量少写嵌套函数;仅在框架回调要求,或局部闭包明显比新增符号更简单时使用。
- 不要仅为缩短调用方,把只有一个调用点、又不表达稳定业务概念的逻辑抽成模块级辅助函数。可复用行为、接口或框架回调、导出 API、测试夹具,以及值得直接测试的复杂业务逻辑,可以独立成函数;保留单次使用的辅助函数时,名称应表达持久的领域概念,而不是机械步骤。
## 性能、资源与能耗
- 轻量、低资源占用和低能耗是常驻菜单栏应用的基本约束。新增功能和代码审查应同时考虑 CPU、内存、磁盘 I/O、网络请求与定时唤醒成本;不能以持续后台开销换取偶尔使用的便利。
- 监控采样沿用现有需求驱动机制,只采集当前展示、历史记录或已启用功能确实需要的数据。功能关闭、窗口关闭或最小化、锁屏及休眠时,按实际需求停止或降频;恢复时避免重复注册观察者、定时器或并发启动同一任务。
- 优先复用采样结果、事件通知和批量处理;确需轮询时采用满足体验的最低频率,为定时器设置合理容差并合并刷新。避免忙等、无退避重试、高频启动子进程和不可见界面的持续动画。
- 日志、目录、网络响应与历史数据采用有界读取和按需处理,避免每轮全量解码、排序或聚合未变化数据。缓存须有明确的大小或生命周期边界及失效条件,不常驻保存无必要的完整历史;不为推测中的性能问题预先增加缓存或并发层。
- 主线程仅承担必要的界面工作,耗时扫描、解析和阻塞 I/O 沿用项目现有后台执行机制。限制并发量,长任务在内部循环及阶段边界响应取消,取消后不发布过期或不完整的结果。
- SwiftUI 热路径保持低成本,列表使用稳定标识,避免在视图计算和布局回调中反复生成昂贵数据。几何测量与窗口尺寸调整不得形成同步反馈循环;状态无变化时避免无效重绘和重建视图。
- 性能验证与风险匹配:涉及采样、轮询、扫描、缓存、布局或动画的改动,应定向验证空闲、功能运行及关闭后的行为;涉及数据增长或资源释放时覆盖大数据量、重复开关或持续运行。性能优化尽可能在相同环境和负载下比较修改前后 CPU、内存、唤醒或 I/O,按需使用 `sample`、Instruments 等工具。构建和单元测试通过不能代替资源验证,未实测的能耗改善或长期稳定性必须明确说明。
## 国际化(i18n)
- 新增或修改用户可见文案时以简体中文为源文案,使用 `Packages/XStatsKit/Sources/Localization` 的 `tr(...)` 与现有翻译资源,同步补齐受影响语言的译文;不要只在某个视图中硬编码单一语言。系统名称、日志标识和协议字段不作为界面文案翻译。
- 日期、数字、单位使用当前应用语言对应的 Locale;检查长译文、动态文本及阿拉伯语从右到左布局,避免靠固定宽度或字符串拼接假定中文语序。相关界面改动至少验证受影响语言和布局。
- 业务行为测试优先校验状态、数值和错误语义,不对本地化提示写死中文断言,也不依赖开发机或 CI 的系统语言。曾出现卸载测试单独通过、完整测试失败:其他用例通过 `AppSettings.language` 切换了进程全局的 `L10n`,使中文提示变为译文。
- 翻译文案测试优先使用显式语言的翻译表;必须修改全局语言时,隔离所有受影响用例并恢复原状态,不能仅靠单个测试套件串行或临时切回中文避免并行干扰。涉及此类状态的测试修改须运行完整 `task test`,单例通过不足以确认隔离有效。
## 代码许可
- 本仓库自行编写的新增代码、测试及对上游代码的修改,采用 **AGPL-3.0-or-later**(GNU Affero General Public License 第 3 版或更新版本)。许可范围以 [LICENSING.md](LICENSING.md) 为准,完整许可见 [LICENSE](LICENSE)。
- 新建源码和测试文件在支持注释时标注 `SPDX-License-Identifier: AGPL-3.0-or-later`;脚本保留首行 shebang。不支持注释的文件在许可说明中记录,不破坏文件格式;文件头不写应用版本号或虚构邮箱。
- 修改上游或第三方文件时,保留原有版权与许可声明,明确区分 XStats 修改部分的授权;其他贡献者按真实归属署名,不机械改写已有年份,也不将上游原始代码声称为 AGPL 独占授权。
- OpenStats 原有 MIT 许可与版权声明保留在 [LICENSES/OpenStats-MIT.txt](LICENSES/OpenStats-MIT.txt),其他第三方声明见 [ThirdPartyNotices.md](ThirdPartyNotices.md)。
- 引入第三方代码、依赖或素材时,核对许可兼容性并保留来源、版权及必要声明;不新增与本项目新增代码许可相冲突的默认 MIT 声明。
- 调整许可相关内容时,同步核对 LICENSE、LICENSING.md、第三方声明及四语言 README。不得声称本次许可变更撤销了历史版本已有的 MIT 授权。