Prerequisites:
- macOS 14+
- Xcode 26.2+
- Xcode command line tools
- XcodeGen
From the repository root:
brew install xcodegen
xcodegen generate
xcodebuild -project AIMeter.xcodeproj -scheme AIMeter -destination "platform=macOS" -derivedDataPath ./.derived build
xcodebuild -project AIMeter.xcodeproj -scheme AIMeter -destination "platform=macOS" -derivedDataPath ./.derived testSources/AIMeter/App: app lifecycle and dependency wiringSources/AIMeter/Core: shared models, coordinators, formatting, and parser helpersSources/AIMeter/Cursor: Cursor web-session client, scraper, and parserSources/AIMeter/Storage: settings persistenceSources/AIMeter/UI: menu bar, popover, and settings UITests/AIMeterTests: parser and coordinator coveragedocs: release notes and public screenshots
- Follow the style already used in nearby Swift files.
- Keep Cursor-specific parsing rules inside the Cursor parser.
- Put reusable parsing primitives in
DashboardParserSupport. - Prefer small, focused changes over broad refactors.
- Keep UI copy short and concrete; AIMeter is a utility, not a marketing page.
AIMeter reads usage from an authenticated web session using WKWebView. This integration is unofficial and may break when Cursor pages change.
When working on scraper bugs:
- prefer updating parser fixtures first
- keep parsing scoped to the known Cursor usage sections
- do not commit cookies, screenshots with personal data, or account details
- add tests for new Cursor page structures whenever possible
The settings UI intentionally hides developer-only URL override fields. The underlying override plumbing still exists in:
CursorSettings.usagePageURL
If you need those overrides while debugging, re-expose them locally in SettingsView.swift or change defaults locally before opening a pull request.
- keep changes focused
- include or update tests for parser/coordinator behavior
- update
README.mdwhen behavior or setup changes - update
CHANGELOG.mdfor user-visible changes - do not commit generated artifacts such as
.derived/,.derived-release/, ordist/
Documentation screenshots in docs/screenshots use synthetic data. If you add or replace screenshots, redact all personal usage values, account identifiers, billing details, and provider session information before opening a pull request.