From 5ac2f7a120ae506a60ae9191a1d7caa22cef394b Mon Sep 17 00:00:00 2001 From: Hasaam Date: Mon, 28 Sep 2026 21:21:08 -0400 Subject: [PATCH 1/6] build: move to Swift 6, macOS 26 and synchronized Xcode folders Regenerate the Xcode project with file-system synchronized groups so new files are picked up automatically, add a unit-test target and shared scheme, and enable strict concurrency. Add a CI workflow that runs the tests and builds the app. --- .github/workflows/ci.yml | 29 + .gitignore | 26 +- PRMonitor.xcodeproj/project.pbxproj | 529 +++++++++++------- .../xcshareddata/xcschemes/PRMonitor.xcscheme | 35 ++ PRMonitorApp/Info.plist | 52 +- Package.swift | 11 +- 6 files changed, 449 insertions(+), 233 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 PRMonitor.xcodeproj/xcshareddata/xcschemes/PRMonitor.xcscheme diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..9c180eb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + name: Test and build + runs-on: macos-26 + steps: + - uses: actions/checkout@v4 + + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: latest-stable + + - name: Unit tests (SwiftPM) + run: swift test + + - name: Build app (Xcode, Release) + run: | + xcodebuild -project PRMonitor.xcodeproj -scheme PRMonitor -configuration Release \ + -derivedDataPath build CODE_SIGNING_ALLOWED=NO build diff --git a/.gitignore b/.gitignore index 3cbea1b..2fb4027 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,22 @@ -.firecrawl -.swiftpm -.DS_Store -DerivedData -.firecrawl/ +# macOS .DS_Store + +# Xcode / SwiftPM build products +build/ +.build/ +DerivedData/ +*.xcuserstate +xcuserdata/ PRMonitor.xcodeproj/project.xcworkspace/ -PRMonitor.xcodeproj/xcuserdata/ +.swiftpm/ + +# Release artifacts (attach to GitHub Releases instead) +*.app.zip +*.dmg + +# Local tooling +.firecrawl/ +.superset/ + +# Release output from scripts/release.sh +dist/ diff --git a/PRMonitor.xcodeproj/project.pbxproj b/PRMonitor.xcodeproj/project.pbxproj index 44c130b..770dddd 100644 --- a/PRMonitor.xcodeproj/project.pbxproj +++ b/PRMonitor.xcodeproj/project.pbxproj @@ -1,249 +1,378 @@ // !$*UTF8*$! { archiveVersion = 1; - classes = {}; - objectVersion = 56; + classes = { + }; + objectVersion = 77; objects = { -/* Begin PBXBuildFile section */ - E78001FF98C94430914E3452 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 644B97B8997741949754A68A /* AppState.swift */; }; - 15959AE2390540B99403139D /* AppContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E57E6F658EA45F4B979C3D9 /* AppContainer.swift */; }; - EDE587C69327413FBA9D38CF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24AA8850953C48EDAAD41B17 /* AppDelegate.swift */; }; - C81F744096B1432F83862A30 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = E41321BCAFB241DFB313FFB7 /* Models.swift */; }; - 13C7ECCDEF914D8DBF807163 /* AuthStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 413A2C3EDF1546099B4C72A2 /* AuthStore.swift */; }; - EBCC62C2C5B34586A521C976 /* PRMonitorApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD45E48815F141A6B513D4AB /* PRMonitorApp.swift */; }; - F00A6865B87A40E5B85807DC /* SettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AC1C54FD8F744D7BC7724C4 /* SettingsStore.swift */; }; - A2F9F4DDB63541AB8ED0D49F /* GitHubAuthService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B8E907DD122457981820397 /* GitHubAuthService.swift */; }; - 7908E85144FF431C91A2C19D /* GitHubClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC78B421D3F245CD8C9084F2 /* GitHubClient.swift */; }; - 37C9B0CA60AC4DA2ABBEE840 /* PollingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B6023855E984BBB8E37A6B2 /* PollingService.swift */; }; - 26E46E9EFB13490389EE6EF0 /* AgentDiscoveryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC9AFC7C7C074F23A5140BDC /* AgentDiscoveryService.swift */; }; - 1EFB51EBC5C14510AC627101 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 958903B9354348848EBA9948 /* ContentView.swift */; }; - 2B2CF529A7BA41E5872AA6CA /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6D4B45EC54442DB0A2651A /* SettingsView.swift */; }; - F955FE0C5D654AEAACD52716 /* StatusBarLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FC0E16936A04FB38789F708 /* StatusBarLabel.swift */; }; - A59AA7B44EF04C259F3206C7 /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25E35C5AFA7A4856A6D34417 /* Keychain.swift */; }; - 04EF92D31DD2400498021472 /* NotificationAvailability.swift in Sources */ = {isa = PBXBuildFile; fileRef = E175404F860C44A2A03CEBD1 /* NotificationAvailability.swift */; }; - 21412E8064C44708B0B2572B /* AsyncSemaphore.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAACAA854D574B38AA46BA8B /* AsyncSemaphore.swift */; }; - 18B26F6E773140D48D1FA579 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9B38857DE80F466587191E51 /* Assets.xcassets */; }; -/* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + A1000000000000000000C001 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A1000000000000000000F001 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A1000000000000000000T001; + remoteInfo = PRMonitor; + }; +/* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 644B97B8997741949754A68A /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PRMonitor/AppState.swift; sourceTree = ""; }; - 9E57E6F658EA45F4B979C3D9 /* AppContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PRMonitor/AppContainer.swift; sourceTree = ""; }; - 24AA8850953C48EDAAD41B17 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PRMonitor/AppDelegate.swift; sourceTree = ""; }; - E41321BCAFB241DFB313FFB7 /* Models.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PRMonitor/Models.swift; sourceTree = ""; }; - 413A2C3EDF1546099B4C72A2 /* AuthStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PRMonitor/AuthStore.swift; sourceTree = ""; }; - BD45E48815F141A6B513D4AB /* PRMonitorApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PRMonitor/PRMonitorApp.swift; sourceTree = ""; }; - 5AC1C54FD8F744D7BC7724C4 /* SettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PRMonitor/SettingsStore.swift; sourceTree = ""; }; - 4B8E907DD122457981820397 /* GitHubAuthService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitHubAuthService.swift; sourceTree = ""; }; - BC78B421D3F245CD8C9084F2 /* GitHubClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitHubClient.swift; sourceTree = ""; }; - 9B6023855E984BBB8E37A6B2 /* PollingService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollingService.swift; sourceTree = ""; }; - CC9AFC7C7C074F23A5140BDC /* AgentDiscoveryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentDiscoveryService.swift; sourceTree = ""; }; - 958903B9354348848EBA9948 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - CE6D4B45EC54442DB0A2651A /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; - 5FC0E16936A04FB38789F708 /* StatusBarLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarLabel.swift; sourceTree = ""; }; - 25E35C5AFA7A4856A6D34417 /* Keychain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = ""; }; - E175404F860C44A2A03CEBD1 /* NotificationAvailability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationAvailability.swift; sourceTree = ""; }; - FAACAA854D574B38AA46BA8B /* AsyncSemaphore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncSemaphore.swift; sourceTree = ""; }; - BE82754E576844E0A75D679A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9B38857DE80F466587191E51 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - F26C8741A0154CC9B8207228 /* PRMonitor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; path = PRMonitor.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A1000000000000000000P001 /* PRMonitor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PRMonitor.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A1000000000000000000P002 /* PRMonitorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PRMonitorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + A1000000000000000000E001 /* Exceptions for "PRMonitorApp" folder in "PRMonitor" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = A1000000000000000000T001 /* PRMonitor */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + A1000000000000000000S001 /* Sources/PRMonitor */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = Sources/PRMonitor; + sourceTree = ""; + }; + A1000000000000000000S002 /* PRMonitorApp */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + A1000000000000000000E001 /* Exceptions for "PRMonitorApp" folder in "PRMonitor" target */, + ); + path = PRMonitorApp; + sourceTree = ""; + }; + A1000000000000000000S003 /* Tests/PRMonitorTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = Tests/PRMonitorTests; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + /* Begin PBXFrameworksBuildPhase section */ - E4BDE8E1FE6C42328C5F474D /* Frameworks */ = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; + A1000000000000000000B001 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A1000000000000000000B011 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2224E7031C304D109D5C94C2 = {isa = PBXGroup; children = ( - B6C4D3D82B3B4CB09464BC29 /* Sources */, - B1E89D8E49C549CBB940A2EF /* Supporting Files */, - 61B302BF2D9B4FEB9FF5612D /* Products */, - ); sourceTree = ""; }; - B6C4D3D82B3B4CB09464BC29 /* Sources */ = {isa = PBXGroup; children = ( - 644B97B8997741949754A68A /* AppState.swift */, - 9E57E6F658EA45F4B979C3D9 /* AppContainer.swift */, - 24AA8850953C48EDAAD41B17 /* AppDelegate.swift */, - E41321BCAFB241DFB313FFB7 /* Models.swift */, - 413A2C3EDF1546099B4C72A2 /* AuthStore.swift */, - BD45E48815F141A6B513D4AB /* PRMonitorApp.swift */, - 5AC1C54FD8F744D7BC7724C4 /* SettingsStore.swift */, - 17846063536D41B3A76A70B6 /* Services */, - D37FB8FDF77444F08B535242 /* Views */, - 3539254D397E4BD08F055DB0 /* Utils */, - ); path = Sources; sourceTree = ""; }; - 17846063536D41B3A76A70B6 /* Services */ = {isa = PBXGroup; children = ( - 4B8E907DD122457981820397 /* GitHubAuthService.swift */, - BC78B421D3F245CD8C9084F2 /* GitHubClient.swift */, - 9B6023855E984BBB8E37A6B2 /* PollingService.swift */, - CC9AFC7C7C074F23A5140BDC /* AgentDiscoveryService.swift */, - ); path = PRMonitor/Services; sourceTree = ""; }; - D37FB8FDF77444F08B535242 /* Views */ = {isa = PBXGroup; children = ( - 958903B9354348848EBA9948 /* ContentView.swift */, - CE6D4B45EC54442DB0A2651A /* SettingsView.swift */, - 5FC0E16936A04FB38789F708 /* StatusBarLabel.swift */, - ); path = PRMonitor/Views; sourceTree = ""; }; - 3539254D397E4BD08F055DB0 /* Utils */ = {isa = PBXGroup; children = ( - 25E35C5AFA7A4856A6D34417 /* Keychain.swift */, - E175404F860C44A2A03CEBD1 /* NotificationAvailability.swift */, - FAACAA854D574B38AA46BA8B /* AsyncSemaphore.swift */, - ); path = PRMonitor/Utils; sourceTree = ""; }; - B1E89D8E49C549CBB940A2EF /* Supporting Files */ = {isa = PBXGroup; children = ( - BE82754E576844E0A75D679A /* Info.plist */, - 9B38857DE80F466587191E51 /* Assets.xcassets */, - ); path = PRMonitorApp; sourceTree = ""; }; - 61B302BF2D9B4FEB9FF5612D /* Products */ = {isa = PBXGroup; children = ( - F26C8741A0154CC9B8207228 /* PRMonitor.app */, - ); name = Products; sourceTree = ""; }; + A1000000000000000000G001 = { + isa = PBXGroup; + children = ( + A1000000000000000000S001 /* Sources/PRMonitor */, + A1000000000000000000S002 /* PRMonitorApp */, + A1000000000000000000S003 /* Tests/PRMonitorTests */, + A1000000000000000000G002 /* Products */, + ); + sourceTree = ""; + }; + A1000000000000000000G002 /* Products */ = { + isa = PBXGroup; + children = ( + A1000000000000000000P001 /* PRMonitor.app */, + A1000000000000000000P002 /* PRMonitorTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 6442782EE46E4562B845764C /* PRMonitor */ = { + A1000000000000000000T001 /* PRMonitor */ = { isa = PBXNativeTarget; - buildConfigurationList = 9A86AFB97DAE466FA0011B01 /* Build configuration list for PBXNativeTarget "PRMonitor" */; + buildConfigurationList = A1000000000000000000L002 /* Build configuration list for PBXNativeTarget "PRMonitor" */; buildPhases = ( - C1E3CDF3C7594BDFBA83AFA5 /* Sources */, - E4BDE8E1FE6C42328C5F474D /* Frameworks */, - DEBA56F4DFE0448DA21C1C74 /* Resources */, + A1000000000000000000B002 /* Sources */, + A1000000000000000000B001 /* Frameworks */, + A1000000000000000000B003 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + A1000000000000000000S001 /* Sources/PRMonitor */, + A1000000000000000000S002 /* PRMonitorApp */, ); - buildRules = ( ); - dependencies = ( ); name = PRMonitor; productName = PRMonitor; - productReference = F26C8741A0154CC9B8207228 /* PRMonitor.app */; + productReference = A1000000000000000000P001 /* PRMonitor.app */; productType = "com.apple.product-type.application"; }; + A1000000000000000000T002 /* PRMonitorTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = A1000000000000000000L003 /* Build configuration list for PBXNativeTarget "PRMonitorTests" */; + buildPhases = ( + A1000000000000000000B012 /* Sources */, + A1000000000000000000B011 /* Frameworks */, + A1000000000000000000B013 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + A1000000000000000000D001 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + A1000000000000000000S003 /* Tests/PRMonitorTests */, + ); + name = PRMonitorTests; + productName = PRMonitorTests; + productReference = A1000000000000000000P002 /* PRMonitorTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - B159222AAE91467BB5C40600 /* Project object */ = { + A1000000000000000000F001 /* Project object */ = { isa = PBXProject; - buildConfigurationList = 0F5F1E2EB3EA4FFFB0A495EA /* Build configuration list for PBXProject "PRMonitor" */; - compatibilityVersion = "Xcode 13.0"; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 2700; + LastUpgradeCheck = 2700; + TargetAttributes = { + A1000000000000000000T001 = { + CreatedOnToolsVersion = 27.0; + }; + A1000000000000000000T002 = { + CreatedOnToolsVersion = 27.0; + TestTargetID = A1000000000000000000T001; + }; + }; + }; + buildConfigurationList = A1000000000000000000L001 /* Build configuration list for PBXProject "PRMonitor" */; developmentRegion = en; hasScannedForEncodings = 0; - mainGroup = 2224E7031C304D109D5C94C2; - productRefGroup = 61B302BF2D9B4FEB9FF5612D; + knownRegions = ( + en, + Base, + ); + mainGroup = A1000000000000000000G001; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = A1000000000000000000G002 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 6442782EE46E4562B845764C /* PRMonitor */, + A1000000000000000000T001 /* PRMonitor */, + A1000000000000000000T002 /* PRMonitorTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - DEBA56F4DFE0448DA21C1C74 /* Resources */ = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 18B26F6E773140D48D1FA579 /* Assets.xcassets in Resources */, - ); runOnlyForDeploymentPostprocessing = 0; }; + A1000000000000000000B003 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A1000000000000000000B013 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - C1E3CDF3C7594BDFBA83AFA5 /* Sources */ = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E78001FF98C94430914E3452 /* AppState.swift in Sources */, - 15959AE2390540B99403139D /* AppContainer.swift in Sources */, - EDE587C69327413FBA9D38CF /* AppDelegate.swift in Sources */, - C81F744096B1432F83862A30 /* Models.swift in Sources */, - 13C7ECCDEF914D8DBF807163 /* AuthStore.swift in Sources */, - EBCC62C2C5B34586A521C976 /* PRMonitorApp.swift in Sources */, - F00A6865B87A40E5B85807DC /* SettingsStore.swift in Sources */, - A2F9F4DDB63541AB8ED0D49F /* GitHubAuthService.swift in Sources */, - 7908E85144FF431C91A2C19D /* GitHubClient.swift in Sources */, - 37C9B0CA60AC4DA2ABBEE840 /* PollingService.swift in Sources */, - 26E46E9EFB13490389EE6EF0 /* AgentDiscoveryService.swift in Sources */, - 1EFB51EBC5C14510AC627101 /* ContentView.swift in Sources */, - 2B2CF529A7BA41E5872AA6CA /* SettingsView.swift in Sources */, - F955FE0C5D654AEAACD52716 /* StatusBarLabel.swift in Sources */, - A59AA7B44EF04C259F3206C7 /* Keychain.swift in Sources */, - 04EF92D31DD2400498021472 /* NotificationAvailability.swift in Sources */, - 21412E8064C44708B0B2572B /* AsyncSemaphore.swift in Sources */, - ); runOnlyForDeploymentPostprocessing = 0; }; + A1000000000000000000B002 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A1000000000000000000B012 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + A1000000000000000000D001 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A1000000000000000000T001 /* PRMonitor */; + targetProxy = A1000000000000000000C001 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ - 694531622C7247A0A73EC18D /* Debug */ = {isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = "gnu11"; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - ONLY_ACTIVE_ARCH = YES; - SWIFT_VERSION = 5.9; - }; name = Debug; }; - B9C0175094F6499B9883ACCB /* Release */ = {isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - DEVELOPMENT_TEAM = ""; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = "gnu11"; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - SWIFT_VERSION = 5.9; - }; name = Release; }; + A1000000000000000000X001 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 26.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_STRICT_CONCURRENCY = complete; + SWIFT_VERSION = 6.0; + }; + name = Debug; + }; + A1000000000000000000X002 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 26.0; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_STRICT_CONCURRENCY = complete; + SWIFT_VERSION = 6.0; + }; + name = Release; + }; + A1000000000000000000X003 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = ""; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = NO; + GITHUB_OAUTH_CLIENT_ID = ""; + INFOPLIST_FILE = PRMonitorApp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = com.neat.prmonitor; + PRODUCT_NAME = PRMonitor; + SWIFT_EMIT_LOC_STRINGS = YES; + }; + name = Debug; + }; + A1000000000000000000X004 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = ""; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = NO; + GITHUB_OAUTH_CLIENT_ID = ""; + INFOPLIST_FILE = PRMonitorApp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = com.neat.prmonitor; + PRODUCT_NAME = PRMonitor; + SWIFT_EMIT_LOC_STRINGS = YES; + }; + name = Release; + }; + A1000000000000000000X005 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.neat.prmonitor.tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PRMonitor.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/PRMonitor"; + }; + name = Debug; + }; + A1000000000000000000X006 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.neat.prmonitor.tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PRMonitor.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/PRMonitor"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 0F5F1E2EB3EA4FFFB0A495EA /* Build configuration list for PBXProject "PRMonitor" */ = {isa = XCConfigurationList; buildConfigurations = ( - 694531622C7247A0A73EC18D /* Debug */, - B9C0175094F6499B9883ACCB /* Release */, - ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 058B0DAC786B4CEA8F9E63B9 /* Debug */ = {isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = PRMonitorApp/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ("$(inherited)", "@executable_path/../Frameworks"); - MACOSX_DEPLOYMENT_TARGET = 14.0; - PRODUCT_BUNDLE_IDENTIFIER = com.neat.prmonitor; - PRODUCT_NAME = PRMonitor; - SWIFT_VERSION = 5.9; - }; name = Debug; }; - 2AA8CDDE90EB40FDB6B4C070 /* Release */ = {isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = PRMonitorApp/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ("$(inherited)", "@executable_path/../Frameworks"); - MACOSX_DEPLOYMENT_TARGET = 14.0; - PRODUCT_BUNDLE_IDENTIFIER = com.neat.prmonitor; - PRODUCT_NAME = PRMonitor; - SWIFT_VERSION = 5.9; - }; name = Release; }; - 9A86AFB97DAE466FA0011B01 /* Build configuration list for PBXNativeTarget "PRMonitor" */ = {isa = XCConfigurationList; buildConfigurations = ( - 058B0DAC786B4CEA8F9E63B9 /* Debug */, - 2AA8CDDE90EB40FDB6B4C070 /* Release */, - ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + A1000000000000000000L001 /* Build configuration list for PBXProject "PRMonitor" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1000000000000000000X001 /* Debug */, + A1000000000000000000X002 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A1000000000000000000L002 /* Build configuration list for PBXNativeTarget "PRMonitor" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1000000000000000000X003 /* Debug */, + A1000000000000000000X004 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A1000000000000000000L003 /* Build configuration list for PBXNativeTarget "PRMonitorTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A1000000000000000000X005 /* Debug */, + A1000000000000000000X006 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ - }; - rootObject = B159222AAE91467BB5C40600 /* Project object */; + rootObject = A1000000000000000000F001 /* Project object */; } diff --git a/PRMonitor.xcodeproj/xcshareddata/xcschemes/PRMonitor.xcscheme b/PRMonitor.xcodeproj/xcshareddata/xcschemes/PRMonitor.xcscheme new file mode 100644 index 0000000..436bd2e --- /dev/null +++ b/PRMonitor.xcodeproj/xcshareddata/xcschemes/PRMonitor.xcscheme @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PRMonitorApp/Info.plist b/PRMonitorApp/Info.plist index 9ae260f..930c3bf 100644 --- a/PRMonitorApp/Info.plist +++ b/PRMonitorApp/Info.plist @@ -2,27 +2,35 @@ - CFBundleDisplayName - PR Monitor - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - com.neat.prmonitor - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - PRMonitor - CFBundlePackageType - APPL - CFBundleShortVersionString - 0.1.0 - CFBundleVersion - 1 - LSMinimumSystemVersion - 14.0 - LSUIElement - - NSPrincipalClass - NSApplication + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + PR Monitor + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + PR Monitor + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + GitHubOAuthClientID + $(GITHUB_OAUTH_CLIENT_ID) + LSApplicationCategoryType + public.app-category.developer-tools + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + LSUIElement + + NSHumanReadableCopyright + © 2026 Hasaam. MIT License. + NSPrincipalClass + NSApplication diff --git a/Package.swift b/Package.swift index aa3e82e..d209102 100644 --- a/Package.swift +++ b/Package.swift @@ -1,11 +1,11 @@ -// swift-tools-version: 5.9 +// swift-tools-version: 6.2 import PackageDescription let package = Package( name: "PRMonitor", - platforms: [.macOS(.v14)], + platforms: [.macOS(.v26)], products: [ - .executable(name: "PRMonitor", targets: ["PRMonitor"]) + .executable(name: "PRMonitor", targets: ["PRMonitor"]), ], targets: [ .executableTarget( @@ -16,6 +16,7 @@ let package = Package( name: "PRMonitorTests", dependencies: ["PRMonitor"], path: "Tests/PRMonitorTests" - ) - ] + ), + ], + swiftLanguageModes: [.v6] ) From bf0f1ab67fad9fe6b6104269e8142ed3d1c615ab Mon Sep 17 00:00:00 2001 From: Hasaam Date: Mon, 28 Sep 2026 21:21:08 -0400 Subject: [PATCH 2/6] feat(core): pure status engine, notification planner and polling policy Derive agent and pull request status from check runs, commit statuses, review threads, review requests and review commit SHAs. Plan notifications by diffing snapshots per head commit, with a silent first-poll baseline. Covered by 39 Swift Testing tests. --- Sources/PRMonitor/Core/Agent.swift | 61 ++++ .../PRMonitor/Core/NotificationPlanner.swift | 164 +++++++++++ Sources/PRMonitor/Core/PollingPolicy.swift | 34 +++ Sources/PRMonitor/Core/PullRequest.swift | 145 ++++++++++ Sources/PRMonitor/Core/Repository.swift | 52 ++++ Sources/PRMonitor/Core/StatusEngine.swift | 268 ++++++++++++++++++ Tests/PRMonitorTests/Fixtures.swift | 95 +++++++ .../PRMonitorTests/GraphQLDecodingTests.swift | 169 +++++++++++ .../NotificationPlannerTests.swift | 136 +++++++++ .../PRMonitorTests/PRMonitorSmokeTests.swift | 16 -- Tests/PRMonitorTests/RepositoryIDTests.swift | 29 ++ Tests/PRMonitorTests/StatusEngineTests.swift | 164 +++++++++++ 12 files changed, 1317 insertions(+), 16 deletions(-) create mode 100644 Sources/PRMonitor/Core/Agent.swift create mode 100644 Sources/PRMonitor/Core/NotificationPlanner.swift create mode 100644 Sources/PRMonitor/Core/PollingPolicy.swift create mode 100644 Sources/PRMonitor/Core/PullRequest.swift create mode 100644 Sources/PRMonitor/Core/Repository.swift create mode 100644 Sources/PRMonitor/Core/StatusEngine.swift create mode 100644 Tests/PRMonitorTests/Fixtures.swift create mode 100644 Tests/PRMonitorTests/GraphQLDecodingTests.swift create mode 100644 Tests/PRMonitorTests/NotificationPlannerTests.swift delete mode 100644 Tests/PRMonitorTests/PRMonitorSmokeTests.swift create mode 100644 Tests/PRMonitorTests/RepositoryIDTests.swift create mode 100644 Tests/PRMonitorTests/StatusEngineTests.swift diff --git a/Sources/PRMonitor/Core/Agent.swift b/Sources/PRMonitor/Core/Agent.swift new file mode 100644 index 0000000..1a6d595 --- /dev/null +++ b/Sources/PRMonitor/Core/Agent.swift @@ -0,0 +1,61 @@ +import Foundation + +/// Something that reports on a pull request: a CI system, a deploy integration, or an AI reviewer. +/// +/// An agent is matched against a PR by two independent keys. Either may be empty, but not both. +/// - `checkPattern` matches check runs and commit statuses (by name, app, or creator). +/// - `login` matches the bot account that requests reviews, leaves review threads, or comments. +struct Agent: Identifiable, Hashable, Codable, Sendable { + var id: UUID = UUID() + var name: String + var checkPattern: String = "" + var login: String = "" + + var isValid: Bool { + !name.trimmed.isEmpty && !(checkPattern.trimmed.isEmpty && login.trimmed.isEmpty) + } +} + +enum AgentMode: String, Codable, Sendable, CaseIterable { + /// Every check and review bot that reports on a PR becomes an agent. Zero configuration. + case automatic + /// Only the agents the user configured are tracked; everything else is ignored. + case custom +} + +extension Agent { + /// Well-known integrations. Logins are the GraphQL bot logins (without the `[bot]` suffix). + static let presets: [Agent] = [ + Agent(name: "CodeRabbit", checkPattern: "coderabbit", login: "coderabbitai"), + Agent(name: "Copilot", login: "copilot-pull-request-reviewer"), + Agent(name: "Cursor Bugbot", checkPattern: "cursor", login: "cursor"), + Agent(name: "Devin", checkPattern: "devin", login: "devin-ai-integration"), + Agent(name: "Codex", login: "chatgpt-codex-connector"), + Agent(name: "Gemini Code Assist", login: "gemini-code-assist"), + Agent(name: "Graphite", checkPattern: "graphite", login: "graphite-app"), + Agent(name: "Greptile", checkPattern: "greptile", login: "greptile-apps"), + Agent(name: "Sourcery", login: "sourcery-ai"), + Agent(name: "GitHub Actions", checkPattern: "github-actions"), + Agent(name: "Vercel", checkPattern: "vercel", login: "vercel"), + Agent(name: "Netlify", checkPattern: "netlify", login: "netlify"), + ] + + /// A friendly name for a bot login or app slug, if it belongs to a known integration. + static func presetName(forKey key: String) -> String? { + let key = Identity.normalize(key) + return presets.first { Identity.normalize($0.login) == key || Identity.normalize($0.checkPattern) == key }?.name + } +} + +/// Normalizes GitHub identities so that `cursor[bot]` (REST), `cursor` (GraphQL) and `Cursor` compare equal. +enum Identity { + static func normalize(_ value: String) -> String { + value.lowercased() + .replacing("[bot]", with: "") + .filter { $0.isLetter || $0.isNumber } + } +} + +extension String { + var trimmed: String { trimmingCharacters(in: .whitespacesAndNewlines) } +} diff --git a/Sources/PRMonitor/Core/NotificationPlanner.swift b/Sources/PRMonitor/Core/NotificationPlanner.swift new file mode 100644 index 0000000..87f3624 --- /dev/null +++ b/Sources/PRMonitor/Core/NotificationPlanner.swift @@ -0,0 +1,164 @@ +import Foundation + +/// A notification the app should post. +struct PlannedNotification: Hashable, Sendable { + enum Kind: Hashable, Sendable { + /// Every agent finished on the head commit. + case settled(PullRequestStatus) + /// A settled PR got worse without a new push (e.g. a bot left threads after its check passed). + case regressed(PullRequestStatus) + case agentFinished(name: String, state: AgentReport.State) + } + + let kind: Kind + let key: PullRequestKey + let headSHA: String + let title: String + let subtitle: String + let body: String + let url: URL + + /// Deterministic, so re-planning the same event replaces rather than duplicates a banner. + var identifier: String { + let suffix = switch kind { + case let .settled(status): "settled-\(status)" + case let .regressed(status): "regressed-\(status)" + case let .agentFinished(name, _): "agent-\(name)" + } + return "\(key)@\(headSHA.prefix(12))/\(suffix)" + } +} + +struct NotificationPreferences: Hashable, Sendable { + var whenSettled = true + var whenFeedbackArrives = true + var perAgent = false +} + +/// Decides which notifications to post by diffing the previous poll against the current one. +/// +/// Rules that keep it quiet: +/// - The first poll only records a baseline, so launching the app never floods Notification Center. +/// - Transitions are tracked per head commit: a push starts a fresh lifecycle, and each lifecycle +/// announces "settled" at most once. +/// - PRs first seen after launch only notify if they were opened after the baseline was taken. +struct NotificationPlanner: Sendable { + struct Snapshot: Hashable, Sendable { + let headSHA: String + let status: PullRequestStatus + let isSettled: Bool + let agentStates: [String: AgentReport.State] + } + + private(set) var snapshots: [PullRequestKey: Snapshot] = [:] + private(set) var baselineDate: Date? + + mutating func plan( + for reports: [PullRequestReport], + preferences: NotificationPreferences, + now: Date = .now + ) -> [PlannedNotification] { + let next = Dictionary(reports.map { ($0.pullRequest.key, Self.snapshot(of: $0)) }, uniquingKeysWith: { a, _ in a }) + defer { snapshots = next } + + guard let baselineDate else { + self.baselineDate = now + return [] + } + + var planned: [PlannedNotification] = [] + for report in reports { + let pr = report.pullRequest + guard let current = next[pr.key] else { continue } + let previous = snapshots[pr.key] + + if previous == nil, pr.createdAt < baselineDate { + continue // Existed before launch but newly visible (e.g. repo just enabled). + } + let sameCommit = previous?.headSHA == current.headSHA + let wasSettled = sameCommit && (previous?.isSettled ?? false) + + if preferences.whenSettled, current.isSettled, !wasSettled, current.status != .quiet { + planned.append(Self.settledNotification(for: report)) + } else if preferences.whenFeedbackArrives, sameCommit, wasSettled, current.isSettled, + let previous, current.status.urgency > previous.status.urgency, current.status.needsAttention { + planned.append(Self.regressedNotification(for: report)) + } + + if preferences.perAgent { + // A new push restarts every agent's lifecycle, and an agent we haven't seen before + // on this commit was, by definition, not finished last time we looked. + for agent in report.agents where agent.state != .running { + let before = sameCommit ? (previous?.agentStates[agent.id] ?? .running) : .running + if before == .running { + planned.append(Self.agentNotification(agent, report: report)) + } + } + } + } + return planned + } + + private static func snapshot(of report: PullRequestReport) -> Snapshot { + Snapshot( + headSHA: report.pullRequest.headSHA, + status: report.status, + isSettled: report.isSettled, + agentStates: Dictionary(report.agents.map { ($0.id, $0.state) }, uniquingKeysWith: { a, _ in a }) + ) + } + + // MARK: - Copy + + private static func settledNotification(for report: PullRequestReport) -> PlannedNotification { + let pr = report.pullRequest + let (subtitle, body) = describe(report) + return PlannedNotification( + kind: .settled(report.status), key: pr.key, headSHA: pr.headSHA, + title: "\(pr.repository.name) #\(pr.number)", subtitle: subtitle, + body: "\(pr.title)\n\(body)", url: pr.url + ) + } + + private static func regressedNotification(for report: PullRequestReport) -> PlannedNotification { + let pr = report.pullRequest + let (subtitle, body) = describe(report) + return PlannedNotification( + kind: .regressed(report.status), key: pr.key, headSHA: pr.headSHA, + title: "\(pr.repository.name) #\(pr.number)", subtitle: subtitle, + body: "\(pr.title)\n\(body)", url: pr.url + ) + } + + private static func agentNotification(_ agent: AgentReport, report: PullRequestReport) -> PlannedNotification { + let pr = report.pullRequest + return PlannedNotification( + kind: .agentFinished(name: agent.name, state: agent.state), key: pr.key, headSHA: pr.headSHA, + title: "\(pr.repository.name) #\(pr.number)", subtitle: "\(agent.name): \(agent.summary)", + body: pr.title, url: agent.url ?? pr.url + ) + } + + static func describe(_ report: PullRequestReport) -> (subtitle: String, body: String) { + let names: (AgentReport.State) -> String = { state in + ListFormatter.localizedString(byJoining: report.agents.filter { $0.state == state }.map(\.name)) + } + switch report.status { + case .failing: + return ("Checks failed", "\(names(.failed)) failed.") + case .needsReview: + let threads = report.openThreadCount + let who = names(.needsReview) + if threads > 0 { + let count = threads == 1 ? "1 open thread" : "\(threads) open threads" + return ("Ready for your review", who.isEmpty ? "\(count)." : "\(count) from \(who).") + } + return ("Changes requested", who.isEmpty ? "A reviewer requested changes." : "\(who) requested changes.") + case .ready: + let count = report.agents.count + return ("All clear", count == 1 ? "\(report.agents[0].name) passed with no feedback." : "All \(count) agents passed with no feedback.") + case .running, .quiet: + return ("Updated", "") + } + } +} diff --git a/Sources/PRMonitor/Core/PollingPolicy.swift b/Sources/PRMonitor/Core/PollingPolicy.swift new file mode 100644 index 0000000..198a63b --- /dev/null +++ b/Sources/PRMonitor/Core/PollingPolicy.swift @@ -0,0 +1,34 @@ +import Foundation + +/// Decides how long to wait before the next poll. +struct PollingPolicy: Sendable { + enum Outcome: Sendable { + case success(hasRunningPullRequests: Bool, hasOpenPullRequests: Bool) + case rateLimited(resetAt: Date?) + case failure(consecutive: Int) + } + + /// The user's chosen interval, used while any agent is still working. + var activeInterval: TimeInterval + /// Used when every open PR has settled; pushes and new feedback are still picked up. + var settledInterval: TimeInterval = 120 + /// Used when there are no open PRs at all. + var idleInterval: TimeInterval = 300 + var maximumBackoff: TimeInterval = 600 + + func delay(after outcome: Outcome, now: Date = .now) -> TimeInterval { + switch outcome { + case let .success(running, open): + if running { return activeInterval } + return open ? max(activeInterval, settledInterval) : max(activeInterval, idleInterval) + case let .rateLimited(resetAt): + // Wait out the window, plus a little slack so we don't land a hair early. + let wait = (resetAt?.timeIntervalSince(now) ?? 60) + 5 + return min(max(wait, 30), 3600) + case let .failure(consecutive): + // 30s, 60s, 120s … capped. Transient network blips recover quickly; outages don't hammer. + let exponent = Double(max(0, consecutive - 1)) + return min(30 * pow(2, exponent), maximumBackoff) + } + } +} diff --git a/Sources/PRMonitor/Core/PullRequest.swift b/Sources/PRMonitor/Core/PullRequest.swift new file mode 100644 index 0000000..87743dd --- /dev/null +++ b/Sources/PRMonitor/Core/PullRequest.swift @@ -0,0 +1,145 @@ +import Foundation + +/// Everything the app knows about one open pull request, as reported by GitHub. +/// +/// This is deliberately a plain value with no GitHub DTO types in it: the GitHub layer maps its +/// responses into this shape, and everything downstream (status derivation, notifications, UI) is +/// pure and testable against hand-built values. +struct PullRequest: Identifiable, Hashable, Sendable { + /// GraphQL node ID; stable across polls. + let id: String + let repository: RepositoryID + let number: Int + let title: String + let url: URL + let author: String? + let isDraft: Bool + let createdAt: Date + let updatedAt: Date + let headSHA: String + let headCommittedAt: Date? + /// GitHub's own roll-up of every check on the head commit. Used as a safety net: it also + /// counts checks the detail query can't see (more than 100, or suites without runs yet). + let rollupState: String? + let reviewDecision: ReviewDecision? + let mergeable: Mergeable + + let checks: [CheckSignal] + let requestedReviewers: [ReviewRequestSignal] + let reviews: [ReviewSignal] + let threads: [ThreadSignal] + let comments: [CommentSignal] + + var key: PullRequestKey { PullRequestKey(repository: repository, number: number) } + var checksURL: URL { url.appending(path: "checks") } +} + +/// A human-readable identity for a PR (`owner/name#123`), used for notification bookkeeping. +struct PullRequestKey: Hashable, Codable, Sendable, CustomStringConvertible { + let repository: RepositoryID + let number: Int + var description: String { "\(repository.fullName)#\(number)" } +} + +enum ReviewDecision: String, Sendable, Hashable { + case approved = "APPROVED" + case changesRequested = "CHANGES_REQUESTED" + case reviewRequired = "REVIEW_REQUIRED" +} + +enum Mergeable: String, Sendable, Hashable { + case mergeable = "MERGEABLE" + case conflicting = "CONFLICTING" + case unknown = "UNKNOWN" +} + +/// One check run or commit status on the head commit. +struct CheckSignal: Hashable, Sendable { + enum Source: Hashable, Sendable { + case checkRun(appName: String?, appSlug: String?) + case commitStatus(creator: String?) + } + + enum Outcome: Hashable, Sendable { + case pending + case succeeded + /// Completed without passing or failing: skipped, neutral, cancelled or stale. + case neutral + case failed + } + + let name: String + let source: Source + let outcome: Outcome + /// GitHub's raw status or conclusion (e.g. `TIMED_OUT`), kept for display. + let rawState: String + let startedAt: Date? + let completedAt: Date? + let url: URL? + + /// The key that groups related signals into one automatic agent: the app slug for check runs + /// (all GitHub Actions jobs become one agent) and the creator for statuses. This is also what + /// merges Vercel's commit status and its "Preview Comments" check run into a single row. + var groupKey: String { + switch source { + case let .checkRun(appName, appSlug): Identity.normalize(appSlug ?? appName ?? name) + case let .commitStatus(creator): Identity.normalize(creator ?? name) + } + } + + var groupDisplayName: String { + switch source { + case let .checkRun(appName, appSlug): Agent.presetName(forKey: appSlug ?? "") ?? appName ?? name + case let .commitStatus(creator): Agent.presetName(forKey: creator ?? "") ?? name + } + } + + /// Strings a user-entered check pattern is matched against. + var searchableFields: [String] { + switch source { + case let .checkRun(appName, appSlug): [name, appName, appSlug].compactMap(\.self) + case let .commitStatus(creator): [name, creator].compactMap(\.self) + } + } +} + +/// A pending review request. GitHub removes the request once the reviewer submits, so a request +/// that is still present means that reviewer hasn't finished. +struct ReviewRequestSignal: Hashable, Sendable { + let login: String + let isBot: Bool +} + +struct ReviewSignal: Hashable, Sendable { + enum State: String, Sendable { + case approved = "APPROVED" + case changesRequested = "CHANGES_REQUESTED" + case commented = "COMMENTED" + case dismissed = "DISMISSED" + case pending = "PENDING" + } + + let author: String + let isBot: Bool + let state: State + let submittedAt: Date? + /// The commit the review was left on, so a review of an older push can be told apart. + let commitSHA: String? +} + +struct ThreadSignal: Hashable, Sendable { + let author: String + let isBot: Bool + let isResolved: Bool + let isOutdated: Bool + let createdAt: Date? + + /// An unresolved thread on current code: the strongest signal that someone needs to act. + var isOpen: Bool { !isResolved && !isOutdated } +} + +struct CommentSignal: Hashable, Sendable { + let author: String + let isBot: Bool + let createdAt: Date +} diff --git a/Sources/PRMonitor/Core/Repository.swift b/Sources/PRMonitor/Core/Repository.swift new file mode 100644 index 0000000..ed44458 --- /dev/null +++ b/Sources/PRMonitor/Core/Repository.swift @@ -0,0 +1,52 @@ +import Foundation + +/// A GitHub repository coordinate (`owner/name`). +struct RepositoryID: Hashable, Codable, Sendable, Comparable, CustomStringConvertible { + let owner: String + let name: String + + init(owner: String, name: String) { + self.owner = owner + self.name = name + } + + /// Parses `owner/name`, `https://github.com/owner/name[.git][/…]`, or `git@github.com:owner/name.git`. + init?(parsing input: String) { + var text = input.trimmingCharacters(in: .whitespacesAndNewlines) + if text.hasPrefix("git@github.com:") { + text.removeFirst("git@github.com:".count) + } else if let url = URL(string: text), let host = url.host(), host.hasSuffix("github.com") { + text = url.path() + } + if text.hasSuffix(".git") { text.removeLast(4) } + + let parts = text.split(separator: "/", omittingEmptySubsequences: true).map(String.init) + guard parts.count >= 2 else { return nil } + // Anything beyond owner/name (e.g. `/pull/12`) is ignored so pasted URLs just work. + let owner = parts[0], name = parts[1] + guard Self.isValidOwner(owner), Self.isValidName(name) else { return nil } + self.init(owner: owner, name: name) + } + + var fullName: String { "\(owner)/\(name)" } + var description: String { fullName } + var url: URL { URL(string: "https://github.com/\(owner)/\(name)")! } + + static func < (lhs: Self, rhs: Self) -> Bool { + lhs.fullName.localizedStandardCompare(rhs.fullName) == .orderedAscending + } + + private static func isValidOwner(_ owner: String) -> Bool { + owner.count <= 39 && owner.wholeMatch(of: /[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?/) != nil + } + + private static func isValidName(_ name: String) -> Bool { + name.count <= 100 && name != "." && name != ".." && name.wholeMatch(of: /[A-Za-z0-9._-]+/) != nil + } +} + +/// A repository the user has chosen to monitor. +struct TrackedRepository: Identifiable, Hashable, Codable, Sendable { + var id: RepositoryID + var isEnabled: Bool = true +} diff --git a/Sources/PRMonitor/Core/StatusEngine.swift b/Sources/PRMonitor/Core/StatusEngine.swift new file mode 100644 index 0000000..f01857b --- /dev/null +++ b/Sources/PRMonitor/Core/StatusEngine.swift @@ -0,0 +1,268 @@ +import Foundation + +/// The derived state of one agent on one pull request. +struct AgentReport: Identifiable, Hashable, Sendable { + enum State: Hashable, Sendable { + case running + case failed + /// Finished, and left feedback someone has to address. + case needsReview + case passed + } + + let id: String + let name: String + let state: State + /// A short, human-readable explanation ("2 of 5 failed", "3 open threads"). + let summary: String + let openThreads: Int + let finishedAt: Date? + let url: URL? +} + +/// The overall state of a pull request, derived from its agents. +enum PullRequestStatus: Hashable, Sendable { + case failing + case running + case needsReview + case ready + /// No agent has reported anything on the head commit. + case quiet + + /// How urgently this status wants the user's attention when summarizing many PRs. + var urgency: Int { + switch self { + case .failing: 4 + case .needsReview: 3 + case .running: 2 + case .ready: 1 + case .quiet: 0 + } + } + + var needsAttention: Bool { self == .failing || self == .needsReview } +} + +struct PullRequestReport: Identifiable, Hashable, Sendable { + let pullRequest: PullRequest + let agents: [AgentReport] + let status: PullRequestStatus + + var id: String { pullRequest.id } + /// True once no agent is still working. This is the moment the app exists to announce. + var isSettled: Bool { !agents.contains { $0.state == .running } } + var finishedAgentCount: Int { agents.count { $0.state != .running } } + var openThreadCount: Int { pullRequest.threads.count(where: \.isOpen) } +} + +/// Reduces the raw signals on a pull request into per-agent and overall status. +/// +/// Pure and deterministic: the same inputs and `now` always produce the same report. +struct StatusEngine: Sendable { + var mode: AgentMode + var agents: [Agent] + /// How long after a push a configured agent that hasn't reported yet is assumed to be starting, + /// rather than not applicable to this PR. + var startupGracePeriod: TimeInterval = 180 + + func report(for pr: PullRequest, now: Date = .now) -> PullRequestReport { + var reports: [AgentReport] = switch mode { + case .automatic: automaticReports(for: pr, now: now) + case .custom: agents.filter(\.isValid).compactMap { configuredReport(for: $0, pr: pr, now: now) } + } + // Trust GitHub's roll-up over our own reading when they disagree: a pending roll-up with no + // pending check in view means something we can't see (>100 checks, a queued suite) is running. + if mode == .automatic, pr.rollupState == "PENDING" || pr.rollupState == "EXPECTED", + !pr.checks.contains(where: { $0.outcome == .pending }) { + reports.append(AgentReport(id: "rollup", name: "Other checks", state: .running, summary: "In progress", + openThreads: 0, finishedAt: nil, url: pr.checksURL)) + } + return PullRequestReport(pullRequest: pr, agents: reports, status: status(of: reports, pr: pr)) + } + + // MARK: - Overall status + + private func status(of agents: [AgentReport], pr: PullRequest) -> PullRequestStatus { + guard !agents.isEmpty else { return .quiet } + // A failure is actionable immediately, even while other agents are still working. + if agents.contains(where: { $0.state == .failed }) { return .failing } + if agents.contains(where: { $0.state == .running }) { return .running } + if agents.contains(where: { $0.state == .needsReview }) || pr.reviewDecision == .changesRequested { + return .needsReview + } + return .ready + } + + // MARK: - Automatic mode + + /// Every check integration and review bot on the PR becomes an agent. Signals from the same + /// integration are grouped: all GitHub Actions jobs form one agent, and a bot's commit status, + /// check run and review threads merge when its login matches the app slug. + private func automaticReports(for pr: PullRequest, now: Date) -> [AgentReport] { + var names: [String: String] = [:] + var order: [String] = [] + func register(_ key: String, name: @autoclosure () -> String) { + guard !key.isEmpty, names[key] == nil else { return } + names[key] = name() + order.append(key) + } + + for check in pr.checks { register(check.groupKey, name: check.groupDisplayName) } + // Bots that participate in review. Comment-only bots (changeset, codecov…) are left out: + // they have no lifecycle, so they would only add noise. + let reviewBots = pr.requestedReviewers.filter(\.isBot).map(\.login) + + pr.reviews.filter(\.isBot).map(\.author) + + pr.threads.filter(\.isBot).map(\.author) + for login in reviewBots { register(Identity.normalize(login), name: Self.displayName(forLogin: login)) } + + return order.compactMap { key in + evaluate( + id: key, + name: names[key] ?? key, + checks: pr.checks.filter { $0.groupKey == key }, + pr: pr, + login: key, + isConfigured: false, + now: now + ) + } + } + + // MARK: - Custom mode + + private func configuredReport(for agent: Agent, pr: PullRequest, now: Date) -> AgentReport? { + let pattern = Identity.normalize(agent.checkPattern) + let login = Identity.normalize(agent.login) + let checks = pr.checks.filter { check in + if !pattern.isEmpty, check.searchableFields.contains(where: { Identity.normalize($0).contains(pattern) }) { + return true + } + return !login.isEmpty && check.groupKey == login + } + return evaluate( + id: agent.id.uuidString, + name: agent.name, + checks: checks, + pr: pr, + login: login, + isConfigured: true, + now: now + ) + } + + // MARK: - Evaluation + + /// - Parameter login: normalized login used to attribute reviews, threads and comments. + private func evaluate( + id: String, + name: String, + checks: [CheckSignal], + pr: PullRequest, + login: String, + isConfigured: Bool, + now: Date + ) -> AgentReport? { + let byAgent: (String) -> Bool = { !login.isEmpty && Identity.normalize($0) == login } + let isRequested = pr.requestedReviewers.contains { byAgent($0.login) } + let latestReview = pr.reviews.filter { byAgent($0.author) } + .max { ($0.submittedAt ?? .distantPast) < ($1.submittedAt ?? .distantPast) } + let threads = pr.threads.filter { byAgent($0.author) } + let openThreads = threads.count(where: \.isOpen) + let headDate = pr.headCommittedAt ?? .distantPast + let recentComments = pr.comments.filter { byAgent($0.author) && $0.createdAt >= headDate } + let isWithinStartup = pr.headCommittedAt.map { now.timeIntervalSince($0) < startupGracePeriod } ?? false + + let hasActivity = !checks.isEmpty || isRequested || latestReview != nil || !threads.isEmpty || !recentComments.isEmpty + guard hasActivity else { + // A configured agent that hasn't reported right after a push is probably still starting. + // After the grace period it's treated as not applicable to this PR and hidden. + guard isConfigured, isWithinStartup else { return nil } + return AgentReport(id: id, name: name, state: .running, summary: "Waiting to start", + openThreads: 0, finishedAt: nil, url: nil) + } + + let failed = checks.filter { $0.outcome == .failed } + let pending = checks.filter { $0.outcome == .pending } + let finishedAt = (checks.compactMap(\.completedAt) + [latestReview?.submittedAt].compactMap(\.self)).max() + let primaryURL = (failed.first ?? pending.first ?? checks.first)?.url + + func report(_ state: AgentReport.State, _ summary: String, finished: Date? = nil) -> AgentReport { + AgentReport(id: id, name: name, state: state, summary: summary, openThreads: openThreads, + finishedAt: finished, url: primaryURL) + } + + if !failed.isEmpty { + let summary = checks.count == 1 ? Self.label(forRawState: failed[0].rawState) : "\(failed.count) of \(checks.count) failed" + return report(.failed, summary, finished: finishedAt) + } + if !pending.isEmpty { + let summary: String + if checks.count > 1 { + summary = "\(checks.count - pending.count) of \(checks.count) complete" + } else { + summary = pending[0].startedAt == nil ? "Queued" : "In progress" + } + return report(.running, summary) + } + if isRequested { + return report(.running, "Reviewing") + } + if openThreads > 0 { + return report(.needsReview, openThreads == 1 ? "1 open thread" : "\(openThreads) open threads", finished: finishedAt) + } + if latestReview?.state == .changesRequested { + return report(.needsReview, "Changes requested", finished: finishedAt) + } + + // Review-only agents (no checks) re-review on push without announcing it. A review of an + // older commit is stale: briefly assume a new one is coming. + if checks.isEmpty, let latestReview, Self.isStale(latestReview, on: pr) { + if isWithinStartup { return report(.running, "Waiting to review") } + return report(.passed, "Reviewed an earlier commit", finished: finishedAt) + } + + let summary: String + if checks.isEmpty { + summary = switch latestReview?.state { + case .approved: "Approved" + case .some: "Reviewed" + case nil: "Commented" + } + } else if checks.allSatisfy({ $0.outcome == .neutral }) { + summary = checks.count == 1 ? Self.label(forRawState: checks[0].rawState) : "Skipped" + } else { + summary = checks.count == 1 ? "Passed" : "\(checks.count) checks passed" + } + return report(.passed, summary, finished: finishedAt) + } + + private static func isStale(_ review: ReviewSignal, on pr: PullRequest) -> Bool { + if let sha = review.commitSHA { return sha != pr.headSHA } + guard let submitted = review.submittedAt, let committed = pr.headCommittedAt else { return false } + return submitted < committed + } + + // MARK: - Formatting + + static func label(forRawState raw: String) -> String { + switch raw.uppercased() { + case "SUCCESS": "Passed" + case "FAILURE": "Failed" + case "ERROR": "Errored" + case "TIMED_OUT": "Timed out" + case "ACTION_REQUIRED": "Action required" + case "STARTUP_FAILURE": "Failed to start" + case "CANCELLED": "Cancelled" + case "SKIPPED": "Skipped" + case "NEUTRAL": "Neutral" + case "STALE": "Stale" + default: raw.replacing("_", with: " ").capitalized + } + } + + static func displayName(forLogin login: String) -> String { + if let preset = Agent.presetName(forKey: login) { return preset } + let base = login.replacing("[bot]", with: "") + return base.split(separator: "-").map { $0.prefix(1).uppercased() + $0.dropFirst() }.joined(separator: " ") + } +} diff --git a/Tests/PRMonitorTests/Fixtures.swift b/Tests/PRMonitorTests/Fixtures.swift new file mode 100644 index 0000000..38eb286 --- /dev/null +++ b/Tests/PRMonitorTests/Fixtures.swift @@ -0,0 +1,95 @@ +import Foundation +@testable import PRMonitor + +/// Builders for hand-written pull request states. Every test reads as "given this PR…". +enum Fixture { + static let now = Date(timeIntervalSince1970: 1_800_000_000) + static let repository = RepositoryID(owner: "acme", name: "rocket") + + static func pullRequest( + number: Int = 1, + headSHA: String = "aaa111", + committedMinutesAgo: Double = 30, + createdMinutesAgo: Double = 120, + author: String = "hasaam", + isDraft: Bool = false, + rollupState: String? = nil, + reviewDecision: ReviewDecision? = nil, + checks: [CheckSignal] = [], + requested: [ReviewRequestSignal] = [], + reviews: [ReviewSignal] = [], + threads: [ThreadSignal] = [], + comments: [CommentSignal] = [] + ) -> PullRequest { + PullRequest( + id: "PR_\(number)", + repository: repository, + number: number, + title: "Add launch sequence", + url: URL(string: "https://github.com/acme/rocket/pull/\(number)")!, + author: author, + isDraft: isDraft, + createdAt: now.addingTimeInterval(-createdMinutesAgo * 60), + updatedAt: now.addingTimeInterval(-60), + headSHA: headSHA, + headCommittedAt: now.addingTimeInterval(-committedMinutesAgo * 60), + rollupState: rollupState, + reviewDecision: reviewDecision, + mergeable: .mergeable, + checks: checks, + requestedReviewers: requested, + reviews: reviews, + threads: threads, + comments: comments + ) + } + + static func checkRun(_ name: String, app: String, slug: String, _ outcome: CheckSignal.Outcome, raw: String? = nil) -> CheckSignal { + CheckSignal( + name: name, + source: .checkRun(appName: app, appSlug: slug), + outcome: outcome, + rawState: raw ?? defaultRaw(outcome), + startedAt: now.addingTimeInterval(-600), + completedAt: outcome == .pending ? nil : now.addingTimeInterval(-300), + url: URL(string: "https://example.com/\(slug)/\(name)") + ) + } + + static func status(_ context: String, creator: String, _ outcome: CheckSignal.Outcome) -> CheckSignal { + CheckSignal( + name: context, + source: .commitStatus(creator: creator), + outcome: outcome, + rawState: outcome == .pending ? "PENDING" : outcome == .failed ? "FAILURE" : "SUCCESS", + startedAt: now.addingTimeInterval(-500), + completedAt: outcome == .pending ? nil : now.addingTimeInterval(-400), + url: nil + ) + } + + static func thread(by author: String, bot: Bool = true, resolved: Bool = false, outdated: Bool = false) -> ThreadSignal { + ThreadSignal(author: author, isBot: bot, isResolved: resolved, isOutdated: outdated, createdAt: now.addingTimeInterval(-200)) + } + + static func review(by author: String, _ state: ReviewSignal.State, sha: String? = "aaa111", bot: Bool = true) -> ReviewSignal { + ReviewSignal(author: author, isBot: bot, state: state, submittedAt: now.addingTimeInterval(-250), commitSHA: sha) + } + + private static func defaultRaw(_ outcome: CheckSignal.Outcome) -> String { + switch outcome { + case .pending: "IN_PROGRESS" + case .succeeded: "SUCCESS" + case .neutral: "SKIPPED" + case .failed: "FAILURE" + } + } +} + +extension StatusEngine { + static let automatic = StatusEngine(mode: .automatic, agents: []) + + func callAsFunction(_ pr: PullRequest) -> PullRequestReport { + report(for: pr, now: Fixture.now) + } +} diff --git a/Tests/PRMonitorTests/GraphQLDecodingTests.swift b/Tests/PRMonitorTests/GraphQLDecodingTests.swift new file mode 100644 index 0000000..cbd194f --- /dev/null +++ b/Tests/PRMonitorTests/GraphQLDecodingTests.swift @@ -0,0 +1,169 @@ +import Foundation +import Testing +@testable import PRMonitor + +/// Decodes synthetic payloads shaped exactly like GitHub's GraphQL responses (captured against the +/// live API, then anonymized) and checks the mapping into the domain model. +@Suite("GraphQL decoding") +struct GraphQLDecodingTests { + private func decode(_ type: T.Type, _ json: String) throws -> T { + try GitHubClient.decoder.decode(T.self, from: Data(json.utf8)) + } + + @Test func listPayloadKeepsGoodRepositoriesWhenOneFails() throws { + let payload = try decode(PullRequestQueries.ListPayload.self, """ + { + "viewer": { "login": "hasaam" }, + "rateLimit": { "remaining": 4812, "resetAt": "2026-09-29T00:06:55Z" }, + "r0": { + "pullRequests": { + "totalCount": 1, + "nodes": [{ + "id": "PR_1", "updatedAt": "2026-09-25T20:33:43Z", "headRefOid": "abc", + "commits": { "nodes": [{ "commit": { "statusCheckRollup": { "state": "PENDING" } } }] } + }] + } + }, + "r1": null + } + """) + #expect(payload.viewerLogin == "hasaam") + #expect(payload.rateLimit?.remaining == 4812) + #expect(payload.repositories.count == 2) + let item = try #require(payload.repositories["r0"] ?? nil).pullRequests.nodes.first + #expect(item?.hasPendingChecks == true) + #expect((payload.repositories["r1"] ?? nil) == nil) + } + + @Test func graphQLErrorsMapBackToTheirAlias() throws { + let error = try decode(GraphQLError.self, """ + { "type": "NOT_FOUND", "path": ["r2"], "message": "Could not resolve to a Repository with the name 'acme/gone'." } + """) + #expect(error.rootField == "r2") + #expect(error.type == "NOT_FOUND") + } + + @Test func detailPayloadMapsIntoAPullRequest() throws { + let payload = try decode(PullRequestQueries.DetailPayload.self, Self.detailJSON) + let pr = try #require(payload.nodes.first ?? nil).toPullRequest() + + #expect(pr.repository == RepositoryID(owner: "acme", name: "rocket")) + #expect(pr.number == 857) + #expect(pr.isDraft) + #expect(pr.mergeable == .conflicting) + #expect(pr.reviewDecision == .changesRequested) + #expect(pr.rollupState == "FAILURE") + + // Check runs, a commit status, and a workflow awaiting approval. + #expect(pr.checks.map(\.name) == ["Semgrep", "Deploy Preview", "Vercel", "Netlify"]) + #expect(pr.checks.map(\.outcome) == [.failed, .pending, .succeeded, .failed]) + #expect(pr.checks[3].rawState == "ACTION_REQUIRED") + #expect(pr.checks[2].groupKey == "vercel") + + #expect(pr.requestedReviewers == [ReviewRequestSignal(login: "copilot-pull-request-reviewer", isBot: true)]) + #expect(pr.reviews.first?.commitSHA == "old999") + #expect(pr.reviews.first?.isBot == true) + #expect(pr.threads.count == 2, "The thread whose author was deleted is dropped") + #expect(pr.threads.filter(\.isOpen).count == 1) + #expect(pr.comments.map(\.author) == ["cursor"]) + } + + @Test func nullNodesAreSkippedRatherThanFailingTheBatch() throws { + let payload = try decode(PullRequestQueries.DetailPayload.self, #"{ "nodes": [null] }"#) + #expect(payload.nodes.count == 1) + #expect(payload.nodes[0] == nil) + } + + static let detailJSON = """ + { + "nodes": [{ + "id": "PR_857", "number": 857, "title": "Market detail page", "url": "https://github.com/acme/rocket/pull/857", + "isDraft": true, "createdAt": "2026-08-10T10:00:00Z", "updatedAt": "2026-08-17T19:45:41Z", + "reviewDecision": "CHANGES_REQUESTED", "mergeable": "CONFLICTING", "headRefOid": "head123", + "repository": { "name": "rocket", "owner": { "login": "acme" } }, + "author": { "__typename": "User", "login": "hasaam" }, + "commits": { "nodes": [{ "commit": { + "committedDate": "2026-08-17T19:45:33Z", + "checkSuites": { "nodes": [ + { "conclusion": "ACTION_REQUIRED", "app": { "name": "Netlify", "slug": "netlify" } }, + { "conclusion": "SUCCESS", "app": { "name": "GitHub Actions", "slug": "github-actions" } } + ] }, + "statusCheckRollup": { "state": "FAILURE", "contexts": { "nodes": [ + { "__typename": "CheckRun", "name": "Semgrep", "status": "COMPLETED", "conclusion": "FAILURE", + "startedAt": "2026-08-17T19:45:44Z", "completedAt": "2026-08-17T19:47:00Z", + "detailsUrl": "https://github.com/acme/rocket/actions/runs/1", "checkSuite": { "app": { "name": "GitHub Actions", "slug": "github-actions" } } }, + { "__typename": "CheckRun", "name": "Deploy Preview", "status": "QUEUED", "conclusion": null, + "startedAt": null, "completedAt": null, "detailsUrl": null, "checkSuite": { "app": { "name": "Supabase", "slug": "supabase" } } }, + { "__typename": "StatusContext", "context": "Vercel", "state": "SUCCESS", "createdAt": "2026-08-17T19:46:10Z", + "targetUrl": "https://vercel.com/acme/rocket/1", "creator": { "login": "vercel" } } + ] } } + } }] }, + "reviewRequests": { "nodes": [ + { "requestedReviewer": { "__typename": "Bot", "login": "copilot-pull-request-reviewer" } }, + { "requestedReviewer": { "__typename": "Team" } } + ] }, + "latestReviews": { "nodes": [ + { "author": { "__typename": "Bot", "login": "chatgpt-codex-connector" }, "state": "COMMENTED", + "submittedAt": "2026-08-16T12:00:00Z", "commit": { "oid": "old999" } } + ] }, + "reviewThreads": { "nodes": [ + { "isResolved": false, "isOutdated": false, "comments": { "nodes": [{ "author": { "__typename": "Bot", "login": "chatgpt-codex-connector" }, "createdAt": "2026-08-16T12:00:00Z" }] } }, + { "isResolved": false, "isOutdated": true, "comments": { "nodes": [{ "author": { "__typename": "Bot", "login": "chatgpt-codex-connector" }, "createdAt": "2026-08-15T12:00:00Z" }] } }, + { "isResolved": true, "isOutdated": false, "comments": { "nodes": [{ "author": null, "createdAt": "2026-08-14T12:00:00Z" }] } } + ] }, + "comments": { "nodes": [ { "author": { "__typename": "Bot", "login": "cursor" }, "createdAt": "2026-08-17T19:50:00Z" } ] } + }] + } + """ +} + +@Suite("Settings migration") +@MainActor +struct SettingsMigrationTests { + private func defaults(with legacy: String) -> UserDefaults { + let suite = "PRMonitorTests.\(UUID().uuidString)" + let defaults = UserDefaults(suiteName: suite)! + defaults.set(Data(legacy.utf8), forKey: "PRMonitorSettings") + return defaults + } + + @Test func untouchedSeededAgentsMigrateToAutomaticMode() { + let settings = AppSettings(defaults: defaults(with: """ + { "repos": [{ "owner": "acme", "name": "rocket", "isEnabled": true }, { "owner": "acme", "name": "old", "isEnabled": false }], + "agents": [ + { "id": "\(UUID())", "displayName": "Vercel", "checkNamePattern": "vercel", "commentAuthor": "vercel" }, + { "id": "\(UUID())", "displayName": "Cursor Bugbot", "checkNamePattern": "cursor", "commentAuthor": "cursor" }, + { "id": "\(UUID())", "displayName": "Devin Review", "checkNamePattern": "devin", "commentAuthor": "devin-ai-integration" } + ], + "pollingIntervalSeconds": 120, "notifyPerAgent": true, "notifySummary": false, "githubClientId": "Iv1.abc" } + """)) + #expect(settings.enabledRepositories == [RepositoryID(owner: "acme", name: "rocket")]) + #expect(settings.repositories.count == 2) + #expect(settings.agentMode == .automatic) + #expect(settings.refreshInterval == 120) + #expect(settings.notifiesPerAgent) + #expect(!settings.notifiesWhenSettled) + #expect(settings.oauthClientIDOverride == "Iv1.abc") + } + + @Test func customizedAgentsAreKept() { + let settings = AppSettings(defaults: defaults(with: """ + { "repos": [], "agents": [{ "id": "\(UUID())", "displayName": "CodeRabbit", "checkNamePattern": "coderabbit", "commentAuthor": "coderabbitai" }] } + """)) + #expect(settings.agentMode == .custom) + #expect(settings.agents.map(\.login) == ["coderabbitai"]) + } + + @Test func settingsRoundTripThroughStorage() { + let defaults = UserDefaults(suiteName: "PRMonitorTests.\(UUID().uuidString)")! + let settings = AppSettings(defaults: defaults) + settings.track(RepositoryID(owner: "acme", name: "rocket")) + settings.scope = .authored + settings.agentMode = .custom + + let reloaded = AppSettings(defaults: defaults) + #expect(reloaded.repositories.map(\.id.fullName) == ["acme/rocket"]) + #expect(reloaded.scope == .authored) + #expect(reloaded.agentMode == .custom) + } +} diff --git a/Tests/PRMonitorTests/NotificationPlannerTests.swift b/Tests/PRMonitorTests/NotificationPlannerTests.swift new file mode 100644 index 0000000..27aa534 --- /dev/null +++ b/Tests/PRMonitorTests/NotificationPlannerTests.swift @@ -0,0 +1,136 @@ +import Foundation +import Testing +@testable import PRMonitor + +@Suite("Notification planner") +struct NotificationPlannerTests { + typealias F = Fixture + let engine = StatusEngine.automatic + let preferences = NotificationPreferences() + + private func running(sha: String = "aaa111", number: Int = 1) -> PullRequestReport { + engine(F.pullRequest(number: number, headSHA: sha, checks: [F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .pending)])) + } + + private func passed(sha: String = "aaa111", number: Int = 1, createdMinutesAgo: Double = 120) -> PullRequestReport { + engine(F.pullRequest(number: number, headSHA: sha, createdMinutesAgo: createdMinutesAgo, + checks: [F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .succeeded)])) + } + + private func withFeedback(sha: String = "aaa111") -> PullRequestReport { + engine(F.pullRequest(headSHA: sha, checks: [F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .succeeded)], + threads: [F.thread(by: "cursor")])) + } + + @Test func theFirstPollOnlyRecordsABaseline() { + var planner = NotificationPlanner() + #expect(planner.plan(for: [passed()], preferences: preferences, now: F.now).isEmpty) + } + + @Test func announcesOnceWhenAPullRequestSettles() { + var planner = NotificationPlanner() + _ = planner.plan(for: [running()], preferences: preferences, now: F.now) + + let settled = planner.plan(for: [passed()], preferences: preferences, now: F.now) + #expect(settled.count == 1) + #expect(settled.first?.kind == .settled(.ready)) + #expect(settled.first?.subtitle == "All clear") + + #expect(planner.plan(for: [passed()], preferences: preferences, now: F.now).isEmpty, "No repeat on the next poll") + } + + @Test func aNewPushStartsAFreshLifecycle() { + var planner = NotificationPlanner() + _ = planner.plan(for: [running()], preferences: preferences, now: F.now) + _ = planner.plan(for: [passed()], preferences: preferences, now: F.now) + + // Pushed and finished between two polls: still announced, because it's a new commit. + let next = planner.plan(for: [passed(sha: "bbb222")], preferences: preferences, now: F.now) + #expect(next.count == 1) + #expect(next.first?.headSHA == "bbb222") + } + + @Test func feedbackAfterSettlingIsAnnouncedAsARegression() { + var planner = NotificationPlanner() + _ = planner.plan(for: [running()], preferences: preferences, now: F.now) + _ = planner.plan(for: [passed()], preferences: preferences, now: F.now) + + let regressed = planner.plan(for: [withFeedback()], preferences: preferences, now: F.now) + #expect(regressed.map(\.kind) == [.regressed(.needsReview)]) + #expect(regressed.first?.body.contains("1 open thread") == true) + } + + @Test func pullRequestsThatExistedBeforeLaunchAreNotAnnouncedWhenTheyAppear() { + var planner = NotificationPlanner() + _ = planner.plan(for: [], preferences: preferences, now: F.now) + // e.g. the user just enabled a repository with an old, already-green PR. + #expect(planner.plan(for: [passed(number: 7)], preferences: preferences, now: F.now).isEmpty) + } + + @Test func pullRequestsOpenedAfterLaunchAreAnnounced() { + var planner = NotificationPlanner() + let launch = F.now.addingTimeInterval(-3600) + _ = planner.plan(for: [], preferences: preferences, now: launch) + let planned = planner.plan(for: [passed(number: 8, createdMinutesAgo: 5)], preferences: preferences, now: F.now) + #expect(planned.count == 1) + } + + @Test func respectsPreferences() { + var planner = NotificationPlanner() + let off = NotificationPreferences(whenSettled: false, whenFeedbackArrives: false, perAgent: false) + _ = planner.plan(for: [running()], preferences: off, now: F.now) + #expect(planner.plan(for: [passed()], preferences: off, now: F.now).isEmpty) + } + + @Test func perAgentNotificationsFireAsEachAgentFinishes() { + var planner = NotificationPlanner() + let perAgent = NotificationPreferences(whenSettled: false, whenFeedbackArrives: false, perAgent: true) + let twoRunning = engine(F.pullRequest(checks: [ + F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .pending), + F.checkRun("Bugbot", app: "Cursor", slug: "cursor", .pending), + ])) + let oneDone = engine(F.pullRequest(checks: [ + F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .succeeded), + F.checkRun("Bugbot", app: "Cursor", slug: "cursor", .pending), + ])) + _ = planner.plan(for: [twoRunning], preferences: perAgent, now: F.now) + let planned = planner.plan(for: [oneDone], preferences: perAgent, now: F.now) + #expect(planned.map(\.kind) == [.agentFinished(name: "GitHub Actions", state: .passed)]) + #expect(planner.plan(for: [oneDone], preferences: perAgent, now: F.now).isEmpty) + } + + @Test func identifiersAreStableSoRepeatsReplaceRatherThanStack() { + var a = NotificationPlanner(), b = NotificationPlanner() + _ = a.plan(for: [running()], preferences: preferences, now: F.now) + _ = b.plan(for: [running()], preferences: preferences, now: F.now) + let first = a.plan(for: [passed()], preferences: preferences, now: F.now) + let second = b.plan(for: [passed()], preferences: preferences, now: F.now) + #expect(first.map(\.identifier) == second.map(\.identifier)) + #expect(first.first?.identifier == "acme/rocket#1@aaa111/settled-ready") + } +} + +@Suite("Polling policy") +struct PollingPolicyTests { + let policy = PollingPolicy(activeInterval: 60) + + @Test func pollsAtTheUsersIntervalWhileAgentsRun() { + #expect(policy.delay(after: .success(hasRunningPullRequests: true, hasOpenPullRequests: true)) == 60) + } + + @Test func slowsDownOnceEverythingSettles() { + #expect(policy.delay(after: .success(hasRunningPullRequests: false, hasOpenPullRequests: true)) == 120) + #expect(policy.delay(after: .success(hasRunningPullRequests: false, hasOpenPullRequests: false)) == 300) + } + + @Test func backsOffExponentiallyOnFailure() { + let delays = (1...6).map { policy.delay(after: .failure(consecutive: $0)) } + #expect(delays == [30, 60, 120, 240, 480, 600]) + } + + @Test func waitsOutARateLimit() { + let now = Date(timeIntervalSince1970: 0) + #expect(policy.delay(after: .rateLimited(resetAt: now.addingTimeInterval(900)), now: now) == 905) + #expect(policy.delay(after: .rateLimited(resetAt: now.addingTimeInterval(-10)), now: now) == 30, "Never returns a negative or tiny wait") + } +} diff --git a/Tests/PRMonitorTests/PRMonitorSmokeTests.swift b/Tests/PRMonitorTests/PRMonitorSmokeTests.swift deleted file mode 100644 index 2bfa99f..0000000 --- a/Tests/PRMonitorTests/PRMonitorSmokeTests.swift +++ /dev/null @@ -1,16 +0,0 @@ -import XCTest -@testable import PRMonitor - -final class PRMonitorSmokeTests: XCTestCase { - func testRepoConfigFullName() { - let repo = RepoConfig(owner: "apple", name: "swift", isEnabled: true) - XCTAssertEqual(repo.id, "apple/swift") - XCTAssertEqual(repo.fullName, "apple/swift") - } - - func testAgentRunStatusRawValuesStable() { - XCTAssertEqual(AgentRunStatus.running.rawValue, "running") - XCTAssertEqual(AgentRunStatus.failed.rawValue, "failed") - XCTAssertEqual(AgentRunStatus.done.rawValue, "done") - } -} diff --git a/Tests/PRMonitorTests/RepositoryIDTests.swift b/Tests/PRMonitorTests/RepositoryIDTests.swift new file mode 100644 index 0000000..36fff66 --- /dev/null +++ b/Tests/PRMonitorTests/RepositoryIDTests.swift @@ -0,0 +1,29 @@ +import Testing +@testable import PRMonitor + +@Suite("Repository parsing") +struct RepositoryIDTests { + @Test("Accepts every common way of writing a repository", arguments: [ + "apple/swift", + " apple/swift ", + "https://github.com/apple/swift", + "https://github.com/apple/swift.git", + "https://github.com/apple/swift/pull/42", + "git@github.com:apple/swift.git", + ]) + func parses(_ input: String) { + #expect(RepositoryID(parsing: input) == RepositoryID(owner: "apple", name: "swift")) + } + + @Test("Rejects malformed input", arguments: [ + "", "swift", "/swift", "apple/", "-apple/swift", "apple/sw ift", "https://gitlab.com/apple/swift", "apple/..", + ]) + func rejects(_ input: String) { + #expect(RepositoryID(parsing: input) == nil) + } + + @Test func sortsNaturally() { + let ids = ["acme/rocket10", "acme/rocket2", "Acme/alpha"].compactMap(RepositoryID.init(parsing:)) + #expect(ids.sorted().map(\.name) == ["alpha", "rocket2", "rocket10"]) + } +} diff --git a/Tests/PRMonitorTests/StatusEngineTests.swift b/Tests/PRMonitorTests/StatusEngineTests.swift new file mode 100644 index 0000000..4b948c4 --- /dev/null +++ b/Tests/PRMonitorTests/StatusEngineTests.swift @@ -0,0 +1,164 @@ +import Foundation +import Testing +@testable import PRMonitor + +@Suite("Status engine") +struct StatusEngineTests { + typealias F = Fixture + + // MARK: - Automatic mode + + @Test func groupsJobsFromTheSameIntegrationIntoOneAgent() { + let report = StatusEngine.automatic(F.pullRequest(checks: [ + F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .succeeded), + F.checkRun("test", app: "GitHub Actions", slug: "github-actions", .succeeded), + F.checkRun("lint", app: "GitHub Actions", slug: "github-actions", .succeeded), + ])) + #expect(report.agents.map(\.name) == ["GitHub Actions"]) + #expect(report.agents[0].summary == "3 checks passed") + #expect(report.status == .ready) + } + + @Test func mergesACommitStatusAndCheckRunFromTheSameBot() { + // Vercel reports both a commit status and a "Preview Comments" check run. + let report = StatusEngine.automatic(F.pullRequest(checks: [ + F.status("Vercel", creator: "vercel", .succeeded), + F.checkRun("Vercel Preview Comments", app: "Vercel", slug: "vercel", .succeeded), + ])) + #expect(report.agents.count == 1) + #expect(report.agents[0].name == "Vercel") + } + + @Test func oneFailedJobFailsTheWholeAgentEvenWhileOthersRun() { + let report = StatusEngine.automatic(F.pullRequest(checks: [ + F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .failed), + F.checkRun("test", app: "GitHub Actions", slug: "github-actions", .pending), + F.checkRun("lint", app: "GitHub Actions", slug: "github-actions", .succeeded), + ])) + #expect(report.agents[0].state == .failed) + #expect(report.agents[0].summary == "1 of 3 failed") + #expect(report.status == .failing) + #expect(report.isSettled, "A failed agent counts as finished: the failure is already actionable") + } + + @Test func failureOutranksRunningAtThePullRequestLevel() { + let report = StatusEngine.automatic(F.pullRequest(checks: [ + F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .failed), + F.checkRun("Bugbot", app: "Cursor", slug: "cursor", .pending), + ])) + #expect(report.status == .failing) + #expect(!report.isSettled, "Cursor is still running, so the PR hasn't settled") + } + + @Test func reviewOnlyBotsBecomeAgentsButCommentOnlyBotsDoNot() { + let report = StatusEngine.automatic(F.pullRequest( + threads: [F.thread(by: "chatgpt-codex-connector")], + comments: [CommentSignal(author: "changeset-bot", isBot: true, createdAt: F.now)] + )) + #expect(report.agents.map(\.name) == ["Codex"]) + #expect(report.agents[0].state == .needsReview) + #expect(report.agents[0].summary == "1 open thread") + } + + @Test func humanThreadsDoNotCreateAgents() { + let report = StatusEngine.automatic(F.pullRequest(threads: [F.thread(by: "octocat", bot: false)])) + #expect(report.agents.isEmpty) + #expect(report.status == .quiet) + #expect(report.openThreadCount == 1) + } + + @Test func resolvedAndOutdatedThreadsDoNotNeedReview() { + let report = StatusEngine.automatic(F.pullRequest( + checks: [F.checkRun("Bugbot", app: "Cursor", slug: "cursor", .succeeded)], + reviews: [F.review(by: "cursor", .commented)], + threads: [F.thread(by: "cursor", resolved: true), F.thread(by: "cursor", outdated: true)] + )) + #expect(report.agents.map(\.state) == [.passed]) + #expect(report.status == .ready) + } + + @Test func aPendingReviewRequestMeansTheBotIsStillReviewing() { + let report = StatusEngine.automatic(F.pullRequest( + requested: [ReviewRequestSignal(login: "copilot-pull-request-reviewer", isBot: true)] + )) + #expect(report.agents.map(\.name) == ["Copilot"]) + #expect(report.agents[0].state == .running) + #expect(report.agents[0].summary == "Reviewing") + } + + @Test func skippedAndCancelledChecksAreNotFailures() { + let report = StatusEngine.automatic(F.pullRequest(checks: [ + F.checkRun("Supabase Preview", app: "Supabase", slug: "supabase", .neutral, raw: "SKIPPED"), + F.checkRun("deploy", app: "Netlify", slug: "netlify", .neutral, raw: "CANCELLED"), + ])) + #expect(report.agents.map(\.summary) == ["Skipped", "Cancelled"]) + #expect(report.status == .ready) + } + + @Test func trustsAPendingRollupWhenNoVisibleCheckIsPending() { + let report = StatusEngine.automatic(F.pullRequest( + rollupState: "PENDING", + checks: [F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .succeeded)] + )) + #expect(report.status == .running) + #expect(report.agents.contains { $0.id == "rollup" }) + } + + @Test func aHumanRequestingChangesKeepsThePullRequestInReview() { + let report = StatusEngine.automatic(F.pullRequest( + reviewDecision: .changesRequested, + checks: [F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .succeeded)] + )) + #expect(report.status == .needsReview) + } + + // MARK: - Stale reviews + + @Test func aReviewOfAnOlderCommitIsAssumedToBeRedoneShortlyAfterAPush() { + let pr = F.pullRequest(headSHA: "new222", committedMinutesAgo: 1, reviews: [F.review(by: "chatgpt-codex-connector", .commented, sha: "old111")]) + let report = StatusEngine.automatic(pr) + #expect(report.agents[0].state == .running) + #expect(report.agents[0].summary == "Waiting to review") + } + + @Test func aReviewOfAnOlderCommitSettlesAfterTheGracePeriod() { + let pr = F.pullRequest(headSHA: "new222", committedMinutesAgo: 20, reviews: [F.review(by: "chatgpt-codex-connector", .commented, sha: "old111")]) + let report = StatusEngine.automatic(pr) + #expect(report.agents[0].state == .passed) + #expect(report.agents[0].summary == "Reviewed an earlier commit") + } + + // MARK: - Custom mode + + @Test func customAgentsMatchChecksByPatternAndReviewsByLogin() { + let engine = StatusEngine(mode: .custom, agents: [ + Agent(name: "Bugbot", checkPattern: "cursor", login: "cursor"), + ]) + let report = engine(F.pullRequest( + checks: [ + F.checkRun("Cursor Bugbot", app: "Cursor", slug: "cursor", .succeeded), + F.checkRun("build", app: "GitHub Actions", slug: "github-actions", .failed), + ], + threads: [F.thread(by: "cursor[bot]"), F.thread(by: "cursor"), F.thread(by: "someone-else")] + )) + #expect(report.agents.map(\.name) == ["Bugbot"]) + #expect(report.agents[0].openThreads == 2, "REST-style `cursor[bot]` and GraphQL-style `cursor` are the same bot") + #expect(report.status == .needsReview, "The failing Actions job isn't a configured agent, so it's ignored") + } + + @Test func aConfiguredAgentThatHasNotReportedIsExpectedRightAfterAPush() { + let engine = StatusEngine(mode: .custom, agents: [Agent(name: "Devin", login: "devin-ai-integration")]) + let justPushed = engine(F.pullRequest(committedMinutesAgo: 1)) + #expect(justPushed.agents.map(\.summary) == ["Waiting to start"]) + #expect(justPushed.status == .running) + + let later = engine(F.pullRequest(committedMinutesAgo: 30)) + #expect(later.agents.isEmpty, "After the grace period it's treated as not applicable") + #expect(later.status == .quiet) + } + + @Test func invalidAgentsAreIgnored() { + let engine = StatusEngine(mode: .custom, agents: [Agent(name: "Nothing")]) + #expect(engine(F.pullRequest(checks: [F.checkRun("x", app: "X", slug: "x", .failed)])).agents.isEmpty) + } +} From 138958bd3ff9f6797a43ba19503cf85068af0001 Mon Sep 17 00:00:00 2001 From: Hasaam Date: Mon, 28 Sep 2026 21:21:08 -0400 Subject: [PATCH 3/6] feat(github): two-phase GraphQL fetcher and sign-in options Batch repositories into one aliased list query and fetch details only for pull requests that changed, keeping each poll near one point per repository. Map partial errors to their repository, handle primary and secondary rate limits, and add device flow, GitHub CLI and token sign-in. --- Sources/PRMonitor/GitHub/DeviceFlow.swift | 109 +++++ Sources/PRMonitor/GitHub/GitHubCLI.swift | 52 +++ Sources/PRMonitor/GitHub/GitHubClient.swift | 175 +++++++++ Sources/PRMonitor/GitHub/GitHubError.swift | 52 +++ .../PRMonitor/GitHub/PullRequestFetcher.swift | 129 ++++++ .../PRMonitor/GitHub/PullRequestQueries.swift | 371 ++++++++++++++++++ Sources/PRMonitor/GitHub/ViewerQueries.swift | 69 ++++ 7 files changed, 957 insertions(+) create mode 100644 Sources/PRMonitor/GitHub/DeviceFlow.swift create mode 100644 Sources/PRMonitor/GitHub/GitHubCLI.swift create mode 100644 Sources/PRMonitor/GitHub/GitHubClient.swift create mode 100644 Sources/PRMonitor/GitHub/GitHubError.swift create mode 100644 Sources/PRMonitor/GitHub/PullRequestFetcher.swift create mode 100644 Sources/PRMonitor/GitHub/PullRequestQueries.swift create mode 100644 Sources/PRMonitor/GitHub/ViewerQueries.swift diff --git a/Sources/PRMonitor/GitHub/DeviceFlow.swift b/Sources/PRMonitor/GitHub/DeviceFlow.swift new file mode 100644 index 0000000..4b07727 --- /dev/null +++ b/Sources/PRMonitor/GitHub/DeviceFlow.swift @@ -0,0 +1,109 @@ +import Foundation + +/// GitHub's OAuth device authorization flow (RFC 8628): no client secret, no redirect URI. +struct DeviceFlow: Sendable { + struct Authorization: Hashable, Sendable { + let userCode: String + let deviceCode: String + let verificationURL: URL + let expiresAt: Date + let interval: TimeInterval + } + + enum Failure: Error, Equatable, LocalizedError { + case expired + case denied + case misconfigured(String) + case transport(String) + + var errorDescription: String? { + switch self { + case .expired: "The sign-in code expired. Start again to get a new one." + case .denied: "Sign-in was cancelled on GitHub." + case let .misconfigured(detail): "GitHub rejected the OAuth app configuration: \(detail)" + case let .transport(detail): detail + } + } + } + + /// `repo` is required to read checks on private repositories. + static let scope = "repo" + + let clientID: String + var session: URLSession = .monitor + + func start() async throws(Failure) -> Authorization { + struct Payload: Decodable { + let device_code: String + let user_code: String + let verification_uri: URL + let expires_in: TimeInterval + let interval: TimeInterval? + } + let payload: Payload = try await post("https://github.com/login/device/code", ["client_id": clientID, "scope": Self.scope]) + return Authorization( + userCode: payload.user_code, + deviceCode: payload.device_code, + verificationURL: payload.verification_uri, + expiresAt: .now.addingTimeInterval(payload.expires_in), + interval: payload.interval ?? 5 + ) + } + + /// Polls until the user approves, denies, or the code expires. Cancelling the task stops polling. + func token(for authorization: Authorization) async throws(Failure) -> String { + struct Payload: Decodable { + let access_token: String? + let error: String? + let error_description: String? + let interval: TimeInterval? + } + + var interval = authorization.interval + while Date.now < authorization.expiresAt { + do { + try await Task.sleep(for: .seconds(interval)) + } catch { + throw .transport("Sign-in was cancelled.") + } + let payload: Payload = try await post("https://github.com/login/oauth/access_token", [ + "client_id": clientID, + "device_code": authorization.deviceCode, + "grant_type": "urn:ietf:params:oauth:grant-type:device_code", + ]) + if let token = payload.access_token { return token } + switch payload.error { + case "authorization_pending": continue + case "slow_down": interval = payload.interval ?? interval + 5 + case "expired_token": throw .expired + case "access_denied": throw .denied + default: throw .misconfigured(payload.error_description ?? payload.error ?? "unknown error") + } + } + throw .expired + } + + private func post(_ url: String, _ form: [String: String]) async throws(Failure) -> Payload { + var components = URLComponents() + components.queryItems = form.map { URLQueryItem(name: $0.key, value: $0.value) } + var request = URLRequest(url: URL(string: url)!) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Accept") + request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") + request.httpBody = components.percentEncodedQuery?.data(using: .utf8) + + do { + let (data, response) = try await session.data(for: request) + if let http = response as? HTTPURLResponse, !(200..<300).contains(http.statusCode) { + throw Failure.misconfigured("HTTP \(http.statusCode)") + } + return try JSONDecoder().decode(Payload.self, from: data) + } catch let failure as Failure { + throw failure + } catch is DecodingError { + throw .misconfigured("Unexpected response. Check the OAuth app's client ID and that device flow is enabled.") + } catch { + throw .transport(error.localizedDescription) + } + } +} diff --git a/Sources/PRMonitor/GitHub/GitHubCLI.swift b/Sources/PRMonitor/GitHub/GitHubCLI.swift new file mode 100644 index 0000000..cb5b84a --- /dev/null +++ b/Sources/PRMonitor/GitHub/GitHubCLI.swift @@ -0,0 +1,52 @@ +import Foundation + +/// Reuses the credentials of the GitHub CLI (`gh`), which most developers already have signed in. +enum GitHubCLI { + /// GUI apps don't inherit the shell's PATH, so look in the usual install locations. + private static let candidatePaths = [ + "/opt/homebrew/bin/gh", + "/usr/local/bin/gh", + "/usr/bin/gh", + "\(NSHomeDirectory())/.local/bin/gh", + ] + + static var executableURL: URL? { + candidatePaths.lazy + .filter { FileManager.default.isExecutableFile(atPath: $0) } + .map { URL(filePath: $0) } + .first + } + + static var isInstalled: Bool { executableURL != nil } + + enum Failure: Error, LocalizedError { + case notInstalled + case notSignedIn + + var errorDescription: String? { + switch self { + case .notInstalled: "The GitHub CLI isn't installed." + case .notSignedIn: "The GitHub CLI isn't signed in. Run `gh auth login` in Terminal, then try again." + } + } + } + + /// Runs `gh auth token` off the main thread. + static func token() async throws -> String { + guard let executableURL else { throw Failure.notInstalled } + return try await Task.detached(priority: .userInitiated) { + let process = Process() + process.executableURL = executableURL + process.arguments = ["auth", "token", "--hostname", "github.com"] + let output = Pipe() + process.standardOutput = output + process.standardError = Pipe() + try process.run() + let data = output.fileHandleForReading.readDataToEndOfFile() + process.waitUntilExit() + let token = String(decoding: data, as: UTF8.self).trimmed + guard process.terminationStatus == 0, !token.isEmpty else { throw Failure.notSignedIn } + return token + }.value + } +} diff --git a/Sources/PRMonitor/GitHub/GitHubClient.swift b/Sources/PRMonitor/GitHub/GitHubClient.swift new file mode 100644 index 0000000..aa4f8c5 --- /dev/null +++ b/Sources/PRMonitor/GitHub/GitHubClient.swift @@ -0,0 +1,175 @@ +import Foundation + +/// A minimal GitHub GraphQL client. It knows about transport concerns only — auth, rate limits, +/// and error mapping — and nothing about pull requests. +struct GitHubClient: Sendable { + static let endpoint = URL(string: "https://api.github.com/graphql")! + + let token: String + var session: URLSession = .monitor + + struct Response: Sendable { + let data: Payload? + /// Errors scoped to part of the query (e.g. one repository alias), alongside partial data. + let errors: [GraphQLError] + } + + func query( + _ document: String, + variables: [String: GraphQLVariable] = [:], + as payload: Payload.Type = Payload.self + ) async throws(GitHubError) -> Response { + var request = URLRequest(url: Self.endpoint) + request.httpMethod = "POST" + request.setValue("bearer \(token)", forHTTPHeaderField: "Authorization") + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + request.setValue(Self.userAgent, forHTTPHeaderField: "User-Agent") + do { + request.httpBody = try JSONEncoder().encode(Body(query: document, variables: variables)) + } catch { + throw .decoding("Couldn't encode the request.") + } + + let data: Data + let response: URLResponse + do { + (data, response) = try await session.data(for: request) + } catch let error as URLError { + throw GitHubError(error) + } catch { + throw .network(error.localizedDescription) + } + + guard let http = response as? HTTPURLResponse else { throw .network("No response from GitHub.") } + try Self.validate(http, body: data) + + let envelope: Envelope + do { + envelope = try Self.decoder.decode(Envelope.self, from: data) + } catch { + throw .decoding(String(describing: error)) + } + + let errors = envelope.errors ?? [] + if errors.contains(where: { $0.type == "RATE_LIMITED" }) { + throw .rateLimited(resetAt: Self.rateLimitReset(http)) + } + guard envelope.data != nil else { + throw .graphQL(errors.map(\.message)) + } + return Response(data: envelope.data, errors: errors) + } + + // MARK: - HTTP validation + + private static func validate(_ http: HTTPURLResponse, body: Data) throws(GitHubError) { + switch http.statusCode { + case 200..<300: + return + case 401: + throw .unauthorized + case 403, 429: + // Primary limit: remaining hits zero. Secondary limit: a Retry-After header. + let remaining = http.value(forHTTPHeaderField: "x-ratelimit-remaining") + if remaining == "0" || http.value(forHTTPHeaderField: "retry-after") != nil || http.statusCode == 429 { + throw .rateLimited(resetAt: rateLimitReset(http)) + } + throw .forbidden(message(in: body) ?? "") + case 500...: + throw .server(status: http.statusCode) + default: + throw .network(message(in: body) ?? "GitHub returned HTTP \(http.statusCode).") + } + } + + private static func rateLimitReset(_ http: HTTPURLResponse) -> Date? { + if let retryAfter = http.value(forHTTPHeaderField: "retry-after").flatMap(TimeInterval.init) { + return .now.addingTimeInterval(retryAfter) + } + if let reset = http.value(forHTTPHeaderField: "x-ratelimit-reset").flatMap(TimeInterval.init) { + return Date(timeIntervalSince1970: reset) + } + return nil + } + + private static func message(in body: Data) -> String? { + struct Message: Decodable { let message: String } + return try? JSONDecoder().decode(Message.self, from: body).message + } + + // MARK: - Coding + + static let decoder: JSONDecoder = { + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .iso8601 + return decoder + }() + + static let userAgent: String = { + let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "dev" + return "PRMonitor/\(version)" + }() + + private struct Body: Encodable { + let query: String + let variables: [String: GraphQLVariable] + } + + private struct Envelope: Decodable { + let data: Payload? + let errors: [GraphQLError]? + } +} + +struct GraphQLError: Decodable, Sendable, Hashable { + let type: String? + let message: String + let path: [PathComponent]? + + /// The top-level field (alias) this error belongs to, e.g. `r3`. + var rootField: String? { + if case let .key(key) = path?.first { return key } + return nil + } + + enum PathComponent: Decodable, Sendable, Hashable { + case key(String) + case index(Int) + + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + if let index = try? container.decode(Int.self) { + self = .index(index) + } else { + self = .key(try container.decode(String.self)) + } + } + } +} + +enum GraphQLVariable: Encodable, Sendable, Hashable { + case string(String) + case strings([String]) + case null + + func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + switch self { + case let .string(value): try container.encode(value) + case let .strings(values): try container.encode(values) + case .null: try container.encodeNil() + } + } +} + +extension URLSession { + /// Short timeouts and no caching: a monitor wants fresh data or a fast failure it can retry. + static let monitor: URLSession = { + let configuration = URLSessionConfiguration.ephemeral + configuration.timeoutIntervalForRequest = 30 + configuration.timeoutIntervalForResource = 60 + configuration.requestCachePolicy = .reloadIgnoringLocalCacheData + configuration.httpAdditionalHeaders = ["X-Github-Next-Global-ID": "1"] + return URLSession(configuration: configuration) + }() +} diff --git a/Sources/PRMonitor/GitHub/GitHubError.swift b/Sources/PRMonitor/GitHub/GitHubError.swift new file mode 100644 index 0000000..df6776f --- /dev/null +++ b/Sources/PRMonitor/GitHub/GitHubError.swift @@ -0,0 +1,52 @@ +import Foundation + +enum GitHubError: Error, Hashable, Sendable, LocalizedError { + /// The token is missing, expired or revoked. + case unauthorized + case rateLimited(resetAt: Date?) + case forbidden(String) + case notFound(String) + case offline + case network(String) + case server(status: Int) + case graphQL([String]) + case decoding(String) + + var errorDescription: String? { + switch self { + case .unauthorized: + "Your GitHub session has expired. Sign in again to resume monitoring." + case let .rateLimited(resetAt): + if let resetAt { + "GitHub's rate limit was reached. Monitoring resumes \(resetAt.formatted(.relative(presentation: .named)))." + } else { + "GitHub's rate limit was reached. Monitoring resumes shortly." + } + case let .forbidden(message): + message.isEmpty ? "GitHub denied access." : message + case let .notFound(message): + message + case .offline: + "You're offline. Monitoring resumes when your connection is back." + case let .network(message): + message + case let .server(status): + "GitHub is having trouble (HTTP \(status)). Retrying automatically." + case let .graphQL(messages): + messages.first ?? "GitHub returned an error." + case let .decoding(detail): + "GitHub sent a response PR Monitor couldn't read. \(detail)" + } + } + + init(_ error: URLError) { + switch error.code { + case .notConnectedToInternet, .networkConnectionLost, .dataNotAllowed, .internationalRoamingOff: + self = .offline + case .userAuthenticationRequired: + self = .unauthorized + default: + self = .network(error.localizedDescription) + } + } +} diff --git a/Sources/PRMonitor/GitHub/PullRequestFetcher.swift b/Sources/PRMonitor/GitHub/PullRequestFetcher.swift new file mode 100644 index 0000000..3ed355e --- /dev/null +++ b/Sources/PRMonitor/GitHub/PullRequestFetcher.swift @@ -0,0 +1,129 @@ +import Foundation + +/// Loads open pull requests for many repositories with as few GraphQL points as possible. +/// +/// Holds a cache of PR details between polls. Each poll lists every repository (cheap), then +/// re-fetches details only for PRs that changed, still have work in flight, or went stale. +actor PullRequestFetcher { + struct Result: Sendable { + var viewerLogin: String? + var repositories: [RepositoryID: RepositoryResult] + /// Remaining GraphQL points and when the window resets, for pacing the next poll. + var rateLimit: (remaining: Int, resetAt: Date)? + } + + enum RepositoryResult: Sendable { + case loaded(pullRequests: [PullRequest], totalOpen: Int) + case failed(GitHubError) + } + + private struct CacheEntry { + let fingerprint: String + let fetchedAt: Date + let pullRequest: PullRequest + } + + private var cache: [String: CacheEntry] = [:] + private let repositoriesPerListQuery = 10 + /// Details are refreshed at least this often even if nothing appears to have changed, which + /// catches events that don't bump `updatedAt` (e.g. a thread being resolved). + private let maximumDetailAge: TimeInterval = 300 + /// Right after a push, agents are still registering; keep details fresh during that window. + private let recentPushWindow: TimeInterval = 600 + + func reset() { + cache.removeAll() + } + + func fetch(_ repositories: [RepositoryID], client: GitHubClient, now: Date = .now) async throws(GitHubError) -> Result { + guard !repositories.isEmpty else { return Result(viewerLogin: nil, repositories: [:], rateLimit: nil) } + + // Phase 1: list every repository, batched with aliases. + let batches = stride(from: 0, to: repositories.count, by: repositoriesPerListQuery).map { + Array(repositories[$0..( + _ operation: () async throws(GitHubError) -> T + ) async throws(GitHubError) -> T { + do { + return try await operation() + } catch .server { + try? await Task.sleep(for: .seconds(1)) + return try await operation() + } + } + + private func needsDetail(_ item: PullRequestQueries.ListItemDTO, now: Date) -> Bool { + guard let entry = cache[item.id] else { return true } + if entry.fingerprint != item.fingerprint { return true } + if item.hasPendingChecks { return true } + if now.timeIntervalSince(entry.fetchedAt) > maximumDetailAge { return true } + let pr = entry.pullRequest + if !pr.requestedReviewers.filter(\.isBot).isEmpty { return true } + if let pushed = pr.headCommittedAt, now.timeIntervalSince(pushed) < recentPushWindow { return true } + return false + } +} diff --git a/Sources/PRMonitor/GitHub/PullRequestQueries.swift b/Sources/PRMonitor/GitHub/PullRequestQueries.swift new file mode 100644 index 0000000..143f23c --- /dev/null +++ b/Sources/PRMonitor/GitHub/PullRequestQueries.swift @@ -0,0 +1,371 @@ +import Foundation + +/// GraphQL documents and response types for monitoring pull requests. +/// +/// Fetching happens in two phases to stay far below GitHub's 5,000 points/hour budget: +/// 1. A **list** query batches many repositories into one request using aliases (`r0`, `r1`…) and +/// returns just enough to fingerprint each open PR (~1 point per repository). +/// 2. A **detail** query loads checks, reviews and threads by node ID, but only for PRs whose +/// fingerprint changed or that still have work in flight. +enum PullRequestQueries { + static let pullRequestsPerRepository = 50 + + // MARK: - List + + static func listDocument(repositoryCount: Int) -> String { + let parameters = (0.. [String: GraphQLVariable] { + var variables: [String: GraphQLVariable] = [:] + for (index, repository) in repositories.enumerated() { + variables["o\(index)"] = .string(repository.owner) + variables["n\(index)"] = .string(repository.name) + } + return variables + } + + struct ListPayload: Decodable, Sendable { + let viewerLogin: String? + let rateLimit: RateLimitDTO? + /// Keyed by alias. A `nil` value means GitHub couldn't resolve that repository. + let repositories: [String: RepositoryListDTO?] + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: DynamicKey.self) + viewerLogin = try container.decodeIfPresent(ViewerDTO.self, forKey: DynamicKey("viewer"))?.login + rateLimit = try container.decodeIfPresent(RateLimitDTO.self, forKey: DynamicKey("rateLimit")) + var repositories: [String: RepositoryListDTO?] = [:] + for key in container.allKeys where key.stringValue.wholeMatch(of: /r\d+/) != nil { + repositories[key.stringValue] = try container.decodeIfPresent(RepositoryListDTO.self, forKey: key) + } + self.repositories = repositories + } + } + + struct RepositoryListDTO: Decodable, Sendable { + let pullRequests: Connection + } + + struct ListItemDTO: Decodable, Sendable { + let id: String + let updatedAt: Date + let headRefOid: String + let commits: Nodes> + + var rollupState: String? { commits.nodes.last?.commit.statusCheckRollup?.state } + /// Changes whenever the PR is pushed, commented on, reviewed, or its checks move. + var fingerprint: String { "\(updatedAt.timeIntervalSince1970)|\(headRefOid)|\(rollupState ?? "-")" } + /// A pending rollup means some check is still running, and per-check progress can change + /// without the fingerprint changing. + var hasPendingChecks: Bool { rollupState == "PENDING" || rollupState == "EXPECTED" } + } + + struct RollupStateCommit: Decodable, Sendable { + struct Rollup: Decodable, Sendable { let state: String } + let statusCheckRollup: Rollup? + } + + // MARK: - Detail + + static let detailBatchSize = 20 + + static let detailDocument = """ + query PRMonitorDetails($ids: [ID!]!) { + nodes(ids: $ids) { + ... on PullRequest { + id number title url isDraft createdAt updatedAt reviewDecision mergeable headRefOid + repository { name owner { login } } + author { __typename login } + commits(last: 1) { + nodes { + commit { + committedDate + checkSuites(last: 20) { nodes { conclusion app { name slug } } } + statusCheckRollup { + state + contexts(first: 100) { + nodes { + __typename + ... on CheckRun { + name status conclusion startedAt completedAt detailsUrl + checkSuite { app { name slug } } + } + ... on StatusContext { context state createdAt targetUrl creator { login } } + } + } + } + } + } + } + reviewRequests(first: 20) { + nodes { requestedReviewer { __typename ... on User { login } ... on Bot { login } ... on Mannequin { login } } } + } + latestReviews(first: 30) { nodes { author { __typename login } state submittedAt commit { oid } } } + reviewThreads(first: 100) { + nodes { isResolved isOutdated comments(first: 1) { nodes { author { __typename login } createdAt } } } + } + comments(last: 30) { nodes { author { __typename login } createdAt } } + } + } + } + """ + + struct DetailPayload: Decodable, Sendable { + /// `nil` entries are PRs that were closed or became inaccessible between the two phases. + let nodes: [PullRequestDTO?] + } + + struct PullRequestDTO: Decodable, Sendable { + struct Repository: Decodable, Sendable { + let name: String + let owner: ActorDTO + } + + struct DetailCommit: Decodable, Sendable { + struct Rollup: Decodable, Sendable { + let state: String? + let contexts: Nodes + } + struct Suite: Decodable, Sendable { + struct App: Decodable, Sendable { let name: String?; let slug: String? } + let conclusion: String? + let app: App? + } + let committedDate: Date? + let checkSuites: Nodes? + let statusCheckRollup: Rollup? + } + + struct ReviewRequest: Decodable, Sendable { let requestedReviewer: ActorDTO? } + struct Review: Decodable, Sendable { + struct Commit: Decodable, Sendable { let oid: String } + let author: ActorDTO? + let state: String + let submittedAt: Date? + let commit: Commit? + } + struct Thread: Decodable, Sendable { + let isResolved: Bool + let isOutdated: Bool + let comments: Nodes + } + struct Comment: Decodable, Sendable { + let author: ActorDTO? + let createdAt: Date + } + + let id: String + let number: Int + let title: String + let url: URL + let isDraft: Bool + let createdAt: Date + let updatedAt: Date + let reviewDecision: String? + let mergeable: String + let headRefOid: String + let repository: Repository + let author: ActorDTO? + let commits: Nodes> + let reviewRequests: Nodes + let latestReviews: Nodes + let reviewThreads: Nodes + let comments: Nodes + } + + enum ContextDTO: Decodable, Sendable { + case checkRun(name: String, status: String, conclusion: String?, startedAt: Date?, completedAt: Date?, + detailsUrl: URL?, appName: String?, appSlug: String?) + case status(context: String, state: String, createdAt: Date?, targetUrl: URL?, creator: String?) + case unknown + + private enum CodingKeys: String, CodingKey { + case __typename, name, status, conclusion, startedAt, completedAt, detailsUrl, checkSuite + case context, state, createdAt, targetUrl, creator + } + + private struct CheckSuite: Decodable { + struct App: Decodable { let name: String?; let slug: String? } + let app: App? + } + + init(from decoder: Decoder) throws { + let c = try decoder.container(keyedBy: CodingKeys.self) + switch try c.decode(String.self, forKey: .__typename) { + case "CheckRun": + let app = try c.decodeIfPresent(CheckSuite.self, forKey: .checkSuite)?.app + self = .checkRun( + name: try c.decode(String.self, forKey: .name), + status: try c.decode(String.self, forKey: .status), + conclusion: try c.decodeIfPresent(String.self, forKey: .conclusion), + startedAt: try c.decodeIfPresent(Date.self, forKey: .startedAt), + completedAt: try c.decodeIfPresent(Date.self, forKey: .completedAt), + detailsUrl: try? c.decodeIfPresent(URL.self, forKey: .detailsUrl), + appName: app?.name, + appSlug: app?.slug + ) + case "StatusContext": + self = .status( + context: try c.decode(String.self, forKey: .context), + state: try c.decode(String.self, forKey: .state), + createdAt: try c.decodeIfPresent(Date.self, forKey: .createdAt), + targetUrl: try? c.decodeIfPresent(URL.self, forKey: .targetUrl), + creator: try c.decodeIfPresent(ActorDTO.self, forKey: .creator)?.login + ) + default: + self = .unknown + } + } + } + + // MARK: - Shared shapes + + struct ViewerDTO: Decodable, Sendable { let login: String } + + struct RateLimitDTO: Decodable, Sendable { + let remaining: Int + let resetAt: Date + } + + struct ActorDTO: Decodable, Sendable { + let __typename: String? + let login: String? + var isBot: Bool { __typename == "Bot" } + } + + struct Connection: Decodable, Sendable { + let totalCount: Int + let nodes: [Node] + } + + struct Nodes: Decodable, Sendable { + let nodes: [Node] + + init(from decoder: Decoder) throws { + // GitHub returns `null` for entries it can't resolve; drop them rather than fail the page. + let container = try decoder.container(keyedBy: DynamicKey.self) + nodes = try container.decodeIfPresent([Lossy].self, forKey: DynamicKey("nodes"))?.compactMap(\.value) ?? [] + } + } + + struct Lossy: Decodable { + let value: Value? + init(from decoder: Decoder) throws { value = try? Value(from: decoder) } + } + + struct CommitWrapper: Decodable, Sendable { let commit: Commit } + + struct DynamicKey: CodingKey { + let stringValue: String + var intValue: Int? { nil } + init(_ string: String) { stringValue = string } + init?(stringValue: String) { self.stringValue = stringValue } + init?(intValue: Int) { nil } + } +} + +// MARK: - Mapping into the domain + +extension PullRequestQueries.PullRequestDTO { + func toPullRequest() -> PullRequest { + let commit = commits.nodes.last?.commit + var checks: [CheckSignal] = (commit?.statusCheckRollup?.contexts.nodes ?? []).compactMap { $0.toSignal() } + // Workflows awaiting approval (e.g. from a first-time contributor's fork) have a check suite + // but no check runs, so they're invisible in the roll-up contexts. Surface them explicitly. + for suite in commit?.checkSuites?.nodes ?? [] where suite.conclusion == "ACTION_REQUIRED" { + let signal = CheckSignal( + name: suite.app?.name ?? "Workflow", source: .checkRun(appName: suite.app?.name, appSlug: suite.app?.slug), + outcome: .failed, rawState: "ACTION_REQUIRED", startedAt: nil, completedAt: nil, url: url.appending(path: "checks") + ) + if !checks.contains(where: { $0.groupKey == signal.groupKey }) { checks.append(signal) } + } + + return PullRequest( + id: id, + repository: RepositoryID(owner: repository.owner.login ?? "", name: repository.name), + number: number, + title: title, + url: url, + author: author?.login, + isDraft: isDraft, + createdAt: createdAt, + updatedAt: updatedAt, + headSHA: headRefOid, + headCommittedAt: commit?.committedDate, + rollupState: commit?.statusCheckRollup?.state, + reviewDecision: reviewDecision.flatMap(ReviewDecision.init(rawValue:)), + mergeable: Mergeable(rawValue: mergeable) ?? .unknown, + checks: checks, + requestedReviewers: reviewRequests.nodes.compactMap { request in + guard let reviewer = request.requestedReviewer, let login = reviewer.login else { return nil } + return ReviewRequestSignal(login: login, isBot: reviewer.isBot) + }, + reviews: latestReviews.nodes.compactMap { review in + guard let login = review.author?.login, let state = ReviewSignal.State(rawValue: review.state) else { return nil } + return ReviewSignal(author: login, isBot: review.author?.isBot ?? false, state: state, + submittedAt: review.submittedAt, commitSHA: review.commit?.oid) + }, + threads: reviewThreads.nodes.compactMap { thread in + guard let first = thread.comments.nodes.first, let login = first.author?.login else { return nil } + return ThreadSignal(author: login, isBot: first.author?.isBot ?? false, isResolved: thread.isResolved, + isOutdated: thread.isOutdated, createdAt: first.createdAt) + }, + comments: comments.nodes.compactMap { comment in + guard let login = comment.author?.login else { return nil } + return CommentSignal(author: login, isBot: comment.author?.isBot ?? false, createdAt: comment.createdAt) + } + ) + } +} + +extension PullRequestQueries.ContextDTO { + func toSignal() -> CheckSignal? { + switch self { + case let .checkRun(name, status, conclusion, startedAt, completedAt, detailsUrl, appName, appSlug): + let outcome: CheckSignal.Outcome = if status != "COMPLETED" { + .pending + } else { + switch conclusion { + case "SUCCESS": .succeeded + case "NEUTRAL", "SKIPPED", "CANCELLED", "STALE": .neutral + case nil: .pending + default: .failed // FAILURE, TIMED_OUT, ACTION_REQUIRED, STARTUP_FAILURE + } + } + return CheckSignal(name: name, source: .checkRun(appName: appName, appSlug: appSlug), outcome: outcome, + rawState: conclusion ?? status, startedAt: startedAt, completedAt: completedAt, url: detailsUrl) + case let .status(context, state, createdAt, targetUrl, creator): + let outcome: CheckSignal.Outcome = switch state { + case "SUCCESS": .succeeded + case "PENDING", "EXPECTED": .pending + default: .failed // FAILURE, ERROR + } + // Statuses have no start/finish; `createdAt` is when this state was reported. + return CheckSignal(name: context, source: .commitStatus(creator: creator), outcome: outcome, rawState: state, + startedAt: createdAt, completedAt: outcome == .pending ? nil : createdAt, url: targetUrl) + case .unknown: + return nil + } + } +} diff --git a/Sources/PRMonitor/GitHub/ViewerQueries.swift b/Sources/PRMonitor/GitHub/ViewerQueries.swift new file mode 100644 index 0000000..e524962 --- /dev/null +++ b/Sources/PRMonitor/GitHub/ViewerQueries.swift @@ -0,0 +1,69 @@ +import Foundation + +/// A repository the signed-in user can access, for the repository picker. +struct RemoteRepository: Identifiable, Hashable, Sendable { + let id: RepositoryID + let isPrivate: Bool + let description: String? + let pushedAt: Date? +} + +extension GitHubClient { + func viewerLogin() async throws(GitHubError) -> String { + struct Payload: Decodable, Sendable { + struct Viewer: Decodable, Sendable { let login: String } + let viewer: Viewer + } + let response = try await query("query { viewer { login } }", as: Payload.self) + guard let login = response.data?.viewer.login else { throw .graphQL(["Couldn't read your GitHub account."]) } + return login + } + + /// Repositories the viewer owns, collaborates on, or can see through an organization, + /// most recently pushed first. Capped so a huge org can't stall the picker. + func viewerRepositories(limit: Int = 500) async throws(GitHubError) -> [RemoteRepository] { + struct Payload: Decodable, Sendable { + struct Viewer: Decodable, Sendable { let repositories: Page } + struct Page: Decodable, Sendable { + struct PageInfo: Decodable, Sendable { let hasNextPage: Bool; let endCursor: String? } + let pageInfo: PageInfo + let nodes: [Node] + } + struct Node: Decodable, Sendable { + let nameWithOwner: String + let isPrivate: Bool + let description: String? + let pushedAt: Date? + } + let viewer: Viewer + } + + let document = """ + query PRMonitorRepositories($cursor: String) { + viewer { + repositories(first: 100, after: $cursor, isArchived: false, + affiliations: [OWNER, COLLABORATOR, ORGANIZATION_MEMBER], + ownerAffiliations: [OWNER, COLLABORATOR, ORGANIZATION_MEMBER], + orderBy: {field: PUSHED_AT, direction: DESC}) { + pageInfo { hasNextPage endCursor } + nodes { nameWithOwner isPrivate description pushedAt } + } + } + } + """ + + var cursor: String? + var results: [RemoteRepository] = [] + repeat { + let response = try await query(document, variables: ["cursor": cursor.map(GraphQLVariable.string) ?? .null], as: Payload.self) + guard let page = response.data?.viewer.repositories else { break } + results += page.nodes.compactMap { node in + RepositoryID(parsing: node.nameWithOwner).map { + RemoteRepository(id: $0, isPrivate: node.isPrivate, description: node.description, pushedAt: node.pushedAt) + } + } + cursor = page.pageInfo.hasNextPage ? page.pageInfo.endCursor : nil + } while cursor != nil && results.count < limit + return results + } +} From 891936f12d8e2155596f623ea82e4ea3115b1f97 Mon Sep 17 00:00:00 2001 From: Hasaam Date: Mon, 28 Sep 2026 21:21:08 -0400 Subject: [PATCH 4/6] feat(app): rebuild the menu bar app and settings for Liquid Glass Replace the popover with a MenuBarExtra panel: light two-line rows, palette status glyphs, skeleton loading and a filter menu. Move Settings to a sidebar, run the polling loop on structured concurrency, and add a layered Icon Composer app icon. Debug builds gain diagnose, snapshot and showcase tools for verification and screenshots. --- .../AppIcon.icon/Assets/AttentionDot.svg | 1 + PRMonitorApp/AppIcon.icon/Assets/Branches.svg | 5 + PRMonitorApp/AppIcon.icon/Assets/Nodes.svg | 1 + PRMonitorApp/AppIcon.icon/icon.json | 80 +++ .../AppIcon.appiconset/Contents.json | 68 -- .../AppIcon.appiconset/icon_1024.png | Bin 37937 -> 0 bytes .../AppIcon.appiconset/icon_128.png | Bin 6469 -> 0 bytes .../AppIcon.appiconset/icon_16.png | Bin 888 -> 0 bytes .../AppIcon.appiconset/icon_256.png | Bin 13472 -> 0 bytes .../AppIcon.appiconset/icon_32.png | Bin 1970 -> 0 bytes .../AppIcon.appiconset/icon_512.png | Bin 29773 -> 0 bytes .../AppIcon.appiconset/icon_64.png | Bin 3518 -> 0 bytes Sources/PRMonitor/App/Diagnostics.swift | 67 ++ Sources/PRMonitor/App/PRMonitorApp.swift | 72 ++ Sources/PRMonitor/App/PreviewData.swift | 247 +++++++ Sources/PRMonitor/App/Showcase.swift | 199 ++++++ Sources/PRMonitor/AppContainer.swift | 16 - Sources/PRMonitor/AppDelegate.swift | 118 ---- Sources/PRMonitor/AppState.swift | 312 --------- Sources/PRMonitor/AuthStore.swift | 59 -- Sources/PRMonitor/Models.swift | 62 -- Sources/PRMonitor/PRMonitorApp.swift | 21 - Sources/PRMonitor/Services/Account.swift | 185 +++++ .../Services/AgentDiscoveryService.swift | 78 --- Sources/PRMonitor/Services/AppSettings.swift | 185 +++++ .../Services/GitHubAuthService.swift | 117 ---- Sources/PRMonitor/Services/GitHubClient.swift | 404 ----------- Sources/PRMonitor/Services/Keychain.swift | 38 ++ Sources/PRMonitor/Services/Monitor.swift | 340 ++++++++++ Sources/PRMonitor/Services/Notifier.swift | 97 +++ .../PRMonitor/Services/PollingService.swift | 218 ------ Sources/PRMonitor/Services/SystemEvents.swift | 53 ++ Sources/PRMonitor/SettingsStore.swift | 146 ---- Sources/PRMonitor/UI/Components/Avatar.swift | 75 ++ .../UI/Components/DesignSystem.swift | 227 +++++++ .../UI/Components/PullRequestMark.swift | 35 + .../PRMonitor/UI/Components/Skeleton.swift | 104 +++ .../PRMonitor/UI/MenuBar/EmptyStates.swift | 117 ++++ .../PRMonitor/UI/MenuBar/MenuBarLabel.swift | 115 ++++ .../PRMonitor/UI/MenuBar/MenuBarPanel.swift | 324 +++++++++ .../PRMonitor/UI/MenuBar/PullRequestRow.swift | 197 ++++++ .../PRMonitor/UI/Settings/AccountPane.swift | 184 +++++ .../PRMonitor/UI/Settings/AgentsPane.swift | 221 ++++++ .../UI/Settings/RepositoriesPane.swift | 246 +++++++ .../PRMonitor/UI/Settings/SettingsView.swift | 340 ++++++++++ Sources/PRMonitor/Utils/AsyncSemaphore.swift | 60 -- Sources/PRMonitor/Utils/Keychain.swift | 44 -- .../Utils/NotificationAvailability.swift | 18 - Sources/PRMonitor/Views/ContentView.swift | 582 ---------------- Sources/PRMonitor/Views/SettingsView.swift | 639 ------------------ Sources/PRMonitor/Views/StatusBarLabel.swift | 53 -- 51 files changed, 3755 insertions(+), 3015 deletions(-) create mode 100644 PRMonitorApp/AppIcon.icon/Assets/AttentionDot.svg create mode 100644 PRMonitorApp/AppIcon.icon/Assets/Branches.svg create mode 100644 PRMonitorApp/AppIcon.icon/Assets/Nodes.svg create mode 100644 PRMonitorApp/AppIcon.icon/icon.json delete mode 100644 PRMonitorApp/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_1024.png delete mode 100644 PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_128.png delete mode 100644 PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_16.png delete mode 100644 PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_256.png delete mode 100644 PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_32.png delete mode 100644 PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_512.png delete mode 100644 PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_64.png create mode 100644 Sources/PRMonitor/App/Diagnostics.swift create mode 100644 Sources/PRMonitor/App/PRMonitorApp.swift create mode 100644 Sources/PRMonitor/App/PreviewData.swift create mode 100644 Sources/PRMonitor/App/Showcase.swift delete mode 100644 Sources/PRMonitor/AppContainer.swift delete mode 100644 Sources/PRMonitor/AppDelegate.swift delete mode 100644 Sources/PRMonitor/AppState.swift delete mode 100644 Sources/PRMonitor/AuthStore.swift delete mode 100644 Sources/PRMonitor/Models.swift delete mode 100644 Sources/PRMonitor/PRMonitorApp.swift create mode 100644 Sources/PRMonitor/Services/Account.swift delete mode 100644 Sources/PRMonitor/Services/AgentDiscoveryService.swift create mode 100644 Sources/PRMonitor/Services/AppSettings.swift delete mode 100644 Sources/PRMonitor/Services/GitHubAuthService.swift delete mode 100644 Sources/PRMonitor/Services/GitHubClient.swift create mode 100644 Sources/PRMonitor/Services/Keychain.swift create mode 100644 Sources/PRMonitor/Services/Monitor.swift create mode 100644 Sources/PRMonitor/Services/Notifier.swift delete mode 100644 Sources/PRMonitor/Services/PollingService.swift create mode 100644 Sources/PRMonitor/Services/SystemEvents.swift delete mode 100644 Sources/PRMonitor/SettingsStore.swift create mode 100644 Sources/PRMonitor/UI/Components/Avatar.swift create mode 100644 Sources/PRMonitor/UI/Components/DesignSystem.swift create mode 100644 Sources/PRMonitor/UI/Components/PullRequestMark.swift create mode 100644 Sources/PRMonitor/UI/Components/Skeleton.swift create mode 100644 Sources/PRMonitor/UI/MenuBar/EmptyStates.swift create mode 100644 Sources/PRMonitor/UI/MenuBar/MenuBarLabel.swift create mode 100644 Sources/PRMonitor/UI/MenuBar/MenuBarPanel.swift create mode 100644 Sources/PRMonitor/UI/MenuBar/PullRequestRow.swift create mode 100644 Sources/PRMonitor/UI/Settings/AccountPane.swift create mode 100644 Sources/PRMonitor/UI/Settings/AgentsPane.swift create mode 100644 Sources/PRMonitor/UI/Settings/RepositoriesPane.swift create mode 100644 Sources/PRMonitor/UI/Settings/SettingsView.swift delete mode 100644 Sources/PRMonitor/Utils/AsyncSemaphore.swift delete mode 100644 Sources/PRMonitor/Utils/Keychain.swift delete mode 100644 Sources/PRMonitor/Utils/NotificationAvailability.swift delete mode 100644 Sources/PRMonitor/Views/ContentView.swift delete mode 100644 Sources/PRMonitor/Views/SettingsView.swift delete mode 100644 Sources/PRMonitor/Views/StatusBarLabel.swift diff --git a/PRMonitorApp/AppIcon.icon/Assets/AttentionDot.svg b/PRMonitorApp/AppIcon.icon/Assets/AttentionDot.svg new file mode 100644 index 0000000..de7359b --- /dev/null +++ b/PRMonitorApp/AppIcon.icon/Assets/AttentionDot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/PRMonitorApp/AppIcon.icon/Assets/Branches.svg b/PRMonitorApp/AppIcon.icon/Assets/Branches.svg new file mode 100644 index 0000000..7040c02 --- /dev/null +++ b/PRMonitorApp/AppIcon.icon/Assets/Branches.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/PRMonitorApp/AppIcon.icon/Assets/Nodes.svg b/PRMonitorApp/AppIcon.icon/Assets/Nodes.svg new file mode 100644 index 0000000..748a0ef --- /dev/null +++ b/PRMonitorApp/AppIcon.icon/Assets/Nodes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/PRMonitorApp/AppIcon.icon/icon.json b/PRMonitorApp/AppIcon.icon/icon.json new file mode 100644 index 0000000..19fbc6a --- /dev/null +++ b/PRMonitorApp/AppIcon.icon/icon.json @@ -0,0 +1,80 @@ +{ + "fill-specializations" : [ + { + "value" : { + "automatic-gradient" : "extended-srgb:0.10000,0.62000,0.36000,1.00000" + } + }, + { + "appearance" : "dark", + "value" : { + "automatic-gradient" : "extended-srgb:0.03000,0.20000,0.12000,1.00000" + } + } + ], + "groups" : [ + { + "name" : "Attention dot", + "layers" : [ + { + "glass" : true, + "image-name" : "AttentionDot.svg", + "name" : "Attention dot" + } + ], + "lighting" : "individual", + "shadow" : { + "kind" : "layer-color", + "opacity" : 0.5 + }, + "specular" : true, + "translucency" : { + "enabled" : true, + "value" : 0.1 + } + }, + { + "name" : "Nodes", + "layers" : [ + { + "glass" : true, + "image-name" : "Nodes.svg", + "name" : "Nodes" + } + ], + "lighting" : "individual", + "shadow" : { + "kind" : "neutral", + "opacity" : 0.45 + }, + "specular" : true, + "translucency" : { + "enabled" : true, + "value" : 0.15 + } + }, + { + "name" : "Branches", + "layers" : [ + { + "glass" : true, + "image-name" : "Branches.svg", + "name" : "Branches" + } + ], + "lighting" : "combined", + "shadow" : { + "kind" : "neutral", + "opacity" : 0.3 + }, + "specular" : true, + "translucency" : { + "enabled" : true, + "value" : 0.35 + } + } + ], + "supported-platforms" : { + "squares" : "shared" + } +} diff --git a/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 3ba5775..0000000 --- a/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "images": [ - { - "idiom": "mac", - "size": "16x16", - "scale": "1x", - "filename": "icon_16.png" - }, - { - "idiom": "mac", - "size": "16x16", - "scale": "2x", - "filename": "icon_32.png" - }, - { - "idiom": "mac", - "size": "32x32", - "scale": "1x", - "filename": "icon_32.png" - }, - { - "idiom": "mac", - "size": "32x32", - "scale": "2x", - "filename": "icon_64.png" - }, - { - "idiom": "mac", - "size": "128x128", - "scale": "1x", - "filename": "icon_128.png" - }, - { - "idiom": "mac", - "size": "128x128", - "scale": "2x", - "filename": "icon_256.png" - }, - { - "idiom": "mac", - "size": "256x256", - "scale": "1x", - "filename": "icon_256.png" - }, - { - "idiom": "mac", - "size": "256x256", - "scale": "2x", - "filename": "icon_512.png" - }, - { - "idiom": "mac", - "size": "512x512", - "scale": "1x", - "filename": "icon_512.png" - }, - { - "idiom": "mac", - "size": "512x512", - "scale": "2x", - "filename": "icon_1024.png" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -} \ No newline at end of file diff --git a/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_1024.png b/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_1024.png deleted file mode 100644 index d746c6dd38b37fdd3278483b3ea735fd0bd17b36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37937 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 L=S2U(@7MnYc1CBC diff --git a/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_128.png b/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_128.png deleted file mode 100644 index 40a1491774133976c46dca9006b57bd075158371..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6469 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 diff --git a/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_16.png b/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_16.png deleted file mode 100644 index 432381a3482270b3c5b3db42b035eb4df4f1dfcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 888 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 diff --git a/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_32.png b/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_32.png deleted file mode 100644 index 68d61b4b850deed9936b00ffa7ee7866bffb84b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1970 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 WE90kq@&PEb53Xx)z3AFMkNykF4K8B< diff --git a/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_64.png b/PRMonitorApp/Assets.xcassets/AppIcon.appiconset/icon_64.png deleted file mode 100644 index 066684dc8bc8931c5f59ea87db11382e3194b791..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3518 zcmb8ycQD-D{s-{YJ0Z~t;Rz90b_t6pyR0A~Aw&exMUS#NvDzb#5~3!e6GTKwgeA)A zC1fqDMX%8p(cA9*`rVn|%$@t!{l4aVJ~Qt#?>RH)zZ0$hK#PTuj}Zg{vFKJ_eJ+Ng$!~*3r|XTcf1r;A9zNt8WK^n6q_|2qXXT%}f`4qtUc3bn!z19zRCE zxpa-2{*rELx%$0RFJ2G z%3k_bQ-VZ}AX0g|-zZf5xl}3RP)GC-+?;5$!m9+(g24Y69A0V`LZ7`Fka`2BRB<~S z``hcWfB$P?g6@TGDI6e5Cp}q4+&(7Yvw4Ghr*==8e!_*)@S1tte`J1A|j;E&hC# z0b2dyQo`^m6%1o!_6a;}6(ie`KCgVhWqZ{x8^p-SINKh5IYr>QRu4rr9IVeIeB!;g zx zB@FVN_ksvb;RO*6F>4Or%l+dWQU@&zl?U_Vu`bf_P3N7#woOpW#nQ0~8*B`xB5JlT zOqLEg`1Jx&UWB<20coLTYb>~~CVd>x(=W2gKLM+8-&jCojJ5l&%aQ_Jd&kngfNl5a ze)nvMSLO6^IjN0>RG#P7W5?qF%!%I$o$eFT0>?dHeqa~v%){^>7@)=>Yfl&gQohc1;<(4=#YzA0FAk|*5SWPuOV`BAL6M5z3~*(>`1(RkYB;1=?gHX z^;7%f=u(ar_6>SpYO0>Ul9l~~mQuX#Dbkd!UeHf{24FEua93&CSFlridv1P!YPOd` z@j`4nnSH)osBCZwAp8+iIOzNWi*KaJQ@mhR^3BNfW(zrz%s{@}JR1CSv<=-K;#(T? z=_9@t>xo_n`B-n{S3(@b?=#VBUl2X^6Wm_7+yUoV^O_Oes_dSYbKYdR86iUd&e z?9nzN*!J)mY@)smObH!oTx1jF;9uMJZEsoNy!I*3Sw#(OSg>}0b^txDIP;-m4rRtC z`NwXb!i%q>*LI4pZW(?V-SHmO5pU0Vt;Ub$^39$M@LJYUz${Isq0E|-oO-_5wNjq~ z?tHv6B)G;ZoQUM$t^Ta;K9aHje2k|G`rMYe;p;(ab;W1Fn(ukif-YR;PivpgZNDY5 zw_RiPjB6Ul72nAr2Ad*vZ8!*eH!Tt+y*eVcW@0fT*lJSQe)bX9_GPslLU+0@Y|5Lh zUgJGnKTMk0R=cY zktBMqm5aQ=evjI!D_*d?DD36lK8N0&4}ycNh{IJPVXF9=$J5!b&Gu9od4D@zGo@EB z%#^@gnLHG{yLtu}sz?~^ia=EWw&?emG1db``Fffev#0r6u}#vH(WxeNzY<;foIW75 zJOR)?o%hMN#ThJ?9$N?=`|oLJx&R~>eU<=W=d}O@M>o@q5!$L!hbR5zQK@p0F2*CF zO82u0acc$5)k%9wpF8z!KSJSiF|C|`OIqzP#af!2QF?<{O!3vAwXA(yp!m>}VF03_ zY+%GOg4N+wRU1S5B@O0W4H#dSd-+%)QGY7$yGC=Ha$j4UF)XsNEsl4$n~?Ua*Fid` z(fmVIC19I2BSY-HBkTtD`yO*lgKU7q9~|=}+5-*<)!vDl=k1U^xxJBib#=9(!pg6O z7(PWjAl0Aw9dB_MEDR~g;g|-S;gk$}MG?6OJG)>&LwCtLLuj$hi}@a{C4&GXWG`Ok zTU?7Ex^VN}M5=t^kZ6h4qlC%XT(N(I!zY*6%7ZUANB zm}&RMnKhdDCh*{8m_f}dAbR5|*5N#RALhBz`^2K@&)4o><5krTE_C8>O&dVIwxb^4 zXW7KA%~-6pbX4?MQ`Jj{Q(T$*`lqtensN?<%osz@z;S~D>8-QT=4loE-jT1>u45R- znf#Zr@T|`djKwv2=hE81uk!R<2;;XMk8DD=5vK#z3}LLab^6 ztRoT^A|~dXu`mA|^h}6r{76dyOPE=aCU$4C$@0MhB+sL+IpI$q^C<)OR_eHPr>}1d zP^Ic$H)7x%&|DMoNrWl-nP8qzz4xK&Kg%9gDGf4?wIjVb*7(h)p-_N*v6ZQWUOOw< z)nrV#a#ccEgyS6_VC^_PFsM*m>FRt}@?`#nFb0nw-hjV2j$IZj60z~k`+zf z;MOB#&Y$%rj_GHE3$)Bq%Z+MV=K))>W6R@!1M%ipoI=LICUX`BQIq}eNbh0cCUMa4 z-GJp?+%n>=x6a$zUb)!k1Gn@aSpZmVI7>}<1DjsHojK#(*i^x_x7dZJGTUXF%!Wi0&6#-Kj;K&vRtrRvRn>zGYj%>YwNGkjRN5SPfnXN~0{ zeGRV%$$AylNl3l{_>KRh? z_$;|!?bv)V=@{_T&bf0at^_l87k`v=6*fDvbZ2$z12$R8%W6HWjIJi;XyVL`B;P+F zXT0>z>=yrX`99Zo4A<)};B8l+dpxxhCPmgqLc&Ncm?u2$}IA*$bW{Vf!v>HO#x#2B!qT_VTU0b^nTQr`K z>$63ca#f=48~*(R`qYNfT?il*Pm<8F*6>&+5klMdPzv+BywRWy4o*8)go!pEk} zhZL!Q?nuxU-9SGcL)}x+`sTL#_^ou-70C3qdd^)KtFRd+d@A?cWtpQ3 ztv=P!z@0#%`bL|g=eh!_oQm@CyIt*;N^Fhq-t3`%mW%EvkV`s=NOTw`wWwAfRa-5 zK2V}k^hwM=*qk$yn8vA8C~$#}@iW!MN(`ny*rMdl3elJ*6v(~JN8Bg4BI+jg)ti!s zLwC_@50=dh8YOE{n>*zf_xmjVtyh (AppSettings, Account, Monitor, AppRouter) { + let settings = AppSettings(defaults: UserDefaults(suiteName: "PRMonitor.preview")!) + settings.repositories = [ + TrackedRepository(id: RepositoryID(owner: "acme", name: "rocket")), + TrackedRepository(id: RepositoryID(owner: "acme", name: "mission-control")), + ] + settings.scope = .all + settings.hidesDrafts = false + let account = Account(previewLogin: "hasaam") + let monitor = Monitor(settings: settings, account: account, notifier: Notifier()) + monitor.loadPreview(pullRequests) + return (settings, account, monitor, AppRouter()) + } + + // MARK: - Builders + + private static func pr( + _ id: Int, _ repo: String, _ number: Int, _ title: String, author: String, minutesAgo: Double, + isDraft: Bool = false, mergeable: Mergeable = .mergeable, checks: [CheckSignal] = [], + requested: [ReviewRequestSignal] = [], reviews: [ReviewSignal] = [], threads: [ThreadSignal] = [], + decision: ReviewDecision? = nil + ) -> PullRequest { + let repository = RepositoryID(parsing: repo)! + return PullRequest( + id: "PREVIEW_\(id)", repository: repository, number: number, title: title, + url: URL(string: "https://github.com/\(repo)/pull/\(number)")!, author: author, isDraft: isDraft, + createdAt: now.addingTimeInterval(-86_400), updatedAt: now.addingTimeInterval(-minutesAgo * 60), + headSHA: "head\(id)", headCommittedAt: now.addingTimeInterval(-max(minutesAgo, 20) * 60), rollupState: nil, + reviewDecision: decision, mergeable: mergeable, checks: checks, requestedReviewers: requested, + reviews: reviews, threads: threads, comments: [] + ) + } + + private static func check(_ name: String, _ app: String, _ slug: String, _ outcome: CheckSignal.Outcome, raw: String? = nil) -> CheckSignal { + CheckSignal(name: name, source: .checkRun(appName: app, appSlug: slug), outcome: outcome, + rawState: raw ?? (outcome == .pending ? "IN_PROGRESS" : "SUCCESS"), + startedAt: now.addingTimeInterval(-600), completedAt: outcome == .pending ? nil : now.addingTimeInterval(-240), url: nil) + } + + private static func status(_ context: String, _ creator: String, _ outcome: CheckSignal.Outcome) -> CheckSignal { + CheckSignal(name: context, source: .commitStatus(creator: creator), outcome: outcome, rawState: "SUCCESS", + startedAt: now.addingTimeInterval(-500), completedAt: now.addingTimeInterval(-420), url: nil) + } + + private static func review(_ login: String, _ state: ReviewSignal.State) -> ReviewSignal { + ReviewSignal(author: login, isBot: true, state: state, submittedAt: now.addingTimeInterval(-300), commitSHA: nil) + } + + private static func thread(_ login: String) -> ThreadSignal { + ThreadSignal(author: login, isBot: true, isResolved: false, isOutdated: false, createdAt: now.addingTimeInterval(-280)) + } +} + +/// `PRMonitor --settings-window ` shows the real Settings window (with its toolbar) on +/// preview data and prints its window number, so it can be captured with `screencapture -l`. +enum SettingsWindowPreview { + @MainActor private static var window: NSWindow? + + @MainActor + static func runIfRequested() { + let arguments = CommandLine.arguments + guard let index = arguments.firstIndex(of: "--settings-window") else { return } + let name = arguments.indices.contains(index + 1) ? arguments[index + 1] : "account" + let tab: AppRouter.SettingsTab = switch name { + case "general": .general + case "notifications": .notifications + case "repositories": .repositories + case "agents": .agents + default: .account + } + Task { @MainActor in + let (settings, account, monitor, router) = PreviewData.environment() + router.settingsTab = tab + let host = NSHostingController(rootView: SettingsView() + .environment(monitor).environment(settings).environment(account).environment(router)) + let window = NSWindow(contentViewController: host) + window.styleMask = [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView] + window.title = "Settings" + window.setContentSize(NSSize(width: 760, height: 540)) + window.center() + window.level = .floating // Visible for capture even when another app is frontmost. + window.makeKeyAndOrderFront(nil) + NSApp.activate() + self.window = window + try? await Task.sleep(for: .seconds(1)) + let frame = window.frame, screen = window.screen?.frame.height ?? 0 + print("WINDOW \(Int(frame.minX)),\(Int(screen - frame.maxY)),\(Int(frame.width)),\(Int(frame.height))") + fflush(stdout) + try? await Task.sleep(for: .seconds(4)) + exit(0) + } + } +} + +/// `PRMonitor --snapshot ` renders the panel with preview data to PNGs, in light and dark. +enum Snapshots { + @MainActor + static func runIfRequested() { + let arguments = CommandLine.arguments + guard let index = arguments.firstIndex(of: "--snapshot"), arguments.indices.contains(index + 1) else { return } + let directory = URL(filePath: arguments[index + 1], directoryHint: .isDirectory) + try? FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) + + let (settings, account, monitor, router) = PreviewData.environment() + let expandedID = PreviewData.pullRequests[0].id + for (name, appearance) in [("light", NSAppearance.Name.aqua), ("dark", .darkAqua)] { + render( + MenuBarPanel(initiallyExpanded: [expandedID]) + .environment(monitor).environment(settings).environment(account).environment(router), + appearance: appearance, + to: directory.appending(path: "panel-\(name).png") + ) + } + renderIcons(to: directory.appending(path: "menu-bar-icons.png")) + + let loadingMonitor = Monitor(settings: settings, account: account, notifier: Notifier()) + render( + MenuBarPanel().environment(loadingMonitor).environment(settings).environment(account).environment(router), + appearance: .aqua, to: directory.appending(path: "panel-loading.png") + ) + + let signedOut = Account(previewSignedOut: ()) + let onboardingMonitor = Monitor(settings: settings, account: signedOut, notifier: Notifier()) + render( + MenuBarPanel().environment(onboardingMonitor).environment(settings).environment(signedOut).environment(router), + appearance: .aqua, to: directory.appending(path: "panel-onboarding.png") + ) + + let tabs: [(String, AppRouter.SettingsTab)] = [ + ("account", .account), ("general", .general), ("notifications", .notifications), ("repositories", .repositories), ("agents", .agents), + ] + for (name, tab) in tabs { + router.settingsTab = tab + render( + SettingsView().environment(monitor).environment(settings).environment(account).environment(router), + appearance: .aqua, to: directory.appending(path: "settings-\(name).png") + ) + } + exit(0) + } + + /// Every menu bar state, template and colored, on light and dark bars, scaled up 4×. + @MainActor + private static func renderIcons(to url: URL) { + let states: [(Monitor.Summary, Int)] = [(.signedOut, 0), (.idle, 0), (.running, 0), (.needsReview, 0), (.ready, 0), (.needsReview, 2), (.failing, 12)] + let scale: CGFloat = 4, cell = NSSize(width: 40, height: 22) + let size = NSSize(width: cell.width * CGFloat(states.count) * scale, height: cell.height * 4 * scale) + let image = NSImage(size: size, flipped: true) { _ in + for (row, (dark, colored)) in [(false, false), (true, false), (false, true), (true, true)].enumerated() { + let background = dark ? NSColor(white: 0.12, alpha: 1) : NSColor(white: 0.93, alpha: 1) + background.setFill() + NSRect(x: 0, y: CGFloat(row) * cell.height * scale, width: size.width, height: cell.height * scale).fill() + NSAppearance(named: dark ? .darkAqua : .aqua)!.performAsCurrentDrawingAppearance { + for (column, (state, count)) in states.enumerated() { + let icon = StatusIcon.image(for: state, count: count, isColored: colored) + let rect = NSRect( + x: (CGFloat(column) * cell.width + (cell.width - icon.size.width) / 2) * scale, + y: (CGFloat(row) * cell.height + (cell.height - icon.size.height) / 2) * scale, + width: icon.size.width * scale, height: icon.size.height * scale + ) + let drawn = colored ? icon : tint(icon, dark ? .white : .black) + drawn.draw(in: rect) + } + } + } + return true + } + guard let tiff = image.tiffRepresentation, let rep = NSBitmapImageRep(data: tiff) else { return } + try? rep.representation(using: .png, properties: [:])?.write(to: url) + } + + private static func tint(_ template: NSImage, _ color: NSColor) -> NSImage { + NSImage(size: template.size, flipped: false) { rect in + template.draw(in: rect) + color.set() + rect.fill(using: .sourceAtop) + return true + } + } + + @MainActor + private static func render(_ view: some View, appearance: NSAppearance.Name, to url: URL) { + let host = NSHostingView(rootView: view.background(Color(nsColor: .windowBackgroundColor))) + host.appearance = NSAppearance(named: appearance) + let size = host.fittingSize + host.frame = NSRect(origin: .zero, size: size) + let window = NSWindow(contentRect: host.frame, styleMask: [.borderless], backing: .buffered, defer: false) + window.appearance = NSAppearance(named: appearance) + window.contentView = host + host.layoutSubtreeIfNeeded() + RunLoop.main.run(until: .now.addingTimeInterval(0.3)) + guard let rep = host.bitmapImageRepForCachingDisplay(in: host.bounds) else { return } + host.cacheDisplay(in: host.bounds, to: rep) + try? rep.representation(using: .png, properties: [:])?.write(to: url) + } +} + +#Preview("Panel") { + let (settings, account, monitor, router) = PreviewData.environment() + MenuBarPanel() + .environment(monitor).environment(settings).environment(account).environment(router) +} +#endif diff --git a/Sources/PRMonitor/App/Showcase.swift b/Sources/PRMonitor/App/Showcase.swift new file mode 100644 index 0000000..9850872 --- /dev/null +++ b/Sources/PRMonitor/App/Showcase.swift @@ -0,0 +1,199 @@ +#if DEBUG +import AppKit +import SwiftUI + +/// `PRMonitor --showcase ` puts marketing compositions on screen, built from the real views on +/// real Liquid Glass over a designed backdrop, then prints the rect to capture with `screencapture -R`. +/// Scenes: `hero-dark`, `hero-light`, `settings-dark`, `settings-light`. Debug builds only. +enum Showcase { + @MainActor private static var windows: [NSWindow] = [] + + @MainActor + static func runIfRequested() { + let arguments = CommandLine.arguments + guard let index = arguments.firstIndex(of: "--showcase"), arguments.indices.contains(index + 1) else { return } + let scene = arguments[index + 1] + let isDark = scene.hasSuffix("dark") + + Task { @MainActor in + let (settings, account, monitor, router) = PreviewData.environment() + let appearance = NSAppearance(named: isDark ? .darkAqua : .aqua) + let canvas = NSSize(width: 1280, height: 800) + guard let screen = NSScreen.main else { return } + let origin = NSPoint(x: screen.frame.midX - canvas.width / 2, y: screen.frame.midY - canvas.height / 2) + let frame = NSRect(origin: origin, size: canvas) + + if scene.hasPrefix("hero") { + let hero = HeroComposition(isDark: isDark, expandedID: PreviewData.pullRequests[0].id) + .environment(monitor).environment(settings).environment(account).environment(router) + show(hero, frame: frame, appearance: appearance, level: .floating) + } else { + show(Backdrop(isDark: isDark), frame: frame, appearance: appearance, level: .floating) + router.settingsTab = .agents + let settingsWindow = AlwaysKeyWindow( + contentViewController: NSHostingController(rootView: SettingsView() + .environment(monitor).environment(settings).environment(account).environment(router)) + ) + settingsWindow.styleMask = [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView] + settingsWindow.title = "Agents" + settingsWindow.appearance = appearance + settingsWindow.setContentSize(NSSize(width: 760, height: 520)) + settingsWindow.setFrameOrigin(NSPoint(x: frame.midX - 380, y: frame.midY - 280)) + settingsWindow.level = NSWindow.Level(rawValue: NSWindow.Level.floating.rawValue + 1) + // Active, so traffic lights and controls render in their key-window colors. + NSApp.setActivationPolicy(.regular) + NSApp.activate(ignoringOtherApps: true) + settingsWindow.makeKeyAndOrderFront(nil) + windows.append(settingsWindow) + } + + // macOS may decline the first activation request from a background launch; ask again. + for _ in 0..<4 { + try? await Task.sleep(for: .seconds(0.5)) + if !NSApp.isActive { + NSRunningApplication.current.activate(options: [.activateAllWindows]) + windows.last?.makeKeyAndOrderFront(nil) + } + } + try? await Task.sleep(for: .seconds(0.5)) + let top = screen.frame.height - frame.maxY + print("RECT \(Int(frame.minX)),\(Int(top)),\(Int(frame.width)),\(Int(frame.height))") + fflush(stdout) + try? await Task.sleep(for: .seconds(5)) + exit(0) + } + } + + @MainActor + private static func show(_ view: some View, frame: NSRect, appearance: NSAppearance?, level: NSWindow.Level) { + let window = NSWindow(contentRect: frame, styleMask: [.borderless], backing: .buffered, defer: false) + window.contentView = NSHostingView(rootView: view) + window.appearance = appearance + window.level = level + window.hasShadow = false + window.orderFrontRegardless() + windows.append(window) + } +} + +/// Draws with the active (key) appearance even though a background-launched app can't take focus +/// from whatever the user is doing, so captures don't show gray traffic lights and controls. +private final class AlwaysKeyWindow: NSWindow { + override var isKeyWindow: Bool { true } + override var isMainWindow: Bool { true } +} + +// MARK: - Compositions + +/// A soft, Tahoe-style mesh-gradient wallpaper, so Liquid Glass has color to refract. +private struct Backdrop: View { + let isDark: Bool + + var body: some View { + MeshGradient( + width: 3, height: 3, + points: [ + [0, 0], [0.5, 0], [1, 0], + [0, 0.5], [0.62, 0.45], [1, 0.5], + [0, 1], [0.5, 1], [1, 1], + ], + colors: isDark ? [ + Color(red: 0.05, green: 0.07, blue: 0.16), Color(red: 0.10, green: 0.10, blue: 0.30), Color(red: 0.20, green: 0.10, blue: 0.34), + Color(red: 0.03, green: 0.20, blue: 0.22), Color(red: 0.08, green: 0.30, blue: 0.40), Color(red: 0.30, green: 0.14, blue: 0.40), + Color(red: 0.02, green: 0.12, blue: 0.10), Color(red: 0.04, green: 0.26, blue: 0.20), Color(red: 0.10, green: 0.14, blue: 0.30), + ] : [ + Color(red: 0.80, green: 0.87, blue: 1.00), Color(red: 0.88, green: 0.84, blue: 1.00), Color(red: 0.98, green: 0.86, blue: 0.94), + Color(red: 0.74, green: 0.93, blue: 0.92), Color(red: 0.80, green: 0.90, blue: 1.00), Color(red: 0.95, green: 0.84, blue: 0.96), + Color(red: 0.78, green: 0.95, blue: 0.86), Color(red: 0.72, green: 0.90, blue: 0.95), Color(red: 0.86, green: 0.86, blue: 1.00), + ] + ) + } +} + +/// The hero: the panel on real Liquid Glass hanging from a menu bar, with the icon and a headline. +private struct HeroComposition: View { + let isDark: Bool + let expandedID: String + @Environment(Monitor.self) private var monitor + + /// The default (light) rendition exported from Icon Composer, so marketing shots always show the + /// canonical icon regardless of the Mac's icon style setting. + static let marketingIcon: NSImage = { + let repository = URL(filePath: #filePath).deletingLastPathComponent().deletingLastPathComponent() + .deletingLastPathComponent().deletingLastPathComponent() + return NSImage(contentsOf: repository.appending(path: "docs/screenshots/app-icon.png")) ?? NSApp.applicationIconImage + }() + + var body: some View { + ZStack(alignment: .top) { + Backdrop(isDark: isDark) + + HStack(alignment: .top, spacing: 0) { + VStack(alignment: .leading, spacing: 18) { + Image(nsImage: Self.marketingIcon) + .resizable() + .frame(width: 112, height: 112) + .shadow(color: .black.opacity(0.25), radius: 18, y: 10) + Text("Know the moment\nyour pull request\nis ready.") + .font(.system(size: 50, weight: .bold, design: .default)) + .tracking(-0.8) + .foregroundStyle(.primary) + Text("Every CI check and AI reviewer on your PRs, in one glance from the menu bar.") + .font(.system(size: 19)) + .foregroundStyle(.secondary) + .frame(maxWidth: 420, alignment: .leading) + } + .padding(.leading, 80) + .padding(.top, 170) + Spacer() + MenuBarPanel(initiallyExpanded: [expandedID]) + .glassEffect(.regular, in: .rect(cornerRadius: Metrics.panelCornerRadius)) + .shadow(color: .black.opacity(isDark ? 0.45 : 0.18), radius: 30, y: 18) + .padding(.top, 44) + .padding(.trailing, 150) + } + + MockMenuBar(summary: monitor.summary, count: monitor.attentionCount, isDark: isDark) + } + .frame(width: 1280, height: 800) + .clipped() + } +} + +/// A slim stand-in for the macOS menu bar showing PR Monitor's real status icon, positioned so the +/// panel hangs beneath it. +private struct MockMenuBar: View { + let summary: Monitor.Summary + let count: Int + let isDark: Bool + + var body: some View { + HStack(spacing: 18) { + Image(systemName: "apple.logo").font(.system(size: 15, weight: .medium)) + Text("Finder").fontWeight(.bold) + Text("File") + Text("Edit") + Text("View") + Spacer() + Image(nsImage: StatusIcon.image(for: summary, count: count, isColored: false)) + .renderingMode(.template) + .padding(.horizontal, 7) + .padding(.vertical, 3) + .background(Capsule().fill(.primary.opacity(0.14))) + .padding(.trailing, 268) + .overlay(alignment: .trailing) { + HStack(spacing: 18) { + Image(systemName: "wifi") + Image(systemName: "battery.75percent") + Image(systemName: "switch.2") + Text("Mon Sep 28 9:41 AM") + } + } + } + .font(.system(size: 13, weight: .medium)) + .foregroundStyle(.primary) + .padding(.horizontal, 18) + .frame(height: 30) + } +} +#endif diff --git a/Sources/PRMonitor/AppContainer.swift b/Sources/PRMonitor/AppContainer.swift deleted file mode 100644 index ac03770..0000000 --- a/Sources/PRMonitor/AppContainer.swift +++ /dev/null @@ -1,16 +0,0 @@ -import Foundation - -@MainActor -final class AppContainer: ObservableObject { - let settingsStore: SettingsStore - let authStore: AuthStore - let appState: AppState - - init() { - let settings = SettingsStore() - let auth = AuthStore() - self.settingsStore = settings - self.authStore = auth - self.appState = AppState(settingsStore: settings, authStore: auth) - } -} diff --git a/Sources/PRMonitor/AppDelegate.swift b/Sources/PRMonitor/AppDelegate.swift deleted file mode 100644 index b5e1fc5..0000000 --- a/Sources/PRMonitor/AppDelegate.swift +++ /dev/null @@ -1,118 +0,0 @@ -import AppKit -import Combine -import SwiftUI -import UserNotifications - -@MainActor -final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDelegate { - var container: AppContainer? - - private let popover = NSPopover() - private var statusItem: NSStatusItem? - private var statusHostingView: NSHostingView? - private var cancellables = Set() - - private let preferredWidth: CGFloat = 520 - - func applicationDidFinishLaunching(_ notification: Notification) { - guard let container else { return } - - NSApp.setActivationPolicy(.accessory) - UNUserNotificationCenter.current().delegate = self - setupStatusItem() - setupPopover(container: container) - bindStatusUpdates(container: container) - } - - func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions { - [.banner, .sound, .list] - } - - @objc private func togglePopover(_ sender: Any?) { - guard let button = statusItem?.button else { return } - if popover.isShown { - popover.performClose(sender) - } else { - button.highlight(false) - popover.show(relativeTo: button.bounds, of: button, preferredEdge: .minY) - NSApp.activate(ignoringOtherApps: true) - } - } - - private func setupStatusItem() { - statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) - guard let button = statusItem?.button else { return } - button.target = self - button.action = #selector(togglePopover(_:)) - - let hosting = NSHostingView(rootView: StatusBarLabel(status: .idle)) - hosting.translatesAutoresizingMaskIntoConstraints = false - button.addSubview(hosting) - NSLayoutConstraint.activate([ - hosting.leadingAnchor.constraint(equalTo: button.leadingAnchor), - hosting.trailingAnchor.constraint(equalTo: button.trailingAnchor), - hosting.topAnchor.constraint(equalTo: button.topAnchor), - hosting.bottomAnchor.constraint(equalTo: button.bottomAnchor) - ]) - statusHostingView = hosting - } - - private func setupPopover(container: AppContainer) { - let rootView = ContentView( - maxPopoverHeight: currentMaxPopoverHeight(), - onSizeChange: { [weak self] size in - self?.updatePopoverSize(size: size) - } - ) - .environmentObject(container.appState) - .environmentObject(container.authStore) - - let controller = NSHostingController(rootView: rootView) - popover.contentViewController = controller - popover.behavior = .transient - popover.animates = true - popover.contentSize = NSSize(width: preferredWidth, height: 320) - } - - private func bindStatusUpdates(container: AppContainer) { - container.appState.objectWillChange - .receive(on: RunLoop.main) - .sink { [weak self] in - self?.updateStatusItem(container: container) - } - .store(in: &cancellables) - - container.authStore.objectWillChange - .receive(on: RunLoop.main) - .sink { [weak self] in - self?.updateStatusItem(container: container) - } - .store(in: &cancellables) - } - - private func updateStatusItem(container: AppContainer) { - statusHostingView?.rootView = StatusBarLabel(status: container.appState.overallStatus) - updatePopoverMaxHeight() - } - - private func updatePopoverSize(size: CGSize) { - let clampedHeight = min(currentMaxPopoverHeight(), max(260, size.height)) - if abs(popover.contentSize.height - clampedHeight) > 1 { - popover.contentSize = NSSize(width: preferredWidth, height: clampedHeight) - } - } - - private func updatePopoverMaxHeight() { - let clampedHeight = min(currentMaxPopoverHeight(), popover.contentSize.height) - if abs(popover.contentSize.height - clampedHeight) > 1 { - popover.contentSize = NSSize(width: preferredWidth, height: clampedHeight) - } - } - - private func currentMaxPopoverHeight() -> CGFloat { - let screenHeight = statusItem?.button?.window?.screen?.visibleFrame.height - ?? NSScreen.main?.visibleFrame.height - ?? 900 - return max(320, min(900, screenHeight - 120)) - } -} diff --git a/Sources/PRMonitor/AppState.swift b/Sources/PRMonitor/AppState.swift deleted file mode 100644 index 359af9d..0000000 --- a/Sources/PRMonitor/AppState.swift +++ /dev/null @@ -1,312 +0,0 @@ -import Foundation -import Combine -import UserNotifications - -@MainActor -final class AppState: ObservableObject { - enum OverallStatus { - case needsAuth - case idle - case running - case failed - case waiting - case done - } - - @Published var repoSections: [RepoSection] = [] - @Published var lastRefresh: Date? - @Published var isRefreshing = false - @Published var errorMessage: String? - @Published var viewerLogin: String? - - let settingsStore: SettingsStore - let authStore: AuthStore - - private let pollingService: PollingService - private var timer: Timer? - private var cancellables = Set() - private var lastAllDone = false - private var activeInterval: TimeInterval? - private let idleIntervalSeconds: TimeInterval = 600 - private var lastAgentStatus: [String: AgentRunStatus] = [:] - private var lastReviewSummaryToken: [String: String] = [:] - private var refreshTask: Task? - - init(settingsStore: SettingsStore, authStore: AuthStore) { - self.settingsStore = settingsStore - self.authStore = authStore - let client = GitHubClient(tokenProvider: { authStore.token }) - self.pollingService = PollingService(client: client) - - settingsStore.$pollingIntervalSeconds - .sink { [weak self] _ in self?.restartPolling() } - .store(in: &cancellables) - - settingsStore.$repos - .sink { [weak self] _ in self?.restartPolling() } - .store(in: &cancellables) - - authStore.$token - .sink { [weak self] _ in self?.restartPolling() } - .store(in: &cancellables) - - requestNotificationPermissions() - restartPolling() - } - - var overallStatus: OverallStatus { - guard authStore.isSignedIn else { return .needsAuth } - let agents = repoSections.flatMap { $0.prs.flatMap { $0.agents } } - if agents.isEmpty { return .idle } - if agents.contains(where: { $0.status == .running }) { return .running } - if agents.contains(where: { $0.status == .failed }) { return .failed } - if agents.contains(where: { $0.status == .waitingForComment || $0.status == .notFound }) { return .waiting } - return .done - } - - func refreshNow() { - guard authStore.isSignedIn else { - repoSections = [] - errorMessage = "Not signed in to GitHub" - updateTimerInterval(hasOpenPRs: false) - return - } - let repos = settingsStore.enabledRepos - guard !repos.isEmpty else { - repoSections = [] - errorMessage = "No repositories enabled. Add repos in Settings." - updateTimerInterval(hasOpenPRs: false) - return - } - - refreshTask?.cancel() - refreshTask = Task { @MainActor [weak self] in - guard let self else { return } - isRefreshing = true - errorMessage = nil - defer { isRefreshing = false } - - do { - let sections = try await pollingService.fetchRepoSections(repos: repos, agents: settingsStore.agents) - if Task.isCancelled { return } - let filtered = sections.filter { !$0.prs.isEmpty } - repoSections = filtered - lastRefresh = Date() - await updateViewerLogin() - handleNotificationsIfNeeded() - updateTimerInterval(hasOpenPRs: !repoSections.isEmpty) - } catch { - if Task.isCancelled { return } - if let clientError = error as? GitHubClientError { - if case .rateLimited(let reset) = clientError { - applyRateLimitBackoff(reset: reset) - } - } - errorMessage = error.localizedDescription - } - } - } - - func restartPolling() { - timer?.invalidate() - timer = nil - activeInterval = nil - refreshNow() - updateTimerInterval(hasOpenPRs: !repoSections.isEmpty) - } - - private func handleNotificationsIfNeeded() { - guard notificationsAvailable else { return } - let allDone = overallStatus == .done - if allDone && !lastAllDone { - sendAllDoneNotification() - } - lastAllDone = allDone - handlePerAgentNotifications() - handleReviewSummaryNotifications() - } - - private func sendAllDoneNotification() { - guard notificationsAvailable else { return } - let content = UNMutableNotificationContent() - content.title = "PR Monitor" - content.body = "All agents have completed their checks." - let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil) - UNUserNotificationCenter.current().add(request) - } - - private func handleReviewSummaryNotifications() { - guard notificationsAvailable else { return } - guard settingsStore.notifySummary else { return } - - var nextTokens: [String: String] = [:] - - for section in repoSections { - for pr in section.prs { - let agents = pr.agents - guard !agents.isEmpty else { continue } - let allFinished = agents.allSatisfy { - $0.status == .done || $0.status == .waitingForComment || $0.status == .failed - } - guard allFinished else { continue } - - let token = reviewSummaryToken(for: pr) - let key = "\(section.fullName)#\(pr.number)" - nextTokens[key] = token - - if lastReviewSummaryToken[key] != token { - sendReviewSummaryNotification(pr: pr, agents: agents) - } - } - } - - lastReviewSummaryToken = nextTokens - } - - private func reviewSummaryToken(for pr: PRItem) -> String { - let commentCount = pr.agents.filter { $0.commentCount > 0 }.count - let total = pr.agents.count - let hasFailure = pr.agents.contains { isFailureConclusion($0.checkConclusion) } - return "\(pr.updatedAt.timeIntervalSince1970)-\(commentCount)-\(total)-\(hasFailure)" - } - - private func sendReviewSummaryNotification(pr: PRItem, agents: [AgentRun]) { - let total = agents.count - let commentAgents = agents.filter { $0.commentCount > 0 }.count - let hasFailure = agents.contains { isFailureConclusion($0.checkConclusion) } - - let title: String - let body: String - - if hasFailure { - title = "Build failed" - body = reviewBody(pr: pr, commentAgents: commentAgents, total: total) - } else if commentAgents == 0 { - title = "Review completed" - body = "#\(pr.number) \(pr.title) • No comments" - } else if commentAgents == total { - title = "Needs review" - body = "#\(pr.number) \(pr.title) • Comments from all agents" - } else { - title = "Needs review" - body = "#\(pr.number) \(pr.title) • Comments from \(commentAgents) of \(total) agents" - } - - let content = UNMutableNotificationContent() - content.title = "PR Monitor" - content.subtitle = title - content.body = body - let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil) - UNUserNotificationCenter.current().add(request) - } - - private func isFailureConclusion(_ conclusion: String?) -> Bool { - guard let conclusion, !conclusion.isEmpty else { return false } - switch conclusion.lowercased() { - case "success", "neutral", "skipped": - return false - default: - return true - } - } - - private func reviewBody(pr: PRItem, commentAgents: Int, total: Int) -> String { - if commentAgents == 0 { - return "#\(pr.number) \(pr.title) • No comments" - } - if commentAgents == total { - return "#\(pr.number) \(pr.title) • Comments from all agents" - } - return "#\(pr.number) \(pr.title) • Comments from \(commentAgents) of \(total) agents" - } - - private func handlePerAgentNotifications() { - guard notificationsAvailable else { return } - guard settingsStore.notifyPerAgent else { return } - - var nextStatus: [String: AgentRunStatus] = [:] - for section in repoSections { - for pr in section.prs { - for agent in pr.agents { - let key = "\(section.fullName)#\(pr.number)#\(agent.id)" - nextStatus[key] = agent.status - if agent.status == .done && lastAgentStatus[key] != .done { - sendAgentDoneNotification(pr: pr, agent: agent) - } - } - } - } - lastAgentStatus = nextStatus - } - - private func sendAgentDoneNotification(pr: PRItem, agent: AgentRun) { - guard notificationsAvailable else { return } - let content = UNMutableNotificationContent() - content.title = "PR Monitor" - content.body = "\(agent.displayName) finished on #\(pr.number) \(pr.title)." - let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil) - UNUserNotificationCenter.current().add(request) - } - - private func requestNotificationPermissions() { - guard notificationsAvailable else { return } - UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { _, _ in } - } - - private func updateViewerLogin() async { - do { - viewerLogin = try await pollingService.client.fetchViewerLogin() - } catch { - viewerLogin = nil - } - } - - private var notificationsAvailable: Bool { - NotificationAvailability.isAvailable - } - - private func updateTimerInterval(hasOpenPRs: Bool) { - guard authStore.isSignedIn else { - activeInterval = nil - timer?.invalidate() - timer = nil - return - } - guard !settingsStore.enabledRepos.isEmpty else { - activeInterval = nil - timer?.invalidate() - timer = nil - return - } - let targetInterval: TimeInterval - if hasOpenPRs { - targetInterval = TimeInterval(max(30, settingsStore.pollingIntervalSeconds)) - } else { - targetInterval = idleIntervalSeconds - } - - guard activeInterval != targetInterval else { return } - activeInterval = targetInterval - timer?.invalidate() - timer = Timer.scheduledTimer(withTimeInterval: targetInterval, repeats: true) { [weak self] _ in - Task { @MainActor in - self?.refreshNow() - } - } - } - - private func applyRateLimitBackoff(reset: Date?) { - guard authStore.isSignedIn else { return } - guard !settingsStore.enabledRepos.isEmpty else { return } - guard let reset else { return } - let delay = max(60, reset.timeIntervalSinceNow) - guard delay > 0 else { return } - activeInterval = delay - timer?.invalidate() - timer = Timer.scheduledTimer(withTimeInterval: delay, repeats: true) { [weak self] _ in - Task { @MainActor in - self?.refreshNow() - } - } - } -} diff --git a/Sources/PRMonitor/AuthStore.swift b/Sources/PRMonitor/AuthStore.swift deleted file mode 100644 index dbf9c69..0000000 --- a/Sources/PRMonitor/AuthStore.swift +++ /dev/null @@ -1,59 +0,0 @@ -import Foundation -import AppKit - -struct DeviceFlowState: Hashable { - var userCode: String - var deviceCode: String - var verificationURL: URL - var expiresAt: Date - var intervalSeconds: Int -} - -@MainActor -final class AuthStore: ObservableObject { - @Published var token: String? - @Published var deviceFlow: DeviceFlowState? - @Published var statusMessage: String? - @Published var isSigningIn: Bool = false - - private let service = "PRMonitor" - private let account = "github_token" - private let authService = GitHubAuthService() - - init() { - token = Keychain.load(service: service, account: account) - } - - var isSignedIn: Bool { token != nil } - - func signIn(clientId: String) { - guard !clientId.isEmpty else { - statusMessage = "Add a GitHub OAuth client ID in Settings." - return - } - statusMessage = nil - isSigningIn = true - Task { - defer { isSigningIn = false } - do { - let flow = try await authService.startDeviceFlow(clientId: clientId) - deviceFlow = flow - NSWorkspace.shared.open(flow.verificationURL) - let tokenValue = try await authService.pollForToken(clientId: clientId, deviceCode: flow.deviceCode, intervalSeconds: flow.intervalSeconds, expiresAt: flow.expiresAt) - token = tokenValue - Keychain.save(service: service, account: account, value: tokenValue) - statusMessage = "Connected." - deviceFlow = nil - } catch { - deviceFlow = nil - statusMessage = "Sign-in failed: \(error.localizedDescription)" - } - } - } - - func signOut() { - token = nil - deviceFlow = nil - Keychain.delete(service: service, account: account) - } -} diff --git a/Sources/PRMonitor/Models.swift b/Sources/PRMonitor/Models.swift deleted file mode 100644 index eed1465..0000000 --- a/Sources/PRMonitor/Models.swift +++ /dev/null @@ -1,62 +0,0 @@ -import Foundation - -struct RepoConfig: Identifiable, Codable, Hashable { - var owner: String - var name: String - var isEnabled: Bool - - var id: String { "\(owner)/\(name)" } - var fullName: String { "\(owner)/\(name)" } -} - -struct AgentConfig: Identifiable, Codable, Hashable { - var id: UUID - var displayName: String - var checkNamePattern: String - var commentAuthor: String - - init(id: UUID = UUID(), displayName: String, checkNamePattern: String, commentAuthor: String) { - self.id = id - self.displayName = displayName - self.checkNamePattern = checkNamePattern - self.commentAuthor = commentAuthor - } -} - -enum AgentRunStatus: String { - case running - case waitingForComment - case failed - case done - case notFound -} - -struct AgentRun: Identifiable, Hashable { - var id: String - var displayName: String - var status: AgentRunStatus - var commentCount: Int - var checkConclusion: String? -} - -struct PRItem: Identifiable, Hashable { - var id: Int - var number: Int - var title: String - var author: String - var updatedAt: Date - var url: URL - var repoFullName: String - var agents: [AgentRun] -} - -struct RepoSection: Identifiable, Hashable { - var id: String { fullName } - var fullName: String - var prs: [PRItem] -} - -struct PRComment: Hashable { - var author: String - var createdAt: Date -} diff --git a/Sources/PRMonitor/PRMonitorApp.swift b/Sources/PRMonitor/PRMonitorApp.swift deleted file mode 100644 index 8588588..0000000 --- a/Sources/PRMonitor/PRMonitorApp.swift +++ /dev/null @@ -1,21 +0,0 @@ -import SwiftUI - -@main -struct PRMonitorApp: App { - @StateObject private var container: AppContainer - @NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate - - init() { - let container = AppContainer() - _container = StateObject(wrappedValue: container) - appDelegate.container = container - } - - var body: some Scene { - Settings { - SettingsView() - .environmentObject(container.settingsStore) - .environmentObject(container.authStore) - } - } -} diff --git a/Sources/PRMonitor/Services/Account.swift b/Sources/PRMonitor/Services/Account.swift new file mode 100644 index 0000000..55f5641 --- /dev/null +++ b/Sources/PRMonitor/Services/Account.swift @@ -0,0 +1,185 @@ +import AppKit +import Foundation +import Observation + +/// The signed-in GitHub identity and the ways to obtain one. +@Observable +@MainActor +final class Account { + struct Credential: Codable, Equatable, Sendable { + enum Source: String, Codable, Sendable { + case deviceFlow, githubCLI, personalAccessToken + + var label: String { + switch self { + case .deviceFlow: "Signed in with GitHub" + case .githubCLI: "Using GitHub CLI credentials" + case .personalAccessToken: "Using a personal access token" + } + } + } + + let token: String + let source: Source + var login: String? + } + + enum State: Equatable { + case signedOut + /// Waiting for the user to enter `userCode` on github.com. + case authorizing(DeviceFlow.Authorization) + case verifying + case signedIn(Credential) + } + + private(set) var state: State = .signedOut + /// The most recent sign-in problem, shown inline in Settings. + private(set) var problem: String? + + var credential: Credential? { + if case let .signedIn(credential) = state { return credential } + return nil + } + + var isSignedIn: Bool { credential != nil } + + #if DEBUG + /// Development builds keep their own credential so they never prompt for, or overwrite, the + /// release app's keychain item (which is bound to a different code signature). + private let keychain = Keychain(service: "PRMonitor.debug") + #else + private let keychain = Keychain(service: "PRMonitor") + #endif + private let credentialAccount = "github_credential" + private let legacyTokenAccount = "github_token" + private var signInTask: Task? + + init() { + if let data = keychain.read(credentialAccount), + let credential = try? JSONDecoder().decode(Credential.self, from: data) { + state = .signedIn(credential) + } else if let legacy = keychain.read(legacyTokenAccount), let token = String(data: legacy, encoding: .utf8), !token.isEmpty { + // Migrate 0.x installs, which stored the bare device-flow token. The legacy item is + // removed on sign-out rather than here, so a downgrade keeps working. + let credential = Credential(token: token, source: .deviceFlow) + persist(credential) + state = .signedIn(credential) + } + } + + #if DEBUG + /// A signed-in account for previews and snapshots. Never touches the keychain. + init(previewLogin: String) { + state = .signedIn(Credential(token: "", source: .githubCLI, login: previewLogin)) + } + + init(previewSignedOut: Void) {} + #endif + + // MARK: - Sign in + + func signInWithDeviceFlow(clientID: String) { + guard !clientID.trimmed.isEmpty else { + problem = "Device sign-in needs a GitHub OAuth app client ID. Add one under Advanced, or use the GitHub CLI or a token." + return + } + begin { + let flow = DeviceFlow(clientID: clientID.trimmed) + let authorization = try await flow.start() + self.state = .authorizing(authorization) + // Put the code on the clipboard so the user can paste it straight into the browser. + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(authorization.userCode, forType: .string) + NSWorkspace.shared.open(authorization.verificationURL) + let token = try await flow.token(for: authorization) + try await self.complete(with: Credential(token: token, source: .deviceFlow)) + } + } + + func signInWithGitHubCLI() { + begin { + self.state = .verifying + let token = try await GitHubCLI.token() + try await self.complete(with: Credential(token: token, source: .githubCLI)) + } + } + + func signIn(personalAccessToken token: String) { + let token = token.trimmed + guard !token.isEmpty else { return } + begin { + self.state = .verifying + try await self.complete(with: Credential(token: token, source: .personalAccessToken)) + } + } + + func cancelSignIn() { + signInTask?.cancel() + signInTask = nil + if !isSignedIn { state = .signedOut } + } + + // MARK: - Sign out + + func signOut() { + cancelSignIn() + keychain.delete(credentialAccount) + keychain.delete(legacyTokenAccount) + state = .signedOut + problem = nil + } + + /// Called when GitHub rejects the stored token (revoked, expired, or scopes removed). + func sessionExpired() { + guard isSignedIn else { return } + keychain.delete(credentialAccount) + keychain.delete(legacyTokenAccount) + state = .signedOut + problem = GitHubError.unauthorized.errorDescription + } + + /// Records the viewer's login the first time the monitor learns it. + func update(login: String) { + guard case var .signedIn(credential) = state, credential.login != login else { return } + credential.login = login + persist(credential) + state = .signedIn(credential) + } + + // MARK: - Helpers + + private func begin(_ work: @escaping @MainActor () async throws -> Void) { + signInTask?.cancel() + problem = nil + signInTask = Task { + do { + try await work() + } catch is CancellationError { + // The user cancelled; nothing to report. + } catch { + guard !Task.isCancelled else { return } + self.problem = error.localizedDescription + if !self.isSignedIn { self.state = .signedOut } + } + } + } + + /// Verifies the token actually works before saving it, so a typo never looks like a sign-in. + private func complete(with credential: Credential) async throws { + var credential = credential + do { + credential.login = try await GitHubClient(token: credential.token).viewerLogin() + } catch .unauthorized { + throw GitHubError.forbidden("GitHub didn't accept that token.") + } + try Task.checkCancellation() + persist(credential) + state = .signedIn(credential) + } + + private func persist(_ credential: Credential) { + if let data = try? JSONEncoder().encode(credential) { + keychain.write(data, for: credentialAccount) + } + } +} diff --git a/Sources/PRMonitor/Services/AgentDiscoveryService.swift b/Sources/PRMonitor/Services/AgentDiscoveryService.swift deleted file mode 100644 index 10bf275..0000000 --- a/Sources/PRMonitor/Services/AgentDiscoveryService.swift +++ /dev/null @@ -1,78 +0,0 @@ -import Foundation - -final class AgentDiscoveryService { - private let client: GitHubClient - - init(client: GitHubClient) { - self.client = client - } - - func discoverAgents(repos: [RepoConfig]) async throws -> [AgentConfig] { - var candidates: [String: AgentCandidate] = [:] - - for repo in repos { - let pulls = try await client.fetchOpenPullRequests(repo: repo) - for pr in pulls { - async let checkRunsTask = client.fetchCheckRuns(owner: repo.owner, repo: repo.name, sha: pr.head.sha) - async let commentsTask = client.fetchAllPRComments(owner: repo.owner, repo: repo.name, prNumber: pr.number) - let checkRuns = try await checkRunsTask - let comments = try await commentsTask - - var localKeys: [String] = [] - - for run in checkRuns { - let displayName = run.app?.name ?? run.name - let pattern = run.app?.slug ?? run.name - let key = normalize(pattern) - guard !key.isEmpty else { continue } - localKeys.append(key) - if candidates[key] == nil { - candidates[key] = AgentCandidate(displayName: displayName, checkPattern: pattern, commentCounts: [:]) - } - } - - for comment in comments { - let commentKey = normalize(comment.author) - guard !commentKey.isEmpty else { continue } - for key in localKeys { - if matches(candidateKey: key, commentKey: commentKey) { - candidates[key, default: AgentCandidate(displayName: key, checkPattern: key, commentCounts: [:])] - .commentCounts[comment.author, default: 0] += 1 - } - } - } - } - } - - return candidates.values - .map { candidate in - let bestAuthor = candidate.commentCounts.max(by: { $0.value < $1.value })?.key ?? "" - return AgentConfig( - displayName: candidate.displayName, - checkNamePattern: candidate.checkPattern, - commentAuthor: bestAuthor - ) - } - .sorted { $0.displayName.localizedCaseInsensitiveCompare($1.displayName) == .orderedAscending } - } - - private func normalize(_ value: String) -> String { - let lowered = value.lowercased() - let removedBot = lowered.replacingOccurrences(of: "[bot]", with: "") - let allowed = removedBot.filter { $0.isLetter || $0.isNumber } - return allowed - } - - private func matches(candidateKey: String, commentKey: String) -> Bool { - if candidateKey == commentKey { return true } - if commentKey.contains(candidateKey) { return true } - if candidateKey.contains(commentKey) { return true } - return false - } -} - -private struct AgentCandidate { - var displayName: String - var checkPattern: String - var commentCounts: [String: Int] -} diff --git a/Sources/PRMonitor/Services/AppSettings.swift b/Sources/PRMonitor/Services/AppSettings.swift new file mode 100644 index 0000000..2224969 --- /dev/null +++ b/Sources/PRMonitor/Services/AppSettings.swift @@ -0,0 +1,185 @@ +import Foundation +import Observation + +/// User preferences, persisted to `UserDefaults` as one versioned JSON document. +@Observable +@MainActor +final class AppSettings { + enum Scope: String, Codable, CaseIterable, Sendable { + case all, authored + + var title: String { + switch self { + case .all: "All" + case .authored: "Mine" + } + } + } + + static let refreshIntervals: [TimeInterval] = [30, 60, 120, 300] + + var repositories: [TrackedRepository] = [] { didSet { save() } } + var agentMode: AgentMode = .automatic { didSet { save() } } + var agents: [Agent] = [] { didSet { save() } } + var refreshInterval: TimeInterval = 60 { didSet { save() } } + var scope: Scope = .all { didSet { save() } } + var hidesDrafts = false { didSet { save() } } + var notifiesWhenSettled = true { didSet { save() } } + var notifiesOnNewFeedback = true { didSet { save() } } + var notifiesPerAgent = false { didSet { save() } } + var showsAttentionCount = true { didSet { save() } } + /// Off by default: the HIG asks menu bar extras to use template (monochrome) images. + var usesColoredStatusIcon = false { didSet { save() } } + /// Overrides the client ID bundled in Info.plist, for people who build from source. + var oauthClientIDOverride = "" { didSet { save() } } + + @ObservationIgnored private let defaults: UserDefaults + @ObservationIgnored private var isLoading = false + private static let storageKey = "PRMonitorSettings.v2" + private static let legacyStorageKey = "PRMonitorSettings" + + init(defaults: UserDefaults = .standard) { + self.defaults = defaults + load() + } + + // MARK: - Derived + + var enabledRepositories: [RepositoryID] { + repositories.filter(\.isEnabled).map(\.id) + } + + var oauthClientID: String { + let override = oauthClientIDOverride.trimmed + if !override.isEmpty { return override } + return (Bundle.main.object(forInfoDictionaryKey: "GitHubOAuthClientID") as? String)?.trimmed ?? "" + } + + var statusEngine: StatusEngine { + StatusEngine(mode: agentMode, agents: agents) + } + + var notificationPreferences: NotificationPreferences { + NotificationPreferences( + whenSettled: notifiesWhenSettled, + whenFeedbackArrives: notifiesOnNewFeedback, + perAgent: notifiesPerAgent + ) + } + + // MARK: - Mutations + + @discardableResult + func track(_ repository: RepositoryID) -> Bool { + guard !repositories.contains(where: { $0.id == repository }) else { return false } + repositories.append(TrackedRepository(id: repository)) + repositories.sort { $0.id < $1.id } + return true + } + + func untrack(_ repository: RepositoryID) { + repositories.removeAll { $0.id == repository } + } + + func isTracking(_ repository: RepositoryID) -> Bool { + repositories.contains { $0.id == repository } + } + + // MARK: - Persistence + + private struct Document: Codable { + var repositories: [TrackedRepository] + var agentMode: AgentMode + var agents: [Agent] + var refreshInterval: TimeInterval + var scope: Scope + var hidesDrafts: Bool + var notifiesWhenSettled: Bool + var notifiesOnNewFeedback: Bool + var notifiesPerAgent: Bool + var showsAttentionCount: Bool + var usesColoredStatusIcon: Bool? + var oauthClientIDOverride: String + } + + private func load() { + isLoading = true + defer { isLoading = false } + + if let data = defaults.data(forKey: Self.storageKey), + let document = try? JSONDecoder().decode(Document.self, from: data) { + apply(document) + } else if let data = defaults.data(forKey: Self.legacyStorageKey), + let legacy = try? JSONDecoder().decode(LegacyDocument.self, from: data) { + migrate(legacy) + isLoading = false + save() + } + } + + private func apply(_ document: Document) { + repositories = document.repositories + agentMode = document.agentMode + agents = document.agents + refreshInterval = document.refreshInterval + scope = document.scope + hidesDrafts = document.hidesDrafts + notifiesWhenSettled = document.notifiesWhenSettled + notifiesOnNewFeedback = document.notifiesOnNewFeedback + notifiesPerAgent = document.notifiesPerAgent + showsAttentionCount = document.showsAttentionCount + usesColoredStatusIcon = document.usesColoredStatusIcon ?? false + oauthClientIDOverride = document.oauthClientIDOverride + } + + private func save() { + guard !isLoading else { return } + let document = Document( + repositories: repositories, agentMode: agentMode, agents: agents, refreshInterval: refreshInterval, + scope: scope, hidesDrafts: hidesDrafts, notifiesWhenSettled: notifiesWhenSettled, + notifiesOnNewFeedback: notifiesOnNewFeedback, notifiesPerAgent: notifiesPerAgent, + showsAttentionCount: showsAttentionCount, usesColoredStatusIcon: usesColoredStatusIcon, + oauthClientIDOverride: oauthClientIDOverride + ) + if let data = try? JSONEncoder().encode(document) { + defaults.set(data, forKey: Self.storageKey) + } + } + + // MARK: - Migration from 0.x + + private struct LegacyDocument: Decodable { + struct Repo: Decodable { var owner: String; var name: String; var isEnabled: Bool } + struct LegacyAgent: Decodable { var displayName: String; var checkNamePattern: String; var commentAuthor: String } + var repos: [Repo]? + var agents: [LegacyAgent]? + var pollingIntervalSeconds: Int? + var notifyPerAgent: Bool? + var notifySummary: Bool? + var githubClientId: String? + } + + private func migrate(_ legacy: LegacyDocument) { + repositories = (legacy.repos ?? []).map { + TrackedRepository(id: RepositoryID(owner: $0.owner, name: $0.name), isEnabled: $0.isEnabled) + } + refreshInterval = TimeInterval(legacy.pollingIntervalSeconds ?? 60) + notifiesPerAgent = legacy.notifyPerAgent ?? false + notifiesWhenSettled = legacy.notifySummary ?? true + oauthClientIDOverride = legacy.githubClientId ?? "" + + // 0.x seeded Vercel, Cursor and Devin for everyone. If the list is untouched, automatic + // mode tracks those and more; if it was customized, keep the user's list. + let seeded: Set = ["vercel", "cursor", "devin"] + let legacyAgents = legacy.agents ?? [] + let isUntouched = Set(legacyAgents.map { $0.checkNamePattern.lowercased() }) == seeded && legacyAgents.count == seeded.count + if legacyAgents.isEmpty || isUntouched { + agentMode = .automatic + } else { + agentMode = .custom + agents = legacyAgents.map { + Agent(name: $0.displayName, checkPattern: $0.checkNamePattern, login: $0.commentAuthor) + } + } + } +} diff --git a/Sources/PRMonitor/Services/GitHubAuthService.swift b/Sources/PRMonitor/Services/GitHubAuthService.swift deleted file mode 100644 index 6bb58af..0000000 --- a/Sources/PRMonitor/Services/GitHubAuthService.swift +++ /dev/null @@ -1,117 +0,0 @@ -import Foundation - -enum GitHubAuthError: Error, LocalizedError { - case invalidResponse - case expired - case accessDenied - case slowDown - - var errorDescription: String? { - switch self { - case .invalidResponse: - return "Invalid response from GitHub." - case .expired: - return "Device code expired." - case .accessDenied: - return "Access denied." - case .slowDown: - return "GitHub asked to slow down polling." - } - } -} - -final class GitHubAuthService { - private let session = URLSession.shared - - func startDeviceFlow(clientId: String) async throws -> DeviceFlowState { - guard let url = URL(string: "https://github.com/login/device/code") else { - throw GitHubAuthError.invalidResponse - } - var request = URLRequest(url: url) - request.httpMethod = "POST" - let body = "client_id=\(clientId)&scope=repo" - request.httpBody = body.data(using: .utf8) - request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") - - let (data, _) = try await session.data(for: request) - let payload = try parseFormEncoded(data) - guard - let deviceCode = payload["device_code"], - let userCode = payload["user_code"], - let verificationURI = payload["verification_uri"], - let expiresIn = payload["expires_in"], - let interval = payload["interval"], - let verificationURL = URL(string: verificationURI), - let expiresSeconds = Double(expiresIn), - let intervalSeconds = Int(interval) - else { - throw GitHubAuthError.invalidResponse - } - - return DeviceFlowState( - userCode: userCode, - deviceCode: deviceCode, - verificationURL: verificationURL, - expiresAt: Date().addingTimeInterval(expiresSeconds), - intervalSeconds: intervalSeconds - ) - } - - func pollForToken(clientId: String, deviceCode: String, intervalSeconds: Int, expiresAt: Date) async throws -> String { - guard let url = URL(string: "https://github.com/login/oauth/access_token") else { - throw GitHubAuthError.invalidResponse - } - - var nextInterval = intervalSeconds - - while Date() < expiresAt { - try await Task.sleep(nanoseconds: UInt64(nextInterval) * 1_000_000_000) - - var request = URLRequest(url: url) - request.httpMethod = "POST" - let body = "client_id=\(clientId)&device_code=\(deviceCode)&grant_type=urn:ietf:params:oauth:grant-type:device_code" - request.httpBody = body.data(using: .utf8) - request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") - - let (data, _) = try await session.data(for: request) - let payload = try parseFormEncoded(data) - - if let token = payload["access_token"] { - return token - } - - if let error = payload["error"] { - switch error { - case "authorization_pending": - continue - case "slow_down": - nextInterval += 5 - continue - case "access_denied": - throw GitHubAuthError.accessDenied - case "expired_token": - throw GitHubAuthError.expired - default: - throw GitHubAuthError.invalidResponse - } - } - } - - throw GitHubAuthError.expired - } - - private func parseFormEncoded(_ data: Data) throws -> [String: String] { - guard let text = String(data: data, encoding: .utf8) else { - throw GitHubAuthError.invalidResponse - } - var result: [String: String] = [:] - for pair in text.split(separator: "&") { - let parts = pair.split(separator: "=", maxSplits: 1) - guard parts.count == 2 else { continue } - let key = String(parts[0]) - let value = String(parts[1]) - result[key] = value.removingPercentEncoding ?? value - } - return result - } -} diff --git a/Sources/PRMonitor/Services/GitHubClient.swift b/Sources/PRMonitor/Services/GitHubClient.swift deleted file mode 100644 index 78ff634..0000000 --- a/Sources/PRMonitor/Services/GitHubClient.swift +++ /dev/null @@ -1,404 +0,0 @@ -import Foundation - -enum GitHubClientError: Error, LocalizedError { - case missingToken - case invalidResponse - case rateLimited(reset: Date?) - case httpError(status: Int) - - var errorDescription: String? { - switch self { - case .missingToken: - return "Missing GitHub token." - case .invalidResponse: - return "Unexpected GitHub response." - case .rateLimited(let reset): - if let reset { - let formatter = RelativeDateTimeFormatter() - formatter.unitsStyle = .full - let relative = formatter.localizedString(for: reset, relativeTo: Date()) - return "GitHub API rate limit exceeded. Try again \(relative)." - } - return "GitHub API rate limit exceeded. Try again later." - case .httpError(let status): - return "GitHub API returned HTTP \(status)." - } - } -} - -final class GitHubClient { - private let session: URLSession - private let tokenProvider: () -> String? - private let decoder: JSONDecoder - private let pathSegmentAllowedCharacters: CharacterSet - - init(session: URLSession = .shared, tokenProvider: @escaping () -> String?) { - self.session = session - self.tokenProvider = tokenProvider - self.decoder = JSONDecoder() - self.decoder.dateDecodingStrategy = .iso8601 - var allowed = CharacterSet.urlPathAllowed - allowed.remove(charactersIn: "/") - self.pathSegmentAllowedCharacters = allowed - } - - func fetchOpenPullRequests(repo: RepoConfig) async throws -> [PullRequestDTO] { - var page = 1 - var pulls: [PullRequestDTO] = [] - while true { - let url = try apiURL( - pathSegments: ["repos", repo.owner, repo.name, "pulls"], - queryItems: [ - URLQueryItem(name: "state", value: "open"), - URLQueryItem(name: "per_page", value: "100"), - URLQueryItem(name: "page", value: String(page)) - ] - ) - let request = try makeRequest(url: url) - let (data, response) = try await session.data(for: request) - try validate(response: response) - let batch = try decoder.decode([PullRequestDTO].self, from: data) - pulls.append(contentsOf: batch) - if batch.count < 100 { break } - page += 1 - } - return pulls - } - - func fetchCheckRuns(owner: String, repo: String, sha: String) async throws -> [CheckRunDTO] { - var page = 1 - var runs: [CheckRunDTO] = [] - var totalCount: Int? - while true { - let url = try apiURL( - pathSegments: ["repos", owner, repo, "commits", sha, "check-runs"], - queryItems: [ - URLQueryItem(name: "per_page", value: "100"), - URLQueryItem(name: "page", value: String(page)), - URLQueryItem(name: "filter", value: "latest") - ] - ) - let request = try makeRequest(url: url) - let (data, response) = try await session.data(for: request) - try validate(response: response) - let payload = try decoder.decode(CheckRunsResponse.self, from: data) - totalCount = payload.totalCount - runs.append(contentsOf: payload.checkRuns) - if payload.checkRuns.count < 100 { break } - if let totalCount, runs.count >= totalCount { break } - page += 1 - } - return runs - } - - func fetchReviewComments(owner: String, repo: String, prNumber: Int) async throws -> [PRComment] { - var page = 1 - var comments: [PRComment] = [] - while true { - let url = try apiURL( - pathSegments: ["repos", owner, repo, "pulls", String(prNumber), "comments"], - queryItems: [ - URLQueryItem(name: "per_page", value: "100"), - URLQueryItem(name: "page", value: String(page)) - ] - ) - let request = try makeRequest(url: url) - let (data, response) = try await session.data(for: request) - try validate(response: response) - let batch = try decoder.decode([ReviewCommentDTO].self, from: data) - comments.append(contentsOf: batch.map { PRComment(author: $0.user.login, createdAt: $0.createdAt) }) - if batch.count < 100 { break } - page += 1 - } - return comments - } - - func fetchIssueComments(owner: String, repo: String, prNumber: Int) async throws -> [PRComment] { - var page = 1 - var comments: [PRComment] = [] - while true { - let url = try apiURL( - pathSegments: ["repos", owner, repo, "issues", String(prNumber), "comments"], - queryItems: [ - URLQueryItem(name: "per_page", value: "100"), - URLQueryItem(name: "page", value: String(page)) - ] - ) - let request = try makeRequest(url: url) - let (data, response) = try await session.data(for: request) - try validate(response: response) - let batch = try decoder.decode([IssueCommentDTO].self, from: data) - comments.append(contentsOf: batch.map { PRComment(author: $0.user.login, createdAt: $0.createdAt) }) - if batch.count < 100 { break } - page += 1 - } - return comments - } - - func fetchPullRequestReviews(owner: String, repo: String, prNumber: Int) async throws -> [PRComment] { - var page = 1 - var comments: [PRComment] = [] - while true { - let url = try apiURL( - pathSegments: ["repos", owner, repo, "pulls", String(prNumber), "reviews"], - queryItems: [ - URLQueryItem(name: "per_page", value: "100"), - URLQueryItem(name: "page", value: String(page)) - ] - ) - let request = try makeRequest(url: url) - let (data, response) = try await session.data(for: request) - try validate(response: response) - let batch = try decoder.decode([PullRequestReviewDTO].self, from: data) - comments.append(contentsOf: batch.compactMap { review in - guard let submittedAt = review.submittedAt else { return nil } - let body = review.body?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" - guard !body.isEmpty else { return nil } - return PRComment(author: review.user.login, createdAt: submittedAt) - }) - if batch.count < 100 { break } - page += 1 - } - return comments - } - - func fetchAllPRComments(owner: String, repo: String, prNumber: Int) async throws -> [PRComment] { - async let reviewComments = fetchReviewComments(owner: owner, repo: repo, prNumber: prNumber) - async let issueComments = fetchIssueComments(owner: owner, repo: repo, prNumber: prNumber) - async let reviews = fetchPullRequestReviews(owner: owner, repo: repo, prNumber: prNumber) - let resolvedReviewComments = try await reviewComments - let resolvedIssueComments = try await issueComments - let resolvedReviews = try await reviews - return resolvedReviewComments + resolvedIssueComments + resolvedReviews - } - - func fetchViewerLogin() async throws -> String { - let url = try apiURL(pathSegments: ["user"]) - let request = try makeRequest(url: url) - let (data, response) = try await session.data(for: request) - try validate(response: response) - let payload = try decoder.decode(ViewerDTO.self, from: data) - return payload.login - } - - func fetchViewerRepos(page: Int) async throws -> [RepoDTO] { - let url = try apiURL( - pathSegments: ["user", "repos"], - queryItems: [ - URLQueryItem(name: "per_page", value: "100"), - URLQueryItem(name: "page", value: String(page)), - URLQueryItem(name: "affiliation", value: "owner,collaborator,organization_member"), - URLQueryItem(name: "sort", value: "updated") - ] - ) - let request = try makeRequest(url: url) - let (data, response) = try await session.data(for: request) - try validate(response: response) - return try decoder.decode([RepoDTO].self, from: data) - } - - func fetchAllViewerRepos() async throws -> [RepoDTO] { - var page = 1 - var repos: [RepoDTO] = [] - while true { - let batch = try await fetchViewerRepos(page: page) - if batch.isEmpty { break } - repos.append(contentsOf: batch) - if batch.count < 100 { break } - page += 1 - } - return repos - } - - private func makeRequest(url: URL) throws -> URLRequest { - guard let token = tokenProvider() else { - throw GitHubClientError.missingToken - } - var request = URLRequest(url: url) - request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") - request.setValue("application/vnd.github+json", forHTTPHeaderField: "Accept") - request.setValue("2022-11-28", forHTTPHeaderField: "X-GitHub-Api-Version") - request.setValue("PRMonitor", forHTTPHeaderField: "User-Agent") - return request - } - - private func apiURL(pathSegments: [String], queryItems: [URLQueryItem] = []) throws -> URL { - let encodedSegments = pathSegments.compactMap { - $0.addingPercentEncoding(withAllowedCharacters: pathSegmentAllowedCharacters) - } - guard encodedSegments.count == pathSegments.count else { - throw GitHubClientError.invalidResponse - } - var components = URLComponents() - components.scheme = "https" - components.host = "api.github.com" - components.percentEncodedPath = "/" + encodedSegments.joined(separator: "/") - components.queryItems = queryItems.isEmpty ? nil : queryItems - guard let url = components.url else { - throw GitHubClientError.invalidResponse - } - return url - } - - private func validate(response: URLResponse) throws { - guard let http = response as? HTTPURLResponse else { - throw GitHubClientError.invalidResponse - } - guard (200...299).contains(http.statusCode) else { - if http.statusCode == 403 || http.statusCode == 429 { - let remaining = http.value(forHTTPHeaderField: "X-RateLimit-Remaining") - let retryAfter = http.value(forHTTPHeaderField: "Retry-After") - let reset = http.value(forHTTPHeaderField: "X-RateLimit-Reset") - - let resetDate: Date? = { - if let retryAfter, let seconds = TimeInterval(retryAfter) { - return Date().addingTimeInterval(seconds) - } - if let reset, let timestamp = TimeInterval(reset) { - return Date(timeIntervalSince1970: timestamp) - } - return nil - }() - - if remaining == "0" || http.statusCode == 429 { - throw GitHubClientError.rateLimited(reset: resetDate) - } - } - throw GitHubClientError.httpError(status: http.statusCode) - } - } -} - -struct PullRequestDTO: Decodable { - struct User: Decodable { - var login: String - } - struct Head: Decodable { - var sha: String - } - - var number: Int - var title: String - var user: User - var updatedAt: Date - var htmlURL: String - var head: Head - - enum CodingKeys: String, CodingKey { - case number - case title - case user - case updatedAt = "updated_at" - case htmlURL = "html_url" - case head - } -} - -struct CheckRunsResponse: Decodable { - var checkRuns: [CheckRunDTO] - var totalCount: Int - - enum CodingKeys: String, CodingKey { - case checkRuns = "check_runs" - case totalCount = "total_count" - } -} - -struct CheckRunDTO: Decodable { - struct App: Decodable { - var name: String? - var slug: String? - } - - var name: String - var status: String - var conclusion: String? - var createdAt: Date? - var startedAt: Date? - var completedAt: Date? - var app: App? - - enum CodingKeys: String, CodingKey { - case name - case status - case conclusion - case createdAt = "created_at" - case startedAt = "started_at" - case completedAt = "completed_at" - case app - } -} - -struct ReviewCommentDTO: Decodable { - struct User: Decodable { - var login: String - } - - var id: Int - var user: User - var createdAt: Date - - enum CodingKeys: String, CodingKey { - case id - case user - case createdAt = "created_at" - } -} - -struct IssueCommentDTO: Decodable { - struct User: Decodable { - var login: String - } - - var id: Int - var user: User - var createdAt: Date - - enum CodingKeys: String, CodingKey { - case id - case user - case createdAt = "created_at" - } -} - -struct PullRequestReviewDTO: Decodable { - struct User: Decodable { - var login: String - } - - var id: Int - var user: User - var submittedAt: Date? - var body: String? - - enum CodingKeys: String, CodingKey { - case id - case user - case submittedAt = "submitted_at" - case body - } -} - -struct ViewerDTO: Decodable { - var login: String -} - -struct RepoDTO: Decodable, Identifiable, Hashable { - struct Owner: Decodable, Hashable { - var login: String - } - - var name: String - var fullName: String - var owner: Owner - var isPrivate: Bool - - var id: String { fullName } - - enum CodingKeys: String, CodingKey { - case name - case fullName = "full_name" - case owner - case isPrivate = "private" - } -} diff --git a/Sources/PRMonitor/Services/Keychain.swift b/Sources/PRMonitor/Services/Keychain.swift new file mode 100644 index 0000000..c71b56a --- /dev/null +++ b/Sources/PRMonitor/Services/Keychain.swift @@ -0,0 +1,38 @@ +import Foundation +import Security + +/// Stores small secrets as generic passwords in the user's login keychain. +struct Keychain: Sendable { + let service: String + + func read(_ account: String) -> Data? { + var query = baseQuery(account) + query[kSecReturnData] = true + query[kSecMatchLimit] = kSecMatchLimitOne + var item: CFTypeRef? + guard SecItemCopyMatching(query as CFDictionary, &item) == errSecSuccess else { return nil } + return item as? Data + } + + @discardableResult + func write(_ data: Data, for account: String) -> Bool { + let attributes: [CFString: Any] = [ + kSecValueData: data, + kSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlock, + ] + let status = SecItemUpdate(baseQuery(account) as CFDictionary, attributes as CFDictionary) + if status == errSecItemNotFound { + let insert = baseQuery(account).merging(attributes) { _, new in new } + return SecItemAdd(insert as CFDictionary, nil) == errSecSuccess + } + return status == errSecSuccess + } + + func delete(_ account: String) { + SecItemDelete(baseQuery(account) as CFDictionary) + } + + private func baseQuery(_ account: String) -> [CFString: Any] { + [kSecClass: kSecClassGenericPassword, kSecAttrService: service, kSecAttrAccount: account] + } +} diff --git a/Sources/PRMonitor/Services/Monitor.swift b/Sources/PRMonitor/Services/Monitor.swift new file mode 100644 index 0000000..0af0aea --- /dev/null +++ b/Sources/PRMonitor/Services/Monitor.swift @@ -0,0 +1,340 @@ +import Foundation +import Observation + +/// Owns the polling loop and the current picture of every monitored pull request. +/// +/// Data flow, one direction only: +/// `PullRequestFetcher` (network) → raw `PullRequest`s → `StatusEngine` (pure) → `PullRequestReport`s +/// → views, and → `NotificationPlanner` (pure) → `Notifier`. +@Observable +@MainActor +final class Monitor { + struct Section: Identifiable, Hashable { + let repository: RepositoryID + var reports: [PullRequestReport] + var totalOpen: Int + /// Set when the last poll failed for this repository; `reports` then holds the last good data. + var error: GitHubError? + + var id: RepositoryID { repository } + } + + /// What the menu bar icon should convey, most urgent first. + enum Summary: Equatable { + case signedOut + case needsRepositories + case unavailable(GitHubError) + case failing + case needsReview + case running + case ready + case idle + } + + private(set) var sections: [Section] = [] + private(set) var lastUpdated: Date? + private(set) var isRefreshing = false + private(set) var lastError: GitHubError? + + let settings: AppSettings + let account: Account + private let notifier: Notifier + private let fetcher = PullRequestFetcher() + private let system = SystemEvents() + + @ObservationIgnored private var planner = NotificationPlanner() + @ObservationIgnored private var pullRequests: [RepositoryID: (items: [PullRequest], totalOpen: Int)] = [:] + @ObservationIgnored private var repositoryErrors: [RepositoryID: GitHubError] = [:] + @ObservationIgnored private var loopTask: Task? + @ObservationIgnored private var sleepTask: Task? + @ObservationIgnored private var observerTasks: [Task] = [] + @ObservationIgnored private var isRefreshQueued = false + @ObservationIgnored private var consecutiveFailures = 0 + + /// How long to wait when there's nothing to do until something changes (sign-in, settings, network). + private let dormantDelay: TimeInterval = 3600 + + init(settings: AppSettings, account: Account, notifier: Notifier) { + self.settings = settings + self.account = account + self.notifier = notifier + } + + // MARK: - Lifecycle + + func start() { + guard loopTask == nil else { return } + notifier.activate() + system.start { [weak self] in + // Give Wi-Fi a moment to reassociate after wake before hitting the network. + Task { @MainActor [weak self] in + try? await Task.sleep(for: .seconds(2)) + self?.refresh() + } + } + observeConfiguration() + loopTask = Task { [weak self] in + while !Task.isCancelled { + guard let delay = await self?.poll() else { return } + await self?.sleep(for: delay) + } + } + } + + /// Polls now. Coalesces with a poll that's already in flight rather than starting a second one. + func refresh() { + if isRefreshing { + isRefreshQueued = true + } else { + sleepTask?.cancel() + } + } + + /// Called when the menu bar panel opens: cached data shows instantly, and is refreshed if old. + func refreshIfStale(maximumAge: TimeInterval = 30) { + guard let lastUpdated, Date.now.timeIntervalSince(lastUpdated) < maximumAge else { + refresh() + return + } + } + + // MARK: - Derived state + + /// Sections filtered by the user's display preferences, with empty repositories removed. + var visibleSections: [Section] { + sections.compactMap { section in + var section = section + section.reports = section.reports.filter(isVisible) + return section.reports.isEmpty && section.error == nil ? nil : section + } + } + + var visibleReports: [PullRequestReport] { + visibleSections.flatMap(\.reports) + } + + var attentionCount: Int { + visibleReports.count { $0.status.needsAttention } + } + + var summary: Summary { + guard account.isSignedIn else { return .signedOut } + guard !settings.enabledRepositories.isEmpty else { return .needsRepositories } + let reports = visibleReports + if let lastError, reports.isEmpty { return .unavailable(lastError) } + let top = reports.map(\.status).max { $0.urgency < $1.urgency } + return switch top { + case .failing: .failing + case .needsReview: .needsReview + case .running: .running + case .ready: .ready + case .quiet, nil: .idle + } + } + + /// Bots and integrations seen on current PRs, offered as suggestions when configuring agents. + /// Built from the raw signals so suggestions carry real logins and app slugs, not normalized keys. + var discoveredAgents: [Agent] { + var found: [String: Agent] = [:] + func add(key: String, name: String, checkPattern: String = "", login: String = "") { + var agent = found[key] ?? Agent(name: name) + if agent.checkPattern.isEmpty { agent.checkPattern = checkPattern } + if agent.login.isEmpty { agent.login = login } + found[key] = agent + } + for pr in pullRequests.values.flatMap(\.items) { + for check in pr.checks { + let pattern: String = switch check.source { + case let .checkRun(appName, appSlug): appSlug ?? appName ?? check.name + case let .commitStatus(creator): creator ?? check.name + } + add(key: check.groupKey, name: check.groupDisplayName, checkPattern: pattern) + } + let bots = pr.requestedReviewers.filter(\.isBot).map(\.login) + + pr.reviews.filter(\.isBot).map(\.author) + + pr.threads.filter(\.isBot).map(\.author) + for login in bots { + add(key: Identity.normalize(login), name: StatusEngine.displayName(forLogin: login), login: login) + } + } + return found.values.sorted { $0.name.localizedStandardCompare($1.name) == .orderedAscending } + } + + private func isVisible(_ report: PullRequestReport) -> Bool { + let pr = report.pullRequest + if settings.hidesDrafts, pr.isDraft { return false } + if settings.scope == .authored { + guard let viewer = account.credential?.login, let author = pr.author else { return false } + return Identity.normalize(viewer) == Identity.normalize(author) + } + return true + } + + // MARK: - Polling + + /// Performs one poll and returns how long to wait before the next. + private func poll() async -> TimeInterval { + guard let credential = account.credential else { + clear() + return dormantDelay + } + let repositories = settings.enabledRepositories + guard !repositories.isEmpty else { + clear() + return dormantDelay + } + guard system.isOnline else { + lastError = .offline + return dormantDelay // The network monitor wakes us when the connection returns. + } + + isRefreshing = true + defer { + isRefreshing = false + } + + var policy = PollingPolicy(activeInterval: settings.refreshInterval) + if system.isConstrained { policy.activeInterval = max(policy.activeInterval, 300) } + + let result: PullRequestFetcher.Result + do { + result = try await fetcher.fetch(repositories, client: GitHubClient(token: credential.token)) + } catch .unauthorized { + account.sessionExpired() + await fetcher.reset() + return dormantDelay + } catch let .rateLimited(resetAt) { + lastError = .rateLimited(resetAt: resetAt) + return policy.delay(after: .rateLimited(resetAt: resetAt)) + } catch { + consecutiveFailures += 1 + lastError = error + return nextDelay(policy.delay(after: .failure(consecutive: consecutiveFailures))) + } + + consecutiveFailures = 0 + lastError = nil + lastUpdated = .now + if let login = result.viewerLogin { account.update(login: login) } + + // Forget repositories that are no longer tracked; keep last good data for ones that failed. + let tracked = Set(repositories) + pullRequests = pullRequests.filter { tracked.contains($0.key) } + repositoryErrors.removeAll() + for (repository, outcome) in result.repositories { + switch outcome { + case let .loaded(items, totalOpen): pullRequests[repository] = (items, totalOpen) + case let .failed(error): repositoryErrors[repository] = error + } + } + rebuild() + + let planned = planner.plan(for: visibleReports, preferences: settings.notificationPreferences) + await notifier.post(planned) + + // Leave headroom in the hourly budget for the user's other tools (gh, IDEs, scripts). + if let limit = result.rateLimit, limit.remaining < 250 { + return nextDelay(policy.delay(after: .rateLimited(resetAt: limit.resetAt))) + } + let reports = sections.flatMap(\.reports) + return nextDelay(policy.delay(after: .success( + hasRunningPullRequests: reports.contains { !$0.isSettled }, + hasOpenPullRequests: !reports.isEmpty + ))) + } + + private func nextDelay(_ delay: TimeInterval) -> TimeInterval { + guard isRefreshQueued else { return delay } + isRefreshQueued = false + return 0 + } + + /// Re-derives every report from the raw data. Cheap, so it also runs when agent settings change. + private func rebuild() { + let engine = settings.statusEngine + let now = Date.now + let repositories = Set(pullRequests.keys).union(repositoryErrors.keys) + sections = repositories.sorted().map { repository in + let data = pullRequests[repository] + return Section( + repository: repository, + reports: (data?.items ?? []).map { engine.report(for: $0, now: now) }, + totalOpen: data?.totalOpen ?? 0, + error: repositoryErrors[repository] + ) + } + } + + private func clear() { + sections = [] + pullRequests = [:] + repositoryErrors = [:] + lastError = nil + lastUpdated = nil + } + + private func sleep(for seconds: TimeInterval) async { + guard seconds > 0 else { return } + let task = Task { _ = try? await Task.sleep(for: .seconds(seconds)) } + sleepTask = task + await task.value + sleepTask = nil + } + + // MARK: - Reacting to configuration + + private struct FetchConfiguration: Equatable, Sendable { + let token: String? + let repositories: [RepositoryID] + let interval: TimeInterval + } + + private struct EngineConfiguration: Equatable, Sendable { + let mode: AgentMode + let agents: [Agent] + } + + private func observeConfiguration() { + // Anything that changes *what* we fetch triggers an immediate poll. + observerTasks.append(Task { [weak self] in + let changes = Observations { [weak self] in + FetchConfiguration( + token: self?.account.credential?.token, + repositories: self?.settings.enabledRepositories ?? [], + interval: self?.settings.refreshInterval ?? 60 + ) + } + var previous: FetchConfiguration? + for await configuration in changes { + defer { previous = configuration } + guard let previous, previous != configuration else { continue } + if previous.token != configuration.token { await self?.fetcher.reset() } + self?.refresh() + } + }) + + // Changes to how agents are interpreted only need a re-derivation, not a network round trip. + observerTasks.append(Task { [weak self] in + let changes = Observations { [weak self] in + EngineConfiguration(mode: self?.settings.agentMode ?? .automatic, agents: self?.settings.agents ?? []) + } + var previous: EngineConfiguration? + for await configuration in changes { + defer { previous = configuration } + guard previous != nil, previous != configuration else { continue } + self?.rebuild() + } + }) + } +} + +#if DEBUG +extension Monitor { + /// Shows fixed data without polling, for previews and snapshots. + func loadPreview(_ items: [PullRequest]) { + pullRequests = Dictionary(grouping: items, by: \.repository).mapValues { ($0, $0.count) } + rebuild() + lastUpdated = .now.addingTimeInterval(-45) + } +} +#endif diff --git a/Sources/PRMonitor/Services/Notifier.swift b/Sources/PRMonitor/Services/Notifier.swift new file mode 100644 index 0000000..1f1667a --- /dev/null +++ b/Sources/PRMonitor/Services/Notifier.swift @@ -0,0 +1,97 @@ +import AppKit +@preconcurrency import UserNotifications + +/// Posts notifications and opens the pull request when one is clicked. +@MainActor +final class Notifier: NSObject, UNUserNotificationCenterDelegate { + nonisolated private static let urlKey = "url" + private static let categoryID = "pull-request" + private static let openActionID = "open" + + /// Notification Center only works inside an app bundle (not `swift run`, previews, or tests). + static var isAvailable: Bool { + let environment = ProcessInfo.processInfo.environment + guard environment["XCODE_RUNNING_FOR_PREVIEWS"] == nil, environment["XCTestConfigurationFilePath"] == nil else { + return false + } + return Bundle.main.bundleURL.pathExtension == "app" + } + + private var center: UNUserNotificationCenter? { + Self.isAvailable ? .current() : nil + } + + func activate() { + guard let center else { return } + center.delegate = self + let open = UNNotificationAction(identifier: Self.openActionID, title: "Open Pull Request", options: [.foreground]) + center.setNotificationCategories([ + UNNotificationCategory(identifier: Self.categoryID, actions: [open], intentIdentifiers: []), + ]) + } + + /// Asks for permission in context: the first time there is something worth notifying about, + /// rather than on first launch. + func requestAuthorizationIfNeeded() async { + guard let center else { return } + let settings = await center.notificationSettings() + if settings.authorizationStatus == .notDetermined { + _ = try? await center.requestAuthorization(options: [.alert, .sound]) + } + } + + func authorizationStatus() async -> UNAuthorizationStatus? { + await center?.notificationSettings().authorizationStatus + } + + func post(_ notifications: [PlannedNotification]) async { + guard let center, !notifications.isEmpty else { return } + await requestAuthorizationIfNeeded() + for planned in notifications { + let content = UNMutableNotificationContent() + content.title = planned.title + content.subtitle = planned.subtitle + content.body = planned.body + content.sound = .default + content.threadIdentifier = planned.key.description + content.categoryIdentifier = Self.categoryID + content.userInfo = [Self.urlKey: planned.url.absoluteString] + try? await center.add(UNNotificationRequest(identifier: planned.identifier, content: content, trigger: nil)) + } + } + + func postTest() async -> Bool { + guard let center else { return false } + await requestAuthorizationIfNeeded() + let content = UNMutableNotificationContent() + content.title = "PR Monitor" + content.subtitle = "Notifications are working" + content.body = "You'll hear from PR Monitor when your pull requests are ready for review." + content.sound = .default + do { + try await center.add(UNNotificationRequest(identifier: "test", content: content, trigger: nil)) + return true + } catch { + return false + } + } + + // MARK: - UNUserNotificationCenterDelegate + + nonisolated func userNotificationCenter( + _ center: UNUserNotificationCenter, + willPresent notification: UNNotification + ) async -> UNNotificationPresentationOptions { + [.banner, .list, .sound] + } + + nonisolated func userNotificationCenter( + _ center: UNUserNotificationCenter, + didReceive response: UNNotificationResponse + ) async { + guard response.actionIdentifier != UNNotificationDismissActionIdentifier, + let string = response.notification.request.content.userInfo[Self.urlKey] as? String, + let url = URL(string: string) else { return } + await MainActor.run { _ = NSWorkspace.shared.open(url) } + } +} diff --git a/Sources/PRMonitor/Services/PollingService.swift b/Sources/PRMonitor/Services/PollingService.swift deleted file mode 100644 index c9892d5..0000000 --- a/Sources/PRMonitor/Services/PollingService.swift +++ /dev/null @@ -1,218 +0,0 @@ -import Foundation - -final class PollingService { - let client: GitHubClient - private let repoConcurrencyLimit = 4 - private let prConcurrencyLimit = 6 - - init(client: GitHubClient) { - self.client = client - } - - func fetchRepoSections(repos: [RepoConfig], agents: [AgentConfig]) async throws -> [RepoSection] { - guard !repos.isEmpty else { return [] } - - let repoSemaphore = AsyncSemaphore(value: repoConcurrencyLimit) - return try await withThrowingTaskGroup(of: RepoSection?.self) { group in - for repo in repos { - group.addTask { - await repoSemaphore.wait() - defer { repoSemaphore.signal() } - let pulls = try await self.client.fetchOpenPullRequests(repo: repo) - let prs = try await self.buildPRItems(repo: repo, pulls: pulls, agents: agents) - return RepoSection(fullName: repo.fullName, prs: prs) - } - } - - var sections: [RepoSection] = [] - for try await section in group { - if let section = section { - sections.append(section) - } - } - return sections.sorted { $0.fullName.localizedCaseInsensitiveCompare($1.fullName) == .orderedAscending } - } - } - - private func buildPRItems(repo: RepoConfig, pulls: [PullRequestDTO], agents: [AgentConfig]) async throws -> [PRItem] { - let prSemaphore = AsyncSemaphore(value: prConcurrencyLimit) - return try await withThrowingTaskGroup(of: PRItem?.self) { group in - for pr in pulls { - group.addTask { - await prSemaphore.wait() - defer { prSemaphore.signal() } - async let checkRuns = self.client.fetchCheckRuns(owner: repo.owner, repo: repo.name, sha: pr.head.sha) - async let comments = self.client.fetchAllPRComments(owner: repo.owner, repo: repo.name, prNumber: pr.number) - let resolvedCheckRuns = try await checkRuns - let resolvedComments = try await comments - let agentRuns = self.buildAgentRuns(checkRuns: resolvedCheckRuns, comments: resolvedComments, agents: agents) - return PRItem( - id: pr.number, - number: pr.number, - title: pr.title, - author: pr.user.login, - updatedAt: pr.updatedAt, - url: URL(string: pr.htmlURL) ?? URL(string: "https://github.com")!, - repoFullName: repo.fullName, - agents: agentRuns - ) - } - } - - var items: [PRItem] = [] - for try await item in group { - if let item = item { - items.append(item) - } - } - return items.sorted { $0.updatedAt > $1.updatedAt } - } - } - - private func buildAgentRuns(checkRuns: [CheckRunDTO], comments: [PRComment], agents: [AgentConfig]) -> [AgentRun] { - if agents.isEmpty { - return inferAgentRuns(checkRuns: checkRuns, comments: comments) - } - - return agents.map { agent in - let matchingRuns = checkRuns.filter { matches(checkRun: $0, agent: agent) } - let bestRun = latestRun(from: matchingRuns) - let since = bestRun?.startedAt ?? bestRun?.createdAt ?? bestRun?.completedAt - let commentCount = commentCountForAgent(agent: agent, comments: comments, since: since) - - guard let run = bestRun else { - let status: AgentRunStatus = commentCount > 0 ? .waitingForComment : .notFound - return AgentRun(id: agent.id.uuidString, displayName: agent.displayName, status: status, commentCount: commentCount, checkConclusion: nil) - } - - let status = agentStatus(run: run, commentCount: commentCount) - return AgentRun(id: agent.id.uuidString, displayName: agent.displayName, status: status, commentCount: commentCount, checkConclusion: run.conclusion) - } - } - - private func inferAgentRuns(checkRuns: [CheckRunDTO], comments: [PRComment]) -> [AgentRun] { - var seen: Set = [] - var runs: [AgentRun] = [] - - for run in checkRuns { - let key = runKey(run) - guard !seen.contains(key) else { continue } - seen.insert(key) - let display = runDisplayName(run) - - let since = run.startedAt ?? run.createdAt ?? run.completedAt - let commentCount = inferCommentCount(app: run.app, comments: comments, since: since) - let status = agentStatus(run: run, commentCount: commentCount) - runs.append(AgentRun(id: display, displayName: display, status: status, commentCount: commentCount, checkConclusion: run.conclusion)) - } - - return runs.sorted { $0.displayName.localizedCaseInsensitiveCompare($1.displayName) == .orderedAscending } - } - - private func matches(checkRun: CheckRunDTO, agent: AgentConfig) -> Bool { - let pattern = agent.checkNamePattern.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() - if !pattern.isEmpty { - if checkRun.name.lowercased().contains(pattern) { - return true - } - if let appSlug = checkRun.app?.slug?.lowercased(), appSlug.contains(pattern) { - return true - } - if let appName = checkRun.app?.name?.lowercased(), appName.contains(pattern) { - return true - } - } - - let commentAuthor = agent.commentAuthor.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() - if !commentAuthor.isEmpty, let appSlug = checkRun.app?.slug?.lowercased() { - if commentAuthor.hasPrefix(appSlug) { - return true - } - } - - return false - } - - private func agentStatus(run: CheckRunDTO, commentCount: Int) -> AgentRunStatus { - if run.status != "completed" { - return .running - } - if isFailureConclusion(run.conclusion) { - return .failed - } - if commentCount > 0 { - return .waitingForComment - } - return .done - } - - private func isFailureConclusion(_ conclusion: String?) -> Bool { - guard let conclusion, !conclusion.isEmpty else { return false } - switch conclusion.lowercased() { - case "success", "neutral", "skipped": - return false - default: - return true - } - } - - private func commentCountForAgent(agent: AgentConfig, comments: [PRComment], since: Date?) -> Int { - let filtered = filterComments(comments, since: since) - let author = agent.commentAuthor.trimmingCharacters(in: .whitespacesAndNewlines) - if !author.isEmpty { - let normalizedAuthor = normalize(author) - return filtered.filter { normalize($0.author) == normalizedAuthor }.count - } - - let normalized = normalize(agent.displayName) - if normalized.isEmpty { - return 0 - } - return filtered.filter { normalize($0.author) == normalized }.count - } - - private func inferCommentCount(app: CheckRunDTO.App?, comments: [PRComment], since: Date?) -> Int { - guard let slug = app?.slug?.lowercased() else { return 0 } - let filtered = filterComments(comments, since: since) - return filtered.filter { normalize($0.author).hasPrefix(slug) }.count - } - - private func latestRun(from runs: [CheckRunDTO]) -> CheckRunDTO? { - runs.max(by: { runDate($0) < runDate($1) }) - } - - private func runDate(_ run: CheckRunDTO) -> Date { - let candidates = [run.startedAt, run.completedAt, run.createdAt].compactMap { $0 } - return candidates.max() ?? .distantPast - } - - private func filterComments(_ comments: [PRComment], since: Date?) -> [PRComment] { - guard let since else { return comments } - return comments.filter { $0.createdAt >= since } - } - - private func normalize(_ value: String) -> String { - let lowered = value.lowercased() - let removedBot = lowered.replacingOccurrences(of: "[bot]", with: "") - let allowed = removedBot.filter { $0.isLetter || $0.isNumber } - return allowed - } - - private func runKey(_ run: CheckRunDTO) -> String { - let appKey = run.app?.slug ?? run.app?.name ?? "" - return "\(appKey.lowercased())::\(run.name.lowercased())" - } - - private func runDisplayName(_ run: CheckRunDTO) -> String { - let appName = run.app?.name?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" - let runName = run.name.trimmingCharacters(in: .whitespacesAndNewlines) - guard !appName.isEmpty else { return runName } - if appName.caseInsensitiveCompare(runName) == .orderedSame { - return appName - } - if runName.isEmpty { - return appName - } - return "\(appName) — \(runName)" - } -} diff --git a/Sources/PRMonitor/Services/SystemEvents.swift b/Sources/PRMonitor/Services/SystemEvents.swift new file mode 100644 index 0000000..baaa41f --- /dev/null +++ b/Sources/PRMonitor/Services/SystemEvents.swift @@ -0,0 +1,53 @@ +import AppKit +import Network +import ServiceManagement + +/// Emits when the Mac wakes from sleep or the network comes back, so the monitor can refresh +/// immediately instead of waiting out its timer with stale data. +@MainActor +final class SystemEvents { + private let pathMonitor = NWPathMonitor() + private var observers: [NSObjectProtocol] = [] + private(set) var isOnline = true + /// Low Data Mode or a metered connection (e.g. a phone hotspot): poll less often. + private(set) var isConstrained = false + + func start(onResume: @escaping @MainActor () -> Void) { + let center = NSWorkspace.shared.notificationCenter + observers.append(center.addObserver(forName: NSWorkspace.didWakeNotification, object: nil, queue: .main) { _ in + MainActor.assumeIsolated { onResume() } + }) + + pathMonitor.pathUpdateHandler = { [weak self] path in + let online = path.status == .satisfied + let constrained = path.isConstrained || path.isExpensive + Task { @MainActor in + guard let self else { return } + self.isConstrained = constrained + let cameBack = online && !self.isOnline + self.isOnline = online + if cameBack { onResume() } + } + } + pathMonitor.start(queue: DispatchQueue(label: "PRMonitor.network")) + } +} + +/// Launch at login via `SMAppService`, which shows up in System Settings › General › Login Items. +enum LoginItem { + static var isEnabled: Bool { + SMAppService.mainApp.status == .enabled + } + + static var requiresApproval: Bool { + SMAppService.mainApp.status == .requiresApproval + } + + static func setEnabled(_ enabled: Bool) throws { + if enabled { + try SMAppService.mainApp.register() + } else { + try SMAppService.mainApp.unregister() + } + } +} diff --git a/Sources/PRMonitor/SettingsStore.swift b/Sources/PRMonitor/SettingsStore.swift deleted file mode 100644 index a46db75..0000000 --- a/Sources/PRMonitor/SettingsStore.swift +++ /dev/null @@ -1,146 +0,0 @@ -import Foundation - -final class SettingsStore: ObservableObject { - @Published var repos: [RepoConfig] = [] { - didSet { save() } - } - @Published var agents: [AgentConfig] = [] { - didSet { save() } - } - @Published var pollingIntervalSeconds: Int = 60 { - didSet { save() } - } - @Published var notifyPerAgent: Bool = false { - didSet { save() } - } - @Published var notifySummary: Bool = true { - didSet { save() } - } - @Published var githubClientId: String = "" { - didSet { save() } - } - - private let storageKey = "PRMonitorSettings" - - init() { - load() - if repos.isEmpty { - repos = [] - } - if agents.isEmpty { - agents = [ - AgentConfig(displayName: "Vercel", checkNamePattern: "vercel", commentAuthor: "vercel"), - AgentConfig(displayName: "Cursor Bugbot", checkNamePattern: "cursor", commentAuthor: "cursor"), - AgentConfig(displayName: "Devin Review", checkNamePattern: "devin", commentAuthor: "devin-ai-integration") - ] - } - } - - var enabledRepos: [RepoConfig] { - repos.filter { $0.isEnabled } - } - - func addRepo(from text: String) -> RepoConfig? { - let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) - guard !trimmed.isEmpty else { return nil } - let parts = trimmed.split(separator: "/").map(String.init) - guard parts.count == 2 else { return nil } - let owner = parts[0].trimmingCharacters(in: .whitespacesAndNewlines) - let name = parts[1].trimmingCharacters(in: .whitespacesAndNewlines) - guard isValidOwner(owner), isValidRepoName(name) else { return nil } - let repo = RepoConfig(owner: owner, name: name, isEnabled: true) - if !repos.contains(where: { $0.id == repo.id }) { - repos.append(repo) - } - return repo - } - - func setRepoEnabled(owner: String, name: String, enabled: Bool) { - let repoId = "\(owner)/\(name)" - if let index = repos.firstIndex(where: { $0.id == repoId }) { - repos[index].isEnabled = enabled - } else if enabled { - repos.append(RepoConfig(owner: owner, name: name, isEnabled: true)) - } - } - - private func load() { - guard let data = UserDefaults.standard.data(forKey: storageKey) else { return } - do { - let decoded = try JSONDecoder().decode(PersistedSettings.self, from: data) - repos = decoded.repos - agents = decoded.agents - pollingIntervalSeconds = decoded.pollingIntervalSeconds - notifyPerAgent = decoded.notifyPerAgent - notifySummary = decoded.notifySummary - githubClientId = decoded.githubClientId - } catch { - repos = [] - agents = [] - pollingIntervalSeconds = 60 - notifyPerAgent = false - notifySummary = true - githubClientId = "" - } - } - - private func save() { - let payload = PersistedSettings( - repos: repos, - agents: agents, - pollingIntervalSeconds: pollingIntervalSeconds, - notifyPerAgent: notifyPerAgent, - notifySummary: notifySummary, - githubClientId: githubClientId - ) - guard let data = try? JSONEncoder().encode(payload) else { return } - UserDefaults.standard.set(data, forKey: storageKey) - } - - private func isValidOwner(_ owner: String) -> Bool { - guard !owner.isEmpty, owner.count <= 39 else { return false } - return owner.range(of: "^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$", options: .regularExpression) != nil - } - - private func isValidRepoName(_ name: String) -> Bool { - guard !name.isEmpty else { return false } - return name.range(of: "^[A-Za-z0-9._-]+$", options: .regularExpression) != nil - } -} - -private struct PersistedSettings: Codable { - var repos: [RepoConfig] - var agents: [AgentConfig] - var pollingIntervalSeconds: Int - var notifyPerAgent: Bool - var notifySummary: Bool - var githubClientId: String - - enum CodingKeys: String, CodingKey { - case repos - case agents - case pollingIntervalSeconds - case notifyPerAgent - case notifySummary - case githubClientId - } - - init(repos: [RepoConfig], agents: [AgentConfig], pollingIntervalSeconds: Int, notifyPerAgent: Bool, notifySummary: Bool, githubClientId: String) { - self.repos = repos - self.agents = agents - self.pollingIntervalSeconds = pollingIntervalSeconds - self.notifyPerAgent = notifyPerAgent - self.notifySummary = notifySummary - self.githubClientId = githubClientId - } - - init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - repos = try container.decodeIfPresent([RepoConfig].self, forKey: .repos) ?? [] - agents = try container.decodeIfPresent([AgentConfig].self, forKey: .agents) ?? [] - pollingIntervalSeconds = try container.decodeIfPresent(Int.self, forKey: .pollingIntervalSeconds) ?? 60 - notifyPerAgent = try container.decodeIfPresent(Bool.self, forKey: .notifyPerAgent) ?? false - notifySummary = try container.decodeIfPresent(Bool.self, forKey: .notifySummary) ?? true - githubClientId = try container.decodeIfPresent(String.self, forKey: .githubClientId) ?? "" - } -} diff --git a/Sources/PRMonitor/UI/Components/Avatar.swift b/Sources/PRMonitor/UI/Components/Avatar.swift new file mode 100644 index 0000000..b76e81b --- /dev/null +++ b/Sources/PRMonitor/UI/Components/Avatar.swift @@ -0,0 +1,75 @@ +import AppKit +import SwiftUI + +/// A GitHub avatar that never flashes blank: a pulsing bone while the photo loads, then a +/// crossfade to it. The user's initial is the fallback if there's no photo. Loaded images are +/// cached for the session, so the sidebar and the Account pane show the same avatar instantly. +struct Avatar: View { + let login: String? + var size: CGFloat = 36 + + private enum Phase { case loading, loaded(NSImage), fallback } + @State private var phase: Phase = .loading + + var body: some View { + ZStack { + switch phase { + case .loading: + BoneCircle(size: size).skeletonPulse().transition(.opacity) + case let .loaded(image): + Image(nsImage: image).resizable().scaledToFill().transition(.opacity) + case .fallback: + monogram.transition(.opacity) + } + } + .frame(width: size, height: size) + .clipShape(Circle()) + .overlay(Circle().strokeBorder(.primary.opacity(0.08), lineWidth: 0.5)) + .accessibilityHidden(true) + .task(id: login) { await load() } + } + + private var monogram: some View { + Circle() + .fill(Color.accentColor.gradient) + .overlay { + if let initial = login?.first { + Text(String(initial).uppercased()) + .font(.system(size: size * 0.42, weight: .semibold, design: .rounded)) + .foregroundStyle(.white) + } else { + Image(systemName: "person.fill") + .font(.system(size: size * 0.45)) + .foregroundStyle(.white.opacity(0.9)) + } + } + } + + private func load() async { + guard let login else { phase = .fallback; return } + if let cached = AvatarCache.shared[login] { + phase = .loaded(cached) + return + } + phase = .loading + guard let url = URL(string: "https://github.com/\(login).png?size=\(Int(size * 3))"), + let (data, _) = try? await URLSession.shared.data(from: url), + let loaded = NSImage(data: data) else { + withAnimation(Motion.crossfade) { phase = .fallback } + return + } + AvatarCache.shared[login] = loaded + withAnimation(Motion.crossfade) { phase = .loaded(loaded) } + } +} + +@MainActor +private final class AvatarCache { + static let shared = AvatarCache() + private var images: [String: NSImage] = [:] + + subscript(login: String) -> NSImage? { + get { images[login.lowercased()] } + set { images[login.lowercased()] = newValue } + } +} diff --git a/Sources/PRMonitor/UI/Components/DesignSystem.swift b/Sources/PRMonitor/UI/Components/DesignSystem.swift new file mode 100644 index 0000000..cfe0f74 --- /dev/null +++ b/Sources/PRMonitor/UI/Components/DesignSystem.swift @@ -0,0 +1,227 @@ +import SwiftUI + +/// Layout metrics shared by the menu bar panel. Values follow macOS menu geometry: highlights +/// inset 5pt from the panel edge, text aligned 14pt in, so rows read like native menu items. +enum Metrics { + static let panelWidth: CGFloat = 360 + /// The panel's corner radius, published as a container shape so inner highlights can be + /// concentric with it (inner radius = outer radius − inset). + static let panelCornerRadius: CGFloat = 16 + static let edgeInset: CGFloat = 14 + static let highlightInset: CGFloat = 5 + static var rowPadding: CGFloat { edgeInset - highlightInset } + static let minimumHighlightRadius: CGFloat = 8 + static let iconButtonSize: CGFloat = 28 +} + +/// Motion tokens. High-frequency feedback (hover) is instant; state changes are short and never bounce. +enum Motion { + /// Expanding and collapsing rows: an interruptible spring with no bounce. + static let disclosure = Animation.smooth(duration: 0.25) + /// Rows moving or appearing after a refresh. Kept under 300ms, like all UI motion. + static let content = Animation.smooth(duration: 0.25) + /// Exits are shorter and softer than enters, so they don't compete for attention. + static let exit = Animation.easeOut(duration: 0.15) + /// Skeleton → content, image → image. + static let crossfade = Animation.easeOut(duration: 0.2) + static let press = Animation.snappy(duration: 0.12) + static let pressedScale: CGFloat = 0.96 +} + +extension AnyTransition { + /// Enter: fade in with a small drop. Exit: a quicker fade with a slight blur, and no travel. + static var disclosure: AnyTransition { + .asymmetric( + insertion: .opacity.combined(with: .offset(y: -4)), + removal: .opacity.combined(with: .blur(radius: 4)).animation(Motion.exit) + ) + } +} + +extension AnyTransition { + static func blur(radius: CGFloat) -> AnyTransition { + .modifier(active: BlurModifier(radius: radius), identity: BlurModifier(radius: 0)) + } +} + +private struct BlurModifier: ViewModifier { + let radius: CGFloat + func body(content: Content) -> some View { content.blur(radius: radius) } +} + +// MARK: - Status semantics + +extension PullRequestStatus { + var tint: Color { + switch self { + case .failing: .red + case .running: .blue + case .needsReview: .orange + case .ready: .green + case .quiet: .gray + } + } + + /// Each status has a distinct glyph so it never relies on color alone. + var symbol: String { + switch self { + case .failing: "xmark.circle.fill" + case .running: "arrow.trianglehead.2.clockwise.rotate.90.circle.fill" + case .needsReview: "exclamationmark.bubble.circle.fill" + case .ready: "checkmark.circle.fill" + case .quiet: "minus.circle.fill" + } + } + + var title: String { + switch self { + case .failing: "Failing" + case .running: "In progress" + case .needsReview: "Needs review" + case .ready: "Ready" + case .quiet: "No checks" + } + } +} + +extension AgentReport.State { + var tint: Color { + switch self { + case .running: .blue + case .failed: .red + case .needsReview: .orange + case .passed: .green + } + } + + var symbol: String { + switch self { + case .running: "circle.dotted" + case .failed: "xmark.circle.fill" + case .needsReview: "exclamationmark.bubble.circle.fill" + case .passed: "checkmark.circle.fill" + } + } +} + +// MARK: - Shapes + +/// A highlight shape that stays concentric with the panel's corners and falls back to a fixed +/// minimum radius away from them. +struct HighlightShape: Shape { + func path(in rect: CGRect) -> Path { + ConcentricRectangle(corners: .concentric(minimum: .fixed(Metrics.minimumHighlightRadius)), isUniform: true) + .path(in: rect) + } +} + +// MARK: - Button styles + +/// A menu-item-like row: an instant hover highlight, a slightly deeper fill while pressed. +struct RowButtonStyle: ButtonStyle { + func makeBody(configuration: Configuration) -> some View { + RowBody(configuration: configuration) + } + + private struct RowBody: View { + let configuration: Configuration + @State private var isHovered = false + @Environment(\.isEnabled) private var isEnabled + + var body: some View { + configuration.label + .contentShape(HighlightShape()) + .background { + HighlightShape() + .fill(.primary.opacity(fillOpacity)) + } + .onHover { isHovered = $0 && isEnabled } + } + + private var fillOpacity: Double { + if configuration.isPressed { return 0.12 } + return isHovered ? 0.07 : 0 + } + } +} + +/// A borderless icon button for use inside the (already glass) panel. Glass-on-glass is avoided per +/// Apple's guidance, so this uses a circular hover fill and a subtle press scale instead. +struct IconButtonStyle: ButtonStyle { + func makeBody(configuration: Configuration) -> some View { + IconBody(configuration: configuration) + } + + private struct IconBody: View { + let configuration: Configuration + @State private var isHovered = false + @Environment(\.isEnabled) private var isEnabled + + var body: some View { + configuration.label + .font(.body) + .foregroundStyle(isEnabled ? .secondary : .tertiary) + .frame(width: Metrics.iconButtonSize, height: Metrics.iconButtonSize) + .background(Circle().fill(.primary.opacity(isHovered && isEnabled ? 0.08 : 0))) + .contentShape(Circle()) + .scaleEffect(configuration.isPressed ? Motion.pressedScale : 1) + .animation(Motion.press, value: configuration.isPressed) + .onHover { isHovered = $0 } + } + } +} + +extension ButtonStyle where Self == IconButtonStyle { + static var icon: IconButtonStyle { IconButtonStyle() } +} + +// MARK: - Small components + +/// A pull request's status as a soft, two-tone symbol: the glyph in the status color on a tinted +/// disc of the same hue, in the current SF Symbols style. +struct StatusGlyph: View { + let status: PullRequestStatus + var isDraft = false + + var body: some View { + let tint: Color = isDraft ? .gray : status.tint + Image(systemName: isDraft ? "pencil.circle.fill" : status.symbol) + .font(.system(size: 19, weight: .medium)) + .symbolRenderingMode(.palette) + .foregroundStyle(tint, tint.opacity(0.18)) + .contentTransition(.symbolEffect(.replace)) + .frame(width: 20, height: 20) + .animation(.easeOut(duration: 0.2), value: status) + .accessibilityHidden(true) + } +} + +/// The smaller companion used for individual agents. +struct AgentGlyph: View { + let state: AgentReport.State + + var body: some View { + Image(systemName: state.symbol) + .font(.system(size: 12, weight: .semibold)) + .symbolRenderingMode(.palette) + .foregroundStyle(state.tint, state.tint.opacity(0.18)) + .frame(width: 14) + .accessibilityHidden(true) + } +} + +// MARK: - Formatting + +extension Date { + /// A compact age like "now", "4m", "2h" or "3d", sized for dense rows. + func compactAge(relativeTo now: Date = .now) -> String { + let minutes = Int(max(0, now.timeIntervalSince(self)) / 60) + switch minutes { + case ..<1: return "now" + case ..<60: return "\(minutes)m" + case ..<1440: return "\(minutes / 60)h" + case ..<10080: return "\(minutes / 1440)d" + default: return "\(minutes / 10080)w" + } + } +} diff --git a/Sources/PRMonitor/UI/Components/PullRequestMark.swift b/Sources/PRMonitor/UI/Components/PullRequestMark.swift new file mode 100644 index 0000000..497c6fa --- /dev/null +++ b/Sources/PRMonitor/UI/Components/PullRequestMark.swift @@ -0,0 +1,35 @@ +import SwiftUI + +/// The familiar pull request mark: a branch with two nodes, and a second branch arcing back with an +/// arrow. One definition serves the menu bar icon (via `cgPath`) and in-app artwork (as a `Shape`). +/// +/// Geometry is authored on a 16 × 16 grid with a 1.5pt stroke, matching the optical weight of +/// system menu bar symbols, and scales uniformly to any size. +struct PullRequestMark: Shape { + func path(in rect: CGRect) -> Path { + let scale = min(rect.width, rect.height) / 16 + var path = Path() + let r: CGFloat = 1.9 + + // Left branch: two nodes joined by a line. + path.addEllipse(in: CGRect(x: 3.5 - r, y: 3.4 - r, width: r * 2, height: r * 2)) + path.addEllipse(in: CGRect(x: 3.5 - r, y: 12.8 - r, width: r * 2, height: r * 2)) + path.move(to: CGPoint(x: 3.5, y: 5.3)) + path.addLine(to: CGPoint(x: 3.5, y: 10.9)) + + // Right branch: a node rising and curving back toward the left branch, ending in an arrow. + path.addEllipse(in: CGRect(x: 11.5 - r, y: 12.8 - r, width: r * 2, height: r * 2)) + path.move(to: CGPoint(x: 11.5, y: 10.9)) + path.addLine(to: CGPoint(x: 11.5, y: 5.8)) + path.addCurve(to: CGPoint(x: 9.2, y: 3.4), control1: CGPoint(x: 11.5, y: 4.4), control2: CGPoint(x: 10.6, y: 3.4)) + path.addLine(to: CGPoint(x: 7.2, y: 3.4)) + path.move(to: CGPoint(x: 8.9, y: 1.7)) + path.addLine(to: CGPoint(x: 7.2, y: 3.4)) + path.addLine(to: CGPoint(x: 8.9, y: 5.1)) + + let offset = CGPoint(x: rect.midX - 8 * scale, y: rect.midY - 8 * scale) + return path + .applying(CGAffineTransform(scaleX: scale, y: scale).concatenating(CGAffineTransform(translationX: offset.x, y: offset.y))) + .strokedPath(StrokeStyle(lineWidth: 1.5 * scale, lineCap: .round, lineJoin: .round)) + } +} diff --git a/Sources/PRMonitor/UI/Components/Skeleton.swift b/Sources/PRMonitor/UI/Components/Skeleton.swift new file mode 100644 index 0000000..d4fe651 --- /dev/null +++ b/Sources/PRMonitor/UI/Components/Skeleton.swift @@ -0,0 +1,104 @@ +import SwiftUI + +/// Loading placeholders ("bones") that mirror the geometry of the content they stand in for, so +/// nothing shifts when real data arrives, and the wait reads as "content is coming" rather than +/// an indeterminate spinner. +struct Bone: View { + var width: CGFloat? = nil + var height: CGFloat = 9 + + var body: some View { + Capsule() + .fill(.primary.opacity(0.09)) + .frame(width: width, height: height) + } +} + +struct BoneCircle: View { + var size: CGFloat + + var body: some View { + Circle() + .fill(.primary.opacity(0.09)) + .frame(width: size, height: size) + } +} + +extension View { + /// A slow, gentle breathing pulse for skeletons. Static when Reduce Motion is on. + func skeletonPulse() -> some View { + modifier(SkeletonPulse()) + } +} + +private struct SkeletonPulse: ViewModifier { + @Environment(\.accessibilityReduceMotion) private var reduceMotion + @State private var isDimmed = false + + func body(content: Content) -> some View { + content + .opacity(isDimmed ? 0.5 : 1) + .onAppear { + guard !reduceMotion else { return } + withAnimation(.easeInOut(duration: 1.1).repeatForever(autoreverses: true)) { isDimmed = true } + } + .accessibilityElement(children: .ignore) + .accessibilityLabel("Loading") + } +} + +// MARK: - Panel + +/// Stands in for the pull request list on first load. Uses the same insets, glyph size, and line +/// heights as `PullRequestRow`. +struct PullRequestListSkeleton: View { + private let rows: [(title: CGFloat, detail: CGFloat)] = [(210, 150), (170, 180), (230, 130), (150, 160)] + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + Bone(width: 110, height: 8) + .padding(.horizontal, Metrics.edgeInset) + .padding(.top, 13) + .padding(.bottom, 7) + ForEach(rows.indices, id: \.self) { index in + HStack(alignment: .top, spacing: 10) { + BoneCircle(size: 20) + VStack(alignment: .leading, spacing: 7) { + Bone(width: rows[index].title, height: 10) + Bone(width: rows[index].detail, height: 8) + } + .padding(.top, 3) + } + .padding(.leading, Metrics.edgeInset) + .padding(.vertical, 8) + } + } + .padding(.bottom, Metrics.highlightInset) + .frame(maxWidth: .infinity, alignment: .leading) + .skeletonPulse() + } +} + +// MARK: - Settings + +/// Stands in for a list of repositories or accounts: a circle and two lines per row. +struct ListRowSkeleton: View { + var count = 6 + var circleSize: CGFloat = 18 + + var body: some View { + VStack(alignment: .leading, spacing: 16) { + ForEach(0.. some View { + self + .opacity(isVisible ? 1 : 0) + .blur(radius: isVisible || reduceMotion ? 0 : 4) + .offset(y: isVisible || reduceMotion ? 0 : 8) + .animation(.smooth(duration: 0.4).delay(Double(index) * 0.08), value: isVisible) + } +} diff --git a/Sources/PRMonitor/UI/MenuBar/MenuBarLabel.swift b/Sources/PRMonitor/UI/MenuBar/MenuBarLabel.swift new file mode 100644 index 0000000..76a8b59 --- /dev/null +++ b/Sources/PRMonitor/UI/MenuBar/MenuBarLabel.swift @@ -0,0 +1,115 @@ +import AppKit +import SwiftUI + +/// The status item: a pull-request glyph with a small state badge, or an attention count. +/// +/// By default the image is a template, so macOS tints it for light/dark menu bars and the selected +/// state, as the HIG asks. The badge's *shape* carries the state (filled dot = needs attention, +/// ring = in progress, dimmed glyph = not connected), so it reads without color. When there's a +/// count it replaces the dot, since the number already says "these need you". Everything, count +/// included, is drawn into one image so the spacing is exact. +struct MenuBarLabel: View { + let summary: Monitor.Summary + let count: Int + let isColored: Bool + + var body: some View { + Image(nsImage: StatusIcon.image(for: summary, count: count, isColored: isColored)) + .accessibilityLabel("PR Monitor") + .accessibilityValue(StatusIcon.accessibilityValue(for: summary, count: count)) + } +} + +enum StatusIcon { + enum Badge { + case none, dot(NSColor), ring(NSColor) + } + + private static let glyphSize: CGFloat = 16 + private static let countSpacing: CGFloat = 4 + + static func image(for summary: Monitor.Summary, count: Int = 0, isColored: Bool) -> NSImage { + var (badge, isDimmed) = style(for: summary, isColored: isColored) + let countText = count > 0 ? NSAttributedString(string: count.formatted(), attributes: [ + .font: NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .medium), + ]) : nil + if countText != nil, case .dot = badge { badge = .none } + + let countWidth = countText.map { ceil($0.size().width) + countSpacing } ?? 0 + let badgeWidth: CGFloat = if case .none = badge { 0 } else { 5 } + let size = NSSize(width: glyphSize + badgeWidth + countWidth, height: glyphSize) + + // Flipped so the mark's top-left-origin geometry draws upright. + let image = NSImage(size: size, flipped: true) { _ in + let ink: NSColor = isColored ? .labelColor : .black + ink.withAlphaComponent(isDimmed ? 0.45 : 1).setFill() + NSBezierPath(cgPath: PullRequestMark().path(in: CGRect(x: 0, y: 0, width: glyphSize, height: glyphSize)).cgPath).fill() + + switch badge { + case .none: + break + case let .dot(color), let .ring(color): + let rect = NSRect(x: glyphSize - 1.5, y: 5, width: 6, height: 6) + // Knock out a gap around the badge so it separates cleanly from the glyph. + NSGraphicsContext.current?.compositingOperation = .destinationOut + NSBezierPath(ovalIn: rect.insetBy(dx: -1.5, dy: -1.5)).fill() + NSGraphicsContext.current?.compositingOperation = .sourceOver + let fill = isColored ? color : .black + if case .ring = badge { + let ring = NSBezierPath(ovalIn: rect.insetBy(dx: 0.75, dy: 0.75)) + ring.lineWidth = 1.5 + fill.setStroke() + ring.stroke() + } else { + fill.setFill() + NSBezierPath(ovalIn: rect).fill() + } + } + + if let countText { + let tint: NSColor = isColored ? countColor(for: summary) : .black + let tinted = NSMutableAttributedString(attributedString: countText) + tinted.addAttribute(.foregroundColor, value: tint, range: NSRange(location: 0, length: tinted.length)) + let textSize = tinted.size() + tinted.draw(at: NSPoint(x: glyphSize + badgeWidth + countSpacing, y: (glyphSize - textSize.height) / 2)) + } + return true + } + image.isTemplate = !isColored + return image + } + + private static func countColor(for summary: Monitor.Summary) -> NSColor { + switch summary { + case .failing: .systemRed + case .needsReview: .systemOrange + default: .labelColor + } + } + + /// In template mode a filled dot always means "act on this", so "ready" gets no badge there. + private static func style(for summary: Monitor.Summary, isColored: Bool) -> (Badge, dimmed: Bool) { + switch summary { + case .signedOut, .needsRepositories, .unavailable: (.none, true) + case .failing: (.dot(.systemRed), false) + case .needsReview: (.dot(.systemOrange), false) + case .running: (.ring(.systemBlue), false) + case .ready: (isColored ? .dot(.systemGreen) : .none, false) + case .idle: (.none, false) + } + } + + static func accessibilityValue(for summary: Monitor.Summary, count: Int) -> String { + let state = switch summary { + case .signedOut: "Not signed in" + case .needsRepositories: "No repositories selected" + case let .unavailable(error): error.localizedDescription + case .failing: "Checks failing" + case .needsReview: "Ready for review" + case .running: "Agents running" + case .ready: "All clear" + case .idle: "No open pull requests" + } + return count > 0 ? "\(state), \(count) need attention" : state + } +} diff --git a/Sources/PRMonitor/UI/MenuBar/MenuBarPanel.swift b/Sources/PRMonitor/UI/MenuBar/MenuBarPanel.swift new file mode 100644 index 0000000..5712656 --- /dev/null +++ b/Sources/PRMonitor/UI/MenuBar/MenuBarPanel.swift @@ -0,0 +1,324 @@ +import SwiftUI + +/// The window shown from the menu bar. The system renders it on Liquid Glass; everything inside is +/// content, so it uses plain fills and hover highlights rather than more glass. +struct MenuBarPanel: View { + @Environment(Monitor.self) private var monitor + @Environment(AppSettings.self) private var settings + @Environment(Account.self) private var account + + @Environment(\.accessibilityReduceMotion) private var reduceMotion + @State private var expanded: Set + @State private var listHeight: CGFloat = 0 + + init(initiallyExpanded: Set = []) { + _expanded = State(initialValue: initiallyExpanded) + } + + var body: some View { + VStack(spacing: 0) { + PanelHeader() + content + // Skeleton → list and empty states crossfade instead of popping. + .animation(Motion.crossfade, value: contentPhase) + Divider() + .padding(.horizontal, Metrics.edgeInset) + PanelFooter() + } + .frame(width: Metrics.panelWidth) + .containerShape(.rect(cornerRadius: Metrics.panelCornerRadius)) + // The panel's window is reused between openings, so refresh whenever it becomes key. + .onReceive(NotificationCenter.default.publisher(for: NSWindow.didBecomeKeyNotification)) { _ in + monitor.refreshIfStale() + } + } + + @ViewBuilder + private var content: some View { + switch monitor.summary { + case .signedOut: + ConnectGitHubView() + case .needsRepositories: + EmptyStateView( + symbol: "book.closed", + title: "Choose Repositories", + message: "Pick the repositories whose pull requests you want PR Monitor to watch.", + action: ("Choose Repositories…", .repositories) + ) + case let .unavailable(error) where monitor.visibleSections.isEmpty: + EmptyStateView(symbol: symbol(for: error), title: title(for: error), message: error.localizedDescription) + default: + if monitor.visibleSections.isEmpty { + if monitor.lastUpdated == nil { + PullRequestListSkeleton() + .transition(.opacity) + } else { + EmptyStateView( + symbol: "checkmark.circle", + title: "No Open Pull Requests", + message: settings.scope == .authored + ? "You don't have any open pull requests in the repositories you monitor." + : "There are no open pull requests in the repositories you monitor." + ) + } + } else { + list + .transition(.opacity) + } + } + } + + /// Identifies which kind of content is showing, so switching between them crossfades. + private var contentPhase: Int { + switch monitor.summary { + case .signedOut: 0 + case .needsRepositories: 1 + default: monitor.lastUpdated == nil ? 2 : (monitor.visibleSections.isEmpty ? 3 : 4) + } + } + + private var list: some View { + ScrollView { + // A plain VStack (not lazy) so the measured height is exact on the first frame; the + // list is at most a few dozen rows. + VStack(alignment: .leading, spacing: 0) { + ForEach(monitor.visibleSections) { section in + Section { + ForEach(section.reports) { report in + PullRequestRow(report: report, isExpanded: expansionBinding(for: report.id)) + } + } header: { + SectionHeader(section: section) + } + } + } + .padding(.bottom, Metrics.highlightInset) + .onGeometryChange(for: CGFloat.self, of: \.size.height) { listHeight = $0 } + .animation(reduceMotion ? nil : Motion.content, value: monitor.visibleReports.map(\.id)) + } + .scrollBounceBehavior(.basedOnSize) + .scrollEdgeEffectStyle(.soft, for: .top) + // Grow with the content up to most of the screen, then scroll. + .frame(height: min(max(listHeight, 1), maximumListHeight)) + } + + private var maximumListHeight: CGFloat { + let screen = NSScreen.main?.visibleFrame.height ?? 900 + return min(screen - 180, 620) + } + + private func expansionBinding(for id: String) -> Binding { + Binding( + get: { expanded.contains(id) }, + set: { isExpanded in + if isExpanded { expanded.insert(id) } else { expanded.remove(id) } + } + ) + } + + private func symbol(for error: GitHubError) -> String { + switch error { + case .offline: "wifi.slash" + case .rateLimited: "hourglass" + default: "exclamationmark.triangle" + } + } + + private func title(for error: GitHubError) -> String { + switch error { + case .offline: "You're Offline" + case .rateLimited: "Taking a Short Break" + default: "Couldn't Reach GitHub" + } + } +} + +// MARK: - Header + +private struct PanelHeader: View { + @Environment(Monitor.self) private var monitor + @Environment(AppSettings.self) private var settings + + var body: some View { + @Bindable var settings = settings + HStack(alignment: .center, spacing: 12) { + VStack(alignment: .leading, spacing: 1) { + Text("Pull Requests") + .font(.headline) + Text(subtitle) + .font(.subheadline) + .foregroundStyle(.secondary) + .contentTransition(.numericText()) + .animation(Motion.content, value: subtitle) + } + Spacer(minLength: 0) + if monitor.summary.showsContent { + Menu { + Picker("Show", selection: $settings.scope) { + Label("All Pull Requests", systemImage: "tray.full").tag(AppSettings.Scope.all) + Label("My Pull Requests", systemImage: "person").tag(AppSettings.Scope.authored) + } + .pickerStyle(.inline) + Divider() + Toggle("Hide Drafts", isOn: $settings.hidesDrafts) + } label: { + Label("Filter", systemImage: isFiltered ? "line.3.horizontal.decrease.circle.fill" : "line.3.horizontal.decrease.circle") + .labelStyle(.iconOnly) + .foregroundStyle(isFiltered ? AnyShapeStyle(.tint) : AnyShapeStyle(.secondary)) + .contentTransition(.symbolEffect(.replace)) + } + .menuStyle(.button) + .menuIndicator(.hidden) + .buttonStyle(.icon) + .help("Filter pull requests") + } + } + .padding(.leading, Metrics.edgeInset) + .padding(.trailing, 6) + .padding(.top, 12) + .padding(.bottom, 8) + } + + private var isFiltered: Bool { + settings.scope == .authored || settings.hidesDrafts + } + + private var subtitle: String { + let reports = monitor.visibleReports + switch monitor.summary { + case .signedOut: return "Not connected" + case .needsRepositories: return "No repositories selected" + case .unavailable where reports.isEmpty: return "Unavailable" + default: break + } + guard monitor.lastUpdated != nil else { return "Loading…" } + if reports.isEmpty { return "Nothing open" } + + let attention = reports.count { $0.status.needsAttention } + let running = reports.count { $0.status == .running } + var parts: [String] = [] + if attention > 0 { parts.append("\(attention) need\(attention == 1 ? "s" : "") attention") } + if running > 0 { parts.append("\(running) in progress") } + if parts.isEmpty { parts.append(reports.count == 1 ? "1 open, all clear" : "\(reports.count) open, all clear") } + if settings.scope == .authored { parts.insert("Yours", at: 0) } + return parts.joined(separator: " · ") + } +} + +private struct SectionHeader: View { + let section: Monitor.Section + + var body: some View { + HStack(spacing: 6) { + Text("\(Text(section.repository.owner + "/").foregroundStyle(.tertiary))\(section.repository.name)") + .font(.subheadline.weight(.semibold)) + .foregroundStyle(.secondary) + .lineLimit(1) + .truncationMode(.middle) + Spacer(minLength: 0) + if let error = section.error { + Image(systemName: "exclamationmark.triangle.fill") + .font(.caption) + .foregroundStyle(.orange) + .help(error.localizedDescription) + .accessibilityLabel("Couldn't refresh: \(error.localizedDescription)") + } + } + .padding(.horizontal, Metrics.edgeInset) + .padding(.top, 10) + .padding(.bottom, 4) + .frame(maxWidth: .infinity, alignment: .leading) + .accessibilityAddTraits(.isHeader) + } +} + +// MARK: - Footer + +private struct PanelFooter: View { + @Environment(Monitor.self) private var monitor + @Environment(AppRouter.self) private var router + @Environment(\.openSettings) private var openSettings + + var body: some View { + HStack(spacing: 2) { + status + .padding(.leading, Metrics.edgeInset - 4) + Spacer(minLength: 8) + + Button("Refresh", systemImage: "arrow.clockwise") { monitor.refresh() } + .symbolEffect(.rotate, options: .repeat(.continuous), isActive: monitor.isRefreshing) + .keyboardShortcut("r") + .help("Refresh (⌘R)") + .disabled(!monitor.summary.canRefresh) + + Button("Settings", systemImage: "gearshape") { router.showSettings(using: openSettings) } + .keyboardShortcut(",") + .help("Settings… (⌘,)") + + Menu { + Button("Open GitHub") { NSWorkspace.shared.open(URL(string: "https://github.com/pulls")!) } + Divider() + Button("About PR Monitor") { + NSApp.activate() + NSApp.orderFrontStandardAboutPanel() + } + Button("Quit PR Monitor") { NSApp.terminate(nil) } + .keyboardShortcut("q") + } label: { + Label("More", systemImage: "ellipsis") + } + .menuIndicator(.hidden) + .help("More") + } + .buttonStyle(.icon) + .menuStyle(.button) + .labelStyle(.iconOnly) + .padding(.trailing, 6) + .padding(.vertical, 6) + } + + @ViewBuilder + private var status: some View { + TimelineView(.periodic(from: .now, by: 30)) { _ in + Group { + if let error = monitor.lastError, monitor.summary.showsContent { + Label(error.shortDescription, systemImage: "exclamationmark.triangle.fill") + .labelStyle(.titleAndIcon) + .foregroundStyle(.orange) + .help(error.localizedDescription) + } else if let updated = monitor.lastUpdated { + Text("Updated \(updated, format: .relative(presentation: .named, unitsStyle: .wide))") + .foregroundStyle(.secondary) + } else { + Text(" ") + } + } + .font(.subheadline) + .lineLimit(1) + } + } +} + +extension Monitor.Summary { + var showsContent: Bool { + switch self { + case .signedOut, .needsRepositories: false + default: true + } + } + + var canRefresh: Bool { showsContent } +} + +extension GitHubError { + /// A few words for the footer; the full explanation is in the tooltip. + var shortDescription: String { + switch self { + case .offline: "Offline" + case .rateLimited: "Rate limited" + case .unauthorized: "Signed out" + case .server: "GitHub unavailable" + default: "Couldn't refresh" + } + } +} diff --git a/Sources/PRMonitor/UI/MenuBar/PullRequestRow.swift b/Sources/PRMonitor/UI/MenuBar/PullRequestRow.swift new file mode 100644 index 0000000..02a70e9 --- /dev/null +++ b/Sources/PRMonitor/UI/MenuBar/PullRequestRow.swift @@ -0,0 +1,197 @@ +import SwiftUI + +/// One pull request, in two light lines: the title, then a colored status phrase with the PR's +/// details. Clicking opens it on GitHub, like choosing a menu item; the chevron reveals each agent. +struct PullRequestRow: View { + let report: PullRequestReport + @Binding var isExpanded: Bool + + @Environment(\.accessibilityReduceMotion) private var reduceMotion + @Environment(\.openURL) private var openURL + + private var pr: PullRequest { report.pullRequest } + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + HStack(alignment: .center, spacing: 0) { + Button { openURL(pr.url) } label: { summary } + .buttonStyle(RowButtonStyle()) + .accessibilityElement(children: .combine) + .accessibilityLabel(accessibilityLabel) + .accessibilityHint("Opens the pull request on GitHub") + + disclosureButton + } + + if isExpanded { + AgentList(report: report) + .transition(reduceMotion ? .opacity : .disclosure) + } + } + .padding(.horizontal, Metrics.highlightInset) + .contextMenu { contextMenu } + } + + // MARK: - Summary + + private var summary: some View { + HStack(alignment: .firstTextBaseline, spacing: 10) { + StatusGlyph(status: report.status, isDraft: pr.isDraft && report.status == .quiet) + .alignmentGuide(.firstTextBaseline) { $0[VerticalAlignment.center] + 4 } + + VStack(alignment: .leading, spacing: 2) { + Text(pr.title) + .font(.body) + .foregroundStyle(.primary) + .lineLimit(2) + .multilineTextAlignment(.leading) + detailLine + } + .frame(maxWidth: .infinity, alignment: .leading) + } + .padding(.leading, Metrics.rowPadding) + .padding(.trailing, 2) + .padding(.vertical, 6) + .frame(maxWidth: .infinity, alignment: .leading) + } + + /// "3 threads · #482 · hasaam · 3m". The glyph already says ready/failed/running, so the line + /// only leads with what the glyph can't: which agent failed, how many threads, how far along. + private var detailLine: some View { + var details = ["#\(pr.number)"] + if let author = pr.author { details.append(author) } + details.append(pr.updatedAt.compactAge()) + if pr.isDraft { details.append("Draft") } + + return HStack(spacing: 0) { + if let statusDetail { + Text(statusDetail + " · ").foregroundStyle(report.status.tint) + } + Text(details.joined(separator: " · ")) + .foregroundStyle(.secondary) + if pr.mergeable == .conflicting { + Text(" · Conflicts").foregroundStyle(.red) + } + } + .font(.subheadline) + .lineLimit(1) + } + + /// The part of the status the glyph can't express, or nil when the glyph says it all. + private var statusDetail: String? { + switch report.status { + case .failing: + let failed = report.agents.filter { $0.state == .failed }.map(\.name) + guard let first = failed.first else { return nil } + return failed.count == 1 ? first : "\(first) +\(failed.count - 1)" + case .needsReview: + let threads = report.openThreadCount + if threads > 0 { return threads == 1 ? "1 thread" : "\(threads) threads" } + return "Changes requested" + case .running: + return "\(report.finishedAgentCount) of \(report.agents.count)" + case .ready: + return pr.reviewDecision == .approved ? "Approved" : nil + case .quiet: + return nil + } + } + + /// Full wording for VoiceOver, which can't see the glyph. + private var spokenStatus: String { + switch report.status { + case .failing: statusDetail.map { "\($0) failed" } ?? "Failing" + case .needsReview: statusDetail.map { "\($0) to review" } ?? "Needs review" + case .running: "Running, \(statusDetail ?? "")" + case .ready: pr.reviewDecision == .approved ? "Ready, approved" : "Ready" + case .quiet: "No checks yet" + } + } + + // MARK: - Disclosure + + private var disclosureButton: some View { + Button { + withAnimation(reduceMotion ? nil : Motion.disclosure) { isExpanded.toggle() } + } label: { + Image(systemName: "chevron.right") + .font(.caption2.weight(.bold)) + .foregroundStyle(.tertiary) + .rotationEffect(.degrees(isExpanded ? 90 : 0)) + } + .buttonStyle(.icon) + .disabled(report.agents.isEmpty) + .opacity(report.agents.isEmpty ? 0 : 1) + .help(isExpanded ? "Hide agents" : "Show agents") + .accessibilityLabel(isExpanded ? "Hide agents" : "Show agents") + } + + // MARK: - Context menu + + @ViewBuilder + private var contextMenu: some View { + Button("Open Pull Request", systemImage: "arrow.up.right.square") { openURL(pr.url) } + Button("Open Checks", systemImage: "checklist") { openURL(pr.checksURL) } + Divider() + Button("Copy Link", systemImage: "link") { copy(pr.url.absoluteString) } + Button("Copy Title", systemImage: "doc.on.doc") { copy("#\(pr.number) \(pr.title)") } + } + + private func copy(_ string: String) { + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(string, forType: .string) + } + + private var accessibilityLabel: String { + var parts = ["\(pr.title), pull request \(pr.number)", spokenStatus] + if pr.isDraft { parts.append("Draft") } + if pr.mergeable == .conflicting { parts.append("Has conflicts") } + parts += report.agents.map { "\($0.name): \($0.summary)" } + return parts.joined(separator: ", ") + } +} + +// MARK: - Agent list + +/// The expanded per-agent breakdown: quiet, compact rows that link to each check or review. +private struct AgentList: View { + let report: PullRequestReport + @Environment(\.openURL) private var openURL + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + ForEach(report.agents) { agent in + Button { + openURL(agent.url ?? report.pullRequest.url) + } label: { + HStack(spacing: 7) { + AgentGlyph(state: agent.state) + Text(agent.name) + .foregroundStyle(.secondary) + .lineLimit(1) + Spacer(minLength: 8) + Text(detail(for: agent)) + .foregroundStyle(.tertiary) + .monospacedDigit() + .lineLimit(1) + } + .font(.subheadline) + .padding(.vertical, 3) + // Align with the title column: glyph (20) + spacing (10). + .padding(.leading, Metrics.rowPadding + 30) + .padding(.trailing, Metrics.rowPadding) + .frame(maxWidth: .infinity, alignment: .leading) + } + .buttonStyle(RowButtonStyle()) + .help(agent.url == nil ? "Open pull request" : "Open details") + .accessibilityLabel("\(agent.name), \(agent.summary)") + } + } + .padding(.bottom, 6) + } + + private func detail(for agent: AgentReport) -> String { + guard let finished = agent.finishedAt, agent.state != .running else { return agent.summary } + return "\(agent.summary) · \(finished.compactAge())" + } +} diff --git a/Sources/PRMonitor/UI/Settings/AccountPane.swift b/Sources/PRMonitor/UI/Settings/AccountPane.swift new file mode 100644 index 0000000..ddf80bd --- /dev/null +++ b/Sources/PRMonitor/UI/Settings/AccountPane.swift @@ -0,0 +1,184 @@ +import SwiftUI + +struct AccountPane: View { + @Environment(Account.self) private var account + @Environment(AppSettings.self) private var settings + @State private var token = "" + + var body: some View { + @Bindable var settings = settings + Form { + switch account.state { + case let .signedIn(credential): + signedIn(credential) + case let .authorizing(authorization): + authorizing(authorization) + case .verifying: + Section { + HStack(spacing: 12) { + BoneCircle(size: 44) + VStack(alignment: .leading, spacing: 7) { + Bone(width: 120, height: 11) + Bone(width: 170, height: 8) + } + } + .padding(.vertical, 2) + .skeletonPulse() + } header: { + Text("GitHub") + } footer: { + Text("Verifying with GitHub…") + } + case .signedOut: + signInOptions + } + + Section { + TextField("OAuth app client ID", text: $settings.oauthClientIDOverride, prompt: Text(bundledClientIDPrompt)) + .autocorrectionDisabled() + } header: { + Text("Advanced") + } footer: { + Text("Only needed for “Sign in with GitHub” when you build PR Monitor yourself. Create an OAuth app with device flow enabled at github.com/settings/developers.") + } + } + .formStyle(.grouped) + } + + // MARK: - Signed in + + private func signedIn(_ credential: Account.Credential) -> some View { + Section { + HStack(spacing: 12) { + Avatar(login: credential.login, size: 44) + VStack(alignment: .leading, spacing: 2) { + Text(credential.login ?? "GitHub account") + .font(.headline) + Text(credential.source.label) + .font(.subheadline) + .foregroundStyle(.secondary) + } + Spacer() + Button("Sign Out") { account.signOut() } + } + .padding(.vertical, 2) + } header: { + Text("GitHub") + } footer: { + Text("Your token is stored in your login keychain and is only ever sent to api.github.com.") + } + } + + // MARK: - Device flow in progress + + private func authorizing(_ authorization: DeviceFlow.Authorization) -> some View { + Section { + VStack(spacing: 10) { + Text("Enter this code on GitHub") + .font(.subheadline) + .foregroundStyle(.secondary) + Text(authorization.userCode) + .font(.system(.largeTitle, design: .monospaced).weight(.semibold)) + .tracking(2) + .textSelection(.enabled) + .accessibilityLabel("Code: \(authorization.userCode.map(String.init).joined(separator: " "))") + Text("It's been copied to your clipboard.") + .font(.caption) + .foregroundStyle(.secondary) + HStack { + Button("Cancel", role: .cancel) { account.cancelSignIn() } + Button("Copy Code") { + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(authorization.userCode, forType: .string) + } + Button("Open GitHub") { NSWorkspace.shared.open(authorization.verificationURL) } + .buttonStyle(.borderedProminent) + } + .padding(.top, 4) + HStack(spacing: 6) { + ProgressView().controlSize(.small) + Text("Waiting for you to approve…") + .font(.caption) + .foregroundStyle(.secondary) + } + } + .frame(maxWidth: .infinity) + .padding(.vertical, 8) + } header: { + Text("Sign in with GitHub") + } + } + + // MARK: - Signed out + + @ViewBuilder + private var signInOptions: some View { + Section { + option( + title: "GitHub CLI", + detail: GitHubCLI.isInstalled + ? "Use the account you're signed in to with gh." + : "Install with `brew install gh`, then run `gh auth login`.", + button: "Use GitHub CLI", + isEnabled: GitHubCLI.isInstalled + ) { account.signInWithGitHubCLI() } + + option( + title: "Sign in with GitHub", + detail: settings.oauthClientID.isEmpty + ? "Requires an OAuth app client ID (see Advanced)." + : "Approve PR Monitor in your browser with a one-time code.", + button: "Sign In…", + isEnabled: !settings.oauthClientID.isEmpty + ) { account.signInWithDeviceFlow(clientID: settings.oauthClientID) } + + VStack(alignment: .leading, spacing: 8) { + Text("Personal access token") + Text("A classic token with the repo scope, or a fine-grained token with read access to pull requests, checks and commit statuses.") + .font(.subheadline) + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + HStack { + SecureField("Token", text: $token, prompt: Text("ghp_… or github_pat_…")) + .labelsHidden() + .onSubmit(useToken) + Button("Use Token", action: useToken) + .disabled(token.trimmed.isEmpty) + } + } + .padding(.vertical, 2) + } header: { + Text("Connect to GitHub") + } footer: { + if let problem = account.problem { + Text(problem).foregroundStyle(.red) + } + } + } + + private func option(title: String, detail: LocalizedStringKey, button: String, isEnabled: Bool, action: @escaping () -> Void) -> some View { + HStack(alignment: .center, spacing: 12) { + VStack(alignment: .leading, spacing: 2) { + Text(title) + Text(detail) + .font(.subheadline) + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + } + Spacer() + Button(button, action: action) + .disabled(!isEnabled) + } + .padding(.vertical, 2) + } + + private func useToken() { + account.signIn(personalAccessToken: token) + token = "" + } + + private var bundledClientIDPrompt: String { + let bundled = (Bundle.main.object(forInfoDictionaryKey: "GitHubOAuthClientID") as? String)?.trimmed ?? "" + return bundled.isEmpty ? "Not set" : "Using built-in \(bundled.prefix(8))…" + } +} diff --git a/Sources/PRMonitor/UI/Settings/AgentsPane.swift b/Sources/PRMonitor/UI/Settings/AgentsPane.swift new file mode 100644 index 0000000..49cac04 --- /dev/null +++ b/Sources/PRMonitor/UI/Settings/AgentsPane.swift @@ -0,0 +1,221 @@ +import SwiftUI + +struct AgentsPane: View { + @Environment(AppSettings.self) private var settings + @Environment(Monitor.self) private var monitor + @State private var editing: Agent? + + var body: some View { + @Bindable var settings = settings + Form { + Section("Track") { + ModeOption( + title: "Automatic", + detail: "Every CI system, deployment, and AI reviewer that reports on a pull request. Jobs from the same integration are grouped.", + isSelected: settings.agentMode == .automatic + ) { settings.agentMode = .automatic } + ModeOption( + title: "Only agents I choose", + detail: "Only the agents you add count toward a pull request's status.", + isSelected: settings.agentMode == .custom + ) { settings.agentMode = .custom } + } + + switch settings.agentMode { + case .automatic: + detectedSection + case .custom: + configuredSection + } + } + .formStyle(.grouped) + .sheet(item: $editing) { agent in + AgentEditor(agent: agent) { saved in + if let index = settings.agents.firstIndex(where: { $0.id == saved.id }) { + settings.agents[index] = saved + } else { + settings.agents.append(saved) + } + } + } + } + + // MARK: - Automatic + + @ViewBuilder + private var detectedSection: some View { + let detected = monitor.discoveredAgents + Section { + if detected.isEmpty { + Text("Agents appear here once they report on an open pull request.") + .foregroundStyle(.secondary) + } else { + ForEach(detected) { agent in + AgentSummaryRow(agent: agent) + } + } + } header: { + Text("Seen on Your Pull Requests") + } + } + + // MARK: - Custom + + @ViewBuilder + private var configuredSection: some View { + Section { + if settings.agents.isEmpty { + Text("Add the checks and reviewers you care about.") + .foregroundStyle(.secondary) + } + ForEach(settings.agents) { agent in + HStack { + AgentSummaryRow(agent: agent) + Spacer() + Button("Edit") { editing = agent } + .buttonStyle(.borderless) + Button(role: .destructive) { + settings.agents.removeAll { $0.id == agent.id } + } label: { + Image(systemName: "minus.circle.fill").symbolRenderingMode(.hierarchical) + } + .buttonStyle(.borderless) + .foregroundStyle(.secondary) + .accessibilityLabel("Remove \(agent.name)") + } + } + } header: { + HStack { + Text("Agents") + Spacer() + addMenu + } + } + } + + private var addMenu: some View { + let configured = Set(settings.agents.map { Identity.normalize($0.login + $0.checkPattern) }) + let isNew: (Agent) -> Bool = { !configured.contains(Identity.normalize($0.login + $0.checkPattern)) } + let suggestions = monitor.discoveredAgents.filter(isNew) + let presets = Agent.presets.filter(isNew) + + return Menu { + if !suggestions.isEmpty { + Section("Seen on Your Pull Requests") { + ForEach(suggestions) { agent in + Button(agent.name) { settings.agents.append(Agent(name: agent.name, checkPattern: agent.checkPattern, login: agent.login)) } + } + } + } + Section("Popular") { + ForEach(presets, id: \.name) { agent in + Button(agent.name) { settings.agents.append(Agent(name: agent.name, checkPattern: agent.checkPattern, login: agent.login)) } + } + } + Divider() + Button("Custom Agent…") { editing = Agent(name: "") } + } label: { + Image(systemName: "plus") + .font(.system(size: 12, weight: .semibold)) + .frame(width: 22, height: 22) + } + .menuStyle(.button) + .menuIndicator(.hidden) + .buttonStyle(.borderless) + .foregroundStyle(.secondary) + .fixedSize() + .help("Add an agent") + .accessibilityLabel("Add an agent") + } +} + +/// One choice in an iOS-style checkmark list: title and description, checkmark when selected. +private struct ModeOption: View { + let title: String + let detail: String + let isSelected: Bool + let select: () -> Void + + var body: some View { + Button(action: select) { + HStack(alignment: .center, spacing: 12) { + VStack(alignment: .leading, spacing: 2) { + Text(title).foregroundStyle(.primary) + Text(detail) + .font(.subheadline) + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + } + Spacer(minLength: 8) + Image(systemName: "checkmark") + .font(.body.weight(.semibold)) + .foregroundStyle(.tint) + .opacity(isSelected ? 1 : 0) + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityAddTraits(isSelected ? [.isSelected, .isButton] : .isButton) + } +} + +private struct AgentSummaryRow: View { + let agent: Agent + + var body: some View { + VStack(alignment: .leading, spacing: 2) { + Text(agent.name) + Text(matchDescription) + .font(.subheadline) + .foregroundStyle(.secondary) + } + } + + private var matchDescription: String { + var parts: [String] = [] + if !agent.checkPattern.trimmed.isEmpty { parts.append("Checks matching “\(agent.checkPattern)”") } + if !agent.login.trimmed.isEmpty { parts.append("Reviews by @\(agent.login)") } + return parts.joined(separator: " · ") + } +} + +private struct AgentEditor: View { + @State var agent: Agent + let save: (Agent) -> Void + @Environment(\.dismiss) private var dismiss + + var body: some View { + VStack(spacing: 0) { + Form { + Section { + TextField("Name", text: $agent.name, prompt: Text("Cursor Bugbot")) + } header: { + Text(agent.name.isEmpty ? "New Agent" : agent.name) + } + Section { + TextField("Check name contains", text: $agent.checkPattern, prompt: Text("cursor")) + .autocorrectionDisabled() + TextField("Bot account", text: $agent.login, prompt: Text("cursor")) + .autocorrectionDisabled() + } footer: { + Text("Checks match by name, app, or status creator. The bot account matches review requests, reviews, and review threads. Fill in at least one.") + } + } + .formStyle(.grouped) + + HStack { + Spacer() + Button("Cancel", role: .cancel) { dismiss() } + .keyboardShortcut(.cancelAction) + Button("Save") { + save(agent) + dismiss() + } + .keyboardShortcut(.defaultAction) + .disabled(!agent.isValid) + } + .padding([.horizontal, .bottom], 20) + } + .frame(width: 420, height: 340) + } +} diff --git a/Sources/PRMonitor/UI/Settings/RepositoriesPane.swift b/Sources/PRMonitor/UI/Settings/RepositoriesPane.swift new file mode 100644 index 0000000..7b9261e --- /dev/null +++ b/Sources/PRMonitor/UI/Settings/RepositoriesPane.swift @@ -0,0 +1,246 @@ +import SwiftUI + +struct RepositoriesPane: View { + @Environment(AppSettings.self) private var settings + @State private var isPickerPresented = false + + var body: some View { + @Bindable var settings = settings + Group { + if settings.repositories.isEmpty { + ContentUnavailableView { + Label("No Repositories", systemImage: "book.closed") + } description: { + Text("Choose the repositories whose pull requests you want to monitor.") + } actions: { + Button("Add Repositories…") { isPickerPresented = true } + .buttonStyle(.borderedProminent) + } + } else { + Form { + Section { + ForEach($settings.repositories) { $repository in + RepositoryRow(repository: $repository) { settings.untrack(repository.id) } + } + } header: { + HStack { + Text("Monitored Repositories") + Spacer() + AddButton(help: "Add repositories") { isPickerPresented = true } + } + } footer: { + Text("Turn a repository off to pause it without losing it.") + } + } + .formStyle(.grouped) + } + } + .sheet(isPresented: $isPickerPresented) { + RepositoryPicker() + } + } +} + +private struct RepositoryRow: View { + @Binding var repository: TrackedRepository + let remove: () -> Void + + var body: some View { + HStack(spacing: 10) { + VStack(alignment: .leading, spacing: 2) { + Text(repository.id.name) + Text(repository.id.owner) + .font(.subheadline) + .foregroundStyle(.secondary) + } + .opacity(repository.isEnabled ? 1 : 0.5) + Spacer() + Toggle("Monitor \(repository.id.fullName)", isOn: $repository.isEnabled) + .labelsHidden() + Button(role: .destructive, action: remove) { + Image(systemName: "minus.circle.fill") + .symbolRenderingMode(.hierarchical) + } + .buttonStyle(.borderless) + .foregroundStyle(.secondary) + .help("Stop monitoring \(repository.id.fullName)") + .accessibilityLabel("Remove \(repository.id.fullName)") + } + .contextMenu { + Button("Open on GitHub") { NSWorkspace.shared.open(repository.id.url) } + Button("Remove", role: .destructive, action: remove) + } + } +} + +/// Search the repositories you can access, or paste any `owner/name` or GitHub URL. +private struct RepositoryPicker: View { + @Environment(AppSettings.self) private var settings + @Environment(Account.self) private var account + @Environment(\.dismiss) private var dismiss + + @State private var query = "" + @State private var repositories: [RemoteRepository] = [] + @State private var isLoading = false + @State private var loadError: String? + @FocusState private var isSearchFocused: Bool + + var body: some View { + VStack(spacing: 0) { + VStack(alignment: .leading, spacing: 10) { + Text("Add Repositories") + .font(.headline) + TextField("Search, or paste owner/name or a GitHub URL", text: $query) + .textFieldStyle(.roundedBorder) + .focused($isSearchFocused) + .onSubmit(addTypedRepository) + } + .padding(16) + + Divider() + + List { + if let typed = typedRepository { + Button { + addTypedRepository() + } label: { + Label("Add \(typed.fullName)", systemImage: "plus.circle.fill") + } + .buttonStyle(.borderless) + } + ForEach(filtered) { repository in + RemoteRepositoryRow(repository: repository, isTracked: settings.isTracking(repository.id)) { + if settings.isTracking(repository.id) { + settings.untrack(repository.id) + } else { + settings.track(repository.id) + } + } + } + } + .listStyle(.inset) + .overlay { overlay } + .animation(Motion.crossfade, value: repositories.isEmpty) + + Divider() + + HStack { + Text("\(settings.repositories.count) monitored") + .font(.subheadline) + .foregroundStyle(.secondary) + Spacer() + Button("Done") { dismiss() } + .keyboardShortcut(.defaultAction) + } + .padding(12) + } + .frame(width: 460, height: 520) + .task { await load() } + .onAppear { isSearchFocused = true } + } + + @ViewBuilder + private var overlay: some View { + if isLoading && repositories.isEmpty { + ListRowSkeleton(count: 7) + .padding(.horizontal, 22) + .padding(.top, 14) + .frame(maxHeight: .infinity, alignment: .top) + .transition(.opacity) + } else if let loadError, repositories.isEmpty { + ContentUnavailableView("Couldn't Load Repositories", systemImage: "exclamationmark.triangle", description: Text(loadError)) + } else if !isLoading, filtered.isEmpty, typedRepository == nil { + ContentUnavailableView.search(text: query) + } + } + + private var filtered: [RemoteRepository] { + let text = query.trimmed + guard !text.isEmpty else { return repositories } + return repositories.filter { $0.id.fullName.localizedStandardContains(text) } + } + + /// A parsable repository that isn't in the list (e.g. from an org the token can see but doesn't belong to). + private var typedRepository: RepositoryID? { + guard let id = RepositoryID(parsing: query), !settings.isTracking(id) else { return nil } + return repositories.contains { $0.id == id } ? nil : id + } + + private func addTypedRepository() { + guard let id = RepositoryID(parsing: query) else { return } + settings.track(id) + query = "" + } + + private func load() async { + guard let token = account.credential?.token else { + loadError = "Sign in to see your repositories." + return + } + isLoading = true + defer { isLoading = false } + do { + repositories = try await GitHubClient(token: token).viewerRepositories() + } catch { + loadError = error.localizedDescription + } + } +} + +private struct RemoteRepositoryRow: View { + let repository: RemoteRepository + let isTracked: Bool + let toggle: () -> Void + + var body: some View { + Button(action: toggle) { + HStack(spacing: 10) { + Image(systemName: isTracked ? "checkmark.circle.fill" : "circle") + .font(.title3) + .foregroundStyle(isTracked ? AnyShapeStyle(.tint) : AnyShapeStyle(.tertiary)) + .contentTransition(.symbolEffect(.replace)) + VStack(alignment: .leading, spacing: 2) { + HStack(spacing: 4) { + Text(repository.id.fullName) + .foregroundStyle(.primary) + if repository.isPrivate { + Image(systemName: "lock.fill") + .font(.caption2) + .foregroundStyle(.secondary) + .accessibilityLabel("Private") + } + } + if let description = repository.description, !description.isEmpty { + Text(description) + .font(.subheadline) + .foregroundStyle(.secondary) + .lineLimit(1) + } + } + Spacer(minLength: 0) + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityAddTraits(isTracked ? .isSelected : []) + } +} + +/// The small "+" that sits at the trailing edge of a section header. +struct AddButton: View { + let help: String + let action: () -> Void + + var body: some View { + Button(action: action) { + Image(systemName: "plus") + .font(.system(size: 12, weight: .semibold)) + .frame(width: 22, height: 22) + .contentShape(Circle()) + } + .buttonStyle(.borderless) + .foregroundStyle(.secondary) + .help(help) + .accessibilityLabel(help) + } +} diff --git a/Sources/PRMonitor/UI/Settings/SettingsView.swift b/Sources/PRMonitor/UI/Settings/SettingsView.swift new file mode 100644 index 0000000..0a9704c --- /dev/null +++ b/Sources/PRMonitor/UI/Settings/SettingsView.swift @@ -0,0 +1,340 @@ +import SwiftUI +import UserNotifications + +/// Settings in the style of System Settings: a sidebar with the account at the top and colored +/// icon tiles, and a detail pane whose toolbar holds that pane's actions. +struct SettingsView: View { + @Environment(AppRouter.self) private var router + + var body: some View { + NavigationSplitView { + SettingsSidebar() + .toolbar(removing: .sidebarToggle) + } detail: { + detail + .navigationTitle(router.settingsTab.title) + } + .frame(minWidth: 720, idealWidth: 760, minHeight: 500, idealHeight: 560) + // A menu bar app has no Dock icon; while Settings is open it behaves like a regular app + // (Dock, ⌘-Tab, app menu), then steps back when the window closes. + .onAppear { DockPresence.show() } + .onDisappear { DockPresence.hide() } + } + + @ViewBuilder + private var detail: some View { + switch router.settingsTab { + case .account: AccountPane() + case .general: GeneralPane() + case .notifications: NotificationsPane() + case .repositories: RepositoriesPane() + case .agents: AgentsPane() + } + } +} + +enum DockPresence { + @MainActor static func show() { + NSApp.setActivationPolicy(.regular) + NSApp.activate() + } + + @MainActor static func hide() { + NSApp.setActivationPolicy(.accessory) + } +} + +extension AppRouter.SettingsTab { + var title: String { + switch self { + case .account: "Account" + case .general: "General" + case .notifications: "Notifications" + case .repositories: "Repositories" + case .agents: "Agents" + } + } + + var symbol: String { + switch self { + case .account: "person.crop.circle.fill" + case .general: "gearshape" + case .notifications: "bell.badge" + case .repositories: "book.closed" + case .agents: "sparkles" + } + } +} + +// MARK: - Sidebar + +/// A neutral sidebar in the current iOS/iPadOS style. A system `List` always paints selection in the +/// accent color, so rows are drawn here: +/// - selection is a soft gray pill with primary-color text, and the selected glyph goes to full strength; +/// - hover is a barely-there wash, shown instantly, so it never competes with the selection; +/// - glyphs take the label's font, in a fixed-width column so titles align; +/// - everything scales with the user's Sidebar Icon Size preference, and arrow keys move the selection. +private struct SettingsSidebar: View { + @Environment(AppRouter.self) private var router + @Environment(Account.self) private var account + @FocusState private var isFocused: Bool + + private let order: [AppRouter.SettingsTab] = [.account, .general, .notifications, .repositories, .agents] + + var body: some View { + ScrollView { + // One even rhythm between rows; only the account row gets breathing room below it. + VStack(alignment: .leading, spacing: 2) { + ForEach(order, id: \.self) { tab in + SidebarRow(tab: tab, isSelected: router.settingsTab == tab) { + router.settingsTab = tab + } + .padding(.bottom, tab == .account ? 8 : 0) + } + } + .padding(.horizontal, 10) + .padding(.vertical, 8) + } + .scrollBounceBehavior(.basedOnSize) + .focusable() + .focused($isFocused) + .focusEffectDisabled() + .onKeyPress(.upArrow) { move(by: -1) } + .onKeyPress(.downArrow) { move(by: 1) } + // Wide enough for "Notifications" at the Large sidebar size, like System Settings. + .navigationSplitViewColumnWidth(min: 215, ideal: 230, max: 300) + .frame(minWidth: 215) + } + + private func move(by offset: Int) -> KeyPress.Result { + guard let index = order.firstIndex(of: router.settingsTab) else { return .ignored } + router.settingsTab = order[max(0, min(order.count - 1, index + offset))] + return .handled + } +} + +private struct SidebarRow: View { + let tab: AppRouter.SettingsTab + let isSelected: Bool + let select: () -> Void + + @Environment(Account.self) private var account + @Environment(\.sidebarRowSize) private var rowSize + @State private var isHovered = false + + var body: some View { + Button(action: select) { + Group { + if tab == .account { + AccountSidebarRow(credential: account.credential) + } else { + HStack(spacing: 8) { + Image(systemName: tab.symbol) + .foregroundStyle(isSelected ? .primary : .secondary) + .frame(width: iconColumn) + Text(tab.title) + .foregroundStyle(.primary) + .lineLimit(1) + } + .font(font) + .frame(minHeight: rowHeight) + } + } + .padding(.horizontal, 8) + .frame(maxWidth: .infinity, alignment: .leading) + .contentShape(.rect(cornerRadius: 8)) + .background { + RoundedRectangle(cornerRadius: 8, style: .continuous) + // Hover is a whisper; only the selection reads as a solid pill. + .fill(.primary.opacity(isSelected ? 0.1 : (isHovered ? 0.035 : 0))) + } + } + .buttonStyle(.plain) + .onHover { isHovered = $0 } + .accessibilityLabel(tab == .account ? (account.credential?.login ?? "Account") : tab.title) + .accessibilityAddTraits(isSelected ? .isSelected : []) + } + + private var font: Font { + switch rowSize { + case .small: .subheadline + case .large: .title3 + default: .body + } + } + + private var rowHeight: CGFloat { + switch rowSize { + case .small: 24 + case .large: 34 + default: 28 + } + } + + private var iconColumn: CGFloat { + switch rowSize { + case .small: 16 + case .large: 22 + default: 18 + } + } +} + +/// The account row at the top of the sidebar, like System Settings' Apple Account row. It's the +/// only custom row, so it follows the user's Sidebar Icon Size preference the way system rows do. +private struct AccountSidebarRow: View { + let credential: Account.Credential? + @Environment(\.sidebarRowSize) private var rowSize + + var body: some View { + HStack(spacing: 8) { + Avatar(login: credential?.login, size: avatarSize) + VStack(alignment: .leading, spacing: 0) { + Text(credential?.login ?? "Connect GitHub") + .fontWeight(.semibold) + .lineLimit(1) + Text(credential == nil ? "Not signed in" : "GitHub") + .font(subtitleFont) + .foregroundStyle(.secondary) + .lineLimit(1) + } + } + .padding(.vertical, 3) + } + + private var avatarSize: CGFloat { + switch rowSize { + case .small: 24 + case .large: 34 + default: 28 + } + } + + private var subtitleFont: Font { + switch rowSize { + case .small: .caption + case .large: .callout + default: .subheadline + } + } +} + +// MARK: - General + +private struct GeneralPane: View { + @Environment(AppSettings.self) private var settings + @State private var launchesAtLogin = LoginItem.isEnabled + @State private var loginItemError: String? + + var body: some View { + @Bindable var settings = settings + Form { + Section { + Picker("Check for changes", selection: $settings.refreshInterval) { + ForEach(AppSettings.refreshIntervals, id: \.self) { interval in + Text(Duration.seconds(interval).formatted(.units(allowed: [.minutes, .seconds], width: .wide))) + .tag(interval) + } + } + } footer: { + Text("How often to check while agents are running. PR Monitor checks less often once everything has settled, and waits out GitHub rate limits on its own.") + } + + Section("Menu Bar") { + Picker("Show pull requests", selection: $settings.scope) { + Text("All open pull requests").tag(AppSettings.Scope.all) + Text("Only ones I opened").tag(AppSettings.Scope.authored) + } + Toggle("Hide drafts", isOn: $settings.hidesDrafts) + Toggle(isOn: $settings.showsAttentionCount) { + Text("Show attention count") + Text("The number of pull requests that are failing or ready for your review.") + } + Toggle(isOn: $settings.usesColoredStatusIcon) { + Text("Use colored status icon") + Text("Otherwise the icon matches the other menu bar icons.") + } + } + + Section { + Toggle("Open at login", isOn: $launchesAtLogin) + .onChange(of: launchesAtLogin) { _, enabled in setLaunchAtLogin(enabled) } + } footer: { + if let loginItemError { + Text(loginItemError).foregroundStyle(.red) + } + } + } + .formStyle(.grouped) + } + + private func setLaunchAtLogin(_ enabled: Bool) { + do { + try LoginItem.setEnabled(enabled) + loginItemError = LoginItem.requiresApproval ? "Approve PR Monitor in System Settings › General › Login Items." : nil + } catch { + loginItemError = error.localizedDescription + launchesAtLogin = LoginItem.isEnabled + } + } +} + +// MARK: - Notifications + +private struct NotificationsPane: View { + @Environment(AppSettings.self) private var settings + @State private var status: UNAuthorizationStatus? + @State private var testResult: String? + + var body: some View { + @Bindable var settings = settings + Form { + Section { + Toggle(isOn: $settings.notifiesWhenSettled) { + Text("When agents finish") + Text("Once every check and review bot has reported on the latest push.") + } + Toggle(isOn: $settings.notifiesOnNewFeedback) { + Text("When new feedback arrives") + Text("If a bot leaves review threads after a pull request has settled.") + } + Toggle(isOn: $settings.notifiesPerAgent) { + Text("When each agent finishes") + Text("A separate notification for every check and reviewer.") + } + } + + Section { + LabeledContent { + if status == .denied { + Button("Open System Settings…") { + NSWorkspace.shared.open(URL(string: "x-apple.systempreferences:com.apple.Notifications-Settings.extension")!) + } + } else { + Button("Send Test") { + Task { + testResult = await Notifier().postTest() ? "Sent" : "Couldn't send" + status = await Notifier().authorizationStatus() + } + } + .disabled(!Notifier.isAvailable) + } + } label: { + Text("Permission") + Text(testResult ?? permissionDescription) + } + } + } + .formStyle(.grouped) + .task { status = await Notifier().authorizationStatus() } + } + + private var permissionDescription: String { + guard Notifier.isAvailable else { return "Unavailable when running outside the app bundle." } + return switch status { + case .authorized, .provisional, .ephemeral: "Allowed" + case .denied: "Turned off in System Settings" + default: "Not requested yet" + } + } +} diff --git a/Sources/PRMonitor/Utils/AsyncSemaphore.swift b/Sources/PRMonitor/Utils/AsyncSemaphore.swift deleted file mode 100644 index 0deb612..0000000 --- a/Sources/PRMonitor/Utils/AsyncSemaphore.swift +++ /dev/null @@ -1,60 +0,0 @@ -import Foundation - -final class AsyncSemaphore: @unchecked Sendable { - private let lock = NSLock() - private var permits: Int - private var waiters: [Waiter] = [] - - private struct Waiter { - let id: UUID - let continuation: CheckedContinuation - } - - init(value: Int) { - self.permits = max(0, value) - } - - func wait() async { - if Task.isCancelled { return } - let waiterId = UUID() - await withTaskCancellationHandler(operation: { - await withCheckedContinuation { continuation in - lock.lock() - if Task.isCancelled { - lock.unlock() - continuation.resume() - return - } - if permits > 0 { - permits -= 1 - lock.unlock() - continuation.resume() - } else { - waiters.append(Waiter(id: waiterId, continuation: continuation)) - lock.unlock() - } - } - }, onCancel: { - lock.lock() - if let index = waiters.firstIndex(where: { $0.id == waiterId }) { - let waiter = waiters.remove(at: index) - lock.unlock() - waiter.continuation.resume() - } else { - lock.unlock() - } - }) - } - - func signal() { - lock.lock() - if !waiters.isEmpty { - let continuation = waiters.removeFirst().continuation - lock.unlock() - continuation.resume() - } else { - permits += 1 - lock.unlock() - } - } -} diff --git a/Sources/PRMonitor/Utils/Keychain.swift b/Sources/PRMonitor/Utils/Keychain.swift deleted file mode 100644 index e7fe9cd..0000000 --- a/Sources/PRMonitor/Utils/Keychain.swift +++ /dev/null @@ -1,44 +0,0 @@ -import Foundation -import Security - -enum Keychain { - static func save(service: String, account: String, value: String) { - let data = Data(value.utf8) - let query: [CFString: Any] = [ - kSecClass: kSecClassGenericPassword, - kSecAttrService: service, - kSecAttrAccount: account - ] - SecItemDelete(query as CFDictionary) - let attributes: [CFString: Any] = [ - kSecClass: kSecClassGenericPassword, - kSecAttrService: service, - kSecAttrAccount: account, - kSecValueData: data - ] - SecItemAdd(attributes as CFDictionary, nil) - } - - static func load(service: String, account: String) -> String? { - let query: [CFString: Any] = [ - kSecClass: kSecClassGenericPassword, - kSecAttrService: service, - kSecAttrAccount: account, - kSecReturnData: true, - kSecMatchLimit: kSecMatchLimitOne - ] - var item: CFTypeRef? - let status = SecItemCopyMatching(query as CFDictionary, &item) - guard status == errSecSuccess, let data = item as? Data else { return nil } - return String(data: data, encoding: .utf8) - } - - static func delete(service: String, account: String) { - let query: [CFString: Any] = [ - kSecClass: kSecClassGenericPassword, - kSecAttrService: service, - kSecAttrAccount: account - ] - SecItemDelete(query as CFDictionary) - } -} diff --git a/Sources/PRMonitor/Utils/NotificationAvailability.swift b/Sources/PRMonitor/Utils/NotificationAvailability.swift deleted file mode 100644 index c576ede..0000000 --- a/Sources/PRMonitor/Utils/NotificationAvailability.swift +++ /dev/null @@ -1,18 +0,0 @@ -import Foundation - -enum NotificationAvailability { - static var isAvailable: Bool { - let env = ProcessInfo.processInfo.environment - if env["XCODE_RUNNING_FOR_PREVIEWS"] == "1" { - return false - } - if env["XCTestConfigurationFilePath"] != nil { - return false - } - if let bundleType = Bundle.main.object(forInfoDictionaryKey: "CFBundlePackageType") as? String, - bundleType == "APPL" { - return true - } - return Bundle.main.bundleURL.pathExtension == "app" - } -} diff --git a/Sources/PRMonitor/Views/ContentView.swift b/Sources/PRMonitor/Views/ContentView.swift deleted file mode 100644 index e4ee73b..0000000 --- a/Sources/PRMonitor/Views/ContentView.swift +++ /dev/null @@ -1,582 +0,0 @@ -import SwiftUI -import AppKit -import Foundation - -struct ContentView: View { - @EnvironmentObject private var appState: AppState - @State private var expandedPRs: Set = [] - @State private var hoveredPRs: Set = [] - @State private var hoveredMenuItem: String? = nil - @State private var listContentHeight: CGFloat = 0 - @State private var headerHeight: CGFloat = 48 - @State private var footerHeight: CGFloat = 96 - @State private var errorHeight: CGFloat = 0 - @Environment(\.openSettings) private var openSettings - - private let maxPopoverHeight: CGFloat - private let onSizeChange: ((CGSize) -> Void)? - private let preferredWidth: CGFloat = 520 - - init(maxPopoverHeight: CGFloat = 760, onSizeChange: ((CGSize) -> Void)? = nil) { - self.maxPopoverHeight = maxPopoverHeight - self.onSizeChange = onSizeChange - } - - var body: some View { - VStack(spacing: 12) { - header - if let error = appState.errorMessage { - Label(error, systemImage: "exclamationmark.triangle.fill") - .font(.caption) - .foregroundStyle(.red) - .background( - GeometryReader { proxy in - Color.clear.preference(key: ErrorHeightKey.self, value: proxy.size.height) - } - ) - } - Divider() - content - footer - } - .padding(12) - .frame(width: preferredWidth, height: windowHeight) - .background( - GeometryReader { proxy in - Color.clear.preference(key: RootSizeKey.self, value: proxy.size) - } - ) - .onPreferenceChange(RootSizeKey.self) { size in - onSizeChange?(size) - } - .onPreferenceChange(ErrorHeightKey.self) { height in - errorHeight = height - } - .onChange(of: appState.errorMessage) { _, value in - if value == nil { errorHeight = 0 } - } - } - - private var header: some View { - HStack { - VStack(alignment: .leading, spacing: 4) { - Text("PR Monitor") - .font(.headline) - HStack(spacing: 6) { - Text(statusText) - if let detail = statusDetailText { - Text("• \(detail)") - } - } - .font(.caption) - .foregroundStyle(.secondary) - } - Spacer() - } - .background( - GeometryReader { proxy in - Color.clear.preference(key: HeaderHeightKey.self, value: proxy.size.height) - } - ) - .onPreferenceChange(HeaderHeightKey.self) { height in - headerHeight = height - } - } - - @ViewBuilder - private var content: some View { - if !appState.authStore.isSignedIn { - unavailableView( - title: "Sign in to GitHub", - systemImage: "person.crop.circle.badge.xmark", - message: "Connect GitHub to start monitoring." - ) - } else if appState.repoSections.isEmpty { - unavailableView( - title: "No Open Pull Requests", - systemImage: "tray", - message: "No open PRs in tracked repos." - ) - } else { - ScrollView { - VStack(alignment: .leading, spacing: 12) { - ForEach(appState.repoSections) { section in - repoSection(section) - } - } - .background( - GeometryReader { proxy in - Color.clear.preference(key: ListContentHeightKey.self, value: proxy.size.height) - } - ) - } - .onPreferenceChange(ListContentHeightKey.self) { height in - listContentHeight = height - } - .frame(height: listHeight) - } - } - - private func repoSection(_ section: RepoSection) -> some View { - GroupBox { - VStack(alignment: .leading, spacing: 8) { - ForEach(section.prs) { pr in - prRow(pr) - } - } - } label: { - HStack(spacing: 8) { - Text(section.fullName) - .font(.caption.weight(.semibold)) - Text("• \(section.prs.count) PR\(section.prs.count == 1 ? "" : "s")") - .font(.caption2) - .foregroundStyle(.secondary) - } - } - } - - private func prRow(_ pr: PRItem) -> some View { - let isExpanded = expandedPRs.contains(prKey(pr)) - let isHovered = hoveredPRs.contains(prKey(pr)) - return VStack(alignment: .leading, spacing: 10) { - VStack(alignment: .leading, spacing: 6) { - HStack(alignment: .center, spacing: 8) { - Button { - toggleExpanded(pr) - } label: { - Image(systemName: isExpanded ? "chevron.down" : "chevron.right") - .font(.caption2.weight(.semibold)) - .foregroundStyle(.secondary) - .frame(width: 18, height: 18) - .contentShape(Rectangle()) - } - .buttonStyle(.plain) - .help(isExpanded ? "Hide checks" : "Show checks") - - Button { - openPR(pr.url) - } label: { - HStack(spacing: 8) { - Text("#\(pr.number)") - .font(.callout.weight(.semibold)) - .monospacedDigit() - Text(pr.title) - .font(.callout) - .lineLimit(1) - - Spacer(minLength: 12) - - StatusPill(status: prStatus(pr)) - } - .contentShape(Rectangle()) - } - .buttonStyle(.plain) - } - - Text("by \(pr.author)") - .font(.caption) - .foregroundStyle(.secondary) - } - if isExpanded { - Divider() - VStack(alignment: .leading, spacing: 6) { - if pr.agents.isEmpty { - Text("No checks configured for this repo.") - .font(.caption) - .foregroundStyle(.secondary) - } else { - ForEach(pr.agents) { agent in - agentRow(agent) - } - } - } - .padding(.leading, 4) - } - } - .padding(12) - .background(.regularMaterial, in: RoundedRectangle(cornerRadius: 12, style: .continuous)) - .overlay( - RoundedRectangle(cornerRadius: 12, style: .continuous) - .strokeBorder(isHovered ? Color.primary.opacity(0.12) : Color.clear, lineWidth: 1) - ) - .animation(.easeInOut(duration: 0.15), value: isHovered) - .onHover { hovering in - let key = prKey(pr) - if hovering { - hoveredPRs.insert(key) - NSCursor.pointingHand.push() - } else { - hoveredPRs.remove(key) - NSCursor.pop() - } - } - .contextMenu { - Button("Open Pull Request") { - openPR(pr.url) - } - Button("Open Checks") { - openPR(checksURL(for: pr)) - } - Button("Copy URL") { - copyToPasteboard(pr.url.absoluteString) - } - Button("Copy Title") { - copyToPasteboard("#\(pr.number) \(pr.title)") - } - } - } - - private func agentRow(_ agent: AgentRun) -> some View { - HStack(spacing: 8) { - Circle() - .fill(agent.status.color) - .frame(width: 8, height: 8) - .accessibilityHidden(true) - VStack(alignment: .leading, spacing: 2) { - Text(agent.displayName) - .font(.caption) - } - Spacer() - Text(agentStatusText(agent)) - .font(.caption) - .foregroundStyle(.secondary) - } - .accessibilityLabel("\(agent.displayName), \(agentStatusText(agent))") - } - - private func prStatus(_ pr: PRItem) -> AgentRunStatus { - if pr.agents.contains(where: { $0.status == .running }) { return .running } - if pr.agents.contains(where: { $0.status == .failed }) { return .failed } - if pr.agents.contains(where: { $0.status == .waitingForComment || $0.status == .notFound }) { return .waitingForComment } - return .done - } - - private func agentStatusText(_ agent: AgentRun) -> String { - switch agent.status { - case .running: - return "Running" - case .waitingForComment: - return agent.commentCount > 0 ? "Needs review" : "Waiting" - case .failed: - return conclusionText(agent) ?? "Failed" - case .done: - return conclusionText(agent) ?? "Done" - case .notFound: - return "No check yet" - } - } - - private func emptyState(text: String) -> some View { - VStack(spacing: 8) { - Text(text) - .font(.callout) - .foregroundStyle(.secondary) - } - .frame(maxWidth: .infinity, minHeight: 80) - } - - private var settingsAction: some View { - Group { - if #available(macOS 14.0, *) { - SettingsLink(label: { - Text("Open Settings") - }) - } else { - Button("Open Settings") { - openSettingsWindow() - } - } - } - } - - private var footer: some View { - VStack(spacing: 6) { - Divider() - VStack(spacing: 0) { - Button { - appState.refreshNow() - } label: { - menuRowLabel( - id: "refresh", - title: appState.isRefreshing ? "Refreshing" : "Refresh", - systemImage: "arrow.clockwise", - trailing: appState.isRefreshing ? .progress : nil - ) - } - .buttonStyle(.plain) - .disabled(appState.isRefreshing) - .keyboardShortcut("r") - .help("Refresh now") - - settingsFooterAction - - Button { - NSApp.terminate(nil) - } label: { - menuRowLabel(id: "quit", title: "Quit PR Monitor", systemImage: "power") - } - .buttonStyle(.plain) - .keyboardShortcut("q") - } - } - .font(.caption) - .foregroundStyle(.secondary) - .padding(.bottom, 6) - .background( - GeometryReader { proxy in - Color.clear.preference(key: FooterHeightKey.self, value: proxy.size.height) - } - ) - .onPreferenceChange(FooterHeightKey.self) { height in - footerHeight = height - } - } - - private var settingsFooterAction: some View { - Group { - if #available(macOS 14.0, *) { - SettingsLink(label: { - menuRowLabel(id: "settings", title: "Settings…", systemImage: "gearshape") - }) - } else { - Button { - openSettingsWindow() - } label: { - menuRowLabel(id: "settings", title: "Settings…", systemImage: "gearshape") - } - } - } - .buttonStyle(.plain) - .help("Open Settings") - } - - private enum MenuRowTrailing { - case progress - } - - @ViewBuilder - private func menuRowLabel( - id: String, - title: String, - systemImage: String? = nil, - isEnabled: Bool = true, - trailing: MenuRowTrailing? = nil - ) -> some View { - HStack(spacing: 8) { - if let systemImage { - Image(systemName: systemImage) - .frame(width: 16, height: 16) - .foregroundStyle(.secondary) - } - Text(title) - Spacer() - if trailing == .progress { - ProgressView() - .controlSize(.mini) - } - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.vertical, 6) - .padding(.horizontal, 12) - .background( - hoveredMenuItem == id ? Color.primary.opacity(0.08) : Color.clear, - in: RoundedRectangle(cornerRadius: 5, style: .continuous) - ) - .opacity(isEnabled ? 1 : 0.5) - .contentShape(Rectangle()) - .animation(.easeInOut(duration: 0.15), value: hoveredMenuItem == id) - .onHover { hovering in - guard isEnabled else { return } - hoveredMenuItem = hovering ? id : nil - } - } - - private func prKey(_ pr: PRItem) -> String { - "\(pr.repoFullName)#\(pr.number)" - } - - private func toggleExpanded(_ pr: PRItem) { - withAnimation(.spring(response: 0.3, dampingFraction: 0.8)) { - let key = prKey(pr) - if expandedPRs.contains(key) { - expandedPRs.remove(key) - } else { - expandedPRs.insert(key) - } - } - } - - - private func checksURL(for pr: PRItem) -> URL { - pr.url.appendingPathComponent("checks") - } - - private func conclusionText(_ agent: AgentRun) -> String? { - guard agent.status == .done || agent.status == .failed else { return nil } - guard let conclusion = agent.checkConclusion, !conclusion.isEmpty else { return nil } - return conclusion.replacingOccurrences(of: "_", with: " ").capitalized - } - - - private func openSettingsWindow() { - openSettings() - } - - private func openPR(_ url: URL) { - NSWorkspace.shared.open(url) - } - - private func copyToPasteboard(_ value: String) { - let pasteboard = NSPasteboard.general - pasteboard.clearContents() - pasteboard.setString(value, forType: .string) - } - - private var statusText: String { - if let login = appState.viewerLogin { - return "Signed in as \(login)" - } - return appState.authStore.isSignedIn ? "Connected" : "Sign in required" - } - - private var statusDetailText: String? { - if appState.isRefreshing { - return "Refreshing…" - } - guard let last = appState.lastRefresh else { return nil } - return "Updated \(relativeTime(from: last))" - } - - private var totalPRCount: Int { - appState.repoSections.reduce(0) { $0 + $1.prs.count } - } - - private var listHeight: CGFloat { - guard appState.authStore.isSignedIn, totalPRCount > 0 else { return 0 } - let maxList = maxListHeight - let content = listContentHeight > 0 ? listContentHeight : maxList - return min(content, maxList) - } - - private var windowHeight: CGFloat { - guard appState.authStore.isSignedIn, totalPRCount > 0 else { return 260 } - return min(maxPopoverHeight, chromeHeight + listHeight) - } - - private var chromeHeight: CGFloat { - let padding: CGFloat = 24 - let dividerHeight: CGFloat = 1 - let elements = 3 + (appState.errorMessage == nil ? 0 : 1) - let gaps = max(0, elements - 1) - let spacing = CGFloat(gaps) * 12 - return headerHeight + footerHeight + errorHeight + padding + dividerHeight + spacing - } - - private var maxListHeight: CGFloat { - let available = maxPopoverHeight - chromeHeight - return max(120, available) - } - - private func relativeTime(from date: Date) -> String { - let formatter = RelativeDateTimeFormatter() - formatter.unitsStyle = .abbreviated - return formatter.localizedString(for: date, relativeTo: Date()) - } - - @ViewBuilder - private func unavailableView(title: String, systemImage: String, message: String) -> some View { - if #available(macOS 14.0, *) { - ContentUnavailableView(label: { - Label(title, systemImage: systemImage) - }, description: { - Text(message) - }, actions: { - settingsAction - }) - } else { - emptyState(text: message) - } - } -} - -private struct StatusPill: View { - let status: AgentRunStatus - - private var text: String { - switch status { - case .running: - return "Running" - case .failed: - return "Failed" - case .waitingForComment: - return "Waiting" - case .done: - return "Ready" - case .notFound: - return "Pending" - } - } - - var body: some View { - Text(text) - .font(.caption2.weight(.semibold)) - .padding(.horizontal, 8) - .padding(.vertical, 4) - .background(status.color.opacity(0.2), in: Capsule()) - .foregroundStyle(status.color) - .accessibilityLabel("Status") - .accessibilityValue(text) - } -} - -extension AgentRunStatus { - var color: Color { - switch self { - case .running: return .blue - case .waitingForComment: return .orange - case .notFound: return .gray - case .failed: return .red - case .done: return .green - } - } -} - -private struct RootSizeKey: PreferenceKey { - static var defaultValue: CGSize = .zero - static func reduce(value: inout CGSize, nextValue: () -> CGSize) { - let next = nextValue() - if next != .zero { value = next } - } -} - -private struct HeaderHeightKey: PreferenceKey { - static var defaultValue: CGFloat = 0 - static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { - let next = nextValue() - if next > 0 { value = next } - } -} - -private struct FooterHeightKey: PreferenceKey { - static var defaultValue: CGFloat = 0 - static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { - let next = nextValue() - if next > 0 { value = next } - } -} - -private struct ErrorHeightKey: PreferenceKey { - static var defaultValue: CGFloat = 0 - static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { - let next = nextValue() - if next > 0 { value = next } - } -} - -private struct ListContentHeightKey: PreferenceKey { - static var defaultValue: CGFloat = 0 - static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { - let next = nextValue() - if next > 0 { value = next } - } -} diff --git a/Sources/PRMonitor/Views/SettingsView.swift b/Sources/PRMonitor/Views/SettingsView.swift deleted file mode 100644 index b87e919..0000000 --- a/Sources/PRMonitor/Views/SettingsView.swift +++ /dev/null @@ -1,639 +0,0 @@ -import SwiftUI -import UserNotifications -import AppKit - -struct SettingsView: View { - var body: some View { - TabView { - GeneralSettingsTab() - .tabItem { - Label("General", systemImage: "gearshape") - } - RepositoriesSettingsTab() - .tabItem { - Label("Repositories", systemImage: "folder") - } - AgentsSettingsTab() - .tabItem { - Label("Agents", systemImage: "cpu") - } - } - .padding(20) - .frame(width: 600, height: 500) - } -} - -// MARK: - General Settings Tab - -private struct GeneralSettingsTab: View { - @EnvironmentObject private var settings: SettingsStore - @EnvironmentObject private var authStore: AuthStore - - @State private var notificationStatus: UNAuthorizationStatus = .notDetermined - @State private var notificationStatusDetail = "" - - var body: some View { - Form { - accountSection - pollingSection - notificationsSection - } - .formStyle(.grouped) - .onAppear { - loadNotificationStatus() - } - } - - // MARK: Account - - @ViewBuilder - private var accountSection: some View { - Section { - HStack(spacing: 8) { - if authStore.isSignedIn { - Image(systemName: "checkmark.circle.fill") - .foregroundStyle(.green) - .accessibilityHidden(true) - Text("Signed in") - .accessibilityValue("Connected to GitHub") - } else { - Image(systemName: "exclamationmark.circle.fill") - .foregroundStyle(.yellow) - .accessibilityHidden(true) - Text("Not signed in") - .accessibilityValue("Not connected to GitHub") - } - Spacer() - if authStore.isSignedIn { - Button("Sign Out") { - authStore.signOut() - } - } else { - Button(authStore.isSigningIn ? "Signing In..." : "Sign In") { - authStore.signIn(clientId: settings.githubClientId) - } - .disabled(authStore.isSigningIn || settings.githubClientId.isEmpty) - } - } - - if let flow = authStore.deviceFlow { - VStack(alignment: .leading, spacing: 8) { - Text("Enter this code at GitHub:") - .font(.caption) - .foregroundStyle(.secondary) - Text(flow.userCode) - .font(.system(size: 20, weight: .semibold, design: .monospaced)) - .textSelection(.enabled) - Button { - NSWorkspace.shared.open(flow.verificationURL) - } label: { - Label("Open GitHub", systemImage: "arrow.up.right.square") - } - } - } - - TextField("GitHub OAuth Client ID", text: $settings.githubClientId) - .textFieldStyle(.roundedBorder) - .disableAutocorrection(true) - .accessibilityLabel("GitHub OAuth Client ID") - - if let message = authStore.statusMessage { - Text(message) - .font(.caption) - .foregroundStyle(.secondary) - } - } header: { - Text("Account") - } footer: { - Text("Create an OAuth app at github.com/settings/developers") - } - } - - // MARK: Polling - - private var pollingSection: some View { - Section { - Picker("Polling Interval", selection: $settings.pollingIntervalSeconds) { - Text("30 seconds").tag(30) - Text("1 minute").tag(60) - Text("2 minutes").tag(120) - Text("5 minutes").tag(300) - } - .pickerStyle(.segmented) - } header: { - Text("Polling") - } footer: { - Text("When no open PRs are found, refreshes every 10 minutes.") - } - } - - // MARK: Notifications - - private var notificationsSection: some View { - Section { - Toggle("All agents complete", isOn: .constant(true)) - .disabled(true) - .accessibilityValue("Always enabled") - Toggle("Review summary", isOn: $settings.notifySummary) - Toggle("Per-agent completion", isOn: $settings.notifyPerAgent) - Button("Send Test Notification") { - sendTestNotification() - } - .accessibilityLabel("Send a test notification") - } header: { - Text("Notifications") - } footer: { - VStack(alignment: .leading, spacing: 6) { - Text("Receive notifications when agent checks complete on your PRs") - Text(notificationStatusDetail) - .font(.caption) - .foregroundStyle(.secondary) - .accessibilityValue(notificationStatusDetail) - } - } - } - - // MARK: Helpers - - private func loadNotificationStatus() { - guard notificationsAvailable else { - notificationStatus = .notDetermined - notificationStatusDetail = "Notifications require running the app bundle (not previews or `swift run`)." - return - } - UNUserNotificationCenter.current().getNotificationSettings { notiSettings in - Task { @MainActor in - notificationStatus = notiSettings.authorizationStatus - switch notiSettings.authorizationStatus { - case .authorized: - notificationStatusDetail = "Notifications are allowed in System Settings." - case .denied: - notificationStatusDetail = "Notifications are blocked. Enable PR Monitor in System Settings > Notifications." - case .notDetermined: - notificationStatusDetail = "Notifications haven't been requested yet." - case .provisional: - notificationStatusDetail = "Notifications are in provisional mode." - case .ephemeral: - notificationStatusDetail = "Notifications are temporary (ephemeral)." - @unknown default: - notificationStatusDetail = "Notification permission status unknown." - } - } - } - } - - private func sendTestNotification() { - guard notificationsAvailable else { - notificationStatusDetail = "Notifications require running the app bundle (not previews or `swift run`)." - return - } - UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { granted, error in - let content = UNMutableNotificationContent() - content.title = "PR Monitor" - content.body = "Test notification." - let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: nil) - UNUserNotificationCenter.current().add(request) { addError in - Task { @MainActor in - if let error { - self.notificationStatusDetail = "Notification authorization failed: \(error.localizedDescription)" - } else if let addError { - self.notificationStatusDetail = "Notification delivery failed: \(addError.localizedDescription)" - } else if !granted { - self.notificationStatusDetail = "Notifications are blocked. Enable PR Monitor in System Settings > Notifications." - } else { - self.notificationStatusDetail = "Test notification queued." - } - loadNotificationStatus() - } - } - } - } - - private var notificationsAvailable: Bool { - NotificationAvailability.isAvailable - } -} - -// MARK: - Repositories Settings Tab - -private struct RepositoriesSettingsTab: View { - @EnvironmentObject private var settings: SettingsStore - @EnvironmentObject private var authStore: AuthStore - - @State private var newRepoText = "" - @State private var repoSearch = "" - @State private var availableRepos: [RepoDTO] = [] - @State private var isLoadingRepos = false - @State private var repoLoadError: String? - - private var filteredAvailableRepos: [RepoDTO] { - let trimmed = repoSearch.trimmingCharacters(in: .whitespacesAndNewlines) - guard !trimmed.isEmpty else { return availableRepos } - return availableRepos.filter { $0.fullName.localizedCaseInsensitiveContains(trimmed) } - } - - private var canAddRepo: Bool { - let trimmed = newRepoText.trimmingCharacters(in: .whitespacesAndNewlines) - let parts = trimmed.split(separator: "/") - return parts.count == 2 && !parts[0].isEmpty && !parts[1].isEmpty - } - - var body: some View { - Form { - trackedReposSection - addRepoSection - browseGitHubSection - if !availableRepos.isEmpty { - filterSection - availableReposSection - } - } - .formStyle(.grouped) - } - - // MARK: Tracked Repos - - private var trackedReposSection: some View { - Section { - if settings.repos.isEmpty { - Text("No repositories added yet.") - .foregroundStyle(.secondary) - } else { - ForEach($settings.repos) { $repo in - Toggle(repo.fullName, isOn: $repo.isEnabled) - .contextMenu { - Button("Remove", role: .destructive) { - settings.repos.removeAll { $0.id == repo.id } - } - } - } - .onDelete { indexSet in - settings.repos.remove(atOffsets: indexSet) - } - } - } header: { - Text("Tracked Repositories") - } - } - - // MARK: Add Repo - - private var addRepoSection: some View { - Section { - HStack { - TextField("owner/repo", text: $newRepoText) - .textFieldStyle(.roundedBorder) - .disableAutocorrection(true) - .onSubmit { addRepo() } - .accessibilityLabel("Repository name in owner/repo format") - Button("Add") { addRepo() } - .disabled(!canAddRepo) - } - } header: { - Text("Add Repository") - } - } - - // MARK: Browse GitHub - - private var browseGitHubSection: some View { - Section { - Button { - loadRepos() - } label: { - if isLoadingRepos { - HStack(spacing: 8) { - ProgressView() - .controlSize(.small) - Text("Fetching repositories...") - } - } else { - Label("Fetch from GitHub", systemImage: "arrow.down.circle") - } - } - .disabled(isLoadingRepos || !authStore.isSignedIn) - - if !authStore.isSignedIn { - Text("Sign in required to fetch repositories.") - .font(.caption) - .foregroundStyle(.secondary) - } - - if let error = repoLoadError { - Text(error) - .font(.caption) - .foregroundStyle(.red) - } - } header: { - Text("Browse GitHub Repositories") - } footer: { - if !availableRepos.isEmpty { - Text("\(availableRepos.count) repositories available") - } else { - Text("Fetch your repositories to add them to tracking") - } - } - } - - // MARK: Filter & Available - - private var filterSection: some View { - Section { - HStack { - Image(systemName: "magnifyingglass") - .foregroundStyle(.secondary) - .accessibilityHidden(true) - TextField("Search repositories", text: $repoSearch) - .textFieldStyle(.roundedBorder) - if !repoSearch.isEmpty { - Button { - repoSearch = "" - } label: { - Image(systemName: "xmark.circle.fill") - .foregroundStyle(.secondary) - } - .buttonStyle(.borderless) - .help("Clear search") - .accessibilityLabel("Clear search") - } - } - } header: { - Text("Filter") - } - } - - private var availableReposSection: some View { - Section { - ForEach(filteredAvailableRepos) { repo in - HStack { - VStack(alignment: .leading, spacing: 2) { - Text(repo.fullName) - if repo.isPrivate { - Label("Private", systemImage: "lock.fill") - .font(.caption2) - .foregroundStyle(.secondary) - } - } - Spacer() - Toggle("", isOn: bindingForRepo(repo)) - .labelsHidden() - .accessibilityLabel("Track \(repo.fullName)") - } - } - } header: { - Text("Available Repositories") - } footer: { - if !repoSearch.isEmpty { - Text("Showing \(filteredAvailableRepos.count) of \(availableRepos.count) repositories") - } - } - } - - // MARK: Helpers - - private func bindingForRepo(_ repo: RepoDTO) -> Binding { - Binding( - get: { - settings.repos.first(where: { $0.fullName == repo.fullName })?.isEnabled ?? false - }, - set: { enabled in - settings.setRepoEnabled(owner: repo.owner.login, name: repo.name, enabled: enabled) - } - ) - } - - private func addRepo() { - if settings.addRepo(from: newRepoText) != nil { - newRepoText = "" - } - } - - private func loadRepos() { - guard authStore.isSignedIn else { - repoLoadError = "Sign in to fetch repos." - return - } - repoLoadError = nil - isLoadingRepos = true - - let client = GitHubClient(tokenProvider: { authStore.token }) - Task { - do { - let repos = try await client.fetchAllViewerRepos() - let sorted = repos.sorted { $0.fullName.localizedCaseInsensitiveCompare($1.fullName) == .orderedAscending } - await MainActor.run { - availableRepos = sorted - isLoadingRepos = false - } - } catch { - await MainActor.run { - repoLoadError = error.localizedDescription - isLoadingRepos = false - } - } - } - } -} - -// MARK: - Agents Settings Tab - -private struct AgentsSettingsTab: View { - @EnvironmentObject private var settings: SettingsStore - @EnvironmentObject private var authStore: AuthStore - - @State private var newAgentName = "" - @State private var newAgentCheckPattern = "" - @State private var newAgentCommentAuthor = "" - @State private var isDetectingAgents = false - @State private var agentDetectError: String? - - var body: some View { - Form { - quickSetupSection - configuredAgentsSection - addAgentSection - } - .formStyle(.grouped) - } - - // MARK: Quick Setup - - private var quickSetupSection: some View { - Section { - Button { - detectAgents() - } label: { - if isDetectingAgents { - HStack(spacing: 8) { - ProgressView() - .controlSize(.small) - Text("Detecting agents...") - } - } else { - Label("Auto-detect from Open PRs", systemImage: "sparkles") - } - } - .disabled(isDetectingAgents || !authStore.isSignedIn || settings.enabledRepos.isEmpty) - - if let error = agentDetectError { - Text(error) - .font(.caption) - .foregroundStyle(.red) - } else if settings.enabledRepos.isEmpty { - Text("Enable repositories first") - .font(.caption) - .foregroundStyle(.secondary) - } - } header: { - Text("Quick Setup") - } footer: { - Text("Automatically find agents from your pull requests") - } - } - - // MARK: Configured Agents - - @ViewBuilder - private var configuredAgentsSection: some View { - Section { - if settings.agents.isEmpty { - Text("No agents configured yet.") - .foregroundStyle(.secondary) - .frame(maxWidth: .infinity, alignment: .center) - .padding(.vertical, 4) - } else { - ForEach($settings.agents) { $agent in - VStack(alignment: .leading, spacing: 8) { - HStack { - VStack(alignment: .leading, spacing: 2) { - Text(agent.displayName.isEmpty ? "Unnamed Agent" : agent.displayName) - .font(.headline) - if !agent.checkNamePattern.isEmpty { - Text("Check: \(agent.checkNamePattern)") - .font(.caption) - .foregroundStyle(.secondary) - } - } - Spacer() - Button(role: .destructive) { - settings.agents.removeAll { $0.id == agent.id } - } label: { - Image(systemName: "trash") - .foregroundStyle(.red) - } - .buttonStyle(.borderless) - .help("Remove agent") - .accessibilityLabel("Remove \(agent.displayName)") - } - - DisclosureGroup("Edit") { - VStack(alignment: .leading, spacing: 8) { - TextField("Display Name", text: $agent.displayName) - .textFieldStyle(.roundedBorder) - TextField("Check Name Pattern", text: $agent.checkNamePattern) - .textFieldStyle(.roundedBorder) - .disableAutocorrection(true) - TextField("Comment Author Login", text: $agent.commentAuthor) - .textFieldStyle(.roundedBorder) - .disableAutocorrection(true) - } - } - .font(.caption) - } - } - .onDelete { indexSet in - settings.agents.remove(atOffsets: indexSet) - } - } - } header: { - Text("Configured Agents") - } footer: { - Text("Each agent monitors specific checks and comments on PRs") - } - } - - // MARK: Add Agent - - private var addAgentSection: some View { - Section { - TextField("Display Name", text: $newAgentName) - .textFieldStyle(.roundedBorder) - TextField("Check Name Pattern", text: $newAgentCheckPattern) - .textFieldStyle(.roundedBorder) - .disableAutocorrection(true) - TextField("Comment Author Login", text: $newAgentCommentAuthor) - .textFieldStyle(.roundedBorder) - .disableAutocorrection(true) - Button("Add Agent") { - let agent = AgentConfig( - displayName: newAgentName, - checkNamePattern: newAgentCheckPattern, - commentAuthor: newAgentCommentAuthor - ) - guard !agent.displayName.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return } - settings.agents.append(agent) - newAgentName = "" - newAgentCheckPattern = "" - newAgentCommentAuthor = "" - } - .disabled(newAgentName.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty) - } header: { - Text("Add New Agent") - } footer: { - Text("Agents match GitHub check runs and comment authors") - } - } - - // MARK: Helpers - - private func detectAgents() { - guard authStore.isSignedIn else { - agentDetectError = "Sign in to detect agents." - return - } - guard !settings.enabledRepos.isEmpty else { - agentDetectError = "Enable at least one repo." - return - } - agentDetectError = nil - isDetectingAgents = true - - let client = GitHubClient(tokenProvider: { authStore.token }) - let service = AgentDiscoveryService(client: client) - - Task { - do { - let discovered = try await service.discoverAgents(repos: settings.enabledRepos) - await MainActor.run { - mergeAgents(discovered) - isDetectingAgents = false - } - } catch { - await MainActor.run { - agentDetectError = error.localizedDescription - isDetectingAgents = false - } - } - } - } - - private func mergeAgents(_ discovered: [AgentConfig]) { - for agent in discovered { - let exists = settings.agents.contains { existing in - normalize(existing.displayName) == normalize(agent.displayName) - || normalize(existing.checkNamePattern) == normalize(agent.checkNamePattern) - || (!agent.commentAuthor.isEmpty && normalize(existing.commentAuthor) == normalize(agent.commentAuthor)) - } - if !exists { - settings.agents.append(agent) - } - } - } - - private func normalize(_ value: String) -> String { - let lowered = value.lowercased() - let removedBot = lowered.replacingOccurrences(of: "[bot]", with: "") - let allowed = removedBot.filter { $0.isLetter || $0.isNumber } - return allowed - } -} diff --git a/Sources/PRMonitor/Views/StatusBarLabel.swift b/Sources/PRMonitor/Views/StatusBarLabel.swift deleted file mode 100644 index c24ae46..0000000 --- a/Sources/PRMonitor/Views/StatusBarLabel.swift +++ /dev/null @@ -1,53 +0,0 @@ -import SwiftUI - -struct StatusBarLabel: View { - let status: AppState.OverallStatus - - private var color: Color { - switch status { - case .needsAuth: - return .gray - case .idle: - return .gray - case .running: - return .blue - case .failed: - return .red - case .waiting: - return .orange - case .done: - return .green - } - } - - private var statusText: String { - switch status { - case .needsAuth: - return "Sign in required" - case .idle: - return "Idle" - case .running: - return "Running" - case .failed: - return "Failed" - case .waiting: - return "Waiting" - case .done: - return "Ready" - } - } - - var body: some View { - ZStack(alignment: .bottomTrailing) { - Image(systemName: "waveform.path.ecg") - .font(.system(size: 14, weight: .medium)) - Circle() - .fill(color) - .frame(width: 6, height: 6) - .offset(x: 3, y: 3) - } - .accessibilityElement(children: .ignore) - .accessibilityLabel("PR Monitor") - .accessibilityValue(statusText) - } -} From d619924cdc451bea33f32f83cb9ed2cee86ac07d Mon Sep 17 00:00:00 2001 From: Hasaam Date: Mon, 28 Sep 2026 21:21:08 -0400 Subject: [PATCH 5/6] docs: portfolio README, architecture notes and 0.x audit Rewrite the README with a light/dark hero, download button and FAQ, add Liquid Glass screenshots of fictional data, and document the architecture, the audit behind the rewrite, and the release process. --- CONTRIBUTING.md | 51 ++++---- README.md | 173 +++++++++++++++++++++------- docs/ARCHITECTURE.md | 148 ++++++++++++++++++++++++ docs/AUDIT.md | 65 +++++++++++ docs/RELEASING.md | 88 ++++++++++++++ docs/assets/download-dark.svg | 8 ++ docs/assets/download-light.svg | 8 ++ docs/screenshots/app-icon.png | Bin 0 -> 115256 bytes docs/screenshots/hero-dark.jpg | Bin 0 -> 249217 bytes docs/screenshots/hero-light.jpg | Bin 0 -> 255079 bytes docs/screenshots/menu-bar-icons.png | Bin 0 -> 42316 bytes docs/screenshots/settings-light.jpg | Bin 0 -> 198591 bytes 12 files changed, 480 insertions(+), 61 deletions(-) create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/AUDIT.md create mode 100644 docs/RELEASING.md create mode 100644 docs/assets/download-dark.svg create mode 100644 docs/assets/download-light.svg create mode 100644 docs/screenshots/app-icon.png create mode 100644 docs/screenshots/hero-dark.jpg create mode 100644 docs/screenshots/hero-light.jpg create mode 100644 docs/screenshots/menu-bar-icons.png create mode 100644 docs/screenshots/settings-light.jpg diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c6cd07e..3a90d12 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,34 +1,45 @@ # Contributing -Thanks for your interest in PR Monitor. Contributions are welcome. +Thanks for your interest in PR Monitor. Issues and pull requests are welcome. -## Getting Started +## Getting started -1. Clone the repo. -2. Open `PRMonitor.xcodeproj` in Xcode. -3. Run the `PRMonitor` target. +1. Clone the repo and open `PRMonitor.xcodeproj` in Xcode 26 or later. +2. Run the **PRMonitor** scheme (⌘R). The app appears in the menu bar. +3. Run the tests with ⌘U, or `swift test` from the command line. -## Development Notes +Debug builds use their own keychain item, so they never touch the credentials of an installed release build. The quickest way to sign in while developing is **Continue with GitHub CLI**. -- The app uses GitHub Device Flow for authentication. -- Tokens are stored in the macOS Keychain. -- Polling frequency is configurable in Settings. +> **Tip:** if a command-line build fails at code signing with "resource fork, Finder information, or similar detritus not allowed", the checkout is inside a folder that adds extended attributes (such as an iCloud-synced `~/Documents`). Pass `-derivedDataPath` (Xcode) or `--scratch-path` (SwiftPM) pointing outside it. -## Code Style +## Where things live -- Prefer SwiftUI best practices and native macOS patterns. -- Avoid introducing new dependencies unless there is a clear benefit. -- Keep background work off the main thread; UI updates should be on the main actor. +| Folder | Contents | +| --- | --- | +| `Sources/PRMonitor/Core` | Pure domain logic: status engine, notification planner, polling policy. No I/O. | +| `Sources/PRMonitor/GitHub` | GraphQL client, queries, the two-phase fetcher, and auth (device flow, `gh`). | +| `Sources/PRMonitor/Services` | `@MainActor` models and system integration. | +| `Sources/PRMonitor/UI` | SwiftUI views and design tokens (`DesignSystem.swift`). | +| `Tests/PRMonitorTests` | Swift Testing suites and fixtures. | -## Testing +Read [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) before larger changes. -There is no automated test suite yet. If you add one, please include clear run instructions. +## Guidelines -## Submitting Changes +- **Status rules belong in `StatusEngine`**, with a test. If a PR is reported wrong, first reproduce it with `PRMonitor --diagnose owner/repo` (Debug builds), then write a failing test using the builders in `Fixtures.swift`. +- **Keep Core pure.** No networking or UI in Core, and time-dependent functions take `now` as a parameter so tests control the clock. +- **Measure GraphQL cost** when changing queries. Detail fields are paid for on every changed PR. +- **Follow the platform.** Use standard controls, macOS text styles and the tokens in `DesignSystem.swift`. Don't put glass on glass, and don't animate hover. +- **No new dependencies** without a strong reason. +- Refresh screenshots with the Debug-only tools in `Sources/PRMonitor/App/`. They always use fictional preview data: + - `PRMonitor --showcase hero-light` (also `hero-dark`, `settings-light`, `settings-dark`) puts the real UI, on real Liquid Glass, over a designed backdrop and prints the rectangle to capture with `screencapture -x -R out.png`. These are the README images. + - `PRMonitor --snapshot ` renders the panel, Settings panes and every menu bar icon state offscreen, for quick layout checks. + - `PRMonitor --diagnose owner/repo` checks status derivation against live repositories, using your `gh` token. -1. Create a branch from `main`. -2. Make your changes and verify the app runs. -3. Open a pull request with a clear description of the change. +## Submitting changes -If your change is significant, please open an issue first to discuss the approach. +1. Branch from `main`. +2. Make sure `swift test` passes and the app builds. +3. Open a pull request describing the change and how you verified it. Include before and after screenshots for UI changes. +For significant changes, please open an issue first to discuss the approach. diff --git a/README.md b/README.md index c3493ba..40d7851 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,161 @@ -# PR Monitor -Monitor multi-agent PR checks and review comments from your macOS menu bar — no tab switching. +

+ PR Monitor app icon: a layered Liquid Glass pull request mark with an amber attention dot +

-PR Monitor is built for teams using multiple PR-review agents and CI systems. It keeps track of check runs and agent comments across your repositories and tells you when everything is ready for review, so you can respond in one focused pass. +

PR Monitor

-## Why This Exists +

+ Know the moment your pull request is ready.
+ Every CI check and AI code reviewer on your pull requests, in one glance from the macOS menu bar. +

-With multiple agent reviewers running in parallel, it’s easy to get stuck context-switching: waiting on checks, checking PRs repeatedly, and tracking which agent finished. PR Monitor centralizes that status in the menu bar and notifies you when it’s time to act. +

+ Latest release + macOS 26 or later + Swift 6 + CI status + MIT license +

-## How It Works +

+ Install · + How it works · + FAQ · + Architecture +

-- Connect to GitHub via Device Flow -- Select repositories to track -- Map agents to checks and comment authors -- See live status for each PR and agent -- Get notified when reviews are ready +

+ + + + The PR Monitor panel open beneath its menu bar icon, listing pull requests with the status of each CI check and AI reviewer + +

-## Screenshots

-CleanShot 2026-02-04 at 14 43 13@2x + + + + Download for macOS + +

-## Quick Start +## Why -1. Open `PRMonitor.xcodeproj` in Xcode. -2. Run the `PRMonitor` app target. -3. Open **Settings** from the menu bar app. -4. Add tracked repositories (format: `owner/name`). -5. Configure agent mappings (check name pattern + comment author login). -6. Authenticate with GitHub via device flow. +Modern pull requests are reviewed by a crowd: CI, a preview deploy, and two or three AI reviewers that each finish on their own schedule. The usual way to keep track is to refresh tabs. -## Install (Recommended) +- **Wait once, not five times.** PR Monitor tells you when *every* agent has finished on your latest push, so you can read all the feedback in one focused pass. +- **See what needs you.** Failing checks and unresolved review threads stand out. Everything that's fine stays quiet. +- **Zero setup.** Point it at your repositories and it discovers your CI and review bots on its own. -The easiest way to install is from GitHub Releases (standard for menu bar apps): +## Highlights -1. Download the latest `PRMonitor.app.zip` from [Releases](https://github.com/BlockchainHB/PR-Monitor/releases). -2. Unzip and move `PRMonitor.app` to `/Applications`. -3. Launch it from Spotlight or `/Applications`. +- **Accurate.** Reads check runs *and* commit statuses, unresolved review threads, pending review requests, and which commit each review was on. +- **Quiet notifications.** Nothing on launch, one notification per push, and a follow-up only if new feedback arrives. Clicking one opens the PR. +- **Light on GitHub's API.** One batched GraphQL request per ten repositories. Full details load only for PRs that changed, which costs about 1 point per repository per poll. +- **Resilient.** Recovers after sleep and network changes, backs off on errors, and waits out rate limits. A repository you've lost access to never blanks the list. +- **Native.** SwiftUI and Liquid Glass, a template menu bar icon, skeleton loading, VoiceOver labels, and light and dark appearances. -If macOS Gatekeeper blocks the first launch, right-click the app → **Open** → **Open**. +## Works with -## GitHub OAuth Setup (Device Flow) +Every check and review bot is detected automatically. These are also available as one-click presets: -1. Create a GitHub OAuth App in your GitHub settings. -2. Copy the **Client ID** and paste it into Settings → Account. -3. Click **Sign In**, then enter the code at the GitHub verification page. +| Agent | Checks | Review threads | +| --- | :---: | :---: | +| GitHub Actions | ✓ | | +| Vercel · Netlify | ✓ | | +| Cursor Bugbot | ✓ | ✓ | +| CodeRabbit | ✓ | ✓ | +| Devin | ✓ | ✓ | +| Graphite · Greptile | ✓ | ✓ | +| Codex · Copilot · Gemini Code Assist · Sourcery | | ✓ | +| *Anything else that posts a check, status, or review* | ✓ | ✓ | -Scopes requested: `repo` (required for private repositories). This app currently always requests `repo`; change the scope in `Sources/PRMonitor/Services/GitHubAuthService.swift` if you want a public-only build. +## Install -## Notes +1. [Download **PRMonitor.dmg**](https://github.com/BlockchainHB/PR-Monitor/releases/latest/download/PRMonitor.dmg) and drag **PR Monitor** into Applications. +2. Open it and click the pull request icon in the menu bar. +3. Choose **Continue with GitHub CLI** if you use `gh`. Otherwise sign in with GitHub or a personal access token. +4. Pick the repositories to watch. That's it. -- Polling runs every 60 seconds while open PRs are detected, and backs off to 10 minutes when no open PRs exist. -- Notifications fire when all agents are complete, and optionally per agent if enabled. +Requires macOS 26 Tahoe or later. Releases are signed with a Developer ID and notarized by Apple. + +

+ PR Monitor settings with a sidebar: account, General, Notifications, Repositories and Agents +

+ +## How status is decided + +Each **agent** gets one state per pull request: + +| State | When | +| --- | --- | +| **Running** | A matching check is queued or in progress, the bot is still a requested reviewer, or a configured agent hasn't reported within 3 minutes of a push | +| **Failed** | A matching check failed, timed out, needs action, or failed to start, including workflows awaiting approval | +| **Needs review** | Finished, but left unresolved review threads on current code, or requested changes | +| **Passed** | Finished with nothing outstanding (skipped, neutral and cancelled checks aren't failures) | + +The pull request takes the most important of these: **Failing › Running › Needs review › Ready**. It's **settled** once nothing is running, which is when you're notified. If GitHub's own roll-up says checks are still pending but none are visible, PR Monitor trusts GitHub. + +The rules live in one pure function, [`StatusEngine`](Sources/PRMonitor/Core/StatusEngine.swift), with a unit test for each rule. + +
+Menu bar icon states +
+

Menu bar icon in each state: signed out, idle, running, needs review, ready, and with attention counts, as template and colored variants

+ +By default the icon is a template image that matches the other menu bar icons, as Apple recommends. The shape carries the state: a ring means agents are running, a dot means something needs you, and a number counts the pull requests that need you. Colored badges are available in Settings. +
## Privacy -Tokens are stored locally in the macOS Keychain. No data is sent anywhere other than GitHub’s API. +- Talks only to GitHub (`api.github.com` and `github.com`). No analytics, no telemetry, no servers of its own. +- Your token lives in your login keychain, and settings live in `UserDefaults`. +- Needs the `repo` scope to read checks on private repositories. A fine-grained token with read access to pull requests, checks and commit statuses also works. + +## FAQ + +
+I don't see the icon in the menu bar. +
+In macOS 26, open System Settings › Menu Bar and make sure PR Monitor is allowed. On a crowded menu bar, macOS may also hide icons that don't fit. +
+ +
+A repository shows a warning triangle. +
+GitHub couldn't load it: it was renamed, you lost access, or your organization restricts third-party OAuth apps. Hover the triangle for details. The GitHub CLI sign-in usually works where OAuth apps are restricted. +
+ +
+Will it use up my GitHub API rate limit? +
+No. A typical poll costs about 1 point per repository out of 5,000 per hour. PR Monitor slows down once everything has settled, and always leaves headroom for your other tools. +
+ +
+Does it support GitHub Enterprise? +
+Not yet. It talks to github.com only. +
-## Requirements +
+Why macOS 26? +
+It's built on the Liquid Glass design system and macOS 26 APIs such as `Observations`, with Swift 6 strict concurrency throughout. +
-- macOS 14+ -- Xcode 15 recommended +## Build from source -## Contributing +```bash +git clone https://github.com/BlockchainHB/PR-Monitor.git +cd PR-Monitor +open PRMonitor.xcodeproj # ⌘R to run, ⌘U to test +``` -See `CONTRIBUTING.md` for local setup and contribution guidelines. +Or run the 39 unit tests from the command line with `swift test`. Read [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for how it's built, [docs/RELEASING.md](docs/RELEASING.md) for how releases are signed and notarized, and [CONTRIBUTING.md](CONTRIBUTING.md) to get involved. ## License -MIT — see `LICENSE`. +MIT © Hasaam Bhatti. Screenshots use fictional repositories. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..425c10b --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,148 @@ +# Architecture + +PR Monitor has one job: turn a noisy stream of GitHub signals into a small number of trustworthy answers. Is this pull request done? Does it need me? This document explains how the code is organized around that job, and the decisions behind it. + +## Layers + +``` +┌──────────────────────────────────────────────────────────────────────────┐ +│ UI (SwiftUI) MenuBarPanel · PullRequestRow · Settings panes │ +├──────────────────────────────────────────────────────────────────────────┤ +│ Services (@MainActor) Monitor · Account · AppSettings · Notifier · │ +│ SystemEvents · LoginItem │ +├──────────────────────────────────────────────────────────────────────────┤ +│ GitHub GitHubClient · PullRequestFetcher (actor) · │ +│ PullRequestQueries · DeviceFlow · GitHubCLI │ +├──────────────────────────────────────────────────────────────────────────┤ +│ Core (pure) PullRequest · StatusEngine · NotificationPlanner · │ +│ PollingPolicy · RepositoryID · Agent │ +└──────────────────────────────────────────────────────────────────────────┘ +``` + +Dependencies only point downward. **Core** has no I/O and imports nothing but Foundation, which is why almost every behavioral rule is unit-tested without mocks: tests build a `PullRequest` value, run it through a pure function, and assert on the result. + +## Data flow + +1. `Monitor` runs one structured-concurrency loop: `poll()`, then `sleep(delay)`, repeated. +2. `PullRequestFetcher` returns plain `PullRequest` values (no DTOs leak past the GitHub layer). +3. `StatusEngine` reduces each PR to a `PullRequestReport`: per-agent states plus an overall status. +4. SwiftUI observes `Monitor`. At the same time `NotificationPlanner` diffs the new reports against the previous poll, and `Notifier` posts whatever it decides. + +Settings changes flow back through the macOS 26 `Observations` async sequence. A change to *what* is fetched (token, repositories, interval) wakes the loop immediately. A change to *how* agents are interpreted re-runs the engine on cached data with no network round trip. + +## Fetching: two phases, one request per ten repositories + +GitHub's GraphQL API charges points for the connections you ask for, not the data you get back. Asking for full details on every open PR every minute costs about 26 points per repository, which exhausts the 5,000 point hourly budget with five repositories. + +So the fetch is split: + +| Phase | Query | Cost | When | +| --- | --- | --- | --- | +| **List** | Up to 10 repositories per request via aliases (`r0: repository(…)`), 50 open PRs each, only `id`, `updatedAt`, `headRefOid` and the roll-up `state` | ~1 point per repository | Every poll | +| **Detail** | `nodes(ids:)` for up to 20 PRs: check runs, commit statuses, check suites, review requests, latest reviews, review threads, comments | ~1 point per PR | Only for PRs that changed, are still running, were pushed in the last 10 minutes, have a bot review pending, or haven't been refreshed in 5 minutes | + +The fingerprint (`updatedAt | headRefOid | rollupState`) catches pushes, comments, reviews and check transitions. The five-minute ceiling catches the few events that bump none of those, such as a resolved thread. + +**Partial failures stay partial.** GraphQL returns `data` and `errors` together. Each error's `path[0]` maps back to its alias, so an inaccessible repository shows a warning in its section header while the rest of the list stays live. Stale data for that repository is kept rather than dropped, so no one sees a "new" PR notification when access returns. + +Real-world validation: `PRMonitor --diagnose` runs this pipeline against live repositories. On a sample of five repositories and 17 PRs, a cold poll took about 5s and a cached poll about 1.1s. + +## Status derivation + +`StatusEngine` is deliberately boring: one pure function per concern, and no hidden state. + +- **Automatic mode** groups signals by integration. Check runs group by app slug and commit statuses by creator, so twelve GitHub Actions jobs become one row. A bot whose login matches an app slug merges with it: Vercel's status, its "Preview Comments" check run and its account are one agent. Review-only bots (Codex, Copilot) become agents through review requests, reviews and threads. Comment-only bots (changeset, codecov) are ignored because they have no lifecycle. +- **Custom mode** matches user-defined agents by check pattern and/or bot login. Logins are normalized, so `cursor[bot]` (REST), `cursor` (GraphQL) and `Cursor` compare equal. +- **Precedence**: Failing › Running › Needs review › Ready. A failure is actionable even while other agents run. +- **Accuracy edge cases**, each covered by a test: + - A pending review request means the bot is still reviewing (GitHub removes the request on submit). + - A review attached to an older commit SHA is treated as "about to re-review" for three minutes after a push, then as passed. + - A configured agent that hasn't reported within three minutes of a push is treated as not applicable, rather than "waiting" forever. The 0.x version did the latter. + - Workflows awaiting approval have a check suite but no check runs, so they're surfaced from `checkSuites`. + - If the roll-up says `PENDING` but no visible check is pending, the engine trusts GitHub. + - Skipped, neutral, cancelled and stale checks are not failures. + +## Notifications + +`NotificationPlanner` is a pure value type that diffs snapshots: + +- The **first poll records a baseline**, so launching the app never floods Notification Center. +- Lifecycles are keyed by **head commit SHA**. Each push can announce "settled" at most once. None of the similar open-source projects surveyed does this. They key by PR or by status text, and re-announce when unrelated activity bumps `updatedAt`. +- **Regressions** (a bot leaves threads after its check passed) produce one follow-up. +- PRs that existed before launch aren't announced when they first appear, for example after enabling a repository. +- Identifiers are deterministic (`owner/repo#12@/settled-ready`), so a re-plan replaces a banner instead of stacking a duplicate. +- Permission is requested **in context**, the first time there's something worth saying, not on first launch. + +## Polling + +`PollingPolicy` is pure: + +| Situation | Delay | +| --- | --- | +| An agent is running | The user's interval (30s to 5m) | +| Everything has settled | max(interval, 2m) | +| No open PRs | max(interval, 5m) | +| Low Data Mode or an expensive network | At least 5m | +| Failure | 30s, 60s, 120s … capped at 10m | +| Rate limited, or fewer than 250 points left | Until the reset, plus 5s | + +`Monitor` also refreshes immediately 2s after wake, when the network returns, when the panel opens with data older than 30s, and on ⌘R. Refresh requests during a poll are coalesced into one follow-up poll. + +## Concurrency + +Swift 6 language mode with complete checking and no `@unchecked Sendable`: + +- UI-facing models are `@MainActor @Observable`. +- `PullRequestFetcher` is an `actor` that owns the detail cache, so JSON decoding happens off the main thread. +- `GitHubClient` is a `Sendable` value holding its token. It's rebuilt when the token changes, which replaces the 0.x pattern of a closure reaching into main-actor state from background tasks. +- Networking uses typed throws (`throws(GitHubError)`), so every failure mode is an exhaustive `switch` for the caller. + +## UI and design decisions + +**MenuBarExtra (`.window`) over NSStatusItem + NSPopover.** The system provides the Liquid Glass panel, positioning, dismissal and accessibility. What's given up, programmatic open/close and status-item access, isn't needed: notifications open the PR directly. This removed about 150 lines of AppKit sizing code, including five `PreferenceKey`s and manual height arithmetic. + +**No glass on glass.** Apple's guidance is that Liquid Glass is the functional layer and content should sit beneath it, without layering glass on glass. The panel is already glass, so everything inside uses plain fills: rows behave like menu items with an instant hover highlight, and icon buttons use a circular hover fill with a 0.96 press scale. + +**Template menu bar icon by default.** The HIG asks menu bar extras to use template images that the system tints. State is carried by the badge's *shape*: a filled dot means "act on this", a ring means "in progress", and a dimmed glyph means "not connected". It never relies on color. Colored badges are an opt-in setting. The glyph is a custom-drawn pull request mark (`PullRequestMark`), because the closest SF Symbol reads as a generic merge arrow at 16pt. + +**Rows are two light lines.** The title, then the number, author and age, led in color only by what the status glyph can't express: which agent failed, how many threads, progress ("2 of 4"), or "Approved". A ready PR shows no status words at all, because the glyph already says it. VoiceOver still gets the full wording. Status glyphs are palette-rendered SF Symbols (the glyph in the status color on a tinted disc), not solid badges. Per-agent detail lives behind the disclosure chevron. + +**Filters, not segmented controls.** Scope and draft filtering sit in a menu behind a filter button that fills in when a filter is active, the pattern used by Mail and Files. + +**Skeletons, not spinners.** First load, the repository picker, sign-in verification and avatars all show "bones" that mirror the geometry of the real content, so nothing shifts when data arrives. They pulse gently (static under Reduce Motion) and crossfade to content in 200ms. + +**Settings uses a sidebar.** The window is a `NavigationSplitView`: the account on top (like System Settings' Apple Account row), then evenly spaced rows. Add actions are a small "+" at the trailing edge of their section header, and the agent mode is an iOS-style checkmark list. Rows are drawn by hand only to get a neutral selection: a soft gray pill with primary text, where a system `List` would use the accent color. Glyphs take their label's font in a fixed-width column, hover is an instant faint wash, rows scale with the user's Sidebar Icon Size setting, and the arrow keys move the selection. While Settings is open, the app joins the Dock and ⌘-Tab, and leaves when the window closes. + +**The app icon is a layered Liquid Glass icon.** `PRMonitorApp/AppIcon.icon` is an Icon Composer document with three glass groups (branches, nodes, and an attention dot) at different depths, individual specular lighting, and separate light and dark gradient fills. It targets shared "squares", so the same source compiles for iOS, iPadOS and macOS; `actool` emits Light, Dark and Tintable renditions. + +**Hierarchy through restraint.** Color is reserved for the status phrase and glyph, so in a list of 20 PRs the eye lands on the red and orange lines that need action. + +**Typography and geometry** follow the macOS text styles: Headline 13pt bold for the title, Body 13pt for PR titles, Subheadline 11pt for metadata. Highlights sit 5pt inside the panel edge and text 14pt in, matching native menus. Corner radii are concentric (`ConcentricRectangle` against the panel's container shape). + +**Motion** is short and never bounces: +- Disclosure is an interruptible `.smooth(duration: 0.25)` spring. The expanded list enters with a fade and a 4pt drop, and exits in 150ms with a fade and a 4px blur, because exits should be quicker and softer than enters. +- Hover never animates, since it happens dozens of times a day. Icon buttons scale to 0.96 when pressed. +- Status glyphs change with `.contentTransition(.symbolEffect(.replace))` and counts with `.numericText()`. +- Only first-run onboarding uses a staggered entrance (80ms per chunk), because it's rare. +- With Reduce Motion enabled, movement is removed and opacity fades remain. + +## Testing + +`swift test` runs 39 Swift Testing tests in about 10ms, with no network access: + +- `StatusEngineTests`: grouping, precedence and each accuracy edge case above. +- `NotificationPlannerTests`: baseline, once per SHA, new pushes, regressions, preferences, identifier stability. +- `PollingPolicyTests`: intervals, backoff and rate-limit waits. +- `GraphQLDecodingTests`: payloads shaped like live responses (anonymized), partial errors, `null` nodes, domain mapping. +- `SettingsMigrationTests`: 0.x to 1.0 migration and round-tripping. +- `RepositoryIDTests`: every common way of writing a repository, including pasted URLs. + +## Prior art + +Before the rewrite I studied Trailer, Gitify, CCMenu2, gh-dash, supacode and Pullfather. From them PR Monitor borrows: +- gh-dash's cheap-list / rich-detail split; +- Pullfather's single async scheduling loop and handling of `gh` paths; +- CCMenu2's first-poll-is-a-baseline rule; +- supacode's lesson that small alias chunks avoid 504s on busy repositories. + +It avoids Trailer's missing `CheckRun.status`, which renders running checks as neutral, and Gitify's discard-the-batch-on-any-error behavior. diff --git a/docs/AUDIT.md b/docs/AUDIT.md new file mode 100644 index 0000000..2d80f8d --- /dev/null +++ b/docs/AUDIT.md @@ -0,0 +1,65 @@ +# 0.x Audit + +This audit of PR Monitor 0.1 (commit `baf7fdb`) motivated the 1.0 rewrite. Findings are grouped by area and ordered by user impact. Each links to where 1.0 addresses it. + +## Accuracy + +| Severity | Finding | Impact | Fix in 1.0 | +| --- | --- | --- | --- | +| **High** | Configured agents with no check on a PR stayed `notFound`, which counted as **Waiting forever**. Every user started with Vercel, Cursor and Devin seeded. | Any repo without all three showed "Waiting" permanently, and "all agents complete" never fired | Agents that haven't reported are hidden after a 3-minute startup grace period (`StatusEngine`) | +| **High** | Only check runs were read. **Commit statuses** (the Vercel, Netlify and CodeRabbit style) were ignored. | Deploy integrations were invisible or permanently "No check yet" | The GraphQL `statusCheckRollup` covers both check runs and statuses | +| **High** | When a pattern matched several checks, only the **latest** was considered | A failed `build` job could be hidden by a later passing `lint` job | All matching checks are aggregated: any failure fails, any pending is pending | +| **Medium** | "Needs review" meant *any comment since the check started*, including the bot's own status comments | Vercel's deploy comment made PRs look like they needed review | Feedback is **unresolved, non-outdated review threads** or *changes requested* | +| **Medium** | The PR pill said "Waiting" while its agent row said "Needs review" for the same state | Contradictory UI | One state model (`AgentReport.State`) drives both | +| **Medium** | Review-only bots (Copilot, Codex) were never detected as running | PRs looked finished while a bot was still reviewing | Pending review requests mean "reviewing", and reviews are tied to commit SHAs | +| **Low** | Workflows awaiting approval were invisible | A fork PR looked green while blocked | Surfaced from `checkSuites` as "Action required" | + +## Notifications + +| Severity | Finding | Fix in 1.0 | +| --- | --- | --- | +| **High** | On **every launch**, each finished PR and each done agent fired a notification, because the "last seen" dictionaries started empty | The first poll records a baseline and posts nothing | +| **High** | The review-summary dedupe key included `updatedAt`, so any comment, label or reviewer change re-notified | Lifecycles are keyed by head commit SHA | +| **Medium** | "All agents complete" was global across every PR, and its settings toggle was a disabled switch that did nothing | A per-PR "settled" notification, with real toggles | +| **Medium** | Clicking a notification did nothing | Clicking opens the PR, and notifications are grouped by PR | +| **Low** | Permission was requested at launch, before the user had seen any value | Requested in context | + +## Architecture and correctness + +| Severity | Finding | Fix in 1.0 | +| --- | --- | --- | +| **High** | `@Published` publishes on `willSet`, so the Combine sinks restarted polling with the **old** value. After sign-in, `isSignedIn` was still `false`, so the timer was torn down and **polling never started** until a manual refresh. Toggling a repo refreshed with the previous repo list. | The `Observations` sequence delivers post-change values, and there's one scheduling loop | +| **High** | About 5 REST calls per PR per poll (PR list, check runs, 3 comment endpoints), plus a `/user` call every poll | Two-phase GraphQL at ~1 point per repository ([ARCHITECTURE.md](ARCHITECTURE.md#fetching-two-phases-one-request-per-ten-repositories)) | +| **High** | One inaccessible repository failed the **whole refresh**, because the throwing task group failed on the first error | Per-repository results, keeping last good data | +| **Medium** | Init triggered 4 refreshes, since each sink fires on subscribe, each cancelling the last | One loop with coalesced refreshes | +| **Medium** | A revoked token showed "HTTP 401" forever | 401 signs out with a clear "session expired" message | +| **Medium** | Main-actor `AuthStore.token` was read from background tasks through a closure (a data race hidden by Swift 5 mode) | Swift 6 strict concurrency, with a `Sendable` client holding its token | +| **Medium** | No handling for sleep/wake, network loss, or GraphQL secondary rate limits | `SystemEvents`, `PollingPolicy`, and `Retry-After` support | +| **Low** | Device-flow form bodies weren't percent-encoded, and sign-in couldn't be cancelled | `URLComponents` encoding, and a cancellable task | +| **Low** | Settings saved on every property set during load, and a decode failure silently wrote defaults | Versioned document, no saves while loading, migration from 0.x | +| **Low** | The Xcode project listed files by hand and was already out of sync with SwiftPM | Xcode 16+ synchronized folders, plus a unit-test target | + +## Onboarding + +| Severity | Finding | Fix in 1.0 | +| --- | --- | --- | +| **High** | Signing in required creating your own GitHub OAuth app and pasting its client ID, before anything worked | One-click **GitHub CLI** sign-in, a personal access token, or device flow with a build-time client ID | +| **Medium** | Adding repositories meant typing `owner/name`, with a separate five-section browse form | A searchable picker that also accepts pasted URLs | +| **Medium** | Agents had to be configured by hand, with inline edit forms | Automatic mode by default; custom mode with presets and "seen on your PRs" suggestions | + +## Design (HIG) + +| Severity | Before | After | Why | +| --- | --- | --- | --- | +| **Medium** | Material cards inside `GroupBox`es inside a popover | Flat, menu-like rows inside the system glass panel | Nested containers; content shouldn't carry its own glass or material | +| **Medium** | 520pt-wide popover with manual height math (5 `PreferenceKey`s) | 360pt `MenuBarExtra` window sized to content | Menu bar panels are narrow; let the system size and place them | +| **Medium** | Colored dot rendered by an `NSHostingView` inside the status button | Template image, with state carried by badge shape | The HIG asks for template images, and the hosted view broke button semantics | +| **Medium** | Every status shown with equal visual weight | Solid wells only for failing and needs review | Hierarchy: attention goes to what needs action | +| **Low** | A pointing-hand cursor pushed on hover over whole cards | Standard arrow cursor with a hover highlight | macOS uses the pointing hand for links only | +| **Low** | "2 hrs ago", "Signed in as …" and a wordy footer | Compact ages ("2h"); secondary information moved to tooltips | Density suited to a glanceable surface | +| **Low** | Section headers in caption size and weight, mixed type sizes | macOS text styles: Headline, Body, Subheadline | Consistent type ramp | +| **Low** | 150ms animation on every hover | Instant hover; 0.25s smooth disclosure; opacity-only with Reduce Motion | High-frequency interactions shouldn't animate | + +## Testing + +0.x had two smoke tests (a string concatenation and enum raw values). 1.0 has 39 behavioral tests covering status derivation, notification planning, polling, decoding and migration. It also has a `--diagnose` tool for checking results against live repositories. diff --git a/docs/RELEASING.md b/docs/RELEASING.md new file mode 100644 index 0000000..40c4202 --- /dev/null +++ b/docs/RELEASING.md @@ -0,0 +1,88 @@ +# Releasing + +PR Monitor ships as a **Developer ID–signed, notarized** disk image on GitHub Releases. That's how Ice, Rectangle, Loop, Stats and AltTab distribute too. Since macOS 15, Gatekeeper no longer lets people right-click › Open an unsigned app, so notarization isn't optional for a download people can actually open. + +`scripts/release.sh` does everything: archive, export with Developer ID, notarize and staple the app, build an APFS disk image with an Applications shortcut, sign, notarize and staple the image, and write `dist/SHA256SUMS`. CI runs the same script when a tag is pushed. + +## One-time setup + +### On your Mac + +You need the **Developer ID Application** certificate in your login keychain (check with `security find-identity -v -p codesigning`). You also need notarization credentials, stored once in the keychain: + +1. Create an app-specific password at [account.apple.com](https://account.apple.com) › Sign-In and Security › App-Specific Passwords. +2. Store the credentials under a profile name. The command prompts for the password: + + ```bash + xcrun notarytool store-credentials PRMonitor --apple-id YOUR_APPLE_ID --team-id G2537ZRGNU + ``` + +### In GitHub (for automated releases) + +Add these under **Settings › Secrets and variables › Actions**: + +| Secret | How to get it | +| --- | --- | +| `DEVELOPER_ID_P12_BASE64` | In Keychain Access, export the Developer ID Application certificate *with its private key* as a .p12, then `base64 -i cert.p12 \| pbcopy` | +| `DEVELOPER_ID_P12_PASSWORD` | The password you set when exporting the .p12 | +| `APPLE_TEAM_ID` | `G2537ZRGNU` | +| `ASC_API_KEY_P8_BASE64` | App Store Connect › Users and Access › Integrations › Team Keys: create a key with the Developer role and download `AuthKey_XXXX.p8`, then `base64 -i AuthKey_XXXX.p8 \| pbcopy` | +| `ASC_KEY_ID` | The key's ID, shown next to it | +| `ASC_ISSUER_ID` | The Issuer ID at the top of the Team Keys page | + +## Cutting a release + +1. Make sure `main` is green and `swift test` passes. +2. Tag and push: + + ```bash + git tag v1.0.0 && git push origin v1.0.0 + ``` + + The **Release** workflow builds, signs, notarizes, and publishes the release with `PRMonitor.dmg`, `PRMonitor.zip`, and `SHA256SUMS`. The README's Download button always points at the latest `PRMonitor.dmg`. + + To release from your Mac instead: + + ```bash + NOTARY_PROFILE=PRMonitor scripts/release.sh 1.0.0 + gh release create v1.0.0 dist/PRMonitor.dmg dist/PRMonitor.zip dist/SHA256SUMS --generate-notes + ``` + +3. Verify before announcing. Download the DMG from the release page so it's quarantined like a user's copy, then check: + + ```bash + spctl --assess --type open --context context:primary-signature -vv PRMonitor.dmg # "Notarized Developer ID" + ``` + + Then open it and make sure the app launches with no Gatekeeper warning. + +**Versions:** `MARKETING_VERSION` comes from the tag (SemVer). `CFBundleVersion` is the commit count, so it always increases, which update checks rely on. + +**Testing the pipeline without signing:** `SIGN_IDENTITY=- scripts/release.sh 0.0.0-test` builds an ad-hoc DMG and skips notarization. + +## Homebrew + +`packaging/homebrew/pr-monitor.rb` is a ready-made cask. + +- **Now:** create a `BlockchainHB/homebrew-tap` repository and copy the cask to `Casks/pr-monitor.rb`, with the release's version and DMG `sha256`. Users install with: + + ```bash + brew install --cask blockchainhb/tap/pr-monitor + ``` + +- **Later:** the official `homebrew/cask` requires the app to be notarized, which it is. It also requires notability: about 75 stars, or 225 if you submit your own project. At that point the cask can move there and BrewTestBot bumps it automatically. + +## Why not the Mac App Store (yet) + +A Mac App Store build is possible, but only as a reduced variant, and it isn't worth doing first: + +- **Sandbox required (guideline 2.4.5).** Networking, the keychain, notifications and launch at login all work sandboxed, but **"Continue with GitHub CLI" can't**. Child processes inherit the sandbox, so `gh` couldn't read its own credentials, and running a tool from outside the app bundle is disallowed (2.5.2 and 4.2.3). A Mac App Store build would offer the OAuth sign-in and pasting a token instead. +- **No self-updater** (2.4.5(vii)), and launch at login must be off until the user turns it on. +- **Review needs a working account.** That means a dedicated GitHub test account with seeded pull requests and a token in the review notes, kept valid for every update. Every fix also waits on review. +- **Precedent:** Ice, Rectangle, Loop, AltTab and Stats all skip the store. Maccy ships both. + +If it's ever wanted, add an `APPSTORE` build configuration that enables the sandbox with `com.apple.security.network.client`, and compiles out the GitHub CLI option and any updater. + +## Next: automatic updates + +Add [Sparkle 2](https://sparkle-project.org): generate EdDSA keys, set `SUFeedURL` and `SUPublicEDKey` in `Info.plist`, and have the release workflow run `sign_update` and `generate_appcast`, attaching `appcast.xml` to the release. Until then, users update by downloading the new DMG, and a Developer ID signature keeps their keychain access working across versions. diff --git a/docs/assets/download-dark.svg b/docs/assets/download-dark.svg new file mode 100644 index 0000000..5efae92 --- /dev/null +++ b/docs/assets/download-dark.svg @@ -0,0 +1,8 @@ + + + + + + Download for macOS + Free · macOS 26 Tahoe or later + diff --git a/docs/assets/download-light.svg b/docs/assets/download-light.svg new file mode 100644 index 0000000..9168973 --- /dev/null +++ b/docs/assets/download-light.svg @@ -0,0 +1,8 @@ + + + + + + Download for macOS + Free · macOS 26 Tahoe or later + diff --git a/docs/screenshots/app-icon.png b/docs/screenshots/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b08a1531654f2698efa6dc467c88d9bc511346 GIT binary patch literal 115256 zcmeFZhg*|R(OF}?uC$A|F0F=d0VywsradvAJT}=SMpBn%OdJh2nMG4vh0K9|%fSs2B zfK&l=F-YidYYyEqA0y>@wJBjD@g`j-kI<10k~ooqa<*nOQGojs&{WjX$Z zAw_`yCJS<~{|m*_L6*Z<^98$ti@OcGxPXv=5C@2Yot<6A{k5%>uAF+ zoAYn7fA#C%)ye!VOv+f-#>2(Y>u<9_!eU}F|El7DN&T+|{+q(&f28>DssB60e-Ris z+k1jU{;A}DOa5hd!rs@$(L~YS$;R2^Z|g*!h|386k2(J%rSbof^1tQ$@01EI zjxO$cu2$AIAmM*1`)^7AV9N;p<==nf=f8#JU#SFX0a3^Z{-@-DD7JCEZUBHBKvhv* z-qFf5(2 z$EK$jcBIO1lfFvx(~#?a!$GVp_tKp-Eze!)X3x-@X6tIs{}3zJoSPpi>MD#dv<(Bm z>ZS@K4&m;b!I_*#rFIzF*@aP$yH9|U#BO9upB3(L{-*@CA{E$&7NQ|v?mc-P&fo91 zzL`il4%KfO(K=No$f&CO?=R>^|C7FaJ{n%ZrY$y3(iMtU;m46F3I8d}G6JM4eEV+q zu}jE%`i9EXCF9b3Edt?Q-aBiYV1l$iy!mubqd^O2g-k4$3OET<7pT{!3+}odDXj!; zyqULKyNjxDS1=L36F&OIhUb`r*zP8grL=jrY+gkg`L}Q@>vZ2A12>+riw|^{l+rwo z7s6OwT`0VF8=TDu-~L%4U1FXFTT>?05+OeE9ysaQo=H_UObIQgoh|WQ3p?+OIk+vy zUJQ^S8UcDFSds5ush+$$^&{sx6e=g5K5hplT7aWflu4s0iDQ0n{(kb{;(MbAHF=Sc z%qLH_gknZq3SCOg51E{`)ZRBcee7%ff<`ZU1tr${wUb4x!oe|YUfnWe;f|x!ET2Y7 ze7ASBkmjS4Q)ZtbaGB5b85rtGR#>a?(Pbb$jmE7 zx(~d77@{@hd!dVEkAGsNjC<7$i%~hte`aPxFuh%2%PmK3wpv~55y=+q<>^#+FSpU> zp}o&)zMT&pW*79nEiZp6yv*CrJ9JR)*4?f%>2Nx>Vad5Kak>3kENt#sT;+k?eAc(Q z{flt{u7-_0PefLQw9i_?>z|ubDOQ)k3F-k2y_Va4RKNFL1BpLRU(3;jq09&E|8#mj zwHNfO`ZN*rQ&9CX^VfU&oGM8s9%)sP8P=G9qK(&HBj5I_zQtRKpI@81h+7jV$qZ1% zAGoH@sm4vsO2-H0N-|+l`(iHQ+%?YgA|Kx#II}ddl*|j^e8zkn$*;UW+fJuVAb(QF z@^bYZ*QaNTM(_{>%!9P;9cZIhmcEx#xa0)banY`N@+@ojdYN4<5Cr${ho(P0?tL-su~FAK6}_yCFJk3lgXL}u^7s5EgQUN##mhKx>WT^2Q)*fz*~B}> zLuzS9cAT!+&&Q`Pm$d8_8$afp zuPmKCtQ!h{^9xhKA zX!cgK;4-z}PQSJ+hfBD%acYsDwCU6#}%iT zqZcJZf-p}Y5iwtfuZ$(>vw>aAeF(z?GzLk0ViWjPGH$W91cozM#dUZHZl;z&e5cTr z(Bec}35KtON}R0x^Y$9m-P1+05>oA+2?$92Z`E)13zp7RV~w8$`S=9I$_+s~k;z}T zdRXF>JmR#ABhcf-=@0r zR8eK7hobA6U%b82?dcR((x5plx%WlaMQv$He&vD_^xF4*aM`Kfd8;UXvO7Acj@TEx zZU|fO(yz3S(S3&#frUy%-~N{8Nh}@8_A22yr|xzv<1>;3H{I+XQ6p(sf#kxnh>}u% z`|eyOhbF1lIx^M31o14^M>G_J#tD$#XC{Uy#Sd2Wfz%}KU5*p)bgc)4G|&>Zp9MQ# zV-tjQyY9+Prgu4&+hzN)F_o9DkQUvYV0y*JoP0;p=CUYjEsB*V8Y$S|@4?hML}y%% zB7aDEdV1Tlhw&h~E1+lWVJ9FcNBFK>cT9%YB%>DlQ)b!#)vr<4LYCRWdK9RD-Y;Qd zO#A1tVy|BEZ9_zpAef_lFWA}W4G#ULYw?aZ=b~QVDv{YhC z+kbUkKC?!`4_kz%<)w(~y}++glXT3sTzJ`Vd487h_@GT|Z^oX)T@n<>b}ug3p^mHN zKO~^iSH_g|S>!HeWvWhttKG9qHQI@e*0OfFGZ9+{zSz7woF+Zxi{}AXSJ#)#na-Ln zzV)8nKhWLe_*$anlkGu+bqbJ4F;^`3-FF;#!|e zwp-}wEO*_w>=YZ1vzM5q^zV@A`MTA9vmRG1pV~U_3Q+5CO>67D6xv`@8k5})vyo#w~AEr)m%p3Bw8GX&*YT8mu#WVOhH=DJ* zuXa2+&3(>_|4q>S*RO}U`nlg%3lrO#yjr5{-)c#d|BVnXNko32Nv3v`>(T*?_kF%T zM-)brBcvOz!$%ew`yz*Xo(!I98_#O)#VA1~e1f2I+g>1r2XzKJq1+{<5)fUV@Ku~QA<(-|Kr^m{R zX@dNGKSJ1QP9F5fD>cVSR7_6JtVb#Fy3`n%F_gwFI#+#V5SBj_o8=b;v~t0Sif-DT z^@>nQ$d~-sw*UV5O~!qBk0%G;3;IV!J$l(Z`~F12~-2@SqS2|U~e-c=% zJ3oCmlWeFw{7u>L>Q73OXVTZKy`Z2zo5-+|c-{pOFDlpY&;|c{tSeTAw_?LS|6<4w z>Caled>5|V#s#xX4WMg(Xf>w1MaR@cQh3eSgP_)lNEhD)y8L082e`P1Fg8juY4~4| z2e?={jU6}6PzTt7cUoEe#i$~NXb9w3)@VR zOIRL@Z#2(mT}w9i1QHV$Mk9S|um84s3`;ABM&xHi3b6I^nu|h@$A_Uv4@xs_rz+5K zuePP7shLHqBOcv2YW&vI^zdEV%G3VhUoRN2$C5oYLM6r>k*x3=cIR(4rt7rFmVJXB zVHtgZgZ?&Bj5HqHfFg>9cccyp+^lczIr@)$s&(!A6P6-i#<|m*eFqnHS9SM{`Grtq z`si^E^V+Iw^p`l3Xq$*bq>5IVg%s6~^wxyb++HEuvE-Xh9-0bLjvv~x^-)}gH(ow` zB{%as*yKh3Q+isiqRLg$FfJZVo0<=koo0EG&tP?9B@f0K%Wkbtd;QjsZchsqVHLNn zI=PSlcc~}G;=VO^ddY0hv7y8_~)Cn?9nYvl+WWUjrP47w{TY-{=^*mc-ySUD#bESh*L&2e6iKjOLv0pM%9(bZ%2aQ<@8WzX~`H zUp2(Xz%L5^w7pq*6{xY_$V>8*Lx6?GB)IT~bNT5B_Ub)ERUp(6?x2E;0 zYxGEWfM*i|AYL3sKUD1(ppbhhu7+iq~_gZ zjUT+w1zY3NwGp*M*lTx}8cHK4o=c~*_X>P(0TpT6e!>r3SyMZ0WNg-vRft|=}TeQMu)<_nAtH&E{+qs z2GtVg-(3pR30kIc7w5>qjwPyng9lP`c$ z$Kd*V<37mdTP1BML@CfhrSK?a8}5c|n&adnRccX;jy9Z!GtyI9NI|oE7U+uz&MWq4{#NH9VK3Y8+-dc+O zlM%lHEY_`=?D2l@u9Ut^_$B;Ud}{mhC3ccn^v%Owrh+89wL(*?)-P_lTyiVwfe?na z;+8M>4P8Fo7jH`cDq{QFRfL+)d{ywCc7~diaESbq4m5>yoPJ_#%g-l+{8aj6xq;P9 z)Mwk9f~n}Ros0$jTGIE)x9Mj6H8t4Pi~WhFc`sh>g@g!)=-Dgnh#FV3RkWXUKA#hGp0f%`Rr3Fl0OWB$GNc(3 zcII9=CrYBc#(5yTWgXwPTf0+(^lbwo&)W`~(%?@PnC7q>$@oDZ=ccpOCNPd1vc5nx z^TP_)=1pCwrjtkUki<*i%=h8kN<-7zwG&V!$#=bphSpRj$rC1Qq# zhGU2;A9&S-Qzdf~pX`+79-rskq!OFKz$Z>w+SXz%U)Qz`Jl!K0(;yw0>eQ#ZIU3Vt z6?$xu*V3hx!ea^;1NUfFCaA%~sCLcgN|8>TIrO3@ez$E)#P-X()QGccrz2Iv)0tEl z`?eH1?^W94EFv5*znA1l;B%ZRMu8SsE6SY#dbwT~Ye`h$sfPN2OTM^1QFWS_UzSr@ z?rNFU-6H6NG@@l4!>H+`+`7VD*LW z7E_HJp3HQR5(^yCm%9!WQUCViW2GVbCDeKH@z1UIvt*e8Z%7U*rP5e3l}?7TY0Y$j<1V*fm7^r)L^eEpYx88)*Z;ay~Rrji`lQQoR# z)Vadmvlb~&By=j5EBEfp<7Oj>6Xx6no2}lzIhlljBjXlf-SDrhpyFsdH~Q-M zYu*Ri+$JuiQ_nV256=8Gy^B(oGijelAT{hF0?@YNAksxojBQs;^r9zfuV;S@OIHK% z-CmY_kU1O{7qyTQBe=YjV{Q2*X}BP{H=DHLnbo(z@g_aGsL(LCCf zup?tp5ZCx%BFwWcO%eOOts@yfT5sj3HrR+k>oJ&CUaud^li+-kEaaChl(_JsHBm2n zJL%ZmdE$E!_=V@0mB8&g2qU4`_yv6sNgbLq_IX`K26M|TcJ>Gi0}=i6iY5K!flVvB zp?1qAn;2fTvfk&juh#OFDOiGv$avT#9Uri!lm)aqa288IYn9NWMSJItM@< zzZPot+tqHldeRuPv;f8eo6oyuA^1zW^3WT%Z^j$m<&nP=o8iF1n7h{dk<$;IDNRoB z`@E!yWqYAWpDqCZnYV+ALJz~1D+bReL-)pk7?s?n@=43aYBw9JjHWnS^mwM2Z1~ls zwmj74DbuSQ1i^n1#c&2Fp|j$dw3yoex9l-FL==oH$dpjOGG7T7*A-E# zy9nnc)?g$jtIvO|$rP!?8W(X1`6u_ZQ!6y5zNP0H8xj*#jo~ zAvzam{WUAwmtjJdy|do$3n>bZ!uOS|9*)#(yJ_M~@|^KkM*;EpK-8y-?3@e~7Y?e@ddIGn(*j!u9##dgDt!#SF^?y*I`% zZF}xV>R0{hYTRlq54Ym8n93f=j3>s<)uV1YJFeWB$$8sjZN4(ff6H1XJ6RsL{0=$^ ztJIa{UoAGet`e40_K~sovC(yR87W84n;#m;6=b}AD{qO+MA?nmR?kV+9Czi-H(h;f zIeQCt+2m{jLeUKYvrY5D=^QCl9CCV%LG)Z$kS1J)je|J6P=Ho=Bi`Y0hX!uMKwA+6 zFYNJrvNc8~k|vH6W9t|*`Pj0}Rb6|CR}$E?T@a_-N( zKR3pFSR40y`U~i8#h%dk_(^qB=5gAo4{c0Nf4~rYdP@(lmlBmLtByiY_cDTC{_?rC zVFOfJP`krRD$qFEb8Y0ylH1G1k?XX#&%z}}Tj$zulS0~dTNmrDLRj!q3+D&>E*Nb* zDxd_q{iHeVh0fMCQSq%(Np?i>*K1E?j>82M2k$pyM(4?iyp*m!bbROJXr(Ar)40t{ zmqO7OfSK=~-xF;)tvfiLQL@_}o6+0X@*#1-)rYaTm~G7oTKB?(m`s{=zZe87$nchi@-U15kl&Wc z)2n4~-~6@T7$nm3wKq+hW#Vlyl+@gH8D(`c61qZ!{5}2E2%J!GGR&g=8xhr-*>%W% zCEU1Y`H_rPoFr?VXIR>CS1!!y#@t;X=kR@^na7O}@05_P7c|{}UlY0-LKbh+$Z~4G z$87vYz^8<(Xk#n@c4Ak9z@GqTuQu_kE%SplHQk4e=U=6KJB#z$=!pcMd=7j;`t}oA zelT4POUH{|{~402p1#WzvH7Z#r3v+g;iTo<2)7YB5y9dxwRn;aQOt$k-`@a}q|x)0 zA=>vE%jRbfUMhnQ_w7=PE|g?F7gCU!A$E529?tNNU_d)Rd`apun2GLtJFq?g6T6(j z)VRAz-F@tre)3|-^W(L*Hm<5<98WCeAE+omL-pp9Z(w1@d6|k=B4Zcr8yWc$G3F05 zYx9Rgmanoae!3*TR3}w~E+%Okok2C#Si#U7RmK}E$2&BTuH4-q>s~ zXsIbADv-9(O6uNx>*LjVq$M7)V%1)=aJldepXYOOun$Ks;{V3mYib|AW%CJB|Lz;h z^J4q$cXlIp_xyIwQ!{57qrZMt`loDvGIvA6#Mom;J*}-duhLpBfIgE${566Q_=awP zy%h=PnuC3My0TMKr0^L>(w6XUw{^f)5Bi~{Hmi(OAPu0l!{r(&Gaw}ZSIf2JOhz@& z257u{&nU>^cr#n5Yh1r7_p;$pc9y|RjJoWFI&CjH1u@f2NCfLS?4ku#LVm-U`Nd@C zGd;B%CZK)AA0GOo`dZ2pU`qeCEp~}iw1aEsO~=cff|6=WbRq&0c$N%4>$T1GDyyqJ zEnsAHSqktq65?=P*mv?lillp%EUMROw1~D2u!RI!1o91dqM$_peLIZr5OC_Y1kz0v z5rZ@!@2dZ#AwL>o?)n9hR?(!dsj{9`T24|z+P+G4^JYZ?plw8}IGSeg_uoNFhB0cV z!52K0u+!IN-ePFVf$atJh0K)8&uTUvhVU5_0#d>N6+oUK@*7U$ONQ4gC!zK+${ z>$NLVS(DRr4B}qJNhky1j}-RQKd+%kT~?=H*b-2am;LTs=dKanJ$;j*!W(yU;17e( zRRE>&!SKPEw}%5urg009FH z9CA&*Pf05qZxMY_`kvP=@bI)ktH4q;veM111dQ#6U$|6*Q5gvHKwPK~xTdt;Grytn z$gNR!_trtMY)He&J;0i876MV4Y104wThfylWpRRJSUecB` z_l4uSGfEuR^R{Cys}uCSL2N%XCrXJoBK39_q=R9L+b5HmMbB~!+IZA;5XUmT$f{9N z2wU3Ts}L&^gaXcTrnjOh@vMO%y(JxY6tI}`prPyiZ~B6nmuL&c(J$mggNB=*WqC!O z8+b7#LFl7k$cG$M^q|Z2MRe3b2^41pv9Fd+zB^omS8W!IVWo$TFfz}`@^;r%OeS(-T*bJh=kn= z4>_ZaRL}B?EH{(ojab_v+X^I6WnM@kCCe~>O!pz5pdhZM{UUmSk=hxyU4TD3bie*x zm3P8#>n;&G(oo0Yd5{P$!xiCUYai@qOO*22&7e@qNEE6E&k(G0baLXyYvaaSYEbF4 zO)mR$8RD}@`L6C47ZOOWC>u}I;8oLnLIqlOZWWkffs++I*<6LD&YLk@U?P~n zh}jy}#-^7#@Ojr6PaHRWmbnOH&K+ToFxxbS#clPl;y1nFFb~aOdlZijf~h?ta5U|? zx{}rL_`0wl+)~oPYvv$+(y0Df^7bo(6=7}WqSt<~-Zg zz!%er$?$DE9C7o!M|RZ++ULdY)B&wOuWvfRX))iAy4&nDgj!zcrU*jPJ_RhX1zC6; zB1l49yIc;o8z_}8E;PNsj`VgzS*znGcPk021RXetG>|YSKu)tAvMT677VU?dxrt&i z?OB{VMo6gwR0dn#rJ63KK_Ma*vWMBLMa+3x%Wk2itEqN_h&-BHyvC)?45<$Uw%I zo4Vk~fuqeLw><1?-#WZGx#UlNfDnH)vzhhta2It7`pLbey2}gIs3^W_&%zh(7TDi` zT~kV(J1$)M;vV6y{K4}n`;)--6y1Cwtu&B34<9d65mI9vAGtl%x>9lDbH1u01|VQ6 zzsJxaO&aIP3iT6pd6M3Cr8^dCH-u=x6_kiMM>{XnW7}sl*V2CEzy65IUKxk!e?F&U zSFyv=UCStl1`+JH#LgQB2i~jBmScvyAe0`s4!N8RzMML-g>gaN;`x3ajqUF@{Gn~WzT%>vtgo`GN5cl46U$HD#4!{44O zLrE6zz}j}KmaVOY?W7O83;U|<=Wh1A8A}KtIkGcd_Ix);G;2)vhiz{DszteddDjKA zJB2S`fdu?@?o5OKs4j?CK<9@xF32#<-{}E$Kj$-cvv>Al3Hw`oxnW{%!ZlK*)lde@ zo)Y+$|0*XCyS1^g9%1Ik3#UNzG)8{jWoFymee1p0t?XM%+$w=$O6Dax^5|~yTL2ai zZ?Lrph!{&G2Nk5By9?>m-zGI^l4bRnh%I@`PrrImQ5FO8$`YJyZr*wkRt~#E1;2Bt z0i^D4UisdSpa~sc7nHdJ(}zySgRtQr@uinmGJSeI$rkG|#oD4WzmZO=5O>e)!*MU~ zN0|z~G9Q`|)k0d+XEt|ywjK{RM{Da@Zc}^FEBS55ZjQ%gNbg=>%^gr3GfGdeUAMby zOA#M^sD_Y1oZEb2r#R|dXS|i7f34l4i1zE^STzMSjOPDW#Rv6TNH<|D0*m@%_clMC;a0|aw1RosHN_$C;*MFPLg zicf4zgHxs9+ltZ}SY;NHSJJ^!SRMD8;V(G43*3Grf)}ud@^L#{oZH<@{B9zXYJMpt8ziSL{YM0$hu%Gz5=ySi}yy zzz+v~V26kJmYVpQ#SK0PFVW0xxeC5VMSvcz809U~113qzLeaQ+HF1MY+q$*w+~6Q4 z#+Mt2Cd{~C4e0o!#C)c<(#^`oYjyljoxfkIcKWmKg}TLA;RcLPZ9k9|U+jhqYq>9h zA3X#Qmz+MlaT-vme7W~Yk!8|M4;>;-;#BRi_>aBNPHTL zv|9L!<5$A+8IWVUv5CTSJ{wB|3C~?y9P@*y+C6-K%b5eqq5m+Y*&(i#93N8n1=3Z( z3wqayIVcLaFr8cSsp$^D`3|+X%r|VL6nda6g_bwH58+g^+K}apbb_)^n7X+WTjINYDc1f#`ztxNc|Z32Ou+(N zIFuylVGNx~0Bs+=V64dYH)WT>298&__7QQ!c5E zZW6aGvS%W_tVEF&;ewRu z(7kBjA6E<2c*`XRtBXs<>o*W@>)VO++~XyVF%j^))EvYtUL6OR0k6=66RyRX`dWAA zebE#&gxNMeg3-6S=Av5f;B?W$<$QHuaR{|<4TCoS33oZR=Jz(xV8LpkJ^w%A$#-*;Q!aH<)iil;B*WPc9UG2y-VFg?r;J{H1NDfsl)K2JBKd1pvI=AA_bU zBmN#>=IsL>JoHHUV}T<2AzGw}E!P1(h7q4X-JMFTK-eM-)7K`qc`@uhmQXNtMzqxM z3njOBV3?}1NCpdGsk>TSf)SdpzTg$6(-yg^i_7i@(jp68nkzhkNifEOz4rC$JM^@( zYTPMyqP*?gLCe>Hax9w1whd*U4sWEocuQ*wIurPe!AunPwh4|ZdWvj_epPSAvB@Y@%BTmANv$5dcF(A1y2 zj-aT4S-GwRUed#2cL~;B-v8elvj3kfcWkNOo9*7BaUGQWLF1*Dd-%GjZ1a%(wq7k^ zT2O#{&Isy~T{e`UJd2J-Yzh=5af<32ZabnwCdexpgdsCDonS!*;(^7DAC;$AsYHGj zYle<1xqf|89>K_=aXff-qOR(J`P~4+<7new(=Fa+U$bqnvmy(c=q`BH`Qb&NH)`j! zclCP@3aNu2_}9>Np$PO`u3+F1ClEdBz_N=Nx?3I-ef;qY+QqthH~_ak&|+sud|=J> zvZ2N4;3D%%IrMoVe-cXb?D?Ii82v#7v!Y{}m}o)0x2Aox-@-w>msX%%j91D;Z#X6o z!m(nl<9?A#*!mTydG6#0HxXCJ*Ghl5K z8g8wxg>m$HXKzrj@<~pN%tg!eQ9R38Xh)!N(pb{Zc0q#U4?z#LWReQ>U%(Jpg3UX# zK@e2+F$WtK#2SV$gsxW%(Q|vD!74GAn2GK9lJ?wAJ^bIvruI-GfHWmBNX$g# z>vU(S&(ssI|VL03Wm20O?1E=o7tWpMZvqe(2<4_W&Mb zizCt3l0HG~rh~12FORQ0mmqw0`Ba7&SG6{NVtVWqD79lo8mJLyibBaCK#os6Y3FVS z-2@nt)ZQxnEWxsAM!A2MO<6GPbN3qrIA1^2aIz{5D|Ec7y7e6ww5*nGjtm6*BP2Ou6p)J4MuAd6zOO_k`AKfz}8^&DuACCTs|c<7v@^ zc^2;O1tZL}|HYxWErpIHtg$^G8f_-iwEshwr2u~jyi`Ds00~Ow1?V*V_;|PeN29hf z^u9iSf1JZ3peW)lYz=*yIhJeDl`YnDXxypR`hJl{B!KwtxGn6Fi@0Ekg;b3jRupLY zE7`QYIl3GdV>mqLHe&=Z{tmkzKlwpB@De?)JBpIPw=Y`a21@W_n-YQucy`rqY@#Y> z0B#Z+z&eCEeANv?YImvMwnE8H_jPDSwY1`xBybHvtImTgP9R53G%%u&4Y zYUu4tq(mvHpJ>C5CZ1DqFPo$CI|gpz^T&OjK8AocK$^mRDq6658H#2j*z;hs&w3e$<+@LcFTXT0 zT?SzoK1KVQU&5y8Z9>H~I%(5^0+)r`;kCclA?uG)w|MxWm#X2*YgfvQY&%!wAbwde z4TPcmG>MnU_QOc%%q{V21P+jv@Iji&G4Tle-m`McZ))c^KJ~_6^~ZDF$bv$j?&cCF z^*6>RNuwh0ql<6wU64x*uMwj8e5~zKq~+j(!xj^95zw%0vA451fR9c;35WZ1FI@3yZIzLW@Tl;l9n)ERdMUz9f zFyxovUHFtOQKp=^h&G0HuF|d>ohFFifGf`^f0HS5PlBL=#i5G&S&NyQ(Tn5v#ml`6 z&vuXbar#)K&`J9PV109B<_$lrnq1t{ZHKwgiB|qOhbY6UV;U)NQ zho|3*Wg(G+F~2S%fb|KI^yJd56`pzQU+fTCmbg8;Z$>4ui@!ELtDEpPyz{oFSJyyg z9SVtFTp}kxu(@tn@9-$6%%+PWU~gbCg^xMplV3zx8{^uz_~}vw!OD=^t0f7*!=v!E zTcQXxusxgT%W9$plWm?|zTJYkZ3>AxHgmnKqj(V6#%O#-p3CQ_1*m*BnQO@gQ8m{F ziilxqLh4CzGG?9MNJ_+J2G!M#B&4Pw&BfaFyw71y=k}op(+ja8KRp}P zt3M2Gejky36=5jG|O`*?lQ zl$aY@+(nJ!%}Iil>HXKDTnfz_W1FB?lTA$$E+-MeJ3xvjxyAZ@GVOkh<4H1Tg3;l- z=VkE0PkXos{LRJEbk^M52{Bxbx%bJJ_2Nu)?xH&qSP?jYk-QQ#0vsiQYgQNEF{IEo zRu9RI>2r~~@BhrRWYe^^@)EuIG~{IGN<2&N&jJrjNx=_io**tu-l08v2T5=S6RD}E z;Qh`XDVv#IS>FTgcW;j?4NDVzY5TjV%G|fA3~%nm{BrsQ|&X}=dUZpbRdjc zVmX&tb1+-szc^^@Qit?q(gk{@pwmB^Uk93rWR?oSwvAR|<2LVJE`>^c8cs&)Q|Ak1 z#}{kssfZ}ufBI;E;MZIIS>idqKCCTj&*om_a&F?ia|&ev$4%R|y_ zKl5gT|Gk&l{D!HI6LQ;82p#gP$m;N5*5yk0^SMLCE6Vv7n;n#Sw{Ww|m9P9AFm;f)%(JadgEfz$j!;pL4^X@Vz??e+Ho@V>ts<5AK3lEOQon zQc`E=(!Myco$N}J6&SFzB$gx9LqHK(I^v!dm>A2&oX##6;ewGqM81W1)5Iy*3L0-5 zAxQblvO+EXd5rO_*suybWB65U^A6D|a`>=_QC&n?$NH1q?WARIInmyelXxYVo0Egh zdR>eqM8nX??wtAsN6Qv(WWJv7idIiNEH8G)d|g`|WO~Mk>4IRQhInw8T*$tFcZv8c zI$YRzt~LPP&}o6iv;iT=2HB+(tgG8FA_jAIv;qVj*eQK&yomT@$01%>ApE*E+r}fn zxPKs4pF{JAHPwyj3fCOq<5JEh@ke^D)U@=zY6_SbT8%D`IX>^O2Bkvx>=TA6us3 zHuz&$uFDv4y`0)56^~{zy2GkiP}wZHpR&C$YvS`j@MY*^$S$XV8Jp!-+S~YyGk$j| zJ*+EIJzj-lFve_geJYEXXSICpab-AH$otQ#BBb|SPFn>}DM_w-OmQu?{*+QQIA09} z%fW@R1`R8w1A&&iFncV|5Zo4>KLMO$JHV}iF)p|p2#S#|xtvJwiT-`_+i9Ec3hyPz zmUY`R0`|z8DPlxGX)k%+ST9d|>}xf6-GrbT-d|P(xp6FyAgc`@pih@883U{m!!Vo22{MUkPKbj*r^uxko+otHB(8Sq@L z%_@63@L;@K2eKXCFE%+^F(znI7e0|ZIFk4mhc6wdHIt0o7UKIIPdFFeRxT>3T^sr| zOsnU={#fI{eyXJ3juqTtttCk#Gwty07fDNdn>;Ble@Gs{im4jsvrrk`u-or_=~OVg zP}^MQb7CgJRNQ{ZtHNSKmdR1pn1OemQC9?F01f2@BN%-HejT z^!QcVJI@l#+nD*MlQyk$BlCI^`8h%^2pYS`!qkO%B}m<&Y|;GTiq1ee_`J# z7&Z1I&pu5#fB27YLfN6V`iz>%z37nUV=Ix>WBnYRNBROz^+no}<;97WhH5jOn2sKs zKNi@<4xHBgyq5 zYfY#rUG!vJy16yhwfb}lMh?qNh(edV(C}ij{)cdEASn- z2@bSA9@%jTbyiJY=9W~dr#gE=fQK_(Y}8migda-X&fJuL3snu(ugfNFSAc9^3@jBc`ilX+TE=5F#`tiN8)_pF`q>_6&e*@mj2 zm*Tl&)CzXf$2N|>kJiHn6_l}b@E?Y3KVnQ_8QHH4?uJDq0;;DNZ~m#Ji|0BjHLCy0 zjdr#cUNo+)tgWbY-QGycLcNUDxMFSA=EZb0@c03~M>h=_EDNQAoz5AXFkc`$%@^&0 zxK|6#<}91jHZof^@0ehdz?B8CH+D7v@7oTPf;EzjP>~KyVa;vgmbXApi66@ZSgK8W zhG{y_^v=W?#I(5-gEd3I4j19r7<@_qQRU+yT-&3Na&l_k$H+Cds;w-%qPf>6?FYxo zjQJ21dS(RL$r4mE*2_Fd={to-_r8AZjs13oP1%n@dxM8Cbrf>U@NpJ(HmknO?SJm! zJryDD{6s7TztZteao2-~O@j|;G``v|JVh*dx6ags4pq^buPU{w!I!z(HUswJHQ!cx z-15jE{#FszOT~_4Zt>)Zr56e_8tb_(*S4 zyB-1?aL8+NGKVpnIAy4ZbWoxSXCLvyPE*kX%IRD1HCWsp=-N(OQG=1$>GmtiS$y6V5&+U! zu?FqdYUg<2bKxe>G2JQZ+N+`$}nWrlHA>PR=$F4h6e|h5?-YV@Z~rwn!i3X8%XBcR>$vT5Z1UY@$B#uh?ulff77(=X z1gyQHwZaCVmrE-M6g3AQcfmI%jOqm&52v-4cVA2?+1CdTHCKqvX$CZ2#9Um>5;lqZ z%d+@J`tMfh=1hXb6kWIug{ehwef~&3D)&K03cutxUe?7lLa@90G5!A*OADD7Ex`u? zYU$TPf{QgRs!bY#KYAGQv#HqlBFq>mzt{tLVneI6sDX?Sef=>($hpSGMniIv3 zH9c|E7+u&vxF~Gl1bAEo$E;cc^zZ4#(fY50RLeLE2^ox0@C6g6Wqv zG1cXX>*q6~!>+H)x515fP=PT}k>2=Payc^gZ}FX8KEr;Kbx7H zP>0L*pZK`YdM906YuXc7K-EYvE=9ou7Z#g$5rV`k@qnE2t&K#M>kr4=QzQn<41OUa zUKZ&1MqG*vN{(NW-HU#R@mMkHLAYYou0oiFU9ft%n5gCk-PFuANkNgju4~ljTm$eM z$R|gJ4k8q*Zp#~Qif2LOfT<2h9(~7+Q9BrwVGoZgrVP579@Og_$K_WaZPmK-W&}U8 zlX%uUcnE{nz)M`xxfKn+s1hq0fzhn4*Cm6y?M;YYW^B<}-1*%Z!7#plQqW%%dj41n z|6Jx`ku`JVEW4%5jEM2eCccaqAVK)@;a~ID)s${Y7GG{Lr3SFTEK3uaBtsQ4=gs$v z`S=AP=C=3@t%XB9(ht7J2$hQm`$X4?k|D(q0LbMu1A$XKfeJRAx>wBBi}#Le&XJqW zFdcjez)QEY9biw;@VTqa0l0`53(@{b=Dh<0a$f^rX6nYD_X8W+9=VdV24EqeFRd2* zJDo4E8Fn+6@J&AJV=v-d#YNkOr{r~MT`hDEKRiqB5R+KCv+(Z2B^&X09%*Wu8D080 z6=uFq>%M*-z2Z&9SDyk@u%CoiZ}8n+c$Z?B?@C-pz@gu^*Jd~JrF>twsh9*Gx|lHTXJbMwPMyDJ5mLkMP> zb&Q#Hh{@+p#6MTihj`qJwcGdP)IQlS9JN~9TI5I$ zb63TG+*(UqGATykE9-GBj|x1mSqNLLGE;!A(*@Gy;j~KW!MGo^0-7(;KjW zm)Mu7cax#%F(b7X@0DgGFFbXg$B2Ng7FtfQJ}4~!HPfHm0fO^(^ZwMORx7%4kLY@a zcxYvLd7P!+xvunK<=vyU@I*fKWaI!`ymb|7dw!UH#WN^Dbj%7s{>L@%@d&xHwg}6% zeWFqzZOV7NHc!8OdSO=7dD~^(g!em8$9>^~RWOo0EzAtS$BxgHA6&zN&-9|SabvmZ zX46tW{GAo}Kf8V~AD5C}0oXa@upQPX0P1nr;sOMmCgBU#EzT0xEhlNzLj$foU^)v` zoQOi1$jq^->aR^du@Rp_xF@I>-b})p%;iCT80spjfik@5aF4;7bh&4p`KFKSxX#|J z7-{`3y8oHCh#DxjPW2{{PW*R#9;UTN-ZM zgS!TI4-SnaxQ5^woZt=tng)Udch{i7Ex5b8ySr-x4Gc4L@6%bUp3XUCd++-Huj03` zjDBX)zWc{Ic!>)hj}y^=Q-=Ddtyen@Z-?a^8()mC48h#PB}2GJ>Xu&AxY3`VgCv$8 z7}5`fj;61lsaQtPBj z6HxZmiYiS)s}90s9I)QAYD24Uk)wu);6DSp2mz-4>5!e%y{ciI6+7pyZqN7y83o-^VX(@SqZZ*{B~xv-A-D5t!_3$#~Kx1j9vD<2O4vI`JK$1_)^J;dslLfx{u_O=@$n+ zI4Y-GQ+g|VG{rd0tfC8I{@T4gv=bXGBd_llNJc*+H;^_*jhK?qk_2~?OCy+}+Ra;o z``Yx^F~8G{AN*>3>`N2f((EGklIX3Q2OnOep$9J#GnG+5pX~mRI}zLeUD#olLH<~6X(XT1o-yW`_{6KdT)1Eh!s6M~csNOuS2=AeEXS8rZoi?@;Vxq;b z?V6TIBgXN_-g)@&#|w+OsMJej4=obJtjQ7J{ADm zU!tF3Ahkv>E(Lx#3Y>+4{{f*;0APe)YD+r{IW|$nqbk~$4&4a|`7~R0=8IE|n?s?X z5Y{^h%$TTw%AawX0Qf5XTzrDwO9M*J_7=ChzX$1PXEt(K9#eDtoC_)tcyR|XKA;Tt zk_`;qru2ACUwa$Z6~IG&33D~%Kb{DmwQUOBu+`t+lZNhp`BAUm>%hl;;~Xsv(naBv z0^HKx)BA;G0d4Yk@>dLXecEIB(+}3~X8A$T#EVN`z)x@cMNDj*4vwFbWfN#ua6_5( z_<(>|H{G+=r5~((X^?B9xHOTpC<-3G*Y6mB2d~wU?A5P)3L_lVFNZJP-$OsC2cLb4O0G!?aVW8HBn^MZp$ zNjO!62b_m-A*+TKj3<>9D;O(JeS$o)Z6-wV*h50*lRtUbeR(R%YuePrF zYWr?2-4DXnjz1Y4wk=YYdwrd>5lk_2BS!)tL*BZ+c5bd~OyR$=fKzdHukOkV42wxy zfI2Q$DreJ(Jmjf$@V@~=YhQbks*ZV9YV~n^6z@;I7Nk^|9AGBDKn59 zo23u5rO^H9d@yxop3kuGesG(Vwfe5nB0d_rdsq1vFnCaq4-F==8)SQ6orR19PY8$J z_e{ir3=G2?U`SvBKL|b41s=e*$niMTB`4jO5$^hn;k}KL$^!$NzD)w3 zP%<(yw0!-ebjHATE3zF@GSldvER^c;vhwogzCU64=9Z8kFctZqIIuQMd`dJYMB;6# z6IHx+%DP@iA-vqo8a1(s^7^@$X=|rnK#m3QvFiJVsMqoI575`O=pl~83QMsHo01<6;k?v58SY=-e`>mLU~stqxFe&@tYaQDG+XVaGJ*;~ zqq6f@wsyNY4~yyxxN-B5nJs-d)p)GEBzvqC63t7fC@nEHNw`A>91Bhh(*#5$H} zg3f)}vjSFcm7^btZ=D%mIg=akkq#wqot6FHN(wOUR!lLE;X6Xk2UVEL%d4k7mZRb2 z{>S~V2O?qU9QK_rpwXw0#VNt=bifq>*n|$;00Su{C7$;$`Cgq1#{ zUx-gXO^vY6Lql>M^5W=(xxP8qAnp&w%dP9%W)3hKSGt%7ZtDxp?+VIV$4XwAHzErt z|KfJan0DQ*t4k}#^RN}N<~!;PWde-fKH`CcUH7MeiRZDVVPXH>pGmMTy$|E)=_nUq z;>HCOggi&egzjfz?sf$#0JAWPptb0rShl)q^}Mz9?$Y#zsukdX&qgc2DuDdWH)079 zvXu#jIE566e(N>-&NA32KPusTbD}lsP0^P_WT!f()xXVjuAqD}5mhuk7Aj2+(UY;lXSUBL?!nIm+9g+HU1>nx9}$rm5)2Sqi$I54~wPbNmc7I$U?4!MT^ zZ$hd@gEwRx|1CW%*!0E71dE4Fz%^W&FWonOzXxzqyB$WeP7i#Cy#FA^4J4S+%VCGy zNK!zg51PU!z4$4{gFHW<>uis=M`q*KMpQ5xjJ+xVZW*yuJ21Tbb-EPo?{#TAb)0W# ziS%4Uw62nB8^|}*p~SF6tapJ>ludLj_LS8__h%Z9f=a9Pk#&@rWz)>`OoqUYBkxzYEyj4#WXps(UMDG@6i(#3>%TCweOs0K^|jr;IIm+vhsT1 zt;Pi!_>UOYBst_#=MV8611lkn1LU>}emE1LjuC-k>7&V47NWj)aLPgw)MC~M33Efz zxcK8qXLJ~XZYjG}V4x7R{r%l%aOec;l ztIBmI@Va9M9QRu+FJs;YE@zpuHR zO~h}yC!+IA7LT~>nAI`)eK|6~CFP*Q`_t5-TiU5GvUNr{KY+xk_<+*A8dN2bIkvs}kG$?-9ILmNC2hTZWJ1<19)`)5F&+4O{15&pRMH zx%iCZ%&}ha-x$T@wrM{ALX$iBc#S4RboGay7E4o$8fD@O9z6w=Uy@}GPyARjYkqwm zDroZjfBv8sw&yQ9B&E{I`*@nH4b-PCq-puuRXF_dP;mgOGy>ws)l~oRWSGLo;_TfW z?E2K|nWc(*sm%-lag}30C(_S2R{A5f6TN0Cz+rob4$9`sTWr(2 z77?jVE81bOa?j1j$O8COc5)FiCWq`jc`c0M6=5xc3R^;a?7Qbt|6Uq`kNx&oP?=u_ z3#CWRh#(D?8m>zC@CEnDeC+B|ZKCH?$k40pizGAwS2vYQp{?=g!hX~kO*~AD&bpyF za(=nV{pNWH2fR#R^|`M|1zn!O9I&|{KaKxJEe(k8lM}O#xWogj!=)%*?il)I*)=T& z+>HztsVI8&{gQs)5g9OG_&(WIZ;r1VLoiljYfrYz>XKym+}-gs^vU2u`x}{dY5{o` zSfN#J~E<}Vm=WLB6vulS&#pxf;h!$bDW6sRW%6N#1$)chyZHWwKm`H9#VNf;%M3}HM0nYJdS65eLkF%gqc(=|heS%+!`Z*R z2TTJ69GeKyIHwT*1-V3JB8n%4A+U46)@No}<$?ebw6GjbOX6vD$3u?ZqUNZ9d?Q-f zUte8Sp~~x`=B5N{1wU40@{FXN>L3a!fzV)t{HE{3xp}anB)=-QhVN*t=YK4^S*&~4 zyNx*a{0vqeTsE!xXx#;b?XcOvLn9F}BC3lVSTvWN0?R61E00&V9pIzCleCymncJyo zFctiS3=2979%8O)M=BTJv2l)7?yLRY=FOQwA@c|_o5+(QQ@{85Z zD%}7u_|bfOhG4Ysi~W?XS)Lpmhixajk`D?N!%Yb47$NLZ&-G_v3s-7b^F-CN?E+Sz zZCvb>An>v5;;EE7;)wR-XaC3qzbbQX-Tf~v<|zf**m8neUCxoYQr|Q;GNvLKC}Aiy zb3YtbH%74S>nvNuwb}m`oKus&EfcsTskI4;gv{4ez(}q)h;1lpvk{7 z<$Fu-F8J&-hLiCO(Ki5Nd)MYQu6CHJ znEgnCu*iouyR&^{sR2Tpvd|_H641g~+ z9j4Q_k&O9NF|B`tf4a=${)WvRS(ScJlPgPuM}k?cKQj*}?U%U2hbdfjixBzZ%ltSM zQW`QlbBKsz8b6QNcXwu0A$&Lh0cJ(5yPtr)>8u?e%yp!nx}VQ0C9FHAG3vkKlV;5* z-4eBqu%f#$KLSueumCeQ>N*tFoo=&#;w~%?S zrIGPOcf0zMXm<8|+WeCaV6(9GI<;gg7#g@vC}|hsydlbuj5-72Ilrytg=YZZ$GRKO zc~$ofn#E=5fsK%7(=zI8VnqYOt`caEZK&{rEZK60tdpTNG1c->o@V2 z3OaVs-K01Ac3MpyZ$cYNEfm_6YtDgPK4Y~G0vTS0V~gHTu? z(wjRXpj|46QuEc8)h=`ntK25`JWnXBkwOC=X)%)=*fdWYA zE}cjKqiBqK(2e|=qx{T!lhXJGy}~G(1j4CM^TB6;K1L^gPj>mW>seR0B;MNO1?-k= z#qKvI8=hmdA{^83c!n&XRHFv>ZT$jI>(aYa^U zDj#R=hWqmz3ygKgH!@%i$Rbzup_L6xT4* zs6XMelV9y=y@zz#AQr7FVr<7{J9?)3s6B&K`SDAWrqxevrf)&ctpm}rsv&x92E4|3yQ|}d+{96F4;y|g z#2*-j#@c9`faCE%vh1E^NtVZ#D~p;yH}JDIm+{gk&YcE9_1E3~FIU=8ZH9^n?pUeL z_yDY${97p>+QWp*yEwhCn%&DNBM!?P-Zw`qi6xltx_~jljzrWGpjP;pgd?|)G5dtx zj%MxLnW8U2BWl82np={7N~caubcRO;B0y%sHkroJ2NpS5TWv(??%&*qzIxTT1k4hm zSJ%WgmZ$^jyCz+X>FK8MMqs$9hMD98fBF#5O6Q&xx>vb#E#B{py&if0sMVM+S!DwTLffIh9|D!llfY)FO9C(u9gkP4$OBs5N^SeM6?A>rYNP~ns-2b2De z;HWnd5X%zP(xI_2csSW3U9MYc$DlPE9nL?0>>=U1YHAZnphGet29|A6RbOyeIvnn= zJ*mcwUCe41Kq=CZRSK)IMeV0$g)|~Y+o%V}+FWaQ9LFyJsfDy-zS2T&jFKjE?jPvl zo1sW~j*UxbJE86r)g&tzhPAFj+8w6oSTDqVb5r!5G3ghA4*sZE6Q5d3X)aQb6Ti-Z+TmboP&t$`chjm zx^&>~yzz?97iWP^q(Wj2W=t(qA_h$SHfO@8#8=5ltETv&+BwxcQ)(w^MMvxqlNkR= zKke7=cXrB(X~oBy>~$Ho*OrRI?6h>YvOmd4u$bE0g9+w%TY0T%hdpU8tc6g5JlB^` zl)2@#GW`&`$e!bG*lUFsthO)p&JuL2w>RTgGYT*PQf;oP442h9+av{K4gsO z>J*oFZgJ43}k(zq$<{a!O{ouHK{5PLOKqG;zZ+6Nx7XZBYcKv&24p zLi6WLR~6Oc1&H@Y!b2@Z4}~D?7h=56pXBudT8+=9x~G|vcSs?o1MRcNfASn?)6dLV zoA~1I&YAhNKgGFN046&DIguz@h=wzVTj}eCo1er_bK?&H#!ib}0OL>$UBOkDeKkky zU?e}Tcix@wQB*8x4z@*F0(;XB_L9HA&VvKNoTI(y$NRt!Rgl5J@VdqD5?NA*0!4D1 zV3wMgE28mlUkYpDzA}o!bSo4^lGnPR!)aEpb_6WF64dWzjyw$sy?dJA;709{GQ~tP zj$HO9bbu~=pF<{AzNK`LHV^?gi;(%RE_*4fM!PIANB!w@$Bwq=CF0L%kGk!8*1&Cu zn(*w3RT@}#5R5XJ%|e*3gJ+@N@_n1{Ij0r}9qYw{^_GY6_i~MyfS(um&t@>W!hDq; zoxM}-Y2wn<4u&~<0HNa9hR(%32Z_$4*C280C1oyY*li-D^7WPW*?Xf1Eckp*>$ zY=72CecR!{Mz1@cEJ2JqGl#V$F1#g(;nN^FN<5aH_sNze^YHtKB_1)$OZ|9=T-m5v z*2X?2GoX2CDinigc~%;i=h@75xsGvCm#A%BkP9`CUJ3bWd_ zEA!xx0@DL{u=Ls`V&p{J)2l!!%P9HSrsx5js@%ge5qqOYnz{GU~y-%|vgcG>AcCj9DWe-}$QYd=>R2;dyJ;DyjL9 zpzGU(;_}dfbowG|im5ou%&H9_`Z2DY&JG!g5j{0hri<-VyZl<8R24t=V^}ylT@-l% zzKk1gt9f7pjN{f1>7Wew0ijEy-!cWO|Yyw$+mFCq2FfAM)3i9 zX8I+yvNxyvnwKj8o8cn3oqvY!@;@8=0KoeLu3ES9T`lZwuuyIvMZx-#QVrLbsY>O8kOI$!EdJ?EHJUsn6SC`#py%sT{6%bbM6$qbYu89lxmSWih23WguXEz;a;1UpyKPFpFOSKS~0q+P;w? zc83=0_0uhq&8DHjZE5dqAMy=|f0UVY#;wHYW*fg*#O+LSz=p$*pjPF0e8=!bvGK1E zNOlMi^=EsQ4dm}3J?0>dom^U9Mg1PxR;|Ebi=Gal!$-gM0&-pWy;je^ot(uOv{4zT6xo z%jz&ksDKC(X=Oi5$<`?9Ha2W@#l3njRMM56_3biD81M&zOBa>adgTGAD<7~XvA&9B zIO(R#0B`DH&pYY$&`#)oCll}~8azSzFjMs4HU=tAyYagSzy5|-1XxR3!+MpJdisNVd2y$z>aj{cqG}g)TZSa8#{FR)2}H^cqv}84+}yTH zar@9%wLL8^_IFB#fxkEB$nG?kD95E`ts~?FgJaJ)BnS@9b>|1zOhkmq6d_Mu1PawU zOBPFZsD}z9D2v6bj1oFp`eJ0h9ZWmW>uF!V{Z8byc5{3_IwDln;R0AmMrYn-He3n; zU7;T5+7Ign3s(=ejj31a^L>_+rV+zT)@1$RxJY=tSkYPOFyct;4oJp#BM>hRl6n%x zc>IK}iM4kB7uI5L&Nn_y*mmw^P8Jxp)PtOEGW#!`eG{aliKZpp%c=#<`X@L=e+*7y z>*CZ|v~e#P@02v$u<=x0iZh4?HNdvhyBtR*2VQpqKaxr`DQYkBD*;4}(n{@)xGaEu z`7Zo$$z257;pt5MCdu}E3Z8kcW?wATz>!FwQ>(=z4&(kYV&KtD%9YEIAI8HIHw{C-O`=Esy}Btky1bzqFFqwEPzwP5-t4yY}UH|I~O~ z>&l^wdTm6$t`K7CUeV^c8A{=n%BmDWH?3)`Dr*H4cfb~FLPGXqPHERpRax;>ErT1oY)E%ZY(BZNvJ z4{PBLv<*()n-8GdkdzmDhK;tD;3cU}r4Z;2f5|B}Ab`_FU;w47+Bt5XUih&#&|*-03FY5TB-;c0b0rAIr7Xv)J z;U~5E1C~)#pl0g}w{sbeZafj3d$P)QA&u=KU-r7VV0D$Y)6!D9NvT@&DMJt#5tc0U zssX&@+At+w&$+YF$?8{H8~mJxW`T8CmHa>{o%I;{F46IAri>_S9i>Ts&k=AK>y%iFN)WelO@KFpi{$wI4MB;VA4egL`;c;CjAr z)z$Wu8JHNS44j5%5wj?qAO>2#iMo!ydjQ)ztV67Zh-%N(CXO4&)&YyVU~pl2X!yv3 zC*Gtu>gZKFNm*7T*Mmx&5_&%*&Ey<0hmr%g%K4K56t6m1M~wZfpYv$Pz(Vn{M-bZj z#EZ>k!$>m5BScvog8O1x=bV8AxS8csmkNngOWPwqeRJ6UouW3JD(y5u>Dolt8LH<= z{@0()-JPVJq>kHJ1qtW+FN|Uw405aRqB6yw>F-?G~tF0Wae&YukrctyS3 zE#ce=JEVMOE#qzynO0>ttg_v~h+ zjxTLYw7H$kd3S7_yxu8#IJ|*Y=3YRF=kJZ0ZKw_1r3ajUyYtgle$&Icjwhf!vxs>f z3AQL~@f*Gd9bexD9qW)+e!k%$`=gWT9Wp+5^rb}w24nmsa_@Mf?F!!- zUbFPM*~nih9weV9*X7&Q@%*QK&cU#Ih!{nTn(8wBwKIBBXb;&b9fVET@_GaX^1B!P z)J%r@xLXu77t>oj6{tJ~1HWA}FC1?fXgzGS?by89kYH)+Q8Rau{1$u^T4L8C)SpC+ z>Dlh*b6eW-+3iCWyd9hZ0ex|J9U^}LX=_+k8cFvX{J$z3s z9+1gy;*jz5H!XGAW8|cy??#F~0P}_r$kuLC&Aog0b?M@(a0&q@ ziuGO#@qPSsvj} zKmD!88HSQlB=6Ef>IV{QrL!Tf8~B7gebuSj)$T9y3uTG~EWYM?%fx@78q8By9*HXG zi~9n&m7jhL<7JH0=xF)YRsT_07lR2b3YA=MkZh<)DU<67~Fbs>-(g6Y{M+J^xI zG+3J0y66XP>fn!^X7K{b?p9)y5?A=B)P{DjtuCHay>r(9P79s-{C6gyf zUq=E!3T9vUVwWl`SY2@z4mhkC9!>6yI*IsyHC1)jt{dU1+i5b%dLY5T1@ zyS{txyQTre_w+K)VpMnSrK~_=B~UmUiD{C;V?xx;1^8)L#8>fy>WY-Zx4pULwd!dB z_Ym}h5fxwnV7BIwK_^RaNC3)6pRcrbCl=nvswrm3cp~Pj(i|f z@w_ng` z8{Eys-qTme?CJWiC|yr8fOjf3zw5P+9zv`lw>vPgMJwmxR&uN3qB)6*f?m4~05e=`4J+m`cHIeX`x- zvGQiO{4><~G`jMUE$Tv(P@C_-0=RO^fLw9*Z|ybh<>2m>_b4=~YV9zlkGo76;;6NG zkBf_s(#&@hYo`DUU+jk?VlG4Dr^7(F2rrQ9nM65fOb_bi7m+HW^xYCN{!9=^7Eanl z*-MD%VV2qc#RKO2D0O{I0RSVIaL@Sxz!=4dgZq?FVL?WjokmQVoiXK|!&P=6e{QMw zMaz7Gr!1GXo@bC31DRgF(DV19nYP}(EHRIXMM}p@u2KCMXo5q(R@vm6kRM^d8+RT^ z&SrDEIP>+N{JPgitNzrwzfb;(K642K$yMX5C{PdjKpkvLMb2i_U=yllZv zWO|yCpRKzGjhS%vwc|0@sLHvi$#HHTdi0vzpCdSVM>ZG!r$d0p$oG6Xq(pcc-sf!o zL4(0HvOEcu8ZCc@s7+5iObNQsq_RbKO%-t;E0rUWj^VGhQYOC*KN}Um!6iPvh;*Froi2F{aXYbNwwn8Fu^C zF*=c0f$R4MMI#S|IA8D2-F}Cv*>uUKA7^GJCMFiP&JGrS%tr8d#3aM-%ozX`yx~el z|CACzni}U)&2%j+t5N^7foWEYvNo(MH_`m_l79c`^-tZ4j!_x)SwY?wFs{X6!cg8> zPVAl;+zw(Ns-!Oae>52d3Dx*mbLRcqStY!J2oT z*Vrqcw@e)^Z4kJ+=sN<}&ssx6(YnP?Kb)YnI@W^Q==1&aw?yWW??eDqJhhXjxe6zP z5rL0Ndu3tfn)pU`zuRGQ;&$+JhWBN@Z&g^5{JP~5Ws;7x>Y=~}PV(rwe~wr&I70d+ zJrWh_<#2`O9>d4uC*)`GF0A1osZ&aYk$m4y3g4zp%7J^qlSsvM3NKfYQu@P6GCu;CDp`vQ>33|&}ee}xG_DN zjp02pVWed_MmF^*_-j^t%FKU)cOq&+v(gaM#S3GUh-j?0p@$q9?7}wwwLQQwV|<7t z25$=v(W|+J)EP~3$)09YtC=rwW8u_KEBVz{E1O8KBx`Emw>7bL8g=wsmN+L=HTpAk0Xa(2J1AWg9S$rN z)PKU1*L}%h;5l{mwIzITI`VBbqYVDg3}U)Qsv%(0=^8Nlt7&t?Wu`A(+3adhQf*cnXA>ONi6Lxd${zthM@*LiSX0T#Oc?wPA6`hK;3aQ*gXObYqL=&< zw1I4)A|Lsgy3Doc@MFVZEa`eualG?XkE~VWA`UmI1uY_=1vmbOuE3;Fg^EcP64jia zH_A7&8YLR=2D2+~pxY;V!a{!nf3N=7?muz8HmcyXo0ou%aeh#KOJ(pc#J4~5zG@tA z_aS~mvl|ogxSin57tR}pkznO$jA);+%WTl0mYo*#?LH7#Mg(7WqA2JV_I&p@F&A)Y zk0SrKU#>7Eg;+-P_Rc8$7@Dhp&wCRRZF7Xz?*O_~C`|S8>T=MZW%%bZvo3dtLe1!) zjG#aJZ#-T1DP`e{BuNsJnUBdcc$5u$>L-oT88gfG(g7|oT zG@`L2`5T4-5dCRbhU7uBFJX(^l~mwo4e{GK10~7?RwTXQuM9; ziIk5i`mj^#AB>K?MTA;XkxlR!5m)$}VWcZNN1OVRE$RXK1SKCpS@Wj3*4LZZ7$O4a- z<0b&eF=}5*k8dliupH%>FPVbcD23m!cxr7dmR9{bD?Ab5eF7HkhifCXODdI z!>nRfh1O4Fq)@l!&oKx|A(GX1dD(r}?-T=jVYoutVRQi-9|45`H0_f+A(m8_!d-a} zR1)Hmn|=qJDEo|m;RJc{#7`L?-VdgawKa!MH`bRawDL?201fx9vQnP}Eug&2c*Yb% z*7+08;avY#G|p%28IHkW&6K2Ch&Sq>Ex-sgwjeRN`#xT-m>XJ0V@e+WfV zik%~FONPz`QX;~0W;1J!`?(Vt>9GGEsdx}n^UskYNE(vKRks4TYEfiAWiH5oEG%Y4 zoR`Bd&cx=|UiBYZa&KO(U;`@C9M{ZZU~O>-9erKZIl^I&$*E!!QaNc=jJP0Vf1x_ill$Z#KxDzpO(6l4E1i1;`BsUqAB3p?_$nMq_TSeFU%((E z+Dymp64$+7`8>%cmULM6sPZ;%u`C?ld!eaAP|%XT>oqz>hs7b7iDNXZmyuDMXI{pW zJ-d88)g(en;|U zewWou5b^juPg8IOd>_kB?Xb44LUBlaHABk*9ERwF&5M#<#%#hErvlCTQHZE-cRlB5 zV`q|2KTS@>G94#b8y@hYlB#mOG~6hJ37EzCuf_dK#)=Gvg9*Pn%TDuQ5@%z}W^=a+8n9r- z1P&ToToxBODdwOH&CNnBD?1TRH!F1o^!>o7Ulb$bbPKkp<$0%ZgA(^H@O?>!ykk z#ZEa5U~l82pYAgHQ)q?64C*WFVZvC|odzTbf3WzA*-T)ibX0k0<4^Bx`UNZBlouC9 z@0p=9TSSo)glAC|7RBT;t{$bDujuL0ibVNDN-e|(mE}SX=`d#yG-I6RkLEu9WBU=k z$YYTg&_p7;TCh@(Ek82y7n?VufQMFJW(T8XlvnU(tbkj@C2f!U8OZ-a$4T?(h(=wr zJZ}h=%d{k)`3tssD4!bol$jQZGtcs~~di$~x-?h2J zYx%mHr*E#mNdO4>%zs0_sh^rahetY$7WVSBiL%7E=O3+l0Z+pV zE#gxXO3!Bs+zO-*7Y=6l!Zk$hJX+?#Qpif7JjbNM;1_t+VTJm`Wy+u)*(L6LDz4>J;58<9@#ubjqb-80`d4o+nr@nKl&W zIM$&N7HNcbYaRW99(VBol6a%{D_Go_H(L}OzCFxSYDBvlrt7$@V#Y9#Yi@lL!s!Sa zvNqS4wHyv)R%rp2R`%rHzm;Qx)b^a3o*;Xe+Nq2*>ViGDJ6W@$7s*s3!Ot3OCfE*MeH%C1UW&a7M@2uE>%Q{(%PyG<*dP0y!y0eq zt14*Q>>$VIrHP=!mx=yW7g(i}q&4Xe4K70F_;a!dr!P^(KM;&(M*)q4H3ZlF# zQO<6qmcZQVt_Wq(W)GD2fN|!_?5R)ZI)xZW z(%GMLK;@c6EdDNA@mh!-Ot?$i7l_EZN8z5u~;DXa8mdrBr2xv z`?#dCvH=ijo6K5;)eN3HPuf#jk5BuhKTV!cTwFZR*iWW4s7# z)0kvl3bG~lYn$8e|5&~DD;O2qA0F?i=)ZuIOf6jTSlcDWdU`8mK+#9r?F7na0fr;Ak5n9a48Tjg{WZ$}pdOYe*gB_&=II$|#G7 zxY!tOw5Yi#7>m;iF>&(>rGkDnY^G}??9IMX@PpPzRCklV(GY$@%G)A&mjd>6osbrm z3G9^tF;QVJS3#&Kvm62^qh*#Zy%7To$s5lL!8#2678y0B zHWDS2I+ux&{&>T*sUdvMm^GwTHN$Td`(=VM(3w!8hzd5>Jh?Yh6RopXo`|V&6u}Y$ z>GH*CnYZ~RR*ov*!TxY2v|7I)c*>chbh~Zn4;b8doeea(_N)PIgHYe6!3y1Eu_QS?<&u+@M zSA~n34L%UZYX$S7lW7M(P8dCTJs(b6R{9O{5s#~kF4su%+WUKay|@3l!I$5sJ@xa= zXyYkr4C;4#Xy=QQDtwrLgyH#>l2)a5{asCmYg2PxX_P$GmaKJ zlzl @=JCprWYg=Cl`Pu@EQ$`(GA-wUufT4eW636}b$C0l!W+B0G>C^01 z7~W3K>wKBHD2HEXvl5UuBRVkFW|S=(+iR^`jxVfwhhewY=9`oHx zu^&1{L6;LFk<6gr7qo!z{;3#cNXSyv-y?>9ev;mdn)Q~<7NfRRb-{cjS}9@FOrAAu z@XNr?LSTF2U^0^F{secA^?p!|_)ABjv$onhyl^L0%qO2a2I_H_o95*9I@O>}@U&Yr zsOv0!h9*pMv*n4kwr@kuDNzl( z*=jnOgAdf)-%*_D%++O4M=G(C0pHw{zpter4J7c&KXhrk+5T2P>ki)OU*-TGV4EmB~st{>OJ)?E zlb1c0c}u3=%7lTKegV?lC_QL}POL(z+_Gk@sT@fjC5CTEQV!L5=ME}5et5&YZjQ3^{UqRiqmd*`J!a3_8$ohK=08>axp~tY zgI@fZ^1MkW87;Fm>d{;eF^wof|AJv-18-7DnFfeWlE50`qYi4hqv$_L?dp!j8Qyf> zG+fHAAeiMlwYAe|c_NxL08<)NkybFZG^s#vxJU0U*pgrX2DOd3w5y zptThc5Jrsge*o1$D!)WQz+m^9kOcR;Ut-N!51s018g9>Hou3cttY~-n zyQ>du0Ki7NRSf{{Z$2{B|CY|3+i)c{XsG(>bf$MVtn-9tX5F{uuh=Cu9L1wUy(~Cj zxhwxP3_Ot@=l1D9C)BbcXDb2yn9N(nfz0RC*|U+5qkdfR%L$BGv>C#PaykwE>HcHp zzpS->I{&-c^oN`LFocAo$U;wkh&Ytt017IDKo*y2C@>q`DWY&T;WKc{(LpC8 zM?CaPH)Q(xgF)ijIQ`(E)5am}V0@?KFaZhHD4UTR0MN+uXJu_x4v8SMbD>hw1DmK+ zASCxlNx-U_TSrHhX3m2FWCos zURbb(t z*Eb~XB^DXa@hKPx==iri>iX*8fgQlI(*Q8y@p~)-m;LI_zLtJ;*n3M_q+JbcCwJ1d zzzhI+CTTK-q40rBn_*)SK5%%-4LTMdapv*ppo6bO!(D*6M*-A#1}tW4z@<9QJNrnx z`63J>;I@SkHNXOG7`4_0cFIw@Bfexi(*YOYVKl*e%KtECVL+Zw zzBL<=k*5V?e#EOumGj3dd<58~BR2XkD`iU+Suhb$%_=}>gt)suTwV18+DQ)^e()Q) zOv06=W?nPm$?EwF*X-OsAGP6gzjR(FZBYCFVCko(UjDy+_{TQ$zrVh$22HayHPn1^ znD)A9A}@(QS)MEW><938zEFqx>B@cGTDMf)|IUhO0{)ke|C(*8d*$MDC%znjO8>_E zB~9MOs^|3;MV18Kcznn9GE7Y{^Q7J~NSLmE`MFQqIsY#`_esBmX>!5f833H7p`*9W zms;ar*QtvsodUTucR`wopB3NR(gLj8Qq1z!iavO>TRoCiU|Rz$yA(*}=1Vm6u_{CR z^A8kpnGwck_$srgightsd=59CVYn;A5O_Jh>0mBQ8*+PZPWc$uU~*R%<>D(QO_a>9A$8wrphb1e? zP6J^Q+u7OC{)?)5XM4Q5tq<9)NXxMQE0W zsg~|K#ijb=J4Lc7N~&?NgK|Tb3x91sr&D)KQ#N1X8!E-r_u2xh$!2# zMJwITWfQ87hYt4!@JZ<eb61)Mw$in zB}(qx=*OnT>l!Gqn9LT0ajYs~r8b5do8?v|)`6pnkiBi&vG@20d5ut}c0FO-ExX6ruRXn5m-<3_L z7c3g!p+99t2Eh!NHeMvu6;6Ct+#umkitq9Y?%ogfXbb@KIba%TulTAUYPid4LTnT* zotMRh3NpoH__}ukO|Ut}`~{_kKSK?Q-vgJ(^@L~2jr8(VC|>du+Y_GY1wfKS4o{6l zM7P2-y%Y~OJRBin^WRGsZdNz7agL5RWE`Z9+h&G&cXi2B{{QNSf9eB()yJlC_O)d= z2zj-*NpkAuDZ!hiBZ2w`Jd{?o%&?_pfPejyKes&&SG6vGO_%HNVV#rIcF>8kiSMPw z8{%a`8jm-%OrgCEy2GFQ{lEO&r)9?w z`sSkKr%Qm;>3avnfJ(&v%n55esfKfSTJ z@1uKBxB8Xy7xlEAom|eT9we)tyGFR%@qXJxShx@QSgvTlxi_m10Pa>-AFWoi(-YOy zrA1!?&{CJR0qg}3|C(AS4x+w^E~K+J>QzcNBEs9|Km36oe(*}1G7VsCFd`V1ycndQ zvCzPUPM*CPo8oh2XRP|s&U|%OOI+JYPLWI&XQUAkDN$NiOb&LhewzrHPAlHnv#?$Y z7ThFLlTGy7_yOKZre-h$xTD5*jC#hOC>Y~{O>&_QK&-|~bi@zx92GMf1Aw*$AeE0< zrF&FL?F{6D_r%t!)gZF|U#rYcjyXDzM>IuoWExN z7o`PQ&}`c~|Ni+s8SZ+ik~*3Z^gxs9Agu({kYf9lv-{PYI!(%Pes9JG2a{5_Z)i}! zU|>zR1+HoXAvRY9v(IB$Dr?|*Fy1iJP9JApQ*Dr?K2rMt#-t*jtQM3cs`I^ZMbIHw zrC083L!fNq2|g0Oaj2hQEo`FufCc!WcHjm*5K4DR03J;?vekQ$G>=v^?D*g6o;LsK zX>nXqICsB~BrqBS02LS&nkItx)GIf?G(P%^Mo1xHfOC@_5s-pA!V~oxxC5?EpawNp z3%(1kE4-b47hF3$Cz~Ay=d+EUa$&L*2|B-N-7C)xfM@_>cXunZ$L1wnj`jWFPrq(o zlw;E$=l&N; z+f=x|mrfICH@o+93^xjs>TNsUA&&ymohc&X_cb6zmzp_G2Du;M2?S1 z<*x9_F?Imx3w6p5WzEvTf^L_*JO5A`kg4k4+9lHr>~H%14BxV+@?_MnMA{t}X$@@3 zN+CBl;w|s%bc-}U8=5(@7hqnRfHCcuGrs9yQL&S_B`gMVPg$fInGZXnB0cPW2Kaz! z$G2(acp~)J%js@g;}>77{V!_|1wi8Gme%yhn?kF^bDQ_Z`g46YvKYtuMygeL&qK2F0D@LJDQ2!(Xqp~ zmNh@rjeE~X`*Bi(0G3!dS+S#z=#y7oR@**S{nGQFu|dGK`OC_`)}}jV{$6M&|C_2s zUs)cMdX$&1?6Y*ud{p16*N%HiluMWxV7+|t8Pf=S{^nh~N${)he%DSAeDA?eEqrXu z*Wkx=t6h{GbmCgudhMT3OmOTz`zHV@7NL6V+pB05&xUn2e2$Mh{wvUYVxC{5^=$3I=OCz_VDL zOkxC9C9mQzRrfJZfw=b56;BNqc>J zQ=0=fw2@8fXc~;(q`HY6A%+eg*`fisJbOXOFd&#$=Qyhcn6o|eKSDMQG(_l)tKTod zK!Abe_T-M#|66vy0RyfnsktxDY6*yP&|_sFSW4bh(m`xcCJfPmUBk>-c}@dpQ=pFi zO>3gRwY95jfi*yhSwAXw+h~U-fI1+*sUslPGQm&St>}Tgow$mykq-kXJvNZ?&Yz2a zxb}BV&m(pIk2FY<(@c@&6oOSIQo0jJnYI1|3R>sRVUWPc3;?LuG#;@=%{yt2!l|o_ zWX&d=l8Ln>+zk^I-=ON4@J4hU({cqsAf)K1ib^`oV?tCh|5>bd!AC$|5AE}ria%&_bK`A=JZuj;ZNF8Z0)z@VI$ z#m?m5KW5f0my`PqIYkPQe)tcw+xX$vfks0mpE}%G&0Lt&hR;38`-&|EeC+Pa+6el% z`m=Ywr9A@c(he-!j8}&zz0`U64>bMbkts2IlKrYq1bk)pYIR*F5uRJQU0r1aFf(OG z7iXjaW1W4Bk4v!^04y{CTWBPxHPO{Zj)ED%kpRKi{Y=CeY7^gQD+k72+1{^o>c{^QlRcW0}|+We=541aH|K06I(Cb<*c9G3i+E+Cm_d1w#_ zD@~41ft~GaiB!6SV4F}0bCCOZ@Y__V7ZG+)>cbW{G6Mh?yjPm~*JlM~+^`kUnc`Q1 zjn|USiDQ6#REM+Yy)D7Of5{rhH8yFc1T$)<2+YxWD1R_~n*Rjkg z&BiyR8L}gXDlF=UHP=yQ*!@gV#<|)QaOyv+$698Z62V96MA@fsNh)>b+WSh|(m)FU zGD|U}Go~d0=pJN(pRoJEcE&{nwjO5u#RJd0BW(QJ(Bl6C&H8yZv}DE&fQDk}fg7|S zRk-`{6F50;5cmu{RF1OvaF1?IHHICkk~xss7;(2&XjFnU2sG5*SW~39yjWv^YO`DD z1ALH)=u|777(b;EmFvjqpA>#i-aW%EHN@loY0Z9kCe$#Gt1&!DL&N^I&WWP|*wN(;bdkmldc`r@K@h~2oTN8a>&^DdW2ux0n+r>yfd;No^3A(v(#g2sj z!JA(-`_1LMb~KbhQXT{}Qizlls6-+i*KXB-+&oB&^6u_T^-!JrpKV^Lu4}gcj~+g( zF4AgVx~vrdoy_1~04>ps(evukAg7~!1Y1zn5{Bvs#`OyBvVZ}9g4<}XY_~r-OKbjn zdjA*z?CD(uc4Ko#o&R3-mNrY?*O|sYS)bFc{|Q|Hg!-RByC=*y0LvM?oe5Cgwr~>+ zfFYg4ti2pTK=~4U)WhI2K^|)5cC!c4DMiY;U2MS}hM&QMP!4cMC%)iI6dM5I%WaNB z2n0+b!0?d|4)OS)@(}!|h^8B3t~rqgS>COkq_m%c*;7D`{Id*#OgI%mJ-n_BnP{bM zuj%GSEg3O1VldCQ6Oh)S5=&(pSpc3+m*L&EX3qCDw4!@_#5KU8JFm_j|DJkOmc;CI z07o1-21%!{D~%PchXI*6WIu@s&aw4SX|3Wi=oSa;MNqzd<`1vBDO3C{sq=pzt;J)d zzoK3=z9C^Wpo1}spP-q-BfbVQm!%tWG9Em5)P5t2wj2o5 zz{lfaw$0b@9!vfIcx%H-)S7ezBcTSLF%zj%O%iVlzVwH1g_MdjzwPEPVH06L?V!zJ zy32l6SM;K8JxK!#JQLQ?tEpFKQ=YhpqmXDOFu_e9)-As4C-5TvsQ7_5sNF?B_y{}b z1v~=)495qj)!DwNJs8h$6|zpG@G+>_*S=Cc(6!CqUwX%m6WVTf$)+zo1^P#bh;_Od zE=@hvwc00wzpHxz=5;)ARvIWY0bd?lt}dt#zO*oBWivgk%dl*=FFJxTa;h7<+OJ}j zOS5oFXH2tmH=a`DD+Ojg^DcBNcR^t*A7czKWHaNZx7GkjOV-w_53qNjS~9eNr_1Ovu+_9O>f#^XU*Bhdowk#v${$Ti{vzlEN? z@m{-116CRoZa$XyJ$Z#~w$P54|j(D|jM}@(CZjMU=wN&YEqSHAp z>Ya3yEFB$xxnP@bWhd%^5zvS%wds}qK5pa38vFxOIFCFb2~Z?-XbeEv`Oi^Q>f`m< z%PLdur?^|~>yvlPeSO)gE<{|k6-FbUlgTri#j@&jdFxzkQvy}&t+fZ73?B{{T z9!osB?B}62{mH4+yxWAL(X^bKXFz{~E!oEH1cT7IJ%kb%nE?Q=myOG)n5m*R>nmeQ z{VCAGbLB0eo}>f^!|#Ubjw!k6hU$(vUVN9I36CV>DHAzGH{4)+R$~tHpGc!bQc+(# zSx@T}enZT4vJnytB|8B6dpkJ|v^GG5M=I_3lk&II3qH#3vrHQ;0F$*VQy26>q`B(9 zeB~FU3DAiE)sOqSui*zet-(i!rnO#gbtNSb=>+|nrpH9Qcfcxs0qXom^^Kj2)x0+P zaiPvNeeU>6`zzH24FImrNE4=6HkU+MJEYqKxgBt9hr24oJs%a4e}77D5{4g&b3w=b#;Z5Cb!vi2E6suD zn?V3HeZ~(hdqNXnTo-9Zyx9W9fMPRa;4H-RVsV}iOCv?O)y!Y*t6dH79#0dl_SLQ) zltw@kuJ+Zg26#JTZ=R{X zdGmM+NstHk6Buj564SU3B~t<2>W5ppMQ=+?MUb z2d}NE0Q;m(OuuU7;XaGrloo(}DEDG*A6AX{)oidjF<^5EZ=gXOUmjVrjV@V<8WFR9~y zz-2!goY48R?(eCSX7R+pg0Sok1`e=|kra;`lILcqB``Vz0Mu=I38sll8Qh9D2EYr`ia+c4!JjuXk%^{_Y&W$o&$DY+@~Q=5ZSn*R4f~X6 zU)1F{t6Jy9uoN)fkzVFM$vuldJH)EWIEvYJ16y1H(8xzXdSI;iUsgxMbCO>KBt@&s z`rXki7Q^K(WPttylPsW&8LX}@ynmLPerfjjsUKXeoJ2$?h+`fg5%mgWMxD!CFNTgc8}7)c?ON z-OnJI-`<(5E=eQs#qH(lqBj10KvAm-%Dyqo8z3Hm{uW#u6P{+>zz&8A82_otO6m0JR zd5UbMdloEJ!c6mk1Ic>Y4(teCpNw-uiJu@B?_CYyF;*r4jGZc!jXTQlaJMSllj3JG z!C;GiJN?Xm2fPoIg2?FDC(~-5vV7Vf18gTBl>xhSx68VX_kQ;yD`aFZhY5>D$l5^L z{KgE#8!-PpDS7g;PTS=-+KC;Bz)1ESt)$92045|Oul*>Mao){xN5Afhw?;h}>WBGs zVWf*>8SrdtfJ;g?_%YYh(H=!?^%(__>k0`I&Ssl)~`Y*zQbpy21K*h z0PO00c;%x#q|MPj?(|>R53_%c_^m3Pd+P8XYJ=gDCO_+f^;-&{;D4Ti)AaX6?)={1 z4h|Abc(F!8a7th#1^^ml*G3(K&Hfc)4XE{4jn}}!y=es~zX6Gc!{#>w z{DyIOUP?13hMy8`C!b!x!_$9y{E&>d7o@00P=VN6x_E_8w(?ONIwzl5r8JM(%3sA( z;@^Dmn$CG|>nywr#+&6j!Qk0TpWiwJDD&|nbhA=)vOEI7!qjo#u;FW5UqQTKUj>A> zlQPJ8RVN?#I^G?9{SZF5BcBfhaUqa(C^mCb$Cv5}$G|Z0jewGOi#Xy>RKK7T{w^{B z*A@Sy;XyZM{&D|7%yJ{1Jpogy8ypW@kk;tGc=_ifyNA`1P6j;GDS=fTC*_r%uuXZw zN{CoImRwwG2V=o@RlmVWIU@ z*pBQSYos(owLwwsob0nT`vtj6s1dg)cJ8b0M-BE%)A{ZU0>hUESb4`lv|X3 zUCrx|empy#!!YCK(T#!H6R;uIeLl9MusiCO7t~R6dmu{!i$dT6D_t98UGBI>Z1mAF z0Dzu7>gchz)$20=V10jE_LBA*=!BnL>&pP(zGnSv8UQTofrsAPIGr*bTCSt8u8!Bj zQud?6118+HYy@v60r$95^oUp{9_6LX?TBQpGaDl@03dh%+VD$7_K^CO_V|DS!d`+5 zXO7m7Q)vat+YWF017pzeF1Vo6w%hP+e;dB-Z^O6!H9Uj#cqweaF3>po$47bm13hc{ z9)P|K$i*zj)ic*Dn2Vj&AHVvNeGuoun_oB01N=~mF$2`d#Id^G-V~kl5ouVSoEAYP zdblGkBIk7WANBG_FTYSdJ9ou)eFv%Iwi#G0ZLQd@_P==RJ2vonMi<`j1xD7C`5NF% zn&Hvmxp55u0|(6UX#$b}8xm^Di}V5t_fbs9`Y@b;i*k<}5YdNV_~n__Jpst*`3u+8 z`7czz^5W;JJNlaBzkmI!s<%6~J`cQW0KH|vo2zijNOYgMy@;8$Y91hyn&o5fX>;JF z!oG*fUm@Rrv3J-qD#%=K9Lj&8 zXjEl|o7DQ52v6|+K>CISUf;+80#62?lN)X#|MJOsm=p$J_)LO~%m82@>87$ZOFz~b z421YT0YWg;^du*8ot@c1m}V!eN$T0sCctgYu!?BVj@8h_q0UA9O$R)!0mrtMAK-&B zgk?8y5x&wL@%`=KJ?tJRMX;s|A8asN&K#$Ck54 zTWeZd)*3e(5N)Gao#W$4bu_3@3+VEu^^u%8?b5%ZuPIVj=cqfgShXE`@w>4F0 zI{3#Lzwt#vP8-niKhQt`Rli^9t1?d=w-0+mc3GTzeqvKqF@>LwSk6tjuo<2Y>J18}37*C61tx&xkX0(|rSkL@bn z8O^-l(OER^Qj*~=m{*L?js#DIz@&-*G*3X6ZkqWWo#W>E*-u{kfWAm~wR+*gjq0*A z0df2cQpat$Z0O;}N_A&-srt_S*KIKHjPAbYleoY3;?LLzg0%c>JfQBzq*LhXh+Gp8 zrvu^}0U?#(HS!z&u)D*XG2v^|4LZH{;E>>UK}UF+|K|Kg{)wloXC;@(sj=$Q*FLO$ z8;`5+-G8IHtNQ_7vzr3d%TAWM1LcMhWnUBFZu`JbHN(!;D=nRf!AS3*RH-o&aSvgGyeJ=ghNlk zK9S6tzx*JuA0XgkZ-B#+H-=3Z&!@Ww`E`B+FMNU7MXd|2D?I3h-38Yb9(ZB5;Uc`( z?#e+gPd$N-@KE`Vs`d8N#4rLCVRb;`7#d(aYmKj4Ra8Zzl|ccP)z;ATp*w`(&O zb?M7RTVFoO&L5WG0r{@$K?|@c`@S}_u@UK!t|DgeGLII*C!I%bva>u!*g?m}o{c%v z+{~HggiV!v$x_{Gk@H;oMOc@!tBxsL^~LHW9j*R$8DPrIr9Eaeqo>iCOiMKI=izRJ zX2Q>Wgoc6*gy6eE-y!3--C;wo#fK#k;ch!O7GZ=UrJ(9|9d9%vGDH=2gb!*%HgHS# zdyOBwl-VAXry+$KkpaN8jibH%c=1yG$_2@Y*GtI8-FiuL3!h;WZ|(?)8rm$`p3ndX z>;U{8ydZm)@FNd>n9Vb0!4SQxMs!p6^S`}%-!=h$>dH&@nbyeGaoaSMsNVmx5B!`y z__9>}Xz8u$p3Zl#NF~lH>;zwAOT1Y@qy{${*cd3(y{_>~WQu3FU6 z2o>D#OrT@a#5QSTLIV(XmnPsz^Ah!7N z2NfP3{EhQ*AdCTuYDP#YBzke0BRYIX;@5M|#X@dE67G+gyn_*!nsx>{@NVGP(d2_? zfo@0s!p?D?8hOm{pcUSLa69Fv8QA~*3YcI+{{Gl~!V8>|)u+V|TA5CEBxX&PQ3jEL z;kBbS3~vsM^R@=SOU?TL+Z0n;hGaOa0UY+m&Xa!8k({{1ozHMbxODjzq|Sl~2Oc_o zZ5p(yrTqbQLj;9(r;?Tih-#QNTuP5La(W;{cp#T}#Dyu{5f-))Or8QR3OVcmA99=G z$wj5S6geL9oOQE5A_D-uN>oNYG~DLIZT=LN{03y8ly)j`{FJs}Tz?QybtO<#uQ`MG zHRsMQ*}@FUzeAV5j#=X4reUW8e(musHKJMu(8emAP`BA~iG7@IX1LGHU$!G%|Kmr0 zO_#eYRsZJ?|H#gFujx*7ayb>60Gr9ALWK#-fPO3-f0-lsBV2&|?P!A|H@UI#@Tzv* z|I=50MPHq}T)m+4|13qE^bLSpn*Fb7kHt@xZkYyvEO7h}HdzYzt9QO*nt&;(wvow~ zp8JIHx~N0vtc%C)|CsTI1|aO1AxHgy{z0ZCErEJSJDhzBYzlpM^`6y_*|BN6v*617 zMbk>esfFm?>;q3m%{htpujXYi4r4Ds3Trb=o-h7VTdJN)x#vd(4oe%MEbuHyX^1#h>F$DWhnF~| zyA9XnFL6qD7koRs#3|ivxGsN*Q@Xq0i*SD@G(*)g0ME8&;S2~)dR-j)Y

i-m&3j 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

=C6$3=EBFYVgN;71I#R3lO?F`a2J>*VIR3bs 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
_&!% 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 TsZ1pSl#ijV@txA!_Tm2v_WV6* literal 0 HcmV?d00001 diff --git a/docs/screenshots/hero-dark.jpg b/docs/screenshots/hero-dark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b3639cc50b46f012b7e3d027e6b35b7c7254220 GIT binary patch literal 249217 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�SK4)qwxFDL!3mac-@ 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�dclq=lCja8GGB`2Y%Af4mCXAE)BffI< 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 E0|&y9$^ZZW literal 0 HcmV?d00001 diff --git a/docs/screenshots/hero-light.jpg b/docs/screenshots/hero-light.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56473b502a4657df60eff225dc187011ac9770e4 GIT binary patch literal 255079 zcmbTdcQ{<#*D!qaC?OcV2GP4o^cJ@=x)CG<2~mdV(aR_ag6JYd3r0&s5-rh1i-=%| z-U-oX)WI0v$^Cnu=XtO1`u=#XZ_S*u*V$+7bEGvp@GpMjU-a4-SJG4p@QHLIlJeCy?smlGGBGDiOUvFA zZlVJ-)c#jYVw#8E-jDwl_V9e-3)j8Pd-t9-FU2N632*>c0X{(dp`)L-rm3mnU!MP! z{>%TrPsii`N(PKd{N?rE+5bC)>XDP5BS?w|4_QZV-zQ)-NrSj);1ln^cqE8Je8HCj z@yx%t%YX2SzqrGH@RomR?!dJ`nqd&X=IHwH5r{8>xVXdrmGAO@;U16u|33FG{B27b zCr=A=Fl7c0PQU>02Z8}dzzgsMcmZ8N4v+;*!8-c?E(86yj21}k4VLl+5P%Ed3OoTz zYJxf5z+=D(#9<&WM?ew~2XR?I8a!_Ot!uC>2>(-u|C9F=1$MD};LX3{^Zum*0R3

db!{r8%P25e%o>C4LlEC5iH0KkRl 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%0Aya;A=iUz4GNh0i?sO;P&=!wP<=+Q^ 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%0AFkS1(sIZo;$PaeYMzbhDc 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/settings-light.jpg b/docs/screenshots/settings-light.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71cda74a93dd6426eeed3a9454105c991d9bd6a6 GIT binary patch literal 198591 zcmbTdeOMFMx;{J*NE89vIx1j-s1*`hfylHHBARGJNCF`l-2KSKK?I8lyW0|jAfYH9 z727ceFcB~UMv~#9l~&uZi+dZzYCyXiNrn_HwN$|Z5rJ9)wA7Dx(fvF7{I2(U|2Wq> znq-koCbMR(d7k^Z?|VJJ^ZXw4f-pgl0C{;qP!;$GJ--i~;2l(CLr`)uv;l&kMUanI z2;>V|U>9hs*Q)=t6TIjU>CgAQA?TOA9_CIO%?3eu}gxcBnXmte|FQ`e|K)~dkbIw z+rGU0D1Up{+waK2C=a2<&?+bZS_{3pJ4=|uPa9)F$7Ue5cG7z^XGs3^!)i# z0)j{%LD2Qzo_9enF7g?oI7nV=A@3KxNH2OlzYeVi$MN<0bNlZDdwG+5e94qWi~W{> z9XeisyuC;yZy%Dc@4_VXDh8iJJ}>&dw1&wgFO%-3tX0CBN~_NNyNLzBsjH@CF5ee%VZmX5!F)p_wBUtha!>+ZR6^Bbbi z^Mko3OObHq zp#}xB+c$Elkn!Hjlrz7WaSwdvxa9hSO7+rpG=>Tjvk9pC;7qf2DRHLH*zDP2SO)dP zn!CCwIm+&0hP4p>+(_9$RNbSZ!s!TU(8pMb3!?WiL+M+h0d!nSw{k`6sqzq#j<={$f zR}{A*oyHUDZ0(sNu=SwPym>&kZcE?C_{*cPzhcg8kBU8e#PtQM9>q<4-mSG8ZptjA_5p3N3gCW%*JOHh} zRYf!=FqGJ<$n~`q!x(EqSZrUhk=fF|T9{rws8uC8-VZV%rhbhd#O3+u`fKVaYfEo7 z=^KAkASg9OEv*!07pYS}p}r@Bi~6)h2b!lvCkk8X;%g*~=`f@>)g04oU%aiIdSC`; zMGRJDZJFlu`R~atiE$J&)P5CA9JzI0-Hfe&AR% zR6_fStp6ibc}t<5=J+we#Wl!wa0g4>iM|`jtunUL7G(Uiq6qziI55r`#v%HU9xY}Z zbocAL_^lJ1ky4R%!yasV>7e#E^F37K+B7upb#+8*vC7SFH@dERsn)16ozDEUE8{xSiIL9lbOvSL#wK zI%?hALNvHMMq+5T7bp3kSw!ubZXJg{YtnkW_~Z*2q#4}J@7LZXUS+3N1cdw25|YD@ zN78=7$L-+h>Xs4wY{|IjcBw$?QhCnZS<oq{S|zz!<&L!k%>JWFCm>)7QR|2cZ=S+a7@(bLH#&%58kUz zX^%{ieGGpH-?xY1^KZU;cE5_y%&QUuSuI&xJy;+c9W^AWoraJ73y9jb5#3-FN%Q7= z^20LeL~<_`by;L9*CEf!bS;PpyLsn=s+XvBCqip$@kHBD?GNo?PeCj|58 zFa@)h6iMRUg|xBI@75*d&YF9F7HCvrpK?L%?s$7FTIB3WeFyn3o1G>n*O+(n2^~%! z#vuA!Q_YuhdHNHyPjTm5&kMuIBIN@KYsBn3)srK(Di}&T1Y4*tCaNXghLoR$oCzU6$Vj^5h#M)b6h_A)P}X^T z-kBID@h<0%;^Fa%!$J-Pk`7|=ZYU(()xd`(l;@6T=jrZ5B_?}j=KriXnkG$%HGRH( z^OB=NdTftusaP?y?Ge70L6#e(XM~YRSEjaDanNiF31E5+)ecnRK|L}k zF0Z-opArhbGU%uw>2O@3yH}lY6D}+%Z&V0IEBmzpOL~y#rRseOPW(S5a!zo3oF6B? z=sC23=|b=Q9g0`{on4W_O;m~3T`(M>h`?G0<&M^ zWr*}vaf0vlonJhp(M$`DGf#o3)`kaBV5LjCzwZU@NVy?B&gpu*y;zjAqYt*!A25v% z7=o0BI0t>a|Cs*6c}WT$C1iH)4~)bXSjpppVb~k=+@y> z$0X8IWY!k+7e?V!qUCxId?A-FJ~MgM@U( zZxf0uO8nA2r-n**c-`soA)Z6Bly*|{hIa&7JH7eyaj{$CRA3x)4^DwCSZ7I~m2oh> z5V?ejnTZ)*6PTBs6l>IadX#aGMSO3~OR+|$@av}x-e#@GdeQv03C!PJZjk1XJR>C| zmyxh^*R(-Cj1_bmeMf3LB06XRP@P4}^9|n!sR@;6l8z+NM=%+04Ovk*kD?&owV>EWn6Vn{HtST_LC9u(T z6)T)4lW1aRe+$ek;%Bb%)WU*Pkk(1Ynz3O z2<;^_cSF#%wx0I56SZTC045)?45Zydvp*h--Gh#Hnx}-(tS6to{`RDjf6+V^U4%9s zT<%}6l7a+U)J`3CYTX+>Dt^3gSiGD6+UZxxhxAuuo8-N(g$1*4dsuv%3hgd$k5t5n z8ea*QAF;FV5PSPNf=3Z-`!sKTWI~QC=wV7b{3eHe1+nNSV{PHGf9}3*C>Udu57b8& zp8MHq=X-{6`s_qdEF8Nn2z4HVQ2<>#u&mCosr!j4b;aM5qak2>uC0^#0i$TH8ikZjrAA5MsGQZXUZ zo#+fCHL_99P)T7^*^waJJfu}1-h@>2&JA+}QEL$2b)w&FC+5uXfsrcakJAE|(}M?1 z+5P{yWX5#1NrzQY`ACt+7!nJP3T0}=@or`hPBK(c)#!ndN_9-52Pz_F%@jkL9~9@T z))-<8F`Phis4MFiBemY))rUzZ1cSBX95RCeZlq{%2Ab(aj=Twjo;#nNXJ>0KIpm)| zT=r`ofqR7OovmnJtT9# zZ=^DDtKJLCdI%}c2p3N(ls#}A%eJZ9I8+Y6+NEJE89MXqAL&Pl+G_qd1}UyyHEOhM zqF$>eUQlg^dXNv*L}RCU6wW~cZqtg;)iMdQM;HjrA&(XxEF2P$}qhC&X{H9Dr{5hAZy$!Y4Tq zaGqOq+aPX`L!%wEn1R|WaCxJpgxQ1a8I7oH_wheuDGE6am&dyq%JLJ8xas~=ii%Cq z3c(b&R|fe=MEDA})2jwe~JkACIm%b0vC`Qwk+mEF3(GnC^AG4?ed z1yCD(Y14eTyBv}7_Z2zNS}Auz>`un#yifisDXl)wJTL8gY-+P_`q21T$anL1aNi12 zOSo>a4H=GwSA1xqrdAr=i3xF%zg#zs^I1)$6-6Pr{Qw`6eGjtj#yf_y_7~ z{#A}7Eefyw9C^_mHfKEB^_U-CwHGlypgKrjC^1TFQ`OS$l9jD+M(I4528*{48xs}1 zsR#&(1UVs$aNnqgLC3Xk$Ya(KJPFO0fBfyth3fccqcs z;AtKv^hG8T|tZlTMnq=^}A9NKf#ne=;ja|jqq+3R=6uTb11Ws-Dl)%PbZ4=xa z=L(K)A@PybIcbNGm;C}!MsylqWEP(S$a{8-QvqR0{B!5_wOmS7Bq+)Kf{ zrI4HdHR4Basumpk0k$$MSA=hE7{c=771qbXO|fS$9Gfwn5t5UazfS8ZLbE{Sq!gv@ zz6%mxPO6~ZV}3g;o<2`_j2`2sAKzkJ(t=XLo%AWD z_%XIwGfGqNTU$>aPhI(yI!!0|2`i9&n^`I3{x0!dE#x)Ff^n^s$?S&kIE-a7lpftd z)Q0LCTFqSmNYdPwUDok%StcgiSCm@f32NI&j-f!c4^V1+z-l2|#eeM-_Xh);m@yBPtib5485`-% zg!bg=cf;AiLB_21Ft?ZzY?i_KEyawo2D|UEnWj>ZTY@@4Rpq+jjWJ$X`zWekul5tt z=>_3hUWA$+WC53rm}|=-*{Io->bPmNYZp!mx?z3*kYCACb$nZ#G|~5myOQEIN=kba zKnCFAJ{AazWIXXjM_Gq^<> zBICe9d@L~;0wO6nK4cvp1=o?QzOHQ#>J=)y4PHD_JAibwRwz^tK#&QeD7m&^+xkf6 z_6_%#yv-yk(YK@1R4wSQ#Uo^qXyEVg>YSK6eqeh0zfUPmpvcm#jDS~4F7}eE<^wIJ z&tdPS9Z*EN<)?P`-{tYqyv5q#VzRt9%hOVXE;}>IeQVjvfrs>~Q~CQE82Or^Q;A~N z#h0fCbz0v@ij?Cx^&AR;Zj4~*zpp(u#-?=8en&{$pslXHp#6-vT>3-C!Dss4OOhTG z%SUQUh;16F zzm_;-oX7HGh^qMzzmT}h8jW;b68+$S3CY$nZKR~!VccgPBrnINZ6OJ@ev3xEYsV8* zUGO)n>ij1zIl67?&;65juCujS0SYnJ&20kgnjwj%Z`evMMKrii^j34p};B z?vuGxsRl(WrJSD7t(M%B_RTD0^3HgoZ`c8IZ!8|rXvr>Z4v+aw!jD({=({>H221L^ za8%o@qgCeU2Fh+r8lW%{Fm$q}rsCu6XZt2pLRCaU|sU@!ez%jEQ}(%y3p z)NXNd1s}=Rd0HMPZ*{G}b3;9*Mmhy4mea1W@L(HNtG_s7%v6cZCO2mZFIafyX8F(It7R!TJ@n)zBq==(?K|ie4}G~|Oj<55$Wn54tf(D0f!#`! z7r=W8%)LQ)Yvj68Q>iTix$HUiU$$O#oK)*MsXOm@^q6R{#UPIYJ4h?^)Lh@!YpLkF zXP*>EGK$ykoYFNa{b{Oon00sdXTQG5piZ!T7m(;T1>RoEh`@P5j(|4;`Pd zZH6y3=7?k`{IgGY=gM)?WBXdiBz*zz_&bn_fU*Y(5^pK6pxu$E&FxLT4b_7 z1%)QR$o+~aqfXz;y?LVYJ#7o`QVSnGa{Rnyhs4vEvZS6l!gY#oe66Sd2l&5i66Uy_x-3 zYGRx;H!!AGDAw;k9I^}lOIMO#`tL~AT3yiZpO8z6>A@{%XkE*GN8lx?Eiz_-@?fM{ zXzo}WTX&<`W6T^TYb0^mr8jM8Mi9V5)J8?(4G>JPQ>O)$!h8kO?#ozQI-qL_KXZ5F z)R}KiHDw+EfLC$HGoBC-nejpv)d86>=`EgrftMz`A$hhX@YHyclgTuo&;#d`VUrSD z(s|UN7)MhNj`OU3fK)b6%4OkWxeP;i7+ipl#+txoOMCyKX|VQp30W;+2GG95q>Zk8n{POc z!KJ|U=t%h+wp+e2Q{WuvPiJQ2A#3@VHpPvl!> z+>#!pRbk$F(H0)$K(i>IsEzVZyd~PhcDh z-9YY__Ma|`LjnG}Rt@5v&^H{+%$yxZWibhYDPf>IawyPpaTK5iN$p`Py~_%1tH03{AdpksJDM0nlumIR_sebUMtxUdOW?^@J1<gxYn$i^eV695N3lt1fOPiBe?UWjr5qeZRN;oe`oyXN~|VVd)dIu^z_ zKv3wQ$*11AVS%p*V`1wjLDvBDiZr-Ws5`%?y6+Y;wp#K=@jcE@vX1T+H&2UubE*O5 zr^fykC9Cl^5G>VJe~fii+m7F#>yo@muOtzFOMX$k_BK7M)I>5><-7 z(}k=Ys2!}5#D5}OQC1|qrCI9m=oNeQ#h6&EKu>Fcdmx%lsQ(1BA3zkc( z)$gw>7kifkUJ;62R(G6)$;D@3eRfIU9b=KCSZ-YU-1Y3dBGxV99hR)t-Sz5`rR(n! z8cFgs%{?hmTF$qU{ODk61~LwU`d=gQs^(Fpzd5|0DwrZL>qr>;o|DkZp`Lcy1(Bf9 z6F5{XM=m)BN;>sQVVqM-4*{I6fUBs8E;Q-vQT@8R5_Gr55O1f^jRk>E97>`VZus2@ z4R0Y-e3_Ih_;@NI9pW4e6QgBgX!7A;37LJFZjj=Y~H={u+ z(QQ0(Q+(T^M~Y_IN!z%fv0H-<*QX{awDZ!g2Zr}$ySh(yM>6g_V#ENhBdH)zHNk>kI5v^xM-2uD_R8HGY!WM~_K$FXm z50 zdt%?q!4Ku+Q+)#sjjj+zAl_wvy{1gJ^6v@-g9p`R^_OGP@kAB+O=oA1H7Y08+@rQP zxk`RzsPpj9kuvZ>QaUdJ&e}rE%^J@#xi_aoeDcYzly>^oCY_tl#gYnEPl(Rs$lcW5_L+)$-j`SY^AF=-++>Do4TSI?p z2);4zyp7qL`rzz_iR31urDsnjCax!*GB%Y|s(0lG(;NQE(hdz<*`Fh)wpvu0odL{) zcK9N^G$(oGicpW0)!g^2CJc45p|tC+KUvfh!s~`^AwdAz6*?U8~>wxls2; z&jFlD_{EfRdh(1YI(N3@fN2mT|CP0(O2rHHboe$0P4R+%krv=G^>UdmV;8a9a8eOE%3pdoP% z=%M1Ei3D(KLu)sH=MKoI_;`xHPk!%LMhfCDZcwB91EQ=H7;5w=v0aB{yKrbT%M|41 z!GZVZrTsMkA1>XI5Yw++)KuoMx|w%~VOSFVP_a~qZVM5sdJrhX38Q`*1*Tm5Z)Sip8Ldo*W6vgMl}v{ES0F-=kaI3SNf~`b%wad92>h z?+G&EYl>|V!gMdduSUwM29o@rTuQy%tSJDu-EV!1JZ*{QF}c_l{suo&ZrcWF1Lpr*vv_slJMjqtHq|*3HCh&Ysqd)KL~8fr zg_Gbs7F;(Q;itZ~B~ETdxxQ4o7sF3=-B2eCu;)bUZbq z^X?(|MKRSMD1Z|BMd5pzy;M|t5bvf>@$7K9TZAR4>`_8WE>$UhN~gt|ee%v~Qp*$K z#i5+)}tDHD`eNXDG;gRe8@9mPDT0KOEmWMq{?B?A5cy7AMaVU8GV zsg-s(gbYa&D8j9l!22RzknyvOCaqqwD_Y8fkLCsALnmt6le@helJTIX;iNP*h!>YK z8!Ba|=OQ;vu8)kD)085uiYrVMSAhFqxsQX@8j_iX70j5Q%C`UpJL}5{PP{u7M*tNbtpHktsqDd7so51szWP=JK2iEq6D za++F}M4lO{(V)eDef=LLQ$LGJF=1@{20zU?x(Q!ZtVmf~{fQrwJ8R55+j8+Oe>GZ} zlaeFFDikXiJvq|;(@)&j9O%0xL#4M3iz!yxCoh-mBEbErY<%VQbF!>IqyW@2>-`cw zz6(H9|7ly)=sOp*!$iZ(lyq8rt}7RxHJh*{Nd^5ix-BExyQ+7Pw6`st6Ui+*;Yf;% za9&V?Ncw1&Sp1s>vvMgDH%2o%i=kKO7=vqt%8Q@2r8!cA7hd_VDdRal~-HMkPR* z%5DX7N*p^b7%b^bEonZ4-0wqt%dIdPLOw$3h|1xLZW@yp1C6J}0mK(_@ALj==L_8c zFz)KR)H8g)U#lo=YUmQi8PZe&ezY%a$<*$?D@<2V$Thm%O1g2Hw{ppmjS;D$8S?}7 z#}hy|8>+=th3p={WMchiNEeEws6>zG?{n`;A2L8qONp0vPD0K~AzR6(jaj>CZk1cm z7|l>ii^&mvfLMOYi^wSm3Sp>Kh9oq}=P7*-*g7KK`|fqLs)3Go$4LQa*tU2Ee^}U5 zx={K`3%rtXamrIxdWtGnfFa=v=9Vw-gCX zEU{ya%0{<^ZPgb8UTnA4l?NDqrdvF`EWQ=*rXYvo3cMB}`bVLbGct;DtNw~GE?3_4 zvkIK7-IYI5nFBEZH#OV=t)VJ~svj^)68coJ z^4ra1-IF2n!?@Iglk|;=J9@}fe);5>gv8q-Y|S07o_dL!LK8qiT4 zV*0z&fwPFkc}wxT@l#E=N~BSW3~_+FVc}uG#6it7etP`s6hEDD#|-5gKigeI>_s|h zV@5ozsRr}w)LR;W`BcS0TzO1~`nHns_r(>LuAB%FS4XH4Ra zTo7;(AbCyF6h+Q{jFNjxjZPD~ftu20I2)6F91>2&;sP0m^nP|dM3gB700*MLF>Tw@ zm!RN#mnUBM-bQ1Ydvjz0rTKCp%iGC<#1q6J7+27yy^b$vwNm!O=% zm!I|mWKfvL^mksOT2nF_!4M@bLu+UaWo-MRs&9jOT1yP^T@DuNH1=2=gbj z`nw|ys3&Bl1|2=$+}C;TUmqE#OGVub6L3HcR135|v-p%fybytq2eYKuFDaO7C2JMwV7!BMsD2h+`#p3rvQ5 zdegnltJ{O7#G`~pn!8GX6^Ac2lC?#7O|`IftTSK^?^fih64=h%Wm~4Xy+899xAucD z7|sS<`>vd~mVA6G7YH}L>wUwi=pTM!c{f?UMC+|vt7`+koVWZyx=z?Hr`dr2^4>J( z9-(na>g<44?62M8@ai%J<2~*0B>T86Ld;`dX7Jlru8tmH8qyA!*AZo|52r-84&psq zh|FUrb8WQ8{BiyTW9DeRgObBClO8t>cV5bK^AQziv}0vR=CHReXh`q>3^_3L;Ww#E zKOi!)aCWFAt5E@vU=|e^C?D=1&ak!@*u$AAwup|c8NrV1h8q)8i9nk9RC`}^8{?i4 zrt;>O)={YFFJeU}(o`Wk0Wm=YgzNKwt?slQ&+SnG{|r9ShnQY|&^H=1Xjwkff)@3m zUYDF=8>|Xo)=h}#ot3f;$KeleMtEz8VJZqJyzO(QD`YHw-Vsd$ZX)1I{JJEt9I*Fw z_!bAV1v?NS)^`q-=|3F(j6P?g{DRLrWL0Mh@F+WHtECfx0eP=^0Vw=nPAQKzG7|5) zhGK8RFIIDYuNVfEgXO+P3N-8xM!;IF{*hE0Pp4g<@+??V)kGGpHR#gb0j=fH9`vOm ziPwNe5;It9ya9f#t~{Qx2!1r8p^ku`UUD0*#|lUtYv2`i^#{NmZOp==i~RgL_pUy^ z5iW0mS2WWUYCj54bA)m_xH$nklgQf$2QcI6=im&20H@sODUu`ra1SVAUX+YESa!W9 z2k#p{3cosXw?FKu63@@;l)a7(6U=idQ~GtRL`GDTWYf4V*dnl?kR zA)%QxE(W9Cf1>O&b{jr)>c-F+&LsROAGr%mT*4i#-J9t6>IUEGQYvs~HfRf*bnm96 zsMGe=XKMVI+V5W4(YYs3Kh+*Kk3N=sgRaoJJ`D7j+Sj_uYEEcW+_zT3mIg7%LGOk~ zZc=pZAwpuX3Jit+IHWI1?R-LSy^!llADkX}%0wM7%=%=6)}Jzy5$3@TG72 z(XRqKwbp|&qNjja#5qv<&dn8d{xdDPtZ~6i)0g!0CsN?iH14hz4FKx%;oE7s_Z%^T z3Eqy4%t6o4he>3#zqXD==R;00I_;4~Sa zaC!ThNmvC~syh;9B9t4Gpa8j$JX9P&A2n=C<&JaG7VMk96iF!Uk!&Js`P1k_TS)_2 z1!u;cz@9VuTpd#sJs#8z*2g)#3(SCUB!EphcNuJ!u)676EonaUAmYxMey~Qb8mtY% z*VQ|?Zcc!AZ7Xgp_u#p!deilpwV@Uu@pkRK03u-Iwm2pyV6Lg54_jpPSx66MKvyF1 zJ4o#tVSjFqaM#zmCnGhbcjFU5twMk_9veEO!^8mD4wb*rHEgAiwntb=m1^(%w_DWd z3);{3$RUe=n%}mDh;)6Z2Rgg~)EC;X0l5hz2Lgn|ocu1`Pg)%`K>urH;vmabMoYwxE`*cm;DD2op-)R-NHf z?XWWWX--nM4&G(#9=*`ikg!QH9XNatx!40AK>TPG<|q3+3yD@Q5-|ue0fZ;tdk^0z1`{W{qp8r-#G?epmKCn#( z4C#xUF6j-BTvi5+=tGh~fE%Or{K9~GWlOEW`0nPQQ7n#1OdIH(X^Jkqx1BwnC{OBG z11<%*f#2Woug+XKTqI4(%o^1D$+(H6P)`2RPrMs+TdeA9+4hBYI(g4Qf43##ofu=NnlVy zJr>yKkR=Z{k2G{K1w_LXFKn4NNcyk^x{HFL@|0wk-rX15k_9M5Y43e*&TgJ}E$s+c z63{}jzg}x4bxyh_2Q6KIPk-&z0$S-Ad^HFME)OG77&mLW(jL`ks5rjNkI9QdD#E&k zYIGeNeN_}fOSgr(fd2Q`EsPsEEt-;i6B<8H%nli1@!;01q{G94t|5$>*m`4|P`0!K z273-+fWusVnimdd0uHS_@kR{i0q~n@DFEsUv-?C>fk(7sjpxiadSbQEX4)C6_VZmc zYec=e02Al3gz%2g4w~Xy+p<4e3KukCcH_$SFaSh5UWKHUGKM&=AKmckq9)C})8Ptf zj@p;Nc-C#2ZSe-C-OxaVy00+2;T;QN10Ji{=6l(-Ez3`RkyUD=iIc+t%&?!4om!*4 z6$f+xf51mvpFL+l&`F!FJ+%XCTO zq8=fuBu@H+n=_;tG1M*j;jUD08>5eSdD&w#oQ(&~5mf27-b1?Jq1vsU#_o4LrCwxHlFH#3m45HwQmJLw(s8g({K!)E@MNac3&Q7uwvY z-}{+@-(Q|o;3rKUsy!p)F^++YB(~CLk(Ifzrr>!AL**9#oW`9>7+hGy5ly)-zPH&* zBI?yrjZ}GeA0vPbTU-_9n1O~VQD6I-mi?{|$B72PZ$vJgE|Us`0c(x`3t%@d!n%^d z1l-3%ru#470vbX-YK`=Tfe%kAN?_cT)5irGv=1`Ds8iV-9?y`QLM`C5+oPxRx~9w!zyGp`8KJr*Fs)A1gBJ*iU)Xhg|tVZDI%2S(?BBq}Fn88yuj$X+a6!5Zhj1!r~Q6r|yxF*HZEVfbjj zW^a4g9PUPMXC%={9UG(4bNo_Yz*2BF?Fbd!n7EIu$Wz&o{7Pcle3a6mLDQvCcz z{bzBSN+9~p@m4JQ#|TE>a34!k@)vv+|a*8%KH7;R(59gbE;Y)ti&9GICq68z6K9S%XWhK`Jy0U=7 zh^UBuAe|5;1Z01A3|%!PcJmJblEN)fD8GNCxVC&XS3FMyO)dp)qrMW4u_Mfc(Qo~g zweF3Lv^Ew#-~VnnoL&35cTG8O%_jN{8hsSb15Wqv@#bfi$>eumPTLb~+FFm!*@9am zhejI}3agvn@-xTQl0S0VF;s(JZvMD}?R?_qgS9w`7noof&`?cjzi~GoFeT_HfnSfL zJq4;w>OX#Y1q}1DaZa~F*{^G~9A8E=WX{cp&;mTP`-^J)+F(Pn+ptR|i5_mJn}_rS9V};{j%Z^9 zXOC!_DaRBYsE<&hrA-hz`^MLU1PX`Qd{V*s$Y1bBREt4B{3XbtvKtm~c zCFTvdvk9v{mPmK=AbJxf)4Bt)s8B+mpEJkZ@X=}1PcTiYK&DjG(A|_D-$;;3i4rB1std*hNW%UN@r}zEGq|#VgNphL~O7WXjKEi{S5cr!t>{};Io@?k4k*?A`tmCaq*mlx(bB;aH3mSI*+Yl0sEp17CSAW) zes+_q9By>oV@rQRe#g*NKv2W+Pf!N?V*?$m`>~{DX4ektela0y+5+7P0bz&)tuunC zhfKx=HhQd&MRk_$;r1ZBCx=;Tqh3qe7qD8EPw!EGs>!C$wPdY64pvHKyuM&7)eV*e zS_0#oeBzXFd%2zN#@^47|O<$`)dFq^0iDnoM@+hhxpa~RN9RU!e%D2bD#_%Bajk^z=?0~jW_?$#Y(JL2@<(3^kD+n6ZkTcbLF)wrjF zD^FAMXmr{b)TB{6Ig?R@_V=dJ+eDeZ11z`sqmR1|-?sJSMnDwf?tZ<4qP_(dJYB_S zjYRdJ*_lKEyp?$ZqqO_3`MR8+E^m{YA8n+1z|eiXZVy0Y4}j4{7`GFyyM$42It%H1 zBu6wAAG5dLn! z3`mp&sFP^!#0Sz_2aOWs`qdc|pmp}b66)7Q&N6X~P~J6V^Hl}R&X|mLHe69M;twoB z99tB30(HOd69k+RPKb#^s&il4I;sNML+i1g&38Dqf;O$M58obJV;s2m_$ z^Kq}-k(v`)0QozQy15?U41_!Fq@=%rr2{Qsf#vme9SG^Cj%^)lXvcl07i*c^pwWI% zTgnPT)?IZA`FJEHm3uF<;VO`nmB38&)2%A4ry@cvzSEMi6sN_Hd9kIAA&pmmX&;hC z`W(J!z9pvjwnK56J|&iXr|BN>&c)=@Z`jbPNp`si+Z}6sJq2OG=56@;%?DO}^jey& zEpQgTXygC$R}-QNe9#~tG1*srS&n^h?P7#5Ch3Mbs@fL0d-|ol9Z_qW?#egbu(9>c z0uiRU5@i0-z5V3B(DkE1rsfTser)|QrS8*8Thwczk8%O7$0A8zR@>>+X=ynoQQDZz zTlQLmo5@4ETymM~;{+B6^i4licI#iKzfxC=G<-Rp6yW9_{<`ew@Oiv>A8SOHUkF1} zxDS=s+ZYgD2I48K z_cX+z_l8V^MYG294;jn9-4?q=`jkP+LQb{pH?8^6y@?{*e(i-(p?vu?(a_uwU|S{3qCYdGH5w=*{shr z{b)c3>z(^`)MDQVvE}p^h2~ddumZZ$Z2W2+bx6nB;yIg0$pDM-#uF3mzF*q5W~}@Q zv0B|1rxM>*4jj`yI>-V(N_BD0rtgDH`G5wmF^ddo)6#uC;sE--@76P3Qi*zn#|m}} zgVgAT;eV!{S4k@-^35TvUf0Vi|wzMf%`!4IYJBMg;*>9BJPULL7s zv0hs-DgV(x*)RKlxO?+|sJl0Qd=MgXS0g)>J7yA+k=s;q`&bgk? z%g;-CA1a&&N zvMPt`ohQk>3rnhemFth5X+Wu_Cif8HuV!k}RL;+sYf<%t+Id3C9ais zI-VX#%XrgyNyQ-E>q@AnnO2^AV!{y4T&G=q*4Rt3@{zKtL@p-}*L;BQjxJ*k z{?aZf(TrlMwo03_;7hJtzY%lC?Junc9`1zgi!X2FUUYJV*DO{vX$X17m~RIkQM#|!t=(cVqix}jo-ur)ig zW!kIE^Nj7rAWu_~kzFriNChzt{lV%r*_J&4TkE)g3p%IX`9RI;?Y9HQJX5Hp?6Fi4 z8qcwn21Rfw`#yG!QQ}FY(j^ut`${hoaAf@n7~L{jRSV>BU70pE+OwNrl?KQ4gbV5h zwRMs}!#3k!Tf;+B;JSxIaGE!ZbyQD>tJ9&U4b^&*^(S-$ofz0l`lTi%R0R6TcRWbt zEUEt1$gAjPgg5D9J3PR6>9(b7Q)1h$UK7is@~7IiN14%8E{Mr2QD4oXzyWJb8IHGA zdL)@_ZrcmRZ67jH*3@%PLXT~`jVMdQHqkWqSU6f`MRgJ!TF;NlldU?+e2+a4=!^x> zDE)6^9a|_e@TM{bd?Qp^|=ZU0dHgfhiP&ScU^A zajIfx1d5=Rj;-j31i6N!o^bdL$%Ih2C)lLhUMo_TpiZF({*VS$FALkw@>GAH4MrZZ^@+4UZ7|*I+4`Hd+6riUYgY3*R+Vl)NVZ|4D^_F9F1)1;GVLwb zlLDh-?lqr12-h5+vOkeJ=jlIhX+hgJFnrXfG5-$IQFFmM_3?d_Z559O2Jh4=H=py7 zH?1S(sT!fU_PMzwyWOJ5?@T}HT*>vT*|6>SM<%T_p{>bNy4>{lB=A z-7HF8B;z$OVLE6ZaR2UgF?D&Ay?u4Uxw_R7gOd9ou1dm2OV3@ zuW?0WSvv}%OFaDGb*uU5u2ZO&9-Wb+`7jNT%3uz`2C zzdK2Ly&Qu_RB^D}Aqz*ZXyvnhzy{Nkwto%(tevSTiV0|h4MucE7M%ePZ{8(=27(g?W_6!j~MvbeCv- z0K~nGs}z-JAGMNMq5naMZm0aj*<5?RP4z)f3zn`{^HPQJyAx7 z2j;AVRoI`@6uq1|ai|&3YhxhiXxm6WKl|HG-0YbTzS&NLL|&;Xd+WpD%sfPFOmNA& zoGY*LBdt9B7mi*`>!>Q}%%4U0)a53685NEs`&XYFMAbY+SX9UnoH=y60iE`kwO0EN z!MVbuD0}}g(nsot7!@DdVB+L~?1j`;+0sPp^YkFbOw+La^R>2@l95G@!impfSMrB{ z2+)Kxf}%YocB@w3E>{vOL;ufCrv*c zc1ayeCfUxkFi%Dm3A?w}7emtmX`=|7O=~*@L@ss1g3takoypJOU}sWpW)?pMl1|D} z(O+5t&^u^xj1(JeOKR$L|nI9>;BDA`7;Q)YwvV!xodKG#v}z^Rnvxv0&w z-|OHu68oU`C`f9@k(~fAtrZ+`lIWV{DxqEwHITlKxIPvRO&wym0mh)Qh?vgUFF}m! zG)2J4vC9}B|7e+iRF{~wFkFt4`@hx9bDj1+tLblS%el_g_s zV`C-j?LEmY;$KEG4$<)l+wmLp3!EHq%m)tGh4GsDaJ?CC#c8=)a#$H6yieFi>$*ZR zoqj7 z{blHGiXro6W6K2@W&U(IkanLGhu76(tk&F%A75)*CgR8{&h&^QK{g8S8r(RPf%r1q zgc10g-6P3#9-12`^BRtTDf36HK9G{Vv6sYn%G;>RSRL}UG!^zioR8NMe8)1>XHuql zXa?uwFq+SU^y&tlzMMD7NbDqDoADM1{k9M~rPv~urkFuogvY64=pc#Ax^Ll(9Cjqh zNi`^>!KrJ(^F;MEZ>ee7#n3F`x$H};eeUtP^5jOAAx+cZWm~g@rkzJKcM|G!t>+?5 zQ(`1T+Y4AqSk|Wy^bbcuEfdFx*NVJXt8b~MD(&g>B^hRrwO@5F7<-1yHkZ`2HJZ^_ z;C!?pFNNEwZS0h04*?f*u$fR7arEl znyZAu7qTkjj;cvBR?A7_u_L6GM-~(}dXwXp{weus@gdvgSa68P*OHQGHnutZ-&oeJ zo;a@3F=CRy(E=Pe9axSJa;gVT#sFHmh35LvH02EzooMnH0Nf0`m!P6=39qC)s3<*4 z2d6s8v)a=x$p)wnAI*J-q?Jiqlv|VmxP?X$!d1>j8>|sz7fvf*!BCKxt_T zYGj#6GdNk%bZA_LX1O9+NopE8Teh6_HO0VBoAR;X+*N&F)cBgDgQR=Y!$dl_(rw6euLAKX~ z&9V|p#?QxVN_T2iP=FIcAC`|X?ie4^J*ClT_*4IaBc zdRs=%(5<~v7FaoPhHtc^ZJBU4DK1{K#&a`Dn1nE5h#e^iv~g3~gt@|~Xx#WR7!8kW z^h9M?N`jKO6UZTt(`|V*h5mp(aw13H>!`;0)ybfa$Wa+9U(+^q%*Sz}=YYG2=-tx! zPU@Kmz)xgG9=PJ!%TZFhkav?Jnwak%{axr}M3Z^*nSi|dnUTntM^Dw!QBe~oKh>C4=GC?-l8xVb^!|fnb zfD{X;Cj@s%Gv-?vvROm`T)xe%W=Nezp+QD96rhe! zow2Q3wZCE4Y#H|>+js3D+kyPRHsX@9!hW7_zKN4WYJt{x!AFnJCDj-?rG#12RjnuE>U(&!m5Ys3Q-1lcDI zNP?BR(W@)GFdDe+@6nRBi&Hd*nCpA?0m3k)@b(A*umpr_6DCjq9})++CT=$d(G#nc zdEPeO+>zhWVO!i9qcs$pEw&xLb%{2T3@tJ^2kuoa=5b{a^c#4_1a)l5Fv$d46NHU! z%s?#qI&BgQSj>=;Fnz3~E4YQ(s|D}@?hj0xhRsbic4l>hG^0A|%|A<6SgVqFJf) z*jT1_gd>?hLeF<3*XXkV#Zl|M{(G^sy4f$0kNC5fTb>jx_YM)04y{EO=QVHXx6R(YwZrBC`)fO;y4D7)kc(oX5=^nV#U<1r zTcm0OGWsco{;2!gX@T@TSKt|5i_ei!lXEtNxKGx6o~ z^x#@H3>nSbfY<{fxSu^X*?h3ta_{e-Q7o?vck~BZ-(37Nw`w`>Y4XasxoyK0qaXg! zI!7cNBiv$OzaqEv$4g+S4*ccgrAjOv=N5jJN1>eeN^zhZq((Yj@9}T7k;8^;Ex8}> zS2EWA+B5_5*~GHjdUFP@ZoP{{Tnx>x9$$y@*JrGL{ks=da*!~o#UHb^e{0^G^ZEAj zbym8-@}q(H^0Dfv%?9T-AP4_`B@aJr7@|4xbrAncb6d`H>r%N*+iqJfG3hDoto{-L zVP4TO`CEkPAjCjwg}|EY*fceA`bFq2_{Gwhcs|WDG!_ONFID%kxtYFz_@?;pUVzc& znH$Zy_xEUG~x@#ROR_}`c^v{Ud0w>!wT+9CPuemvu)}5{JUd$$l;@G&CwMHAfw~h=D6E(s(!Zd2W?!+LW@ObGUhVZr8Xcfe|OD)bKE&0 zkAL?R-`l}bE2s%=5n!FBOdAqbe3&+v?IH&Da~qI~pT17n>}f<(^56C|S)SHtyZ;n) z3+BuSE!LPB1*#Kk?0@^N++1djG`>aYw+rkJ{i%4%R+bHA+SQ>7|2m5418h6{+qc2+ z0TqzIM}AL@`01X|2cgHDTLd&i7EF4o92f?YoU|ITNuB;`TAwC;7b%fL2~xkMST<1p z{rIvuQ@-oF{|1DqUJE>OX?%oPFJkQUG=`1*IFXZd^6m>PQ*-(}X*%@rtU7Byd&dSO zLumuTmKfZC%&%E9FVseA0ki4;^XTga#AUAbgK9nd!}^=Y{c`-F1s+S8&O;6Zn7McO zEw_w}n>T;r1D#-pWvs2-T0ax|f!)N3ad=@MqIo^TyZ9x3 z_-@TsFb1I6y3j1>EJtqhj|GK-?Zn?L)JCURB|CO4twtDk-f8*?4tk;;-)q2wvd!oH(k(;)`ER1jZyzcDJ#+W*})rC#> zO#53d{+HOMynZ}JeyF7!%_*w+u>pxjG3DF;9hF6Vy+X)O%g+MCSYHziF0I5MUiPM-+$}UCh{ggdhKpjpLUV1lUhm$*Z@QjjX;g z_4->?7BB%Dkox`XoyZ^mbl4OR6wo(l`liKgRzx-QSJhpRorrk56BhD#3vFe=GK{|NL|*`S_AS5Q%^GIlgVZ<{a`q z=Gq2CZ3A+#VY)dy?6!|9Nu*B9uIb%IO9!GUowgH+|cHU=C$`P_4v2 z*nm8p^f!5p^rlQZUG<&;UA@o}dAjA-yI_!-CXmA<0|72zyq|jfG#w$%Rr4DEFmWq5}_$?(MzJ+u#b zVKDOaKl60cgEl+yKQl`8=llU)5x=<%->mrrKF=$PtH6t40_dCOdny0>9)9z0EwW_(oyAjQyH+o*s4gf?+Rbu8o51L_ zm>YB`%?vUx%tnHx`*&dZ)!{IK@pZj_r2fak>onxlx;PUx?bNnh^SWjlIHVO*@xK%3 zr=+t+D~> z>I>PwT+@-^y;xlJQ_1*MTBt zOKZ0@u`36`B4qnJTzLF%;G%GXf5)kd2c@er1Ubcu&|2^B!l9pj_Rj+UA?>GOYkx*Z zAd*A;6{mh``#U%m=f7n-OuLoyP4Q@~IIs`<*MUi;@~^}H?8pD*QkzXTqs6BSAKgq#WQ{@z9|_**5KE_BHZaS{sy8fhoGbW4WXU*P4oWts9%B6 zr%wHUdm%H7|25+a5LFohF`4=kgO_H!XNosR2EXt>^A2C94th~L=kaq6VH8T<&AV#uy0cHqy@!2)gus9{~M{#>={yGw`h&pgNm zp9gAyV{bZAPcwLh&mWkPv@W4LlmS8xerWR<2u&}~fsWo@y$1q9ZO#Tn-d@EouXzNv*M!mh7MA~cz zwzDl>tdvcKGB+T}x<422U-N8TP~<=EOJxrJT31Vl9|aO@{X)HGjj3KaG+M z1pn*vwDlLighk8^_B6n&7K3ca|{5UZEZ|f$nP2E~|VB#N|o7CgI zR*B`)~hS&-?M z?4J0yV_^J{Q9SF;s+%kO=1iZ&cTUP=46nPbeb>cf0_RnGY8`EF^eWVR1~#>0g7*ym zHICe8yP+ob+TeeNu`mF?IgIy9w`S~$DGs_?Ra_3{(7iArk9GZjgn*a^p5R*w{~jK> zDHpk4Ms1XNIDfioyim{Cp$9YfevmH$xX0PQ-OZMDFhr_}9rQmEuj?Y~+3(M!iW!Hv zKR=dpmduh{m+%?-!Rhs$-+=fk4NhqYvkrwQ@vO+(#7~4?9bDU0zKw8|1GKzYz{qe9 z2``Nr$T=HtzUIeTK0Q~jWRO@mdB2#wcR+$7XVZ2Cxzb%MHGjJfdB=e7*=6Hy#lH@^ zNhD6&G+hhFizS?iig%8yz+dmO6k-Y6e%1|2gO&=S8RN30?gi9T2jz=-XED8npHd0) zwZ?MetDP@#7kpi+Ta45%OM6V6f~Jlb={ z{b^ICTjd-@^beRHf5B+?#5eyRku1 zbW~zzL>B^(9M(c1fJ1B)lx%=@Z`Y;`r84{}Q-)2rPEz4sL@;^FCP?%tugtfs+RVO| z`UXm^G#Up$_eQUr040HupsOkaurMD_*anbMp>*k2Dwc}oFxp4%yCB8(F0o_vm7^0e zi_{H>OVM10@}LX@LEYpKIR3IS&1~hvj&b#KJhe9Y1Yu(kgDhe&nhQm~VkmtbFb1-* zJbIGaRiG#UuCJ|~fEk`LA5sA9*t+N?0KN}-btKmA1;f_&4#8@1J!--fWGh4ZE}+k+ zAEk&>Qa$4uxRZIH72gk3Mt?apZ=?(5Y7jKSown+5t5$)-^Mutz3N_+=t)>_hgR&Xj zSoelwXUk3B*!v+Wqt(*$tCn-B>?NESIPuRH8azH|>_QQ}6+D{?k0%zKUM*51F_(&F zhpnUBy2h+!r}ApV`!*o%uLu1FuU)u9y)w=ipiV!x=0FXc@z?~)^@Kr4evP^ z-{bLpc8+1ao4&K(OOvF0KgFv_HuPh7f(UDCe)IU#yrtq-)^hAK%#?XuyHHG1&nG&& z=$iaM+pDzYrkx1{{&s`x+TEkYyXGnnjvh~JrgXmR`9S|X+tc#3YwdBJ9OaZp<4KRW z<@dL?R^bp|zO4OdoSe9Ex#;~`?^^VhCnIT51GQxQO-vcSp(V1Xz%l;T4T+iWiBXo> zPH!1!o1Zy-Q|Rbj zMC@;C^3q<+^NqlO1!vc~&eXcz{B}xaz`mtvg!19QgVc1MXQ-;bP8alEkS?&TfdBaM zQ7YBp;mBZ2r3c?vYsANynN>H@m$c8AE7Ob4{fVnhTdo?b>NkekZM%5UZ{QvNto$Mj zok&#rp&%9fI5?xc*Ak)5lX$>^N^80(6JfbJx6@9;|x}i#-l#m zzLmzpqu5XOZgMeJr;b?|6C zdsUsxO{^>)k7|@X1j6r|ZOfnZaF6>Y)hpi#eNQMZ^M!8>_j}cnr|@DhdQfs*DMYr~ z()zV#sf%OdaWJr^jH5atFZ0DSl;5%nD#j(YIQ$6XpNP3{-;^(Ul@zyoy5;)d<6F;W zJvG0y&|v|z+xNoE&|V^7C9!5I&Srn2b(c4Ws57I6X9?-tjIezHr>qaxJ3K=@C|yau zx|(>~-T3{J??;P9_jE1wOP@SYcQSh>J#WQi(&p}6%S$GNt)dD53EvakInXAV`zUn> zU6GsCqi$S>N~J-KJ&kqSmvP2*3{tM{KAi){q7YC@Pb@gGCwX`Y3T9xpgyxE>d_-S@ z1{=zcBK-1>Y=?bbqBSG_;^b;gTXlb?b^A`3ARjtK!A8NC z`B5J7@A-%xHr)JWlNMr?-SoB*0#`#{-ov=8K*S&VB2~5>XWT>boU)QnB_}(Sc%|rw z@E5aBKC4_`z<*PyiI|;m;Te|RfV?*I{`sVu)l=i4?VnpMa$K-*2Y)V&${%YxJ>jC= zs;t28$S&dJA%_YuJYf58-Q!@!NqLE(PDbn;a~Q z>ZVX@raK5F^~k7clojKVm}J@; zzxlg-6V5gl7A4N}VYz3+JOguMTd6L=THS$tri}*G2Y7NPM!p{WIDd!c{7&|3-+SGN z)WjJW_qe$QPiKuI^AXFHEyX-OKU=s!p=D^f%-tkm#v(qN)uI8 ztZm!y&oI`~YC<7D4%v_QrP}Zoy_7@>Ub^;Y{-3eYcCAqfVbK|e0stA6l=j2Z43IOS zWdkT=mu>_kZ9A{(u&JdoMA6G74ZamHEJ0v&MHf#{SH+Eo;AnjgARzGOMh++ollK}V}q1fdb{g~sHItXFa0pPOntcZu(6bXqDLvtT1Q8q! z0|0IjQuaW`)7TRRk+oNuFKq_=i3tx$hY@qf^1c*q?_)^g%GIwUBC+pxTo_>Zuz5K8SS{cq0WzAoHJhkK1O2KDWee6VM@`TZeg!%{+0{})1+ht}^ z4G5go3N*&T#TNxwj|x>0F@G!p+7esiz+CS~X1DkeBF#j84FEA+p-v3M;|w!1rx?lQ zdnX7kWy1VnWo3Qi)w=PoNy^($WQ%!FobP>0BTx&!ffRBZ~N(!l{J`O^SOF*iYJ4Z;S5YFWfZK=MkWaWw-JGRknZ zvDMcq8>CULP$D`Bjy$PWNr0&-xYfW{7r+c$;5xRx3o#6m{seX;=Jp{QK;kc{J#Ewk z_{Ouq9V5U3YOmP@Eda+QaF0ZR>OBNBT)#m~w80?hf*V1d)D(0KCSGY!=0{h!cF5DZ zP>d_MRe-AaBr9C3P@)O(5M+pq5|beQZ!>MIy>tL{R3Cnn!kyL#;1fKLGJW6Wpk=;m z<{+d2eZ=;%sG=Ys(87ZNcr*qH$JF0u>n4)OxAN_5kMMKHMDD>6E$y%Qp2E=V5}z&7 zuC<*y)x=l2pY-H0&OoQrsD6}KCY0l=8B||UvGiE;@Jf;2=I(9X)s&mn^X@Sh zM)z4BFGwD{8BAbJ>&xkj%_l#kFe;yQ5cHd{kUUk$b@o zDW7ar>5HFx?)(>W*}jOD*W2%=yF2*tNtT*htH=9$C)1~i*|mDgA-dK6hX9UYq~-PC zwh)&&%fSe?Gk=DMAHS8X=JCou<7#iUg�Ejv=ipa^lw21I!nDu(tKZJv@Jnne7xX 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%0Dt>%9pO5jRH}GJf!r^tg|-*tPAi~YLW0U>YH?c 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�V&td7 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 aFGE55^e;m|4#2>szgltVDX-RmKmXagy)<6{ literal 0 HcmV?d00001 From c355f7d0ce4c9815a0f58e565c4124c821562416 Mon Sep 17 00:00:00 2001 From: Hasaam Date: Mon, 28 Sep 2026 21:21:08 -0400 Subject: [PATCH 6/6] build(release): notarized DMG script, release workflow and cask scripts/release.sh archives, signs with Developer ID, notarizes and staples the app and a disk image. The release workflow runs it on v* tags and publishes to GitHub Releases. Include a Homebrew cask template. --- .github/workflows/release.yml | 66 +++++++++++++++++++++++++ packaging/homebrew/pr-monitor.rb | 27 +++++++++++ scripts/ExportOptions.plist | 14 ++++++ scripts/release.sh | 83 ++++++++++++++++++++++++++++++++ 4 files changed, 190 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100644 packaging/homebrew/pr-monitor.rb create mode 100644 scripts/ExportOptions.plist create mode 100755 scripts/release.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..b2eecb2 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,66 @@ +name: Release + +# Push a tag like v1.0.0 to build, sign, notarize, and publish a GitHub release. +on: + push: + tags: ["v*"] + +permissions: + contents: write + +jobs: + release: + runs-on: macos-26 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Build number is the commit count. + + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: latest-stable + + - name: Test + run: swift test + + - name: Import Developer ID certificate + env: + P12_BASE64: ${{ secrets.DEVELOPER_ID_P12_BASE64 }} + P12_PASSWORD: ${{ secrets.DEVELOPER_ID_P12_PASSWORD }} + run: | + KEYCHAIN="$RUNNER_TEMP/release.keychain-db" + KEYCHAIN_PASSWORD="$(openssl rand -base64 24)" + echo "$P12_BASE64" | base64 --decode > "$RUNNER_TEMP/cert.p12" + security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN" + security set-keychain-settings -lut 21600 "$KEYCHAIN" + security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN" + security import "$RUNNER_TEMP/cert.p12" -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN" + security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN" + security list-keychains -d user -s "$KEYCHAIN" $(security list-keychains -d user | tr -d '"') + rm "$RUNNER_TEMP/cert.p12" + + - name: Write App Store Connect API key + env: + ASC_KEY_BASE64: ${{ secrets.ASC_API_KEY_P8_BASE64 }} + run: echo "$ASC_KEY_BASE64" | base64 --decode > "$RUNNER_TEMP/AuthKey.p8" + + - name: Build, sign, and notarize + env: + TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + ASC_KEY_PATH: ${{ runner.temp }}/AuthKey.p8 + ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} + ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} + run: scripts/release.sh "${GITHUB_REF_NAME}" + + - name: Publish release + env: + GH_TOKEN: ${{ github.token }} + run: | + gh release create "$GITHUB_REF_NAME" dist/PRMonitor.dmg dist/PRMonitor.zip dist/SHA256SUMS \ + --title "PR Monitor ${GITHUB_REF_NAME#v}" --generate-notes --verify-tag + + - name: Clean up signing material + if: always() + run: | + security delete-keychain "$RUNNER_TEMP/release.keychain-db" || true + rm -f "$RUNNER_TEMP/AuthKey.p8" diff --git a/packaging/homebrew/pr-monitor.rb b/packaging/homebrew/pr-monitor.rb new file mode 100644 index 0000000..c1967fe --- /dev/null +++ b/packaging/homebrew/pr-monitor.rb @@ -0,0 +1,27 @@ +# Homebrew cask for PR Monitor. Lives in the BlockchainHB/homebrew-tap repository as +# Casks/pr-monitor.rb; update `version` and `sha256` (from dist/SHA256SUMS) on each release. +cask "pr-monitor" do + version "1.0.0" + sha256 "REPLACE_WITH_PRMonitor.dmg_SHA256" + + url "https://github.com/BlockchainHB/PR-Monitor/releases/download/v#{version}/PRMonitor.dmg" + name "PR Monitor" + desc "Menu bar app that watches CI checks and AI code reviewers on your pull requests" + homepage "https://github.com/BlockchainHB/PR-Monitor" + + livecheck do + url :url + strategy :github_latest + end + + depends_on macos: ">= :tahoe" + + app "PRMonitor.app" + + uninstall quit: "com.neat.prmonitor" + + zap trash: [ + "~/Library/Caches/com.neat.prmonitor", + "~/Library/Preferences/com.neat.prmonitor.plist", + ] +end diff --git a/scripts/ExportOptions.plist b/scripts/ExportOptions.plist new file mode 100644 index 0000000..e599d20 --- /dev/null +++ b/scripts/ExportOptions.plist @@ -0,0 +1,14 @@ + + + + + method + developer-id + signingStyle + manual + signingCertificate + Developer ID Application + teamID + G2537ZRGNU + + diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..ed53fc3 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +# Builds a signed, notarized, stapled PR Monitor release: dist/PRMonitor.dmg and dist/PRMonitor.zip. +# +# scripts/release.sh 1.0.0 +# +# Environment: +# TEAM_ID Apple Developer team (default: G2537ZRGNU) +# SIGN_IDENTITY codesign identity (default: "Developer ID Application"). Use "-" for an ad-hoc +# local test build, which skips export and notarization. +# NOTARY_PROFILE notarytool keychain profile (local; see docs/RELEASING.md), or +# ASC_KEY_PATH, ASC_KEY_ID, ASC_ISSUER_ID App Store Connect API key (CI). +# BUILD_NUMBER CFBundleVersion (default: commit count, which always increases) +set -euo pipefail + +cd "$(dirname "$0")/.." +VERSION="${1:?usage: scripts/release.sh }" +VERSION="${VERSION#v}" +TEAM_ID="${TEAM_ID:-G2537ZRGNU}" +SIGN_IDENTITY="${SIGN_IDENTITY:-Developer ID Application}" +BUILD_NUMBER="${BUILD_NUMBER:-$(git rev-list --count HEAD)}" +DIST="$PWD/dist" +# Build outside the checkout: iCloud-synced folders add extended attributes that break codesign. +WORK="$(mktemp -d "${TMPDIR:-/tmp}/prmonitor-release.XXXXXX")" +trap 'rm -rf "$WORK"' EXIT + +step() { printf '\n\033[1m==> %s\033[0m\n' "$*"; } + +notarize() { + if [[ -n "${NOTARY_PROFILE:-}" ]]; then + xcrun notarytool submit "$1" --keychain-profile "$NOTARY_PROFILE" --wait + elif [[ -n "${ASC_KEY_PATH:-}" ]]; then + xcrun notarytool submit "$1" --key "$ASC_KEY_PATH" --key-id "$ASC_KEY_ID" --issuer "$ASC_ISSUER_ID" --wait + else + echo "error: set NOTARY_PROFILE or ASC_KEY_PATH/ASC_KEY_ID/ASC_ISSUER_ID to notarize" >&2 + exit 1 + fi +} + +step "Archiving PR Monitor $VERSION ($BUILD_NUMBER)" +SIGNING_ARGS=(CODE_SIGN_STYLE=Manual "CODE_SIGN_IDENTITY=$SIGN_IDENTITY") +[[ "$SIGN_IDENTITY" != "-" ]] && SIGNING_ARGS+=("DEVELOPMENT_TEAM=$TEAM_ID" "OTHER_CODE_SIGN_FLAGS=--timestamp") +xcodebuild archive \ + -project PRMonitor.xcodeproj -scheme PRMonitor -configuration Release \ + -archivePath "$WORK/PRMonitor.xcarchive" -derivedDataPath "$WORK/DerivedData" \ + MARKETING_VERSION="$VERSION" CURRENT_PROJECT_VERSION="$BUILD_NUMBER" \ + "${SIGNING_ARGS[@]}" -quiet + +if [[ "$SIGN_IDENTITY" == "-" ]]; then + step "Ad-hoc build: skipping export and notarization" + APP="$WORK/PRMonitor.xcarchive/Products/Applications/PRMonitor.app" +else + step "Exporting with Developer ID" + cp scripts/ExportOptions.plist "$WORK/ExportOptions.plist" + plutil -replace teamID -string "$TEAM_ID" "$WORK/ExportOptions.plist" + xcodebuild -exportArchive -archivePath "$WORK/PRMonitor.xcarchive" \ + -exportOptionsPlist "$WORK/ExportOptions.plist" -exportPath "$WORK/export" -quiet + APP="$WORK/export/PRMonitor.app" + + step "Notarizing the app" + ditto -c -k --keepParent "$APP" "$WORK/notarize.zip" + notarize "$WORK/notarize.zip" + xcrun stapler staple "$APP" +fi +codesign --verify --deep --strict --verbose=1 "$APP" + +step "Building the disk image" +rm -rf "$DIST" && mkdir -p "$DIST" "$WORK/dmg" +ditto "$APP" "$WORK/dmg/PRMonitor.app" +ln -s /Applications "$WORK/dmg/Applications" +hdiutil create -volname "PR Monitor" -srcfolder "$WORK/dmg" -fs APFS -format ULMO -ov "$DIST/PRMonitor.dmg" -quiet + +if [[ "$SIGN_IDENTITY" != "-" ]]; then + codesign --sign "$SIGN_IDENTITY" --timestamp "$DIST/PRMonitor.dmg" + step "Notarizing the disk image" + notarize "$DIST/PRMonitor.dmg" + xcrun stapler staple "$DIST/PRMonitor.dmg" + spctl --assess --type open --context context:primary-signature --verbose "$DIST/PRMonitor.dmg" +fi + +ditto -c -k --keepParent "$APP" "$DIST/PRMonitor.zip" + +step "Done" +( cd "$DIST" && LC_ALL=C shasum -a 256 PRMonitor.dmg PRMonitor.zip | tee SHA256SUMS )