Conversation
WalkthroughAdds RFC‑822-aware Author decoding/encoding and RSS channel fields (managingEditor, webMaster), expands CI (Windows/Android, broader matrices), improves test data path resolution and cross‑platform line‑ending normalization, adds author parsing tests, bumps Mint tool versions, and adds contributor documentation (CLAUDE.md). Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes
Possibly related issues
Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (2 warnings)
✅ Passed checks (1 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
Tests/SyndiKitTests/Extensions/String.swift (1)
13-15: Consider handling standalone CR for comprehensive normalization.The current implementation normalizes CRLF to LF, which addresses Windows line endings. However, standalone CR (
\r) line endings can occur in legacy Mac files or edge cases. For more robust cross-platform normalization, consider replacing CR with LF as well.🔎 Proposed enhancement for comprehensive line ending normalization
internal func normalizeLineEndings() -> String { - return replacingOccurrences(of: "\r\n", with: "\n") + return replacingOccurrences(of: "\r\n", with: "\n") + .replacingOccurrences(of: "\r", with: "\n") }
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
.github/workflows/syndikit.ymlTests/SyndiKitTests/Content.Directories.swiftTests/SyndiKitTests/Extensions/String.swiftTests/SyndiKitTests/RSSCodedTests.swift
🧰 Additional context used
🧬 Code graph analysis (1)
Tests/SyndiKitTests/RSSCodedTests.swift (1)
Tests/SyndiKitTests/Extensions/String.swift (2)
trimAndNilIfEmpty(8-11)normalizeLineEndings(13-15)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: Build on macOS (watchos, macos-14, /Applications/Xcode_15.0.1.app, Apple Watch Series 9 (41mm), 1...
- GitHub Check: Build on Windows (windows-2022, swift-6.2-release, 6.2-RELEASE)
🔇 Additional comments (5)
Tests/SyndiKitTests/Content.Directories.swift (1)
11-31: LGTM! Platform-aware test data discovery implemented correctly.The new approach with runtime existence checking and platform-specific fallback paths is well-designed for cross-platform testing. The source-relative path will work for most environments, while the working directory fallback specifically addresses Android emulator constraints.
Tests/SyndiKitTests/RSSCodedTests.swift (1)
175-176: LGTM! Line ending normalization ensures cross-platform test consistency.The addition of
normalizeLineEndings()to both sides of the contentHtml comparison is correctly implemented and will ensure consistent test results across platforms with different line ending conventions (Windows CRLF vs. Unix LF)..github/workflows/syndikit.yml (3)
318-353: LGTM! Android CI integration is well-configured.The Android build job is properly structured with:
- Disk space cleanup to prevent storage issues during builds
- Multi-API level testing (28, 33, 34) covering a good range
- The
android-copy-files: Data/parameter correctly aligns with the test data path resolution changes inContent.Directories.swift- Test execution enabled with
android-run-tests: true
272-317: LGTM! Windows CI coverage added successfully.The Windows build job properly covers multiple Swift versions (6.1, 6.2) and Windows runners (2022, 2025), with appropriate coverage upload flags.
17-26: LGTM! Ubuntu matrix expanded with additional Swift versions.The addition of Swift 6.2 and 6.0, along with the nightly 6.3 build, provides comprehensive Swift version coverage for Ubuntu builds.
There was a problem hiding this comment.
Actionable comments posted: 2
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
CLAUDE.md
🧰 Additional context used
🪛 LanguageTool
CLAUDE.md
[uncategorized] ~112-~112: The official name of this content management system is spelled with a capital “P”.
Context: ...ost)) WordPress-specific files are inFormats/Media/Wordpress/`. ### Swift Version Compatibility Th...
(WORDPRESS)
[uncategorized] ~208-~208: The official name of this software platform is spelled with a capital “H”.
Context: ...CI/CD The project uses GitHub Actions (.github/workflows/syndikit.yml): - Ubuntu...
(GITHUB)
🪛 markdownlint-cli2 (0.18.1)
CLAUDE.md
223-223: Bare URL used
(MD034, no-bare-urls)
🔇 Additional comments (1)
CLAUDE.md (1)
1-232: Excellent comprehensive documentation guide for contributors.This documentation provides clear, well-organized guidance covering the project architecture, build/test workflows, code standards, CI/CD setup, and common patterns. It effectively codifies the three-tier abstraction system, decoding pipeline, and organizational conventions that will help maintainers and contributors understand the codebase. The content aligns well with the broader repository changes mentioned in the PR (CI/CD enhancements, test data path updates, line-ending normalization utilities).
| ### WordPress Support | ||
|
|
||
| WordPress export decoding involves multi-step processing: | ||
|
|
||
| 1. Decode WordPress-extended RSS feed | ||
| 2. Extract `WordPressPost` from items | ||
| 3. Validate required fields via `WordPressPost+Validator.swift` | ||
| 4. Process metadata via `WordPressPost+Processor.swift` | ||
| 5. Access via `Entryable.media` property as `.podcast(.wordpress(post))` | ||
|
|
||
| WordPress-specific files are in `Formats/Media/Wordpress/`. |
There was a problem hiding this comment.
Fix capitalization of "WordPress".
Line 112 uses "Wordpress" but the official product name is "WordPress" (capital P). Update for consistency with official naming and other references in the file.
🔎 Proposed fix
-WordPress-specific files are in `Formats/Media/Wordpress/`.
+WordPress-specific files are in `Formats/Media/WordPress/`.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ### WordPress Support | |
| WordPress export decoding involves multi-step processing: | |
| 1. Decode WordPress-extended RSS feed | |
| 2. Extract `WordPressPost` from items | |
| 3. Validate required fields via `WordPressPost+Validator.swift` | |
| 4. Process metadata via `WordPressPost+Processor.swift` | |
| 5. Access via `Entryable.media` property as `.podcast(.wordpress(post))` | |
| WordPress-specific files are in `Formats/Media/Wordpress/`. | |
| ### WordPress Support | |
| WordPress export decoding involves multi-step processing: | |
| 1. Decode WordPress-extended RSS feed | |
| 2. Extract `WordPressPost` from items | |
| 3. Validate required fields via `WordPressPost+Validator.swift` | |
| 4. Process metadata via `WordPressPost+Processor.swift` | |
| 5. Access via `Entryable.media` property as `.podcast(.wordpress(post))` | |
| WordPress-specific files are in `Formats/Media/WordPress/`. |
🧰 Tools
🪛 LanguageTool
[uncategorized] ~112-~112: The official name of this content management system is spelled with a capital “P”.
Context: ...ost)) WordPress-specific files are inFormats/Media/Wordpress/`. ### Swift Version Compatibility Th...
(WORDPRESS)
🤖 Prompt for AI Agents
In CLAUDE.md around lines 102 to 112, the path and occurrence "Wordpress" is
incorrectly capitalized; change "Wordpress" to the official "WordPress" (e.g.,
update "Formats/Media/Wordpress/" to "Formats/Media/WordPress/") and scan the
surrounding lines to ensure all other instances use the same "WordPress"
capitalization for consistency.
| ## Documentation | ||
|
|
||
| Documentation is built with DocC and hosted at https://syndikit.dev | ||
|
|
||
| Generate documentation locally: | ||
| ```bash | ||
| ./Scripts/docc.sh | ||
| ``` | ||
|
|
||
| The project maintains two documentation formats: | ||
| 1. DocC (preferred): Hosted on Swift Package Index | ||
| 2. SourceDocs markdown: In `Documentation/Reference/` |
There was a problem hiding this comment.
Wrap bare URL in markdown link syntax.
Line 223 contains a bare URL that should be wrapped in markdown link format for proper rendering.
🔎 Proposed fix
-Documentation is built with DocC and hosted at https://syndikit.dev
+Documentation is built with DocC and hosted at [https://syndikit.dev](https://syndikit.dev)🧰 Tools
🪛 markdownlint-cli2 (0.18.1)
223-223: Bare URL used
(MD034, no-bare-urls)
🤖 Prompt for AI Agents
In CLAUDE.md around lines 221 to 232 the documentation section contains a bare
URL on line 223; replace the bare URL with markdown link syntax (e.g. use a
descriptive link like [syndikit.dev](https://syndikit.dev) or the URL in square
brackets followed by the URL in parentheses) so the link renders correctly in
markdown; update the line and verify there are no stray backticks or formatting
issues after the change.
## Summary Enhanced RSS author parsing to properly extract both email addresses and names from various formats, addressing incomplete parsing that previously only captured names while leaving email fields nil. ## Changes ### Core Implementation - **Author.swift**: Added custom Codable implementation with RFC 822 parser - Supports "email (name)" format: `podcast@example.com (Jane Doe)` - Supports email-only format: `webmaster@example.com` - Supports name-only format: `John Doe` - Maintains backward compatibility with Atom feeds (structured XML) - Added internal initializer for full property control - **RSSChannel.swift**: Added managingEditor and webMaster properties - Both decode using new Author RFC 822 parsing logic - Properly extract editorial and technical contact information ### Testing - **AuthorParsingTests.swift**: Comprehensive unit tests (13 test cases) - RFC 822 format variations (email+name, email-only, name-only) - Edge cases (whitespace, parentheses, international characters) - Backward compatibility (Atom format, public API) - Round-trip encoding/decoding validation - **RSSCodedTests.swift**: Integration tests with real feed data - Validates raywenderlich.xml managingEditor parsing - Validates news.rss email-only format handling ## Results - All 66 tests passing (including 13 new author parsing tests) - Linting compliant (only expected warnings for RSS spec terms) - Successfully parses author information from existing test feeds 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #95 +/- ##
==========================================
+ Coverage 76.75% 77.64% +0.88%
==========================================
Files 74 74
Lines 1493 1552 +59
==========================================
+ Hits 1146 1205 +59
Misses 347 347
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Pull Request Review - v0.6.2This PR includes three main improvements: enhanced RFC 822 author parsing, comprehensive CI/CD expansion, and cross-platform test reliability improvements. Overall, this is a well-structured PR with excellent test coverage. Here's my detailed review: ✅ Strengths1. Author Parsing Implementation (Sources/SyndiKit/Common/Author.swift:85-157)Excellent work on the RFC 822 parser! The implementation correctly handles multiple formats:
The custom
2. Comprehensive Test Coverage (Tests/SyndiKitTests/AuthorParsingTests.swift)Outstanding test coverage with 13 test cases covering:
The tests are well-organized with clear MARK sections and descriptive names. 3. Integration Tests (Tests/SyndiKitTests/RSSCodedTests.swift:768-820)Good addition of integration tests validating real-world feed parsing. Tests verify both 4. Cross-Platform ImprovementsThe
The line-ending normalization (Tests/SyndiKitTests/Extensions/String.swift:13-15, RSSCodedTests.swift:175-176) is a sensible solution for Windows compatibility. 5. CI/CD Expansion (.github/workflows/syndikit.yml)Impressive platform coverage expansion:
🔍 Issues & Recommendations1. Email Validation Missing (Author.swift:141-143)Medium Priority The parser treats any string with if trimmed.contains("@") {
// Email-only format
return (name: trimmed, email: trimmed)
}Potential issues:
Recommendation: // More robust email detection
let hasValidEmail = trimmed.contains("@") &&
!trimmed.starts(with: "@") &&
!trimmed.hasSuffix("@") &&
trimmed.filter { $0 == "@" }.count == 12. Encoding Format Discrepancy (Author.swift:150-156)Low Priority - Design Question The public func encode(to encoder: any Encoder) throws {
// Try to preserve format by encoding with keyed container
var container = encoder.container(keyedBy: CodingKeys.self)
// ... always encodes as structured XML
}Impact:
Options:
I'd suggest option #1 or #3. The current behavior is reasonable but the comment is misleading. 3. Missing DocC Documentation (RSSChannel.swift:131-134)Low Priority The new /// Email address for person responsible for editorial content.
public let managingEditor: Author?
/// Email address for person responsible for technical issues.
public let webMaster: Author?According to CLAUDE.md:
Recommendation: /// Email address and name for the person responsible for editorial content.
///
/// Parses RFC 822 format like `podcast@example.com (Jane Doe)` or plain email addresses.
///
/// - SeeAlso: `Author`
public let managingEditor: Author?4. Test Data Validation MissingLow Priority The integration tests assume test feeds contain expected data but don't validate if the test data files actually exist or have the expected format: guard let feed = try? Content.xmlFeeds["raywenderlich"]?.get(),
let rssFeed = feed as? RSSFeed
else {
XCTFail("Failed to load raywenderlich feed")
return
}Recommendation: 5. CI Workflow ConcernsMedium Priority a) Matrix Size: The CI matrix is now quite large (~50+ job combinations). Consider:
b) Android Disk Space: Good mitigation with disk cleanup script, but consider if all three API levels (28, 33, 34) are necessary. API 28 + 34 might be sufficient. c) Nightly Build: Using 6. Inconsistent Swift Version Compatibility PatternVery Low Priority - Style Nitpick Some files use: #if swift(<5.7)
@preconcurrency import Foundation
#elseif swift(<6.1)
import Foundation
#else
public import Foundation
#endifWhile AuthorParsingTests.swift uses the same pattern but in test code. This is correct per the CLAUDE.md convention, so no action needed, just noting the consistency is good. 🔒 Security Review✅ No security concerns identified
⚡ Performance Considerations✅ No significant performance concerns
Minor optimization opportunity: 📊 Code QualityAdherence to CLAUDE.md Standards✅ Excellent compliance:
Minor note:
🎯 Overall AssessmentRecommendation: ✅ APPROVE with minor suggestions This is a well-crafted PR that:
The issues identified are minor and mostly suggestions for improvement rather than blockers:
Suggested Actions:
Great work overall! 🎉 Review conducted by Claude Code following CLAUDE.md guidelines and Swift package best practices. |
- swift-format: 600.0.0 → 602.0.0 - SwiftLint: 0.58.2 → 0.62.2 - periphery: 3.0.1 → 3.2.0 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Pull Request Review: v0.6.2OverviewThis PR introduces comprehensive improvements across CI/CD infrastructure, RSS author parsing, test robustness, and documentation. The changes demonstrate solid engineering practices with excellent test coverage. ✅ Strengths1. Author Parsing Enhancement (Sources/SyndiKit/Common/Author.swift)Excellent implementation of RFC 822 author format parsing with robust fallback handling:
2. Test Infrastructure ImprovementsStrong cross-platform considerations:
3. CI/CD ExpansionSignificantly improved platform coverage:
4. Documentation
|
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
MintfileSources/SyndiKit/Common/Author.swiftSources/SyndiKit/Formats/Feeds/RSS/RSSChannel.swiftTests/SyndiKitTests/AuthorParsingTests.swiftTests/SyndiKitTests/RSSCodedTests.swift
🧰 Additional context used
🧬 Code graph analysis (2)
Tests/SyndiKitTests/AuthorParsingTests.swift (1)
Sources/SyndiKit/Common/Author.swift (1)
encode(150-156)
Tests/SyndiKitTests/RSSCodedTests.swift (1)
Tests/SyndiKitTests/Extensions/String.swift (2)
trimAndNilIfEmpty(8-11)normalizeLineEndings(13-15)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: Build on macOS (watchos, macos-26, /Applications/Xcode_26.2.app, Apple Watch Ultra 3 (49mm), 26.2)
- GitHub Check: Build on macOS (tvos, macos-26, /Applications/Xcode_26.1.app, Apple TV, 26.1)
- GitHub Check: Build on macOS (tvos, macos-26, /Applications/Xcode_26.2.app, Apple TV, 26.2)
🔇 Additional comments (13)
Sources/SyndiKit/Formats/Feeds/RSS/RSSChannel.swift (2)
72-73: LGTM!The new
CodingKeysentries formanagingEditorandwebMasterfollow the existing pattern and correctly match the RSS 2.0 specification element names.
131-136: LGTM!The new
managingEditorandwebMasterproperties are correctly typed as optionalAuthor?values with appropriate documentation. This aligns with the RSS 2.0 specification where these fields contain email addresses with optional display names.Tests/SyndiKitTests/RSSCodedTests.swift (3)
175-176: LGTM!Applying
normalizeLineEndings()symmetrically to bothjsonItem.contentHtmlandrssItem.contentHtmlensures consistent cross-platform test behavior regardless of line ending differences in source files.
771-789: LGTM!Good integration test for RFC 822 format parsing. The test validates both
nameandmanagingEditorfield.
791-819: LGTM!This test covers the email-only format where
nameandmanagingEditorandwebMasterparsing.Tests/SyndiKitTests/AuthorParsingTests.swift (4)
43-59: LGTM!Comprehensive test suite with good coverage of RFC 822 format parsing, starting with the standard
email (Name)pattern.
121-152: LGTM!Edge case coverage is thorough—empty strings, nested parentheses, and international characters are all tested appropriately.
169-205: LGTM!Backward compatibility tests for Atom format ensure the new RFC 822 parsing doesn't break existing structured
<name>,<email>,<uri>element parsing.
207-249: LGTM!Round-trip encoding/decoding tests and public initializer compatibility tests ensure the API contract is preserved.
Sources/SyndiKit/Common/Author.swift (4)
38-62: LGTM!The updated documentation clearly explains the supported formats, and the
CodingKeysenum is appropriately scoped asinternal.
85-111: LGTM!The dual-path decoding strategy cleanly handles both Atom (keyed container with child elements) and RSS (single-value RFC 822 string) formats. Using
try?for the keyed container attempt and falling back to single-value is idiomatic.
113-148: LGTM!The RFC 822 parsing logic correctly handles:
- Standard
email (Name)format- Nested parentheses via
firstIndex/lastIndex- Email-only strings (using
@heuristic)- Name-only strings
The
@check is a reasonable heuristic for RSS feed author fields.
150-156: Encoding always uses keyed (Atom) format.The encoder always outputs structured
<name>,<email>,<uri>elements. This means RSS-decoded authors will round-trip to Atom format. This is acceptable behavior, but worth noting for consumers who re-encode feeds.
| swiftlang/swift-format@602.0.0 | ||
| realm/SwiftLint@0.62.2 | ||
| peripheryapp/periphery@3.2.0 |
There was a problem hiding this comment.
Review dependency version updates and test for new SwiftLint rule violations.
Swift-format 602.0.0 is the latest stable release. SwiftLint 0.62.2 requires Swift 6 or higher to build, but the Swift Package Manager plugins work with Swift 5.9 and later. Since you're using Mint for pre-built binaries, the compiler requirement doesn't directly affect your setup.
However, SwiftLint 0.62.2 introduces breaking changes that may require configuration updates:
- The sorted_imports rule's behavior changed to treat imports directly adjacent to each other as a group, with imports separated by non-import statements or empty lines treated as separate groups
- A new incompatible_concurrency_annotation rule was added that triggers on declarations isolated to global actors and Sendable constraints
- A new prefer_asset_symbols rule was added to detect string-based image initialization calls
Periphery 3.2.0 is available and released June 27, 2025. These version bumps are safe, but run your linter checks after updating to ensure no new violations are introduced by the rule behavior changes.
🤖 Prompt for AI Agents
In Mintfile lines 1-3 update, the PR bumps swift-format to 602.0.0, SwiftLint to
0.62.2 and Periphery to 3.2.0; after updating, run the project linting and
static-analysis pipeline locally and in CI, verify SwiftLint 0.62.2 doesn’t
introduce failures, and if it does, update .swiftlint.yml to adapt to changed
rules (adjust sorted_imports grouping, add or configure
incompatible_concurrency_annotation and prefer_asset_symbols rules —
enable/disable or tune severity and exceptions), and re-run tests; also confirm
Periphery 3.2.0 runs cleanly in your analysis step.
This commit addresses multiple quality improvements identified in PR #95: - Enhance email validation in Author RFC 822 parsing to reject malformed emails (leading/trailing @, multiple @ symbols) (#97) - Add comprehensive DocC documentation for managingEditor and webMaster properties with format examples and supported input types (#101) - Improve line-ending normalization to handle CRLF, CR, and LF for cross-platform test reliability (#100) - Add 7 new test cases for malformed input edge cases including unclosed parentheses, invalid email formats, and boundary conditions (#102) - Fix WordPress capitalization in CLAUDE.md (#98) - Convert bare URL to markdown link format in CLAUDE.md (#99) - Remove outdated syndikit.dev website reference All tests pass (73/73) and linting is clean (0 serious violations). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit addresses multiple quality improvements identified in PR #95: - Enhance email validation in Author RFC 822 parsing to reject malformed emails (leading/trailing @, multiple @ symbols) (#97) - Add comprehensive DocC documentation for managingEditor and webMaster properties with format examples and supported input types (#101) - Improve line-ending normalization to handle CRLF, CR, and LF for cross-platform test reliability (#100) - Add 7 new test cases for malformed input edge cases including unclosed parentheses, invalid email formats, and boundary conditions (#102) - Fix WordPress capitalization in CLAUDE.md (#98) - Convert bare URL to markdown link format in CLAUDE.md (#99) - Remove outdated syndikit.dev website reference All tests pass (73/73) and linting is clean (0 serious violations). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* Improve Author parsing, documentation, and test coverage This commit addresses multiple quality improvements identified in PR #95: - Enhance email validation in Author RFC 822 parsing to reject malformed emails (leading/trailing @, multiple @ symbols) (#97) - Add comprehensive DocC documentation for managingEditor and webMaster properties with format examples and supported input types (#101) - Improve line-ending normalization to handle CRLF, CR, and LF for cross-platform test reliability (#100) - Add 7 new test cases for malformed input edge cases including unclosed parentheses, invalid email formats, and boundary conditions (#102) - Fix WordPress capitalization in CLAUDE.md (#98) - Convert bare URL to markdown link format in CLAUDE.md (#99) - Remove outdated syndikit.dev website reference All tests pass (73/73) and linting is clean (0 serious violations). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * Fix SwiftLint type_contents_order violations across codebase Reorganize type members to comply with SwiftLint's type_contents_order rule, which requires specific ordering of type elements (subtypes, properties, initializers, methods, etc). Changes: - OPML+Head.swift: Move CodingKeys enum before properties - DecodingError.swift: Move Dictionary properties before initializer - PodcastLocation+GeoURI.swift: Move initializers before static methods - SiteCollectionDirectory.swift: Move Instance initializer before methods - SiteLanguageCategory+Site.swift: Ensure CodingKeys enum before properties All type members now follow the correct order: 1. Subtypes (enums, nested types) 2. Properties 3. Initializers 4. Methods All tests pass (73/73) and 0 serious linting violations remain. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * Add comprehensive documentation for all public declarations Added missing documentation comments for public APIs across the codebase to satisfy SwiftLint's AllPublicDeclarationsHaveDocumentation rule in STRICT mode. Changes include: - OPML types: Complete documentation for OutlineType, OPML properties, Head/Body/Outline structures with all properties - Atom types: Documentation for AtomFeed.CodingKeys and AtomMedia.init(from:) - RSS types: Documentation for all 41 RSSItem properties and CodingKeys enum - Common types: Documentation for Link, Author, and primitive wrappers (XMLStringInt, CData, ListString) - Minor formatting adjustments to meet line length and file length requirements All files now pass STRICT linting with 0 violations. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Summary by CodeRabbit
Tests
New Features
Documentation
Chores
✏️ Tip: You can customize this high-level summary in your review settings.