## Vibeviewer

[English](README.md) | 简体中文

![Swift](https://img.shields.io/badge/Swift-5.10-orange?logo=swift)
![Xcode](https://img.shields.io/badge/Xcode-15.4%2B-blue?logo=xcode)
![macOS](https://img.shields.io/badge/macOS-14%2B-black?logo=apple)
![License](https://img.shields.io/badge/License-MIT-green)
![Release](https://img.shields.io/badge/Release-DMG-purple)

![Preview](Images/image.png)

**标签**: `swift`, `swiftui`, `xcode`, `tuist`, `macos`, `menu-bar`, `release`

一个开源的 macOS 菜单栏应用，用来在系统状态栏中快速查看与分享「工作区/团队」的使用与支出概览，并提供登录、设置、自动刷新与分享能力。项目采用模块化的 Swift Package 架构与纯 SwiftUI MV（非 MVVM）范式，专注于清晰的边界与可替换性。

### 亮点特性
- **菜单栏概览**：点击弹窗查看关键指标与最近活动：
  - **计费总览**、**免费额度**（如存在）与 **按需额度**（如存在）
  - **总消耗金额（Total Credits Usage）**，支持数值过渡动画
  - **请求对比（今日 vs 昨日）** 与 **使用事件流水**
  - 顶部快捷操作：**打开 Dashboard**、**退出登录**
- **登录与设置**：独立的登录与设置窗口，支持持久化凭据与应用偏好。
- **自动刷新**：基于屏幕电源/活跃状态的智能刷新策略，节能且及时。
- **模块化架构**：Core ← Model ← API ← Feature 单向依赖，DTO→Domain 映射仅在 API 层完成。
- **分享组件**：内置字体与图形资源，便捷生成分享视图。

### 注意
- 项目目前仅基于**团队账号**进行开发测试，对于个人会员账号以及 free 版本账号还未经测试，欢迎提交适配与优化。
- 项目基于模块化分层原则，虽然目前支持 Cursor 作为数据源，对其他相同类型 App 来说，理论上只要实现了数据层的对应方法，即可无缝适配，欢迎 PR。
- 应用目前没有 Logo，欢迎设计大佬贡献一个 Logo。

> 品牌与数据来源仅用于演示。项目不会向 UI 层暴露具体的网络实现，遵循「服务协议 + 默认实现」的封装原则。

---

## 架构与目录结构

项目采用 Workspace + 多个 Swift Packages 的分层设计（单向依赖：Core ← Model ← API ← Feature）：

```
Vibeviewer/
├─ Vibeviewer.xcworkspace           # 打开此工作区进行开发
├─ Vibeviewer/                      # App 外壳（很薄，仅入口）
├─ Packages/
│  ├─ VibeviewerCore/               # Core：工具/扩展/通用服务（不依赖业务层）
│  ├─ VibeviewerModel/              # Model：纯领域实体（值类型/Sendable）
│  ├─ VibeviewerAPI/                # API：网络/IO + DTO→Domain 映射（对外仅暴露服务协议）
│  ├─ VibeviewerAppEnvironment/     # 环境注入与跨特性服务入口
│  ├─ VibeviewerStorage/            # 存储（设置、凭据等）
│  ├─ VibeviewerLoginUI/            # Feature：登录相关 UI
│  ├─ VibeviewerMenuUI/             # Feature：菜单栏弹窗 UI（主界面）
│  ├─ VibeviewerSettingsUI/         # Feature：设置界面 UI
│  └─ VibeviewerShareUI/            # Feature：分享组件与资源
└─ Scripts/ & Makefile              # Tuist 生成、清理、打包 DMG 的脚本
```

关键原则与约束（强烈建议在提交前阅读 `./.cursor/rules/architecture.mdc`）：
- **分层与职责**：
  - Core/Shared → 工具与扩展
  - Model → 纯数据/领域实体
  - API/Service → 网络/IO/三方编排以及 DTO→Domain 映射
  - Feature/UI → SwiftUI 视图与交互，仅依赖服务协议和领域模型
- **依赖方向**：仅允许自上而下（Core ← Model ← API ← Feature），严禁反向依赖。
- **可替换性**：API 层仅暴露服务协议与默认实现；UI 通过 `@Environment` 注入，不直接引用网络库。
- **SwiftUI MV 模式**：
  - 使用 `@State`/`@Observable`/`@Environment`/`@Binding` 管理状态
  - 异步副作用使用 `.task`/`.onChange`，自动随视图生命周期取消
  - 不引入默认的 ViewModel 层（避免 MVVM 依赖）

---

## 开发环境

- macOS 14.0+
- Xcode 15.4+（`SWIFT_VERSION = 5.10`）
- Tuist（项目生成与管理）

安装 Tuist（若未安装）：

```bash
brew tap tuist/tuist && brew install tuist
```

---

## 快速开始

1) 生成 Xcode 工作区：

```bash
make generate
# 或者
Scripts/generate.sh
```

2) 打开工作区并运行：

```bash
open Vibeviewer.xcworkspace
# 在 Xcode 中选择 scheme：Vibeviewer，目标：My Mac（macOS），直接 Run
```

3) 命令行构建/打包（可选）：

```bash
make build        # Release 构建（macOS 平台）
make dmg          # 生成 DMG 安装包
make release      # 清理 → 生成 → 构建 → 打包全流程
make release-full # 完整自动化发版流程（构建 + Tag + GitHub Release）
```

4) 发版流程：

详细说明请参考 [Scripts/RELEASE_GUIDE.md](Scripts/RELEASE_GUIDE.md)。

快速发版：
```bash
./Scripts/release.sh [版本号]  # 自动化发版流程
```

---

## 运行与调试

- 初次运行会在菜单栏显示图标与关键指标，点击打开弹窗查看详细信息。
- 登录与设置窗口通过依赖注入的窗口管理服务打开（参见 `VibeviewerApp.swift` 中的 `.environment(...)`）。
- 自动刷新服务将在应用启动与屏幕状态变化时调度执行。

---

## 测试

各模块包含独立的 Swift Package 测试目标。可在 Xcode 的 Test navigator 直接运行，或使用命令行分别在各包下执行：

```bash
swift test --package-path Packages/VibeviewerCore
swift test --package-path Packages/VibeviewerModel
swift test --package-path Packages/VibeviewerAPI
swift test --package-path Packages/VibeviewerAppEnvironment
swift test --package-path Packages/VibeviewerStorage
swift test --package-path Packages/VibeviewerLoginUI
swift test --package-path Packages/VibeviewerMenuUI
swift test --package-path Packages/VibeviewerSettingsUI
swift test --package-path Packages/VibeviewerShareUI
```

> 提示：若新增/调整包结构，请先执行 `make generate` 以确保工作区最新。

---

## 贡献指南

欢迎 Issue 与 PR！为保持一致性与可维护性，请遵循以下约定：

1) 分支与提交
- 建议使用形如 `feat/short-topic`、`fix/short-topic` 的分支命名。
- 提交信息尽量遵循 Conventional Commits（如 `feat: add dashboard refresh service`）。

