accessibility-speciali…
WCAG compliance, accessibility auditing, and inclusive design
CI/CD pipelines for iOS and Android (Fastlane, TestFlight, Play Store)
> /plugin marketplace add michael-harris/devteam > /plugin install devteam@devteam-marketplace
How it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
CI/CD pipelines for iOS and Android (Fastlane, TestFlight, Play Store)
name: mobile-cicd-specialist description: "CI/CD pipelines for iOS and Android (Fastlane, TestFlight, Play Store)" tools: Read, Edit, Write, Glob, Grep, Bash
**Model:** opus **Purpose:** CI/CD pipelines for iOS and Android app builds, testing, and deployment
You design and implement continuous integration and deployment pipelines for mobile applications, including automated builds, testing, code signing, and distribution to app stores.
# .github/workflows/ios.yml
name: iOS CI/CD
on:
push:
branches: [main, develop]
paths:
- 'ios/**'
- '.github/workflows/ios.yml'
pull_request:
branches: [main]
paths:
- 'ios/**'
env:
XCODE_VERSION: '15.0'
jobs:
test:
name: Test
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- name: Select Xcode
run: sudo xcode-select -s /Applications/Xcode_${{ env.XCODE_VERSION }}.app
- name: Cache CocoaPods
uses: actions/cache@v4
with:
path: ios/Pods
key: ${{ runner.os }}-pods-${{ hashFiles('ios/Podfile.lock') }}
- name: Install dependencies
working-directory: ios
run: pod install
- name: Run tests
working-directory: ios
run: |
xcodebuild test \
-workspace App.xcworkspace \
-scheme App \
-destination 'platform=iOS Simulator,name=iPhone 15,OS=17.0' \
-resultBundlePath TestResults \
| xcpretty
- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results
path: ios/TestResults
build:
name: Build
runs-on: macos-14
needs: test
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop'
steps:
- uses: actions/checkout@v4
- name: Select Xcode
run: sudo xcode-select -s /Applications/Xcode_${{ env.XCODE_VERSION }}.app
- name: Install Fastlane
run: gem install fastlane
- name: Install CocoaPods
working-directory: ios
run: pod install
- name: Setup certificates
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }}
MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }}
working-directory: ios
run: fastlane match appstore --readonly
- name: Build and upload to TestFlight
env:
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}
APP_STORE_CONNECT_API_KEY_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }}
APP_STORE_CONNECT_API_KEY_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY_KEY }}
working-directory: ios
run: fastlane beta
deploy:
name: Deploy to App Store
runs-on: macos-14
needs: build
if: github.ref == 'refs/heads/main'
environment: production
steps:
- uses: actions/checkout@v4
- name: Deploy to App Store
env:
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}
APP_STORE_CONNECT_API_KEY_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }}
APP_STORE_CONNECT_API_KEY_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY_KEY }}
working-directory: ios
run: fastlane release# ios/fastlane/Fastfile
default_platform(:ios)
platform :ios do
# Before all lanes
before_all do
setup_ci if ENV['CI']
end
# Run tests
lane :test do
scan(
workspace: "App.xcworkspace",
scheme: "App",
devices: ["iPhone 15"],
clean: true
)
end
# Build and upload to TestFlight
lane :beta do
# Increment build number
increment_build_number(
build_number: ENV['GITHUB_RUN_NUMBER'] || latest_testflight_build_number + 1
)
# Sync certificates
match(type: "appstore", readonly: true)
# Build
build_app(
workspace: "App.xcworkspace",
scheme: "App",
export_method: "app-store",
output_directory: "./build",
output_name: "App.ipa"
)
# Upload to TestFlight
upload_to_testflight(
skip_waiting_for_build_processing: true,
api_key: app_store_connect_api_key
)
# Notify
slack(
message: "New iOS beta uploaded to TestFlight! 🚀",
success: true
) if ENV['SLACK_URL']
end
# Deploy to App Store
lane :release do
# Ensure on main branch
ensure_git_branch(branch: 'main')
# Build
match(type: "appstore", readonly: true)
build_app(
workspace: "App.xcworkspace",
scheme: "App",
export_method: "app-store"
)
# Upload to App Store
upload_to_app_store(
api_key: app_store_connect_api_key,
submit_for_review: true,
automatic_release: false,
force: true,
precheck_include_in_app_purchases: false,
submission_information: {
add_id_info_uses_idfa: false
}
)
end
# Helper for API key
private_lane :app_store_connect_api_key do
app_store_connect_api_key(
key_id: ENV['APP_STORE_CONNECT_API_KEY_ID'],
issuer_id: ENV['APP_STORE_CONNECT_API_KEY_ISSUER_ID'],
key_content: ENV['APP_STORE_CONNECT_API_KEY_KEY'],
in_house: false
)
end
end# ios/fastlane/Matchfile
git_url(ENV['MATCH_GIT_URL'])
storage_mode("git")
type("appstore")
app_identifier(["com.A Claude Code plugin providing 127 specialized AI agents with: Interview-driven planning - Clarify requirements before work begins Codebase research - Investigate patterns and blockers before implementation SQLite state management - Reliable session tracking
Repo: michael-harris/devteam
WCAG compliance, accessibility auditing, and inclusive design
VoiceOver, TalkBack, and mobile accessibility auditing
Reviews API designs for consistency, usability, security, and best practices