AGENTS.md update 2026 June#7133
Draft
cursor[bot] wants to merge 1 commit into
Draft
Conversation
- Add no_hardcoded_logger_strings SwiftLint rule to enforce *Strings.swift pattern - Baseline 37 pre-existing Logger string literal violations - Add 6 AGENTS.md guardrails: access control, default params, unused code, redundant Codable, duplicate constants, log string centralization Co-authored-by: Cesar de la Vega <vegaro@users.noreply.github.com>
facumenzella
reviewed
Jul 3, 2026
| - **Never commit API keys or secrets** — do not stage or commit API keys, tokens, credentials, or any sensitive data | ||
| - **Prefer the tightest access control** — default to `private`; only widen to `internal`/`public`/`@_spi` when callers outside the current scope actually need it. Every reviewer-requested visibility reduction is a missed opportunity to get it right the first time. | ||
| - **Avoid default parameter values on internal initializers** — they let callers silently omit arguments. Make every parameter explicit so the compiler catches missing values, especially when new parameters are added later. | ||
| - **Don't add code that nothing in the PR uses** — unused types, methods, or properties that "will be needed later" should be introduced in the PR that actually uses them. This keeps PRs reviewable and avoids dead code. |
Member
There was a problem hiding this comment.
This one might contradict PRs with 300 lines or less. I would remove it
facumenzella
reviewed
Jul 3, 2026
| - **Avoid default parameter values on internal initializers** — they let callers silently omit arguments. Make every parameter explicit so the compiler catches missing values, especially when new parameters are added later. | ||
| - **Don't add code that nothing in the PR uses** — unused types, methods, or properties that "will be needed later" should be introduced in the PR that actually uses them. This keeps PRs reviewable and avoids dead code. | ||
| - **Don't write redundant `Codable` implementations** — if the synthesized `init(from:)` or `encode(to:)` does what you need, omit the manual version. Custom implementations that just repeat the default add maintenance cost. | ||
| - **Avoid duplicating constants** — if a value already exists as a constant elsewhere, reference that single source of truth instead of defining a second copy. Duplicate literals are easy to miss when one copy changes. |
Member
There was a problem hiding this comment.
This one feels vague. Sometimes duplication in favor of better semantics make sense to me. What do you think? 🤔
facumenzella
reviewed
Jul 3, 2026
| @@ -1 +1,1397 @@ | |||
| [{"text":"public enum CustomerCenterAction {","violation":{"ruleDescription":"","ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","location":{"file":"RevenueCatUI\/CustomerCenter\/Data\/CustomerCenterAction.swift","line":16,"character":1},"severity":"error","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead."}},{"text":"public enum CustomerCenterManagementOption {","violation":{"ruleIdentifier":"no_new_public_enums","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error","location":{"file":"RevenueCatUI\/CustomerCenter\/Data\/CustomerCenterManagementOption.swift","line":20,"character":1}}},{"text":"public enum EmergeRenderingMode: Int {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","severity":"error","location":{"file":"RevenueCatUI\/Helpers\/EmergeRenderingMode.swift","line":9,"character":1}}},{"text":"public enum PaywallPresentationMode {","violation":{"severity":"error","ruleIdentifier":"no_new_public_enums","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","location":{"character":1,"line":23,"file":"RevenueCatUI\/View+PresentPaywall.swift"},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead."}},{"text":"@objc(RCAttributionNetwork) public enum AttributionNetwork: Int {","violation":{"ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error","location":{"line":20,"character":29,"file":"Sources\/Attribution\/AttributionNetwork.swift"},"ruleIdentifier":"no_new_public_enums"}},{"text":" public enum Algorithm: String, Codable, Sendable {","violation":{"ruleName":"No new public enums in consumer-facing APIs","ruleDescription":"","severity":"error","ruleIdentifier":"no_new_public_enums","location":{"file":"Sources\/Caching\/Checksum.swift","line":43,"character":5},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead."}},{"text":"public enum CustomerCenterPresentationMode {","violation":{"ruleName":"No new public enums in consumer-facing APIs","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","location":{"line":17,"file":"Sources\/CustomerCenter\/CustomerCenterPresentationMode.swift","character":1},"ruleIdentifier":"no_new_public_enums","ruleDescription":"","severity":"error"}},{"text":"@objc(RCPurchasesErrorCode) public enum ErrorCode: Int, Error {","violation":{"severity":"error","location":{"file":"Sources\/Generated\/ErrorCode.swift","line":17,"character":29},"ruleDescription":"","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs"}},{"text":" public enum Environment: String {","violation":{"location":{"line":73,"file":"Sources\/LocalReceiptParsing\/BasicTypes\/AppleReceipt.swift","character":5},"severity":"error","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","ruleIdentifier":"no_new_public_enums","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead."}},{"text":" public enum ProductType: Int {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleDescription":"","location":{"file":"Sources\/LocalReceiptParsing\/BasicTypes\/InAppPurchase.swift","line":159,"character":5},"severity":"error","ruleName":"No new public enums in consumer-facing APIs","ruleIdentifier":"no_new_public_enums"}},{"text":"@objc(RCLogLevel) public enum LogLevel: Int, CustomStringConvertible, CaseIterable, Sendable {","violation":{"ruleIdentifier":"no_new_public_enums","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","severity":"error","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","location":{"file":"Sources\/LocalReceiptParsing\/Helpers\/LoggerType.swift","character":19,"line":59}}},{"text":" public enum Error: Swift.Error {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleDescription":"","severity":"error","ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","location":{"file":"Sources\/LocalReceiptParsing\/ReceiptParsingError.swift","character":5,"line":21}}},{"text":"public enum RCPaymentMode {}","violation":{"ruleIdentifier":"no_new_public_enums","ruleDescription":"","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error","location":{"character":1,"line":754,"file":"Sources\/Misc\/Obsoletions.swift"},"ruleName":"No new public enums in consumer-facing APIs"}},{"text":"public enum RCBackendErrorCode {}","violation":{"ruleName":"No new public enums in consumer-facing APIs","severity":"error","ruleDescription":"","ruleIdentifier":"no_new_public_enums","location":{"file":"Sources\/Misc\/Obsoletions.swift","line":778,"character":1},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead."}},{"text":"public enum StoreKitVersion: Int {","violation":{"ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","ruleIdentifier":"no_new_public_enums","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error","location":{"character":1,"file":"Sources\/Misc\/StoreKitVersion.swift","line":18}}},{"text":"public enum CacheFetchPolicy: Int {","violation":{"ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","location":{"character":1,"file":"Sources\/Networking\/Caching\/CacheFetchPolicy.swift","line":16},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error","ruleDescription":""}},{"text":" public enum LocalizationData: Codable, Equatable, Sendable {","violation":{"ruleDescription":"","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","location":{"line":61,"file":"Sources\/Networking\/Responses\/RevenueCatUI\/PaywallComponentsData.swift","character":5},"severity":"error"}},{"text":" public enum ConditionValue: Codable, Sendable, Hashable, Equatable {","violation":{"severity":"error","location":{"file":"Sources\/Paywalls\/Components\/Common\/ComponentOverrides.swift","line":93,"character":5},"ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleDescription":""}},{"text":" public enum EqualityOperator: String, Codable, Sendable, Hashable, Equatable {","violation":{"ruleName":"No new public enums in consumer-facing APIs","location":{"file":"Sources\/Paywalls\/Components\/Common\/ComponentOverrides.swift","line":141,"character":5},"ruleDescription":"","severity":"error","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums"}},{"text":" public enum ArrayOperator: String, Codable, Sendable, Hashable, Equatable {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleName":"No new public enums in consumer-facing APIs","ruleDescription":"","location":{"character":5,"file":"Sources\/Paywalls\/Components\/Common\/ComponentOverrides.swift","line":150},"severity":"error","ruleIdentifier":"no_new_public_enums"}},{"text":" public enum ComponentType: String, Codable, Sendable {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleName":"No new public enums in consumer-facing APIs","ruleDescription":"","location":{"character":5,"file":"Sources\/Paywalls\/Components\/Common\/PaywallComponentBase.swift","line":37},"severity":"error","ruleIdentifier":"no_new_public_enums"}},{"text":" public enum Action: Codable, Sendable, Hashable, Equatable {","violation":{"ruleName":"No new public enums in consumer-facing APIs","ruleIdentifier":"no_new_public_enums","severity":"error","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","location":{"file":"Sources\/Paywalls\/Components\/PaywallButtonComponent.swift","line":133,"character":9},"ruleDescription":""}},{"text":" public enum Destination: Codable, Sendable, Hashable, Equatable {","violation":{"ruleDescription":"","ruleIdentifier":"no_new_public_enums","severity":"error","ruleName":"No new public enums in consumer-facing APIs","location":{"file":"Sources\/Paywalls\/Components\/PaywallButtonComponent.swift","line":186,"character":9},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead."}},{"text":" public enum URLMethod: String, Codable, Sendable, Hashable, Equatable {","violation":{"ruleName":"No new public enums in consumer-facing APIs","severity":"error","ruleIdentifier":"no_new_public_enums","location":{"character":9,"line":262,"file":"Sources\/Paywalls\/Components\/PaywallButtonComponent.swift"},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleDescription":""}},{"text":" public enum AutoAdvanceTransitionType: String, PaywallComponentBase {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleName":"No new public enums in consumer-facing APIs","ruleIdentifier":"no_new_public_enums","severity":"error","ruleDescription":"","location":{"character":9,"file":"Sources\/Paywalls\/Components\/PaywallCarouselComponent.swift","line":35}}},{"text":" public enum Position: String, Codable, Sendable, Hashable, Equatable {","violation":{"ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","severity":"error","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleDescription":"","location":{"character":13,"line":42,"file":"Sources\/Paywalls\/Components\/PaywallCarouselComponent.swift"}}},{"text":" public enum CountdownStyle: Codable, Sendable, Hashable, Equatable {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleName":"No new public enums in consumer-facing APIs","ruleIdentifier":"no_new_public_enums","ruleDescription":"","severity":"error","location":{"character":9,"file":"Sources\/Paywalls\/Components\/PaywallCountdownComponent.swift","line":111}}},{"text":" public enum CountFrom: String, Codable, Sendable, Hashable, Equatable {","violation":{"ruleName":"No new public enums in consumer-facing APIs","ruleDescription":"","location":{"file":"Sources\/Paywalls\/Components\/PaywallCountdownComponent.swift","line":162,"character":9},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","severity":"error"}},{"text":" public enum Action: String, Codable, Sendable, Hashable, Equatable {","violation":{"ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","severity":"error","location":{"character":9,"file":"Sources\/Paywalls\/Components\/PaywallPurchaseButtonComponent.swift","line":23},"ruleDescription":"","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead."}},{"text":" public enum Method: Codable, Sendable, Hashable, Equatable, CustomStringConvertible {","violation":{"ruleName":"No new public enums in consumer-facing APIs","severity":"error","ruleDescription":"","location":{"character":9,"file":"Sources\/Paywalls\/Components\/PaywallPurchaseButtonComponent.swift","line":29},"ruleIdentifier":"no_new_public_enums","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead."}},{"text":" public enum Overflow: String, PaywallComponentBase {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","severity":"error","location":{"line":21,"character":9,"file":"Sources\/Paywalls\/Components\/PaywallStackComponent.swift"}}},{"text":" public enum TabControlType: String, Codable, Sendable, Hashable, Equatable {","violation":{"ruleIdentifier":"no_new_public_enums","location":{"line":136,"file":"Sources\/Paywalls\/Components\/PaywallTabsComponent.swift","character":13},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs"}},{"text":" public enum IconAlignment: String, Sendable, Codable, Equatable, Hashable {","violation":{"ruleIdentifier":"no_new_public_enums","location":{"line":151,"file":"Sources\/Paywalls\/Components\/PaywallTimelineComponent.swift","character":9},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs"}},{"text":" public enum ColorScheme: String {","violation":{"ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error","location":{"file":"Sources\/Paywalls\/PaywallColor.swift","character":5,"line":25},"ruleDescription":""}},{"text":"public enum PaywallViewMode {","violation":{"ruleDescription":"","severity":"error","location":{"line":17,"file":"Sources\/Paywalls\/PaywallViewMode.swift","character":1},"ruleName":"No new public enums in consumer-facing APIs","ruleIdentifier":"no_new_public_enums","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead."}},{"text":" public enum EntitlementVerificationMode: Int {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleDescription":"","location":{"line":408,"character":5,"file":"Sources\/Purchasing\/Configuration.swift"},"severity":"error","ruleName":"No new public enums in consumer-facing APIs","ruleIdentifier":"no_new_public_enums"}},{"text":"@objc(RCStore) public enum Store: Int {","violation":{"ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","ruleIdentifier":"no_new_public_enums","location":{"file":"Sources\/Purchasing\/EntitlementInfo.swift","character":16,"line":22},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error"}},{"text":"@objc(RCPeriodType) public enum PeriodType: Int {","violation":{"ruleDescription":"","location":{"line":74,"file":"Sources\/Purchasing\/EntitlementInfo.swift","character":21},"severity":"error","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs"}},{"text":"@objc(RCIntroEligibilityStatus) public enum IntroEligibilityStatus: Int {","violation":{"ruleIdentifier":"no_new_public_enums","severity":"error","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","location":{"character":33,"file":"Sources\/Purchasing\/IntroEligibility.swift","line":24},"ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs"}},{"text":"@objc(RCPackageType) public enum PackageType: Int {","violation":{"ruleName":"No new public enums in consumer-facing APIs","location":{"character":22,"file":"Sources\/Purchasing\/PackageType.swift","line":23},"severity":"error","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","ruleDescription":""}},{"text":"@objc(RCPurchaseOwnershipType) public enum PurchaseOwnershipType: Int {","violation":{"ruleName":"No new public enums in consumer-facing APIs","ruleIdentifier":"no_new_public_enums","location":{"file":"Sources\/Purchasing\/PurchaseOwnershipType.swift","character":32,"line":19},"severity":"error","ruleDescription":"","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead."}},{"text":"public enum PurchasesAreCompletedBy: Int {","violation":{"ruleDescription":"","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","severity":"error","location":{"line":18,"character":1,"file":"Sources\/Purchasing\/Purchases\/PurchasesAreCompletedBy.swift"}}},{"text":" public enum ProductCategory: Int {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","location":{"character":5,"file":"Sources\/Purchasing\/StoreKitAbstractions\/ProductType.swift","line":23},"ruleIdentifier":"no_new_public_enums","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","severity":"error"}},{"text":" public enum ProductType: Int {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","severity":"error","ruleDescription":"","location":{"line":38,"character":5,"file":"Sources\/Purchasing\/StoreKitAbstractions\/ProductType.swift"}}},{"text":" public enum PaymentMode: Int {","violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","severity":"error","ruleDescription":"","location":{"line":35,"character":5,"file":"Sources\/Purchasing\/StoreKitAbstractions\/StoreProductDiscount.swift"}}},{"violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error","ruleIdentifier":"no_new_public_enums","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","location":{"character":5,"line":51,"file":"Sources\/Purchasing\/StoreKitAbstractions\/StoreProductDiscount.swift"}},"text":" public enum DiscountType: Int {"},{"violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","ruleDescription":"","severity":"error","location":{"character":5,"file":"Sources\/Purchasing\/StoreKitAbstractions\/SubscriptionPeriod.swift","line":43}},"text":" public enum Unit: Int {"},{"violation":{"location":{"file":"Sources\/Security\/VerificationResult.swift","line":47,"character":1},"ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","ruleDescription":"","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error"},"text":"public enum VerificationResult: Int {"},{"violation":{"severity":"error","ruleIdentifier":"no_new_public_enums","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleDescription":"","location":{"character":30,"file":"Sources\/Support\/BeginRefundRequestHelper.swift","line":159},"ruleName":"No new public enums in consumer-facing APIs"},"text":"@objc(RCRefundRequestStatus) public enum RefundRequestStatus: Int, Sendable {"},{"violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","severity":"error","ruleIdentifier":"no_new_public_enums","ruleName":"No new public enums in consumer-facing APIs","ruleDescription":"","location":{"line":49,"character":5,"file":"Sources\/Support\/PurchasesDiagnostics.swift"}},"text":" public enum ProductStatus: Sendable {"},{"violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","severity":"error","ruleName":"No new public enums in consumer-facing APIs","location":{"character":5,"file":"Sources\/Support\/PurchasesDiagnostics.swift","line":85},"ruleDescription":""},"text":" public enum SDKHealthCheckStatus: Sendable {"},{"violation":{"ruleName":"No new public enums in consumer-facing APIs","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","location":{"line":121,"character":5,"file":"Sources\/Support\/PurchasesDiagnostics.swift"},"ruleDescription":"","ruleIdentifier":"no_new_public_enums","severity":"error"},"text":" public enum SDKHealthError: Swift.Error {"},{"violation":{"ruleName":"No new public enums in consumer-facing APIs","severity":"error","ruleDescription":"","location":{"file":"Sources\/Support\/PurchasesDiagnostics.swift","line":174,"character":5},"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums"},"text":" public enum SDKHealthStatus: Sendable {"},{"violation":{"ruleIdentifier":"no_new_public_enums","ruleDescription":"","ruleName":"No new public enums in consumer-facing APIs","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","location":{"line":186,"character":5,"file":"Sources\/Support\/PurchasesDiagnostics.swift"},"severity":"error"},"text":" public enum Error: Swift.Error {"},{"violation":{"ruleName":"No new public enums in consumer-facing APIs","ruleDescription":"","reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleIdentifier":"no_new_public_enums","severity":"error","location":{"line":20,"character":27,"file":"Sources\/Support\/StoreMessageType.swift"}},"text":"@objc(RCStoreMessageType) public enum StoreMessageType: Int, CaseIterable, Sendable {"},{"violation":{"reason":"Adding a new `public enum` to the SDK's consumer-facing surface (including `@_spi(Experimental)`) is not allowed. Adding a case to an existing `public enum` is a source-breaking change for any consumer with an exhaustive `switch`. Use a struct with static constants instead.","ruleName":"No new public enums in consumer-facing APIs","ruleDescription":"","location":{"character":1,"file":"Sources\/WebPurchaseRedemption\/WebPurchaseRedemptionResult.swift","line":19},"ruleIdentifier":"no_new_public_enums","severity":"error"},"text":"public enum WebPurchaseRedemptionResult: Sendable {"}] No newline at end of file | |||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Checklist
Motivation
Recurring review feedback in June 2026 PRs highlighted patterns that can be caught earlier with linting and clearer agent guidelines.
Description
Summary
Analyzed 900 comments across 138 PRs from June 1–30 2026 in
RevenueCat/purchases-ios. Sources: 22 human reviewers (ajpallares, rickvdl, tonidero, facumenzella, vegaro, fire-at-will, alexrepty, polmiro, peterporfy, MonikaMateska, AlvaroBrey, JayShortway, davedelong, MarkVillacampa, and others) and 5 bots (cursor[bot], emerge-tools[bot], github-actions[bot], socket-security[bot], dependabot[bot]).New guidelines added
no_hardcoded_logger_stringsSwiftLint ruleLoggercalls flagged in 4+ PRs; reviewers asked to use*Strings.swiftenum patternprivate/internalinstead of wider visibilityCodableimplementationsTest plan
no_hardcoded_logger_stringspattern).swiftlint-baseline.json.