2) 架构约定
- 变更前阅读 `./.cursor/rules/architecture.mdc` 与本 README 的分层说明。
- 新增类型放置到对应层中：UI/Service/Model/Core，每个文件仅承载一个主要类型。
- API 层仅暴露「服务协议 + 默认实现」，DTO 仅在 API 内部，UI 层只能看到领域实体。

3) 开发自检清单
- `make generate` 能通过且工作区可成功打开
- `make build` 通过（或 Xcode Release 构建成功）
- 相关包的 `swift test` 通过
- 没有反向依赖或 UI 直接依赖网络实现

4) 提交 PR
- 在 PR 描述中简述变更动机、涉及模块与影响面
- 如涉及 UI，建议附带截图/录屏
- 小而聚焦的 PR 更容易被审阅与合并

---

## 常见问题（FAQ）

- Q: Xcode 打不开或 Targets 缺失？
  - A: 先运行 `make generate`（或 `Scripts/generate.sh`）重新生成工作区。

- Q: 提示找不到 Tuist 命令？
  - A: 参考上文用 Homebrew 安装 Tuist 后重试。

- Q: 构建失败提示 Swift 版本不匹配？
  - A: 请使用 Xcode 15.4+（Swift 5.10）。若升级后仍失败，执行清理脚本 `Scripts/clear.sh` 再 `make generate`。

---

## 许可证

本项目采用 MIT License 开源。详情参见 `LICENSE` 文件。

---

## 致谢

感谢所有为模块化 Swift 包架构、SwiftUI 生态与开发者工具做出贡献的社区成员。也感谢你对 Vibeviewer 的关注与改进！

UI 灵感来自 X 用户 @hi_caicai 的作品：[Minto: Vibe Coding Tracker](https://apps.apple.com/ca/app/minto-vibe-coding-tracker/id6749605275?mt=12)。


