Claude Code Plugins

Community-maintained marketplace

Feedback

ios-add-file

@asnar00/miso
0
0

Add a Swift file to an Xcode project without opening Xcode. Programmatically edits project.pbxproj to include the file. Use when adding new Swift files to iOS projects from command line.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name ios-add-file
description Add a Swift file to an Xcode project without opening Xcode. Programmatically edits project.pbxproj to include the file. Use when adding new Swift files to iOS projects from command line.
delegate true

⚠️ DELEGATION REQUIRED

This skill must be executed by the instruction-follower subagent.

When you see this skill invoked, you MUST use the Task tool to delegate it:

Task(
    subagent_type="instruction-follower",
    description="[Brief 3-5 word description]",
    prompt="Follow the instructions in .claude/skills/ios-add-file/skill.md to [complete task description]."
)

DO NOT execute the instructions below directly. The subagent will read this file and execute autonomously, then report back the results.


iOS Add File to Project

Overview

Adds a Swift source file to an Xcode project by directly editing the project.pbxproj file. This allows command-line development workflows without opening Xcode IDE. The process involves generating UUIDs and updating four sections of the project file.

When to Use

Invoke this skill when the user:

  • Asks to "add a file to the Xcode project"
  • Wants to "add Swift file to project"
  • Says "include this file in the build"
  • Needs to add source files without Xcode GUI
  • Mentions editing project.pbxproj

Prerequisites

  • Xcode project exists (.xcodeproj directory)
  • The Swift file is already created in the project directory
  • Backup of project.pbxproj is recommended before editing
  • uuidgen command available (standard on macOS)

Instructions

1. Create the Swift File

First, create the actual Swift file in the project directory:

cat > ProjectName/FileName.swift << 'EOF'
import Foundation

class FileName {
    // Your code here
}
EOF

2. Generate UUIDs

Generate two unique identifiers:

BUILD_UUID=$(uuidgen | tr -d '-' | tr '[:upper:]' '[:lower:]')
FILE_UUID=$(uuidgen | tr -d '-' | tr '[:upper:]' '[:lower:]')

echo "Build UUID: $BUILD_UUID"
echo "File UUID: $FILE_UUID"

3. Edit project.pbxproj

Open ProjectName.xcodeproj/project.pbxproj in a text editor and add entries to four sections:

a) PBXBuildFile Section

Add after /* Begin PBXBuildFile section */:

        $BUILD_UUID /* FileName.swift in Sources */ = {
            isa = PBXBuildFile;
            fileRef = $FILE_UUID /* FileName.swift */;
        };

b) PBXFileReference Section

Add after /* Begin PBXFileReference section */:

        $FILE_UUID /* FileName.swift */ = {
            isa = PBXFileReference;
            lastKnownFileType = sourcecode.swift;
            path = FileName.swift;
            sourceTree = "<group>";
        };

c) PBXGroup Section

Find the project's main group (usually named after the project) and add to children array:

        XXXXXXXX /* ProjectName */ = {
            isa = PBXGroup;
            children = (
                YYYYYYYY /* ExistingFile1.swift */,
                ZZZZZZZZ /* ExistingFile2.swift */,
                $FILE_UUID /* FileName.swift */,
                ...
            );

d) PBXSourcesBuildPhase Section

Find the Sources build phase and add to files array:

        SSSSSSSS /* Sources */ = {
            isa = PBXSourcesBuildPhase;
            buildActionMask = 2147483647;
            files = (
                TTTTTTTT /* ExistingFile1.swift in Sources */,
                UUUUUUUU /* ExistingFile2.swift in Sources */,
                $BUILD_UUID /* FileName.swift in Sources */,
            );

4. Verify Build

Test that the project still builds:

xcodebuild -project ProjectName.xcodeproj \
    -scheme SchemeName \
    -destination 'platform=iOS Simulator,name=iPhone 17 Pro' \
    LD="clang" \
    build

5. Inform User

Let the user know:

  • The file has been added to the project
  • Build verification passed (or report errors)
  • The file is now part of the build system
  • They can use the new code in other Swift files

Key Points

UUID Format:

  • Must be unique within the project
  • Lowercase, no hyphens (use tr -d '-' | tr '[:upper:]' '[:lower:]')
  • 32 characters long

Comments:

  • Comments like /* FileName.swift */ are optional but helpful
  • Make the project file human-readable

Order:

  • Order within sections doesn't matter
  • But all entries must be present in all four sections

Backup:

  • Always backup project.pbxproj before manual editing
  • Use git to track changes

Common Issues

Build fails after adding:

  • Check UUIDs are unique (not duplicating existing ones)
  • Verify all four sections were updated correctly
  • Ensure file path matches actual file location
  • Check for syntax errors (missing commas, brackets)

File doesn't appear in build:

  • Must be in both PBXFileReference AND PBXSourcesBuildPhase
  • Check that PBXBuildFile links FILE_UUID correctly

Project won't open in Xcode:

  • Syntax error in project.pbxproj
  • Restore from backup
  • Check for unmatched braces or missing semicolons

Automation Potential

This process can be scripted with:

  • Shell script using sed/awk
  • Python script parsing the project file
  • Ruby xcodeproj gem for more robust editing

For now, manual editing with verification is recommended.

Example Success

This technique was successfully used to add Logger.swift to the NoobTest/Firefly project without opening Xcode, enabling command-line-only development workflows.

Alternative: xcodeproj Ruby Gem

For more complex scenarios, consider the xcodeproj gem:

gem install xcodeproj

But for simple file additions, manual editing works well.