From f86db69196faf6e38bbe2fe14f90c8d51529cd6c Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 12 Jul 2025 07:41:23 +0000 Subject: [PATCH 01/12] Fix security, logic, and resource management bugs across CloudFront, OpenAI, and Polly scripts Co-authored-by: trodrigues --- bug_fixes_summary.md | 98 +++++++++++++++++++++++++++++++++++++ terraform/cloudfront_cdn.tf | 2 +- utils/open_ai.py | 6 +-- utils/polly.py | 6 +-- 4 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 bug_fixes_summary.md diff --git a/bug_fixes_summary.md b/bug_fixes_summary.md new file mode 100644 index 0000000..8cae23b --- /dev/null +++ b/bug_fixes_summary.md @@ -0,0 +1,98 @@ +# Bug Fixes Summary + +## Overview +This document summarizes the 3 critical bugs identified and fixed in the AWSary codebase, including security vulnerabilities, logic errors, and resource management issues. + +## Bug #1: Security Vulnerability in CloudFront Configuration +**Severity:** HIGH +**Type:** Security Vulnerability +**Location:** `terraform/cloudfront_cdn.tf` line 51 + +### Description +The CloudFront distribution was configured to allow both HTTP and HTTPS traffic (`viewer_protocol_policy = "allow-all"`), which exposes user data to potential interception and violates security best practices. + +### Impact +- Sensitive data could be transmitted over unencrypted HTTP connections +- Vulnerability to man-in-the-middle attacks +- Non-compliance with security standards requiring HTTPS + +### Fix Applied +Changed `viewer_protocol_policy` from `"allow-all"` to `"redirect-to-https"` to ensure all HTTP traffic is automatically redirected to HTTPS. + +```diff +- viewer_protocol_policy = "allow-all" ++ viewer_protocol_policy = "redirect-to-https" +``` + +## Bug #2: Logic Error in OpenAI Script +**Severity:** MEDIUM +**Type:** Logic Error +**Location:** `utils/open_ai.py` lines 18-19 + +### Description +The script contained a typo in the key name `shortDesctiption` instead of `shortDescription`, causing the logic to fail when checking if an OpenAI description already exists. + +### Impact +- Script would crash or behave unexpectedly when accessing non-existent key +- Logic condition `if "#" not in item['shortDesctiption']` would always fail +- Potential KeyError exceptions +- Inefficient processing of already-processed items + +### Fix Applied +1. Fixed the typo: `shortDesctiption` → `shortDescription` +2. Added safe key access using `item.get('shortDescription', '')` to prevent KeyError +3. Fixed typo in print statement: `OpenAIn` → `OpenAI` + +```diff +- if "#" not in item['shortDesctiption'] : +- print("Checking OpenAIn for : " + item['name']) +- item['shortDesctiption'] = chat_completion.choices[0].message.content ++ if "#" not in item.get('shortDescription', '') : ++ print("Checking OpenAI for : " + item['name']) ++ item['shortDescription'] = chat_completion.choices[0].message.content +``` + +## Bug #3: Resource Management Bug in Polly Script +**Severity:** MEDIUM +**Type:** Resource Management / Memory Leak +**Location:** `utils/polly.py` line 14 + +### Description +The script opened file handles without using proper context management (`with` statement), which could cause resource leaks or file corruption if exceptions occurred. + +### Impact +- File handles could remain open if exceptions occur +- Potential resource exhaustion on systems with limited file descriptors +- Risk of file corruption or incomplete writes +- Poor adherence to Python best practices + +### Fix Applied +Replaced manual file opening/closing with context manager (`with` statement) to ensure proper resource cleanup. + +```diff +- file = open('speech/' + item['name'].replace(' ','_') + '_Brian_' + 'en-GB' + '.mp3', 'wb') +- file.write(response['AudioStream'].read()) +- file.close() ++ filename = 'speech/' + item['name'].replace(' ','_') + '_Brian_' + 'en-GB' + '.mp3' ++ with open(filename, 'wb') as file: ++ file.write(response['AudioStream'].read()) +``` + +## Additional Observations +During the codebase review, several other potential improvements were identified: + +1. **OpenAI API Version**: The script uses the deprecated `openai.ChatCompletion.create()` API format (pre-v1.0) +2. **API Key Security**: Hardcoded placeholder API key in the code +3. **Error Handling**: Missing try-catch blocks for API calls and file operations +4. **DynamoDB Pagination**: Scripts don't handle pagination for large DynamoDB tables + +## Recommendations +1. Implement comprehensive error handling throughout the Python scripts +2. Update OpenAI API calls to use the current v1.0+ format +3. Move API keys to environment variables or secure configuration +4. Add pagination support for DynamoDB scan operations +5. Implement logging for better debugging and monitoring +6. Add input validation for all user-provided data + +## Conclusion +The three bugs fixed represent significant improvements to the codebase's security, reliability, and maintainability. The CloudFront security fix is particularly critical as it prevents potential data exposure through unencrypted connections. \ No newline at end of file diff --git a/terraform/cloudfront_cdn.tf b/terraform/cloudfront_cdn.tf index 4a83cba..7938dc6 100644 --- a/terraform/cloudfront_cdn.tf +++ b/terraform/cloudfront_cdn.tf @@ -48,7 +48,7 @@ module "cloudfront" { default_cache_behavior = { target_origin_id = "s3_oac" - viewer_protocol_policy = "allow-all" + viewer_protocol_policy = "redirect-to-https" allowed_methods = ["GET", "HEAD", "OPTIONS"] cached_methods = ["GET", "HEAD"] diff --git a/utils/open_ai.py b/utils/open_ai.py index 20a9adc..3461b01 100644 --- a/utils/open_ai.py +++ b/utils/open_ai.py @@ -16,10 +16,10 @@ for item in items: print("Start working on: " + item['name']) - if "#" not in item['shortDesctiption'] : - print("Checking OpenAIn for : " + item['name']) + if "#" not in item.get('shortDescription', '') : + print("Checking OpenAI for : " + item['name']) chat_completion = openai.ChatCompletion.create(model="gpt-4", temperature=1, max_tokens=512,top_p=1,frequency_penalty=0,presence_penalty=0,messages=[{"role": "system", "content": "You are an AWS instructor and want to teach you students about AWS services.You will describe a macro overview about the service you are asked for, and then a little resume about pricing as well as some interesting facts.Use Markdown to make your output more organized, specifically create a title with # for each major topic. Include sections with titles 'Overview', 'Pricing' and 'Interesting Facts'."},{"role": "user", "content": item['name']}]) - item['shortDesctiption'] = chat_completion.choices[0].message.content + item['shortDescription'] = chat_completion.choices[0].message.content table.put_item(Item=item) else: print("Item already had openAI description : " + item['name']) diff --git a/utils/polly.py b/utils/polly.py index 3104a79..6b1a892 100644 --- a/utils/polly.py +++ b/utils/polly.py @@ -12,8 +12,8 @@ service_name = item['longName'] response = polly_client.synthesize_speech(VoiceId='Brian', OutputFormat='mp3', Text=service_name) - file = open('speech/' + item['name'].replace(' ','_') + '_Brian_' + 'en-GB' + '.mp3', 'wb') - file.write(response['AudioStream'].read()) - file.close() + filename = 'speech/' + item['name'].replace(' ','_') + '_Brian_' + 'en-GB' + '.mp3' + with open(filename, 'wb') as file: + file.write(response['AudioStream'].read()) print("Done with: " + item['name']) From 3e1eed65150259718e1d33a191a4339ed842eb7c Mon Sep 17 00:00:00 2001 From: Tiago Rodrigues Date: Tue, 19 Aug 2025 22:06:57 +0100 Subject: [PATCH 02/12] Implement Sentry --- ios/.gitignore | 1 + ios/AWSary/AWSaryApp.swift | 32 ++++++++++++++++- ios/awsary.xcodeproj/project.pbxproj | 54 +++++++++++++++++++++++++--- 3 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 ios/.gitignore diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..7979e00 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1 @@ +.sentryclirc \ No newline at end of file diff --git a/ios/AWSary/AWSaryApp.swift b/ios/AWSary/AWSaryApp.swift index bb298b6..bbf0498 100644 --- a/ios/AWSary/AWSaryApp.swift +++ b/ios/AWSary/AWSaryApp.swift @@ -6,13 +6,43 @@ // import SwiftUI +import Sentry + import SwiftData import RevenueCat @main struct awsaryApp: App { - init() { + SentrySDK.start { options in + options.dsn = "https://477881ef4da534dc2a5d623681bb8ff1@o4509860037001216.ingest.de.sentry.io/4509860041982032" + options.debug = true // Enabled debug when first installing is always helpful + + // Adds IP for users. + // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/ + options.sendDefaultPii = true + + // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring. + // We recommend adjusting this value in production. + options.tracesSampleRate = 1.0 + + // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more. + options.configureProfiling = { + $0.sessionSampleRate = 1.0 // We recommend adjusting this value in production. + $0.lifecycle = .trace + } + + // Uncomment the following lines to add more data to your events + // options.attachScreenshot = true // This adds a screenshot to the error events + // options.attachViewHierarchy = true // This adds the view hierarchy to the error events + + // Enable experimental logging features + options.experimental.enableLogs = true + } + // Remove the next line after confirming that your Sentry integration is working. +// SentrySDK.capture(message: "This app uses Sentry! :)") + + // RevenueCat Purchases.logLevel = .debug Purchases.configure(withAPIKey: Constants.apiKey) diff --git a/ios/awsary.xcodeproj/project.pbxproj b/ios/awsary.xcodeproj/project.pbxproj index 1a6b466..6a3df26 100644 --- a/ios/awsary.xcodeproj/project.pbxproj +++ b/ios/awsary.xcodeproj/project.pbxproj @@ -7,6 +7,9 @@ objects = { /* Begin PBXBuildFile section */ + 341195612E55196E00EEF821 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; + 341195622E55196E00EEF821 /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = 5A6A20744D284CAE9275952C /* Sentry */; }; + 341195632E55196E00EEF821 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; 34571B5E2E05BA83008B8BC2 /* RevenueCat in Frameworks */ = {isa = PBXBuildFile; productRef = 34571B5D2E05BA83008B8BC2 /* RevenueCat */; }; 34571B602E05BA83008B8BC2 /* RevenueCatUI in Frameworks */ = {isa = PBXBuildFile; productRef = 34571B5F2E05BA83008B8BC2 /* RevenueCatUI */; }; 34571B622E062761008B8BC2 /* RevenueCat in Frameworks */ = {isa = PBXBuildFile; productRef = 34571B612E062761008B8BC2 /* RevenueCat */; }; @@ -25,6 +28,7 @@ 34DDF78C2E00BDFD00CDD25C /* SystemSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DDF78B2E00BDFD00CDD25C /* SystemSetting.swift */; }; 34DDF78D2E00BDFD00CDD25C /* SystemSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DDF78B2E00BDFD00CDD25C /* SystemSetting.swift */; }; 34DDF78E2E00BE3D00CDD25C /* SystemSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DDF78B2E00BDFD00CDD25C /* SystemSetting.swift */; }; + CEA15FC538DF40739D0F32EE /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = 5A6A20744D284CAE9275952C /* Sentry */; }; EE00843328820C8C003BA190 /* AWSaryApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE00842328820C8B003BA190 /* AWSaryApp.swift */; }; EE00843428820C8C003BA190 /* AWSaryApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE00842328820C8B003BA190 /* AWSaryApp.swift */; }; EE00843528820C8C003BA190 /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE00842428820C8B003BA190 /* OnboardingView.swift */; }; @@ -168,10 +172,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 341195622E55196E00EEF821 /* Sentry in Frameworks */, 34571B602E05BA83008B8BC2 /* RevenueCatUI in Frameworks */, EE29922F29A3CB4E0071030A /* MarkdownUI in Frameworks */, EEE7348F2889A72000718ACC /* YouTubePlayerKit in Frameworks */, 34571B5E2E05BA83008B8BC2 /* RevenueCat in Frameworks */, + 341195612E55196E00EEF821 /* (null) in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -180,6 +186,7 @@ buildActionMask = 2147483647; files = ( EEB93EC52A7AFCC300373D29 /* StoreKit.framework in Frameworks */, + 341195632E55196E00EEF821 /* (null) in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -191,6 +198,7 @@ EE4D8DB72B9C5E7B00A96E5C /* YouTubePlayerKit in Frameworks */, EE4D8DB92B9C5E7B00A96E5C /* MarkdownUI in Frameworks */, 34571B622E062761008B8BC2 /* RevenueCat in Frameworks */, + CEA15FC538DF40739D0F32EE /* Sentry in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -391,6 +399,7 @@ EE00842728820C8C003BA190 /* Frameworks */, EE00842828820C8C003BA190 /* Resources */, EE4D8DA02B9C5BC800A96E5C /* Embed App Clips */, + 422720F8868246E1A43E2959 /* Upload Debug Symbols to Sentry */, ); buildRules = ( ); @@ -403,6 +412,7 @@ EE29922E29A3CB4E0071030A /* MarkdownUI */, 34571B5D2E05BA83008B8BC2 /* RevenueCat */, 34571B5F2E05BA83008B8BC2 /* RevenueCatUI */, + 5A6A20744D284CAE9275952C /* Sentry */, ); productName = "awsary (iOS)"; productReference = EE00842A28820C8C003BA190 /* AWSary.app */; @@ -482,6 +492,7 @@ EEE7348D2889A72000718ACC /* XCRemoteSwiftPackageReference "YouTubePlayerKit" */, EE29922D29A3CB4E0071030A /* XCRemoteSwiftPackageReference "swift-markdown-ui" */, 34571B5C2E05BA83008B8BC2 /* XCRemoteSwiftPackageReference "purchases-ios-spm" */, + 563142E007D54F51B3CE99D7 /* XCRemoteSwiftPackageReference "sentry-cocoa" */, ); productRefGroup = EE00842B28820C8C003BA190 /* Products */; projectDirPath = ""; @@ -529,6 +540,24 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 422720F8868246E1A43E2959 /* Upload Debug Symbols to Sentry */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", + ); + name = "Upload Debug Symbols to Sentry"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# This script is responsible for uploading debug symbols and source context for Sentry.\nif which sentry-cli >/dev/null; then\n export SENTRY_ORG=tigpt\n export SENTRY_PROJECT=apple-ios\n ERROR=$(sentry-cli debug-files upload --include-sources \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\n if [ ! $? -eq 0 ]; then\n echo \"warning: sentry-cli - $ERROR\"\n fi\nelse\n echo \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ EE00842628820C8C003BA190 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -758,7 +787,9 @@ CODE_SIGN_ENTITLEMENTS = "AWSary/resources/awsary+iOS.entitlements"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = AWSary/resources/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; @@ -773,7 +804,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.11; + MARKETING_VERSION = 1.12; PRODUCT_BUNDLE_IDENTIFIER = pt.tig.awsary; PRODUCT_NAME = AWSary; SDKROOT = iphoneos; @@ -791,7 +822,9 @@ CODE_SIGN_ENTITLEMENTS = "AWSary/resources/awsary+iOS.entitlements"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = AWSary/resources/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; @@ -806,7 +839,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.11; + MARKETING_VERSION = 1.12; PRODUCT_BUNDLE_IDENTIFIER = pt.tig.awsary; PRODUCT_NAME = AWSary; SDKROOT = iphoneos; @@ -905,7 +938,7 @@ "@executable_path/Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.11; + MARKETING_VERSION = 1.12; PRODUCT_BUNDLE_IDENTIFIER = pt.tig.awsary.Clip; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -944,7 +977,7 @@ "@executable_path/Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.11; + MARKETING_VERSION = 1.12; PRODUCT_BUNDLE_IDENTIFIER = pt.tig.awsary.Clip; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1006,6 +1039,14 @@ minimumVersion = 5.29.0; }; }; + 563142E007D54F51B3CE99D7 /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/getsentry/sentry-cocoa/"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 8.0.0; + }; + }; EE29922D29A3CB4E0071030A /* XCRemoteSwiftPackageReference "swift-markdown-ui" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/gonzalezreal/swift-markdown-ui"; @@ -1045,6 +1086,11 @@ package = 34571B5C2E05BA83008B8BC2 /* XCRemoteSwiftPackageReference "purchases-ios-spm" */; productName = RevenueCatUI; }; + 5A6A20744D284CAE9275952C /* Sentry */ = { + isa = XCSwiftPackageProductDependency; + package = 563142E007D54F51B3CE99D7 /* XCRemoteSwiftPackageReference "sentry-cocoa" */; + productName = Sentry; + }; EE29922E29A3CB4E0071030A /* MarkdownUI */ = { isa = XCSwiftPackageProductDependency; package = EE29922D29A3CB4E0071030A /* XCRemoteSwiftPackageReference "swift-markdown-ui" */; From b12a1effd56456feddb72ecc6da1ab8ca9244e75 Mon Sep 17 00:00:00 2001 From: Tiago Rodrigues Date: Tue, 19 Aug 2025 22:07:22 +0100 Subject: [PATCH 03/12] add copy description to Glosary Detail View --- ios/Shared/MainViews/DetailsView.swift | 37 +++++++++++++++++++------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/ios/Shared/MainViews/DetailsView.swift b/ios/Shared/MainViews/DetailsView.swift index dbfb52d..7c5234e 100644 --- a/ios/Shared/MainViews/DetailsView.swift +++ b/ios/Shared/MainViews/DetailsView.swift @@ -38,16 +38,33 @@ struct DetailsView: View { AWSserviceImagePlaceHolderView(service: service, showLabel: awsServiceLogoWithLabel) VStack{ Text(service.longName).font(Font.title) - HStack{ - Image("Arch_Amazon-Polly_64") - .resizable() - .scaledToFit() - .frame(width: 40) - .cornerRadius(8.0) - Text("Pronunciation by Amazon Polly").lineLimit(2).font(.caption2) - }.onTapGesture { - playServiceName(url: "https://cdn.awsary.com/audio/\(service.imageURL.replacingOccurrences(of: "https://static.tig.pt/awsary/logos/Arch_", with: "").replacingOccurrences(of: "_64.svg", with: "").replacingOccurrences(of: "Amazon-", with: "").replacingOccurrences(of: "AWS-", with: ""))-Joanna-en-US.mp3") - } + HStack{ + ZStack{ + RoundedRectangle(cornerRadius: 8) + .foregroundStyle(Color.green) + .frame(width: 40, height: 40) + Image(systemName: "document.on.document") + } + .onTapGesture { + UIPasteboard.general.string = service.shortDesctiption + } + .onDrag({ + let itemProvider = NSItemProvider(object: service.shortDesctiption as NSString) + return itemProvider + }) + + HStack{ + Image("Arch_Amazon-Polly_64") + .resizable() + .scaledToFit() + .frame(width: 40) + .cornerRadius(8.0) + Text("Pronunciation by Polly").lineLimit(2).font(.caption2) + }.onTapGesture { + playServiceName(url: "https://cdn.awsary.com/audio/\(service.imageURL.replacingOccurrences(of: "https://static.tig.pt/awsary/logos/Arch_", with: "").replacingOccurrences(of: "_64.svg", with: "").replacingOccurrences(of: "Amazon-", with: "").replacingOccurrences(of: "AWS-", with: ""))-Joanna-en-US.mp3") + } + } + .padding(.leading, 10) } } Spacer() From 36f94bff507668468ed19164be3d8a9b553af810 Mon Sep 17 00:00:00 2001 From: Tiago Rodrigues Date: Wed, 20 Aug 2025 22:21:19 +0100 Subject: [PATCH 04/12] enable text selection on markdown --- ios/Shared/MainViews/DetailsView.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ios/Shared/MainViews/DetailsView.swift b/ios/Shared/MainViews/DetailsView.swift index 7c5234e..5a8aa49 100644 --- a/ios/Shared/MainViews/DetailsView.swift +++ b/ios/Shared/MainViews/DetailsView.swift @@ -68,7 +68,9 @@ struct DetailsView: View { } } Spacer() - Markdown(service.shortDesctiption).padding() + Markdown(service.shortDesctiption) + .textSelection(.enabled) + .padding() Spacer() HStack{ // VStack(alignment: .leading){ From ba943f4fa1db11469e15519ba690ab5c58959eab Mon Sep 17 00:00:00 2001 From: Tiago Rodrigues Date: Wed, 27 Aug 2025 11:10:39 -0700 Subject: [PATCH 05/12] adapt sentry for dev --- ios/AWSary/AWSaryApp.swift | 7 +++++++ .../xcshareddata/xcschemes/awsary (iOS).xcscheme | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ios/AWSary/AWSaryApp.swift b/ios/AWSary/AWSaryApp.swift index bbf0498..f67bda1 100644 --- a/ios/AWSary/AWSaryApp.swift +++ b/ios/AWSary/AWSaryApp.swift @@ -16,7 +16,14 @@ struct awsaryApp: App { init() { SentrySDK.start { options in options.dsn = "https://477881ef4da534dc2a5d623681bb8ff1@o4509860037001216.ingest.de.sentry.io/4509860041982032" + + // for DEV options.debug = true // Enabled debug when first installing is always helpful + options.environment = "dev" + + // for PROD + //options.debug = false + //options.environment = "production" // Adds IP for users. // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/ diff --git a/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme b/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme index 77b0caa..26e1d42 100644 --- a/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme +++ b/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme @@ -1,6 +1,6 @@ Date: Wed, 14 Jan 2026 18:38:39 +0000 Subject: [PATCH 06/12] Remove Sentry integration --- ios/AWSary/AWSaryApp.swift | 37 ---------------------------- ios/awsary.xcodeproj/project.pbxproj | 37 ---------------------------- 2 files changed, 74 deletions(-) diff --git a/ios/AWSary/AWSaryApp.swift b/ios/AWSary/AWSaryApp.swift index f67bda1..e44ccd7 100644 --- a/ios/AWSary/AWSaryApp.swift +++ b/ios/AWSary/AWSaryApp.swift @@ -6,49 +6,12 @@ // import SwiftUI -import Sentry - import SwiftData import RevenueCat @main struct awsaryApp: App { init() { - SentrySDK.start { options in - options.dsn = "https://477881ef4da534dc2a5d623681bb8ff1@o4509860037001216.ingest.de.sentry.io/4509860041982032" - - // for DEV - options.debug = true // Enabled debug when first installing is always helpful - options.environment = "dev" - - // for PROD - //options.debug = false - //options.environment = "production" - - // Adds IP for users. - // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/ - options.sendDefaultPii = true - - // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring. - // We recommend adjusting this value in production. - options.tracesSampleRate = 1.0 - - // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more. - options.configureProfiling = { - $0.sessionSampleRate = 1.0 // We recommend adjusting this value in production. - $0.lifecycle = .trace - } - - // Uncomment the following lines to add more data to your events - // options.attachScreenshot = true // This adds a screenshot to the error events - // options.attachViewHierarchy = true // This adds the view hierarchy to the error events - - // Enable experimental logging features - options.experimental.enableLogs = true - } - // Remove the next line after confirming that your Sentry integration is working. -// SentrySDK.capture(message: "This app uses Sentry! :)") - // RevenueCat Purchases.logLevel = .debug Purchases.configure(withAPIKey: Constants.apiKey) diff --git a/ios/awsary.xcodeproj/project.pbxproj b/ios/awsary.xcodeproj/project.pbxproj index 6a3df26..f76f02c 100644 --- a/ios/awsary.xcodeproj/project.pbxproj +++ b/ios/awsary.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 341195612E55196E00EEF821 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; - 341195622E55196E00EEF821 /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = 5A6A20744D284CAE9275952C /* Sentry */; }; 341195632E55196E00EEF821 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; 34571B5E2E05BA83008B8BC2 /* RevenueCat in Frameworks */ = {isa = PBXBuildFile; productRef = 34571B5D2E05BA83008B8BC2 /* RevenueCat */; }; 34571B602E05BA83008B8BC2 /* RevenueCatUI in Frameworks */ = {isa = PBXBuildFile; productRef = 34571B5F2E05BA83008B8BC2 /* RevenueCatUI */; }; @@ -28,7 +27,6 @@ 34DDF78C2E00BDFD00CDD25C /* SystemSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DDF78B2E00BDFD00CDD25C /* SystemSetting.swift */; }; 34DDF78D2E00BDFD00CDD25C /* SystemSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DDF78B2E00BDFD00CDD25C /* SystemSetting.swift */; }; 34DDF78E2E00BE3D00CDD25C /* SystemSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DDF78B2E00BDFD00CDD25C /* SystemSetting.swift */; }; - CEA15FC538DF40739D0F32EE /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = 5A6A20744D284CAE9275952C /* Sentry */; }; EE00843328820C8C003BA190 /* AWSaryApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE00842328820C8B003BA190 /* AWSaryApp.swift */; }; EE00843428820C8C003BA190 /* AWSaryApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE00842328820C8B003BA190 /* AWSaryApp.swift */; }; EE00843528820C8C003BA190 /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE00842428820C8B003BA190 /* OnboardingView.swift */; }; @@ -172,7 +170,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 341195622E55196E00EEF821 /* Sentry in Frameworks */, 34571B602E05BA83008B8BC2 /* RevenueCatUI in Frameworks */, EE29922F29A3CB4E0071030A /* MarkdownUI in Frameworks */, EEE7348F2889A72000718ACC /* YouTubePlayerKit in Frameworks */, @@ -198,7 +195,6 @@ EE4D8DB72B9C5E7B00A96E5C /* YouTubePlayerKit in Frameworks */, EE4D8DB92B9C5E7B00A96E5C /* MarkdownUI in Frameworks */, 34571B622E062761008B8BC2 /* RevenueCat in Frameworks */, - CEA15FC538DF40739D0F32EE /* Sentry in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -399,7 +395,6 @@ EE00842728820C8C003BA190 /* Frameworks */, EE00842828820C8C003BA190 /* Resources */, EE4D8DA02B9C5BC800A96E5C /* Embed App Clips */, - 422720F8868246E1A43E2959 /* Upload Debug Symbols to Sentry */, ); buildRules = ( ); @@ -412,7 +407,6 @@ EE29922E29A3CB4E0071030A /* MarkdownUI */, 34571B5D2E05BA83008B8BC2 /* RevenueCat */, 34571B5F2E05BA83008B8BC2 /* RevenueCatUI */, - 5A6A20744D284CAE9275952C /* Sentry */, ); productName = "awsary (iOS)"; productReference = EE00842A28820C8C003BA190 /* AWSary.app */; @@ -492,7 +486,6 @@ EEE7348D2889A72000718ACC /* XCRemoteSwiftPackageReference "YouTubePlayerKit" */, EE29922D29A3CB4E0071030A /* XCRemoteSwiftPackageReference "swift-markdown-ui" */, 34571B5C2E05BA83008B8BC2 /* XCRemoteSwiftPackageReference "purchases-ios-spm" */, - 563142E007D54F51B3CE99D7 /* XCRemoteSwiftPackageReference "sentry-cocoa" */, ); productRefGroup = EE00842B28820C8C003BA190 /* Products */; projectDirPath = ""; @@ -540,23 +533,6 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - 422720F8868246E1A43E2959 /* Upload Debug Symbols to Sentry */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", - ); - name = "Upload Debug Symbols to Sentry"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# This script is responsible for uploading debug symbols and source context for Sentry.\nif which sentry-cli >/dev/null; then\n export SENTRY_ORG=tigpt\n export SENTRY_PROJECT=apple-ios\n ERROR=$(sentry-cli debug-files upload --include-sources \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\n if [ ! $? -eq 0 ]; then\n echo \"warning: sentry-cli - $ERROR\"\n fi\nelse\n echo \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ EE00842628820C8C003BA190 /* Sources */ = { @@ -1039,14 +1015,6 @@ minimumVersion = 5.29.0; }; }; - 563142E007D54F51B3CE99D7 /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/getsentry/sentry-cocoa/"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 8.0.0; - }; - }; EE29922D29A3CB4E0071030A /* XCRemoteSwiftPackageReference "swift-markdown-ui" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/gonzalezreal/swift-markdown-ui"; @@ -1086,11 +1054,6 @@ package = 34571B5C2E05BA83008B8BC2 /* XCRemoteSwiftPackageReference "purchases-ios-spm" */; productName = RevenueCatUI; }; - 5A6A20744D284CAE9275952C /* Sentry */ = { - isa = XCSwiftPackageProductDependency; - package = 563142E007D54F51B3CE99D7 /* XCRemoteSwiftPackageReference "sentry-cocoa" */; - productName = Sentry; - }; EE29922E29A3CB4E0071030A /* MarkdownUI */ = { isa = XCSwiftPackageProductDependency; package = EE29922D29A3CB4E0071030A /* XCRemoteSwiftPackageReference "swift-markdown-ui" */; From 88120065fe020067d865fe86696a387917f42957 Mon Sep 17 00:00:00 2001 From: Tiago Rodrigues Date: Wed, 14 Jan 2026 19:08:08 +0000 Subject: [PATCH 07/12] Add repository agent guidance --- AGENTS.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..ece5587 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,34 @@ +# AGENTS + +## Scope +This guidance applies to the entire repository unless a nested `AGENTS.md` overrides it. + +## Project overview +This repository contains multiple components (e.g., iOS app, website, Terraform, utilities). Verify which directory you are working in before making changes. + +## General workflow +- Favor small, targeted changes that align with existing patterns. +- Run relevant tests or linters for the area you changed when feasible. +- Document any skipped tests and the reason. + +## Coding conventions +- Prefer clear, descriptive names consistent with surrounding code. +- Keep formatting consistent with existing files in each subproject. +- Avoid introducing new dependencies without justification. + +## iOS (Swift/Xcode) +- Follow existing Swift style and naming conventions. +- Use `@MainActor` or concurrency annotations consistently with neighboring code. +- Avoid force-unwrapping unless the codebase already uses it and it is safe. + +## Web (website) +- Follow existing linting/formatting rules. +- Keep accessibility in mind (labels, semantics, contrast). + +## Infrastructure (terraform) +- Use existing module patterns and naming conventions. +- Keep variables and outputs documented. + +## PR/commit notes +- Summarize user-visible changes. +- Call out any migrations, configuration changes, or manual steps. From 5ce8b8e8058f5d74bf009038c45e0d4efd5df3ca Mon Sep 17 00:00:00 2001 From: Tiago Rodrigues Date: Wed, 14 Jan 2026 19:13:50 +0000 Subject: [PATCH 08/12] Document third-party SDK guidance --- AGENTS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AGENTS.md b/AGENTS.md index ece5587..d612e6a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,6 +15,7 @@ This repository contains multiple components (e.g., iOS app, website, Terraform, - Prefer clear, descriptive names consistent with surrounding code. - Keep formatting consistent with existing files in each subproject. - Avoid introducing new dependencies without justification. +- Prefer native Swift and SwiftUI with Apple public APIs. Only suggest third-party code when necessary or with significant advantages, and ask a human before adding any external SDK or codebase. ## iOS (Swift/Xcode) - Follow existing Swift style and naming conventions. From 1cba0f5a08b1baa90bc2903aedf9867741ba2dcc Mon Sep 17 00:00:00 2001 From: Tiago Rodrigues Date: Wed, 14 Jan 2026 19:27:53 +0000 Subject: [PATCH 09/12] Add iOS CI build and test workflow --- .github/workflows/ios-ci.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/ios-ci.yml diff --git a/.github/workflows/ios-ci.yml b/.github/workflows/ios-ci.yml new file mode 100644 index 0000000..e807196 --- /dev/null +++ b/.github/workflows/ios-ci.yml @@ -0,0 +1,30 @@ +name: iOS CI + +on: + pull_request: + push: + branches: + - main + workflow_dispatch: + +jobs: + build-and-test: + name: Build and Test (iOS) + runs-on: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Xcode + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: latest-stable + + - name: Build and test + run: | + xcodebuild \ + -project ios/awsary.xcodeproj \ + -scheme "awsary (iOS)" \ + -destination "platform=iOS Simulator,name=iPhone 14" \ + clean test From 74249c76bcd60d5341c6e65f7f571fb8f4756780 Mon Sep 17 00:00:00 2001 From: Tiago Rodrigues Date: Wed, 14 Jan 2026 21:50:44 +0000 Subject: [PATCH 10/12] Add iOS unit test target --- ios/AWSaryTests/AWSaryTests.swift | 7 + ios/awsary.xcodeproj/project.pbxproj | 126 ++++++++++++++++++ .../xcschemes/awsary (iOS).xcscheme | 35 +++++ 3 files changed, 168 insertions(+) create mode 100644 ios/AWSaryTests/AWSaryTests.swift diff --git a/ios/AWSaryTests/AWSaryTests.swift b/ios/AWSaryTests/AWSaryTests.swift new file mode 100644 index 0000000..cb78b1f --- /dev/null +++ b/ios/AWSaryTests/AWSaryTests.swift @@ -0,0 +1,7 @@ +import XCTest + +final class AWSaryTests: XCTestCase { + func testExample() { + XCTAssertTrue(true) + } +} diff --git a/ios/awsary.xcodeproj/project.pbxproj b/ios/awsary.xcodeproj/project.pbxproj index f76f02c..10099c7 100644 --- a/ios/awsary.xcodeproj/project.pbxproj +++ b/ios/awsary.xcodeproj/project.pbxproj @@ -95,6 +95,8 @@ EEE7348F2889A72000718ACC /* YouTubePlayerKit in Frameworks */ = {isa = PBXBuildFile; productRef = EEE7348E2889A72000718ACC /* YouTubePlayerKit */; }; EEE8414228820E3B0062238E /* awsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEE8414128820E3B0062238E /* awsService.swift */; }; EEE8414328820E3B0062238E /* awsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEE8414128820E3B0062238E /* awsService.swift */; }; + EEA1A1002E5F000100AAA001 /* AWSaryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEA1A1032E5F000100AAA001 /* AWSaryTests.swift */; }; + EEA1A1012E5F000100AAA001 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EEA1A1052E5F000100AAA001 /* XCTest.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -105,6 +107,13 @@ remoteGlobalIDString = EE4D8D8F2B9C5BC600A96E5C; remoteInfo = AWSaryAppClip; }; + EEA1A1022E5F000100AAA001 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EE00841E28820C8B003BA190 /* Project object */; + proxyType = 1; + remoteGlobalIDString = EE00842928820C8C003BA190; + remoteInfo = "awsary (iOS)"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -163,6 +172,9 @@ EECFBC8F28883E6A00FFDB49 /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; }; EEE0804F2885A4C000F8F7A4 /* DetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsView.swift; sourceTree = ""; }; EEE8414128820E3B0062238E /* awsService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = awsService.swift; sourceTree = ""; }; + EEA1A1032E5F000100AAA001 /* AWSaryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSaryTests.swift; sourceTree = ""; }; + EEA1A1042E5F000100AAA001 /* AWSaryTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AWSaryTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + EEA1A1052E5F000100AAA001 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = System/Library/Frameworks/XCTest.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -198,6 +210,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + EEA1A1062E5F000100AAA001 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EEA1A1012E5F000100AAA001 /* XCTest.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -205,6 +225,7 @@ isa = PBXGroup; children = ( EE6ABDC12C5B9A7C0025B74B /* AWSary */, + EEA1A1072E5F000100AAA001 /* AWSaryTests */, EE00842228820C8B003BA190 /* Shared */, EE4D8D912B9C5BC600A96E5C /* AWSaryAppClip */, EE00842B28820C8C003BA190 /* Products */, @@ -231,10 +252,19 @@ EE00842A28820C8C003BA190 /* AWSary.app */, EE00843028820C8C003BA190 /* awsary.app */, EE4D8D902B9C5BC600A96E5C /* AWSaryAppClip.app */, + EEA1A1042E5F000100AAA001 /* AWSaryTests.xctest */, ); name = Products; sourceTree = ""; }; + EEA1A1072E5F000100AAA001 /* AWSaryTests */ = { + isa = PBXGroup; + children = ( + EEA1A1032E5F000100AAA001 /* AWSaryTests.swift */, + ); + path = AWSaryTests; + sourceTree = ""; + }; EE00CBBE29630BB300FE3DCB /* MainViews */ = { isa = PBXGroup; children = ( @@ -380,6 +410,7 @@ isa = PBXGroup; children = ( EEB93EC42A7AFCC300373D29 /* StoreKit.framework */, + EEA1A1052E5F000100AAA001 /* XCTest.framework */, ); name = Frameworks; sourceTree = ""; @@ -412,6 +443,24 @@ productReference = EE00842A28820C8C003BA190 /* AWSary.app */; productType = "com.apple.product-type.application"; }; + EEA1A1082E5F000100AAA001 /* AWSaryTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = EEA1A10E2E5F000100AAA001 /* Build configuration list for PBXNativeTarget "AWSaryTests" */; + buildPhases = ( + EEA1A10A2E5F000100AAA001 /* Sources */, + EEA1A1062E5F000100AAA001 /* Frameworks */, + EEA1A1092E5F000100AAA001 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + EEA1A10B2E5F000100AAA001 /* PBXTargetDependency */, + ); + name = AWSaryTests; + productName = AWSaryTests; + productReference = EEA1A1042E5F000100AAA001 /* AWSaryTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; EE00842F28820C8C003BA190 /* awsary (macOS) */ = { isa = PBXNativeTarget; buildConfigurationList = EE00843E28820C8C003BA190 /* Build configuration list for PBXNativeTarget "awsary (macOS)" */; @@ -465,6 +514,9 @@ EE00842928820C8C003BA190 = { CreatedOnToolsVersion = 13.4.1; }; + EEA1A1082E5F000100AAA001 = { + CreatedOnToolsVersion = 16.4; + }; EE00842F28820C8C003BA190 = { CreatedOnToolsVersion = 13.4.1; }; @@ -492,6 +544,7 @@ projectRoot = ""; targets = ( EE00842928820C8C003BA190 /* awsary (iOS) */, + EEA1A1082E5F000100AAA001 /* AWSaryTests */, EE00842F28820C8C003BA190 /* awsary (macOS) */, EE4D8D8F2B9C5BC600A96E5C /* AWSaryAppClip */, ); @@ -531,6 +584,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + EEA1A1092E5F000100AAA001 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ @@ -565,6 +625,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + EEA1A10A2E5F000100AAA001 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EEA1A1002E5F000100AAA001 /* AWSaryTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EE00842C28820C8C003BA190 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -629,6 +697,11 @@ target = EE4D8D8F2B9C5BC600A96E5C /* AWSaryAppClip */; targetProxy = EE4D8D9D2B9C5BC800A96E5C /* PBXContainerItemProxy */; }; + EEA1A10B2E5F000100AAA001 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = EE00842928820C8C003BA190 /* awsary (iOS) */; + targetProxy = EEA1A1022E5F000100AAA001 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -826,6 +899,50 @@ }; name = Release; }; + EEA1A10C2E5F000100AAA001 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = AWSaryTests; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = pt.tig.awsary.tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AWSary.app/AWSary"; + }; + name = Debug; + }; + EEA1A10D2E5F000100AAA001 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = AWSaryTests; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = pt.tig.awsary.tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AWSary.app/AWSary"; + }; + name = Release; + }; EE00843F28820C8C003BA190 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -986,6 +1103,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + EEA1A10E2E5F000100AAA001 /* Build configuration list for PBXNativeTarget "AWSaryTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EEA1A10C2E5F000100AAA001 /* Debug */, + EEA1A10D2E5F000100AAA001 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; EE00843E28820C8C003BA190 /* Build configuration list for PBXNativeTarget "awsary (macOS)" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme b/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme index 26e1d42..7c7734c 100644 --- a/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme +++ b/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme @@ -20,6 +20,20 @@ ReferencedContainer = "container:awsary.xcodeproj"> + + + + + + + + + + + + + + Date: Thu, 15 Jan 2026 22:00:07 +0000 Subject: [PATCH 11/12] Revert "Merge pull request #165 from AWSary/codex/fix-ci-error-for-awsary-scheme" This reverts commit 92c419e7c0c56ed3ec084e0913fff79ad9ff728c, reversing changes made to 07fa160e02e59d9be0e06c812e94706c71e1d2ee. --- ios/AWSaryTests/AWSaryTests.swift | 7 - ios/awsary.xcodeproj/project.pbxproj | 126 ------------------ .../xcschemes/awsary (iOS).xcscheme | 35 ----- 3 files changed, 168 deletions(-) delete mode 100644 ios/AWSaryTests/AWSaryTests.swift diff --git a/ios/AWSaryTests/AWSaryTests.swift b/ios/AWSaryTests/AWSaryTests.swift deleted file mode 100644 index cb78b1f..0000000 --- a/ios/AWSaryTests/AWSaryTests.swift +++ /dev/null @@ -1,7 +0,0 @@ -import XCTest - -final class AWSaryTests: XCTestCase { - func testExample() { - XCTAssertTrue(true) - } -} diff --git a/ios/awsary.xcodeproj/project.pbxproj b/ios/awsary.xcodeproj/project.pbxproj index 10099c7..f76f02c 100644 --- a/ios/awsary.xcodeproj/project.pbxproj +++ b/ios/awsary.xcodeproj/project.pbxproj @@ -95,8 +95,6 @@ EEE7348F2889A72000718ACC /* YouTubePlayerKit in Frameworks */ = {isa = PBXBuildFile; productRef = EEE7348E2889A72000718ACC /* YouTubePlayerKit */; }; EEE8414228820E3B0062238E /* awsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEE8414128820E3B0062238E /* awsService.swift */; }; EEE8414328820E3B0062238E /* awsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEE8414128820E3B0062238E /* awsService.swift */; }; - EEA1A1002E5F000100AAA001 /* AWSaryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEA1A1032E5F000100AAA001 /* AWSaryTests.swift */; }; - EEA1A1012E5F000100AAA001 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EEA1A1052E5F000100AAA001 /* XCTest.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -107,13 +105,6 @@ remoteGlobalIDString = EE4D8D8F2B9C5BC600A96E5C; remoteInfo = AWSaryAppClip; }; - EEA1A1022E5F000100AAA001 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = EE00841E28820C8B003BA190 /* Project object */; - proxyType = 1; - remoteGlobalIDString = EE00842928820C8C003BA190; - remoteInfo = "awsary (iOS)"; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -172,9 +163,6 @@ EECFBC8F28883E6A00FFDB49 /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; }; EEE0804F2885A4C000F8F7A4 /* DetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsView.swift; sourceTree = ""; }; EEE8414128820E3B0062238E /* awsService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = awsService.swift; sourceTree = ""; }; - EEA1A1032E5F000100AAA001 /* AWSaryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSaryTests.swift; sourceTree = ""; }; - EEA1A1042E5F000100AAA001 /* AWSaryTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AWSaryTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - EEA1A1052E5F000100AAA001 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = System/Library/Frameworks/XCTest.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -210,14 +198,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EEA1A1062E5F000100AAA001 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - EEA1A1012E5F000100AAA001 /* XCTest.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -225,7 +205,6 @@ isa = PBXGroup; children = ( EE6ABDC12C5B9A7C0025B74B /* AWSary */, - EEA1A1072E5F000100AAA001 /* AWSaryTests */, EE00842228820C8B003BA190 /* Shared */, EE4D8D912B9C5BC600A96E5C /* AWSaryAppClip */, EE00842B28820C8C003BA190 /* Products */, @@ -252,19 +231,10 @@ EE00842A28820C8C003BA190 /* AWSary.app */, EE00843028820C8C003BA190 /* awsary.app */, EE4D8D902B9C5BC600A96E5C /* AWSaryAppClip.app */, - EEA1A1042E5F000100AAA001 /* AWSaryTests.xctest */, ); name = Products; sourceTree = ""; }; - EEA1A1072E5F000100AAA001 /* AWSaryTests */ = { - isa = PBXGroup; - children = ( - EEA1A1032E5F000100AAA001 /* AWSaryTests.swift */, - ); - path = AWSaryTests; - sourceTree = ""; - }; EE00CBBE29630BB300FE3DCB /* MainViews */ = { isa = PBXGroup; children = ( @@ -410,7 +380,6 @@ isa = PBXGroup; children = ( EEB93EC42A7AFCC300373D29 /* StoreKit.framework */, - EEA1A1052E5F000100AAA001 /* XCTest.framework */, ); name = Frameworks; sourceTree = ""; @@ -443,24 +412,6 @@ productReference = EE00842A28820C8C003BA190 /* AWSary.app */; productType = "com.apple.product-type.application"; }; - EEA1A1082E5F000100AAA001 /* AWSaryTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = EEA1A10E2E5F000100AAA001 /* Build configuration list for PBXNativeTarget "AWSaryTests" */; - buildPhases = ( - EEA1A10A2E5F000100AAA001 /* Sources */, - EEA1A1062E5F000100AAA001 /* Frameworks */, - EEA1A1092E5F000100AAA001 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - EEA1A10B2E5F000100AAA001 /* PBXTargetDependency */, - ); - name = AWSaryTests; - productName = AWSaryTests; - productReference = EEA1A1042E5F000100AAA001 /* AWSaryTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; EE00842F28820C8C003BA190 /* awsary (macOS) */ = { isa = PBXNativeTarget; buildConfigurationList = EE00843E28820C8C003BA190 /* Build configuration list for PBXNativeTarget "awsary (macOS)" */; @@ -514,9 +465,6 @@ EE00842928820C8C003BA190 = { CreatedOnToolsVersion = 13.4.1; }; - EEA1A1082E5F000100AAA001 = { - CreatedOnToolsVersion = 16.4; - }; EE00842F28820C8C003BA190 = { CreatedOnToolsVersion = 13.4.1; }; @@ -544,7 +492,6 @@ projectRoot = ""; targets = ( EE00842928820C8C003BA190 /* awsary (iOS) */, - EEA1A1082E5F000100AAA001 /* AWSaryTests */, EE00842F28820C8C003BA190 /* awsary (macOS) */, EE4D8D8F2B9C5BC600A96E5C /* AWSaryAppClip */, ); @@ -584,13 +531,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EEA1A1092E5F000100AAA001 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ @@ -625,14 +565,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EEA1A10A2E5F000100AAA001 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EEA1A1002E5F000100AAA001 /* AWSaryTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; EE00842C28820C8C003BA190 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -697,11 +629,6 @@ target = EE4D8D8F2B9C5BC600A96E5C /* AWSaryAppClip */; targetProxy = EE4D8D9D2B9C5BC800A96E5C /* PBXContainerItemProxy */; }; - EEA1A10B2E5F000100AAA001 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = EE00842928820C8C003BA190 /* awsary (iOS) */; - targetProxy = EEA1A1022E5F000100AAA001 /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -899,50 +826,6 @@ }; name = Release; }; - EEA1A10C2E5F000100AAA001 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = AWSaryTests; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = pt.tig.awsary.tests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AWSary.app/AWSary"; - }; - name = Debug; - }; - EEA1A10D2E5F000100AAA001 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = AWSaryTests; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = pt.tig.awsary.tests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AWSary.app/AWSary"; - }; - name = Release; - }; EE00843F28820C8C003BA190 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1103,15 +986,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - EEA1A10E2E5F000100AAA001 /* Build configuration list for PBXNativeTarget "AWSaryTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EEA1A10C2E5F000100AAA001 /* Debug */, - EEA1A10D2E5F000100AAA001 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; EE00843E28820C8C003BA190 /* Build configuration list for PBXNativeTarget "awsary (macOS)" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme b/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme index 7c7734c..26e1d42 100644 --- a/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme +++ b/ios/awsary.xcodeproj/xcshareddata/xcschemes/awsary (iOS).xcscheme @@ -20,20 +20,6 @@ ReferencedContainer = "container:awsary.xcodeproj"> - - - - - - - - - - - - - - Date: Thu, 15 Jan 2026 22:00:37 +0000 Subject: [PATCH 12/12] Revert "Merge pull request #161 from AWSary/codex/remove-sentry-from-awsary-codebase" This reverts commit 50bb94a0a218c16dc2c0226930d0b889efcf07f4, reversing changes made to ba943f4fa1db11469e15519ba690ab5c58959eab. --- ios/AWSary/AWSaryApp.swift | 37 ++++++++++++++++++++++++++++ ios/awsary.xcodeproj/project.pbxproj | 37 ++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/ios/AWSary/AWSaryApp.swift b/ios/AWSary/AWSaryApp.swift index e44ccd7..f67bda1 100644 --- a/ios/AWSary/AWSaryApp.swift +++ b/ios/AWSary/AWSaryApp.swift @@ -6,12 +6,49 @@ // import SwiftUI +import Sentry + import SwiftData import RevenueCat @main struct awsaryApp: App { init() { + SentrySDK.start { options in + options.dsn = "https://477881ef4da534dc2a5d623681bb8ff1@o4509860037001216.ingest.de.sentry.io/4509860041982032" + + // for DEV + options.debug = true // Enabled debug when first installing is always helpful + options.environment = "dev" + + // for PROD + //options.debug = false + //options.environment = "production" + + // Adds IP for users. + // For more information, visit: https://docs.sentry.io/platforms/apple/data-management/data-collected/ + options.sendDefaultPii = true + + // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring. + // We recommend adjusting this value in production. + options.tracesSampleRate = 1.0 + + // Configure profiling. Visit https://docs.sentry.io/platforms/apple/profiling/ to learn more. + options.configureProfiling = { + $0.sessionSampleRate = 1.0 // We recommend adjusting this value in production. + $0.lifecycle = .trace + } + + // Uncomment the following lines to add more data to your events + // options.attachScreenshot = true // This adds a screenshot to the error events + // options.attachViewHierarchy = true // This adds the view hierarchy to the error events + + // Enable experimental logging features + options.experimental.enableLogs = true + } + // Remove the next line after confirming that your Sentry integration is working. +// SentrySDK.capture(message: "This app uses Sentry! :)") + // RevenueCat Purchases.logLevel = .debug Purchases.configure(withAPIKey: Constants.apiKey) diff --git a/ios/awsary.xcodeproj/project.pbxproj b/ios/awsary.xcodeproj/project.pbxproj index f76f02c..6a3df26 100644 --- a/ios/awsary.xcodeproj/project.pbxproj +++ b/ios/awsary.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 341195612E55196E00EEF821 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; + 341195622E55196E00EEF821 /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = 5A6A20744D284CAE9275952C /* Sentry */; }; 341195632E55196E00EEF821 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; 34571B5E2E05BA83008B8BC2 /* RevenueCat in Frameworks */ = {isa = PBXBuildFile; productRef = 34571B5D2E05BA83008B8BC2 /* RevenueCat */; }; 34571B602E05BA83008B8BC2 /* RevenueCatUI in Frameworks */ = {isa = PBXBuildFile; productRef = 34571B5F2E05BA83008B8BC2 /* RevenueCatUI */; }; @@ -27,6 +28,7 @@ 34DDF78C2E00BDFD00CDD25C /* SystemSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DDF78B2E00BDFD00CDD25C /* SystemSetting.swift */; }; 34DDF78D2E00BDFD00CDD25C /* SystemSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DDF78B2E00BDFD00CDD25C /* SystemSetting.swift */; }; 34DDF78E2E00BE3D00CDD25C /* SystemSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34DDF78B2E00BDFD00CDD25C /* SystemSetting.swift */; }; + CEA15FC538DF40739D0F32EE /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = 5A6A20744D284CAE9275952C /* Sentry */; }; EE00843328820C8C003BA190 /* AWSaryApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE00842328820C8B003BA190 /* AWSaryApp.swift */; }; EE00843428820C8C003BA190 /* AWSaryApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE00842328820C8B003BA190 /* AWSaryApp.swift */; }; EE00843528820C8C003BA190 /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE00842428820C8B003BA190 /* OnboardingView.swift */; }; @@ -170,6 +172,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 341195622E55196E00EEF821 /* Sentry in Frameworks */, 34571B602E05BA83008B8BC2 /* RevenueCatUI in Frameworks */, EE29922F29A3CB4E0071030A /* MarkdownUI in Frameworks */, EEE7348F2889A72000718ACC /* YouTubePlayerKit in Frameworks */, @@ -195,6 +198,7 @@ EE4D8DB72B9C5E7B00A96E5C /* YouTubePlayerKit in Frameworks */, EE4D8DB92B9C5E7B00A96E5C /* MarkdownUI in Frameworks */, 34571B622E062761008B8BC2 /* RevenueCat in Frameworks */, + CEA15FC538DF40739D0F32EE /* Sentry in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -395,6 +399,7 @@ EE00842728820C8C003BA190 /* Frameworks */, EE00842828820C8C003BA190 /* Resources */, EE4D8DA02B9C5BC800A96E5C /* Embed App Clips */, + 422720F8868246E1A43E2959 /* Upload Debug Symbols to Sentry */, ); buildRules = ( ); @@ -407,6 +412,7 @@ EE29922E29A3CB4E0071030A /* MarkdownUI */, 34571B5D2E05BA83008B8BC2 /* RevenueCat */, 34571B5F2E05BA83008B8BC2 /* RevenueCatUI */, + 5A6A20744D284CAE9275952C /* Sentry */, ); productName = "awsary (iOS)"; productReference = EE00842A28820C8C003BA190 /* AWSary.app */; @@ -486,6 +492,7 @@ EEE7348D2889A72000718ACC /* XCRemoteSwiftPackageReference "YouTubePlayerKit" */, EE29922D29A3CB4E0071030A /* XCRemoteSwiftPackageReference "swift-markdown-ui" */, 34571B5C2E05BA83008B8BC2 /* XCRemoteSwiftPackageReference "purchases-ios-spm" */, + 563142E007D54F51B3CE99D7 /* XCRemoteSwiftPackageReference "sentry-cocoa" */, ); productRefGroup = EE00842B28820C8C003BA190 /* Products */; projectDirPath = ""; @@ -533,6 +540,23 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 422720F8868246E1A43E2959 /* Upload Debug Symbols to Sentry */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", + ); + name = "Upload Debug Symbols to Sentry"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# This script is responsible for uploading debug symbols and source context for Sentry.\nif which sentry-cli >/dev/null; then\n export SENTRY_ORG=tigpt\n export SENTRY_PROJECT=apple-ios\n ERROR=$(sentry-cli debug-files upload --include-sources \"$DWARF_DSYM_FOLDER_PATH\" 2>&1 >/dev/null)\n if [ ! $? -eq 0 ]; then\n echo \"warning: sentry-cli - $ERROR\"\n fi\nelse\n echo \"warning: sentry-cli not installed, download from https://github.com/getsentry/sentry-cli/releases\"\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ EE00842628820C8C003BA190 /* Sources */ = { @@ -1015,6 +1039,14 @@ minimumVersion = 5.29.0; }; }; + 563142E007D54F51B3CE99D7 /* XCRemoteSwiftPackageReference "sentry-cocoa" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/getsentry/sentry-cocoa/"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 8.0.0; + }; + }; EE29922D29A3CB4E0071030A /* XCRemoteSwiftPackageReference "swift-markdown-ui" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/gonzalezreal/swift-markdown-ui"; @@ -1054,6 +1086,11 @@ package = 34571B5C2E05BA83008B8BC2 /* XCRemoteSwiftPackageReference "purchases-ios-spm" */; productName = RevenueCatUI; }; + 5A6A20744D284CAE9275952C /* Sentry */ = { + isa = XCSwiftPackageProductDependency; + package = 563142E007D54F51B3CE99D7 /* XCRemoteSwiftPackageReference "sentry-cocoa" */; + productName = Sentry; + }; EE29922E29A3CB4E0071030A /* MarkdownUI */ = { isa = XCSwiftPackageProductDependency; package = EE29922D29A3CB4E0071030A /* XCRemoteSwiftPackageReference "swift-markdown-ui" */;