@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
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
# Contributing to Runic
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to Runic! This document provides guidelines and instructions for contributing.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📋 Table of Contents
|
|
8
|
+
|
|
9
|
+
- [Code of Conduct](#code-of-conduct)
|
|
10
|
+
- [How Can I Contribute?](#how-can-i-contribute)
|
|
11
|
+
- [Development Setup](#development-setup)
|
|
12
|
+
- [Code Quality Standards](#code-quality-standards)
|
|
13
|
+
- [Pull Request Process](#pull-request-process)
|
|
14
|
+
- [Testing Guidelines](#testing-guidelines)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 📜 Code of Conduct
|
|
19
|
+
|
|
20
|
+
### Our Pledge
|
|
21
|
+
|
|
22
|
+
We are committed to providing a welcoming and inclusive environment for all contributors.
|
|
23
|
+
|
|
24
|
+
### Our Standards
|
|
25
|
+
|
|
26
|
+
- ✅ Use welcoming and inclusive language
|
|
27
|
+
- ✅ Be respectful of differing viewpoints and experiences
|
|
28
|
+
- ✅ Accept constructive criticism gracefully
|
|
29
|
+
- ✅ Focus on what is best for the community
|
|
30
|
+
- ✅ Show empathy towards other community members
|
|
31
|
+
|
|
32
|
+
### Unacceptable Behavior
|
|
33
|
+
|
|
34
|
+
- ❌ Harassment, trolling, or derogatory comments
|
|
35
|
+
- ❌ Personal or political attacks
|
|
36
|
+
- ❌ Publishing others' private information
|
|
37
|
+
- ❌ Unprofessional conduct
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 🤝 How Can I Contribute?
|
|
42
|
+
|
|
43
|
+
### Reporting Bugs
|
|
44
|
+
|
|
45
|
+
Before creating a bug report:
|
|
46
|
+
1. Check existing issues to avoid duplicates
|
|
47
|
+
2. Collect relevant information (OS, version, steps to reproduce)
|
|
48
|
+
3. Include error messages and logs if applicable
|
|
49
|
+
|
|
50
|
+
**Bug Report Template:**
|
|
51
|
+
```markdown
|
|
52
|
+
**Description**: Clear description of the bug
|
|
53
|
+
**Steps to Reproduce**:
|
|
54
|
+
1. Step one
|
|
55
|
+
2. Step two
|
|
56
|
+
3. ...
|
|
57
|
+
|
|
58
|
+
**Expected Behavior**: What should happen
|
|
59
|
+
**Actual Behavior**: What actually happens
|
|
60
|
+
**Environment**:
|
|
61
|
+
- OS: macOS 14.0
|
|
62
|
+
- Version: Runic 2.0
|
|
63
|
+
- Platform: macOS/iOS/Windows/Android
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Suggesting Enhancements
|
|
67
|
+
|
|
68
|
+
Enhancement suggestions are welcome! Please include:
|
|
69
|
+
- Clear use case description
|
|
70
|
+
- Why this enhancement would be useful
|
|
71
|
+
- Potential implementation approach (if you have ideas)
|
|
72
|
+
|
|
73
|
+
### Security Issues
|
|
74
|
+
|
|
75
|
+
**DO NOT** open public issues for security vulnerabilities. Instead:
|
|
76
|
+
1. Review [SECURITY_AUDIT.md](SECURITY_AUDIT.md)
|
|
77
|
+
2. Email security concerns privately
|
|
78
|
+
3. Allow reasonable time for fixes before disclosure
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 💻 Development Setup
|
|
83
|
+
|
|
84
|
+
### Prerequisites
|
|
85
|
+
|
|
86
|
+
- **macOS/iOS**: Xcode 15.0+, Swift 6.2+
|
|
87
|
+
- **Windows/Android**: Node.js 18+, React Native CLI
|
|
88
|
+
- **API/MCP**: Node.js 18+, TypeScript 5.7+
|
|
89
|
+
- **Git**: For version control
|
|
90
|
+
|
|
91
|
+
### Initial Setup
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Clone your fork
|
|
95
|
+
git clone https://github.com/YOUR_USERNAME/Runic.git
|
|
96
|
+
cd Runic
|
|
97
|
+
|
|
98
|
+
# Add upstream remote
|
|
99
|
+
git remote add upstream https://github.com/sriinnu/Runic.git
|
|
100
|
+
|
|
101
|
+
# Setup all platforms
|
|
102
|
+
./Scripts/setup-all.sh
|
|
103
|
+
|
|
104
|
+
# Run tests to verify setup
|
|
105
|
+
./test-all.sh
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Building Components
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# macOS app (complete build with frameworks)
|
|
112
|
+
./Scripts/build-macos.sh --skip-tests
|
|
113
|
+
|
|
114
|
+
# Swift CLI tool only
|
|
115
|
+
swift build
|
|
116
|
+
|
|
117
|
+
# API Server
|
|
118
|
+
cd api-server && npm install && npx tsc
|
|
119
|
+
|
|
120
|
+
# MCP Servers
|
|
121
|
+
cd mcp-servers && ./setup.sh
|
|
122
|
+
|
|
123
|
+
# React Native
|
|
124
|
+
cd runic-cross-platform && npm install
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## ✨ Code Quality Standards
|
|
130
|
+
|
|
131
|
+
### Swift Code
|
|
132
|
+
|
|
133
|
+
**Documentation:**
|
|
134
|
+
```swift
|
|
135
|
+
/// Brief description of what this function does
|
|
136
|
+
///
|
|
137
|
+
/// - Parameters:
|
|
138
|
+
/// - param1: Description of param1
|
|
139
|
+
/// - param2: Description of param2
|
|
140
|
+
/// - Returns: Description of return value
|
|
141
|
+
/// - Throws: Description of errors that can be thrown
|
|
142
|
+
func myFunction(param1: String, param2: Int) throws -> Bool {
|
|
143
|
+
// Implementation
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**File Size:**
|
|
148
|
+
- Maximum 300 lines per Swift file
|
|
149
|
+
- Split large files into logical modules
|
|
150
|
+
|
|
151
|
+
**Concurrency:**
|
|
152
|
+
```swift
|
|
153
|
+
// ✅ Good - Explicit concurrency
|
|
154
|
+
actor MyActor {
|
|
155
|
+
func doSomething() async throws { }
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// ❌ Bad - No concurrency annotation
|
|
159
|
+
class MyClass {
|
|
160
|
+
func doSomething() { /* async work */ }
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### TypeScript Code
|
|
165
|
+
|
|
166
|
+
**Documentation:**
|
|
167
|
+
```typescript
|
|
168
|
+
/**
|
|
169
|
+
* Brief description of the function
|
|
170
|
+
*
|
|
171
|
+
* @param param1 - Description of param1
|
|
172
|
+
* @param param2 - Description of param2
|
|
173
|
+
* @returns Description of return value
|
|
174
|
+
* @throws Description of errors
|
|
175
|
+
*/
|
|
176
|
+
function myFunction(param1: string, param2: number): boolean {
|
|
177
|
+
// Implementation
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**File Size:**
|
|
182
|
+
- Maximum 400 lines per TypeScript file
|
|
183
|
+
- Use module splitting for large files
|
|
184
|
+
|
|
185
|
+
**Type Safety:**
|
|
186
|
+
```typescript
|
|
187
|
+
// ✅ Good - Strict typing
|
|
188
|
+
interface User {
|
|
189
|
+
id: string;
|
|
190
|
+
name: string;
|
|
191
|
+
email: string;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function getUser(id: string): User {
|
|
195
|
+
// Implementation
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// ❌ Bad - Using 'any'
|
|
199
|
+
function getUser(id: any): any {
|
|
200
|
+
// Implementation
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### General Guidelines
|
|
205
|
+
|
|
206
|
+
1. **No Secrets in Code**
|
|
207
|
+
- Never commit API keys, tokens, or credentials
|
|
208
|
+
- Use environment variables or Keychain
|
|
209
|
+
- Check .gitignore before committing
|
|
210
|
+
|
|
211
|
+
2. **Error Handling**
|
|
212
|
+
- Always handle errors gracefully
|
|
213
|
+
- Log errors appropriately (never log tokens!)
|
|
214
|
+
- Provide user-friendly error messages
|
|
215
|
+
|
|
216
|
+
3. **Performance**
|
|
217
|
+
- Keep UI responsive (60 FPS target)
|
|
218
|
+
- Minimize network requests
|
|
219
|
+
- Cache data appropriately
|
|
220
|
+
|
|
221
|
+
4. **Security**
|
|
222
|
+
- Store credentials in Keychain
|
|
223
|
+
- Use HTTPS only
|
|
224
|
+
- No token logging
|
|
225
|
+
- Validate all inputs
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 🔀 Pull Request Process
|
|
230
|
+
|
|
231
|
+
### Before Submitting
|
|
232
|
+
|
|
233
|
+
1. **Update from upstream:**
|
|
234
|
+
```bash
|
|
235
|
+
git fetch upstream
|
|
236
|
+
git rebase upstream/main
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
2. **Run all tests:**
|
|
240
|
+
```bash
|
|
241
|
+
./test-all.sh
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
3. **Verify no sensitive data:**
|
|
245
|
+
```bash
|
|
246
|
+
git diff --cached | grep -i "api.*key\|token\|secret"
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### PR Checklist
|
|
250
|
+
|
|
251
|
+
- [ ] Code follows style guidelines
|
|
252
|
+
- [ ] All files have appropriate documentation
|
|
253
|
+
- [ ] No file exceeds size limits (300-400 lines)
|
|
254
|
+
- [ ] All tests pass (`./test-all.sh`)
|
|
255
|
+
- [ ] No compiler warnings
|
|
256
|
+
- [ ] No sensitive data in commit
|
|
257
|
+
- [ ] Commit messages are clear and descriptive
|
|
258
|
+
|
|
259
|
+
### PR Template
|
|
260
|
+
|
|
261
|
+
```markdown
|
|
262
|
+
## Description
|
|
263
|
+
Brief description of changes
|
|
264
|
+
|
|
265
|
+
## Type of Change
|
|
266
|
+
- [ ] Bug fix (non-breaking change)
|
|
267
|
+
- [ ] New feature (non-breaking change)
|
|
268
|
+
- [ ] Breaking change
|
|
269
|
+
- [ ] Documentation update
|
|
270
|
+
|
|
271
|
+
## Testing
|
|
272
|
+
How was this tested?
|
|
273
|
+
|
|
274
|
+
## Screenshots (if UI changes)
|
|
275
|
+
Add screenshots here
|
|
276
|
+
|
|
277
|
+
## Checklist
|
|
278
|
+
- [ ] Code follows guidelines
|
|
279
|
+
- [ ] All tests pass
|
|
280
|
+
- [ ] Documentation updated
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Review Process
|
|
284
|
+
|
|
285
|
+
1. Automated CI checks must pass
|
|
286
|
+
2. At least one maintainer review required
|
|
287
|
+
3. All review comments addressed
|
|
288
|
+
4. Squash commits before merge (if requested)
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## 🧪 Testing Guidelines
|
|
293
|
+
|
|
294
|
+
### Running Tests
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
# All tests
|
|
298
|
+
./test-all.sh
|
|
299
|
+
|
|
300
|
+
# Swift only
|
|
301
|
+
swift test
|
|
302
|
+
|
|
303
|
+
# TypeScript (API Server)
|
|
304
|
+
cd api-server && npm test
|
|
305
|
+
|
|
306
|
+
# TypeScript (MCP Servers)
|
|
307
|
+
cd mcp-servers/persistence-server && npm test
|
|
308
|
+
|
|
309
|
+
# React Native
|
|
310
|
+
cd runic-cross-platform && npm test
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Writing Tests
|
|
314
|
+
|
|
315
|
+
**Swift:**
|
|
316
|
+
```swift
|
|
317
|
+
import XCTest
|
|
318
|
+
@testable import RunicCore
|
|
319
|
+
|
|
320
|
+
final class MyTests: XCTestCase {
|
|
321
|
+
func testExample() throws {
|
|
322
|
+
let result = myFunction()
|
|
323
|
+
XCTAssertEqual(result, expectedValue)
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**TypeScript:**
|
|
329
|
+
```typescript
|
|
330
|
+
import { describe, it, expect } from '@jest/globals';
|
|
331
|
+
|
|
332
|
+
describe('MyModule', () => {
|
|
333
|
+
it('should do something', () => {
|
|
334
|
+
const result = myFunction();
|
|
335
|
+
expect(result).toBe(expectedValue);
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Test Coverage
|
|
341
|
+
|
|
342
|
+
- Aim for 80%+ code coverage
|
|
343
|
+
- Test edge cases and error conditions
|
|
344
|
+
- Mock external dependencies
|
|
345
|
+
- No tests should require network access
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
## 📝 Commit Message Guidelines
|
|
350
|
+
|
|
351
|
+
### Format
|
|
352
|
+
|
|
353
|
+
```
|
|
354
|
+
<type>: <subject>
|
|
355
|
+
|
|
356
|
+
<body>
|
|
357
|
+
|
|
358
|
+
<footer>
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Types
|
|
362
|
+
|
|
363
|
+
- `feat`: New feature
|
|
364
|
+
- `fix`: Bug fix
|
|
365
|
+
- `docs`: Documentation changes
|
|
366
|
+
- `style`: Formatting changes
|
|
367
|
+
- `refactor`: Code refactoring
|
|
368
|
+
- `test`: Adding tests
|
|
369
|
+
- `chore`: Maintenance tasks
|
|
370
|
+
|
|
371
|
+
### Examples
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
# Good
|
|
375
|
+
feat: Add model usage tracking to CLI
|
|
376
|
+
|
|
377
|
+
Added new 'models' command to CLI that shows usage breakdown
|
|
378
|
+
by AI model. Includes JSON output mode and filtering options.
|
|
379
|
+
|
|
380
|
+
Closes #123
|
|
381
|
+
|
|
382
|
+
# Bad
|
|
383
|
+
update stuff
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## 🎨 Code Style
|
|
389
|
+
|
|
390
|
+
### Swift
|
|
391
|
+
|
|
392
|
+
Follow [Swift API Design Guidelines](https://swift.org/documentation/api-design-guidelines/)
|
|
393
|
+
|
|
394
|
+
```swift
|
|
395
|
+
// ✅ Good
|
|
396
|
+
func fetchUserData(for userID: String) async throws -> User
|
|
397
|
+
|
|
398
|
+
// ❌ Bad
|
|
399
|
+
func FetchUserData(userID: String) -> User
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### TypeScript
|
|
403
|
+
|
|
404
|
+
Follow [TypeScript Coding Guidelines](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines)
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
// ✅ Good
|
|
408
|
+
async function fetchUserData(userId: string): Promise<User>
|
|
409
|
+
|
|
410
|
+
// ❌ Bad
|
|
411
|
+
function FetchUserData(userID: any)
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## 🏗️ Architecture Decisions
|
|
417
|
+
|
|
418
|
+
When making architectural decisions:
|
|
419
|
+
|
|
420
|
+
1. **Document the decision** in appropriate markdown file
|
|
421
|
+
2. **Consider multi-platform impact** - will this work on all platforms?
|
|
422
|
+
3. **Security implications** - does this affect security?
|
|
423
|
+
4. **Performance impact** - benchmarks if significant
|
|
424
|
+
5. **Breaking changes** - document and version appropriately
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## 📬 Communication
|
|
429
|
+
|
|
430
|
+
### Where to Ask Questions
|
|
431
|
+
|
|
432
|
+
- **General Questions**: GitHub Discussions
|
|
433
|
+
- **Bug Reports**: GitHub Issues
|
|
434
|
+
- **Feature Requests**: GitHub Issues (with `enhancement` label)
|
|
435
|
+
- **Security**: Private email (see SECURITY_AUDIT.md)
|
|
436
|
+
|
|
437
|
+
### Response Times
|
|
438
|
+
|
|
439
|
+
- We aim to respond to issues within 48 hours
|
|
440
|
+
- Pull requests reviewed within 1 week
|
|
441
|
+
- Security issues get priority response
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
## 🎁 Recognition
|
|
446
|
+
|
|
447
|
+
Contributors will be:
|
|
448
|
+
- Listed in CONTRIBUTORS.md (if file exists)
|
|
449
|
+
- Credited in release notes
|
|
450
|
+
- Mentioned in project documentation
|
|
451
|
+
|
|
452
|
+
Thank you for contributing to Runic! 🙏
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
**Questions?** Open a discussion on GitHub or check our [documentation](docs/).
|
package/Icon.icns
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fill" : {
|
|
3
|
+
"automatic-gradient" : "extended-srgb:0.00000,0.53333,1.00000,1.00000"
|
|
4
|
+
},
|
|
5
|
+
"groups" : [
|
|
6
|
+
{
|
|
7
|
+
"layers" : [
|
|
8
|
+
{
|
|
9
|
+
"image-name" : "runic.png",
|
|
10
|
+
"name" : "runic",
|
|
11
|
+
"position" : {
|
|
12
|
+
"scale" : 1.4,
|
|
13
|
+
"translation-in-points" : [
|
|
14
|
+
0,
|
|
15
|
+
0
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"shadow" : {
|
|
21
|
+
"kind" : "neutral",
|
|
22
|
+
"opacity" : 0.5
|
|
23
|
+
},
|
|
24
|
+
"translucency" : {
|
|
25
|
+
"enabled" : true,
|
|
26
|
+
"value" : 0.5
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"supported-platforms" : {
|
|
31
|
+
"circles" : [
|
|
32
|
+
"watchOS"
|
|
33
|
+
],
|
|
34
|
+
"squares" : "shared"
|
|
35
|
+
}
|
|
36
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Srinivas Pendela
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/Package.resolved
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"originHash" : "922f9b098f198e80a7ee17ff462e68edeed8511d5c3151ee112b42466f0cf6f7",
|
|
3
|
+
"pins" : [
|
|
4
|
+
{
|
|
5
|
+
"identity" : "cryptoswift",
|
|
6
|
+
"kind" : "remoteSourceControl",
|
|
7
|
+
"location" : "https://github.com/krzyzanowskim/CryptoSwift.git",
|
|
8
|
+
"state" : {
|
|
9
|
+
"revision" : "e45a26384239e028ec87fbcc788f513b67e10d8f",
|
|
10
|
+
"version" : "1.9.0"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"identity" : "keyboardshortcuts",
|
|
15
|
+
"kind" : "remoteSourceControl",
|
|
16
|
+
"location" : "https://github.com/sindresorhus/KeyboardShortcuts",
|
|
17
|
+
"state" : {
|
|
18
|
+
"revision" : "ac12762853126cf2e7ad63a6a58e1c9f58c6a0ee",
|
|
19
|
+
"version" : "1.17.0"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"identity" : "sparkle",
|
|
24
|
+
"kind" : "remoteSourceControl",
|
|
25
|
+
"location" : "https://github.com/sparkle-project/Sparkle",
|
|
26
|
+
"state" : {
|
|
27
|
+
"revision" : "5581748cef2bae787496fe6d61139aebe0a451f6",
|
|
28
|
+
"version" : "2.8.1"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"identity" : "swift-log",
|
|
33
|
+
"kind" : "remoteSourceControl",
|
|
34
|
+
"location" : "https://github.com/apple/swift-log",
|
|
35
|
+
"state" : {
|
|
36
|
+
"revision" : "bc386b95f2a16ccd0150a8235e7c69eab2b866ca",
|
|
37
|
+
"version" : "1.8.0"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"identity" : "swift-syntax",
|
|
42
|
+
"kind" : "remoteSourceControl",
|
|
43
|
+
"location" : "https://github.com/apple/swift-syntax",
|
|
44
|
+
"state" : {
|
|
45
|
+
"revision" : "0687f71944021d616d34d922343dcef086855920",
|
|
46
|
+
"version" : "600.0.1"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"version" : 3
|
|
51
|
+
}
|
package/Package.swift
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// swift-tools-version: 6.2
|
|
2
|
+
import CompilerPluginSupport
|
|
3
|
+
import Foundation
|
|
4
|
+
import PackageDescription
|
|
5
|
+
|
|
6
|
+
// Prefer vendored first-party packages in-repo. Fallback to sibling workspace, then remote.
|
|
7
|
+
func localPackageDependency(paths: [String], remoteURL: String) -> Package.Dependency {
|
|
8
|
+
for path in paths where FileManager.default.fileExists(atPath: path) {
|
|
9
|
+
return .package(path: path)
|
|
10
|
+
}
|
|
11
|
+
return .package(url: remoteURL, from: "1.0.0")
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let siloDependency = localPackageDependency(
|
|
15
|
+
paths: ["Packages/Silo", "../Packages/Silo"],
|
|
16
|
+
remoteURL: "https://github.com/sriinnu/Silo")
|
|
17
|
+
|
|
18
|
+
let helixDependency = localPackageDependency(
|
|
19
|
+
paths: ["Packages/Helix", "../Packages/Helix"],
|
|
20
|
+
remoteURL: "https://github.com/sriinnu/Helix")
|
|
21
|
+
|
|
22
|
+
let package = Package(
|
|
23
|
+
name: "Runic",
|
|
24
|
+
platforms: [
|
|
25
|
+
.macOS(.v14),
|
|
26
|
+
],
|
|
27
|
+
dependencies: [
|
|
28
|
+
.package(url: "https://github.com/sparkle-project/Sparkle", from: "2.8.1"),
|
|
29
|
+
helixDependency,
|
|
30
|
+
.package(url: "https://github.com/apple/swift-log", from: "1.8.0"),
|
|
31
|
+
.package(url: "https://github.com/apple/swift-syntax", from: "600.0.0"),
|
|
32
|
+
.package(url: "https://github.com/sindresorhus/KeyboardShortcuts", from: "1.10.0"),
|
|
33
|
+
siloDependency,
|
|
34
|
+
],
|
|
35
|
+
targets: {
|
|
36
|
+
var targets: [Target] = [
|
|
37
|
+
.target(
|
|
38
|
+
name: "RunicCore",
|
|
39
|
+
dependencies: [
|
|
40
|
+
"RunicMacroSupport",
|
|
41
|
+
.product(name: "Logging", package: "swift-log"),
|
|
42
|
+
.product(name: "Silo", package: "Silo"),
|
|
43
|
+
],
|
|
44
|
+
// Sync directory now enabled for iCloud CloudKit synchronization
|
|
45
|
+
// exclude: [
|
|
46
|
+
// "Sync",
|
|
47
|
+
// ],
|
|
48
|
+
swiftSettings: [
|
|
49
|
+
.enableUpcomingFeature("StrictConcurrency"),
|
|
50
|
+
]),
|
|
51
|
+
.macro(
|
|
52
|
+
name: "RunicMacros",
|
|
53
|
+
dependencies: [
|
|
54
|
+
.product(name: "SwiftCompilerPlugin", package: "swift-syntax"),
|
|
55
|
+
.product(name: "SwiftSyntaxBuilder", package: "swift-syntax"),
|
|
56
|
+
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
|
|
57
|
+
]),
|
|
58
|
+
.target(
|
|
59
|
+
name: "RunicMacroSupport",
|
|
60
|
+
dependencies: [
|
|
61
|
+
"RunicMacros",
|
|
62
|
+
]),
|
|
63
|
+
.executableTarget(
|
|
64
|
+
name: "RunicCLI",
|
|
65
|
+
dependencies: [
|
|
66
|
+
"RunicCore",
|
|
67
|
+
.product(name: "Helix", package: "Helix"),
|
|
68
|
+
],
|
|
69
|
+
path: "Sources/RunicCLI",
|
|
70
|
+
swiftSettings: [
|
|
71
|
+
.enableUpcomingFeature("StrictConcurrency"),
|
|
72
|
+
]),
|
|
73
|
+
.testTarget(
|
|
74
|
+
name: "RunicLinuxTests",
|
|
75
|
+
dependencies: ["RunicCore", "RunicCLI"],
|
|
76
|
+
path: "TestsLinux",
|
|
77
|
+
swiftSettings: [
|
|
78
|
+
.enableUpcomingFeature("StrictConcurrency"),
|
|
79
|
+
.enableExperimentalFeature("SwiftTesting"),
|
|
80
|
+
]),
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
#if os(macOS)
|
|
84
|
+
targets.append(contentsOf: [
|
|
85
|
+
.executableTarget(
|
|
86
|
+
name: "RunicClaudeWatchdog",
|
|
87
|
+
dependencies: [],
|
|
88
|
+
path: "Sources/RunicClaudeWatchdog",
|
|
89
|
+
swiftSettings: [
|
|
90
|
+
.enableUpcomingFeature("StrictConcurrency"),
|
|
91
|
+
]),
|
|
92
|
+
.executableTarget(
|
|
93
|
+
name: "Runic",
|
|
94
|
+
dependencies: [
|
|
95
|
+
.product(name: "Sparkle", package: "Sparkle"),
|
|
96
|
+
.product(name: "KeyboardShortcuts", package: "KeyboardShortcuts"),
|
|
97
|
+
"RunicMacroSupport",
|
|
98
|
+
"RunicCore",
|
|
99
|
+
],
|
|
100
|
+
path: "Sources/Runic",
|
|
101
|
+
resources: [
|
|
102
|
+
.copy("Resources"),
|
|
103
|
+
],
|
|
104
|
+
swiftSettings: [
|
|
105
|
+
// Opt into Swift 6 strict concurrency (approachable migration path).
|
|
106
|
+
.enableUpcomingFeature("StrictConcurrency"),
|
|
107
|
+
.define("ENABLE_SPARKLE"),
|
|
108
|
+
]),
|
|
109
|
+
.executableTarget(
|
|
110
|
+
name: "RunicWidget",
|
|
111
|
+
dependencies: ["RunicCore"],
|
|
112
|
+
path: "Sources/RunicWidget",
|
|
113
|
+
swiftSettings: [
|
|
114
|
+
.enableUpcomingFeature("StrictConcurrency"),
|
|
115
|
+
]),
|
|
116
|
+
.executableTarget(
|
|
117
|
+
name: "RunicClaudeWebProbe",
|
|
118
|
+
dependencies: ["RunicCore"],
|
|
119
|
+
path: "Sources/RunicClaudeWebProbe",
|
|
120
|
+
swiftSettings: [
|
|
121
|
+
.enableUpcomingFeature("StrictConcurrency"),
|
|
122
|
+
]),
|
|
123
|
+
])
|
|
124
|
+
|
|
125
|
+
targets.append(.testTarget(
|
|
126
|
+
name: "RunicTests",
|
|
127
|
+
dependencies: ["Runic", "RunicCore", "RunicCLI"],
|
|
128
|
+
path: "Tests",
|
|
129
|
+
swiftSettings: [
|
|
130
|
+
.enableUpcomingFeature("StrictConcurrency"),
|
|
131
|
+
.enableExperimentalFeature("SwiftTesting"),
|
|
132
|
+
]))
|
|
133
|
+
#endif
|
|
134
|
+
|
|
135
|
+
return targets
|
|
136
|
+
}())
|