@sriinnu/runic 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.swiftformat +50 -0
- package/.swiftlint.yml +160 -0
- package/CHANGELOG.md +307 -0
- package/CONTRIBUTING.md +456 -0
- package/Icon.icns +0 -0
- package/Icon.icon/Assets/runic.png +0 -0
- package/Icon.icon/icon.json +36 -0
- package/LICENSE +21 -0
- package/Package.resolved +51 -0
- package/Package.swift +136 -0
- package/Packages/Helix/LICENSE +21 -0
- package/Packages/Helix/Package.swift +29 -0
- package/Packages/Helix/README.md +976 -0
- package/Packages/Helix/Sources/Helix/Binding.swift +111 -0
- package/Packages/Helix/Sources/Helix/CommandParser.swift +160 -0
- package/Packages/Helix/Sources/Helix/CommandSignature.swift +117 -0
- package/Packages/Helix/Sources/Helix/ExpressibleFromArgument.swift +72 -0
- package/Packages/Helix/Sources/Helix/HelpGenerator.swift +175 -0
- package/Packages/Helix/Sources/Helix/NameSpecification.swift +98 -0
- package/Packages/Helix/Sources/Helix/ParsableCommand.swift +204 -0
- package/Packages/Helix/Sources/Helix/Platform/DarwinPlatformContext.swift +44 -0
- package/Packages/Helix/Sources/Helix/Platform/LinuxPlatformContext.swift +34 -0
- package/Packages/Helix/Sources/Helix/Platform/PlatformContext+Default.swift +91 -0
- package/Packages/Helix/Sources/Helix/Platform/PlatformContext.swift +94 -0
- package/Packages/Helix/Sources/Helix/Platform/PlatformPath.swift +167 -0
- package/Packages/Helix/Sources/Helix/Platform/Stdio.swift +99 -0
- package/Packages/Helix/Sources/Helix/Platform/WebPlatformContext.swift +146 -0
- package/Packages/Helix/Sources/Helix/Platform/WindowsPlatformContext.swift +97 -0
- package/Packages/Helix/Sources/Helix/Program.swift +204 -0
- package/Packages/Helix/Sources/Helix/PropertyWrappers.swift +367 -0
- package/Packages/Silo/LICENSE +21 -0
- package/Packages/Silo/Package.swift +34 -0
- package/Packages/Silo/README.md +466 -0
- package/Packages/Silo/Sources/Silo/BinaryCookiesReader.swift +169 -0
- package/Packages/Silo/Sources/Silo/BrowserCookieAnalytics.swift +365 -0
- package/Packages/Silo/Sources/Silo/BrowserCookieBackends.swift +594 -0
- package/Packages/Silo/Sources/Silo/BrowserCookieClient.swift +326 -0
- package/Packages/Silo/Sources/Silo/BrowserCookieExport.swift +154 -0
- package/Packages/Silo/Sources/Silo/BrowserCookieImport.swift +119 -0
- package/Packages/Silo/Sources/Silo/BrowserCookieMockStore.swift +121 -0
- package/Packages/Silo/Sources/Silo/BrowserCookieModels.swift +391 -0
- package/Packages/Silo/Sources/Silo/ChromiumCookieReader.swift +240 -0
- package/Packages/Silo/Sources/Silo/CryptoSupport.swift +86 -0
- package/Packages/Silo/Sources/Silo/FirefoxCookieReader.swift +172 -0
- package/Packages/Silo/Sources/Silo/LinuxChromiumCookieReader.swift +172 -0
- package/Packages/Silo/Sources/Silo/LinuxSecretService.swift +105 -0
- package/Packages/Silo/Sources/Silo/MacOSChromiumCookieReader.swift +191 -0
- package/Packages/Silo/Sources/Silo/SQLiteSnapshot.swift +41 -0
- package/Packages/Silo/Sources/Silo/WindowsChromiumCookieReader.swift +110 -0
- package/README.md +109 -0
- package/RuniciOS/App/RuniciOSApp.swift +105 -0
- package/RuniciOS/Core/iOSUsageStore.swift +192 -0
- package/RuniciOS/Views/ProviderDetailView.swift +312 -0
- package/RuniciOS/Views/ProviderListView.swift +228 -0
- package/RuniciOS/Widgets/LargeWidget.swift +367 -0
- package/RuniciOS/Widgets/LiveActivity.swift +342 -0
- package/RuniciOS/Widgets/LockScreenWidget.swift +273 -0
- package/RuniciOS/Widgets/MediumWidget.swift +370 -0
- package/RuniciOS/Widgets/RunicWidget.swift +274 -0
- package/RuniciOS/Widgets/SmallWidget.swift +281 -0
- package/RuniciOS/Widgets/WidgetModels.swift +285 -0
- package/RuniciOS/Widgets/WidgetTimeline.swift +270 -0
- package/Scripts/CREATION-SUMMARY.md +367 -0
- package/Scripts/DIRECTORY-STRUCTURE.md +358 -0
- package/Scripts/GETTING-STARTED-CHECKLIST.md +364 -0
- package/Scripts/INDEX.md +365 -0
- package/Scripts/QUICK-REFERENCE.md +164 -0
- package/Scripts/README-SCRIPTS.md +926 -0
- package/Scripts/build-android.sh +526 -0
- package/Scripts/build-ios.sh +529 -0
- package/Scripts/build-macos.sh +603 -0
- package/Scripts/build-windows.sh +504 -0
- package/Scripts/build_icon.sh +49 -0
- package/Scripts/changelog-to-html.sh +89 -0
- package/Scripts/check-release-assets.sh +10 -0
- package/Scripts/ci-config.yml +474 -0
- package/Scripts/compile_and_run.sh +219 -0
- package/Scripts/compile_and_run_adhoc.sh +4 -0
- package/Scripts/docs-list.mjs +119 -0
- package/Scripts/make_appcast.sh +58 -0
- package/Scripts/package_app.sh +409 -0
- package/Scripts/release-lib.sh +214 -0
- package/Scripts/release.sh +76 -0
- package/Scripts/setup-all.sh +387 -0
- package/Scripts/setup-ios.sh +404 -0
- package/Scripts/setup-react-native.sh +523 -0
- package/Scripts/sign-and-notarize.sh +122 -0
- package/Scripts/test_live_update.sh +38 -0
- package/Scripts/validate_changelog.sh +23 -0
- package/Scripts/verify_appcast.sh +92 -0
- package/Sources/Runic/About.swift +93 -0
- package/Sources/Runic/AppNotifications.swift +115 -0
- package/Sources/Runic/Controllers/StatusItemController+Actions.swift +657 -0
- package/Sources/Runic/Controllers/StatusItemController+Animation.swift +518 -0
- package/Sources/Runic/Controllers/StatusItemController+ChartSubmenus.swift +810 -0
- package/Sources/Runic/Controllers/StatusItemController+CustomProviders.swift +87 -0
- package/Sources/Runic/Controllers/StatusItemController+Menu.swift +1379 -0
- package/Sources/Runic/Controllers/StatusItemController+MenuCards.swift +337 -0
- package/Sources/Runic/Controllers/StatusItemController+MenuHelpers.swift +395 -0
- package/Sources/Runic/Controllers/StatusItemController.swift +360 -0
- package/Sources/Runic/Core/BudgetNotificationManager.swift +80 -0
- package/Sources/Runic/Core/Login/ClaudeLoginRunner.swift +103 -0
- package/Sources/Runic/Core/Login/CodexLoginRunner.swift +154 -0
- package/Sources/Runic/Core/Login/CursorLoginRunner.swift +206 -0
- package/Sources/Runic/Core/Login/GeminiLoginRunner.swift +95 -0
- package/Sources/Runic/Core/Rendering/IconRenderer.swift +1216 -0
- package/Sources/Runic/Core/Rendering/IconView.swift +120 -0
- package/Sources/Runic/Core/Rendering/ProviderBrandIcon.swift +71 -0
- package/Sources/Runic/Core/RunicAnimation.swift +53 -0
- package/Sources/Runic/Core/RunicColors.swift +73 -0
- package/Sources/Runic/Core/RunicCornerRadius.swift +15 -0
- package/Sources/Runic/Core/RunicSpacing.swift +68 -0
- package/Sources/Runic/Core/Stores/AuggieTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/AzureOpenAITokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/CerebrasTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/CohereTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/CopilotTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/CustomProviderStore.swift +158 -0
- package/Sources/Runic/Core/Stores/DeepSeekTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/FireworksTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/GroqTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/KimiTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/MiniMaxCookieHeaderStore.swift +143 -0
- package/Sources/Runic/Core/Stores/MiniMaxGroupIDStore.swift +143 -0
- package/Sources/Runic/Core/Stores/MiniMaxTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/MistralTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/OpenRouterTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/PerplexityTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/ProviderToggleStore.swift +30 -0
- package/Sources/Runic/Core/Stores/QwenTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/SambaNovaTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/SettingsStore.swift +1702 -0
- package/Sources/Runic/Core/Stores/TogetherTokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/UsageStore+Accessors.swift +20 -0
- package/Sources/Runic/Core/Stores/UsageStore+Status.swift +189 -0
- package/Sources/Runic/Core/Stores/UsageStore+TokenCost.swift +33 -0
- package/Sources/Runic/Core/Stores/UsageStore+WidgetSnapshot.swift +67 -0
- package/Sources/Runic/Core/Stores/UsageStore.swift +3564 -0
- package/Sources/Runic/Core/Stores/XAITokenStore.swift +143 -0
- package/Sources/Runic/Core/Stores/ZaiTokenStore.swift +143 -0
- package/Sources/Runic/Core/UsageExporter.swift +193 -0
- package/Sources/Runic/Date+RelativeDescription.swift +21 -0
- package/Sources/Runic/HiddenWindowView.swift +32 -0
- package/Sources/Runic/InstallOrigin.swift +9 -0
- package/Sources/Runic/KeyboardShortcuts+Names.swift +6 -0
- package/Sources/Runic/MouseLocationReader.swift +65 -0
- package/Sources/Runic/Notifications+Runic.swift +6 -0
- package/Sources/Runic/OpenAICreditsPurchaseWindowController.swift +503 -0
- package/Sources/Runic/ProviderRegistry.swift +100 -0
- package/Sources/Runic/ProviderSwitcherButtons.swift +267 -0
- package/Sources/Runic/Providers/Antigravity/AntigravityLoginFlow.swift +11 -0
- package/Sources/Runic/Providers/Antigravity/AntigravityProviderImplementation.swift +14 -0
- package/Sources/Runic/Providers/Auggie/AuggieProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/Azure/AzureProviderImplementation.swift +52 -0
- package/Sources/Runic/Providers/Bedrock/BedrockProviderImplementation.swift +42 -0
- package/Sources/Runic/Providers/Cerebras/CerebrasProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/Claude/ClaudeLoginFlow.swift +26 -0
- package/Sources/Runic/Providers/Claude/ClaudeProviderImplementation.swift +14 -0
- package/Sources/Runic/Providers/Codex/CodexLoginFlow.swift +18 -0
- package/Sources/Runic/Providers/Codex/CodexProviderImplementation.swift +15 -0
- package/Sources/Runic/Providers/Cohere/CohereProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/Copilot/CopilotLoginFlow.swift +193 -0
- package/Sources/Runic/Providers/Copilot/CopilotProviderImplementation.swift +110 -0
- package/Sources/Runic/Providers/Cursor/CursorLoginFlow.swift +28 -0
- package/Sources/Runic/Providers/Cursor/CursorProviderImplementation.swift +15 -0
- package/Sources/Runic/Providers/DeepSeek/DeepSeekProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/Factory/FactoryLoginFlow.swift +12 -0
- package/Sources/Runic/Providers/Factory/FactoryProviderImplementation.swift +15 -0
- package/Sources/Runic/Providers/Fireworks/FireworksProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/Gemini/GeminiLoginFlow.swift +20 -0
- package/Sources/Runic/Providers/Gemini/GeminiProviderImplementation.swift +15 -0
- package/Sources/Runic/Providers/Groq/GroqProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/Kimi/KimiProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/MiniMax/MiniMaxProviderImplementation.swift +32 -0
- package/Sources/Runic/Providers/Mistral/MistralProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/OpenRouter/OpenRouterProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/Perplexity/PerplexityProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/SambaNova/SambaNovaProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/Shared/ProviderCatalog.swift +15 -0
- package/Sources/Runic/Providers/Shared/ProviderImplementation.swift +48 -0
- package/Sources/Runic/Providers/Shared/ProviderImplementationRegistry.swift +66 -0
- package/Sources/Runic/Providers/Shared/ProviderLoginFlow.swift +12 -0
- package/Sources/Runic/Providers/Shared/ProviderSettingsDescriptors.swift +99 -0
- package/Sources/Runic/Providers/Shared/SystemSettingsLinks.swift +18 -0
- package/Sources/Runic/Providers/Together/TogetherProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/XAI/XAIProviderImplementation.swift +24 -0
- package/Sources/Runic/Providers/Zai/ZaiProviderImplementation.swift +24 -0
- package/Sources/Runic/Resources/ProviderIcon-antigravity.svg +2 -0
- package/Sources/Runic/Resources/ProviderIcon-auggie.svg +3 -0
- package/Sources/Runic/Resources/ProviderIcon-azure.svg +5 -0
- package/Sources/Runic/Resources/ProviderIcon-bedrock.svg +7 -0
- package/Sources/Runic/Resources/ProviderIcon-cerebras.svg +3 -0
- package/Sources/Runic/Resources/ProviderIcon-claude.svg +1 -0
- package/Sources/Runic/Resources/ProviderIcon-codex.svg +1 -0
- package/Sources/Runic/Resources/ProviderIcon-cohere.svg +3 -0
- package/Sources/Runic/Resources/ProviderIcon-copilot.svg +1 -0
- package/Sources/Runic/Resources/ProviderIcon-cursor.svg +3 -0
- package/Sources/Runic/Resources/ProviderIcon-deepseek.svg +4 -0
- package/Sources/Runic/Resources/ProviderIcon-factory.svg +3 -0
- package/Sources/Runic/Resources/ProviderIcon-fireworks.svg +3 -0
- package/Sources/Runic/Resources/ProviderIcon-gemini.svg +1 -0
- package/Sources/Runic/Resources/ProviderIcon-groq.svg +1 -0
- package/Sources/Runic/Resources/ProviderIcon-kimi.svg +4 -0
- package/Sources/Runic/Resources/ProviderIcon-minimax.svg +1 -0
- package/Sources/Runic/Resources/ProviderIcon-mistral.svg +5 -0
- package/Sources/Runic/Resources/ProviderIcon-openrouter.svg +7 -0
- package/Sources/Runic/Resources/ProviderIcon-perplexity.svg +4 -0
- package/Sources/Runic/Resources/ProviderIcon-qwen.svg +9 -0
- package/Sources/Runic/Resources/ProviderIcon-sambanova.svg +4 -0
- package/Sources/Runic/Resources/ProviderIcon-together.svg +5 -0
- package/Sources/Runic/Resources/ProviderIcon-vertexai.svg +17 -0
- package/Sources/Runic/Resources/ProviderIcon-xai.svg +3 -0
- package/Sources/Runic/Resources/ProviderIcon-zai.svg +5 -0
- package/Sources/Runic/Resources/RunicMenubarIcon.svg +7 -0
- package/Sources/Runic/RunicApp.swift +357 -0
- package/Sources/Runic/SessionQuotaNotifications.swift +58 -0
- package/Sources/Runic/UsagePaceText.swift +52 -0
- package/Sources/Runic/UsageProgressBar.swift +224 -0
- package/Sources/Runic/Utilities/DisplayLink.swift +96 -0
- package/Sources/Runic/Utilities/LoadingPattern.swift +60 -0
- package/Sources/Runic/Utilities/PerformanceConstants.swift +85 -0
- package/Sources/Runic/Views/Menu/AlertsMenuView.swift +256 -0
- package/Sources/Runic/Views/Menu/ChartPanelStyle.swift +22 -0
- package/Sources/Runic/Views/Menu/CostComparativeChartMenuView.swift +275 -0
- package/Sources/Runic/Views/Menu/CostHistoryChartMenuView.swift +377 -0
- package/Sources/Runic/Views/Menu/CreditsHistoryChartMenuView.swift +312 -0
- package/Sources/Runic/Views/Menu/EfficiencyMetricsMenuView.swift +312 -0
- package/Sources/Runic/Views/Menu/HeroStatCardsMenuView.swift +228 -0
- package/Sources/Runic/Views/Menu/HourlyActivityChartMenuView.swift +228 -0
- package/Sources/Runic/Views/Menu/InlineUsageChartView.swift +162 -0
- package/Sources/Runic/Views/Menu/MenuCardEntranceModifier.swift +64 -0
- package/Sources/Runic/Views/Menu/MenuCardSidebarView.swift +268 -0
- package/Sources/Runic/Views/Menu/MenuCardSkeletonView.swift +104 -0
- package/Sources/Runic/Views/Menu/MenuCardView.swift +1900 -0
- package/Sources/Runic/Views/Menu/MenuContent.swift +150 -0
- package/Sources/Runic/Views/Menu/MenuDescriptor.swift +369 -0
- package/Sources/Runic/Views/Menu/MenuHighlightStyle.swift +42 -0
- package/Sources/Runic/Views/Menu/ModelBreakdownMenuView.swift +235 -0
- package/Sources/Runic/Views/Menu/OverviewMenuView.swift +141 -0
- package/Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift +209 -0
- package/Sources/Runic/Views/Menu/ProjectBudgetMenuView.swift +220 -0
- package/Sources/Runic/Views/Menu/ProviderTabBarView.swift +88 -0
- package/Sources/Runic/Views/Menu/SubscriptionUtilizationChartMenuView.swift +201 -0
- package/Sources/Runic/Views/Menu/UsageBreakdownChartMenuView.swift +398 -0
- package/Sources/Runic/Views/Menu/UsageHeatmapMenuView.swift +232 -0
- package/Sources/Runic/Views/Menu/UsageTimelineChartMenuView.swift +417 -0
- package/Sources/Runic/Views/Menu/UsageWindowComparisonChartMenuView.swift +190 -0
- package/Sources/Runic/Views/Menu/WeeklyActivityChartMenuView.swift +132 -0
- package/Sources/Runic/Views/Performance/PerformanceDashboardView.swift +618 -0
- package/Sources/Runic/Views/Preferences/LiquidComponents.swift +305 -0
- package/Sources/Runic/Views/Preferences/PreferencesAboutPane.swift +271 -0
- package/Sources/Runic/Views/Preferences/PreferencesAdvancedPane.swift +268 -0
- package/Sources/Runic/Views/Preferences/PreferencesAlertsPane.swift +422 -0
- package/Sources/Runic/Views/Preferences/PreferencesAnalyticsPane.swift +641 -0
- package/Sources/Runic/Views/Preferences/PreferencesBudgetsPane.swift +344 -0
- package/Sources/Runic/Views/Preferences/PreferencesComponents.swift +230 -0
- package/Sources/Runic/Views/Preferences/PreferencesCustomProvidersPane.swift +322 -0
- package/Sources/Runic/Views/Preferences/PreferencesDebugPane.swift +469 -0
- package/Sources/Runic/Views/Preferences/PreferencesGeneralPane.swift +231 -0
- package/Sources/Runic/Views/Preferences/PreferencesHelpPane.swift +50 -0
- package/Sources/Runic/Views/Preferences/PreferencesIntegrationsPane.swift +497 -0
- package/Sources/Runic/Views/Preferences/PreferencesPerformancePane.swift +288 -0
- package/Sources/Runic/Views/Preferences/PreferencesProvidersPane.swift +3435 -0
- package/Sources/Runic/Views/Preferences/PreferencesSelection.swift +25 -0
- package/Sources/Runic/Views/Preferences/PreferencesSyncPane.swift +59 -0
- package/Sources/Runic/Views/Preferences/PreferencesView.swift +206 -0
- package/Sources/Runic/Views/Rating/QualityRatingView.swift +238 -0
- package/Sources/Runic/Views/Team/TeamDashboardView.swift +371 -0
- package/Sources/Runic/Views/Team/TeamInviteSheet.swift +175 -0
- package/Sources/Runic/Views/Team/TeamManagementView.swift +761 -0
- package/Sources/Runic/Views/Team/TeamMemberRow.swift +181 -0
- package/Sources/RunicCLI/CLIEntry.swift +942 -0
- package/Sources/RunicCLI/CLIRenderer.swift +87 -0
- package/Sources/RunicCLI/Commands/EnhancedUsageCommand.swift +588 -0
- package/Sources/RunicCLI/Commands/ModelsCommand.swift +362 -0
- package/Sources/RunicCLI/Commands/ProjectsCommand.swift +439 -0
- package/Sources/RunicCLI/Commands/ResetCommand.swift +429 -0
- package/Sources/RunicCLI/Commands/UsageLedgerSourceFactory.swift +168 -0
- package/Sources/RunicClaudeWatchdog/main.swift +122 -0
- package/Sources/RunicClaudeWebProbe/main.swift +62 -0
- package/Sources/RunicCore/AlertRuleStore.swift +187 -0
- package/Sources/RunicCore/BrowserCookieImportOrder.swift +25 -0
- package/Sources/RunicCore/CopilotUsageModels.swift +84 -0
- package/Sources/RunicCore/CostUsageFetcher.swift +119 -0
- package/Sources/RunicCore/CostUsageModels.swift +479 -0
- package/Sources/RunicCore/CreditsModels.swift +50 -0
- package/Sources/RunicCore/CustomProviders/CustomProviderModels.swift +269 -0
- package/Sources/RunicCore/CustomProviders/GenericProviderFetcher.swift +622 -0
- package/Sources/RunicCore/CustomProviders/ProviderTemplates.swift +500 -0
- package/Sources/RunicCore/Host/PTY/TTYCommandRunner.swift +679 -0
- package/Sources/RunicCore/Host/Process/SubprocessRunner.swift +135 -0
- package/Sources/RunicCore/Integrations/GitHubIntegration.swift +173 -0
- package/Sources/RunicCore/Logging/JSONStderrLogHandler.swift +79 -0
- package/Sources/RunicCore/Logging/OSLogLogHandler.swift +86 -0
- package/Sources/RunicCore/Logging/RunicLog.swift +123 -0
- package/Sources/RunicCore/Models/EnhancedUsageModels.swift +371 -0
- package/Sources/RunicCore/OpenAIDashboardModels.swift +210 -0
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardBrowserCookieImporter.swift +676 -0
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardFetcher.swift +492 -0
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardNavigationDelegate.swift +51 -0
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardParser.swift +483 -0
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardScrapeScript.swift +558 -0
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardWebViewCache.swift +204 -0
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardWebsiteDataStore.swift +78 -0
- package/Sources/RunicCore/PathEnvironment.swift +482 -0
- package/Sources/RunicCore/Performance/PerformanceModels.swift +371 -0
- package/Sources/RunicCore/Performance/PerformanceStorageImpl.swift +409 -0
- package/Sources/RunicCore/Policy/UsagePolicyEngine.swift +178 -0
- package/Sources/RunicCore/ProjectBudgetStore.swift +99 -0
- package/Sources/RunicCore/ProviderCostSnapshot.swift +29 -0
- package/Sources/RunicCore/Providers/Antigravity/AntigravityProviderDescriptor.swift +66 -0
- package/Sources/RunicCore/Providers/Antigravity/AntigravityStatusProbe.swift +685 -0
- package/Sources/RunicCore/Providers/Auggie/AuggieProviderDescriptor.swift +83 -0
- package/Sources/RunicCore/Providers/Auggie/AuggieUsageFetcher.swift +142 -0
- package/Sources/RunicCore/Providers/Azure/AzureProviderDescriptor.swift +141 -0
- package/Sources/RunicCore/Providers/Azure/AzureUsageFetcher.swift +186 -0
- package/Sources/RunicCore/Providers/Bedrock/BedrockProviderDescriptor.swift +126 -0
- package/Sources/RunicCore/Providers/Bedrock/BedrockUsageFetcher.swift +168 -0
- package/Sources/RunicCore/Providers/Cerebras/CerebrasProviderDescriptor.swift +84 -0
- package/Sources/RunicCore/Providers/Cerebras/CerebrasUsageFetcher.swift +75 -0
- package/Sources/RunicCore/Providers/Claude/ClaudeCLISession.swift +332 -0
- package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthCredentials.swift +180 -0
- package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthUsageFetcher.swift +137 -0
- package/Sources/RunicCore/Providers/Claude/ClaudeProviderDescriptor.swift +207 -0
- package/Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift +654 -0
- package/Sources/RunicCore/Providers/Claude/ClaudeUsageDataSource.swift +28 -0
- package/Sources/RunicCore/Providers/Claude/ClaudeUsageFetcher.swift +480 -0
- package/Sources/RunicCore/Providers/Claude/ClaudeWeb/ClaudeWebAPIFetcher.swift +780 -0
- package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthCredentials.swift +146 -0
- package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthUsageFetcher.swift +269 -0
- package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexTokenRefresher.swift +100 -0
- package/Sources/RunicCore/Providers/Codex/CodexProviderDescriptor.swift +243 -0
- package/Sources/RunicCore/Providers/Codex/CodexStatusProbe.swift +125 -0
- package/Sources/RunicCore/Providers/Codex/CodexUsageDataSource.swift +24 -0
- package/Sources/RunicCore/Providers/Codex/CodexWebDashboardStrategy.swift +181 -0
- package/Sources/RunicCore/Providers/Cohere/CohereProviderDescriptor.swift +83 -0
- package/Sources/RunicCore/Providers/Cohere/CohereUsageFetcher.swift +85 -0
- package/Sources/RunicCore/Providers/Copilot/CopilotDeviceFlow.swift +123 -0
- package/Sources/RunicCore/Providers/Copilot/CopilotGitHubCLITokenReader.swift +114 -0
- package/Sources/RunicCore/Providers/Copilot/CopilotProviderDescriptor.swift +100 -0
- package/Sources/RunicCore/Providers/Copilot/CopilotUsageFetcher.swift +291 -0
- package/Sources/RunicCore/Providers/Copilot/CopilotVSCodeTokenReader.swift +386 -0
- package/Sources/RunicCore/Providers/Cursor/CursorProviderDescriptor.swift +65 -0
- package/Sources/RunicCore/Providers/Cursor/CursorStatusProbe.swift +594 -0
- package/Sources/RunicCore/Providers/DeepSeek/DeepSeekProviderDescriptor.swift +85 -0
- package/Sources/RunicCore/Providers/DeepSeek/DeepSeekUsageFetcher.swift +108 -0
- package/Sources/RunicCore/Providers/Factory/FactoryLocalStorageImporter.swift +398 -0
- package/Sources/RunicCore/Providers/Factory/FactoryProviderDescriptor.swift +65 -0
- package/Sources/RunicCore/Providers/Factory/FactoryStatusProbe.swift +1275 -0
- package/Sources/RunicCore/Providers/Fireworks/FireworksProviderDescriptor.swift +84 -0
- package/Sources/RunicCore/Providers/Fireworks/FireworksUsageFetcher.swift +75 -0
- package/Sources/RunicCore/Providers/Gemini/GeminiProviderDescriptor.swift +65 -0
- package/Sources/RunicCore/Providers/Gemini/GeminiStatusProbe.swift +835 -0
- package/Sources/RunicCore/Providers/Groq/GroqProviderDescriptor.swift +83 -0
- package/Sources/RunicCore/Providers/Groq/GroqUsageFetcher.swift +71 -0
- package/Sources/RunicCore/Providers/Kimi/KimiProviderDescriptor.swift +83 -0
- package/Sources/RunicCore/Providers/Kimi/KimiUsageFetcher.swift +77 -0
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxProviderDescriptor.swift +92 -0
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxSettingsReader.swift +54 -0
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxUsageFetcher.swift +171 -0
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxWebUsageFetcher.swift +911 -0
- package/Sources/RunicCore/Providers/Mistral/MistralProviderDescriptor.swift +84 -0
- package/Sources/RunicCore/Providers/Mistral/MistralUsageFetcher.swift +75 -0
- package/Sources/RunicCore/Providers/OpenRouter/OpenRouterProviderDescriptor.swift +87 -0
- package/Sources/RunicCore/Providers/OpenRouter/OpenRouterUsageFetcher.swift +207 -0
- package/Sources/RunicCore/Providers/Perplexity/PerplexityProviderDescriptor.swift +84 -0
- package/Sources/RunicCore/Providers/Perplexity/PerplexityUsageFetcher.swift +75 -0
- package/Sources/RunicCore/Providers/ProviderBranding.swift +25 -0
- package/Sources/RunicCore/Providers/ProviderCLIConfig.swift +17 -0
- package/Sources/RunicCore/Providers/ProviderDescriptor.swift +129 -0
- package/Sources/RunicCore/Providers/ProviderFetchPlan.swift +263 -0
- package/Sources/RunicCore/Providers/ProviderSettingsSnapshot.swift +98 -0
- package/Sources/RunicCore/Providers/ProviderTokenResolver.swift +501 -0
- package/Sources/RunicCore/Providers/ProviderVersionDetector.swift +68 -0
- package/Sources/RunicCore/Providers/Providers.swift +184 -0
- package/Sources/RunicCore/Providers/Qwen/QwenProviderDescriptor.swift +84 -0
- package/Sources/RunicCore/Providers/Qwen/QwenSettingsReader.swift +30 -0
- package/Sources/RunicCore/Providers/Qwen/QwenUsageStats.swift +317 -0
- package/Sources/RunicCore/Providers/SambaNova/SambaNovaProviderDescriptor.swift +84 -0
- package/Sources/RunicCore/Providers/SambaNova/SambaNovaUsageFetcher.swift +75 -0
- package/Sources/RunicCore/Providers/Together/TogetherProviderDescriptor.swift +83 -0
- package/Sources/RunicCore/Providers/Together/TogetherUsageFetcher.swift +75 -0
- package/Sources/RunicCore/Providers/VertexAI/VertexAIProviderDescriptor.swift +123 -0
- package/Sources/RunicCore/Providers/VertexAI/VertexAISettingsReader.swift +48 -0
- package/Sources/RunicCore/Providers/VertexAI/VertexAIUsageFetcher.swift +144 -0
- package/Sources/RunicCore/Providers/XAI/XAIProviderDescriptor.swift +83 -0
- package/Sources/RunicCore/Providers/XAI/XAIUsageFetcher.swift +75 -0
- package/Sources/RunicCore/Providers/Zai/ZaiProviderDescriptor.swift +72 -0
- package/Sources/RunicCore/Providers/Zai/ZaiSettingsReader.swift +41 -0
- package/Sources/RunicCore/Providers/Zai/ZaiUsageStats.swift +724 -0
- package/Sources/RunicCore/Sync/BackgroundSyncManager.swift +385 -0
- package/Sources/RunicCore/Sync/SyncConflictResolver.swift +310 -0
- package/Sources/RunicCore/Sync/SyncProtocol.swift +288 -0
- package/Sources/RunicCore/Sync/SyncRecord.swift +405 -0
- package/Sources/RunicCore/Sync/SyncUsageExample.swift +294 -0
- package/Sources/RunicCore/Sync/TeamSyncRecords.swift +775 -0
- package/Sources/RunicCore/Sync/iCloudSyncEngine.swift +333 -0
- package/Sources/RunicCore/Team/TeamModels.swift +583 -0
- package/Sources/RunicCore/Team/TeamShowbackExporter.swift +495 -0
- package/Sources/RunicCore/Team/TeamStore.swift +792 -0
- package/Sources/RunicCore/TextParsing.swift +55 -0
- package/Sources/RunicCore/UsageFetcher.swift +694 -0
- package/Sources/RunicCore/UsageFormatter.swift +410 -0
- package/Sources/RunicCore/UsageLedger/ClaudeUsageLogSource.swift +329 -0
- package/Sources/RunicCore/UsageLedger/CodexUsageLogSource.swift +448 -0
- package/Sources/RunicCore/UsageLedger/OTelGenAILedgerAdapter.swift +550 -0
- package/Sources/RunicCore/UsageLedger/UsageLedger.swift +29 -0
- package/Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift +660 -0
- package/Sources/RunicCore/UsageLedger/UsageLedgerInsightsAdvisor.swift +209 -0
- package/Sources/RunicCore/UsageLedger/UsageLedgerModels.swift +417 -0
- package/Sources/RunicCore/UsageLedger/UsageLedgerProjectIdentity.swift +245 -0
- package/Sources/RunicCore/UsagePace.swift +81 -0
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageCache.swift +73 -0
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageJsonl.swift +74 -0
- package/Sources/RunicCore/Vendored/CostUsage/CostUsagePricing.swift +208 -0
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner+Claude.swift +455 -0
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner+Timestamp.swift +132 -0
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner.swift +589 -0
- package/Sources/RunicCore/WidgetSnapshot.swift +183 -0
- package/Sources/RunicMacroSupport/ProviderRegistrationMacros.swift +14 -0
- package/Sources/RunicMacros/ProviderRegistrationMacros.swift +216 -0
- package/Sources/RunicWidget/RunicWidgetBundle.swift +79 -0
- package/Sources/RunicWidget/RunicWidgetProvider.swift +283 -0
- package/Sources/RunicWidget/RunicWidgetViews.swift +680 -0
- package/Tests/RunicTests/AntigravityStatusProbeTests.swift +50 -0
- package/Tests/RunicTests/AppDelegateTests.swift +43 -0
- package/Tests/RunicTests/BrowserCookieOrderLabelTests.swift +22 -0
- package/Tests/RunicTests/CLIArgumentParsingTests.swift +70 -0
- package/Tests/RunicTests/CLICostTests.swift +65 -0
- package/Tests/RunicTests/CLIProviderSelectionTests.swift +22 -0
- package/Tests/RunicTests/CLISnapshotTests.swift +72 -0
- package/Tests/RunicTests/CLIWebFallbackTests.swift +58 -0
- package/Tests/RunicTests/ClaudeOAuthTests.swift +164 -0
- package/Tests/RunicTests/ClaudeResilienceTests.swift +30 -0
- package/Tests/RunicTests/ClaudeUsageTests.swift +370 -0
- package/Tests/RunicTests/CodexOAuthTests.swift +122 -0
- package/Tests/RunicTests/CodexUsageLogSourceTests.swift +82 -0
- package/Tests/RunicTests/CopilotTokenResolverTests.swift +75 -0
- package/Tests/RunicTests/CopilotVSCodeTokenReaderTests.swift +75 -0
- package/Tests/RunicTests/CostUsageDecodingTests.swift +394 -0
- package/Tests/RunicTests/CostUsagePricingTests.swift +50 -0
- package/Tests/RunicTests/CostUsageScannerTests.swift +700 -0
- package/Tests/RunicTests/CursorStatusProbeTests.swift +323 -0
- package/Tests/RunicTests/FactoryStatusProbeTests.swift +69 -0
- package/Tests/RunicTests/GeminiAPITestHelpers.swift +94 -0
- package/Tests/RunicTests/GeminiLoginAlertTests.swift +28 -0
- package/Tests/RunicTests/GeminiStatusProbeAPITests.swift +283 -0
- package/Tests/RunicTests/GeminiStatusProbePlanTests.swift +279 -0
- package/Tests/RunicTests/GeminiStatusProbeTests.swift +233 -0
- package/Tests/RunicTests/GeminiTestEnvironment.swift +87 -0
- package/Tests/RunicTests/GoogleWorkspaceStatusTests.swift +73 -0
- package/Tests/RunicTests/InstallOriginTests.swift +18 -0
- package/Tests/RunicTests/KeyboardShortcutsBundleTests.swift +9 -0
- package/Tests/RunicTests/LiveAccountTests.swift +24 -0
- package/Tests/RunicTests/LoadingPatternTests.swift +35 -0
- package/Tests/RunicTests/MenuCardModelTests.swift +545 -0
- package/Tests/RunicTests/MiniMaxCookieHeaderStoreTestSupport.swift +8 -0
- package/Tests/RunicTests/MiniMaxGroupIDStoreTestSupport.swift +8 -0
- package/Tests/RunicTests/MiniMaxParsingTests.swift +68 -0
- package/Tests/RunicTests/MiniMaxTokenStoreTestSupport.swift +8 -0
- package/Tests/RunicTests/OTelGenAILedgerAdapterTests.swift +112 -0
- package/Tests/RunicTests/OpenAIDashboardBrowserCookieImporterTests.swift +17 -0
- package/Tests/RunicTests/OpenAIDashboardFetcherCreditsWaitTests.swift +75 -0
- package/Tests/RunicTests/OpenAIDashboardOffscreenHostTests.swift +27 -0
- package/Tests/RunicTests/OpenAIDashboardParserTests.swift +134 -0
- package/Tests/RunicTests/OpenAIWebAccountSwitchTests.swift +53 -0
- package/Tests/RunicTests/OpenRouterTokenStoreTestSupport.swift +92 -0
- package/Tests/RunicTests/PathBuilderTests.swift +237 -0
- package/Tests/RunicTests/ProviderFetchPipelineTests.swift +160 -0
- package/Tests/RunicTests/ProviderIconResourcesTests.swift +38 -0
- package/Tests/RunicTests/ProviderMetadataStatusLinkTests.swift +16 -0
- package/Tests/RunicTests/ProviderRegistryTests.swift +29 -0
- package/Tests/RunicTests/ProviderSettingsDescriptorTests.swift +202 -0
- package/Tests/RunicTests/ProviderToggleStoreTests.swift +51 -0
- package/Tests/RunicTests/RunicTests.swift +120 -0
- package/Tests/RunicTests/SessionQuotaNotificationLogicTests.swift +36 -0
- package/Tests/RunicTests/SettingsStoreTests.swift +161 -0
- package/Tests/RunicTests/StatusItemAnimationTests.swift +49 -0
- package/Tests/RunicTests/StatusMenuTests.swift +434 -0
- package/Tests/RunicTests/StatusProbeTests.swift +377 -0
- package/Tests/RunicTests/SubprocessRunnerTests.swift +20 -0
- package/Tests/RunicTests/SubscriptionDetectionTests.swift +65 -0
- package/Tests/RunicTests/TTYCommandRunnerTests.swift +148 -0
- package/Tests/RunicTests/TTYIntegrationTests.swift +41 -0
- package/Tests/RunicTests/TeamShowbackExporterTests.swift +159 -0
- package/Tests/RunicTests/TextParsingTests.swift +12 -0
- package/Tests/RunicTests/UsageFormatterTests.swift +112 -0
- package/Tests/RunicTests/UsageLedgerAnomalyDetectionTests.swift +172 -0
- package/Tests/RunicTests/UsageLedgerForecastTests.swift +213 -0
- package/Tests/RunicTests/UsageLedgerInsightsAdvisorTests.swift +83 -0
- package/Tests/RunicTests/UsageLedgerProjectNameTests.swift +170 -0
- package/Tests/RunicTests/UsagePaceTests.swift +77 -0
- package/Tests/RunicTests/UsagePaceTextTests.swift +109 -0
- package/Tests/RunicTests/UsagePolicyEngineTests.swift +91 -0
- package/Tests/RunicTests/WidgetSnapshotTests.swift +45 -0
- package/Tests/RunicTests/ZaiProviderTests.swift +61 -0
- package/Tests/RunicTests/ZaiTokenStoreTestSupport.swift +6 -0
- package/TestsLinux/PlatformGatingTests.swift +46 -0
- package/appcast.xml +105 -0
- package/assets/logo-concept-stack.svg +24 -0
- package/assets/logo-minimal-bars.svg +15 -0
- package/assets/logo.svg +20 -0
- package/assets/logo2.svg +43 -0
- package/bin/docs-list +5 -0
- package/bin/install-runic-cli.sh +32 -0
- package/build-and-run.sh +369 -0
- package/docs/.nojekyll +1 -0
- package/docs/CNAME +1 -0
- package/docs/antigravity.md +75 -0
- package/docs/architecture.md +32 -0
- package/docs/claude.md +93 -0
- package/docs/cli-commands/integration_guide.md +371 -0
- package/docs/cli-commands/quick_reference.md +362 -0
- package/docs/cli-commands/readme.md +361 -0
- package/docs/cli.md +156 -0
- package/docs/cloudkit_sync_guide.md +495 -0
- package/docs/codebase_review.md +288 -0
- package/docs/codex-oauth.md +635 -0
- package/docs/codex.md +104 -0
- package/docs/codexbar.png +0 -0
- package/docs/copilot.md +44 -0
- package/docs/cursor.md +46 -0
- package/docs/design/designcomparisonchart.md +510 -0
- package/docs/design/implementationguide.md +792 -0
- package/docs/design/menubaricondesignconcepts.md +796 -0
- package/docs/design/mockups/hybridiconconcept.svg +62 -0
- package/docs/design/mockups/infinityiconconcept.svg +41 -0
- package/docs/design/mockups/infinityiconstates.svg +129 -0
- package/docs/design/mockups/wavelogorefined.svg +48 -0
- package/docs/design/quick_summary.md +426 -0
- package/docs/design/readme.md +478 -0
- package/docs/design/sizespecifications.md +575 -0
- package/docs/design-system.md +836 -0
- package/docs/factory.md +103 -0
- package/docs/gemini.md +73 -0
- package/docs/icon.md +37 -0
- package/docs/icon.png +0 -0
- package/docs/index.html +175 -0
- package/docs/keychain_fix.md +274 -0
- package/docs/minimax.md +71 -0
- package/docs/packaging.md +25 -0
- package/docs/progress-bar-improvements.md +240 -0
- package/docs/progress-bar-quick-reference.md +283 -0
- package/docs/progress-bar-technical-details.md +432 -0
- package/docs/progress-bar-visual-test.swift +375 -0
- package/docs/provider.md +202 -0
- package/docs/providers.md +86 -0
- package/docs/refactor/macros.md +35 -0
- package/docs/refresh-loop.md +22 -0
- package/docs/releasing-homebrew.md +35 -0
- package/docs/releasing.md +121 -0
- package/docs/research/concrete_todo_2026-02-22.md +47 -0
- package/docs/research/core-feature-research.md +248 -0
- package/docs/research/feature_uiux_roadmap_2026-02-22.md +202 -0
- package/docs/research/parity_matrix.md +49 -0
- package/docs/research/provider_expansion_candidates_2026-02-22.md +80 -0
- package/docs/research/provider_model_token_project_matrix_2026-02-23.md +46 -0
- package/docs/research/release_gate_checklist.md +57 -0
- package/docs/site.css +505 -0
- package/docs/sparkle.md +28 -0
- package/docs/status.md +28 -0
- package/docs/sync/implementation.md +393 -0
- package/docs/sync/readme.md +317 -0
- package/docs/sync_files_summary.md +391 -0
- package/docs/sync_quick_reference.md +225 -0
- package/docs/todo.md +11 -0
- package/docs/ui.md +29 -0
- package/docs/web-integration.md +9 -0
- package/docs/widgets.md +85 -0
- package/docs/workflows/error-handling-improvements.md +434 -0
- package/docs/workflows/folder_structure.md +299 -0
- package/docs/workflows/loading_states.md +446 -0
- package/docs/workflows/loading_states_examples.md +565 -0
- package/docs/workflows/loading_states_flow.md +430 -0
- package/docs/workflows/performance_optimizations.md +457 -0
- package/docs/workflows/phase1-cli-testing-report.md +313 -0
- package/docs/workflows/quick_reference.md +228 -0
- package/docs/workflows/readme.md +59 -0
- package/docs/workflows/recent_improvements.md +275 -0
- package/docs/workflows/sync_enablement_summary.md +400 -0
- package/docs/zai.md +43 -0
- package/package.json +36 -0
- package/runic.png +0 -0
- package/version.env +2 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Antigravity provider notes: local LSP probing, port discovery, quota parsing, and UI mapping."
|
|
3
|
+
read_when:
|
|
4
|
+
- Adding or modifying the Antigravity provider
|
|
5
|
+
- Debugging Antigravity port detection or quota parsing
|
|
6
|
+
- Adjusting Antigravity menu labels or model mapping
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Antigravity provider
|
|
10
|
+
|
|
11
|
+
Antigravity is a local-only provider. We talk directly to the Antigravity language server running on the same machine.
|
|
12
|
+
|
|
13
|
+
## Data sources + fallback order
|
|
14
|
+
|
|
15
|
+
1) **Process detection**
|
|
16
|
+
- Command: `ps -ax -o pid=,command=`.
|
|
17
|
+
- Match process name: `language_server_macos` plus Antigravity markers:
|
|
18
|
+
- `--app_data_dir antigravity` OR path contains `/antigravity/`.
|
|
19
|
+
- Extract CLI flags:
|
|
20
|
+
- `--csrf_token <token>` (required).
|
|
21
|
+
- `--extension_server_port <port>` (HTTP fallback).
|
|
22
|
+
|
|
23
|
+
2) **Port discovery**
|
|
24
|
+
- Command: `lsof -nP -iTCP -sTCP:LISTEN -p <pid>`.
|
|
25
|
+
- All listening ports are probed.
|
|
26
|
+
|
|
27
|
+
3) **Connect port probe (HTTPS)**
|
|
28
|
+
- `POST https://127.0.0.1:<port>/exa.language_server_pb.LanguageServerService/GetUnleashData`
|
|
29
|
+
- Headers:
|
|
30
|
+
- `X-Codeium-Csrf-Token: <token>`
|
|
31
|
+
- `Connect-Protocol-Version: 1`
|
|
32
|
+
- First 200 OK response selects the connect port.
|
|
33
|
+
|
|
34
|
+
4) **Quota fetch**
|
|
35
|
+
- Primary:
|
|
36
|
+
- `POST https://127.0.0.1:<connectPort>/exa.language_server_pb.LanguageServerService/GetUserStatus`
|
|
37
|
+
- Fallback:
|
|
38
|
+
- `POST https://127.0.0.1:<connectPort>/exa.language_server_pb.LanguageServerService/GetCommandModelConfigs`
|
|
39
|
+
- If HTTPS fails, retry over HTTP on `extension_server_port`.
|
|
40
|
+
|
|
41
|
+
## Request body (summary)
|
|
42
|
+
- Minimal metadata payload:
|
|
43
|
+
- `ideName: antigravity`
|
|
44
|
+
- `extensionName: antigravity`
|
|
45
|
+
- `locale: en`
|
|
46
|
+
- `ideVersion: unknown`
|
|
47
|
+
|
|
48
|
+
## Parsing and model mapping
|
|
49
|
+
- Source fields:
|
|
50
|
+
- `userStatus.cascadeModelConfigData.clientModelConfigs[].quotaInfo.remainingFraction`
|
|
51
|
+
- `userStatus.cascadeModelConfigData.clientModelConfigs[].quotaInfo.resetTime`
|
|
52
|
+
- Mapping priority:
|
|
53
|
+
1) Claude (label contains `claude` but not `thinking`)
|
|
54
|
+
2) Gemini Pro Low (label contains `pro` + `low`)
|
|
55
|
+
3) Gemini Flash (label contains `gemini` + `flash`)
|
|
56
|
+
4) Fallback: lowest remaining percent
|
|
57
|
+
- `resetTime` parsing:
|
|
58
|
+
- ISO-8601 preferred; numeric epoch seconds as fallback.
|
|
59
|
+
- Identity:
|
|
60
|
+
- `accountEmail` and `planName` only from `GetUserStatus`.
|
|
61
|
+
|
|
62
|
+
## UI mapping
|
|
63
|
+
- Provider metadata:
|
|
64
|
+
- Display: `Antigravity`
|
|
65
|
+
- Labels: `Claude` (primary), `Gemini Pro` (secondary), `Gemini Flash` (tertiary)
|
|
66
|
+
- Status badge: Google Workspace incidents for the Gemini product.
|
|
67
|
+
|
|
68
|
+
## Constraints
|
|
69
|
+
- Internal protocol; fields may change.
|
|
70
|
+
- Requires `lsof` for port detection.
|
|
71
|
+
- Local HTTPS uses a self-signed cert; the probe allows insecure TLS.
|
|
72
|
+
|
|
73
|
+
## Key files
|
|
74
|
+
- `Sources/RunicCore/Providers/Antigravity/AntigravityStatusProbe.swift`
|
|
75
|
+
- `Sources/Runic/Providers/Antigravity/AntigravityProviderImplementation.swift`
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Architecture overview: modules, entry points, and data flow."
|
|
3
|
+
read_when:
|
|
4
|
+
- Reviewing architecture before feature work
|
|
5
|
+
- Refactoring app structure, app lifecycle, or module boundaries
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Architecture overview
|
|
9
|
+
|
|
10
|
+
## Modules
|
|
11
|
+
- `Sources/RunicCore`: fetch + parse (Codex RPC, PTY runner, Claude probes, OpenAI web scraping, status polling).
|
|
12
|
+
- `Sources/Runic`: state + UI (UsageStore, SettingsStore, StatusItemController, menus, icon rendering).
|
|
13
|
+
- `Sources/RunicWidget`: WidgetKit extension wired to the shared snapshot.
|
|
14
|
+
- `Sources/RunicCLI`: bundled CLI for `runic` usage/status output.
|
|
15
|
+
- `Sources/RunicMacros`: SwiftSyntax macros for provider registration.
|
|
16
|
+
- `Sources/RunicMacroSupport`: shared macro support used by app/core/CLI targets.
|
|
17
|
+
- `Sources/RunicClaudeWatchdog`: helper process for stable Claude CLI PTY sessions.
|
|
18
|
+
- `Sources/RunicClaudeWebProbe`: CLI helper to diagnose Claude web fetches.
|
|
19
|
+
|
|
20
|
+
## Entry points
|
|
21
|
+
- `RunicApp`: SwiftUI keepalive + Settings scene.
|
|
22
|
+
- `AppDelegate`: wires status controller, Sparkle updater, notifications.
|
|
23
|
+
|
|
24
|
+
## Data flow
|
|
25
|
+
- Background refresh → `UsageFetcher`/provider probes → `UsageStore` → menu/icon/widgets.
|
|
26
|
+
- Settings toggles feed `SettingsStore` → `UsageStore` refresh cadence + feature flags.
|
|
27
|
+
|
|
28
|
+
## Concurrency & platform
|
|
29
|
+
- Swift 6 strict concurrency enabled; prefer Sendable state and explicit MainActor hops.
|
|
30
|
+
- macOS 14+ targeting; avoid deprecated APIs when refactoring.
|
|
31
|
+
|
|
32
|
+
See also: `docs/providers.md`, `docs/refresh-loop.md`, `docs/ui.md`.
|
package/docs/claude.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Claude provider data sources: OAuth API, web API (cookies), CLI PTY, and local cost usage."
|
|
3
|
+
read_when:
|
|
4
|
+
- Debugging Claude usage/status parsing
|
|
5
|
+
- Updating Claude OAuth/web endpoints or cookie import
|
|
6
|
+
- Adjusting Claude CLI PTY automation
|
|
7
|
+
- Reviewing local cost usage scanning
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Claude provider
|
|
11
|
+
|
|
12
|
+
Claude supports three usage data paths plus local cost usage. Source selection is automatic unless debug override is set.
|
|
13
|
+
|
|
14
|
+
## Data sources + selection order
|
|
15
|
+
|
|
16
|
+
### Default selection (debug menu disabled)
|
|
17
|
+
1) OAuth API (if Claude CLI credentials include `user:profile` scope).
|
|
18
|
+
2) Web API (browser cookies, `sessionKey`), if OAuth missing.
|
|
19
|
+
3) CLI PTY (`claude`), if no OAuth and no web session.
|
|
20
|
+
|
|
21
|
+
### Debug selection (debug menu enabled)
|
|
22
|
+
- The Debug pane can force OAuth / Web / CLI.
|
|
23
|
+
- Web extras are internal-only (not exposed in the Providers pane).
|
|
24
|
+
|
|
25
|
+
## OAuth API (preferred)
|
|
26
|
+
- Credentials:
|
|
27
|
+
- Keychain service: `Claude Code-credentials` (primary on macOS).
|
|
28
|
+
- File fallback: `~/.claude/.credentials.json`.
|
|
29
|
+
- Requires `user:profile` scope (CLI tokens with only `user:inference` cannot call usage).
|
|
30
|
+
- Endpoint:
|
|
31
|
+
- `GET https://api.anthropic.com/api/oauth/usage`
|
|
32
|
+
- Headers:
|
|
33
|
+
- `Authorization: Bearer <access_token>`
|
|
34
|
+
- `anthropic-beta: oauth-2025-04-20`
|
|
35
|
+
- Mapping:
|
|
36
|
+
- `five_hour` → session window.
|
|
37
|
+
- `seven_day` → weekly window.
|
|
38
|
+
- `seven_day_sonnet` / `seven_day_opus` → model-specific weekly window.
|
|
39
|
+
- `extra_usage` → Extra usage cost (monthly spend/limit).
|
|
40
|
+
- Plan inference: `rate_limit_tier` from credentials maps to Max/Pro/Team/Enterprise.
|
|
41
|
+
|
|
42
|
+
## Web API (cookies)
|
|
43
|
+
- Cookie source order:
|
|
44
|
+
1) Safari: `~/Library/Cookies/Cookies.binarycookies`
|
|
45
|
+
2) Chrome/Chromium forks: `~/Library/Application Support/Google/Chrome/*/Cookies`
|
|
46
|
+
3) Firefox: `~/Library/Application Support/Firefox/Profiles/*/cookies.sqlite`
|
|
47
|
+
- Domain: `claude.ai`.
|
|
48
|
+
- Cookie name required:
|
|
49
|
+
- `sessionKey` (value prefix `sk-ant-...`).
|
|
50
|
+
- API calls (all include `Cookie: sessionKey=<value>`):
|
|
51
|
+
- `GET https://claude.ai/api/organizations` → org UUID.
|
|
52
|
+
- `GET https://claude.ai/api/organizations/{orgId}/usage` → session/weekly/opus.
|
|
53
|
+
- `GET https://claude.ai/api/organizations/{orgId}/overage_spend_limit` → Extra usage spend/limit.
|
|
54
|
+
- `GET https://claude.ai/api/account` → email + plan hints.
|
|
55
|
+
- Outputs:
|
|
56
|
+
- Session + weekly + model-specific percent used.
|
|
57
|
+
- Extra usage spend/limit (if enabled).
|
|
58
|
+
- Account email + inferred plan.
|
|
59
|
+
|
|
60
|
+
## CLI PTY (fallback)
|
|
61
|
+
- Runs `claude` in a persistent PTY session (`ClaudeCLISession`).
|
|
62
|
+
- Command flow:
|
|
63
|
+
1) Start CLI with `--allowed-tools ""` (no tools).
|
|
64
|
+
2) Auto-respond to first-run prompts (trust files, workspace, telemetry).
|
|
65
|
+
3) Send `/usage`, wait for rendered panel; send Enter retries if needed.
|
|
66
|
+
4) Optionally send `/status` to extract identity fields.
|
|
67
|
+
- Parsing (`ClaudeStatusProbe`):
|
|
68
|
+
- Strips ANSI, locates "Current session" + "Current week" headers.
|
|
69
|
+
- Extracts percent left/used and reset text near those headers.
|
|
70
|
+
- Parses `Account:` and `Org:` lines when present.
|
|
71
|
+
- Surfaces CLI errors (e.g. token expired) directly.
|
|
72
|
+
|
|
73
|
+
## Cost usage (local log scan)
|
|
74
|
+
- Source roots:
|
|
75
|
+
- `$CLAUDE_CONFIG_DIR` (comma-separated), each root uses `<root>/projects`.
|
|
76
|
+
- Fallback roots:
|
|
77
|
+
- `~/.config/claude/projects`
|
|
78
|
+
- `~/.claude/projects`
|
|
79
|
+
- Files: `**/*.jsonl` under the project roots.
|
|
80
|
+
- Parsing:
|
|
81
|
+
- Lines with `type: "assistant"` and `message.usage`.
|
|
82
|
+
- Uses per-model token counts (input, cache read/create, output).
|
|
83
|
+
- Deduplicates streaming chunks by `message.id + requestId` (usage is cumulative per chunk).
|
|
84
|
+
- Cache:
|
|
85
|
+
- `~/Library/Caches/Runic/cost-usage/claude-v1.json`
|
|
86
|
+
|
|
87
|
+
## Key files
|
|
88
|
+
- OAuth: `Sources/RunicCore/Providers/Claude/ClaudeOAuth/*`
|
|
89
|
+
- Web API: `Sources/RunicCore/Providers/Claude/ClaudeWeb/ClaudeWebAPIFetcher.swift`
|
|
90
|
+
- CLI PTY: `Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift`,
|
|
91
|
+
`Sources/RunicCore/Providers/Claude/ClaudeCLISession.swift`
|
|
92
|
+
- Cost usage: `Sources/RunicCore/CostUsageFetcher.swift`,
|
|
93
|
+
`Sources/RunicCore/Vendored/CostUsage/*`
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
# Integration Guide for New Runic CLI Commands
|
|
2
|
+
|
|
3
|
+
This guide provides step-by-step instructions for integrating the new tracking commands into the Runic CLI.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
Before integrating, ensure you have:
|
|
8
|
+
- All command files in `/Sources/RunicCLI/Commands/`
|
|
9
|
+
- Existing CLI infrastructure in `/Sources/RunicCLI/CLIEntry.swift`
|
|
10
|
+
- Helix framework dependency configured
|
|
11
|
+
- RunicCore module available
|
|
12
|
+
|
|
13
|
+
## Integration Steps
|
|
14
|
+
|
|
15
|
+
### 1. Update CLIEntry.swift
|
|
16
|
+
|
|
17
|
+
Open `/Sources/RunicCLI/CLIEntry.swift` and make the following changes:
|
|
18
|
+
|
|
19
|
+
#### A. Add Command Signatures
|
|
20
|
+
|
|
21
|
+
After the existing `insightsSignature` definition (around line 57), add:
|
|
22
|
+
|
|
23
|
+
```swift
|
|
24
|
+
// Models command signature
|
|
25
|
+
let modelsSignature = CommandSignature(
|
|
26
|
+
options: [
|
|
27
|
+
OptionDefinition(label: "provider", names: [.long("provider"), .short("p")],
|
|
28
|
+
help: "Filter by provider (claude, codex, gemini, etc.)"),
|
|
29
|
+
OptionDefinition(label: "days", names: [.long("days"), .short("d")],
|
|
30
|
+
help: "Number of days to analyze (default: 30)"),
|
|
31
|
+
OptionDefinition(label: "format", names: [.long("format")],
|
|
32
|
+
help: "Output format: text | json"),
|
|
33
|
+
],
|
|
34
|
+
flags: [
|
|
35
|
+
FlagDefinition(label: "json", names: [.long("json"), .short("j")],
|
|
36
|
+
help: "Output in JSON format"),
|
|
37
|
+
FlagDefinition(label: "pretty", names: [.long("pretty")],
|
|
38
|
+
help: "Pretty-print JSON output"),
|
|
39
|
+
FlagDefinition(label: "noColor", names: [.long("no-color")],
|
|
40
|
+
help: "Disable ANSI color codes"),
|
|
41
|
+
FlagDefinition(label: "groupByProject", names: [.long("by-project")],
|
|
42
|
+
help: "Group results by project"),
|
|
43
|
+
])
|
|
44
|
+
|
|
45
|
+
// Projects command signature
|
|
46
|
+
let projectsSignature = CommandSignature(
|
|
47
|
+
options: [
|
|
48
|
+
OptionDefinition(label: "stats", names: [.long("stats"), .short("s")],
|
|
49
|
+
help: "Show detailed stats for a specific project ID"),
|
|
50
|
+
OptionDefinition(label: "provider", names: [.long("provider"), .short("p")],
|
|
51
|
+
help: "Filter by provider"),
|
|
52
|
+
OptionDefinition(label: "days", names: [.long("days"), .short("d")],
|
|
53
|
+
help: "Number of days to analyze (default: 30)"),
|
|
54
|
+
OptionDefinition(label: "format", names: [.long("format")],
|
|
55
|
+
help: "Output format: text | json"),
|
|
56
|
+
],
|
|
57
|
+
flags: [
|
|
58
|
+
FlagDefinition(label: "list", names: [.long("list"), .short("l")],
|
|
59
|
+
help: "List all projects (default behavior)"),
|
|
60
|
+
FlagDefinition(label: "json", names: [.long("json"), .short("j")],
|
|
61
|
+
help: "Output in JSON format"),
|
|
62
|
+
FlagDefinition(label: "pretty", names: [.long("pretty")],
|
|
63
|
+
help: "Pretty-print JSON output"),
|
|
64
|
+
FlagDefinition(label: "noColor", names: [.long("no-color")],
|
|
65
|
+
help: "Disable ANSI color codes"),
|
|
66
|
+
FlagDefinition(label: "sortByName", names: [.long("sort-name")],
|
|
67
|
+
help: "Sort projects alphabetically by name"),
|
|
68
|
+
])
|
|
69
|
+
|
|
70
|
+
// Alerts command signature
|
|
71
|
+
let alertsSignature = CommandSignature(
|
|
72
|
+
options: [
|
|
73
|
+
OptionDefinition(label: "provider", names: [.long("provider"), .short("p")],
|
|
74
|
+
help: "Filter alerts by provider"),
|
|
75
|
+
OptionDefinition(label: "format", names: [.long("format")],
|
|
76
|
+
help: "Output format: text | json"),
|
|
77
|
+
],
|
|
78
|
+
flags: [
|
|
79
|
+
FlagDefinition(label: "active", names: [.long("active"), .short("a")],
|
|
80
|
+
help: "Show only active alerts (default)"),
|
|
81
|
+
FlagDefinition(label: "history", names: [.long("history"), .short("h")],
|
|
82
|
+
help: "Show alert history"),
|
|
83
|
+
FlagDefinition(label: "clear", names: [.long("clear"), .short("c")],
|
|
84
|
+
help: "Clear resolved alerts from history"),
|
|
85
|
+
FlagDefinition(label: "json", names: [.long("json"), .short("j")],
|
|
86
|
+
help: "Output in JSON format"),
|
|
87
|
+
FlagDefinition(label: "pretty", names: [.long("pretty")],
|
|
88
|
+
help: "Pretty-print JSON output"),
|
|
89
|
+
FlagDefinition(label: "noColor", names: [.long("no-color")],
|
|
90
|
+
help: "Disable ANSI color codes"),
|
|
91
|
+
])
|
|
92
|
+
|
|
93
|
+
// Reset command signature
|
|
94
|
+
let resetSignature = CommandSignature(
|
|
95
|
+
options: [
|
|
96
|
+
OptionDefinition(label: "when", names: [.long("when"), .short("w")],
|
|
97
|
+
help: "Show reset timing for specific provider"),
|
|
98
|
+
OptionDefinition(label: "format", names: [.long("format")],
|
|
99
|
+
help: "Output format: text | json"),
|
|
100
|
+
],
|
|
101
|
+
flags: [
|
|
102
|
+
FlagDefinition(label: "all", names: [.long("all"), .short("a")],
|
|
103
|
+
help: "Show all providers (default)"),
|
|
104
|
+
FlagDefinition(label: "json", names: [.long("json"), .short("j")],
|
|
105
|
+
help: "Output in JSON format"),
|
|
106
|
+
FlagDefinition(label: "pretty", names: [.long("pretty")],
|
|
107
|
+
help: "Pretty-print JSON output"),
|
|
108
|
+
FlagDefinition(label: "noColor", names: [.long("no-color")],
|
|
109
|
+
help: "Disable ANSI color codes"),
|
|
110
|
+
FlagDefinition(label: "compact", names: [.long("compact"), .short("c")],
|
|
111
|
+
help: "Show compact output"),
|
|
112
|
+
])
|
|
113
|
+
|
|
114
|
+
// Enhanced usage command signature
|
|
115
|
+
let usageEnhancedSignature = CommandSignature(
|
|
116
|
+
options: [
|
|
117
|
+
OptionDefinition(label: "provider", names: [.long("provider"), .short("p")],
|
|
118
|
+
help: "Filter by provider"),
|
|
119
|
+
OptionDefinition(label: "mode", names: [.long("mode"), .short("m")],
|
|
120
|
+
help: "Display mode: summary | detailed | breakdown | trending"),
|
|
121
|
+
OptionDefinition(label: "days", names: [.long("days"), .short("d")],
|
|
122
|
+
help: "Number of days for trending (default: 7)"),
|
|
123
|
+
OptionDefinition(label: "format", names: [.long("format")],
|
|
124
|
+
help: "Output format: text | json"),
|
|
125
|
+
],
|
|
126
|
+
flags: [
|
|
127
|
+
FlagDefinition(label: "json", names: [.long("json"), .short("j")],
|
|
128
|
+
help: "Output in JSON format"),
|
|
129
|
+
FlagDefinition(label: "pretty", names: [.long("pretty")],
|
|
130
|
+
help: "Pretty-print JSON output"),
|
|
131
|
+
FlagDefinition(label: "noColor", names: [.long("no-color")],
|
|
132
|
+
help: "Disable ANSI color codes"),
|
|
133
|
+
FlagDefinition(label: "showCost", names: [.long("show-cost")],
|
|
134
|
+
help: "Include cost information"),
|
|
135
|
+
FlagDefinition(label: "showProjected", names: [.long("projected")],
|
|
136
|
+
help: "Show projected usage at current rate"),
|
|
137
|
+
FlagDefinition(label: "compare", names: [.long("compare")],
|
|
138
|
+
help: "Compare usage across providers"),
|
|
139
|
+
])
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
#### B. Create Command Descriptors
|
|
143
|
+
|
|
144
|
+
After the descriptors (around line 75), add:
|
|
145
|
+
|
|
146
|
+
```swift
|
|
147
|
+
let modelsDescriptor = CommandDescriptor(
|
|
148
|
+
name: "models",
|
|
149
|
+
abstract: "Show model usage breakdown across providers",
|
|
150
|
+
discussion: nil,
|
|
151
|
+
signature: modelsSignature)
|
|
152
|
+
|
|
153
|
+
let projectsDescriptor = CommandDescriptor(
|
|
154
|
+
name: "projects",
|
|
155
|
+
abstract: "Track usage across different projects",
|
|
156
|
+
discussion: nil,
|
|
157
|
+
signature: projectsSignature)
|
|
158
|
+
|
|
159
|
+
let alertsDescriptor = CommandDescriptor(
|
|
160
|
+
name: "alerts",
|
|
161
|
+
abstract: "Manage usage threshold alerts",
|
|
162
|
+
discussion: nil,
|
|
163
|
+
signature: alertsSignature)
|
|
164
|
+
|
|
165
|
+
let resetDescriptor = CommandDescriptor(
|
|
166
|
+
name: "reset",
|
|
167
|
+
abstract: "Show when usage limits reset",
|
|
168
|
+
discussion: nil,
|
|
169
|
+
signature: resetSignature)
|
|
170
|
+
|
|
171
|
+
let usageEnhancedDescriptor = CommandDescriptor(
|
|
172
|
+
name: "usage-enhanced",
|
|
173
|
+
abstract: "Enhanced usage display with analytics",
|
|
174
|
+
discussion: nil,
|
|
175
|
+
signature: usageEnhancedSignature)
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
#### C. Update Program Initialization
|
|
179
|
+
|
|
180
|
+
Replace line 77 with:
|
|
181
|
+
|
|
182
|
+
```swift
|
|
183
|
+
let program = Program(descriptors: [
|
|
184
|
+
usageDescriptor,
|
|
185
|
+
costDescriptor,
|
|
186
|
+
insightsDescriptor,
|
|
187
|
+
modelsDescriptor,
|
|
188
|
+
projectsDescriptor,
|
|
189
|
+
alertsDescriptor,
|
|
190
|
+
resetDescriptor,
|
|
191
|
+
usageEnhancedDescriptor,
|
|
192
|
+
])
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
#### D. Add Command Handlers
|
|
196
|
+
|
|
197
|
+
In the switch statement (around line 82), update to:
|
|
198
|
+
|
|
199
|
+
```swift
|
|
200
|
+
switch invocation.descriptor.name {
|
|
201
|
+
case "usage":
|
|
202
|
+
await self.runUsage(invocation)
|
|
203
|
+
case "cost":
|
|
204
|
+
await self.runCost(invocation)
|
|
205
|
+
case "insights":
|
|
206
|
+
await self.runInsights(invocation)
|
|
207
|
+
case "models":
|
|
208
|
+
await self.runModels(invocation)
|
|
209
|
+
case "projects":
|
|
210
|
+
await self.runProjects(invocation)
|
|
211
|
+
case "alerts":
|
|
212
|
+
await self.runAlerts(invocation)
|
|
213
|
+
case "reset":
|
|
214
|
+
await self.runReset(invocation)
|
|
215
|
+
case "usage-enhanced":
|
|
216
|
+
await self.runUsageEnhanced(invocation)
|
|
217
|
+
default:
|
|
218
|
+
Self.exit(code: 1, message: "Unknown command")
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
#### E. Implement Command Methods
|
|
223
|
+
|
|
224
|
+
Add these methods after the existing command methods (after `runInsights`):
|
|
225
|
+
|
|
226
|
+
```swift
|
|
227
|
+
// MARK: - New Commands
|
|
228
|
+
|
|
229
|
+
private static func runModels(_ invocation: CommandInvocation) async {
|
|
230
|
+
await ModelsCommand.run(invocation)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
private static func runProjects(_ invocation: CommandInvocation) async {
|
|
234
|
+
await ProjectsCommand.run(invocation)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
private static func runAlerts(_ invocation: CommandInvocation) async {
|
|
238
|
+
await AlertsCommand.run(invocation)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
private static func runReset(_ invocation: CommandInvocation) async {
|
|
242
|
+
await ResetCommand.run(invocation)
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
private static func runUsageEnhanced(_ invocation: CommandInvocation) async {
|
|
246
|
+
await EnhancedUsageCommand.run(invocation)
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### 2. Build and Test
|
|
251
|
+
|
|
252
|
+
#### Build the CLI
|
|
253
|
+
```bash
|
|
254
|
+
cd /Users/srinivaspendela/Sriinnu/AI/Runic
|
|
255
|
+
swift build --target RunicCLI
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
#### Test Commands
|
|
259
|
+
```bash
|
|
260
|
+
# Test help
|
|
261
|
+
.build/debug/RunicCLI --help
|
|
262
|
+
|
|
263
|
+
# Test each command
|
|
264
|
+
.build/debug/RunicCLI models
|
|
265
|
+
.build/debug/RunicCLI projects
|
|
266
|
+
.build/debug/RunicCLI alerts
|
|
267
|
+
.build/debug/RunicCLI reset
|
|
268
|
+
.build/debug/RunicCLI usage-enhanced
|
|
269
|
+
|
|
270
|
+
# Test with options
|
|
271
|
+
.build/debug/RunicCLI models --provider claude --json --pretty
|
|
272
|
+
.build/debug/RunicCLI projects --list
|
|
273
|
+
.build/debug/RunicCLI alerts --active
|
|
274
|
+
.build/debug/RunicCLI reset --compact
|
|
275
|
+
.build/debug/RunicCLI usage-enhanced --mode trending --days 30
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### 3. Troubleshooting
|
|
279
|
+
|
|
280
|
+
#### Common Issues
|
|
281
|
+
|
|
282
|
+
**Issue: "Unknown command" error**
|
|
283
|
+
- Verify the command descriptor is added to the Program initialization
|
|
284
|
+
- Check the case statement includes the command name
|
|
285
|
+
|
|
286
|
+
**Issue: Compilation errors**
|
|
287
|
+
- Ensure all command files are in the correct directory
|
|
288
|
+
- Verify imports are correct
|
|
289
|
+
- Check that RunicCore exports required types
|
|
290
|
+
|
|
291
|
+
**Issue: "No such module" errors**
|
|
292
|
+
- Verify Package.swift includes all dependencies
|
|
293
|
+
- Run `swift package clean && swift build`
|
|
294
|
+
|
|
295
|
+
**Issue: Color output not working**
|
|
296
|
+
- Check terminal supports ANSI colors
|
|
297
|
+
- Use `--no-color` flag to disable colors
|
|
298
|
+
|
|
299
|
+
### 4. Optional: Add to Package.swift
|
|
300
|
+
|
|
301
|
+
If you want to build the commands as a separate module (optional):
|
|
302
|
+
|
|
303
|
+
```swift
|
|
304
|
+
.target(
|
|
305
|
+
name: "RunicCLICommands",
|
|
306
|
+
dependencies: [
|
|
307
|
+
"RunicCore",
|
|
308
|
+
.product(name: "Helix", package: "Helix"),
|
|
309
|
+
],
|
|
310
|
+
path: "Sources/RunicCLI/Commands",
|
|
311
|
+
swiftSettings: [
|
|
312
|
+
.enableUpcomingFeature("StrictConcurrency"),
|
|
313
|
+
]),
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
Then update RunicCLI target:
|
|
317
|
+
```swift
|
|
318
|
+
.executableTarget(
|
|
319
|
+
name: "RunicCLI",
|
|
320
|
+
dependencies: [
|
|
321
|
+
"RunicCore",
|
|
322
|
+
"RunicCLICommands", // Add this
|
|
323
|
+
.product(name: "Helix", package: "Helix"),
|
|
324
|
+
],
|
|
325
|
+
// ...
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### 5. Documentation
|
|
329
|
+
|
|
330
|
+
Update the main README or CLI documentation to include:
|
|
331
|
+
- List of new commands
|
|
332
|
+
- Usage examples
|
|
333
|
+
- Feature descriptions
|
|
334
|
+
- Sample output
|
|
335
|
+
|
|
336
|
+
## Verification Checklist
|
|
337
|
+
|
|
338
|
+
- [ ] All command files are in `/Sources/RunicCLI/Commands/`
|
|
339
|
+
- [ ] CLIEntry.swift has been updated
|
|
340
|
+
- [ ] Code compiles without errors
|
|
341
|
+
- [ ] All commands respond to `--help`
|
|
342
|
+
- [ ] Commands produce correct output
|
|
343
|
+
- [ ] JSON output is valid
|
|
344
|
+
- [ ] Color output works in terminal
|
|
345
|
+
- [ ] Error messages are clear
|
|
346
|
+
- [ ] Exit codes are correct
|
|
347
|
+
|
|
348
|
+
## Next Steps
|
|
349
|
+
|
|
350
|
+
1. **Testing**: Write unit tests for each command
|
|
351
|
+
2. **Documentation**: Add detailed user documentation
|
|
352
|
+
3. **Examples**: Create example scripts showing common workflows
|
|
353
|
+
4. **Integration**: Consider CI/CD integration for automated testing
|
|
354
|
+
5. **Performance**: Profile command execution times
|
|
355
|
+
6. **Features**: Implement additional features as needed
|
|
356
|
+
|
|
357
|
+
## Support
|
|
358
|
+
|
|
359
|
+
For questions or issues:
|
|
360
|
+
1. Check the README.md in this directory
|
|
361
|
+
2. Review command source code
|
|
362
|
+
3. Check existing CLI patterns in CLIEntry.swift
|
|
363
|
+
4. Consult Helix documentation for argument parsing
|
|
364
|
+
|
|
365
|
+
## Notes
|
|
366
|
+
|
|
367
|
+
- All commands use async/await for data fetching
|
|
368
|
+
- Commands are designed to be composable (output can be piped)
|
|
369
|
+
- JSON output is suitable for scripting and automation
|
|
370
|
+
- Error handling follows CLI best practices
|
|
371
|
+
- Color codes are compatible with most terminal emulators
|