Validation and quality enforcement for CocoaPods dependency management in iOS, macOS, tvOS, watchOS, and visionOS projects.
Installation
npx claude-plugins install @TheBushidoCollective/han/jutsu-cocoapods
Contents
Folders: skills
Files: CHANGELOG.md, README.md, han-plugin.yml
Documentation
Validation and quality enforcement for CocoaPods dependency management in iOS, macOS, tvOS, watchOS, and visionOS projects.
What This Jutsu Provides
Validation Hooks
- Podspec Validation: Automatically runs
pod lib lintto validate podspec syntax, dependencies, and build integrity - Quick Validation: Uses
--quickflag for fast feedback during development - Fail-Fast: Stops on first error to provide immediate feedback
- Smart Caching: Only re-validates when podspec or source files change
Skills
This jutsu provides the following skills for CocoaPods development:
- cocoapods-podspec-fundamentals: Creating and maintaining podspec files with required attributes, file patterns, dependencies, and platform specifications for iOS, macOS, tvOS, watchOS, and visionOS
- cocoapods-subspecs-organization: Organizing complex libraries into modular subspecs with proper dependency management and default subspec patterns
- cocoapods-test-specs: Adding automated tests to CocoaPods libraries using test specs that run during validation
- cocoapods-privacy-manifests: Implementing iOS 17+ privacy manifests (PrivacyInfo.xcprivacy) for App Store compliance
- cocoapods-publishing-workflow: Publishing libraries to CocoaPods Trunk with proper validation, version management, and best practices
Installation
Install via the Han marketplace:
han plugin install jutsu-cocoapods
Or install manually:
claude plugin marketplace add thebushidocollective/han
claude plugin install jutsu-cocoapods@han
Usage
Once installed, this jutsu automatically validates your CocoaPods code:
- When you finish a conversation with Claude Code
- When Claude Code agents complete their work
- Before commits (when combined with git hooks)
What Gets Validated
The hook runs in directories containing:
.podspecfiles
And validates when these files change:
*.podspec(podspec files)**/*.{swift,h,m,mm}(source files)**/*.xcprivacy(privacy manifests)
Validation Command
pod lib lint --quick --fail-fast
This ensures:
- Podspec syntax is valid
- Required attributes are present
- Source file patterns are correct
- Dependencies resolve properly
- Platform targets are compatible
- Resources are properly configured
Requirements
- CocoaPods: 1.12.0 or later (1.16.2 recommended for latest features)
- Xcode: 15.0 or later (for iOS 17+ privacy manifests)
- Ruby: 2.7 or later
- Git: For version control and publishing
Installing CocoaPods
# Using gem (recommended)
sudo gem install cocoapods
# Or using Homebrew
brew install cocoapods
# Verify installation
pod --version
Validation Workflow
Automatic Validation
When you make changes to:
- Podspec files (
*.podspec) - Source code (
*.swift,*.h,*.m,*.mm) - Privacy manifests (
*.xcprivacy)
The jutsu automatically runs validation when you stop a conversation or complete agent work.
Manual Validation
You can also run validation manually:
# Quick validation (recommended during development)
pod lib lint --quick
# Full validation (with build)
pod lib lint
# Validate for publishing
pod spec lint
Common Validation Errors
Missing Required Attributes
ERROR | [MyLibrary] Missing required attribute `license`
Fix: Add license to podspec:
spec.license = { :type => 'MIT', :file => 'LICENSE' }
Invalid Source Files Pattern
ERROR | [MyLibrary] The `source_files` pattern did not match any file
Fix: Update source_files pattern:
spec.source_files = 'Source/**/*.{swift,h,m}'
Platform Not Specified
ERROR | [MyLibrary] The platform attribute is required
Fix: Add platform deployment target:
spec.ios.deployment_target = '13.0'
Privacy Manifest Missing (iOS 17+)
WARNING | [MyLibrary] Missing privacy manifest for iOS 17+
Fix: Add privacy manifest:
spec.resource_bundles = {
'MyLibrary' => ['Resources/PrivacyInfo.xcprivacy']
}
Skipping Validation
If you need to skip validation temporarily:
# Set environment variable
HAN_SKIP_HOOKS=1
# Or disable the plugin
claude plugin disable jutsu-cocoapods
Advanced Configuration
Custom Validation Options
Create han-config.yml in your project to customize validation:
jutsu-cocoapods:
lint:
command: pod lib lint --quick --fail-fast --allow-warnings
Platform-Specific Validation
jutsu-cocoapods:
lint:
command: pod lib lint --platforms=ios --quick
Best Practices
Podspec Structure
Pod::Spec.new do |spec|
# Identity
spec.name = 'MyLibrary'
spec.version = '1.0.0'
# Metadata
spec.summary = 'Brief description'
spec.homepage = 'https://github.com/username/MyLibrary'
spec.license = { :type => 'MIT', :file => 'LICENSE' }
spec.authors = { '
## Included Skills
This plugin includes 5 skill definitions:
### podspec-fundamentals
> Use when creating or modifying CocoaPods podspec files. Covers required attributes, file patterns, dependencies, and platform specifications for iOS, macOS, tvOS, watchOS, and visionOS projects.
<details>
<summary>View skill definition</summary>
# CocoaPods - Podspec Fundamentals
Essential patterns for creating and maintaining podspec files that define CocoaPods libraries.
## Required Attributes
Every podspec must include these attributes:
```ruby
Pod::Spec.new do |spec|
# Identity
spec.name = 'MyLibrary'
spec.version = '1.0.0'
# Metadata
spec.license = { :type => 'MIT', :file => 'LICENSE' }
spec.homepage = 'https://github.com/username/MyLibrary'
spec.authors = { 'Your Name' => 'email@example.com' }
spec.summary = 'Brief description under 140 characters'
# Source
spec.source = { :git => 'https://github.com/username/MyLibrary.git', :tag => spec.version.to_s }
# Platform Support
spec.ios.deployment_target = '13.0'
spec.osx.deployment_target = '10.15'
end
Platform Specifications
Current Platform Support (2024)
# iOS (iPhone, iPad)
spec.ios.deployment_target = '13.0'
# macOS (Mac computers)
spec.osx.deployment_target = '10.15'
# tvOS (Apple TV)
spec.tvos.deployment_target = '13.0'
# watchOS (Apple Watch)
spec.watchos.deployment_target = '6.0'
# visionOS (Apple Vision Pro) - Added in CocoaPods 1.15.0+
spec.visionos.deployment_target = '1.0'
Multi-Platform Support
# Simple approach - all platforms same version
spec.platform = :ios, '13.0'
# Recommended - specify per platform
spec.ios.deployment_target = '13.0'
spec.osx.deployment_target = '10.15'
spec.tvos.deployment_target = '13.0'
spec.watchos.deployment_ta
...(truncated)
</details>
### privacy-manifests
> Use when implementing iOS 17+ privacy manifests for CocoaPods libraries. Covers PrivacyInfo.xcprivacy file creation, required reasons API declarations, and proper resource bundle integration for App Store compliance.
<details>
<summary>View skill definition</summary>
# CocoaPods - Privacy Manifests
Implement iOS 17+ privacy manifests for App Store compliance and user transparency.
## What Are Privacy Manifests?
Privacy manifests (`PrivacyInfo.xcprivacy`) are XML property list files that declare:
- Data collection and usage practices
- Required Reasons API usage
- Tracking domains
- Privacy-sensitive APIs
### Why Privacy Manifests?
Starting with iOS 17 and Xcode 15, Apple requires privacy manifests for:
- Apps using privacy-sensitive APIs
- Third-party SDKs and frameworks
- Any code accessing user data
## Privacy Manifest File Format
### Basic Structure
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array/>
</dict>
</plist>
Including in Podspec
Resource Bundle (Recommended)
Pod::Spec.new do |spec|
spec.name = 'MyLibrary'
spec.version = '1.0.0'
spec.source_files = 'Source/**/*.swift'
# Include privacy manifest in resource bundle
spec.resource_bundles = {
'MyLibrary' => [
'Resources/**/*.xcprivacy',
'Resources/**/*.{png,jpg,xcassets}'
]
}
end
Direct Resources (Alternative)
spec.resources = 'Resources/PrivacyInfo.xcprivacy'
# Or with
...(truncated)
</details>
### publishing-workflow
> Use when publishing CocoaPods libraries to CocoaPods Trunk. Covers pod trunk registration, podspec validation, version management, and publishing best practices for successful library distribution.
<details>
<summary>View skill definition</summary>
# CocoaPods - Publishing Workflow
Complete guide to publishing your CocoaPods library to the official CocoaPods Trunk.
## Publishing Overview
### Process Steps
1. **Register with CocoaPods Trunk** (one-time)
2. **Prepare your podspec**
3. **Validate locally** (`pod lib lint`)
4. **Validate for publishing** (`pod spec lint`)
5. **Tag version in git**
6. **Push to Trunk** (`pod trunk push`)
## Trunk Registration
### Register Email (One-Time)
```bash
# Register your email
pod trunk register [email protected] 'Your Name'
# Verify email (check inbox for verification link)
# Click link in email to activate account
Check Registration
# Verify registration
pod trunk me
# Sample output:
# - Name: Your Name
# - Email: [email protected]
# - Since: January 1st, 2024
# - Pods: None
Podspec Preparation
Version Management
Pod::Spec.new do |spec|
# Semantic versioning: MAJOR.MINOR.PATCH
spec.version = '1.0.0'
# Must match git tag
spec.source = {
:git => 'https://github.com/username/MyLibrary.git',
:tag => spec.version.to_s
}
end
Required Metadata
Pod::Spec.new do |spec|
# Identity (required)
spec.name = 'MyLibrary'
spec.version = '1.0.0'
# Description (required)
spec.summary = 'Brief one-line description'
spec.description = 'Longer description with more details about what the library does'
# Links (required)
spec.homepage = 'https://github.com/username/
</details>
### subspecs-organization
> Use when organizing complex CocoaPods libraries into subspecs. Covers modular architecture, dependency management between subspecs, and default subspecs patterns for better code organization and optional features.
<details>
<summary>View skill definition</summary>
# CocoaPods - Subspecs Organization
Organize complex libraries into modular subspecs for better maintainability and optional features.
## What Are Subspecs?
Subspecs allow you to split a pod into logical modules that can be installed independently or as a group.
### Benefits
- **Modularity**: Separate core functionality from optional features
- **Selective Installation**: Users install only what they need
- **Reduced Dependencies**: Optional features don't force unnecessary dependencies
- **Better Organization**: Clear separation of concerns
## Basic Subspec Pattern
```ruby
Pod::Spec.new do |spec|
spec.name = 'MyLibrary'
spec.version = '1.0.0'
# Main spec has no source files - all in subspecs
spec.default_subspecs = 'Core'
# Core subspec - installed by default
spec.subspec 'Core' do |core|
core.source_files = 'Source/Core/**/*.swift'
core.frameworks = 'Foundation'
end
# Optional feature subspec
spec.subspec 'Networking' do |networking|
networking.source_files = 'Source/Networking/**/*.swift'
networking.dependency 'MyLibrary/Core' # Depends on Core
networking.dependency 'Alamofire', '~> 5.0'
end
# Another optional feature
spec.subspec 'UI' do |ui|
ui.source_files = 'Source/UI/**/*.swift'
ui.dependency 'MyLibrary/Core'
ui.ios.frameworks = 'UIKit'
ui.osx.frameworks = 'AppKit'
end
end
Dependency Patterns
Subspec Dependencies
Pod::Spec.new do |spec|
spec.name = 'MySDK'
# Foundation
...(truncated)
</details>
### test-specs
> Use when adding automated tests to CocoaPods libraries using test specs. Covers test spec configuration, app host requirements, and testing patterns that integrate with pod lib lint validation.
<details>
<summary>View skill definition</summary>
# CocoaPods - Test Specs
Integrate automated tests into your CocoaPods library that run during validation.
## What Are Test Specs?
Test specs define test targets that CocoaPods builds and runs automatically during `pod lib lint` and `pod spec lint` validation.
### Benefits
- **Automatic Testing**: Tests run during every lint validation
- **Confidence**: Validates library works as expected before publishing
- **CI Integration**: Consistent testing across all environments
- **Documentation**: Tests serve as usage examples
## Basic Test Spec
```ruby
Pod::Spec.new do |spec|
spec.name = 'MyLibrary'
spec.version = '1.0.0'
# Main library source
spec.source_files = 'Source/**/*.swift'
# Test spec
spec.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'Tests/**/*.swift'
# Test dependencies
test_spec.dependency 'Quick', '~> 7.0'
test_spec.dependency 'Nimble', '~> 12.0'
end
end
App Host Requirements
Tests Without App Host
spec.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'Tests/**/*.swift'
# Unit tests that don't need app environment
test_spec.requires_app_host = false # Default
end
Tests With App Host
spec.test_spec 'UITests' do |test_spec|
test_spec.source_files = 'Tests/UITests/**/*.swift'
# Tests that need app environment (UIKit, storyboards, etc.)
test_spec.requires_app_host = true
test_spec.dependency 'MyLibrary'
end
Multiple Test Specs
Pod::Spec.
...(truncated)
</details>
## Source
[View on GitHub](https://github.com/TheBushidoCollective/han)