docs/DEVELOPMENT.md
# Full build, package, and launch (recommended)
./Scripts/compile_and_run.sh
# Also run the sharded test suite before packaging/relaunching
./Scripts/compile_and_run.sh --test
# Just build and package (no tests)
./Scripts/package_app.sh
# Launch existing app (no rebuild)
./Scripts/launch.sh
Sources/CodexBar/./Scripts/compile_and_run.sh --test to test, rebuild, and launch~/Library/Logs/CodexBar/CodexBar.log (verbosity defaults to "Verbose")You'll see one keychain prompt per stored credential on the first launch. This is a one-time migration that converts existing keychain items to use kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly.
The migration flag is stored in UserDefaults, so migrated CodexBar-owned items should not prompt again. Ad-hoc
signing can still prompt for other keychain surfaces; use ./Scripts/compile_and_run.sh --clear-adhoc-keychain
when you intentionally want to reset ad-hoc keychain state.
ThisDeviceOnly accessibility to prevent promptsdefaults delete com.steipete.codexbar KeychainMigrationV1Completed
CodexBar checks Augment through the provider fetch pipeline. Auto mode tries the Augment CLI first, then the browser-cookie web path. The web path reuses cached cookies when possible and imports from supported browsers when the cache is missing or rejected.
If automatic import fails:
Key source, test, and packaging paths (not exhaustive):
CodexBar/
├── Sources/CodexBar/ # Main app (SwiftUI + AppKit)
│ ├── CodexbarApp.swift # App entry point
│ ├── StatusItemController*.swift # Menu bar icon, menu rendering, and actions
│ ├── UsageStore*.swift # Usage refresh, caching, widgets, and history
│ ├── SettingsStore*.swift # User preferences and config persistence
│ ├── Providers/ # App-side provider settings/runtime glue
│ └── Resources/ # Assets and localized strings
├── Sources/CodexBarCore/ # Shared business logic used by app, CLI, and widgets
│ ├── Config/ # Config file model, reader, writer, and validation
│ ├── Providers/ # Provider descriptors, fetchers, parsers, and status probes
│ ├── OpenAIWeb/ # OpenAI dashboard integration helpers
│ ├── WebKit/ # Web session helpers
│ └── Vendored/ # Embedded support code
├── Sources/CodexBarCLI/ # Bundled codexbar command-line tool
├── Sources/CodexBarWidget/ # WidgetKit support
├── WidgetExtension/ # Xcode wrapper for the packaged widget extension
├── Tests/CodexBarTests/ # macOS app/core test suite (XCTest + Swift Testing)
├── TestsLinux/ # Linux-specific CLI/core test coverage
└── Scripts/ # Build and packaging scripts
See the canonical provider authoring guide for the complete flow.
Sources/CodexBarCore/Providers/Providers.swift.Sources/CodexBarCore/Providers/YourProvider/.Sources/CodexBarCore/Providers/ProviderDescriptor.swift.ProviderImplementation under Sources/CodexBar/Providers/YourProvider/; implementations can use
protocol defaults when no custom UI or macOS integration is needed.Sources/CodexBar/Providers/Shared/ProviderImplementationRegistry.swift.Sources/CodexBar/Resources/.Tests/CodexBarTests/ and, for CLI/core behavior that must run on Linux, TestsLinux/../Scripts/compile_and_run.sh.subsystem:com.steipete.codexbar category:augment[augment-cookie] prefixmake test
swiftformat Sources Tests
swiftlint --strict
./Scripts/package_app.sh
# Creates: CodexBar.app with ad-hoc signing by default
./Scripts/sign-and-notarize.sh
# Creates: CodexBar-<version>.zip and CodexBar-<version>.dSYM.zip
See docs/RELEASING.md for full release process.
# Check crash logs
ls -lt ~/Library/Logs/DiagnosticReports/CodexBar* | head -5
# Check Console.app for errors
# Filter: process:CodexBar
# Verify migration completed
defaults read com.steipete.codexbar KeychainMigrationV1Completed
# Should output: 1
# Check migration logs
log show --predicate 'category == "keychain-migration"' --last 5m
Debug builds start the hang watchdog automatically. To diagnose a release build, enable it explicitly and restart CodexBar:
defaults write com.steipete.codexbar debugMainThreadHangWatchdog -bool true
Hangs are written to the app log. Hangs over two seconds also request a process
sample under ~/Library/Logs/CodexBar/. Disable the release opt-in with:
defaults delete com.steipete.codexbar debugMainThreadHangWatchdog
~/.codexbar/config.json for provider settings, manual cookies, and stored API keys